Title: [293176] trunk/Source/_javascript_Core
Revision
293176
Author
commit-qu...@webkit.org
Date
2022-04-21 10:32:58 -0700 (Thu, 21 Apr 2022)

Log Message

Unreviewed, reverting r293146.
https://bugs.webkit.org/show_bug.cgi?id=239613

Broke JSC tests. Looks like EWS was blocked by  label
<https://bugs.webkit.org/show_bug.cgi?id=239411>

Reverted changeset:

"[JSC] Remove TempRegisterSet"
https://bugs.webkit.org/show_bug.cgi?id=239578
https://commits.webkit.org/r293146

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/CMakeLists.txt (293175 => 293176)


--- trunk/Source/_javascript_Core/CMakeLists.txt	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/CMakeLists.txt	2022-04-21 17:32:58 UTC (rev 293176)
@@ -867,7 +867,6 @@
     jit/RegisterAtOffsetList.h
     jit/RegisterMap.h
     jit/RegisterSet.h
-    jit/ScratchRegisterAllocator.h
     jit/Snippet.h
     jit/SnippetParams.h
     jit/SnippetReg.h
@@ -874,6 +873,7 @@
     jit/SnippetSlowPathCalls.h
     jit/SpillRegistersMode.h
     jit/TagRegistersMode.h
+    jit/TempRegisterSet.h
     jit/ThunkGenerator.h
 
     llint/LLIntOpcode.h

Modified: trunk/Source/_javascript_Core/ChangeLog (293175 => 293176)


--- trunk/Source/_javascript_Core/ChangeLog	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/ChangeLog	2022-04-21 17:32:58 UTC (rev 293176)
@@ -1,3 +1,17 @@
+2022-04-21  Commit Queue  <commit-qu...@webkit.org>
+
+        Unreviewed, reverting r293146.
+        https://bugs.webkit.org/show_bug.cgi?id=239613
+
+        Broke JSC tests. Looks like EWS was blocked by  label
+        <https://bugs.webkit.org/show_bug.cgi?id=239411>
+
+        Reverted changeset:
+
+        "[JSC] Remove TempRegisterSet"
+        https://bugs.webkit.org/show_bug.cgi?id=239578
+        https://commits.webkit.org/r293146
+
 2022-04-20  Yusuke Suzuki  <ysuz...@apple.com>
 
         [JSC] Remove TempRegisterSet

Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (293175 => 293176)


--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2022-04-21 17:32:58 UTC (rev 293176)
@@ -186,6 +186,7 @@
 		0F24E54317EA9F5900ABB217 /* FPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E53E17EA9F5900ABB217 /* FPRInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0F24E54417EA9F5900ABB217 /* GPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E53F17EA9F5900ABB217 /* GPRInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0F24E54D17EE274900ABB217 /* JITOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54617EE274900ABB217 /* JITOperations.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54817EE274900ABB217 /* TempRegisterSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0F24E55617F0B71C00ABB217 /* InlineCallFrameSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E55417F0B71C00ABB217 /* InlineCallFrameSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0F256C361627B0AD007F2783 /* DFGCallArrayAllocatorSlowPathGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F256C341627B0AA007F2783 /* DFGCallArrayAllocatorSlowPathGenerator.h */; };
