Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 10127) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -321,7 +321,22 @@ |
if (op->IsRegister()) { |
return ToRegister(op->index()); |
} else if (op->IsConstantOperand()) { |
- __ mov(scratch, ToOperand(op)); |
+ LConstantOperand* const_op = LConstantOperand::cast(op); |
+ Handle<Object> literal = chunk_->LookupLiteral(const_op); |
+ Representation r = chunk_->LookupLiteralRepresentation(const_op); |
+ if (r.IsInteger32()) { |
+ ASSERT(literal->IsNumber()); |
+ __ mov(scratch, Operand(static_cast<int32_t>(literal->Number()))); |
+ } else if (r.IsDouble()) { |
+ Abort("EmitLoadRegister: Unsupported double immediate."); |
+ } else { |
+ ASSERT(r.IsTagged()); |
+ if (literal->IsSmi()) { |
+ __ mov(scratch, Operand(literal)); |
+ } else { |
+ __ LoadHeapObject(scratch, Handle<HeapObject>::cast(literal)); |
+ } |
+ } |
return scratch; |
} else if (op->IsStackSlot() || op->IsArgument()) { |
__ ldr(scratch, ToMemOperand(op)); |
@@ -1337,8 +1352,13 @@ |
void LCodeGen::DoConstantT(LConstantT* instr) { |
- ASSERT(instr->result()->IsRegister()); |
- __ mov(ToRegister(instr->result()), Operand(instr->value())); |
+ Handle<Object> value = instr->value(); |
+ if (value->IsSmi()) { |
+ __ mov(ToRegister(instr->result()), Operand(value)); |
+ } else { |
+ __ LoadHeapObject(ToRegister(instr->result()), |
+ Handle<HeapObject>::cast(value)); |
+ } |
} |
@@ -2164,7 +2184,7 @@ |
// offset to the location of the map check. |
Register temp = ToRegister(instr->TempAt(0)); |
ASSERT(temp.is(r4)); |
- __ mov(InstanceofStub::right(), Operand(instr->function())); |
+ __ LoadHeapObject(InstanceofStub::right(), instr->function()); |
static const int kAdditionalDelta = 4; |
int delta = masm_->InstructionsGeneratedSince(map_check) + kAdditionalDelta; |
Label before_push_delta; |
@@ -2355,7 +2375,7 @@ |
} |
} else { |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*type)); |
- LoadHeapObject(result, Handle<HeapObject>::cast(function)); |
+ __ LoadHeapObject(result, function); |
} |
} |
@@ -2800,7 +2820,7 @@ |
void LCodeGen::DoThisFunction(LThisFunction* instr) { |
Register result = ToRegister(instr->result()); |
- LoadHeapObject(result, instr->hydrogen()->closure()); |
+ __ LoadHeapObject(result, instr->hydrogen()->closure()); |
} |
@@ -2868,7 +2888,7 @@ |
void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
ASSERT(ToRegister(instr->result()).is(r0)); |
- __ mov(r1, Operand(instr->function())); |
+ __ LoadHeapObject(r1, instr->function()); |
CallKnownFunction(instr->function(), |
instr->arity(), |
instr, |
@@ -3294,7 +3314,7 @@ |
void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
ASSERT(ToRegister(instr->result()).is(r0)); |
- __ mov(r1, Operand(instr->target())); |
+ __ LoadHeapObject(r1, instr->target()); |
CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); |
} |
@@ -4118,9 +4138,18 @@ |
void LCodeGen::DoCheckFunction(LCheckFunction* instr) { |
- ASSERT(instr->InputAt(0)->IsRegister()); |
- Register reg = ToRegister(instr->InputAt(0)); |
- __ cmp(reg, Operand(instr->hydrogen()->target())); |
+ Register reg = ToRegister(instr->value()); |
+ Handle<JSFunction> target = instr->hydrogen()->target(); |
+ if (isolate()->heap()->InNewSpace(*target)) { |
+ Register reg = ToRegister(instr->value()); |
+ Handle<JSGlobalPropertyCell> cell = |
+ isolate()->factory()->NewJSGlobalPropertyCell(target); |
+ __ mov(ip, Operand(Handle<Object>(cell))); |
+ __ ldr(ip, FieldMemOperand(ip, JSGlobalPropertyCell::kValueOffset)); |
+ __ cmp(reg, ip); |
+ } else { |
+ __ cmp(reg, Operand(target)); |
+ } |
DeoptimizeIf(ne, instr->environment()); |
} |
@@ -4189,19 +4218,6 @@ |
} |
-void LCodeGen::LoadHeapObject(Register result, |
- Handle<HeapObject> object) { |
- if (heap()->InNewSpace(*object)) { |
- Handle<JSGlobalPropertyCell> cell = |
- factory()->NewJSGlobalPropertyCell(object); |
- __ mov(result, Operand(cell)); |
- __ ldr(result, FieldMemOperand(result, JSGlobalPropertyCell::kValueOffset)); |
- } else { |
- __ mov(result, Operand(object)); |
- } |
-} |
- |
- |
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
Register temp1 = ToRegister(instr->TempAt(0)); |
Register temp2 = ToRegister(instr->TempAt(1)); |
@@ -4210,7 +4226,7 @@ |
Handle<JSObject> current_prototype = instr->prototype(); |
// Load prototype object. |
- LoadHeapObject(temp1, current_prototype); |
+ __ LoadHeapObject(temp1, current_prototype); |
// Check prototype maps up to the holder. |
while (!current_prototype.is_identical_to(holder)) { |
@@ -4220,7 +4236,7 @@ |
current_prototype = |
Handle<JSObject>(JSObject::cast(current_prototype->GetPrototype())); |
// Load next prototype object. |
- LoadHeapObject(temp1, current_prototype); |
+ __ LoadHeapObject(temp1, current_prototype); |
} |
// Check the holder map. |
@@ -4297,10 +4313,10 @@ |
Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
__ add(r2, result, Operand(*offset)); |
__ str(r2, FieldMemOperand(result, total_offset)); |
- LoadHeapObject(source, value_object); |
+ __ LoadHeapObject(source, value_object); |
EmitDeepCopy(value_object, result, source, offset); |
} else if (value->IsHeapObject()) { |
- LoadHeapObject(r2, Handle<HeapObject>::cast(value)); |
+ __ LoadHeapObject(r2, Handle<HeapObject>::cast(value)); |
__ str(r2, FieldMemOperand(result, total_offset)); |
} else { |
__ mov(r2, Operand(value)); |
@@ -4326,7 +4342,7 @@ |
__ bind(&allocated); |
int offset = 0; |
- LoadHeapObject(r1, instr->hydrogen()->boilerplate()); |
+ __ LoadHeapObject(r1, instr->hydrogen()->boilerplate()); |
EmitDeepCopy(instr->hydrogen()->boilerplate(), r0, r1, &offset); |
ASSERT_EQ(size, offset); |
} |