Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 5234) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -4564,22 +4564,18 @@ |
// This generates code that performs a String.prototype.charCodeAt() call |
// or returns a smi in order to trigger conversion. |
void CodeGenerator::GenerateStringCharCodeAt(ZoneList<Expression*>* args) { |
- VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment(masm_, "[ GenerateStringCharCodeAt"); |
ASSERT(args->length() == 2); |
Load(args->at(0)); |
Load(args->at(1)); |
- Register index = r1; |
- Register object = r2; |
+ Register index = frame_->PopToRegister(); |
+ Register object = frame_->PopToRegister(index); |
- frame_->EmitPop(r1); |
- frame_->EmitPop(r2); |
- |
// We need two extra registers. |
- Register scratch = r3; |
- Register result = r0; |
+ Register scratch = VirtualFrame::scratch0(); |
+ Register result = VirtualFrame::scratch1(); |
DeferredStringCharCodeAt* deferred = |
new DeferredStringCharCodeAt(object, |
@@ -4614,17 +4610,14 @@ |
// Generates code for creating a one-char string from a char code. |
void CodeGenerator::GenerateStringCharFromCode(ZoneList<Expression*>* args) { |
- VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment(masm_, "[ GenerateStringCharFromCode"); |
ASSERT(args->length() == 1); |
Load(args->at(0)); |
- Register code = r1; |
- Register result = r0; |
+ Register result = frame_->GetTOSRegister(); |
+ Register code = frame_->PopToRegister(result); |
- frame_->EmitPop(code); |
- |
DeferredStringCharFromCode* deferred = new DeferredStringCharFromCode( |
code, result); |
deferred->fast_case_generator()->GenerateFast(masm_); |
@@ -4685,23 +4678,20 @@ |
// This generates code that performs a String.prototype.charAt() call |
// or returns a smi in order to trigger conversion. |
void CodeGenerator::GenerateStringCharAt(ZoneList<Expression*>* args) { |
- VirtualFrame::SpilledScope spilled_scope(frame_); |
Comment(masm_, "[ GenerateStringCharAt"); |
ASSERT(args->length() == 2); |
Load(args->at(0)); |
Load(args->at(1)); |
- Register index = r1; |
- Register object = r2; |
+ Register index = frame_->PopToRegister(); |
+ Register object = frame_->PopToRegister(index); |
- frame_->EmitPop(r1); |
- frame_->EmitPop(r2); |
- |
// We need three extra registers. |
- Register scratch1 = r3; |
- Register scratch2 = r4; |
- Register result = r0; |
+ Register scratch1 = VirtualFrame::scratch0(); |
+ Register scratch2 = VirtualFrame::scratch1(); |
+ // Use r6 without notifying the virtual frame. |
+ Register result = r6; |
DeferredStringCharAt* deferred = |
new DeferredStringCharAt(object, |
@@ -4880,13 +4870,13 @@ |
void CodeGenerator::GenerateArguments(ZoneList<Expression*>* args) { |
- VirtualFrame::SpilledScope spilled_scope(frame_); |
ASSERT(args->length() == 1); |
// Satisfy contract with ArgumentsAccessStub: |
// Load the key into r1 and the formal parameters count into r0. |
Load(args->at(0)); |
- frame_->EmitPop(r1); |
+ frame_->PopToR1(); |
+ frame_->SpillAll(); |
__ mov(r0, Operand(Smi::FromInt(scope()->num_parameters()))); |
// Call the shared stub to get to arguments[key]. |
@@ -5114,9 +5104,7 @@ |
void DeferredSearchCache::Generate() { |
__ Push(cache_, key_); |
__ CallRuntime(Runtime::kGetFromCache, 2); |
- if (!dst_.is(r0)) { |
- __ mov(dst_, r0); |
- } |
+ __ Move(dst_, r0); |
} |
@@ -5136,33 +5124,42 @@ |
Load(args->at(1)); |
- VirtualFrame::SpilledScope spilled_scope(frame_); |
+ frame_->PopToR1(); |
+ frame_->SpillAll(); |
+ Register key = r1; // Just poped to r1 |
+ Register result = r0; // Free, as frame has just been spilled. |
+ Register scratch1 = VirtualFrame::scratch0(); |
+ Register scratch2 = VirtualFrame::scratch1(); |
- frame_->EmitPop(r2); |
+ __ ldr(scratch1, ContextOperand(cp, Context::GLOBAL_INDEX)); |
+ __ ldr(scratch1, |
+ FieldMemOperand(scratch1, GlobalObject::kGlobalContextOffset)); |
+ __ ldr(scratch1, |
+ ContextOperand(scratch1, Context::JSFUNCTION_RESULT_CACHES_INDEX)); |
+ __ ldr(scratch1, |
+ FieldMemOperand(scratch1, FixedArray::OffsetOfElementAt(cache_id))); |
- __ ldr(r1, ContextOperand(cp, Context::GLOBAL_INDEX)); |
- __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalContextOffset)); |
- __ ldr(r1, ContextOperand(r1, Context::JSFUNCTION_RESULT_CACHES_INDEX)); |
- __ ldr(r1, FieldMemOperand(r1, FixedArray::OffsetOfElementAt(cache_id))); |
+ DeferredSearchCache* deferred = |
+ new DeferredSearchCache(result, scratch1, key); |
- DeferredSearchCache* deferred = new DeferredSearchCache(r0, r1, r2); |
- |
const int kFingerOffset = |
FixedArray::OffsetOfElementAt(JSFunctionResultCache::kFingerIndex); |
STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1); |
- __ ldr(r0, FieldMemOperand(r1, kFingerOffset)); |
- // r0 now holds finger offset as a smi. |
- __ add(r3, r1, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- // r3 now points to the start of fixed array elements. |
- __ ldr(r0, MemOperand(r3, r0, LSL, kPointerSizeLog2 - kSmiTagSize, PreIndex)); |
- // Note side effect of PreIndex: r3 now points to the key of the pair. |
- __ cmp(r2, r0); |
+ __ ldr(result, FieldMemOperand(scratch1, kFingerOffset)); |
+ // result now holds finger offset as a smi. |
+ __ add(scratch2, scratch1, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
+ // scratch2 now points to the start of fixed array elements. |
+ __ ldr(result, |
+ MemOperand( |
+ scratch2, result, LSL, kPointerSizeLog2 - kSmiTagSize, PreIndex)); |
+ // Note side effect of PreIndex: scratch2 now points to the key of the pair. |
+ __ cmp(key, result); |
deferred->Branch(ne); |
- __ ldr(r0, MemOperand(r3, kPointerSize)); |
+ __ ldr(result, MemOperand(scratch2, kPointerSize)); |
deferred->BindExit(); |
- frame_->EmitPush(r0); |
+ frame_->EmitPush(result); |
} |
@@ -10455,11 +10452,9 @@ |
// NumberToSmi discards numbers that are not exact integers. |
__ CallRuntime(Runtime::kNumberToSmi, 1); |
} |
- if (!scratch_.is(r0)) { |
- // Save the conversion result before the pop instructions below |
- // have a chance to overwrite it. |
- __ mov(scratch_, r0); |
- } |
+ // Save the conversion result before the pop instructions below |
+ // have a chance to overwrite it. |
+ __ Move(scratch_, r0); |
__ pop(index_); |
__ pop(object_); |
// Reload the instance type. |
@@ -10478,9 +10473,7 @@ |
call_helper.BeforeCall(masm); |
__ Push(object_, index_); |
__ CallRuntime(Runtime::kStringCharCodeAt, 2); |
- if (!result_.is(r0)) { |
- __ mov(result_, r0); |
- } |
+ __ Move(result_, r0); |
call_helper.AfterCall(masm); |
__ jmp(&exit_); |
@@ -10521,9 +10514,7 @@ |
call_helper.BeforeCall(masm); |
__ push(code_); |
__ CallRuntime(Runtime::kCharFromCode, 1); |
- if (!result_.is(r0)) { |
- __ mov(result_, r0); |
- } |
+ __ Move(result_, r0); |
call_helper.AfterCall(masm); |
__ jmp(&exit_); |