Title: [231129] trunk/Source/_javascript_Core
Revision
231129
Author
[email protected]
Date
2018-04-27 20:32:24 -0700 (Fri, 27 Apr 2018)

Log Message

Make the first 64 bits of JSString look like a double JSValue
https://bugs.webkit.org/show_bug.cgi?id=185081

Reviewed by Filip Pizlo.

We can be clever about how we lay out JSString so that, were it
reinterpreted as a JSValue, it would look like a double.

* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::and16):
* assembler/X86Assembler.h:
(JSC::X86Assembler::andw_mr):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileMakeRope):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
* ftl/FTLOutput.h:
(JSC::FTL::Output::store32As8):
(JSC::FTL::Output::store32As16):
* runtime/JSString.h:
(JSC::JSString::JSString):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (231128 => 231129)


--- trunk/Source/_javascript_Core/ChangeLog	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-04-28 03:32:24 UTC (rev 231129)
@@ -1,3 +1,27 @@
+2018-04-27  JF Bastien  <[email protected]>
+
+        Make the first 64 bits of JSString look like a double JSValue
+        https://bugs.webkit.org/show_bug.cgi?id=185081
+
+        Reviewed by Filip Pizlo.
+
+        We can be clever about how we lay out JSString so that, were it
+        reinterpreted as a JSValue, it would look like a double.
+
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::and16):
+        * assembler/X86Assembler.h:
+        (JSC::X86Assembler::andw_mr):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileMakeRope):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
+        * ftl/FTLOutput.h:
+        (JSC::FTL::Output::store32As8):
+        (JSC::FTL::Output::store32As16):
+        * runtime/JSString.h:
+        (JSC::JSString::JSString):
+
 2018-04-27  Yusuke Suzuki  <[email protected]>
 
         [JSC][ARM64][Linux] Add collectCPUFeatures using auxiliary vector

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (231128 => 231129)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2018-04-28 03:32:24 UTC (rev 231129)
@@ -372,6 +372,12 @@
         and32(dataTempRegister, dest);
     }
 
+    void and16(Address src, RegisterID dest)
+    {
+        load16(src, getCachedDataTempRegisterIDAndInvalidate());
+        and32(dataTempRegister, dest);
+    }
+
     void and64(RegisterID src1, RegisterID src2, RegisterID dest)
     {
         m_assembler.and_<64>(dest, src1, src2);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (231128 => 231129)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2018-04-28 03:32:24 UTC (rev 231129)
@@ -290,6 +290,16 @@
         m_assembler.andl_mr(src.offset, src.base, src.index, src.scale, dest);
     }
 
+    void and16(Address src, RegisterID dest)
+    {
+        m_assembler.andw_mr(src.offset, src.base, dest);
+    }
+
+    void and16(BaseIndex src, RegisterID dest)
+    {
+        m_assembler.andw_mr(src.offset, src.base, src.index, src.scale, dest);
+    }
+
     void and32(TrustedImm32 imm, Address address)
     {
         m_assembler.andl_im(imm.m_value, address.offset, address.base);

Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (231128 => 231129)


--- trunk/Source/_javascript_Core/assembler/X86Assembler.h	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h	2018-04-28 03:32:24 UTC (rev 231129)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -685,6 +685,18 @@
         m_formatter.oneByteOp(OP_AND_GvEv, dst, base, index, scale, offset);
     }
 
