Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: src/x64/macro-assembler-x64.h

Issue 21123008: Introduce StackArgumentsAccessor class for X64 (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Introduce StackArguments class Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698