Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 83d01a6a565e927b9bc91ffa07438c91ae86d3ff..1c051e220bf90a19103bd12e4fd6ef5cc8b707b1 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -1979,11 +1979,6 @@ void StoreArrayLengthStub::Generate(MacroAssembler* masm) { |
void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
// The key is in rdx and the parameter count is in rax. |
- // The displacement is used for skipping the frame pointer on the |
- // stack. It is the offset of the last parameter (if any) relative |
- // to the frame pointer. |
- static const int kDisplacement = 1 * kPointerSize; |
- |
// Check that the key is a smi. |
Label slow; |
__ JumpIfNotSmi(rdx, &slow); |
@@ -2005,10 +2000,10 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
__ j(above_equal, &slow); |
// Read the argument from the stack and return it. |
- SmiIndex index = masm->SmiToIndex(rax, rax, kPointerSizeLog2); |
- __ lea(rbx, Operand(rbp, index.reg, index.scale, 0)); |
- index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); |
- __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); |
+ __ SmiSub(rax, rax, rdx); |
+ __ SmiToInteger32(rax, rax); |
+ StackArgumentsAccessor args(rbp, rax, ARGUMENTS_DONT_CONTAIN_RECEIVER); |
+ __ movq(rax, args.GetArgumentOperand(0)); |
__ Ret(); |
// Arguments adaptor case: Check index against actual arguments |
@@ -2020,10 +2015,11 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
__ j(above_equal, &slow); |
// Read the argument from the stack and return it. |
- index = masm->SmiToIndex(rax, rcx, kPointerSizeLog2); |
- __ lea(rbx, Operand(rbx, index.reg, index.scale, 0)); |
- index = masm->SmiToNegativeIndex(rdx, rdx, kPointerSizeLog2); |
- __ movq(rax, Operand(rbx, index.reg, index.scale, kDisplacement)); |
+ __ SmiSub(rcx, rcx, rdx); |
+ __ SmiToInteger32(rcx, rcx); |
+ StackArgumentsAccessor adaptor_args(rbx, rcx, |
+ ARGUMENTS_DONT_CONTAIN_RECEIVER); |
+ __ movq(rax, adaptor_args.GetArgumentOperand(0)); |
__ Ret(); |
// Slow-case: Handle non-smi or out-of-bounds access to arguments |
@@ -2397,10 +2393,11 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// rsp[24] : subject string |
// rsp[32] : JSRegExp object |
- static const int kLastMatchInfoOffset = 1 * kPointerSize; |
- static const int kPreviousIndexOffset = 2 * kPointerSize; |
- static const int kSubjectOffset = 3 * kPointerSize; |
- static const int kJSRegExpOffset = 4 * kPointerSize; |
+ StackArgumentsAccessor args(rsp, 4, ARGUMENTS_DONT_CONTAIN_RECEIVER); |
danno
2013/09/18 12:08:42
Since you are going through all the trouble to cle
haitao.feng
2013/09/22 08:16:00
Done.
|
+ Operand StackOperandForJSRegExpObject = args.GetArgumentOperand(0); |
danno
2013/09/18 12:08:42
nit: these variable names should start with a lowe
haitao.feng
2013/09/22 08:16:00
Removed these variables.
On 2013/09/18 12:08:42, d
|
+ Operand StackOperandForSubjectString = args.GetArgumentOperand(1); |
+ Operand StackOperandForPreviousIndex = args.GetArgumentOperand(2); |
+ Operand StackOperandForLastMatchInfo = args.GetArgumentOperand(3); |
Label runtime; |
// Ensure that a RegExp stack is allocated. |
@@ -2414,7 +2411,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
__ j(zero, &runtime); |
// Check that the first argument is a JSRegExp object. |
- __ movq(rax, Operand(rsp, kJSRegExpOffset)); |
+ __ movq(rax, StackOperandForJSRegExpObject); |
__ JumpIfSmi(rax, &runtime); |
__ CmpObjectType(rax, JS_REGEXP_TYPE, kScratchRegister); |
__ j(not_equal, &runtime); |
@@ -2447,7 +2444,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// Reset offset for possibly sliced string. |
__ Set(r14, 0); |
- __ movq(rdi, Operand(rsp, kSubjectOffset)); |
+ __ movq(rdi, StackOperandForSubjectString); |
__ JumpIfSmi(rdi, &runtime); |
__ movq(r15, rdi); // Make a copy of the original subject string. |
__ movq(rbx, FieldOperand(rdi, HeapObject::kMapOffset)); |
@@ -2549,7 +2546,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// We have to use r15 instead of rdi to load the length because rdi might |
// have been only made to look like a sequential string when it actually |
// is an external string. |
- __ movq(rbx, Operand(rsp, kPreviousIndexOffset)); |
+ __ movq(rbx, StackOperandForPreviousIndex); |
__ JumpIfNotSmi(rbx, &runtime); |
__ SmiCompare(rbx, FieldOperand(r15, String::kLengthOffset)); |
__ j(above_equal, &runtime); |
@@ -2673,7 +2670,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// Load RegExp data. |
__ bind(&success); |
- __ movq(rax, Operand(rsp, kJSRegExpOffset)); |
+ __ movq(rax, StackOperandForJSRegExpObject); |
__ movq(rcx, FieldOperand(rax, JSRegExp::kDataOffset)); |
__ SmiToInteger32(rax, |
FieldOperand(rcx, JSRegExp::kIrregexpCaptureCountOffset)); |
@@ -2682,7 +2679,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
// rdx: Number of capture registers |
// Check that the fourth object is a JSArray object. |
- __ movq(r15, Operand(rsp, kLastMatchInfoOffset)); |
+ __ movq(r15, StackOperandForLastMatchInfo); |
__ JumpIfSmi(r15, &runtime); |
__ CmpObjectType(r15, JS_ARRAY_TYPE, kScratchRegister); |
__ j(not_equal, &runtime); |
@@ -2706,7 +2703,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
__ movq(FieldOperand(rbx, RegExpImpl::kLastCaptureCountOffset), |
kScratchRegister); |
// Store last subject and last input. |
- __ movq(rax, Operand(rsp, kSubjectOffset)); |
+ __ movq(rax, StackOperandForSubjectString); |
__ movq(FieldOperand(rbx, RegExpImpl::kLastSubjectOffset), rax); |
__ movq(rcx, rax); |
__ RecordWriteField(rbx, |
@@ -4951,13 +4948,10 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
// rsp[16] : from |
// rsp[24] : string |
- const int kToOffset = 1 * kPointerSize; |
- const int kFromOffset = kToOffset + kPointerSize; |
- const int kStringOffset = kFromOffset + kPointerSize; |
- const int kArgumentsSize = (kStringOffset + kPointerSize) - kToOffset; |
+ StackArgumentsAccessor args(rsp, 3, ARGUMENTS_DONT_CONTAIN_RECEIVER); |
danno
2013/09/18 12:08:42
See comment above about using constants.
haitao.feng
2013/09/22 08:16:00
Done.
|
// Make sure first argument is a string. |
- __ movq(rax, Operand(rsp, kStringOffset)); |
+ __ movq(rax, args.GetArgumentOperand(0)); |
STATIC_ASSERT(kSmiTag == 0); |
__ testl(rax, Immediate(kSmiTagMask)); |
__ j(zero, &runtime); |
@@ -4967,8 +4961,8 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
// rax: string |
// rbx: instance type |
// Calculate length of sub string using the smi values. |
- __ movq(rcx, Operand(rsp, kToOffset)); |
- __ movq(rdx, Operand(rsp, kFromOffset)); |
+ __ movq(rcx, args.GetArgumentOperand(2)); |
+ __ movq(rdx, args.GetArgumentOperand(1)); |
__ JumpUnlessBothNonNegativeSmi(rcx, rdx, &runtime); |
__ SmiSub(rcx, rcx, rdx); // Overflow doesn't happen. |
@@ -4981,7 +4975,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
// Return original string. |
Counters* counters = masm->isolate()->counters(); |
__ IncrementCounter(counters->sub_string_native(), 1); |
- __ ret(kArgumentsSize); |
+ __ ret(3 * kPointerSize); |
danno
2013/09/18 12:08:42
You can use the argument count instead of a magic
haitao.feng
2013/09/22 08:16:00
Done.
|
__ bind(¬_original_string); |
Label single_char; |
@@ -5064,7 +5058,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
__ movq(FieldOperand(rax, SlicedString::kParentOffset), rdi); |
__ movq(FieldOperand(rax, SlicedString::kOffsetOffset), rdx); |
__ IncrementCounter(counters->sub_string_native(), 1); |
- __ ret(kArgumentsSize); |
+ __ ret(3 * kPointerSize); |
__ bind(©_routine); |
} |
@@ -5118,7 +5112,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
StringHelper::GenerateCopyCharactersREP(masm, rdi, rsi, rcx, true); |
__ movq(rsi, r14); // Restore rsi. |
__ IncrementCounter(counters->sub_string_native(), 1); |
- __ ret(kArgumentsSize); |
+ __ ret(3 * kPointerSize); |
__ bind(&two_byte_sequential); |
// Allocate the result. |
@@ -5143,7 +5137,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
StringHelper::GenerateCopyCharactersREP(masm, rdi, rsi, rcx, false); |
__ movq(rsi, r14); // Restore esi. |
__ IncrementCounter(counters->sub_string_native(), 1); |
- __ ret(kArgumentsSize); |
+ __ ret(3 * kPointerSize); |
// Just jump to runtime to create the sub string. |
__ bind(&runtime); |
@@ -5157,7 +5151,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { |
StringCharAtGenerator generator( |
rax, rdx, rcx, rax, &runtime, &runtime, &runtime, STRING_INDEX_IS_NUMBER); |
generator.GenerateFast(masm); |
- __ ret(kArgumentsSize); |
+ __ ret(3 * kPointerSize); |
generator.SkipSlow(masm, &runtime); |
} |