@@ -2601,6 +2602,7 @@
 		0F24E53F17EA9F5900ABB217 /* GPRInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPRInfo.h; sourceTree = "<group>"; };
 		0F24E54517EE274900ABB217 /* JITOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITOperations.cpp; sourceTree = "<group>"; };
 		0F24E54617EE274900ABB217 /* JITOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITOperations.h; sourceTree = "<group>"; };
+		0F24E54817EE274900ABB217 /* TempRegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TempRegisterSet.h; sourceTree = "<group>"; };
 		0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScratchRegisterAllocator.h; sourceTree = "<group>"; };
 		0F24E55317F0B71C00ABB217 /* InlineCallFrameSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineCallFrameSet.cpp; sourceTree = "<group>"; };
 		0F24E55417F0B71C00ABB217 /* InlineCallFrameSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineCallFrameSet.h; sourceTree = "<group>"; };
@@ -3189,6 +3191,7 @@
 		0FC20CB718556A3500C9E954 /* DFGSSALoweringPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGSSALoweringPhase.cpp; path = dfg/DFGSSALoweringPhase.cpp; sourceTree = "<group>"; };
 		0FC20CB818556A3500C9E954 /* DFGSSALoweringPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGSSALoweringPhase.h; path = dfg/DFGSSALoweringPhase.h; sourceTree = "<group>"; };
 		0FC314101814559100033232 /* RegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterSet.h; sourceTree = "<group>"; };
+		0FC314111814559100033232 /* TempRegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TempRegisterSet.cpp; sourceTree = "<group>"; };
 		0FC3141418146D7000033232 /* RegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterSet.cpp; sourceTree = "<group>"; };
 		0FC3CCF519ADA410006AC72A /* DFGBlockMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGBlockMap.h; path = dfg/DFGBlockMap.h; sourceTree = "<group>"; };
 		0FC3CCF619ADA410006AC72A /* DFGBlockMapInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGBlockMapInlines.h; path = dfg/DFGBlockMapInlines.h; sourceTree = "<group>"; };
@@ -6669,6 +6672,8 @@
 				A7FF647A18C52E8500B55307 /* SpillRegistersMode.h */,
 				DC7997811CDE9F9E004D4A09 /* TagRegistersMode.cpp */,
 				DC7997821CDE9F9E004D4A09 /* TagRegistersMode.h */,
+				0FC314111814559100033232 /* TempRegisterSet.cpp */,
+				0F24E54817EE274900ABB217 /* TempRegisterSet.h */,
 				0F572D4D16879FDB00E57FBD /* ThunkGenerator.h */,
 				A7386552118697B400540279 /* ThunkGenerators.cpp */,
 				A7386553118697B400540279 /* ThunkGenerators.h */,
@@ -11157,6 +11162,7 @@
 				E30E8A5626DE2E4800DA4915 /* TemporalTimeZone.h in Headers */,
 				E30E8A5726DE2E4800DA4915 /* TemporalTimeZoneConstructor.h in Headers */,
 				E30E8A5426DE2E4800DA4915 /* TemporalTimeZonePrototype.h in Headers */,
+				0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */,
 				0F44A7B420BF68D90022B171 /* TerminatedCodeOrigin.h in Headers */,
 				0FA2C17C17D7CF84009D015F /* TestRunnerUtils.h in Headers */,
 				FE3422121D6B81C30032BE88 /* ThrowScope.h in Headers */,

Modified: trunk/Source/_javascript_Core/Sources.txt (293175 => 293176)


--- trunk/Source/_javascript_Core/Sources.txt	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/Sources.txt	2022-04-21 17:32:58 UTC (rev 293176)
@@ -674,6 +674,7 @@
 jit/SetupVarargsFrame.cpp
 jit/SlowPathCall.cpp
 jit/TagRegistersMode.cpp
+jit/TempRegisterSet.cpp
 jit/ThunkGenerators.cpp
 
 llint/LLIntCLoop.cpp

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp (293175 => 293176)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp	2022-04-21 17:32:58 UTC (rev 293176)
@@ -1296,17 +1296,15 @@
     spooler.finalizeFPR();
 }
 
-void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const RegisterSet& usedRegisters)
+void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const TempRegisterSet& usedRegisters)
 {
 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
     // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
-    ScratchRegisterAllocator allocator(usedRegisters);
-    GPRReg destBufferGPR = allocator.allocateScratchGPR();
-    GPRReg temp1 = allocator.allocateScratchGPR();
-    FPRReg fpTemp1 = allocator.allocateScratchFPR();
-    GPRReg temp2 = allocator.allocateScratchGPR();
-    FPRReg fpTemp2 = allocator.allocateScratchFPR();
-    RELEASE_ASSERT(!allocator.didReuseRegisters());
+    GPRReg destBufferGPR = usedRegisters.getFreeGPR(0);
+    GPRReg temp1 = usedRegisters.getFreeGPR(1);
+    FPRReg fpTemp1 = usedRegisters.getFreeFPR(0);
+    GPRReg temp2 = usedRegisters.getFreeGPR(2);
+    FPRReg fpTemp2 = usedRegisters.getFreeFPR(1);
 
     loadPtr(&topEntryFrame, destBufferGPR);
     addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), destBufferGPR);

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (293175 => 293176)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2022-04-21 17:32:58 UTC (rev 293176)
@@ -40,7 +40,6 @@
 #include "MarkedSpace.h"
 #include "RegisterAtOffsetList.h"
 #include "RegisterSet.h"
