Chromium Code Reviews| 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); |
| } |