Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (291744 => 291745)
--- trunk/Source/_javascript_Core/ChangeLog 2022-03-23 13:54:42 UTC (rev 291744)
+++ trunk/Source/_javascript_Core/ChangeLog 2022-03-23 14:12:54 UTC (rev 291745)
@@ -1,3 +1,23 @@
+2022-03-23 Xan Lopez <[email protected]>
+
+ [JSC] Add DoNotHaveTagRegisters mode to unboxDouble
+ https://bugs.webkit.org/show_bug.cgi?id=238018
+
+ Reviewed by Yusuke Suzuki.
+
+ Wasm cannot use unboxDouble as-is because
+ GPRInfo::numberTagRegister is not available. Add a
+ DoNotHaveTagRegister mode so we can get rid of some duplicated
+ code.
+
+ * assembler/MacroAssembler.h:
+ (JSC::MacroAssembler::add64):
+ * jit/AssemblyHelpers.h:
+ (JSC::AssemblyHelpers::unboxDoubleWithoutAssertions):
+ (JSC::AssemblyHelpers::unboxDouble):
+ * wasm/js/WasmToJS.cpp:
+ (JSC::Wasm::wasmToJS):
+
2022-03-22 Yusuke Suzuki <[email protected]>
[JSC] Test DFG / FTL DataIC
Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (291744 => 291745)
--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2022-03-23 13:54:42 UTC (rev 291744)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2022-03-23 14:12:54 UTC (rev 291745)
@@ -153,6 +153,7 @@
using MacroAssemblerBase::xor32;
#if CPU(ARM64) || CPU(X86_64) || CPU(RISCV64)
+ using MacroAssemblerBase::add64;
using MacroAssemblerBase::and64;
using MacroAssemblerBase::convertInt32ToDouble;
using MacroAssemblerBase::store64;
@@ -1460,6 +1461,12 @@
and64(imm.asTrustedImm32(), dest);
}
+ void add64(TrustedImm64 imm, RegisterID src, RegisterID dest)
+ {
+ RegisterID scratch = scratchRegister();
+ move(imm, scratch);
+ add64(scratch, src, dest);
+ }
#endif // USE(JSVALUE64)
#if !CPU(X86) && !CPU(X86_64) && !CPU(ARM64)
Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (291744 => 291745)
--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h 2022-03-23 13:54:42 UTC (rev 291744)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h 2022-03-23 14:12:54 UTC (rev 291745)
@@ -1378,16 +1378,19 @@
}
return gpr;
}
- FPRReg unboxDoubleWithoutAssertions(GPRReg gpr, GPRReg resultGPR, FPRReg fpr)
+ FPRReg unboxDoubleWithoutAssertions(GPRReg gpr, GPRReg resultGPR, FPRReg fpr, TagRegistersMode mode = HaveTagRegisters)
{
- add64(GPRInfo::numberTagRegister, gpr, resultGPR);
+ if (mode == DoNotHaveTagRegisters)
+ add64(TrustedImm64(JSValue::NumberTag), gpr, resultGPR);
+ else
+ add64(GPRInfo::numberTagRegister, gpr, resultGPR);
move64ToDouble(resultGPR, fpr);
return fpr;
}
- FPRReg unboxDouble(GPRReg gpr, GPRReg resultGPR, FPRReg fpr)
+ FPRReg unboxDouble(GPRReg gpr, GPRReg resultGPR, FPRReg fpr, TagRegistersMode mode = HaveTagRegisters)
{
jitAssertIsJSDouble(gpr);
- return unboxDoubleWithoutAssertions(gpr, resultGPR, fpr);
+ return unboxDoubleWithoutAssertions(gpr, resultGPR, fpr, mode);
}
void boxDouble(FPRReg fpr, JSValueRegs regs, TagRegistersMode mode = HaveTagRegisters)
Modified: trunk/Source/_javascript_Core/wasm/js/WasmToJS.cpp (291744 => 291745)
--- trunk/Source/_javascript_Core/wasm/js/WasmToJS.cpp 2022-03-23 13:54:42 UTC (rev 291744)
+++ trunk/Source/_javascript_Core/wasm/js/WasmToJS.cpp 2022-03-23 14:12:54 UTC (rev 291745)
@@ -328,9 +328,7 @@
done.append(jit.jump());
isDouble.link(&jit);
- jit.move(JIT::TrustedImm64(JSValue::NumberTag), GPRInfo::returnValueGPR2);
- jit.add64(GPRInfo::returnValueGPR2, GPRInfo::returnValueGPR);
- jit.move64ToDouble(GPRInfo::returnValueGPR, dest);
+ jit.unboxDouble(GPRInfo::returnValueGPR, GPRInfo::returnValueGPR2, dest, DoNotHaveTagRegisters);
jit.convertDoubleToFloat(dest, dest);
done.append(jit.jump());
@@ -359,9 +357,7 @@
done.append(jit.jump());
isDouble.link(&jit);
- jit.move(JIT::TrustedImm64(JSValue::NumberTag), GPRInfo::returnValueGPR2);
- jit.add64(GPRInfo::returnValueGPR2, GPRInfo::returnValueGPR);
- jit.move64ToDouble(GPRInfo::returnValueGPR, dest);
+ jit.unboxDouble(GPRInfo::returnValueGPR, GPRInfo::returnValueGPR2, dest, DoNotHaveTagRegisters);
done.append(jit.jump());
notANumber.link(&jit);