summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/assembler
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-07-24 17:03:20 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-07-24 17:03:20 +0200
commit08d4a74d56ca431877819fc4566e27eafe150342 (patch)
treeebd8530838ab390c015c6b7e659a22852c1663ae /Source/JavaScriptCore/assembler
parent1de6cd4794bbd5a52189384189a2b8df1848b39b (diff)
downloadqtwebkit-08d4a74d56ca431877819fc4566e27eafe150342.tar.gz
Imported WebKit commit 0fbd41c4e13f5a190faf160bf993eee614e6e18e (http://svn.webkit.org/repository/webkit/trunk@123477)
New snapshot that adapts to latest Qt API changes
Diffstat (limited to 'Source/JavaScriptCore/assembler')
-rw-r--r--Source/JavaScriptCore/assembler/ARMv7Assembler.h21
-rw-r--r--Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h26
-rw-r--r--Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h8
-rw-r--r--Source/JavaScriptCore/assembler/X86Assembler.h2
4 files changed, 31 insertions, 26 deletions
diff --git a/Source/JavaScriptCore/assembler/ARMv7Assembler.h b/Source/JavaScriptCore/assembler/ARMv7Assembler.h
index 96c4f096c..e9b9fcc50 100644
--- a/Source/JavaScriptCore/assembler/ARMv7Assembler.h
+++ b/Source/JavaScriptCore/assembler/ARMv7Assembler.h
@@ -2095,11 +2095,24 @@ public:
setInt32(where, value);
}
- static void repatchCompact(void* where, int32_t value)
+ static void repatchCompact(void* where, int32_t offset)
{
- ASSERT(value >= 0);
- ASSERT(ARMThumbImmediate::makeUInt12(value).isUInt7());
- setUInt7ForLoad(where, ARMThumbImmediate::makeUInt12(value));
+ ASSERT(offset >= -255 && offset <= 255);
+
+ bool add = true;
+ if (offset < 0) {
+ add = false;
+ offset = -offset;
+ }
+
+ offset |= (add << 9);
+ offset |= (1 << 10);
+ offset |= (1 << 11);
+
+ uint16_t* location = reinterpret_cast<uint16_t*>(where);
+ location[1] &= ~((1 << 12) - 1);
+ location[1] |= offset;
+ cacheFlush(location, sizeof(uint16_t) * 2);
}
static void repatchPointer(void* where, void* value)
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
index cf6f02ca9..183e8f980 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
@@ -53,10 +53,12 @@ public:
typedef ARMv7Assembler::LinkRecord LinkRecord;
typedef ARMv7Assembler::JumpType JumpType;
typedef ARMv7Assembler::JumpLinkType JumpLinkType;
- // Magic number is the biggest useful offset we can get on ARMv7 with
- // a LDR_imm_T2 encoding
- static const int MaximumCompactPtrAlignedAddressOffset = 124;
-
+
+ static bool isCompactPtrAlignedAddressOffset(ptrdiff_t value)
+ {
+ return value >= -255 && value <= 255;
+ }
+
Vector<LinkRecord>& jumpsToLink() { return m_assembler.jumpsToLink(); }
void* unlinkedCode() { return m_assembler.unlinkedCode(); }
bool canCompact(JumpType jumpType) { return m_assembler.canCompact(jumpType); }
@@ -642,26 +644,14 @@ public:
return label;
}
- // FIXME: we should be able to plant a compact load relative to/from any base/dest register.
DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
{
RegisterID base = address.base;
- if (base >= ARMRegisters::r8) {
- move(base, addressTempRegister);
- base = addressTempRegister;
- }
-
DataLabelCompact label(this);
- ASSERT(address.offset >= 0);
- ASSERT(address.offset <= MaximumCompactPtrAlignedAddressOffset);
- ASSERT(ARMThumbImmediate::makeUInt12(address.offset).isUInt7());
+ ASSERT(isCompactPtrAlignedAddressOffset(address.offset));
- if (dest >= ARMRegisters::r8) {
- m_assembler.ldrCompact(addressTempRegister, base, ARMThumbImmediate::makeUInt12(address.offset));
- move(addressTempRegister, dest);
- } else
- m_assembler.ldrCompact(dest, base, ARMThumbImmediate::makeUInt12(address.offset));
+ m_assembler.ldr(dest, base, address.offset, true, false);
return label;
}
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
index 432489dbc..115b337f7 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
@@ -47,7 +47,10 @@ public:
typedef X86Assembler::FPRegisterID FPRegisterID;
typedef X86Assembler::XMMRegisterID XMMRegisterID;
- static const int MaximumCompactPtrAlignedAddressOffset = 127;
+ static bool isCompactPtrAlignedAddressOffset(ptrdiff_t value)
+ {
+ return value >= -128 && value <= 127;
+ }
enum RelationalCondition {
Equal = X86Assembler::ConditionE,
@@ -494,8 +497,7 @@ public:
static void repatchCompact(CodeLocationDataLabelCompact dataLabelCompact, int32_t value)
{
- ASSERT(value >= 0);
- ASSERT(value < MaximumCompactPtrAlignedAddressOffset);
+ ASSERT(isCompactPtrAlignedAddressOffset(value));
AssemblerType_T::repatchCompact(dataLabelCompact.dataLocation(), value);
}
diff --git a/Source/JavaScriptCore/assembler/X86Assembler.h b/Source/JavaScriptCore/assembler/X86Assembler.h
index fc1c27245..adaee4bc0 100644
--- a/Source/JavaScriptCore/assembler/X86Assembler.h
+++ b/Source/JavaScriptCore/assembler/X86Assembler.h
@@ -1829,7 +1829,7 @@ public:
static void repatchCompact(void* where, int32_t value)
{
- ASSERT(value >= 0);
+ ASSERT(value >= std::numeric_limits<int8_t>::min());
ASSERT(value <= std::numeric_limits<int8_t>::max());
setInt8(where, value);
}