Title: [280609] trunk/Source/_javascript_Core
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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to