5 #ifndef V8_WASM_WASM_LINKAGE_H_ 6 #define V8_WASM_WASM_LINKAGE_H_ 8 #include "src/assembler-arch.h" 9 #include "src/machine-type.h" 10 #include "src/signature.h" 11 #include "src/wasm/value-type.h" 21 #if V8_TARGET_ARCH_IA32 25 constexpr Register kGpParamRegisters[] = {esi, eax, edx, ecx};
26 constexpr Register kGpReturnRegisters[] = {eax, edx};
27 constexpr DoubleRegister kFpParamRegisters[] = {xmm1, xmm2, xmm3,
29 constexpr DoubleRegister kFpReturnRegisters[] = {xmm1, xmm2};
31 #elif V8_TARGET_ARCH_X64 35 constexpr Register kGpParamRegisters[] = {rsi, rax, rdx, rcx, rbx, r9};
36 constexpr Register kGpReturnRegisters[] = {rax, rdx};
37 constexpr DoubleRegister kFpParamRegisters[] = {xmm1, xmm2, xmm3,
39 constexpr DoubleRegister kFpReturnRegisters[] = {xmm1, xmm2};
41 #elif V8_TARGET_ARCH_ARM 45 constexpr Register kGpParamRegisters[] = {r3, r0, r2, r6};
46 constexpr Register kGpReturnRegisters[] = {r0, r1};
48 constexpr DoubleRegister kFpParamRegisters[] = {d0, d1, d2, d3, d4, d5, d6, d7};
49 constexpr DoubleRegister kFpReturnRegisters[] = {d0, d1};
51 #elif V8_TARGET_ARCH_ARM64 55 constexpr Register kGpParamRegisters[] = {x7, x0, x2, x3, x4, x5, x6};
56 constexpr Register kGpReturnRegisters[] = {x0, x1};
57 constexpr DoubleRegister kFpParamRegisters[] = {d0, d1, d2, d3, d4, d5, d6, d7};
58 constexpr DoubleRegister kFpReturnRegisters[] = {d0, d1};
60 #elif V8_TARGET_ARCH_MIPS 64 constexpr Register kGpParamRegisters[] = {a0, a2, a3};
65 constexpr Register kGpReturnRegisters[] = {v0, v1};
66 constexpr DoubleRegister kFpParamRegisters[] = {f2, f4, f6, f8, f10, f12, f14};
67 constexpr DoubleRegister kFpReturnRegisters[] = {f2, f4};
69 #elif V8_TARGET_ARCH_MIPS64 73 constexpr Register kGpParamRegisters[] = {a0, a2, a3, a4, a5, a6, a7};
74 constexpr Register kGpReturnRegisters[] = {v0, v1};
75 constexpr DoubleRegister kFpParamRegisters[] = {f2, f4, f6, f8, f10, f12, f14};
76 constexpr DoubleRegister kFpReturnRegisters[] = {f2, f4};
78 #elif V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 82 constexpr Register kGpParamRegisters[] = {r10, r3, r5, r6, r7, r8, r9};
83 constexpr Register kGpReturnRegisters[] = {r3, r4};
84 constexpr DoubleRegister kFpParamRegisters[] = {d1, d2, d3, d4, d5, d6, d7, d8};
85 constexpr DoubleRegister kFpReturnRegisters[] = {d1, d2};
87 #elif V8_TARGET_ARCH_S390X 91 constexpr Register kGpParamRegisters[] = {r6, r2, r4, r5};
92 constexpr Register kGpReturnRegisters[] = {r2, r3};
93 constexpr DoubleRegister kFpParamRegisters[] = {d0, d2, d4, d6};
94 constexpr DoubleRegister kFpReturnRegisters[] = {d0, d2, d4, d6};
96 #elif V8_TARGET_ARCH_S390 100 constexpr Register kGpParamRegisters[] = {r6, r2, r4, r5};
101 constexpr Register kGpReturnRegisters[] = {r2, r3};
102 constexpr DoubleRegister kFpParamRegisters[] = {d0, d2};
103 constexpr DoubleRegister kFpReturnRegisters[] = {d0, d2};
110 constexpr Register kGpParamRegisters[] = {};
111 constexpr Register kGpReturnRegisters[] = {};
112 constexpr DoubleRegister kFpParamRegisters[] = {};
113 constexpr DoubleRegister kFpReturnRegisters[] = {};
119 constexpr
int kWasmInstanceParameterIndex = 0;
123 template <
size_t kNumGpRegs,
size_t kNumFpRegs>
130 : gp_count_(gpc), gp_regs_(gp), fp_count_(fpc), fp_regs_(fp) {}
132 bool CanAllocateGP()
const {
return gp_offset_ < gp_count_; }
133 bool CanAllocateFP(MachineRepresentation rep)
const {
134 #if V8_TARGET_ARCH_ARM 136 case MachineRepresentation::kFloat32:
137 return fp_offset_ < fp_count_ && fp_regs_[fp_offset_].code() < 16;
138 case MachineRepresentation::kFloat64:
139 return extra_double_reg_ >= 0 || fp_offset_ < fp_count_;
140 case MachineRepresentation::kSimd128:
141 return ((fp_offset_ + 1) & ~1) + 1 < fp_count_;
147 return fp_offset_ < fp_count_;
151 DCHECK_LT(gp_offset_, gp_count_);
152 return gp_regs_[gp_offset_++].code();
155 int NextFpReg(MachineRepresentation rep) {
156 #if V8_TARGET_ARCH_ARM 158 case MachineRepresentation::kFloat32: {
162 int d_reg_code = NextFpReg(MachineRepresentation::kFloat64);
163 DCHECK_GT(16, d_reg_code);
164 return d_reg_code * 2;
166 case MachineRepresentation::kFloat64: {
168 if (extra_double_reg_ >= 0) {
169 int reg_code = extra_double_reg_;
170 extra_double_reg_ = -1;
173 DCHECK_LT(fp_offset_, fp_count_);
174 return fp_regs_[fp_offset_++].code();
176 case MachineRepresentation::kSimd128: {
180 DCHECK_LT(((fp_offset_ + 1) & ~1) + 1, fp_count_);
181 int d_reg1_code = fp_regs_[fp_offset_++].code();
182 if (d_reg1_code % 2 != 0) {
184 DCHECK_EQ(-1, extra_double_reg_);
185 int odd_double_reg = d_reg1_code;
186 d_reg1_code = fp_regs_[fp_offset_++].code();
187 extra_double_reg_ = odd_double_reg;
190 int d_reg2_code = fp_regs_[fp_offset_++].code();
191 DCHECK_EQ(0, d_reg1_code % 2);
192 DCHECK_EQ(d_reg1_code + 1, d_reg2_code);
194 return d_reg1_code / 2;
200 DCHECK_LT(fp_offset_, fp_count_);
201 return fp_regs_[fp_offset_++].code();
207 int NumStackSlots(MachineRepresentation
type) {
208 return std::max(1, ElementSizeInBytes(
type) / kPointerSize);
214 int NextStackSlot(MachineRepresentation
type) {
215 int num_stack_slots = NumStackSlots(
type);
216 int offset = stack_offset_;
217 stack_offset_ += num_stack_slots;
223 void SetStackOffset(
int num) {
225 DCHECK_EQ(0, stack_offset_);
229 int NumStackSlots()
const {
return stack_offset_; }
240 #if V8_TARGET_ARCH_ARM 243 int extra_double_reg_ = -1;
246 int stack_offset_ = 0;
253 #endif // V8_WASM_WASM_LINKAGE_H_