-#include "ScratchRegisterAllocator.h"
 #include "StackAlignment.h"
 #include "TagRegistersMode.h"
 #include "TypeofType.h"
@@ -397,9 +396,8 @@
     void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame)
     {
 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
-        ScratchRegisterAllocator allocator(RegisterSet::stubUnavailableRegisters());
-        GPRReg temp1 = allocator.allocateScratchGPR();
-        RELEASE_ASSERT(!allocator.didReuseRegisters());
+        const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() };
+        GPRReg temp1 = usedRegisters.getFreeGPR(0);
         copyCalleeSavesToEntryFrameCalleeSavesBuffer(topEntryFrame, temp1);
 #else
         UNUSED_PARAM(topEntryFrame);
@@ -420,7 +418,7 @@
     void restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(GPRReg vmGPR, GPRReg scratchGPR);
     void restoreCalleeSavesFromVMEntryFrameCalleeSavesBufferImpl(GPRReg entryFrame, const RegisterSet& skipList);
 
-    void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const RegisterSet& usedRegisters = RegisterSet::stubUnavailableRegisters());
+    void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() });
 
     void emitMaterializeTagCheckRegisters()
     {

Modified: trunk/Source/_javascript_Core/jit/RegisterSet.h (293175 => 293176)


--- trunk/Source/_javascript_Core/jit/RegisterSet.h	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/jit/RegisterSet.h	2022-04-21 17:32:58 UTC (rev 293176)
@@ -30,6 +30,7 @@
 #include "GPRInfo.h"
 #include "MacroAssembler.h"
 #include "Reg.h"
+#include "TempRegisterSet.h"
 #include <wtf/Bitmap.h>
 
 namespace JSC {

Modified: trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.cpp (293175 => 293176)


--- trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.cpp	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.cpp	2022-04-21 17:32:58 UTC (rev 293176)
@@ -46,7 +46,10 @@
 {
     if (reg == InvalidGPRReg)
         return;
-    m_lockedRegisters.set(reg);
+    unsigned index = GPRInfo::toIndex(reg);
+    if (index == GPRInfo::InvalidIndex)
+        return;
+    m_lockedRegisters.setGPRByIndex(index);
 }
 
 void ScratchRegisterAllocator::lock(FPRReg reg)
@@ -53,7 +56,10 @@
 {
     if (reg == InvalidFPRReg)
         return;
-    m_lockedRegisters.set(reg);
+    unsigned index = FPRInfo::toIndex(reg);
+    if (index == FPRInfo::InvalidIndex)
+        return;
+    m_lockedRegisters.setFPRByIndex(index);
 }
 
 void ScratchRegisterAllocator::lock(JSValueRegs regs)
@@ -67,7 +73,7 @@
 {
     // First try to allocate a register that is totally free.
     for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) {
-        auto reg = BankInfo::toRegister(i);
+        typename BankInfo::RegisterType reg = BankInfo::toRegister(i);
         if (!m_lockedRegisters.get(reg)
             && !m_usedRegisters.get(reg)
             && !m_scratchRegisters.get(reg)) {
@@ -79,7 +85,7 @@
     // Since that failed, try to allocate a register that is not yet
     // locked or used for scratch.
     for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) {
-        auto reg = BankInfo::toRegister(i);
+        typename BankInfo::RegisterType reg = BankInfo::toRegister(i);
         if (!m_lockedRegisters.get(reg) && !m_scratchRegisters.get(reg)) {
             m_scratchRegisters.set(reg);
             m_numberOfReusedRegisters++;
@@ -104,14 +110,12 @@
     RegisterSet registersToSpill;
     for (unsigned i = 0; i < FPRInfo::numberOfRegisters; ++i) {
         FPRReg reg = FPRInfo::toRegister(i);
-        ASSERT(reg != InvalidFPRReg);
-        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
+        if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg))
             registersToSpill.set(reg);
     }
     for (unsigned i = 0; i < GPRInfo::numberOfRegisters; ++i) {
         GPRReg reg = GPRInfo::toRegister(i);
-        ASSERT(reg != InvalidGPRReg);
-        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
+        if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg))
             registersToSpill.set(reg);
     }
 
@@ -130,14 +134,12 @@
     RegisterSet registersToFill;
     for (unsigned i = GPRInfo::numberOfRegisters; i--;) {
         GPRReg reg = GPRInfo::toRegister(i);
-        ASSERT(reg != InvalidGPRReg);
-        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
+        if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg))
             registersToFill.set(reg);
     }
     for (unsigned i = FPRInfo::numberOfRegisters; i--;) {
         FPRReg reg = FPRInfo::toRegister(i);
-        ASSERT(reg != InvalidFPRReg);
-        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
+        if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg))
             registersToFill.set(reg);
     }
 

