summaryrefslogtreecommitdiff
path: root/deps/v8/src/wasm/wasm-linkage.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/wasm/wasm-linkage.h')
-rw-r--r--deps/v8/src/wasm/wasm-linkage.h41
1 files changed, 22 insertions, 19 deletions
diff --git a/deps/v8/src/wasm/wasm-linkage.h b/deps/v8/src/wasm/wasm-linkage.h
index 92390cc556..6f022207bf 100644
--- a/deps/v8/src/wasm/wasm-linkage.h
+++ b/deps/v8/src/wasm/wasm-linkage.h
@@ -40,6 +40,7 @@ constexpr DoubleRegister kFpReturnRegisters[] = {xmm1, xmm2};
// ===========================================================================
constexpr Register kGpParamRegisters[] = {r3, r0, r1, r2};
constexpr Register kGpReturnRegisters[] = {r0, r1};
+// ARM d-registers must be in ascending order for correct allocation.
constexpr DoubleRegister kFpParamRegisters[] = {d0, d1, d2, d3, d4, d5, d6, d7};
constexpr DoubleRegister kFpReturnRegisters[] = {d0, d1};
@@ -129,9 +130,11 @@ class LinkageAllocator {
#if V8_TARGET_ARCH_ARM
switch (rep) {
case MachineRepresentation::kFloat32:
- return extra_float_reg >= 0 || fp_offset_ < fp_count_;
+ return extra_float_reg_ >= 0 ||
+ (extra_double_reg_ >= 0 && extra_double_reg_ < 16) ||
+ (fp_offset_ < fp_count_ && fp_regs_[fp_offset_].code() < 16);
case MachineRepresentation::kFloat64:
- return extra_double_reg >= 0 || fp_offset_ < fp_count_;
+ return extra_double_reg_ >= 0 || fp_offset_ < fp_count_;
case MachineRepresentation::kSimd128:
return ((fp_offset_ + 1) & ~1) + 1 < fp_count_;
default:
@@ -151,10 +154,10 @@ class LinkageAllocator {
#if V8_TARGET_ARCH_ARM
switch (rep) {
case MachineRepresentation::kFloat32: {
- // Use the extra S-register if we can.
- if (extra_float_reg >= 0) {
- int reg_code = extra_float_reg;
- extra_float_reg = -1;
+ // Use the extra S-register if there is one.
+ if (extra_float_reg_ >= 0) {
+ int reg_code = extra_float_reg_;
+ extra_float_reg_ = -1;
return reg_code;
}
// Allocate a D-register and split into 2 float registers.
@@ -162,15 +165,15 @@ class LinkageAllocator {
DCHECK_GT(16, d_reg_code); // D-registers 16 - 31 can't split.
int reg_code = d_reg_code * 2;
// Save the extra S-register.
- DCHECK_EQ(-1, extra_float_reg);
- extra_float_reg = reg_code + 1;
+ DCHECK_EQ(-1, extra_float_reg_);
+ extra_float_reg_ = reg_code + 1;
return reg_code;
}
case MachineRepresentation::kFloat64: {
- // Use an extra D-register if we can.
- if (extra_double_reg >= 0) {
- int reg_code = extra_double_reg;
- extra_double_reg = -1;
+ // Use the extra D-register if there is one.
+ if (extra_double_reg_ >= 0) {
+ int reg_code = extra_double_reg_;
+ extra_double_reg_ = -1;
return reg_code;
}
DCHECK_LT(fp_offset_, fp_count_);
@@ -178,16 +181,16 @@ class LinkageAllocator {
}
case MachineRepresentation::kSimd128: {
// Q-register must be an even-odd pair, so we must try to allocate at
- // the end, not using extra_double_reg. If we are at an odd D-register,
- // skip past it (saving it to extra_double_reg).
+ // the end, not using extra_double_reg_. If we are at an odd D-register,
+ // skip past it (saving it to extra_double_reg_).
DCHECK_LT(((fp_offset_ + 1) & ~1) + 1, fp_count_);
int d_reg1_code = fp_regs_[fp_offset_++].code();
if (d_reg1_code % 2 != 0) {
- // If we're misaligned then extra_double_reg must have been consumed.
- DCHECK_EQ(-1, extra_double_reg);
+ // If we're misaligned then extra_double_reg_ must have been consumed.
+ DCHECK_EQ(-1, extra_double_reg_);
int odd_double_reg = d_reg1_code;
d_reg1_code = fp_regs_[fp_offset_++].code();
- extra_double_reg = odd_double_reg;
+ extra_double_reg_ = odd_double_reg;
}
// Combine the current D-register with the next to form a Q-register.
int d_reg2_code = fp_regs_[fp_offset_++].code();
@@ -244,8 +247,8 @@ class LinkageAllocator {
// ARM FP register aliasing may require splitting or merging double registers.
// Track fragments of registers below fp_offset_ here. There can only be one
// extra float and double register.
- int extra_float_reg = -1;
- int extra_double_reg = -1;
+ int extra_float_reg_ = -1;
+ int extra_double_reg_ = -1;
#endif
int stack_offset_ = 0;