REGRESSION(r263035): stress/get-prototype-of.js broken on s390x
authorysuzuki@apple.com <ysuzuki@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Jun 2020 23:50:21 +0000 (23:50 +0000)
committerysuzuki@apple.com <ysuzuki@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 25 Jun 2020 23:50:21 +0000 (23:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=213307

Reviewed by Ross Kirsling.

Structure::m_outOfLineTypeFlags is uint16_t. If we access this field as 32bit field, we have different value in big endian architectures.
Since we do not have half-size-load branch instructions, we should load this uint16_t value via `loadh` (which zero-extends the loaded value)
and perform branch onto that value.

* jit/AssemblyHelpers.cpp:
(JSC::AssemblyHelpers::emitLoadPrototype):
* llint/LowLevelInterpreter64.asm:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@263546 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jit/AssemblyHelpers.cpp
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm

index 7357716..9bc9914 100644 (file)
@@ -1,3 +1,18 @@
+2020-06-25  Yusuke Suzuki  <ysuzuki@apple.com>
+
+        REGRESSION(r263035): stress/get-prototype-of.js broken on s390x
+        https://bugs.webkit.org/show_bug.cgi?id=213307
+
+        Reviewed by Ross Kirsling.
+
+        Structure::m_outOfLineTypeFlags is uint16_t. If we access this field as 32bit field, we have different value in big endian architectures.
+        Since we do not have half-size-load branch instructions, we should load this uint16_t value via `loadh` (which zero-extends the loaded value)
+        and perform branch onto that value.
+
+        * jit/AssemblyHelpers.cpp:
+        (JSC::AssemblyHelpers::emitLoadPrototype):
+        * llint/LowLevelInterpreter64.asm:
+
 2020-06-25  Mark Lam  <mark.lam@apple.com>
 
         JSCell constructor needs to ensure that the passed in structure is still alive.
index 114045f..6bebebd 100644 (file)
@@ -400,9 +400,8 @@ void AssemblyHelpers::emitLoadPrototype(VM& vm, GPRReg objectGPR, JSValueRegs re
 
     emitLoadStructure(vm, objectGPR, resultRegs.payloadGPR(), scratchGPR);
 
-    auto overridesGetPrototype = branchTest32(MacroAssembler::NonZero,
-        MacroAssembler::Address(resultRegs.payloadGPR(), Structure::outOfLineTypeFlagsOffset()),
-        TrustedImm32(OverridesGetPrototypeOutOfLine));
+    load16(MacroAssembler::Address(resultRegs.payloadGPR(), Structure::outOfLineTypeFlagsOffset()), scratchGPR);
+    auto overridesGetPrototype = branchTest32(MacroAssembler::NonZero, scratchGPR, TrustedImm32(OverridesGetPrototypeOutOfLine));
     slowPath.append(overridesGetPrototype);
 
     loadValue(MacroAssembler::Address(resultRegs.payloadGPR(), Structure::prototypeOffset()), resultRegs);
index 9ff931c..061745f 100644 (file)
@@ -1509,7 +1509,8 @@ llintOpWithProfile(op_get_prototype_of, OpGetPrototypeOf, macro (size, get, disp
     bbb JSCell::m_type[t0], ObjectType, .opGetPrototypeOfSlow
 
     loadStructureWithScratch(t0, t2, t1, t3)
-    btinz Structure::m_outOfLineTypeFlags[t2], OverridesGetPrototypeOutOfLine, .opGetPrototypeOfSlow
+    loadh Structure::m_outOfLineTypeFlags[t2], t3
+    btinz t3, OverridesGetPrototypeOutOfLine, .opGetPrototypeOfSlow
 
     loadq Structure::m_prototype[t2], t2
     btqz t2, .opGetPrototypeOfPolyProto