Modified: trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.h (293175 => 293176)


--- trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.h	2022-04-21 17:16:37 UTC (rev 293175)
+++ trunk/Source/_javascript_Core/jit/ScratchRegisterAllocator.h	2022-04-21 17:32:58 UTC (rev 293176)
@@ -28,6 +28,7 @@
 #if ENABLE(JIT)
 
 #include "RegisterSet.h"
+#include "TempRegisterSet.h"
 
 namespace JSC {
 
@@ -95,8 +96,8 @@
 
 private:
     RegisterSet m_usedRegisters;
-    RegisterSet m_lockedRegisters;
-    RegisterSet m_scratchRegisters;
+    TempRegisterSet m_lockedRegisters;
+    TempRegisterSet m_scratchRegisters;
     unsigned m_numberOfReusedRegisters;
 };
 

Added: trunk/Source/_javascript_Core/jit/TempRegisterSet.cpp (0 => 293176)


--- trunk/Source/_javascript_Core/jit/TempRegisterSet.cpp	                        (rev 0)
+++ trunk/Source/_javascript_Core/jit/TempRegisterSet.cpp	2022-04-21 17:32:58 UTC (rev 293176)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "TempRegisterSet.h"
+
+#if ENABLE(ASSEMBLER)
+
+#include "RegisterSet.h"
+
+namespace JSC {
+
+TempRegisterSet::TempRegisterSet(const RegisterSet& other)
+{
+    clearAll();
+
+    for (unsigned i = GPRInfo::numberOfRegisters; i--;) {
+        GPRReg reg = GPRInfo::toRegister(i);
+        if (other.get(reg))
+            set(reg);
+    }
+    for (unsigned i = FPRInfo::numberOfRegisters; i--;) {
+        FPRReg reg = FPRInfo::toRegister(i);
+        if (other.get(reg))
+            set(reg);
+    }
+}
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER)

Added: trunk/Source/_javascript_Core/jit/TempRegisterSet.h (0 => 293176)


