Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index b21eec83d2bafd378a56d667d47355957d32e46d..46f60cd7f7f4d750e0ba8a740c5f3447ffd725a1 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -2161,28 +2161,30 @@ void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) { |
void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
Register receiver = ToRegister(instr->receiver()); |
+ Register function = ToRegister(instr->function()); |
Register length = ToRegister(instr->length()); |
Register elements = ToRegister(instr->elements()); |
- Register temp = ToRegister(instr->TempAt(0)); |
- ASSERT(ToRegister(instr->function()).is(edi)); |
+ Register scratch = ToRegister(instr->TempAt(0)); |
+ ASSERT(receiver.is(eax)); // Used for parameter count. |
+ ASSERT(function.is(edi)); // Required by InvokeFunction. |
ASSERT(ToRegister(instr->result()).is(eax)); |
- // If the receiver is null or undefined, we have to pass the |
- // global object as a receiver. |
- NearLabel global_receiver, receiver_ok; |
+ // If the receiver is null or undefined, we have to pass the global object |
+ // as a receiver. |
+ NearLabel global_object, receiver_ok; |
__ cmp(receiver, Factory::null_value()); |
- __ j(equal, &global_receiver); |
+ __ j(equal, &global_object); |
__ cmp(receiver, Factory::undefined_value()); |
- __ j(equal, &global_receiver); |
+ __ j(equal, &global_object); |
// The receiver should be a JS object. |
__ test(receiver, Immediate(kSmiTagMask)); |
DeoptimizeIf(equal, instr->environment()); |
- __ CmpObjectType(receiver, FIRST_JS_OBJECT_TYPE, temp); |
+ __ CmpObjectType(receiver, FIRST_JS_OBJECT_TYPE, scratch); |
DeoptimizeIf(below, instr->environment()); |
__ jmp(&receiver_ok); |
- __ bind(&global_receiver); |
+ __ bind(&global_object); |
// TODO(kmillikin): We have a hydrogen value for the global object. See |
// if it's better to use it than to explicitly fetch it from the context |
// here. |
@@ -2190,8 +2192,6 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
__ mov(receiver, ContextOperand(receiver, Context::GLOBAL_INDEX)); |
__ bind(&receiver_ok); |
- Label invoke; |
- |
// Copy the arguments to this function possibly from the |
// adaptor frame below it. |
const uint32_t kArgumentsLimit = 1 * KB; |
@@ -2203,7 +2203,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
// Loop through the arguments pushing them onto the execution |
// stack. |
- Label loop; |
+ Label invoke, loop; |
fschneider
2011/02/11 10:04:03
NearLabels?
Kevin Millikin (Chromium)
2011/02/11 11:22:16
Yes, good catch.
|
// length is a small non-negative integer, due to the test above. |
__ test(length, Operand(length)); |
__ j(zero, &invoke); |
@@ -2222,9 +2222,8 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { |
SafepointGenerator safepoint_generator(this, |
pointers, |
env->deoptimization_index()); |
- ASSERT(receiver.is(eax)); |
v8::internal::ParameterCount actual(eax); |
- __ InvokeFunction(edi, actual, CALL_FUNCTION, &safepoint_generator); |
+ __ InvokeFunction(function, actual, CALL_FUNCTION, &safepoint_generator); |
} |