Index: src/x64/builtins-x64.cc |
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc |
index 1fea61ef53a1c2ca9be38a7bc28e91523c99b6a7..45385bfefd77c9a41645a0565b0bf7afc042a3ea 100644 |
--- a/src/x64/builtins-x64.cc |
+++ b/src/x64/builtins-x64.cc |
@@ -61,8 +61,7 @@ static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { |
// Preserve the number of arguments on the stack. Must preserve both |
// rax and rbx because these registers are used when copying the |
// arguments and the receiver. |
- ASSERT(kSmiTagSize == 1); |
- __ lea(rcx, Operand(rax, rax, times_1, kSmiTag)); |
+ __ Integer32ToSmi(rcx, rax); |
__ push(rcx); |
} |
@@ -77,10 +76,13 @@ static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { |
// Remove caller arguments from the stack. |
// rbx holds a Smi, so we convery to dword offset by multiplying by 4. |
+ // TODO(smi): Find a way to abstract indexing by a smi. |
ASSERT_EQ(kSmiTagSize, 1 && kSmiTag == 0); |
ASSERT_EQ(kPointerSize, (1 << kSmiTagSize) * 4); |
+ // TODO(smi): Find way to abstract indexing by a smi. |
__ pop(rcx); |
- __ lea(rsp, Operand(rsp, rbx, times_4, 1 * kPointerSize)); // 1 ~ receiver |
+ // 1 * kPointerSize is offset of receiver. |
+ __ lea(rsp, Operand(rsp, rbx, times_half_pointer_size, 1 * kPointerSize)); |
__ push(rcx); |
} |
@@ -192,8 +194,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
{ Label done, non_function, function; |
// The function to call is at position n+1 on the stack. |
__ movq(rdi, Operand(rsp, rax, times_pointer_size, +1 * kPointerSize)); |
- __ testl(rdi, Immediate(kSmiTagMask)); |
- __ j(zero, &non_function); |
+ __ JumpIfSmi(rdi, &non_function); |
__ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); |
__ j(equal, &function); |
@@ -213,8 +214,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
{ Label call_to_object, use_global_receiver, patch_receiver, done; |
__ movq(rbx, Operand(rsp, rax, times_pointer_size, 0)); |
- __ testl(rbx, Immediate(kSmiTagMask)); |
- __ j(zero, &call_to_object); |
+ __ JumpIfSmi(rbx, &call_to_object); |
__ CompareRoot(rbx, Heap::kNullValueRootIndex); |
__ j(equal, &use_global_receiver); |
@@ -230,8 +230,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
__ EnterInternalFrame(); // preserves rax, rbx, rdi |
// Store the arguments count on the stack (smi tagged). |
- ASSERT(kSmiTag == 0); |
- __ shl(rax, Immediate(kSmiTagSize)); |
+ __ Integer32ToSmi(rax, rax); |
__ push(rax); |
__ push(rdi); // save edi across the call |
@@ -242,7 +241,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
// Get the arguments count and untag it. |
__ pop(rax); |
- __ shr(rax, Immediate(kSmiTagSize)); |
+ __ SmiToInteger32(rax, rax); |
__ LeaveInternalFrame(); |
__ jmp(&patch_receiver); |
@@ -356,7 +355,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
// Make rdx the space we need for the array when it is unrolled onto the |
// stack. |
__ movq(rdx, rax); |
- __ shl(rdx, Immediate(kPointerSizeLog2 - kSmiTagSize)); |
+ __ PositiveSmiTimesPowerOfTwoToInteger64(rdx, rdx, kPointerSizeLog2); |
William Hesse
2009/09/10 11:13:22
Does this assume that the smi is zero-extended? I
Lasse Reichstein
2009/09/10 12:28:11
It should not assume anything except that rdx cont
Lasse Reichstein
2009/09/10 12:45:35
Ah, you were referring to the implementation. That
|
__ cmpq(rcx, rdx); |
__ j(greater, &okay); |
@@ -382,8 +381,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
// Compute the receiver. |
Label call_to_object, use_global_receiver, push_receiver; |
__ movq(rbx, Operand(rbp, kReceiverOffset)); |
- __ testl(rbx, Immediate(kSmiTagMask)); |
- __ j(zero, &call_to_object); |
+ __ JumpIfSmi(rbx, &call_to_object); |
__ CompareRoot(rbx, Heap::kNullValueRootIndex); |
__ j(equal, &use_global_receiver); |
__ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); |
@@ -446,7 +444,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
// Invoke the function. |
ParameterCount actual(rax); |
- __ shr(rax, Immediate(kSmiTagSize)); |
+ __ SmiToInteger32(rax, rax); |
__ movq(rdi, Operand(rbp, kFunctionOffset)); |
__ InvokeFunction(rdi, actual, CALL_FUNCTION); |
@@ -463,8 +461,7 @@ void Builtins::Generate_JSConstructCall(MacroAssembler* masm) { |
Label non_function_call; |
// Check that function is not a smi. |
- __ testl(rdi, Immediate(kSmiTagMask)); |
- __ j(zero, &non_function_call); |
+ __ JumpIfSmi(rdi, &non_function_call); |
// Check that function is a JSFunction. |
__ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); |
__ j(not_equal, &non_function_call); |
@@ -492,7 +489,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
__ EnterConstructFrame(); |
// Store a smi-tagged arguments count on the stack. |
- __ shl(rax, Immediate(kSmiTagSize)); |
+ __ Integer32ToSmi(rax, rax); |
__ push(rax); |
// Push the function to invoke on the stack. |
@@ -517,8 +514,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
// rdi: constructor |
__ movq(rax, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
// Will both indicate a NULL and a Smi |
- __ testl(rax, Immediate(kSmiTagMask)); |
- __ j(zero, &rt_call); |
+ __ JumpIfSmi(rax, &rt_call); |
// rdi: constructor |
// rax: initial map (if proven valid below) |
__ CmpObjectType(rax, MAP_TYPE, rbx); |
@@ -668,7 +664,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
// Retrieve smi-tagged arguments count from the stack. |
__ movq(rax, Operand(rsp, 0)); |
- __ shr(rax, Immediate(kSmiTagSize)); |
+ __ SmiToInteger32(rax, rax); |
// Push the allocated receiver to the stack. We need two copies |
// because we may have to return the original one and the calling |
@@ -701,8 +697,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
// on page 74. |
Label use_receiver, exit; |
// If the result is a smi, it is *not* an object in the ECMA sense. |
- __ testl(rax, Immediate(kSmiTagMask)); |
- __ j(zero, &use_receiver); |
+ __ JumpIfSmi(rax, &use_receiver); |
// If the type of the result (stored in its map) is less than |
// FIRST_JS_OBJECT_TYPE, it is not an object in the ECMA sense. |
@@ -721,8 +716,10 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
// Remove caller arguments from the stack and return. |
ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
+ // TODO(smi): Find a way to abstract indexing by a smi. |
__ pop(rcx); |
- __ lea(rsp, Operand(rsp, rbx, times_4, 1 * kPointerSize)); // 1 ~ receiver |
+ // 1 * kPointerSize is offset of receiver. |
+ __ lea(rsp, Operand(rsp, rbx, times_half_pointer_size, 1 * kPointerSize)); |
__ push(rcx); |
__ IncrementCounter(&Counters::constructed_objects, 1); |
__ ret(0); |