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
This commit is contained in:
parent
701146a3d7
commit
bf4222fb29
@ -377,6 +377,9 @@ class Operand BASE_EMBEDDED {
|
|||||||
// immediate
|
// immediate
|
||||||
INLINE(explicit Operand(int32_t immediate,
|
INLINE(explicit Operand(int32_t immediate,
|
||||||
RelocInfo::Mode rmode = RelocInfo::NONE));
|
RelocInfo::Mode rmode = RelocInfo::NONE));
|
||||||
|
INLINE(static Operand Zero()) {
|
||||||
|
return Operand(static_cast<int32_t>(0));
|
||||||
|
}
|
||||||
INLINE(explicit Operand(const ExternalReference& f));
|
INLINE(explicit Operand(const ExternalReference& f));
|
||||||
explicit Operand(Handle<Object> handle);
|
explicit Operand(Handle<Object> handle);
|
||||||
INLINE(explicit Operand(Smi* value));
|
INLINE(explicit Operand(Smi* value));
|
||||||
|
@ -549,7 +549,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|||||||
// | s | exp | mantissa |
|
// | s | exp | mantissa |
|
||||||
|
|
||||||
// Check for zero.
|
// Check for zero.
|
||||||
__ cmp(int_scratch, Operand(0));
|
__ cmp(int_scratch, Operand::Zero());
|
||||||
__ mov(dst2, int_scratch);
|
__ mov(dst2, int_scratch);
|
||||||
__ mov(dst1, int_scratch);
|
__ mov(dst1, int_scratch);
|
||||||
__ b(eq, &done);
|
__ b(eq, &done);
|
||||||
@ -557,7 +557,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|||||||
// Preload the sign of the value.
|
// Preload the sign of the value.
|
||||||
__ and_(dst2, int_scratch, Operand(HeapNumber::kSignMask), SetCC);
|
__ and_(dst2, int_scratch, Operand(HeapNumber::kSignMask), SetCC);
|
||||||
// Get the absolute value of the object (as an unsigned integer).
|
// 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].
|
// Get mantisssa[51:20].
|
||||||
|
|
||||||
@ -589,7 +589,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|||||||
__ mov(scratch2, Operand(int_scratch, LSL, scratch2));
|
__ mov(scratch2, Operand(int_scratch, LSL, scratch2));
|
||||||
__ orr(dst2, dst2, scratch2);
|
__ orr(dst2, dst2, scratch2);
|
||||||
// Set dst1 to 0.
|
// Set dst1 to 0.
|
||||||
__ mov(dst1, Operand(0));
|
__ mov(dst1, Operand::Zero());
|
||||||
}
|
}
|
||||||
__ bind(&done);
|
__ bind(&done);
|
||||||
}
|
}
|
||||||
@ -657,7 +657,7 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm,
|
|||||||
// Check for 0 and -0.
|
// Check for 0 and -0.
|
||||||
__ bic(scratch1, dst1, Operand(HeapNumber::kSignMask));
|
__ bic(scratch1, dst1, Operand(HeapNumber::kSignMask));
|
||||||
__ orr(scratch1, scratch1, Operand(dst2));
|
__ orr(scratch1, scratch1, Operand(dst2));
|
||||||
__ cmp(scratch1, Operand(0));
|
__ cmp(scratch1, Operand::Zero());
|
||||||
__ b(eq, &done);
|
__ b(eq, &done);
|
||||||
|
|
||||||
// Check that the value can be exactly represented by a 32-bit integer.
|
// 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.
|
// Check for 0 and -0.
|
||||||
__ bic(dst, scratch1, Operand(HeapNumber::kSignMask));
|
__ bic(dst, scratch1, Operand(HeapNumber::kSignMask));
|
||||||
__ orr(dst, scratch2, Operand(dst));
|
__ orr(dst, scratch2, Operand(dst));
|
||||||
__ cmp(dst, Operand(0));
|
__ cmp(dst, Operand::Zero());
|
||||||
__ b(eq, &done);
|
__ b(eq, &done);
|
||||||
|
|
||||||
DoubleIs32BitInteger(masm, scratch1, scratch2, dst, scratch3, not_int32);
|
DoubleIs32BitInteger(masm, scratch1, scratch2, dst, scratch3, not_int32);
|
||||||
@ -747,7 +747,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm,
|
|||||||
// Set the sign.
|
// Set the sign.
|
||||||
__ ldr(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset));
|
__ ldr(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset));
|
||||||
__ tst(scratch1, Operand(HeapNumber::kSignMask));
|
__ tst(scratch1, Operand(HeapNumber::kSignMask));
|
||||||
__ rsb(dst, dst, Operand(0), LeaveCC, mi);
|
__ rsb(dst, dst, Operand::Zero(), LeaveCC, mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
__ bind(&done);
|
__ bind(&done);
|
||||||
@ -2424,7 +2424,6 @@ void BinaryOpStub::GenerateSmiCode(
|
|||||||
Register left = r1;
|
Register left = r1;
|
||||||
Register right = r0;
|
Register right = r0;
|
||||||
Register scratch1 = r7;
|
Register scratch1 = r7;
|
||||||
Register scratch2 = r9;
|
|
||||||
|
|
||||||
// Perform combined smi check on both operands.
|
// Perform combined smi check on both operands.
|
||||||
__ orr(scratch1, left, Operand(right));
|
__ orr(scratch1, left, Operand(right));
|
||||||
@ -2618,7 +2617,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|||||||
__ b(mi, &return_heap_number);
|
__ b(mi, &return_heap_number);
|
||||||
// Check for minus zero. Return heap number for minus zero.
|
// Check for minus zero. Return heap number for minus zero.
|
||||||
Label not_zero;
|
Label not_zero;
|
||||||
__ cmp(scratch1, Operand(0));
|
__ cmp(scratch1, Operand::Zero());
|
||||||
__ b(ne, ¬_zero);
|
__ b(ne, ¬_zero);
|
||||||
__ vmov(scratch2, d5.high());
|
__ vmov(scratch2, d5.high());
|
||||||
__ tst(scratch2, Operand(HeapNumber::kSignMask));
|
__ tst(scratch2, Operand(HeapNumber::kSignMask));
|
||||||
@ -3110,7 +3109,6 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
|||||||
|
|
||||||
Label no_update;
|
Label no_update;
|
||||||
Label skip_cache;
|
Label skip_cache;
|
||||||
const Register heap_number_map = r5;
|
|
||||||
|
|
||||||
// Call C function to calculate the result and update the cache.
|
// Call C function to calculate the result and update the cache.
|
||||||
// Register r0 holds precalculated cache entry address; preserve
|
// 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);
|
ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address, isolate);
|
||||||
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
||||||
__ ldr(r6, MemOperand(r5));
|
__ ldr(r6, MemOperand(r5));
|
||||||
__ cmp(r6, Operand(0));
|
__ cmp(r6, Operand::Zero());
|
||||||
__ b(ne, &non_outermost_js);
|
__ b(ne, &non_outermost_js);
|
||||||
__ str(fp, MemOperand(r5));
|
__ str(fp, MemOperand(r5));
|
||||||
__ mov(ip, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
__ mov(ip, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
||||||
@ -3656,7 +3654,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|||||||
__ pop(r5);
|
__ pop(r5);
|
||||||
__ cmp(r5, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
__ cmp(r5, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
||||||
__ b(ne, &non_outermost_js_2);
|
__ b(ne, &non_outermost_js_2);
|
||||||
__ mov(r6, Operand(0));
|
__ mov(r6, Operand::Zero());
|
||||||
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
||||||
__ str(r6, MemOperand(r5));
|
__ str(r6, MemOperand(r5));
|
||||||
__ bind(&non_outermost_js_2);
|
__ bind(&non_outermost_js_2);
|
||||||
@ -3857,7 +3855,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
|||||||
__ Push(r0, r1);
|
__ Push(r0, r1);
|
||||||
__ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
__ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
||||||
__ LeaveInternalFrame();
|
__ LeaveInternalFrame();
|
||||||
__ cmp(r0, Operand(0));
|
__ cmp(r0, Operand::Zero());
|
||||||
__ LoadRoot(r0, Heap::kTrueValueRootIndex, eq);
|
__ LoadRoot(r0, Heap::kTrueValueRootIndex, eq);
|
||||||
__ LoadRoot(r0, Heap::kFalseValueRootIndex, ne);
|
__ LoadRoot(r0, Heap::kFalseValueRootIndex, ne);
|
||||||
__ Ret(HasArgsInRegisters() ? 0 : 2);
|
__ Ret(HasArgsInRegisters() ? 0 : 2);
|
||||||
@ -3991,7 +3989,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
|||||||
FixedArray::kHeaderSize + 2 * kPointerSize;
|
FixedArray::kHeaderSize + 2 * kPointerSize;
|
||||||
// If there are no mapped parameters, we do not need the parameter_map.
|
// If there are no mapped parameters, we do not need the parameter_map.
|
||||||
__ cmp(r1, Operand(Smi::FromInt(0)));
|
__ 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);
|
__ mov(r9, Operand(r1, LSL, 1), LeaveCC, ne);
|
||||||
__ add(r9, r9, Operand(kParameterMapHeaderSize), 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, MemOperand(r8, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
||||||
__ ldr(r4, FieldMemOperand(r4, GlobalObject::kGlobalContextOffset));
|
__ ldr(r4, FieldMemOperand(r4, GlobalObject::kGlobalContextOffset));
|
||||||
__ cmp(r1, Operand(0));
|
__ cmp(r1, Operand::Zero());
|
||||||
__ ldr(r4, MemOperand(r4, kNormalOffset), eq);
|
__ ldr(r4, MemOperand(r4, kNormalOffset), eq);
|
||||||
__ ldr(r4, MemOperand(r4, kAliasedOffset), ne);
|
__ ldr(r4, MemOperand(r4, kAliasedOffset), ne);
|
||||||
|
|
||||||
@ -5697,7 +5695,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
|||||||
Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
|
Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
|
||||||
__ add(left, left, Operand(scratch1));
|
__ add(left, left, Operand(scratch1));
|
||||||
__ add(right, right, Operand(scratch1));
|
__ add(right, right, Operand(scratch1));
|
||||||
__ rsb(length, length, Operand(0));
|
__ rsb(length, length, Operand::Zero());
|
||||||
Register index = length; // index = -length;
|
Register index = length; // index = -length;
|
||||||
|
|
||||||
// Compare loop.
|
// Compare loop.
|
||||||
@ -6555,7 +6553,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
|||||||
// treated as a lookup success. For positive lookup probing failure
|
// treated as a lookup success. For positive lookup probing failure
|
||||||
// should be treated as lookup failure.
|
// should be treated as lookup failure.
|
||||||
if (mode_ == POSITIVE_LOOKUP) {
|
if (mode_ == POSITIVE_LOOKUP) {
|
||||||
__ mov(result, Operand(0));
|
__ mov(result, Operand::Zero());
|
||||||
__ Ret();
|
__ Ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6564,7 +6562,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
|||||||
__ Ret();
|
__ Ret();
|
||||||
|
|
||||||
__ bind(¬_in_dictionary);
|
__ bind(¬_in_dictionary);
|
||||||
__ mov(result, Operand(0));
|
__ mov(result, Operand::Zero());
|
||||||
__ Ret();
|
__ Ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4129,11 +4129,8 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
|||||||
default: {
|
default: {
|
||||||
VisitForAccumulatorValue(expr->right());
|
VisitForAccumulatorValue(expr->right());
|
||||||
Condition cond = eq;
|
Condition cond = eq;
|
||||||
bool strict = false;
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case Token::EQ_STRICT:
|
case Token::EQ_STRICT:
|
||||||
strict = true;
|
|
||||||
// Fall through
|
|
||||||
case Token::EQ:
|
case Token::EQ:
|
||||||
cond = eq;
|
cond = eq;
|
||||||
__ pop(r1);
|
__ pop(r1);
|
||||||
|
@ -1399,7 +1399,6 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) {
|
|||||||
|
|
||||||
LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
|
LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
|
||||||
Token::Value op = instr->token();
|
Token::Value op = instr->token();
|
||||||
Representation r = instr->GetInputRepresentation();
|
|
||||||
ASSERT(instr->left()->representation().IsTagged());
|
ASSERT(instr->left()->representation().IsTagged());
|
||||||
ASSERT(instr->right()->representation().IsTagged());
|
ASSERT(instr->right()->representation().IsTagged());
|
||||||
bool reversed = (op == Token::GT || op == Token::LTE);
|
bool reversed = (op == Token::GT || op == Token::LTE);
|
||||||
|
@ -1804,7 +1804,6 @@ Condition LCodeGen::EmitIsObject(Register input,
|
|||||||
void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
||||||
Register reg = ToRegister(instr->InputAt(0));
|
Register reg = ToRegister(instr->InputAt(0));
|
||||||
Register temp1 = ToRegister(instr->TempAt(0));
|
Register temp1 = ToRegister(instr->TempAt(0));
|
||||||
Register temp2 = scratch0();
|
|
||||||
|
|
||||||
int true_block = chunk_->LookupDestination(instr->true_block_id());
|
int true_block = chunk_->LookupDestination(instr->true_block_id());
|
||||||
int false_block = chunk_->LookupDestination(instr->false_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) {
|
void LCodeGen::DoGlobalObject(LGlobalObject* instr) {
|
||||||
Register context = ToRegister(instr->context());
|
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
__ ldr(result, ContextOperand(cp, Context::GLOBAL_INDEX));
|
__ ldr(result, ContextOperand(cp, Context::GLOBAL_INDEX));
|
||||||
}
|
}
|
||||||
@ -3965,7 +3963,6 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
|
|||||||
Register scratch1 = scratch0();
|
Register scratch1 = scratch0();
|
||||||
Register scratch2 = ToRegister(instr->TempAt(0));
|
Register scratch2 = ToRegister(instr->TempAt(0));
|
||||||
DwVfpRegister double_input = ToDoubleRegister(instr->InputAt(0));
|
DwVfpRegister double_input = ToDoubleRegister(instr->InputAt(0));
|
||||||
DwVfpRegister double_scratch = double_scratch0();
|
|
||||||
SwVfpRegister single_scratch = double_scratch0().low();
|
SwVfpRegister single_scratch = double_scratch0().low();
|
||||||
|
|
||||||
Label done;
|
Label done;
|
||||||
|
@ -254,7 +254,6 @@ void LGapResolver::EmitMove(int index) {
|
|||||||
} else {
|
} else {
|
||||||
ASSERT(destination->IsStackSlot());
|
ASSERT(destination->IsStackSlot());
|
||||||
ASSERT(!in_cycle_); // Constant moves happen after all cycles are gone.
|
ASSERT(!in_cycle_); // Constant moves happen after all cycles are gone.
|
||||||
MemOperand destination_operand = cgen_->ToMemOperand(destination);
|
|
||||||
__ mov(kSavedValueRegister, source_operand);
|
__ mov(kSavedValueRegister, source_operand);
|
||||||
__ str(kSavedValueRegister, cgen_->ToMemOperand(destination));
|
__ str(kSavedValueRegister, cgen_->ToMemOperand(destination));
|
||||||
}
|
}
|
||||||
@ -265,8 +264,7 @@ void LGapResolver::EmitMove(int index) {
|
|||||||
__ vmov(cgen_->ToDoubleRegister(destination), source_register);
|
__ vmov(cgen_->ToDoubleRegister(destination), source_register);
|
||||||
} else {
|
} else {
|
||||||
ASSERT(destination->IsDoubleStackSlot());
|
ASSERT(destination->IsDoubleStackSlot());
|
||||||
MemOperand destination_operand = cgen_->ToMemOperand(destination);
|
__ vstr(source_register, cgen_->ToMemOperand(destination));
|
||||||
__ vstr(source_register, destination_operand);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (source->IsDoubleStackSlot()) {
|
} else if (source->IsDoubleStackSlot()) {
|
||||||
|
@ -1183,9 +1183,8 @@ void StubCompiler::GenerateLoadConstant(JSObject* object,
|
|||||||
__ JumpIfSmi(receiver, miss);
|
__ JumpIfSmi(receiver, miss);
|
||||||
|
|
||||||
// Check that the maps haven't changed.
|
// Check that the maps haven't changed.
|
||||||
Register reg =
|
CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name,
|
||||||
CheckPrototypes(object, receiver, holder,
|
miss);
|
||||||
scratch1, scratch2, scratch3, name, miss);
|
|
||||||
|
|
||||||
// Return the constant value.
|
// Return the constant value.
|
||||||
__ mov(r0, Operand(Handle<Object>(value)));
|
__ mov(r0, Operand(Handle<Object>(value)));
|
||||||
|
Loading…
Reference in New Issue
Block a user