Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 6144) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -598,7 +598,7 @@ |
DoubleRegister dbl_scratch = d0; |
LUnallocated marker_operand(LUnallocated::NONE); |
- Register core_scratch = r9; |
+ Register core_scratch = scratch0(); |
bool destroys_core_scratch = false; |
LGapResolver resolver(move->move_operands(), &marker_operand); |
@@ -750,8 +750,8 @@ |
void LCodeGen::DoMulI(LMulI* instr) { |
+ Register scratch = scratch0(); |
Register left = ToRegister(instr->left()); |
- Register scratch = r9; |
Register right = EmitLoadRegister(instr->right(), scratch); |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero) && |
@@ -813,6 +813,7 @@ |
void LCodeGen::DoShiftI(LShiftI* instr) { |
+ Register scratch = scratch0(); |
LOperand* left = instr->left(); |
LOperand* right = instr->right(); |
ASSERT(left->Equals(instr->result())); |
@@ -820,21 +821,21 @@ |
Register result = ToRegister(left); |
if (right->IsRegister()) { |
// Mask the right operand. |
- __ and_(r9, ToRegister(right), Operand(0x1F)); |
+ __ and_(scratch, ToRegister(right), Operand(0x1F)); |
switch (instr->op()) { |
case Token::SAR: |
- __ mov(result, Operand(result, ASR, r9)); |
+ __ mov(result, Operand(result, ASR, scratch)); |
break; |
case Token::SHR: |
if (instr->can_deopt()) { |
- __ mov(result, Operand(result, LSR, r9), SetCC); |
+ __ mov(result, Operand(result, LSR, scratch), SetCC); |
DeoptimizeIf(mi, instr->environment()); |
} else { |
- __ mov(result, Operand(result, LSR, r9)); |
+ __ mov(result, Operand(result, LSR, scratch)); |
} |
break; |
case Token::SHL: |
- __ mov(result, Operand(result, LSL, r9)); |
+ __ mov(result, Operand(result, LSL, scratch)); |
break; |
default: |
UNREACHABLE(); |
@@ -1060,11 +1061,10 @@ |
// Test for double values. Zero is false. |
Label call_stub; |
DoubleRegister dbl_scratch = d0; |
- Register core_scratch = r9; |
- ASSERT(!reg.is(core_scratch)); |
- __ ldr(core_scratch, FieldMemOperand(reg, HeapObject::kMapOffset)); |
+ Register scratch = scratch0(); |
+ __ ldr(scratch, FieldMemOperand(reg, HeapObject::kMapOffset)); |
__ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); |
- __ cmp(core_scratch, Operand(ip)); |
+ __ cmp(scratch, Operand(ip)); |
__ b(ne, &call_stub); |
__ sub(ip, reg, Operand(kHeapObjectTag)); |
__ vldr(dbl_scratch, ip, HeapNumber::kValueOffset); |
@@ -1176,6 +1176,7 @@ |
void LCodeGen::DoIsNullAndBranch(LIsNullAndBranch* instr) { |
+ Register scratch = scratch0(); |
Register reg = ToRegister(instr->input()); |
// TODO(fsc): If the expression is known to be a smi, then it's |
@@ -1199,7 +1200,6 @@ |
__ b(eq, false_label); |
// Check for undetectable objects by looking in the bit field in |
// the map. The object has already been smi checked. |
- Register scratch = ToRegister(instr->temp()); |
__ ldr(scratch, FieldMemOperand(reg, HeapObject::kMapOffset)); |
__ ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset)); |
__ tst(scratch, Operand(1 << Map::kIsUndetectable)); |
@@ -1277,8 +1277,8 @@ |
void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { |
+ Register scratch = scratch0(); |
Register input = ToRegister(instr->input()); |
- Register temp = ToRegister(instr->temp()); |
int true_block = chunk_->LookupDestination(instr->true_block_id()); |
int false_block = chunk_->LookupDestination(instr->false_block_id()); |
@@ -1288,7 +1288,7 @@ |
__ tst(input, Operand(kSmiTagMask)); |
__ b(eq, false_label); |
- __ CompareObjectType(input, temp, temp, instr->TestType()); |
+ __ CompareObjectType(input, scratch, scratch, instr->TestType()); |
EmitBranch(true_block, false_block, instr->BranchCondition()); |
} |
@@ -1445,19 +1445,19 @@ |
void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { |
+ Register scratch = scratch0(); |
Register function = ToRegister(instr->function()); |
- Register temp = ToRegister(instr->temporary()); |
Register result = ToRegister(instr->result()); |
// Check that the function really is a function. Load map into the |
// result register. |
- __ CompareObjectType(function, result, temp, JS_FUNCTION_TYPE); |
+ __ CompareObjectType(function, result, scratch, JS_FUNCTION_TYPE); |
DeoptimizeIf(ne, instr->environment()); |
// Make sure that the function has an instance prototype. |
Label non_instance; |
- __ ldrb(temp, FieldMemOperand(result, Map::kBitFieldOffset)); |
- __ tst(temp, Operand(1 << Map::kHasNonInstancePrototype)); |
+ __ ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); |
+ __ tst(scratch, Operand(1 << Map::kHasNonInstancePrototype)); |
__ b(ne, &non_instance); |
// Get the prototype or initial map from the function. |
@@ -1471,7 +1471,7 @@ |
// If the function does not have an initial map, we're done. |
Label done; |
- __ CompareObjectType(result, temp, temp, MAP_TYPE); |
+ __ CompareObjectType(result, scratch, scratch, MAP_TYPE); |
__ b(ne, &done); |
// Get the prototype from the initial map. |
@@ -1798,10 +1798,10 @@ |
}; |
DoubleRegister input_reg = ToDoubleRegister(instr->input()); |
+ Register scratch = scratch0(); |
Register reg = ToRegister(instr->result()); |
Register temp1 = ToRegister(instr->temp1()); |
Register temp2 = ToRegister(instr->temp2()); |
- Register scratch = r9; |
DeferredNumberTagD* deferred = new DeferredNumberTagD(this, instr); |
if (FLAG_inline_new) { |
@@ -1849,8 +1849,7 @@ |
void LCodeGen::EmitNumberUntagD(Register input_reg, |
DoubleRegister result_reg, |
LEnvironment* env) { |
- Register core_scratch = r9; |
- ASSERT(!input_reg.is(core_scratch)); |
+ Register scratch = scratch0(); |
SwVfpRegister flt_scratch = s0; |
ASSERT(!result_reg.is(d0)); |
@@ -1861,9 +1860,9 @@ |
__ b(eq, &load_smi); |
// Heap number map check. |
- __ ldr(core_scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
+ __ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
__ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); |
- __ cmp(core_scratch, Operand(ip)); |
+ __ cmp(scratch, Operand(ip)); |
__ b(eq, &heap_number); |
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex); |
@@ -1905,16 +1904,15 @@ |
void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) { |
Label done; |
Register input_reg = ToRegister(instr->input()); |
- Register core_scratch = r9; |
- ASSERT(!input_reg.is(core_scratch)); |
+ Register scratch = scratch0(); |
DoubleRegister dbl_scratch = d0; |
SwVfpRegister flt_scratch = s0; |
DoubleRegister dbl_tmp = ToDoubleRegister(instr->temp()); |
// Heap number map check. |
- __ ldr(core_scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
+ __ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset)); |
__ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); |
- __ cmp(core_scratch, Operand(ip)); |
+ __ cmp(scratch, Operand(ip)); |
if (instr->truncating()) { |
Label heap_number; |
@@ -2026,11 +2024,12 @@ |
void LCodeGen::DoCheckMap(LCheckMap* instr) { |
+ Register scratch = scratch0(); |
LOperand* input = instr->input(); |
ASSERT(input->IsRegister()); |
Register reg = ToRegister(input); |
- __ ldr(r9, FieldMemOperand(reg, HeapObject::kMapOffset)); |
- __ cmp(r9, Operand(instr->hydrogen()->map())); |
+ __ ldr(scratch, FieldMemOperand(reg, HeapObject::kMapOffset)); |
+ __ cmp(scratch, Operand(instr->hydrogen()->map())); |
DeoptimizeIf(ne, instr->environment()); |
} |
@@ -2097,8 +2096,7 @@ |
Register input, |
Handle<String> type_name) { |
Condition final_branch_condition = no_condition; |
- Register core_scratch = r9; |
- ASSERT(!input.is(core_scratch)); |
+ Register scratch = scratch0(); |
if (type_name->Equals(Heap::number_symbol())) { |
__ tst(input, Operand(kSmiTagMask)); |
__ b(eq, true_label); |
@@ -2114,7 +2112,7 @@ |
__ ldrb(ip, FieldMemOperand(input, Map::kBitFieldOffset)); |
__ tst(ip, Operand(1 << Map::kIsUndetectable)); |
__ b(ne, false_label); |
- __ CompareInstanceType(input, core_scratch, FIRST_NONSTRING_TYPE); |
+ __ CompareInstanceType(input, scratch, FIRST_NONSTRING_TYPE); |
final_branch_condition = lo; |
} else if (type_name->Equals(Heap::boolean_symbol())) { |
@@ -2140,10 +2138,10 @@ |
} else if (type_name->Equals(Heap::function_symbol())) { |
__ tst(input, Operand(kSmiTagMask)); |
__ b(eq, false_label); |
- __ CompareObjectType(input, input, core_scratch, JS_FUNCTION_TYPE); |
+ __ CompareObjectType(input, input, scratch, JS_FUNCTION_TYPE); |
__ b(eq, true_label); |
// Regular expressions => 'function' (they are callable). |
- __ CompareInstanceType(input, core_scratch, JS_REGEXP_TYPE); |
+ __ CompareInstanceType(input, scratch, JS_REGEXP_TYPE); |
final_branch_condition = eq; |
} else if (type_name->Equals(Heap::object_symbol())) { |
@@ -2153,16 +2151,16 @@ |
__ cmp(input, ip); |
__ b(eq, true_label); |
// Regular expressions => 'function', not 'object'. |
- __ CompareObjectType(input, input, core_scratch, JS_REGEXP_TYPE); |
+ __ CompareObjectType(input, input, scratch, JS_REGEXP_TYPE); |
__ b(eq, false_label); |
// Check for undetectable objects => false. |
__ ldrb(ip, FieldMemOperand(input, Map::kBitFieldOffset)); |
__ tst(ip, Operand(1 << Map::kIsUndetectable)); |
__ b(ne, false_label); |
// Check for JS objects => true. |
- __ CompareInstanceType(input, core_scratch, FIRST_JS_OBJECT_TYPE); |
+ __ CompareInstanceType(input, scratch, FIRST_JS_OBJECT_TYPE); |
__ b(lo, false_label); |
- __ CompareInstanceType(input, core_scratch, LAST_JS_OBJECT_TYPE); |
+ __ CompareInstanceType(input, scratch, LAST_JS_OBJECT_TYPE); |
final_branch_condition = ls; |
} else { |