| 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);
|
| }
|
|
|