Title: [86999] trunk/Source/_javascript_Core
Revision
86999
Author
oli...@apple.com
Date
2011-05-20 16:20:48 -0700 (Fri, 20 May 2011)

Log Message

2011-05-20  Oliver Hunt  <oli...@apple.com>

        Reviewed by Gavin Barraclough.

        Reduce size of inline cache path of get_by_id on ARMv7
        https://bugs.webkit.org/show_bug.cgi?id=61221

        This reduces the code size of get_by_id by 20 bytes

        * assembler/ARMv7Assembler.h:
        (JSC::ARMv7Assembler::ldrCompact):
        (JSC::ARMv7Assembler::repatchCompact):
        (JSC::ARMv7Assembler::setUInt7ForLoad):
        * assembler/MacroAssemblerARMv7.h:
        (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch):
        * jit/JIT.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (86998 => 86999)


--- trunk/Source/_javascript_Core/ChangeLog	2011-05-20 23:13:33 UTC (rev 86998)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-05-20 23:20:48 UTC (rev 86999)
@@ -1,3 +1,20 @@
+2011-05-20  Oliver Hunt  <oli...@apple.com>
+
+        Reviewed by Gavin Barraclough.
+
+        Reduce size of inline cache path of get_by_id on ARMv7
+        https://bugs.webkit.org/show_bug.cgi?id=61221
+
+        This reduces the code size of get_by_id by 20 bytes
+
+        * assembler/ARMv7Assembler.h:
+        (JSC::ARMv7Assembler::ldrCompact):
+        (JSC::ARMv7Assembler::repatchCompact):
+        (JSC::ARMv7Assembler::setUInt7ForLoad):
+        * assembler/MacroAssemblerARMv7.h:
+        (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch):
+        * jit/JIT.h:
+
 2011-05-20  Zoltan Herczeg  <zherc...@inf.u-szeged.hu>
 
         Reviewed by Oliver Hunt.

Modified: trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h (86998 => 86999)


--- trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h	2011-05-20 23:13:33 UTC (rev 86998)
+++ trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h	2011-05-20 23:20:48 UTC (rev 86999)
@@ -953,6 +953,14 @@
             m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDR_imm_T3, rn, rt, imm.getUInt12());
     }
 
+    void ldrCompact(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
+    {
+        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
+        ASSERT(imm.isUInt7());
+        ASSERT(!((rt | rn) & 8));
+        m_formatter.oneWordOp5Imm5Reg3Reg3(OP_LDR_imm_T1, imm.getUInt7() >> 2, rn, rt);
+    }
+
     // If index is set, this is a regular offset or a pre-indexed load;
     // if index is not set then is is a post-index load.
     //
@@ -1756,7 +1764,9 @@
     
     static void repatchCompact(void* where, int32_t value)
     {
-        repatchInt32(where, value);
+        ASSERT(value >= 0);
+        ASSERT(ARMThumbImmediate::makeUInt12(value).isUInt7());
+        setUInt7ForLoad(where, ARMThumbImmediate::makeUInt12(value));
     }
 
     static void repatchPointer(void* where, void* value)
@@ -1847,6 +1857,16 @@
         ExecutableAllocator::cacheFlush(location - 4, 4 * sizeof(uint16_t));
     }
 
+    static void setUInt7ForLoad(void* code, ARMThumbImmediate imm)
+    {
+        // Requires us to have planted a LDR_imm_T1
+        ASSERT(imm.isValid());
+        ASSERT(imm.isUInt7());
+        uint16_t* location = reinterpret_cast<uint16_t*>(code);
+        location[0] |= (imm.getUInt7() >> 2) << 6;
+        ExecutableAllocator::cacheFlush(location, sizeof(uint16_t));
+    }
+
     static void setPointer(void* code, void* value)
     {
         setInt32(code, reinterpret_cast<uint32_t>(value));

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (86998 => 86999)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2011-05-20 23:13:33 UTC (rev 86998)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2011-05-20 23:20:48 UTC (rev 86999)
@@ -48,7 +48,9 @@
     typedef ARMv7Assembler::LinkRecord LinkRecord;
     typedef ARMv7Assembler::JumpType JumpType;
     typedef ARMv7Assembler::JumpLinkType JumpLinkType;
-    static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
+    // Magic number is the biggest useful offset we can get on ARMv7 with
+    // a LDR_imm_T2 encoding
+    static const int MaximumCompactPtrAlignedAddressOffset = 124;
 
     MacroAssemblerARMv7()
         : m_inUninterruptedSequence(false)
@@ -485,8 +487,12 @@
     
     DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
     {
-        DataLabel32 label = load32WithAddressOffsetPatch(address, dest);
-        return DataLabelCompact(label.label());
+        DataLabelCompact label(this);
+        ASSERT(address.offset >= 0);
+        ASSERT(address.offset <= MaximumCompactPtrAlignedAddressOffset);
+        ASSERT(ARMThumbImmediate::makeUInt12(address.offset).isUInt7());
+        m_assembler.ldrCompact(dest, address.base, ARMThumbImmediate::makeUInt12(address.offset));
+        return label;
     }
 
     void load16(BaseIndex address, RegisterID dest)

Modified: trunk/Source/_javascript_Core/jit/JIT.h (86998 => 86999)


--- trunk/Source/_javascript_Core/jit/JIT.h	2011-05-20 23:13:33 UTC (rev 86998)
+++ trunk/Source/_javascript_Core/jit/JIT.h	2011-05-20 23:20:48 UTC (rev 86999)
@@ -408,9 +408,9 @@
         // These architecture specific value are used to enable patching - see comment on op_get_by_id.
         static const int patchOffsetGetByIdStructure = 10;
         static const int patchOffsetGetByIdBranchToSlowCase = 26;
-        static const int patchOffsetGetByIdPropertyMapOffset1 = 36;
-        static const int patchOffsetGetByIdPropertyMapOffset2 = 48;
-        static const int patchOffsetGetByIdPutResult = 52;
+        static const int patchOffsetGetByIdPropertyMapOffset1 = 28;
+        static const int patchOffsetGetByIdPropertyMapOffset2 = 30;
+        static const int patchOffsetGetByIdPutResult = 32;
 #if ENABLE(OPCODE_SAMPLING)
         #error "OPCODE_SAMPLING is not yet supported"
 #else
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to