+    void andw_mr(int offset, RegisterID base, RegisterID dst)
+    {
+        m_formatter.prefix(PRE_OPERAND_SIZE);
+        andl_mr(offset, base, dst);
+    }
+
+    void andw_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
+    {
+        m_formatter.prefix(PRE_OPERAND_SIZE);
+        andl_mr(offset, base, index, scale, dst);
+    }
+
     void andl_rm(RegisterID src, int offset, RegisterID base)
     {
         m_formatter.oneByteOp(OP_AND_EvGv, src, base, offset);

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (231128 => 231129)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2018-04-28 03:32:24 UTC (rev 231129)
@@ -4268,7 +4268,7 @@
         m_jit.storePtr(opGPRs[i], JITCompiler::Address(resultGPR, JSRopeString::offsetOfFibers() + sizeof(WriteBarrier<JSString>) * i));
     for (unsigned i = numOpGPRs; i < JSRopeString::s_maxInternalRopeLength; ++i)
         m_jit.storePtr(TrustedImmPtr(nullptr), JITCompiler::Address(resultGPR, JSRopeString::offsetOfFibers() + sizeof(WriteBarrier<JSString>) * i));
-    m_jit.load32(JITCompiler::Address(opGPRs[0], JSString::offsetOfFlags()), scratchGPR);
+    m_jit.load16(JITCompiler::Address(opGPRs[0], JSString::offsetOfFlags()), scratchGPR);
     m_jit.load32(JITCompiler::Address(opGPRs[0], JSString::offsetOfLength()), allocatorGPR);
     if (!ASSERT_DISABLED) {
         JITCompiler::Jump ok = m_jit.branch32(
@@ -4277,7 +4277,7 @@
         ok.link(&m_jit);
     }
     for (unsigned i = 1; i < numOpGPRs; ++i) {
-        m_jit.and32(JITCompiler::Address(opGPRs[i], JSString::offsetOfFlags()), scratchGPR);
+        m_jit.and16(JITCompiler::Address(opGPRs[i], JSString::offsetOfFlags()), scratchGPR);
         speculationCheck(
             Uncountable, JSValueSource(), nullptr,
             m_jit.branchAdd32(
@@ -4285,7 +4285,7 @@
                 JITCompiler::Address(opGPRs[i], JSString::offsetOfLength()), allocatorGPR));
     }
     m_jit.and32(JITCompiler::TrustedImm32(JSString::Is8Bit), scratchGPR);
-    m_jit.store32(scratchGPR, JITCompiler::Address(resultGPR, JSString::offsetOfFlags()));
+    m_jit.store16(scratchGPR, JITCompiler::Address(resultGPR, JSString::offsetOfFlags()));
     if (!ASSERT_DISABLED) {
         JITCompiler::Jump ok = m_jit.branch32(
             JITCompiler::GreaterThanOrEqual, allocatorGPR, TrustedImm32(0));

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (231128 => 231129)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2018-04-28 03:32:24 UTC (rev 231129)
@@ -6165,16 +6165,16 @@
             m_out.storePtr(kids[i], result, m_heaps.JSRopeString_fibers[i]);
         for (unsigned i = numKids; i < JSRopeString::s_maxInternalRopeLength; ++i)
             m_out.storePtr(m_out.intPtrZero, result, m_heaps.JSRopeString_fibers[i]);
-        LValue flags = m_out.load32(kids[0], m_heaps.JSString_flags);
+        LValue flags = m_out.load16ZeroExt32(kids[0], m_heaps.JSString_flags);
         LValue length = m_out.load32(kids[0], m_heaps.JSString_length);
         for (unsigned i = 1; i < numKids; ++i) {
-            flags = m_out.bitAnd(flags, m_out.load32(kids[i], m_heaps.JSString_flags));
+            flags = m_out.bitAnd(flags, m_out.load16ZeroExt32(kids[i], m_heaps.JSString_flags));
             CheckValue* lengthCheck = m_out.speculateAdd(
                 length, m_out.load32(kids[i], m_heaps.JSString_length));
             blessSpeculation(lengthCheck, Uncountable, noValue(), nullptr, m_origin);
             length = lengthCheck;
         }
-        m_out.store32(
+        m_out.store32As16(
             m_out.bitAnd(m_out.constInt32(JSString::Is8Bit), flags),
             result, m_heaps.JSString_flags);
         m_out.store32(length, result, m_heaps.JSString_length);

Modified: trunk/Source/_javascript_Core/ftl/FTLOutput.h (231128 => 231129)


--- trunk/Source/_javascript_Core/ftl/FTLOutput.h	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/ftl/FTLOutput.h	2018-04-28 03:32:24 UTC (rev 231129)
@@ -322,6 +322,8 @@
     LValue load64(LValue base, const AbstractHeap& field) { return load64(address(base, field)); }
     LValue loadPtr(LValue base, const AbstractHeap& field) { return loadPtr(address(base, field)); }
     LValue loadDouble(LValue base, const AbstractHeap& field) { return loadDouble(address(base, field)); }
+    void store32As8(LValue value, LValue base, const AbstractHeap& field) { store32As8(value, address(base, field)); }
+    void store32As16(LValue value, LValue base, const AbstractHeap& field) { store32As16(value, address(base, field)); }
     void store32(LValue value, LValue base, const AbstractHeap& field) { store32(value, address(base, field)); }
     void store64(LValue value, LValue base, const AbstractHeap& field) { store64(value, address(base, field)); }
     void storePtr(LValue value, LValue base, const AbstractHeap& field) { storePtr(value, address(base, field)); }

Modified: trunk/Source/_javascript_Core/runtime/JSString.h (231128 => 231129)


--- trunk/Source/_javascript_Core/runtime/JSString.h	2018-04-28 01:09:11 UTC (rev 231128)
+++ trunk/Source/_javascript_Core/runtime/JSString.h	2018-04-28 03:32:24 UTC (rev 231129)
@@ -1,7 +1,7 @@
 /*
  *  Copyright (C) 1999-2001 Harri Porten ([email protected])
  *  Copyright (C) 2001 Peter Kelly ([email protected])
- *  Copyright (C) 2003-2017 Apple Inc. All rights reserved.
+ *  Copyright (C) 2003-2018 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -101,7 +101,6 @@
 private:
     JSString(VM& vm, Ref<StringImpl>&& value)
         : JSCell(vm, vm.stringStructure.get())
-        , m_flags(0)
         , m_value(WTFMove(value))
     {
     }
@@ -108,7 +107,6 @@
 
     JSString(VM& vm)
         : JSCell(vm, vm.stringStructure.get())
-        , m_flags(0)
     {
     }
 
@@ -218,10 +216,12 @@
     }
 
 private:
-    mutable unsigned m_flags;
-
     // A string is represented either by a String or a rope of fibers.
-    unsigned m_length;
+    unsigned m_length { 0 };
+    mutable uint16_t m_flags { 0 };
+    // The poison is strategically placed and holds a value such that the first
+    // 64 bits of JSString look like a double JSValue.
+    uint16_t m_poison { 1 };
     mutable String m_value;
 
     friend class LLIntOffsetsExtractor;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to