- Revision
- 280609
- Author
- yijia_hu...@apple.com
- Date
- 2021-08-03 13:26:54 -0700 (Tue, 03 Aug 2021)
Log Message
[ARM64] Use link register instead of pinning a register for materializing big load constants
https://bugs.webkit.org/show_bug.cgi?id=228710
Reviewed by Mark Lam.
Previously, we pin a register as a temp for materializing a large constant that cannot fit in
Load/Store imm form. This is not efficient since the register allocator has one less register
to allocate from. To solve this problem, we should switch to using the link register as the temp
on ARM64.
* b3/B3Common.cpp:
(JSC::B3::linkRegister):
(JSC::B3::pinnedExtendedOffsetAddrRegister): Deleted.
* b3/B3Common.h:
* b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp:
(JSC::B3::Air::callFrameAddr):
* b3/air/AirCode.cpp:
(JSC::B3::Air::Code::Code):
* b3/air/AirLowerStackArgs.cpp:
(JSC::B3::Air::lowerStackArgs):
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (280608 => 280609)
--- trunk/Source/_javascript_Core/ChangeLog 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/ChangeLog 2021-08-03 20:26:54 UTC (rev 280609)
@@ -1,3 +1,26 @@
+2021-08-03 Yijia Huang <yijia_hu...@apple.com>
+
+ [ARM64] Use link register instead of pinning a register for materializing big load constants
+ https://bugs.webkit.org/show_bug.cgi?id=228710
+
+ Reviewed by Mark Lam.
+
+ Previously, we pin a register as a temp for materializing a large constant that cannot fit in
+ Load/Store imm form. This is not efficient since the register allocator has one less register
+ to allocate from. To solve this problem, we should switch to using the link register as the temp
+ on ARM64.
+
+ * b3/B3Common.cpp:
+ (JSC::B3::linkRegister):
+ (JSC::B3::pinnedExtendedOffsetAddrRegister): Deleted.
+ * b3/B3Common.h:
+ * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp:
+ (JSC::B3::Air::callFrameAddr):
+ * b3/air/AirCode.cpp:
+ (JSC::B3::Air::Code::Code):
+ * b3/air/AirLowerStackArgs.cpp:
+ (JSC::B3::Air::lowerStackArgs):
+
2021-08-02 Yijia Huang <yijia_hu...@apple.com>
Add a new pattern to instruction selector to utilize UMULL supported by ARM64
Modified: trunk/Source/_javascript_Core/b3/B3Common.cpp (280608 => 280609)
--- trunk/Source/_javascript_Core/b3/B3Common.cpp 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/b3/B3Common.cpp 2021-08-03 20:26:54 UTC (rev 280609)
@@ -67,10 +67,10 @@
return Options::verboseValidationFailure();
}
-std::optional<GPRReg> pinnedExtendedOffsetAddrRegister()
+std::optional<GPRReg> linkRegister()
{
#if CPU(ARM64)
- return MacroAssembler::dataTempRegister;
+ return MacroAssembler::linkRegister;
#elif CPU(X86_64)
return std::nullopt;
#else
Modified: trunk/Source/_javascript_Core/b3/B3Common.h (280608 => 280609)
--- trunk/Source/_javascript_Core/b3/B3Common.h 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/b3/B3Common.h 2021-08-03 20:26:54 UTC (rev 280609)
@@ -183,7 +183,7 @@
return Options::defaultB3OptLevel();
}
-std::optional<GPRReg> pinnedExtendedOffsetAddrRegister();
+std::optional<GPRReg> linkRegister();
} } // namespace JSC::B3
Modified: trunk/Source/_javascript_Core/b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp (280608 => 280609)
--- trunk/Source/_javascript_Core/b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp 2021-08-03 20:26:54 UTC (rev 280609)
@@ -144,11 +144,11 @@
return CCallHelpers::Address(GPRInfo::callFrameRegister, offsetFromFP);
}
- ASSERT(pinnedExtendedOffsetAddrRegister());
+ ASSERT(linkRegister());
auto addr = Arg::addr(Air::Tmp(GPRInfo::callFrameRegister), offsetFromFP);
if (addr.isValidForm(Width64))
return CCallHelpers::Address(GPRInfo::callFrameRegister, offsetFromFP);
- GPRReg reg = *pinnedExtendedOffsetAddrRegister();
+ GPRReg reg = *linkRegister();
jit.move(CCallHelpers::TrustedImmPtr(offsetFromFP), reg);
jit.add64(GPRInfo::callFrameRegister, reg);
return CCallHelpers::Address(reg);
Modified: trunk/Source/_javascript_Core/b3/air/AirCode.cpp (280608 => 280609)
--- trunk/Source/_javascript_Core/b3/air/AirCode.cpp 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/b3/air/AirCode.cpp 2021-08-03 20:26:54 UTC (rev 280609)
@@ -90,9 +90,6 @@
setRegsInPriorityOrder(bank, result);
});
- if (auto reg = pinnedExtendedOffsetAddrRegister())
- pinRegister(*reg);
-
m_pinnedRegs.set(MacroAssembler::framePointerRegister);
}
Modified: trunk/Source/_javascript_Core/b3/air/AirLowerStackArgs.cpp (280608 => 280609)
--- trunk/Source/_javascript_Core/b3/air/AirLowerStackArgs.cpp 2021-08-03 20:04:55 UTC (rev 280608)
+++ trunk/Source/_javascript_Core/b3/air/AirLowerStackArgs.cpp 2021-08-03 20:26:54 UTC (rev 280609)
@@ -78,8 +78,7 @@
if (Arg::isValidImmForm(offset))
inst = Inst(inst.kind.opcode == Lea32 ? Add32 : Add64, inst.origin, Arg::imm(offset), base, inst.args[1]);
else {
- ASSERT(pinnedExtendedOffsetAddrRegister());
- Air::Tmp tmp = Air::Tmp(*pinnedExtendedOffsetAddrRegister());
+ Air::Tmp tmp = Air::Tmp(*linkRegister());
Arg offsetArg = Arg::bigImm(offset);
insertionSet.insert(instIndex, Move, inst.origin, offsetArg, tmp);
inst = Inst(inst.kind.opcode == Lea32 ? Add32 : Add64, inst.origin, tmp, base, inst.args[1]);
@@ -128,8 +127,7 @@
if (result.isValidForm(width))
return result;
#if CPU(ARM64)
- ASSERT(pinnedExtendedOffsetAddrRegister());
- Air::Tmp tmp = Air::Tmp(*pinnedExtendedOffsetAddrRegister());
+ Air::Tmp tmp = Air::Tmp(*linkRegister());
Arg largeOffset = Arg::isValidImmForm(offsetFromSP) ? Arg::imm(offsetFromSP) : Arg::bigImm(offsetFromSP);
insertionSet.insert(instIndex, Move, inst.origin, largeOffset, tmp);