Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (86698 => 86699)
--- trunk/Source/_javascript_Core/ChangeLog 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-05-17 20:02:41 UTC (rev 86699)
@@ -1,3 +1,71 @@
+2011-05-16 Oliver Hunt <[email protected]>
+
+ Reviewed by Gavin Barraclough.
+
+ Reduce code size for inline cache
+ https://bugs.webkit.org/show_bug.cgi?id=60942
+
+ This patch introduces the concept of a "compact" address that
+ allows individual architectures to control the maximum offset
+ used for the inline path of get_by_id. This reduces the code
+ size of get_by_id by 3 bytes on x86 and x86_64 and slightly
+ improves performance on v8 tests.
+
+ * assembler/ARMAssembler.h:
+ (JSC::ARMAssembler::repatchCompact):
+ * assembler/ARMv7Assembler.h:
+ (JSC::ARMv7Assembler::repatchCompact):
+ * assembler/AbstractMacroAssembler.h:
+ (JSC::AbstractMacroAssembler::DataLabelCompact::DataLabelCompact):
+ (JSC::AbstractMacroAssembler::differenceBetween):
+ (JSC::AbstractMacroAssembler::repatchCompact):
+ * assembler/CodeLocation.h:
+ (JSC::CodeLocationDataLabelCompact::CodeLocationDataLabelCompact):
+ (JSC::CodeLocationCommon::dataLabelCompactAtOffset):
+ * assembler/LinkBuffer.h:
+ (JSC::LinkBuffer::locationOf):
+ * assembler/MIPSAssembler.h:
+ (JSC::MIPSAssembler::repatchCompact):
+ * assembler/MacroAssembler.h:
+ (JSC::MacroAssembler::loadPtrWithCompactAddressOffsetPatch):
+ * assembler/MacroAssemblerARM.h:
+ (JSC::MacroAssemblerARM::load32WithCompactAddressOffsetPatch):
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch):
+ * assembler/MacroAssemblerMIPS.h:
+ (JSC::MacroAssemblerMIPS::load32WithCompactAddressOffsetPatch):
+ * assembler/MacroAssemblerSH4.h:
+ (JSC::MacroAssemblerSH4::load32WithAddressOffsetPatch):
+ * assembler/MacroAssemblerX86.h:
+ (JSC::MacroAssemblerX86::repatchCompact):
+ * assembler/MacroAssemblerX86Common.h:
+ (JSC::MacroAssemblerX86Common::loadCompactWithAddressOffsetPatch):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::loadPtrWithCompactAddressOffsetPatch):
+ * assembler/RepatchBuffer.h:
+ (JSC::RepatchBuffer::repatch):
+ * assembler/SH4Assembler.h:
+ (JSC::SH4Assembler::repatchCompact):
+ * assembler/X86Assembler.h:
+ (JSC::X86Assembler::movl_mr_disp8):
+ (JSC::X86Assembler::movq_mr_disp8):
+ (JSC::X86Assembler::repatchCompact):
+ (JSC::X86Assembler::setInt8):
+ (JSC::X86Assembler::X86InstructionFormatter::oneByteOp_disp8):
+ (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64_disp8):
+ (JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
+ * jit/JIT.h:
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::compileGetByIdHotPath):
+ (JSC::JIT::emit_op_put_by_id):
+ (JSC::JIT::patchGetByIdSelf):
+ * jit/JITPropertyAccess32_64.cpp:
+ (JSC::JIT::compileGetByIdHotPath):
+ (JSC::JIT::emit_op_put_by_id):
+ (JSC::JIT::patchGetByIdSelf):
+ * jit/JITStubs.cpp:
+ (JSC::JITThunks::tryCacheGetByID):
+
2011-05-16 Sheriff Bot <[email protected]>
Unreviewed, rolling out r86653.
Modified: trunk/Source/_javascript_Core/assembler/ARMAssembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/ARMAssembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/ARMAssembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -744,6 +744,11 @@
{
patchPointerInternal(reinterpret_cast<intptr_t>(from), reinterpret_cast<void*>(to));
}
+
+ static void repatchCompact(void* where, int32_t value)
+ {
+ repatchInt32(where, value);
+ }
static void repatchPointer(void* from, void* to)
{
Modified: trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -1748,6 +1748,11 @@
setInt32(where, value);
}
+
+ static void repatchCompact(void* where, int32_t value)
+ {
+ repatchInt32(where, value);
+ }
static void repatchPointer(void* where, void* value)
{
Modified: trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/AbstractMacroAssembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -304,10 +304,39 @@
{
}
+ AssemblerLabel label() const { return m_label; }
+
private:
AssemblerLabel m_label;
};
+ // DataLabelCompact:
+ //
+ // A DataLabelCompact is used to refer to a location in the code containing a
+ // compact immediate to be patched after the code has been generated.
+ class DataLabelCompact {
+ template<class TemplateAssemblerType>
+ friend class AbstractMacroAssembler;
+ friend class LinkBuffer;
+ public:
+ DataLabelCompact()
+ {
+ }
+
+ DataLabelCompact(AbstractMacroAssembler<AssemblerType>* masm)
+ : m_label(masm->m_assembler.label())
+ {
+ }
+
+ DataLabelCompact(AssemblerLabel label)
+ : m_label(label)
+ {
+ }
+
+ private:
+ AssemblerLabel m_label;
+ };
+
// Call:
//
// A Call object is a reference to a call instruction that has been planted
@@ -500,6 +529,11 @@
{
return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label);
}
+
+ ptrdiff_t differenceBetween(Label from, DataLabelCompact to)
+ {
+ return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label);
+ }
ptrdiff_t differenceBetween(DataLabelPtr from, Jump to)
{
@@ -564,6 +598,11 @@
AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress());
}
+ static void repatchCompact(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
+ {
+ AssemblerType::repatchCompact(dataLabelCompact.dataLocation(), value);
+ }
+
static void repatchInt32(CodeLocationDataLabel32 dataLabel32, int32_t value)
{
AssemblerType::repatchInt32(dataLabel32.dataLocation(), value);
Modified: trunk/Source/_javascript_Core/assembler/CodeLocation.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/CodeLocation.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/CodeLocation.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -37,6 +37,7 @@
class CodeLocationJump;
class CodeLocationCall;
class CodeLocationNearCall;
+class CodeLocationDataLabelCompact;
class CodeLocationDataLabel32;
class CodeLocationDataLabelPtr;
@@ -60,6 +61,7 @@
CodeLocationNearCall nearCallAtOffset(int offset);
CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset);
CodeLocationDataLabel32 dataLabel32AtOffset(int offset);
+ CodeLocationDataLabelCompact dataLabelCompactAtOffset(int offset);
protected:
CodeLocationCommon()
@@ -126,6 +128,15 @@
: CodeLocationCommon(MacroAssemblerCodePtr(location)) {}
};
+class CodeLocationDataLabelCompact : public CodeLocationCommon {
+public:
+ CodeLocationDataLabelCompact() { }
+ explicit CodeLocationDataLabelCompact(MacroAssemblerCodePtr location)
+ : CodeLocationCommon(location) { }
+ explicit CodeLocationDataLabelCompact(void* location)
+ : CodeLocationCommon(MacroAssemblerCodePtr(location)) { }
+};
+
class CodeLocationDataLabelPtr : public CodeLocationCommon {
public:
CodeLocationDataLabelPtr() {}
@@ -177,6 +188,12 @@
return CodeLocationDataLabel32(reinterpret_cast<char*>(dataLocation()) + offset);
}
+inline CodeLocationDataLabelCompact CodeLocationCommon::dataLabelCompactAtOffset(int offset)
+{
+ ASSERT_VALID_CODE_OFFSET(offset);
+ return CodeLocationDataLabelCompact(reinterpret_cast<char*>(dataLocation()) + offset);
+}
+
} // namespace JSC
#endif // ENABLE(ASSEMBLER)
Modified: trunk/Source/_javascript_Core/assembler/LinkBuffer.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/LinkBuffer.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/LinkBuffer.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -58,6 +58,7 @@
typedef MacroAssembler::Jump Jump;
typedef MacroAssembler::JumpList JumpList;
typedef MacroAssembler::Call Call;
+ typedef MacroAssembler::DataLabelCompact DataLabelCompact;
typedef MacroAssembler::DataLabel32 DataLabel32;
typedef MacroAssembler::DataLabelPtr DataLabelPtr;
#if ENABLE(BRANCH_COMPACTION)
@@ -158,6 +159,11 @@
{
return CodeLocationDataLabel32(MacroAssembler::getLinkerAddress(code(), applyOffset(label.m_label)));
}
+
+ CodeLocationDataLabelCompact locationOf(DataLabelCompact label)
+ {
+ return CodeLocationDataLabelCompact(MacroAssembler::getLinkerAddress(code(), applyOffset(label.m_label)));
+ }
// This method obtains the return address of the call, given as an offset from
// the start of the code.
Modified: trunk/Source/_javascript_Core/assembler/MIPSAssembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MIPSAssembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MIPSAssembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -745,6 +745,11 @@
insn--;
ExecutableAllocator::cacheFlush(insn, 2 * sizeof(MIPSWord));
}
+
+ static void repatchCompact(void* where, int32_t value)
+ {
+ repatchInt32(where, value);
+ }
static void repatchPointer(void* from, void* to)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -235,6 +235,11 @@
{
return load32WithAddressOffsetPatch(address, dest);
}
+
+ DataLabelCompact loadPtrWithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ return load32WithCompactAddressOffsetPatch(address, dest);
+ }
void comparePtr(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -41,6 +41,7 @@
COMPILE_ASSERT(!(DoubleConditionBitSpecial & DoubleConditionMask), DoubleConditionBitSpecial_should_not_interfere_with_ARMAssembler_Condition_codes);
public:
typedef ARMRegisters::FPRegisterID FPRegisterID;
+ static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
enum RelationalCondition {
Equal = ARMAssembler::EQ,
@@ -273,6 +274,13 @@
m_assembler.dtr_ur(true, dest, address.base, ARMRegisters::S0);
return dataLabel;
}
+
+ DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ DataLabelCompact dataLabel(this);
+ load32WithAddressOffsetPatch(address, dest);
+ return dataLabel;
+ }
void load16(BaseIndex address, RegisterID dest)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -48,6 +48,7 @@
typedef ARMv7Assembler::LinkRecord LinkRecord;
typedef ARMv7Assembler::JumpType JumpType;
typedef ARMv7Assembler::JumpLinkType JumpLinkType;
+ static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
MacroAssemblerARMv7()
: m_inUninterruptedSequence(false)
@@ -481,6 +482,12 @@
load32(ArmAddress(address.base, dataTempRegister), dest);
return label;
}
+
+ DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ DataLabel32 label = load32WithAddressOffsetPatch(address, dest);
+ return DataLabelCompact(label.label());
+ }
void load16(BaseIndex address, RegisterID dest)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -57,6 +57,8 @@
// FP temp register
static const FPRegisterID fpTempRegister = MIPSRegisters::f16;
+ static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
+
enum RelationalCondition {
Equal,
NotEqual,
@@ -610,6 +612,13 @@
m_fixedWidth = false;
return dataLabel;
}
+
+ DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ DataLabelCompact dataLabel(this);
+ load32WithAddressOffsetPatch(address, dest);
+ return dataLabel;
+ }
/* Need to use zero-extened load half-word for load16. */
void load16(ImplicitAddress address, RegisterID dest)
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerSH4.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -45,6 +45,8 @@
static const RegisterID linkRegister = SH4Registers::pr;
static const RegisterID scratchReg3 = SH4Registers::r13;
+ static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF;
+
enum RelationalCondition {
Equal = SH4Assembler::EQ,
NotEqual = SH4Assembler::NE,
@@ -732,6 +734,17 @@
releaseScratch(scr);
return label;
}
+
+ DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ RegisterID scr = claimScratch();
+ DataLabelCompact label(this);
+ m_assembler.loadConstantUnReusable(address.offset, scr);
+ m_assembler.addlRegReg(address.base, scr);
+ m_assembler.movlMemReg(scr, dest);
+ releaseScratch(scr);
+ return label;
+ }
DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -40,6 +40,8 @@
public:
typedef X86Assembler::FPRegisterID FPRegisterID;
+
+ static const int MaximumCompactPtrAlignedAddressOffset = 127;
enum RelationalCondition {
Equal = X86Assembler::ConditionE,
@@ -448,6 +450,25 @@
m_assembler.movl_mr_disp32(address.offset, address.base, dest);
return DataLabel32(this);
}
+
+ DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ m_assembler.movl_mr_disp8(address.offset, address.base, dest);
+ return DataLabelCompact(this);
+ }
+
+ static void repatchCompact(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
+ {
+ ASSERT(value >= 0);
+ ASSERT(value < MaximumCompactPtrAlignedAddressOffset);
+ AssemblerType_T::repatchCompact(dataLabelCompact.dataLocation(), value);
+ }
+
+ DataLabelCompact loadCompactWithAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ m_assembler.movl_mr_disp8(address.offset, address.base, dest);
+ return DataLabelCompact(this);
+ }
void load16(BaseIndex address, RegisterID dest)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -268,6 +268,12 @@
m_assembler.movq_mr_disp32(address.offset, address.base, dest);
return DataLabel32(this);
}
+
+ DataLabelCompact loadPtrWithCompactAddressOffsetPatch(Address address, RegisterID dest)
+ {
+ m_assembler.movq_mr_disp8(address.offset, address.base, dest);
+ return DataLabelCompact(this);
+ }
void storePtr(RegisterID src, ImplicitAddress address)
{
Modified: trunk/Source/_javascript_Core/assembler/RepatchBuffer.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/RepatchBuffer.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/RepatchBuffer.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -87,6 +87,11 @@
MacroAssembler::repatchInt32(dataLabel32, value);
}
+ void repatch(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
+ {
+ MacroAssembler::repatchCompact(dataLabelCompact, value);
+ }
+
void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value)
{
MacroAssembler::repatchPointer(dataLabelPtr, value);
Modified: trunk/Source/_javascript_Core/assembler/SH4Assembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/SH4Assembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/SH4Assembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -1352,6 +1352,11 @@
changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, value);
}
+ static void repatchCompact(void* where, int32_t value)
+ {
+ repatchInt32(where, value);
+ }
+
static void relinkCall(void* from, void* to)
{
uint16_t* instructionPtr = reinterpret_cast<uint16_t*>(from);
Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (86698 => 86699)
--- trunk/Source/_javascript_Core/assembler/X86Assembler.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -1019,6 +1019,11 @@
{
m_formatter.oneByteOp_disp32(OP_MOV_GvEv, dst, base, offset);
}
+
+ void movl_mr_disp8(int offset, RegisterID base, RegisterID dst)
+ {
+ m_formatter.oneByteOp_disp8(OP_MOV_GvEv, dst, base, offset);
+ }
void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
{
@@ -1090,6 +1095,11 @@
m_formatter.oneByteOp64_disp32(OP_MOV_GvEv, dst, base, offset);
}
+ void movq_mr_disp8(int offset, RegisterID base, RegisterID dst)
+ {
+ m_formatter.oneByteOp64_disp8(OP_MOV_GvEv, dst, base, offset);
+ }
+
void movq_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
{
m_formatter.oneByteOp64(OP_MOV_GvEv, dst, base, index, scale, offset);
@@ -1537,6 +1547,13 @@
{
setRel32(from, to);
}
+
+ static void repatchCompact(void* where, int32_t value)
+ {
+ ASSERT(value >= 0);
+ ASSERT(value <= std::numeric_limits<int8_t>::max());
+ setInt8(where, value);
+ }
static void repatchInt32(void* where, int32_t value)
{
@@ -1587,6 +1604,11 @@
{
reinterpret_cast<int32_t*>(where)[-1] = value;
}
+
+ static void setInt8(void* where, int8_t value)
+ {
+ reinterpret_cast<int8_t*>(where)[-1] = value;
+ }
static void setRel32(void* from, void* to)
{
@@ -1661,6 +1683,14 @@
m_buffer.putByteUnchecked(opcode);
memoryModRM_disp32(reg, base, offset);
}
+
+ void oneByteOp_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset)
+ {
+ m_buffer.ensureSpace(maxInstructionSize);
+ emitRexIfNeeded(reg, 0, base);
+ m_buffer.putByteUnchecked(opcode);
+ memoryModRM_disp8(reg, base, offset);
+ }
void oneByteOp(OneByteOpcodeID opcode, int reg, RegisterID base, RegisterID index, int scale, int offset)
{
@@ -1767,6 +1797,14 @@
m_buffer.putByteUnchecked(opcode);
memoryModRM_disp32(reg, base, offset);
}
+
+ void oneByteOp64_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset)
+ {
+ m_buffer.ensureSpace(maxInstructionSize);
+ emitRexW(reg, 0, base);
+ m_buffer.putByteUnchecked(opcode);
+ memoryModRM_disp8(reg, base, offset);
+ }
void oneByteOp64(OneByteOpcodeID opcode, int reg, RegisterID base, RegisterID index, int scale, int offset)
{
@@ -1999,7 +2037,24 @@
}
}
}
-
+
+ void memoryModRM_disp8(int reg, RegisterID base, int offset)
+ {
+ // A base of esp or r12 would be interpreted as a sib, so force a sib with no index & put the base in there.
+ ASSERT(CAN_SIGN_EXTEND_8_32(offset));
+#if CPU(X86_64)
+ if ((base == hasSib) || (base == hasSib2)) {
+#else
+ if (base == hasSib) {
+#endif
+ putModRmSib(ModRmMemoryDisp8, reg, base, noIndex, 0);
+ m_buffer.putByteUnchecked(offset);
+ } else {
+ putModRm(ModRmMemoryDisp8, reg, base);
+ m_buffer.putByteUnchecked(offset);
+ }
+ }
+
void memoryModRM_disp32(int reg, RegisterID base, int offset)
{
// A base of esp or r12 would be interpreted as a sib, so force a sib with no index & put the base in there.
Modified: trunk/Source/_javascript_Core/jit/JIT.h (86698 => 86699)
--- trunk/Source/_javascript_Core/jit/JIT.h 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2011-05-17 20:02:41 UTC (rev 86699)
@@ -174,9 +174,10 @@
using MacroAssembler::Label;
static const int patchGetByIdDefaultStructure = -1;
+ static const int patchGetByIdDefaultOffset = 0;
// Magic number - initial offset cannot be representable as a signed 8bit value, or the X86Assembler
// will compress the displacement, and we may not be able to fit a patched offset.
- static const int patchGetByIdDefaultOffset = 256;
+ static const int patchPutByIdDefaultOffset = 256;
public:
static JITCode compile(JSGlobalData* globalData, CodeBlock* codeBlock, CodePtr* functionEntryArityCheck = 0)
@@ -349,9 +350,9 @@
// These architecture specific value are used to enable patching - see comment on op_get_by_id.
static const int patchOffsetGetByIdStructure = 7;
static const int patchOffsetGetByIdBranchToSlowCase = 13;
- static const int patchOffsetGetByIdPropertyMapOffset1 = 22;
- static const int patchOffsetGetByIdPropertyMapOffset2 = 28;
- static const int patchOffsetGetByIdPutResult = 28;
+ static const int patchOffsetGetByIdPropertyMapOffset1 = 19;
+ static const int patchOffsetGetByIdPropertyMapOffset2 = 22;
+ static const int patchOffsetGetByIdPutResult = 22;
#if ENABLE(OPCODE_SAMPLING)
static const int patchOffsetGetByIdSlowCaseCall = 37;
#else
@@ -584,8 +585,8 @@
// 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 = 20;
- static const int patchOffsetGetByIdPropertyMapOffset = 31;
- static const int patchOffsetGetByIdPutResult = 31;
+ static const int patchOffsetGetByIdPropertyMapOffset = 28;
+ static const int patchOffsetGetByIdPutResult = 28;
#if ENABLE(OPCODE_SAMPLING)
static const int patchOffsetGetByIdSlowCaseCall = 64;
#else
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (86698 => 86699)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2011-05-17 20:02:41 UTC (rev 86699)
@@ -420,7 +420,7 @@
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, structureCheck), patchOffsetGetByIdBranchToSlowCase)
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSObject, m_propertyStorage)), regT0);
- DataLabel32 displacementLabel = loadPtrWithAddressOffsetPatch(Address(regT0, patchGetByIdDefaultOffset), regT0);
+ DataLabelCompact displacementLabel = loadPtrWithCompactAddressOffsetPatch(Address(regT0, patchGetByIdDefaultOffset), regT0);
ASSERT_JIT_OFFSET_UNUSED(displacementLabel, differenceBetween(hotPathBegin, displacementLabel), patchOffsetGetByIdPropertyMapOffset);
Label putResult(this);
@@ -496,7 +496,7 @@
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, structureToCompare), patchOffsetPutByIdStructure);
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSObject, m_propertyStorage)), regT0);
- DataLabel32 displacementLabel = storePtrWithAddressOffsetPatch(regT1, Address(regT0, patchGetByIdDefaultOffset));
+ DataLabel32 displacementLabel = storePtrWithAddressOffsetPatch(regT1, Address(regT0, patchPutByIdDefaultOffset));
END_UNINTERRUPTED_SEQUENCE(sequencePutById);
@@ -628,7 +628,7 @@
// Patch the offset into the propoerty map to load from, then patch the Structure to look for.
repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetGetByIdStructure), structure);
- repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset), offset);
+ repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelCompactAtOffset(patchOffsetGetByIdPropertyMapOffset), offset);
}
void JIT::patchMethodCallProto(JSGlobalData& globalData, CodeBlock* codeBlock, MethodCallLinkInfo& methodCallLinkInfo, JSFunction* callee, Structure* structure, JSObject* proto, ReturnAddressPtr returnAddress)
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (86698 => 86699)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2011-05-17 20:02:41 UTC (rev 86699)
@@ -435,9 +435,9 @@
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, structureCheck), patchOffsetGetByIdBranchToSlowCase);
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSObject, m_propertyStorage)), regT2);
- DataLabel32 displacementLabel1 = loadPtrWithAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT0); // payload
+ DataLabelCompact displacementLabel1 = loadPtrWithCompactAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT0); // payload
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, displacementLabel1), patchOffsetGetByIdPropertyMapOffset1);
- DataLabel32 displacementLabel2 = loadPtrWithAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT1); // tag
+ DataLabelCompact displacementLabel2 = loadPtrWithCompactAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT1); // tag
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, displacementLabel2), patchOffsetGetByIdPropertyMapOffset2);
Label putResult(this);
@@ -509,8 +509,8 @@
ASSERT_JIT_OFFSET(differenceBetween(hotPathBegin, structureToCompare), patchOffsetPutByIdStructure);
loadPtr(Address(regT0, OBJECT_OFFSETOF(JSObject, m_propertyStorage)), regT0);
- DataLabel32 displacementLabel1 = storePtrWithAddressOffsetPatch(regT2, Address(regT0, patchGetByIdDefaultOffset)); // payload
- DataLabel32 displacementLabel2 = storePtrWithAddressOffsetPatch(regT3, Address(regT0, patchGetByIdDefaultOffset)); // tag
+ DataLabel32 displacementLabel1 = storePtrWithAddressOffsetPatch(regT2, Address(regT0, patchPutByIdDefaultOffset)); // payload
+ DataLabel32 displacementLabel2 = storePtrWithAddressOffsetPatch(regT3, Address(regT0, patchPutByIdDefaultOffset)); // tag
END_UNINTERRUPTED_SEQUENCE(sequencePutById);
@@ -651,8 +651,8 @@
// Patch the offset into the propoerty map to load from, then patch the Structure to look for.
repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetGetByIdStructure), structure);
- repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset1), offset + OBJECT_OFFSETOF(JSValue, u.asBits.payload)); // payload
- repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset2), offset + OBJECT_OFFSETOF(JSValue, u.asBits.tag)); // tag
+ repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelCompactAtOffset(patchOffsetGetByIdPropertyMapOffset1), offset + OBJECT_OFFSETOF(JSValue, u.asBits.payload)); // payload
+ repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelCompactAtOffset(patchOffsetGetByIdPropertyMapOffset2), offset + OBJECT_OFFSETOF(JSValue, u.asBits.tag)); // tag
}
void JIT::patchMethodCallProto(JSGlobalData& globalData, CodeBlock* codeBlock, MethodCallLinkInfo& methodCallLinkInfo, JSFunction* callee, Structure* structure, JSObject* proto, ReturnAddressPtr returnAddress)
Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (86698 => 86699)
--- trunk/Source/_javascript_Core/jit/JITStubs.cpp 2011-05-17 19:45:24 UTC (rev 86698)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp 2011-05-17 20:02:41 UTC (rev 86699)
@@ -897,7 +897,7 @@
if (slot.slotBase() == baseValue) {
// set this up, so derefStructures can do it's job.
stubInfo->initGetByIdSelf(callFrame->globalData(), codeBlock->ownerExecutable(), structure);
- if (slot.cachedPropertyType() != PropertySlot::Value)
+ if ((slot.cachedPropertyType() != PropertySlot::Value) || ((slot.cachedOffset() * sizeof(JSValue)) > (unsigned)MacroAssembler::MaximumCompactPtrAlignedAddressOffset))
ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_self_fail));
else
JIT::patchGetByIdSelf(codeBlock, stubInfo, structure, slot.cachedOffset(), returnAddress);
Added: trunk/Source/_javascript_Core.xcworkspace/contents.xcworkspacedata (0 => 86699)
--- trunk/Source/_javascript_Core.xcworkspace/contents.xcworkspacedata (rev 0)
+++ trunk/Source/_javascript_Core.xcworkspace/contents.xcworkspacedata 2011-05-17 20:02:41 UTC (rev 86699)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "container:_javascript_Core/_javascript_Core.xcodeproj">
+ </FileRef>
+</Workspace>