__ movq(ContextOperand(context, instr->slot_index()), value);
if (instr->needs_write_barrier()) {
int offset = Context::SlotOffset(instr->slot_index());
- __ RecordWrite(context, offset, value, kScratchRegister);
+ Register scratch = ToRegister(instr->TempAt(0));
+ __ RecordWrite(context, offset, value, scratch);
}
}
LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
LOperand* context;
LOperand* value;
+ LOperand* temp;
if (instr->NeedsWriteBarrier()) {
context = UseTempRegister(instr->context());
value = UseTempRegister(instr->value());
+ temp = TempRegister();
} else {
context = UseRegister(instr->context());
value = UseRegister(instr->value());
+ temp = NULL;
}
- return new LStoreContextSlot(context, value);
+ return new LStoreContextSlot(context, value, temp);
}
};
-class LStoreContextSlot: public LTemplateInstruction<0, 2, 0> {
+class LStoreContextSlot: public LTemplateInstruction<0, 2, 1> {
public:
- LStoreContextSlot(LOperand* context, LOperand* value) {
+ LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
inputs_[0] = context;
inputs_[1] = value;
+ temps_[0] = temp;
}
DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
if (FLAG_debug_code) {
// Check that the object is not in new space.
NearLabel not_in_new_space;
- if (addr.is(kScratchRegister)) {
- push(kScratchRegister);
- InNewSpace(object, scratch, not_equal, ¬_in_new_space);
- pop(kScratchRegister);
- } else {
- InNewSpace(object, scratch, not_equal, ¬_in_new_space);
- }
+ InNewSpace(object, scratch, not_equal, ¬_in_new_space);
Abort("new-space object passed to RecordWriteHelper");
bind(¬_in_new_space);
}