| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index 8f1c9c090dfbdf6e1de38ed34c1f028a2efbe8b0..7e91af36782318a85a43584244f6a3e1fc031cb4 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -143,6 +143,7 @@ bool LCodeGen::GeneratePrologue() {
|
|
|
| // r1: Callee's JS function.
|
| // cp: Callee's context.
|
| + // pp: Callee's constant pool pointer (if FLAG_enable_ool_constant_pool)
|
| // fp: Caller's frame pointer.
|
| // lr: Caller's pc.
|
|
|
| @@ -163,6 +164,7 @@ bool LCodeGen::GeneratePrologue() {
|
| __ Prologue(info()->IsStub() ? BUILD_STUB_FRAME : BUILD_FUNCTION_FRAME);
|
| frame_is_built_ = true;
|
| info_->AddNoFrameRange(0, masm_->pc_offset());
|
| + __ LoadConstantPoolPointerRegister();
|
| }
|
|
|
| // Reserve space for the stack slots needed by the code.
|
| @@ -278,7 +280,7 @@ bool LCodeGen::GenerateDeferredCode() {
|
| ASSERT(!frame_is_built_);
|
| ASSERT(info()->IsStub());
|
| frame_is_built_ = true;
|
| - __ stm(db_w, sp, cp.bit() | fp.bit() | lr.bit());
|
| + __ PushFixedFrame();
|
| __ mov(scratch0(), Operand(Smi::FromInt(StackFrame::STUB)));
|
| __ push(scratch0());
|
| __ add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
|
| @@ -289,7 +291,7 @@ bool LCodeGen::GenerateDeferredCode() {
|
| Comment(";;; Destroy frame");
|
| ASSERT(frame_is_built_);
|
| __ pop(ip);
|
| - __ ldm(ia_w, sp, cp.bit() | fp.bit() | lr.bit());
|
| + __ PopFixedFrame();
|
| frame_is_built_ = false;
|
| }
|
| __ jmp(code->exit());
|
| @@ -340,7 +342,7 @@ bool LCodeGen::GenerateDeoptJumpTable() {
|
| __ b(&needs_frame);
|
| } else {
|
| __ bind(&needs_frame);
|
| - __ stm(db_w, sp, cp.bit() | fp.bit() | lr.bit());
|
| + __ PushFixedFrame();
|
| // This variant of deopt can only be used with stubs. Since we don't
|
| // have a function pointer to install in the stack frame that we're
|
| // building, install a special marker there instead.
|
| @@ -1085,13 +1087,6 @@ void LCodeGen::DoCallStub(LCallStub* instr) {
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
|
| break;
|
| }
|
| - case CodeStub::TranscendentalCache: {
|
| - __ ldr(r0, MemOperand(sp, 0));
|
| - TranscendentalCacheStub stub(instr->transcendental_type(),
|
| - TranscendentalCacheStub::TAGGED);
|
| - CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
|
| - break;
|
| - }
|
| default:
|
| UNREACHABLE();
|
| }
|
| @@ -1414,12 +1409,9 @@ void LCodeGen::DoDivI(LDivI* instr) {
|
|
|
| // Check for (kMinInt / -1).
|
| if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
|
| - Label left_not_min_int;
|
| __ cmp(left, Operand(kMinInt));
|
| - __ b(ne, &left_not_min_int);
|
| - __ cmp(right, Operand(-1));
|
| + __ cmp(right, Operand(-1), eq);
|
| DeoptimizeIf(eq, instr->environment());
|
| - __ bind(&left_not_min_int);
|
| }
|
|
|
| if (CpuFeatures::IsSupported(SUDIV)) {
|
| @@ -1518,12 +1510,9 @@ void LCodeGen::DoMathFloorOfDiv(LMathFloorOfDiv* instr) {
|
|
|
| // Check for (kMinInt / -1).
|
| if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
|
| - Label left_not_min_int;
|
| __ cmp(left, Operand(kMinInt));
|
| - __ b(ne, &left_not_min_int);
|
| - __ cmp(right, Operand(-1));
|
| + __ cmp(right, Operand(-1), eq);
|
| DeoptimizeIf(eq, instr->environment());
|
| - __ bind(&left_not_min_int);
|
| }
|
|
|
| // Check for (0 / -x) that will produce negative zero.
|
| @@ -1892,8 +1881,7 @@ void LCodeGen::DoValueOf(LValueOf* instr) {
|
| // If the object is not a value type, return the object.
|
| __ CompareObjectType(input, map, map, JS_VALUE_TYPE);
|
| __ Move(result, input, ne);
|
| - __ b(ne, &done);
|
| - __ ldr(result, FieldMemOperand(input, JSValue::kValueOffset));
|
| + __ ldr(result, FieldMemOperand(input, JSValue::kValueOffset), eq);
|
|
|
| __ bind(&done);
|
| }
|
| @@ -2134,7 +2122,7 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
| __ PrepareCallCFunction(0, 2, scratch0());
|
| __ SetCallCDoubleArguments(left, right);
|
| __ CallCFunction(
|
| - ExternalReference::double_fp_operation(Token::MOD, isolate()),
|
| + ExternalReference::mod_two_doubles_operation(isolate()),
|
| 0, 2);
|
| // Move the result in the double result register.
|
| __ GetCFunctionDoubleResult(result);
|
| @@ -2925,9 +2913,7 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
| }
|
| int no_frame_start = -1;
|
| if (NeedsEagerFrame()) {
|
| - __ mov(sp, fp);
|
| - no_frame_start = masm_->pc_offset();
|
| - __ ldm(ia_w, sp, fp.bit() | lr.bit());
|
| + no_frame_start = masm_->LeaveFrame(StackFrame::JAVA_SCRIPT);
|
| }
|
| if (instr->has_constant_parameter_count()) {
|
| int parameter_count = ToInteger32(instr->constant_parameter_count());
|
| @@ -3501,7 +3487,9 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) {
|
| __ b(&result_in_receiver);
|
|
|
| __ bind(&global_object);
|
| - __ ldr(result, GlobalObjectOperand());
|
| +
|
| + __ ldr(result, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| + __ ldr(result, ContextOperand(result, Context::GLOBAL_OBJECT_INDEX));
|
| __ ldr(result,
|
| FieldMemOperand(result, JSGlobalObject::kGlobalReceiverOffset));
|
| if (result.is(receiver)) {
|
| @@ -3941,13 +3929,11 @@ void LCodeGen::DoMathExp(LMathExp* instr) {
|
|
|
|
|
| void LCodeGen::DoMathLog(LMathLog* instr) {
|
| - ASSERT(ToDoubleRegister(instr->result()).is(d2));
|
| - // Set the context register to a GC-safe fake value. Clobbering it is
|
| - // OK because this instruction is marked as a call.
|
| - __ mov(cp, Operand::Zero());
|
| - TranscendentalCacheStub stub(TranscendentalCache::LOG,
|
| - TranscendentalCacheStub::UNTAGGED);
|
| - CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
|
| + __ PrepareCallCFunction(0, 1, scratch0());
|
| + __ SetCallCDoubleArguments(ToDoubleRegister(instr->value()));
|
| + __ CallCFunction(ExternalReference::math_log_double_function(isolate()),
|
| + 0, 1);
|
| + __ GetCFunctionDoubleResult(ToDoubleRegister(instr->result()));
|
| }
|
|
|
|
|
| @@ -5587,14 +5573,11 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) {
|
| __ ldr(temp1, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
|
|
| // Skip the arguments adaptor frame if it exists.
|
| - Label check_frame_marker;
|
| __ ldr(temp2, MemOperand(temp1, StandardFrameConstants::kContextOffset));
|
| __ cmp(temp2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
| - __ b(ne, &check_frame_marker);
|
| - __ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kCallerFPOffset));
|
| + __ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kCallerFPOffset), eq);
|
|
|
| // Check the marker in the calling frame.
|
| - __ bind(&check_frame_marker);
|
| __ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kMarkerOffset));
|
| __ cmp(temp1, Operand(Smi::FromInt(StackFrame::CONSTRUCT)));
|
| }
|
|
|