From bf4222fb2918aaec45b83038e145a615d5cabb51 Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Tue, 23 Aug 2011 12:00:09 +0000 Subject: [PATCH] Fix ARM build for gcc-4.6. This is based on Peter Varga's work in http://codereview.chromium.org/7708004/ but with a different solution for the Operand(0) int/pointer ambiguity. Review URL: http://codereview.chromium.org/7706030 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8998 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/assembler-arm.h | 3 +++ src/arm/code-stubs-arm.cc | 32 ++++++++++++++--------------- src/arm/full-codegen-arm.cc | 3 --- src/arm/lithium-arm.cc | 1 - src/arm/lithium-codegen-arm.cc | 3 --- src/arm/lithium-gap-resolver-arm.cc | 4 +--- src/arm/stub-cache-arm.cc | 5 ++--- 7 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h index 97d4226503..9a586936fe 100644 --- a/src/arm/assembler-arm.h +++ b/src/arm/assembler-arm.h @@ -377,6 +377,9 @@ class Operand BASE_EMBEDDED { // immediate INLINE(explicit Operand(int32_t immediate, RelocInfo::Mode rmode = RelocInfo::NONE)); + INLINE(static Operand Zero()) { + return Operand(static_cast(0)); + } INLINE(explicit Operand(const ExternalReference& f)); explicit Operand(Handle handle); INLINE(explicit Operand(Smi* value)); diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index 82fa8ceaf3..ba345e24ba 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -549,7 +549,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, // | s | exp | mantissa | // Check for zero. - __ cmp(int_scratch, Operand(0)); + __ cmp(int_scratch, Operand::Zero()); __ mov(dst2, int_scratch); __ mov(dst1, int_scratch); __ b(eq, &done); @@ -557,7 +557,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, // Preload the sign of the value. __ and_(dst2, int_scratch, Operand(HeapNumber::kSignMask), SetCC); // Get the absolute value of the object (as an unsigned integer). - __ rsb(int_scratch, int_scratch, Operand(0), SetCC, mi); + __ rsb(int_scratch, int_scratch, Operand::Zero(), SetCC, mi); // Get mantisssa[51:20]. @@ -589,7 +589,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, __ mov(scratch2, Operand(int_scratch, LSL, scratch2)); __ orr(dst2, dst2, scratch2); // Set dst1 to 0. - __ mov(dst1, Operand(0)); + __ mov(dst1, Operand::Zero()); } __ bind(&done); } @@ -657,7 +657,7 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, // Check for 0 and -0. __ bic(scratch1, dst1, Operand(HeapNumber::kSignMask)); __ orr(scratch1, scratch1, Operand(dst2)); - __ cmp(scratch1, Operand(0)); + __ cmp(scratch1, Operand::Zero()); __ b(eq, &done); // Check that the value can be exactly represented by a 32-bit integer. @@ -730,7 +730,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm, // Check for 0 and -0. __ bic(dst, scratch1, Operand(HeapNumber::kSignMask)); __ orr(dst, scratch2, Operand(dst)); - __ cmp(dst, Operand(0)); + __ cmp(dst, Operand::Zero()); __ b(eq, &done); DoubleIs32BitInteger(masm, scratch1, scratch2, dst, scratch3, not_int32); @@ -747,7 +747,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm, // Set the sign. __ ldr(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset)); __ tst(scratch1, Operand(HeapNumber::kSignMask)); - __ rsb(dst, dst, Operand(0), LeaveCC, mi); + __ rsb(dst, dst, Operand::Zero(), LeaveCC, mi); } __ bind(&done); @@ -2424,7 +2424,6 @@ void BinaryOpStub::GenerateSmiCode( Register left = r1; Register right = r0; Register scratch1 = r7; - Register scratch2 = r9; // Perform combined smi check on both operands. __ orr(scratch1, left, Operand(right)); @@ -2618,7 +2617,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) { __ b(mi, &return_heap_number); // Check for minus zero. Return heap number for minus zero. Label not_zero; - __ cmp(scratch1, Operand(0)); + __ cmp(scratch1, Operand::Zero()); __ b(ne, ¬_zero); __ vmov(scratch2, d5.high()); __ tst(scratch2, Operand(HeapNumber::kSignMask)); @@ -3110,7 +3109,6 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { Label no_update; Label skip_cache; - const Register heap_number_map = r5; // Call C function to calculate the result and update the cache. // Register r0 holds precalculated cache entry address; preserve @@ -3581,7 +3579,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address, isolate); __ mov(r5, Operand(ExternalReference(js_entry_sp))); __ ldr(r6, MemOperand(r5)); - __ cmp(r6, Operand(0)); + __ cmp(r6, Operand::Zero()); __ b(ne, &non_outermost_js); __ str(fp, MemOperand(r5)); __ mov(ip, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME))); @@ -3656,7 +3654,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ pop(r5); __ cmp(r5, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME))); __ b(ne, &non_outermost_js_2); - __ mov(r6, Operand(0)); + __ mov(r6, Operand::Zero()); __ mov(r5, Operand(ExternalReference(js_entry_sp))); __ str(r6, MemOperand(r5)); __ bind(&non_outermost_js_2); @@ -3857,7 +3855,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { __ Push(r0, r1); __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); __ LeaveInternalFrame(); - __ cmp(r0, Operand(0)); + __ cmp(r0, Operand::Zero()); __ LoadRoot(r0, Heap::kTrueValueRootIndex, eq); __ LoadRoot(r0, Heap::kFalseValueRootIndex, ne); __ Ret(HasArgsInRegisters() ? 0 : 2); @@ -3991,7 +3989,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { FixedArray::kHeaderSize + 2 * kPointerSize; // If there are no mapped parameters, we do not need the parameter_map. __ cmp(r1, Operand(Smi::FromInt(0))); - __ mov(r9, Operand(0), LeaveCC, eq); + __ mov(r9, Operand::Zero(), LeaveCC, eq); __ mov(r9, Operand(r1, LSL, 1), LeaveCC, ne); __ add(r9, r9, Operand(kParameterMapHeaderSize), LeaveCC, ne); @@ -4015,7 +4013,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { __ ldr(r4, MemOperand(r8, Context::SlotOffset(Context::GLOBAL_INDEX))); __ ldr(r4, FieldMemOperand(r4, GlobalObject::kGlobalContextOffset)); - __ cmp(r1, Operand(0)); + __ cmp(r1, Operand::Zero()); __ ldr(r4, MemOperand(r4, kNormalOffset), eq); __ ldr(r4, MemOperand(r4, kAliasedOffset), ne); @@ -5697,7 +5695,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop( Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); __ add(left, left, Operand(scratch1)); __ add(right, right, Operand(scratch1)); - __ rsb(length, length, Operand(0)); + __ rsb(length, length, Operand::Zero()); Register index = length; // index = -length; // Compare loop. @@ -6555,7 +6553,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) { // treated as a lookup success. For positive lookup probing failure // should be treated as lookup failure. if (mode_ == POSITIVE_LOOKUP) { - __ mov(result, Operand(0)); + __ mov(result, Operand::Zero()); __ Ret(); } @@ -6564,7 +6562,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) { __ Ret(); __ bind(¬_in_dictionary); - __ mov(result, Operand(0)); + __ mov(result, Operand::Zero()); __ Ret(); } diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index d8ce956ec9..97f7fea793 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -4129,11 +4129,8 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) { default: { VisitForAccumulatorValue(expr->right()); Condition cond = eq; - bool strict = false; switch (op) { case Token::EQ_STRICT: - strict = true; - // Fall through case Token::EQ: cond = eq; __ pop(r1); diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index 65ef3e6e1f..38f77cda4c 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -1399,7 +1399,6 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) { LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { Token::Value op = instr->token(); - Representation r = instr->GetInputRepresentation(); ASSERT(instr->left()->representation().IsTagged()); ASSERT(instr->right()->representation().IsTagged()); bool reversed = (op == Token::GT || op == Token::LTE); diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 4e135d66b5..3469bb63a8 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -1804,7 +1804,6 @@ Condition LCodeGen::EmitIsObject(Register input, void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) { Register reg = ToRegister(instr->InputAt(0)); Register temp1 = ToRegister(instr->TempAt(0)); - Register temp2 = scratch0(); int true_block = chunk_->LookupDestination(instr->true_block_id()); int false_block = chunk_->LookupDestination(instr->false_block_id()); @@ -2759,7 +2758,6 @@ void LCodeGen::DoOuterContext(LOuterContext* instr) { void LCodeGen::DoGlobalObject(LGlobalObject* instr) { - Register context = ToRegister(instr->context()); Register result = ToRegister(instr->result()); __ ldr(result, ContextOperand(cp, Context::GLOBAL_INDEX)); } @@ -3965,7 +3963,6 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) { Register scratch1 = scratch0(); Register scratch2 = ToRegister(instr->TempAt(0)); DwVfpRegister double_input = ToDoubleRegister(instr->InputAt(0)); - DwVfpRegister double_scratch = double_scratch0(); SwVfpRegister single_scratch = double_scratch0().low(); Label done; diff --git a/src/arm/lithium-gap-resolver-arm.cc b/src/arm/lithium-gap-resolver-arm.cc index 02608a6950..26f60fac11 100644 --- a/src/arm/lithium-gap-resolver-arm.cc +++ b/src/arm/lithium-gap-resolver-arm.cc @@ -254,7 +254,6 @@ void LGapResolver::EmitMove(int index) { } else { ASSERT(destination->IsStackSlot()); ASSERT(!in_cycle_); // Constant moves happen after all cycles are gone. - MemOperand destination_operand = cgen_->ToMemOperand(destination); __ mov(kSavedValueRegister, source_operand); __ str(kSavedValueRegister, cgen_->ToMemOperand(destination)); } @@ -265,8 +264,7 @@ void LGapResolver::EmitMove(int index) { __ vmov(cgen_->ToDoubleRegister(destination), source_register); } else { ASSERT(destination->IsDoubleStackSlot()); - MemOperand destination_operand = cgen_->ToMemOperand(destination); - __ vstr(source_register, destination_operand); + __ vstr(source_register, cgen_->ToMemOperand(destination)); } } else if (source->IsDoubleStackSlot()) { diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc index 1767b9d5b2..16e6468422 100644 --- a/src/arm/stub-cache-arm.cc +++ b/src/arm/stub-cache-arm.cc @@ -1183,9 +1183,8 @@ void StubCompiler::GenerateLoadConstant(JSObject* object, __ JumpIfSmi(receiver, miss); // Check that the maps haven't changed. - Register reg = - CheckPrototypes(object, receiver, holder, - scratch1, scratch2, scratch3, name, miss); + CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name, + miss); // Return the constant value. __ mov(r0, Operand(Handle(value)));