--- trunk/Source/_javascript_Core/jit/TempRegisterSet.h	                        (rev 0)
+++ trunk/Source/_javascript_Core/jit/TempRegisterSet.h	2022-04-21 17:32:58 UTC (rev 293176)
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#if ENABLE(ASSEMBLER)
+
+#include "FPRInfo.h"
+#include "GPRInfo.h"
+
+namespace JSC {
+
+class RegisterSet;
+
+class TempRegisterSet {
+public:
+    TempRegisterSet()
+    {
+        clearAll();
+    }
+    
+    TempRegisterSet(const RegisterSet&);
+    
+    void set(GPRReg reg)
+    {
+        setBit(GPRInfo::toIndex(reg));
+    }
+    
+    void set(JSValueRegs regs)
+    {
+        if (regs.tagGPR() != InvalidGPRReg)
+            set(regs.tagGPR());
+        set(regs.payloadGPR());
+    }
+    
+    void setGPRByIndex(unsigned index)
+    {
+        ASSERT(index < GPRInfo::numberOfRegisters);
+        setBit(index);
+    }
+    
+    void clear(GPRReg reg)
+    {
+        clearBit(GPRInfo::toIndex(reg));
+    }
+    
+    bool get(GPRReg reg) const
+    {
+        return getBit(GPRInfo::toIndex(reg));
+    }
+    
+    bool getGPRByIndex(unsigned index) const
+    {
+        ASSERT(index < GPRInfo::numberOfRegisters);
+        return getBit(index);
+    }
+    
+    // Return the index'th free GPR.
+    GPRReg getFreeGPR(unsigned index = 0) const
+    {
+        for (unsigned i = GPRInfo::numberOfRegisters; i--;) {
+            if (!getGPRByIndex(i) && !index--)
+                return GPRInfo::toRegister(i);
+        }
+        return InvalidGPRReg;
+    }
+    
+    void set(FPRReg reg)
+    {
+        setBit(GPRInfo::numberOfRegisters + FPRInfo::toIndex(reg));
+    }
+    
+    void setFPRByIndex(unsigned index)
+    {
+        ASSERT(index < FPRInfo::numberOfRegisters);
+        setBit(GPRInfo::numberOfRegisters + index);
+    }
+    
+    void clear(FPRReg reg)
+    {
+        clearBit(GPRInfo::numberOfRegisters + FPRInfo::toIndex(reg));
+    }
+    
+    bool get(FPRReg reg) const
+    {
+        return getBit(GPRInfo::numberOfRegisters + FPRInfo::toIndex(reg));
+    }
+    
+    bool getFPRByIndex(unsigned index) const
+    {
+        ASSERT(index < FPRInfo::numberOfRegisters);
+        return getBit(GPRInfo::numberOfRegisters + index);
+    }
+    
+    // Return the index'th free FPR.
+    FPRReg getFreeFPR(unsigned index = 0) const
+    {
+        for (unsigned i = FPRInfo::numberOfRegisters; i--;) {
+            if (!getFPRByIndex(i) && !index--)
+                return FPRInfo::toRegister(i);
+        }
+        return InvalidFPRReg;
+    }
+
+    template<typename BankInfo>
+    void setByIndex(unsigned index)
+    {
+        set(BankInfo::toRegister(index));
+    }
+    
+    template<typename BankInfo>
+    bool getByIndex(unsigned index)
+    {
+        return get(BankInfo::toRegister(index));
+    }
+    
+    unsigned numberOfSetGPRs() const
+    {
+        unsigned result = 0;
+        for (unsigned i = GPRInfo::numberOfRegisters; i--;) {
+            if (!getBit(i))
+                continue;
+            result++;
+        }
+        return result;
+    }
+    
+    unsigned numberOfSetFPRs() const
+    {
+        unsigned result = 0;
+        for (unsigned i = FPRInfo::numberOfRegisters; i--;) {
+            if (!getBit(GPRInfo::numberOfRegisters + i))
+                continue;
+            result++;
+        }
+        return result;
+    }
+    
+    unsigned numberOfSetRegisters() const
+    {
+        unsigned result = 0;
+        for (unsigned i = totalNumberOfRegisters; i--;) {
+            if (!getBit(i))
+                continue;
+            result++;
+        }
+        return result;
+    }
+    
+private:
+    void clearAll()
+    {
+        for (unsigned i = numberOfBytesInTempRegisterSet; i--;)
+            m_set[i] = 0;
+    }
+
+    void setBit(unsigned i)
+    {
+        ASSERT(i < totalNumberOfRegisters);
+        m_set[i >> 3] |= (1 << (i & 7));
+    }
+    
+    void clearBit(unsigned i)
+    {
+        ASSERT(i < totalNumberOfRegisters);
+        m_set[i >> 3] &= ~(1 << (i & 7));
+    }
+    
+    bool getBit(unsigned i) const
+    {
+        ASSERT(i < totalNumberOfRegisters);
+        return !!(m_set[i >> 3] & (1 << (i & 7)));
+    }
+    
+    static constexpr unsigned totalNumberOfRegisters =
+        GPRInfo::numberOfRegisters + FPRInfo::numberOfRegisters;
+    
+    static constexpr unsigned numberOfBytesInTempRegisterSet =
+        (totalNumberOfRegisters + 7) >> 3;
+
+    uint8_t m_set[numberOfBytesInTempRegisterSet];
+};
+
+} // namespace JSC
+
+#else // ENABLE(ASSEMBLER) -> so if JIT is disabled
+
+namespace JSC {
+
+// Define TempRegisterSet to something, to make it easier to refer to this type in code that
+// make be compiled when the JIT is disabled.
+
+struct TempRegisterSet { };
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to