From 4ad6f2f93ed9a89a739107bbe9c4f59fbbe65ade Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Wed, 26 May 2010 08:40:11 +0000 Subject: [PATCH] Refactoring of codegen-arm.cc to use the VirtualFrame API. This is a commit for Rodolph Perfetta. http://codereview.chromium.org/2159002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4722 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 124 ++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 64 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index 030572a..2b46cb5 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -2726,7 +2726,6 @@ void CodeGenerator::VisitFunctionLiteral(FunctionLiteral* node) { #ifdef DEBUG int original_height = frame_->height(); #endif - VirtualFrame::SpilledScope spilled_scope(frame_); Comment cmnt(masm_, "[ FunctionLiteral"); // Build the function info and instantiate it. @@ -2747,7 +2746,6 @@ void CodeGenerator::VisitSharedFunctionInfoLiteral( #ifdef DEBUG int original_height = frame_->height(); #endif - VirtualFrame::SpilledScope spilled_scope(frame_); Comment cmnt(masm_, "[ SharedFunctionInfoLiteral"); InstantiateFunction(node->shared_function_info()); ASSERT_EQ(original_height + 1, frame_->height()); @@ -4041,37 +4039,35 @@ void CodeGenerator::GenerateSetValueOf(ZoneList* args) { void CodeGenerator::GenerateIsSmi(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 1); - LoadAndSpill(args->at(0)); - frame_->EmitPop(r0); - __ tst(r0, Operand(kSmiTagMask)); + Load(args->at(0)); + Register reg = frame_->PopToRegister(); + __ tst(reg, Operand(kSmiTagMask)); cc_reg_ = eq; } void CodeGenerator::GenerateLog(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); // See comment in CodeGenerator::GenerateLog in codegen-ia32.cc. ASSERT_EQ(args->length(), 3); #ifdef ENABLE_LOGGING_AND_PROFILING if (ShouldGenerateLog(args->at(0))) { - LoadAndSpill(args->at(1)); - LoadAndSpill(args->at(2)); + Load(args->at(1)); + Load(args->at(2)); + frame_->SpillAll(); + VirtualFrame::SpilledScope spilled_scope(frame_); __ CallRuntime(Runtime::kLog, 2); } #endif - __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); - frame_->EmitPush(r0); + frame_->EmitPushRoot(Heap::kUndefinedValueRootIndex); } void CodeGenerator::GenerateIsNonNegativeSmi(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 1); - LoadAndSpill(args->at(0)); - frame_->EmitPop(r0); - __ tst(r0, Operand(kSmiTagMask | 0x80000000u)); + Load(args->at(0)); + Register reg = frame_->PopToRegister(); + __ tst(reg, Operand(kSmiTagMask | 0x80000000u)); cc_reg_ = eq; } @@ -4102,22 +4098,23 @@ void CodeGenerator::GenerateMathSqrt(ZoneList* args) { // flatten the string, which will ensure that the answer is in the left hand // side the next time around. void CodeGenerator::GenerateFastCharCodeAt(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 2); Comment(masm_, "[ GenerateFastCharCodeAt"); - LoadAndSpill(args->at(0)); - LoadAndSpill(args->at(1)); - frame_->EmitPop(r1); // Index. - frame_->EmitPop(r2); // String. + Load(args->at(0)); + Load(args->at(1)); + Register index = frame_->PopToRegister(); // Index. + Register string = frame_->PopToRegister(index); // String. + Register result = VirtualFrame::scratch0(); + Register scratch = VirtualFrame::scratch1(); Label slow_case; Label exit; StringHelper::GenerateFastCharCodeAt(masm_, - r2, - r1, - r3, - r0, + string, + index, + scratch, + result, &slow_case, &slow_case, &slow_case, @@ -4127,10 +4124,10 @@ void CodeGenerator::GenerateFastCharCodeAt(ZoneList* args) { __ bind(&slow_case); // Move the undefined value into the result register, which will // trigger the slow case. - __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); + __ LoadRoot(result, Heap::kUndefinedValueRootIndex); __ bind(&exit); - frame_->EmitPush(r0); + frame_->EmitPush(result); } @@ -4251,48 +4248,52 @@ void CodeGenerator::GenerateIsUndetectableObject(ZoneList* args) { void CodeGenerator::GenerateIsConstructCall(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 0); + Register scratch0 = VirtualFrame::scratch0(); + Register scratch1 = VirtualFrame::scratch1(); // Get the frame pointer for the calling frame. - __ ldr(r2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); + __ ldr(scratch0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); // Skip the arguments adaptor frame if it exists. - Label check_frame_marker; - __ ldr(r1, MemOperand(r2, StandardFrameConstants::kContextOffset)); - __ cmp(r1, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); - __ b(ne, &check_frame_marker); - __ ldr(r2, MemOperand(r2, StandardFrameConstants::kCallerFPOffset)); + __ ldr(scratch1, + MemOperand(scratch0, StandardFrameConstants::kContextOffset)); + __ cmp(scratch1, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); + __ ldr(scratch0, + MemOperand(scratch0, StandardFrameConstants::kCallerFPOffset), eq); // Check the marker in the calling frame. - __ bind(&check_frame_marker); - __ ldr(r1, MemOperand(r2, StandardFrameConstants::kMarkerOffset)); - __ cmp(r1, Operand(Smi::FromInt(StackFrame::CONSTRUCT))); + __ ldr(scratch1, + MemOperand(scratch0, StandardFrameConstants::kMarkerOffset)); + __ cmp(scratch1, Operand(Smi::FromInt(StackFrame::CONSTRUCT))); cc_reg_ = eq; } void CodeGenerator::GenerateArgumentsLength(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 0); - Label exit; - - // Get the number of formal parameters. - __ mov(r0, Operand(Smi::FromInt(scope()->num_parameters()))); + Register tos = frame_->GetTOSRegister(); + Register scratch0 = VirtualFrame::scratch0(); + Register scratch1 = VirtualFrame::scratch1(); // Check if the calling frame is an arguments adaptor frame. - __ ldr(r2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); - __ ldr(r3, MemOperand(r2, StandardFrameConstants::kContextOffset)); - __ cmp(r3, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); - __ b(ne, &exit); + __ ldr(scratch0, + MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); + __ ldr(scratch1, + MemOperand(scratch0, StandardFrameConstants::kContextOffset)); + __ cmp(scratch1, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); + + // Get the number of formal parameters. + __ mov(tos, Operand(Smi::FromInt(scope()->num_parameters())), LeaveCC, ne); // Arguments adaptor case: Read the arguments length from the // adaptor frame. - __ ldr(r0, MemOperand(r2, ArgumentsAdaptorFrameConstants::kLengthOffset)); + __ ldr(tos, + MemOperand(scratch0, ArgumentsAdaptorFrameConstants::kLengthOffset), + eq); - __ bind(&exit); - frame_->EmitPush(r0); + frame_->EmitPush(tos); } @@ -4731,15 +4732,14 @@ void CodeGenerator::GenerateMathCos(ZoneList* args) { void CodeGenerator::GenerateObjectEquals(ZoneList* args) { - VirtualFrame::SpilledScope spilled_scope(frame_); ASSERT(args->length() == 2); // Load the two objects into registers and perform the comparison. - LoadAndSpill(args->at(0)); - LoadAndSpill(args->at(1)); - frame_->EmitPop(r0); - frame_->EmitPop(r1); - __ cmp(r0, r1); + Load(args->at(0)); + Load(args->at(1)); + Register lhs = frame_->PopToRegister(); + Register rhs = frame_->PopToRegister(lhs); + __ cmp(lhs, rhs); cc_reg_ = eq; } @@ -5038,6 +5038,7 @@ void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { // after evaluating the left hand side (due to the shortcut // semantics), but the compiler must (statically) know if the result // of compiling the binary operation is materialized or not. + VirtualFrame::SpilledScope spilled_scope(frame_); if (node->op() == Token::AND) { JumpTarget is_true; LoadConditionAndSpill(node->left(), @@ -5049,8 +5050,7 @@ void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { JumpTarget pop_and_continue; JumpTarget exit; - __ ldr(r0, frame_->Top()); // Duplicate the stack top. - frame_->EmitPush(r0); + frame_->Dup(); // Avoid popping the result if it converts to 'false' using the // standard ToBoolean() conversion as described in ECMA-262, // section 9.2, page 30. @@ -5059,7 +5059,7 @@ void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { // Pop the result of evaluating the first part. pop_and_continue.Bind(); - frame_->EmitPop(r0); + frame_->Pop(); // Evaluate right side expression. is_true.Bind(); @@ -5096,8 +5096,7 @@ void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { JumpTarget pop_and_continue; JumpTarget exit; - __ ldr(r0, frame_->Top()); - frame_->EmitPush(r0); + frame_->Dup(); // Avoid popping the result if it converts to 'true' using the // standard ToBoolean() conversion as described in ECMA-262, // section 9.2, page 30. @@ -5106,7 +5105,7 @@ void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { // Pop the result of evaluating the first part. pop_and_continue.Bind(); - frame_->EmitPop(r0); + frame_->Pop(); // Evaluate right side expression. is_false.Bind(); @@ -5141,7 +5140,6 @@ void CodeGenerator::VisitBinaryOperation(BinaryOperation* node) { Comment cmnt(masm_, "[ BinaryOperation"); if (node->op() == Token::AND || node->op() == Token::OR) { - VirtualFrame::SpilledScope spilled_scope(frame_); GenerateLogicalBooleanOperation(node); } else { // Optimize for the case where (at least) one of the expressions @@ -5194,9 +5192,7 @@ void CodeGenerator::VisitThisFunction(ThisFunction* node) { #ifdef DEBUG int original_height = frame_->height(); #endif - VirtualFrame::SpilledScope spilled_scope(frame_); - __ ldr(r0, frame_->Function()); - frame_->EmitPush(r0); + frame_->EmitPush(MemOperand(frame_->Function())); ASSERT_EQ(original_height + 1, frame_->height()); } -- 2.7.4