Chromium Code Reviews| Index: src/x64/macro-assembler-x64.h |
| diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h |
| index e611c8ae27999a9520d0aa07bfa050b51a0bb831..d2b066e4b1e3d0ae4de38c62ad79a77a346d06c1 100644 |
| --- a/src/x64/macro-assembler-x64.h |
| +++ b/src/x64/macro-assembler-x64.h |
| @@ -1479,6 +1479,60 @@ class CodePatcher { |
| }; |
| +class StackArguments BASE_EMBEDDED { |
|
danno
2013/08/05 15:17:56
I would call this StackArgumentsAccessor
haitao.feng
2013/08/06 11:49:55
Done.
|
| + public: |
| + // argc could be an immediate or in a register. |
| + // extra is 1 when the receiver is considered as argument[0]. |
| + // disp is the displacement between rsp and return address. |
| + StackArguments(int immediate, int extra = 0, int disp = 0) |
| + : reg_(no_reg), immediate_(immediate), extra_(extra), disp_(disp) { } |
| + |
| + StackArguments(Register reg, int extra = 0, int disp = 0) |
|
danno
2013/08/05 15:17:56
I find all the math with extra and disp a bit conf
haitao.feng
2013/08/06 11:49:55
Done.
|
| + : reg_(reg), immediate_(0), extra_(extra), disp_(disp) { } |
| + |
| + StackArguments(const ParameterCount& parameter_count, |
| + int extra = 0, |
| + int disp = 0) |
| + : reg_(parameter_count.is_reg() ? parameter_count.reg() : no_reg), |
| + immediate_(parameter_count.is_immediate() ? |
| + parameter_count.immediate() : 0), |
| + extra_(extra), |
| + disp_(disp) { } |
| + |
| + Operand operator[] (int index) { |
|
danno
2013/08/05 15:17:56
I think it's better to not overide the [] operator
haitao.feng
2013/08/06 11:49:55
Done.
|
| + if (index >= 0) { |
| + if (reg_.is(no_reg)) { |
| + // argument[0] is at rsp + disp + kPCOnSackSize + |
| + // (immediate_ + extra_ - 1) * kPointerSize. |
| + ASSERT(immediate_ + extra_ > 0); |
| + return Operand(rsp, disp_ + kPCOnStackSize + |
| + (immediate_ + extra_ - 1 - index) * kPointerSize); |
| + } else { |
| + // argument[0] is at rsp + disp + kPCOnSackSize + |
| + // reg_ * times_pointer_size + (extra_ - 1) * kPointerSize. |
| + return Operand(rsp, reg_, times_pointer_size, disp_ + kPCOnStackSize + |
| + (extra_ - 1 - index) * kPointerSize); |
| + } |
| + } else { |
|
danno
2013/08/05 15:17:56
I think the handling of negative arguments is pret
haitao.feng
2013/08/06 11:49:55
Done.
|
| + // Reverse order, argument[-1] is at rsp + disp + kPCOnSackSize. |
| + ASSERT(reg_.is(no_reg) || (-index <= immediate_)); |
| + return Operand(rsp, disp_ + kPCOnStackSize + (-index - 1) * kPointerSize); |
| + } |
| + } |
| + |
| + Operand GetReceiver() { |
|
danno
2013/08/05 15:17:56
... and this GetReceiverOperand()
haitao.feng
2013/08/06 11:49:55
Done.
|
| + ASSERT(extra_ == 1); |
| + return (*this)[0]; |
| + } |
| + |
| + private: |
| + const Register reg_; |
| + const int immediate_; |
| + const int extra_; |
| + const int disp_; |
| +}; |
| + |
| + |
| // ----------------------------------------------------------------------------- |
| // Static helper functions. |
| @@ -1523,6 +1577,41 @@ inline Operand StackOperandForReturnAddress(int32_t disp) { |
| } |
| +// Computes the argument address from the argument 0 (might be receiver) |
|
danno
2013/08/05 15:17:56
Do you need any of these here and below any more?
haitao.feng
2013/08/06 11:49:55
Done. Sorry, I remembered I removed all of them. M
|
| +// at rsp + disp + kPCOnStackSize + (total - 1) * kPointerSize, disp is the |
| +// displacement between the rsp and the return address. |
| +inline Operand StackOperandForArgument(int index, int total, int disp = 0) { |
| + return Operand(rsp, disp + kPCOnStackSize + |
| + (total - 1 - index) * kPointerSize); |
| +} |
| + |
| + |
| +// Computes the argument address in reverse order, i.e., from the last argument |
| +// at rsp + disp + kPCOnStackSize, disp is the displacement between the rsp |
| +// and the return address. |
| +inline Operand StackOperandForReversedArgument(int index, int disp = 0) { |
| + return Operand(rsp, disp + kPCOnStackSize + index * kPointerSize); |
| +} |
| + |
| + |
| +inline Operand StackOperandForReversedArgument(Register index, |
| + int offset, |
| + int disp = 0) { |
| + return Operand(rsp, index, times_pointer_size, |
| + disp + kPCOnStackSize + offset * kPointerSize); |
| +} |
| + |
| + |
| +inline Operand StackOperandForReceiver(int index, int disp = 0) { |
| + return StackOperandForReversedArgument(index, disp); |
| +} |
| + |
| + |
| +inline Operand StackOperandForReceiver(Register index, int disp = 0) { |
| + return StackOperandForReversedArgument(index, 0, disp); |
| +} |
| + |
| + |
| #ifdef GENERATED_CODE_COVERAGE |
| extern void LogGeneratedCodeCoverage(const char* file_line); |
| #define CODE_COVERAGE_STRINGIFY(x) #x |