From bd955caf35876f15a94d2445ff3e8861941ead48 Mon Sep 17 00:00:00 2001 From: "yoli@rim.com" Date: Tue, 20 Nov 2012 16:32:32 +0000 Subject: [PATCH] [CherryPick] [ARMv7] Neither linkCall() nor linkPointer() should flush code. [Title] [ARMv7] Neither linkCall() nor linkPointer() should flush code. [Issue#] N/A [Problem] Speed up for SunSpider benchmark [Cause] N/A [Solution] N/A [CherryPicker] Han HoJong Change-Id: Id3a6b1e74fcbbb86a578b3f07a025cef66f45ffc --- Source/JavaScriptCore/ChangeLog | 25 ++++++++++++++++++++++++ Source/JavaScriptCore/assembler/ARMv7Assembler.h | 23 +++++++++++----------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 57d0620..8e76043 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,28 @@ +2012-11-20 Yong Li + + [ARMv7] Neither linkCall() nor linkPointer() should flush code. + https://bugs.webkit.org/show_bug.cgi?id=99213 + + Reviewed by George Staikos. + + LinkBuffer doesn't need to flush code during linking. It will + eventually flush the whole executable. Fixing this gives >%5 + sunspider boost (on QNX). + + Also make replaceWithLoad() and replaceWithAddressComputation() flush + only when necessary. + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::linkCall): + (JSC::ARMv7Assembler::linkPointer): + (JSC::ARMv7Assembler::relinkCall): + (JSC::ARMv7Assembler::repatchInt32): + (JSC::ARMv7Assembler::repatchPointer): + (JSC::ARMv7Assembler::replaceWithLoad): Flush only after it did write. + (JSC::ARMv7Assembler::replaceWithAddressComputation): Flush only after it did write. + (JSC::ARMv7Assembler::setInt32): + (JSC::ARMv7Assembler::setPointer): + 2012-08-30 Byungwoo Lee Build warning : -Wsign-compare on DFGByteCodeParser.cpp. diff --git a/Source/JavaScriptCore/assembler/ARMv7Assembler.h b/Source/JavaScriptCore/assembler/ARMv7Assembler.h index f81fde5..6e7a1c1 100644 --- a/Source/JavaScriptCore/assembler/ARMv7Assembler.h +++ b/Source/JavaScriptCore/assembler/ARMv7Assembler.h @@ -2061,12 +2061,12 @@ public: ASSERT(from.isSet()); ASSERT(reinterpret_cast(to) & 1); - setPointer(reinterpret_cast(reinterpret_cast(code) + from.m_offset) - 1, to); + setPointer(reinterpret_cast(reinterpret_cast(code) + from.m_offset) - 1, to, false); } static void linkPointer(void* code, AssemblerLabel where, void* value) { - setPointer(reinterpret_cast(code) + where.m_offset, value); + setPointer(reinterpret_cast(code) + where.m_offset, value, false); } static void relinkJump(void* from, void* to) @@ -2084,7 +2084,7 @@ public: ASSERT(!(reinterpret_cast(from) & 1)); ASSERT(reinterpret_cast(to) & 1); - setPointer(reinterpret_cast(from) - 1, to); + setPointer(reinterpret_cast(from) - 1, to, true); } static void* readCallTarget(void* from) @@ -2096,7 +2096,7 @@ public: { ASSERT(!(reinterpret_cast(where) & 1)); - setInt32(where, value); + setInt32(where, value, true); } static void repatchCompact(void* where, int32_t offset) @@ -2123,7 +2123,7 @@ public: { ASSERT(!(reinterpret_cast(where) & 1)); - setPointer(where, value); + setPointer(where, value, true); } static void* readPointer(void* where) @@ -2168,11 +2168,11 @@ public: ptr[0] |= OP_LDR_imm_T3; ptr[1] |= (ptr[1] & 0x0F00) << 4; ptr[1] &= 0xF0FF; + cacheFlush(ptr, sizeof(uint16_t) * 2); break; default: ASSERT_NOT_REACHED(); } - cacheFlush(ptr, sizeof(uint16_t) * 2); } static void replaceWithAddressComputation(void* instructionStart) @@ -2186,13 +2186,13 @@ public: ptr[0] |= OP_ADD_imm_T3; ptr[1] |= (ptr[1] & 0xF000) >> 4; ptr[1] &= 0x0FFF; + cacheFlush(ptr, sizeof(uint16_t) * 2); break; case OP_ADD_imm_T3: break; default: ASSERT_NOT_REACHED(); } - cacheFlush(ptr, sizeof(uint16_t) * 2); } unsigned debugOffset() { return m_formatter.debugOffset(); } @@ -2313,7 +2313,7 @@ private: return VFPOperand(op); } - static void setInt32(void* code, uint32_t value) + static void setInt32(void* code, uint32_t value, bool flush) { uint16_t* location = reinterpret_cast(code); ASSERT(isMOV_imm_T3(location - 4) && isMOVT(location - 2)); @@ -2325,7 +2325,8 @@ private: location[-2] = twoWordOp5i6Imm4Reg4EncodedImmFirst(OP_MOVT, hi16); location[-1] = twoWordOp5i6Imm4Reg4EncodedImmSecond((location[-1] >> 8) & 0xf, hi16); - cacheFlush(location - 4, 4 * sizeof(uint16_t)); + if (flush) + cacheFlush(location - 4, 4 * sizeof(uint16_t)); } static int32_t readInt32(void* code) @@ -2356,9 +2357,9 @@ private: cacheFlush(location, sizeof(uint16_t)); } - static void setPointer(void* code, void* value) + static void setPointer(void* code, void* value, bool flush) { - setInt32(code, reinterpret_cast(value)); + setInt32(code, reinterpret_cast(value), flush); } static bool isB(void* address) -- 2.7.4