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