diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2017-02-06 11:24:40 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-02-08 12:20:54 +0000 |
commit | 32e24c58664f8e864e591fa03ea86418f0cf0674 (patch) | |
tree | 7ec222f6b89fd89dac35644cf3779d1e82bc64f2 /src/3rdparty/masm | |
parent | be92f31b7eb2a689c8a12fc0e193878a84c4532e (diff) |
Fix ARM64 build
Add the ARM64 assembler to cross-compilation.
Task-number: QTBUG-58568
Change-Id: I91461ebf79fb83e31e8ae2962ab0e155d308281a
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/3rdparty/masm')
-rw-r--r-- | src/3rdparty/masm/assembler/ARM64Assembler.h | 139 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/ARMv7Assembler.h | 3 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/AbstractMacroAssembler.h | 6 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/LinkBuffer.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssembler.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerARM64.h | 43 |
6 files changed, 156 insertions, 39 deletions
diff --git a/src/3rdparty/masm/assembler/ARM64Assembler.h b/src/3rdparty/masm/assembler/ARM64Assembler.h index ad5acdbb85..7390997af1 100644 --- a/src/3rdparty/masm/assembler/ARM64Assembler.h +++ b/src/3rdparty/masm/assembler/ARM64Assembler.h @@ -26,9 +26,10 @@ #ifndef ARM64Assembler_h #define ARM64Assembler_h -#if ENABLE(ASSEMBLER) && CPU(ARM64) +#if ENABLE(ASSEMBLER) && (CPU(ARM64) || defined(V4_BOOTSTRAP)) #include "AssemblerBuffer.h" +#include "AbstractMacroAssembler.h" #include <limits.h> #include <wtf/Assertions.h> #include <wtf/Vector.h> @@ -520,8 +521,8 @@ typedef enum { #undef DECLARE_REGISTER } FPRegisterID; -static constexpr bool isSp(RegisterID reg) { return reg == sp; } -static constexpr bool isZr(RegisterID reg) { return reg == zr; } +static Q_DECL_CONSTEXPR bool isSp(RegisterID reg) { return reg == sp; } +static Q_DECL_CONSTEXPR bool isZr(RegisterID reg) { return reg == zr; } } // namespace ARM64Registers @@ -530,15 +531,15 @@ public: typedef ARM64Registers::RegisterID RegisterID; typedef ARM64Registers::FPRegisterID FPRegisterID; - static constexpr RegisterID firstRegister() { return ARM64Registers::x0; } - static constexpr RegisterID lastRegister() { return ARM64Registers::sp; } + static Q_DECL_CONSTEXPR RegisterID firstRegister() { return ARM64Registers::x0; } + static Q_DECL_CONSTEXPR RegisterID lastRegister() { return ARM64Registers::sp; } - static constexpr FPRegisterID firstFPRegister() { return ARM64Registers::q0; } - static constexpr FPRegisterID lastFPRegister() { return ARM64Registers::q31; } + static Q_DECL_CONSTEXPR FPRegisterID firstFPRegister() { return ARM64Registers::q0; } + static Q_DECL_CONSTEXPR FPRegisterID lastFPRegister() { return ARM64Registers::q31; } private: - static constexpr bool isSp(RegisterID reg) { return ARM64Registers::isSp(reg); } - static constexpr bool isZr(RegisterID reg) { return ARM64Registers::isZr(reg); } + static Q_DECL_CONSTEXPR bool isSp(RegisterID reg) { return ARM64Registers::isSp(reg); } + static Q_DECL_CONSTEXPR bool isZr(RegisterID reg) { return ARM64Registers::isZr(reg); } public: ARM64Assembler() @@ -546,7 +547,7 @@ public: , m_indexOfTailOfLastWatchpoint(INT_MIN) { } - + AssemblerBuffer& buffer() { return m_buffer; } // (HS, LO, HI, LS) -> (AE, B, A, BE) @@ -653,9 +654,7 @@ public: } void operator=(const LinkRecord& other) { - data.copyTypes.content[0] = other.data.copyTypes.content[0]; - data.copyTypes.content[1] = other.data.copyTypes.content[1]; - data.copyTypes.content[2] = other.data.copyTypes.content[2]; + data.realTypes = other.data.realTypes; } intptr_t from() const { return data.realTypes.m_from; } void setFrom(intptr_t from) { data.realTypes.m_from = from; } @@ -671,8 +670,8 @@ public: private: union { struct RealTypes { - intptr_t m_from : 48; - intptr_t m_to : 48; + int64_t m_from : 48; + int64_t m_to : 48; JumpType m_type : 8; JumpLinkType m_linkType : 8; Condition m_condition : 4; @@ -680,10 +679,6 @@ public: RegisterID m_compareRegister : 6; bool m_is64Bit : 1; } realTypes; - struct CopyTypes { - uint64_t content[3]; - } copyTypes; - COMPILE_ASSERT(sizeof(RealTypes) == sizeof(CopyTypes), LinkRecordCopyStructSizeEqualsRealStruct); } data; }; @@ -743,6 +738,89 @@ public: return isValidSignedImm9(offset); } + + // Jump: + // + // A jump object is a reference to a jump instruction that has been planted + // into the code buffer - it is typically used to link the jump, setting the + // relative offset such that when executed it will jump to the desired + // destination. + template <typename LabelType> + class Jump { + template<class TemplateAssemblerType> + friend class AbstractMacroAssembler; + friend class Call; + template <typename, template <typename> class> friend class LinkBufferBase; + public: + Jump() + { + } + + Jump(AssemblerLabel jmp, ARM64Assembler::JumpType type = ARM64Assembler::JumpNoCondition, ARM64Assembler::Condition condition = ARM64Assembler::ConditionInvalid) + : m_label(jmp) + , m_type(type) + , m_condition(condition) + { + } + + Jump(AssemblerLabel jmp, ARM64Assembler::JumpType type, ARM64Assembler::Condition condition, bool is64Bit, ARM64Assembler::RegisterID compareRegister) + : m_label(jmp) + , m_type(type) + , m_condition(condition) + , m_is64Bit(is64Bit) + , m_compareRegister(compareRegister) + { + ASSERT((type == ARM64Assembler::JumpCompareAndBranch) || (type == ARM64Assembler::JumpCompareAndBranchFixedSize)); + } + + Jump(AssemblerLabel jmp, ARM64Assembler::JumpType type, ARM64Assembler::Condition condition, unsigned bitNumber, ARM64Assembler::RegisterID compareRegister) + : m_label(jmp) + , m_type(type) + , m_condition(condition) + , m_bitNumber(bitNumber) + , m_compareRegister(compareRegister) + { + ASSERT((type == ARM64Assembler::JumpTestBit) || (type == ARM64Assembler::JumpTestBitFixedSize)); + } + + LabelType label() const + { + LabelType result; + result.m_label = m_label; + return result; + } + + void link(AbstractMacroAssembler<ARM64Assembler>* masm) const + { + if ((m_type == ARM64Assembler::JumpCompareAndBranch) || (m_type == ARM64Assembler::JumpCompareAndBranchFixedSize)) + masm->m_assembler.linkJump(m_label, masm->m_assembler.label(), m_type, m_condition, m_is64Bit, m_compareRegister); + else if ((m_type == ARM64Assembler::JumpTestBit) || (m_type == ARM64Assembler::JumpTestBitFixedSize)) + masm->m_assembler.linkJump(m_label, masm->m_assembler.label(), m_type, m_condition, m_bitNumber, m_compareRegister); + else + masm->m_assembler.linkJump(m_label, masm->m_assembler.label(), m_type, m_condition); + } + + void linkTo(LabelType label, AbstractMacroAssembler<ARM64Assembler>* masm) const + { + if ((m_type == ARM64Assembler::JumpCompareAndBranch) || (m_type == ARM64Assembler::JumpCompareAndBranchFixedSize)) + masm->m_assembler.linkJump(m_label, label.label(), m_type, m_condition, m_is64Bit, m_compareRegister); + else if ((m_type == ARM64Assembler::JumpTestBit) || (m_type == ARM64Assembler::JumpTestBitFixedSize)) + masm->m_assembler.linkJump(m_label, label.label(), m_type, m_condition, m_bitNumber, m_compareRegister); + else + masm->m_assembler.linkJump(m_label, label.label(), m_type, m_condition); + } + + bool isSet() const { return m_label.isSet(); } + + private: + AssemblerLabel m_label; + ARM64Assembler::JumpType m_type; + ARM64Assembler::Condition m_condition; + bool m_is64Bit; + unsigned m_bitNumber; + ARM64Assembler::RegisterID m_compareRegister; + }; + private: int encodeFPImm(double d) { @@ -2857,11 +2935,11 @@ public: expected = disassembleMoveWideImediate(address + 1, sf, opc, hw, imm16, rd); ASSERT_UNUSED(expected, expected && sf && opc == MoveWideOp_K && hw == 1 && rd == rdFirst); - result |= static_cast<uintptr_t>(imm16) << 16; + result |= static_cast<uint64_t>(imm16) << 16; expected = disassembleMoveWideImediate(address + 2, sf, opc, hw, imm16, rd); ASSERT_UNUSED(expected, expected && sf && opc == MoveWideOp_K && hw == 2 && rd == rdFirst); - result |= static_cast<uintptr_t>(imm16) << 32; + result |= static_cast<uint64_t>(imm16) << 32; return reinterpret_cast<void*>(result); } @@ -2932,7 +3010,10 @@ public: static void cacheFlush(void* code, size_t size) { -#if OS(IOS) +#if defined(V4_BOOTSTRAP) + UNUSED_PARAM(code) + UNUSED_PARAM(size) +#elif OS(IOS) sys_cache_control(kCacheFunctionPrepareForExecution, code, size); #elif OS(LINUX) size_t page = pageSize(); @@ -2989,7 +3070,7 @@ public: case JumpCondition: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 0x3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 0x3)); - intptr_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); + int64_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); if (((relative << 43) >> 43) == relative) return LinkJumpConditionDirect; @@ -2999,7 +3080,7 @@ public: case JumpCompareAndBranch: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 0x3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 0x3)); - intptr_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); + int64_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); if (((relative << 43) >> 43) == relative) return LinkJumpCompareAndBranchDirect; @@ -3009,7 +3090,7 @@ public: case JumpTestBit: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 0x3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 0x3)); - intptr_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); + int64_t relative = reinterpret_cast<intptr_t>(to) - (reinterpret_cast<intptr_t>(from)); if (((relative << 50) >> 50) == relative) return LinkJumpTestBitDirect; @@ -3121,7 +3202,7 @@ private: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 3)); - intptr_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; + int64_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; ASSERT(((offset << 38) >> 38) == offset); bool useDirect = ((offset << 45) >> 45) == offset; // Fits in 19 bits @@ -3142,7 +3223,7 @@ private: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 3)); - intptr_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; + int64_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; ASSERT(((offset << 38) >> 38) == offset); bool useDirect = ((offset << 45) >> 45) == offset; // Fits in 19 bits @@ -3163,7 +3244,7 @@ private: { ASSERT(!(reinterpret_cast<intptr_t>(from) & 3)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 3)); - intptr_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; + int64_t offset = (reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from)) >> 2; ASSERT(static_cast<int>(offset) == offset); ASSERT(((offset << 38) >> 38) == offset); @@ -3766,6 +3847,8 @@ private: #undef DATASIZE #undef MEMOPSIZE #undef CHECK_FP_MEMOP_DATASIZE +#undef JUMP_ENUM_WITH_SIZE +#undef JUMP_ENUM_SIZE #endif // ENABLE(ASSEMBLER) && CPU(ARM64) diff --git a/src/3rdparty/masm/assembler/ARMv7Assembler.h b/src/3rdparty/masm/assembler/ARMv7Assembler.h index 6b32fbf487..615c72fc15 100644 --- a/src/3rdparty/masm/assembler/ARMv7Assembler.h +++ b/src/3rdparty/masm/assembler/ARMv7Assembler.h @@ -2867,6 +2867,9 @@ private: int m_indexOfTailOfLastWatchpoint; }; +#undef JUMP_ENUM_WITH_SIZE +#undef JUMP_ENUM_SIZE + } // namespace JSC #endif // ENABLE(ASSEMBLER) && CPU(ARM_THUMB2) diff --git a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h index 4f27e85c98..6fac27fdf1 100644 --- a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h +++ b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h @@ -66,7 +66,7 @@ public: typedef MacroAssemblerCodePtr CodePtr; typedef MacroAssemblerCodeRef CodeRef; -#if !CPU(ARM_THUMB2) && !defined(V4_BOOTSTRAP) +#if !CPU(ARM_THUMB2) && !CPU(ARM64) && !defined(V4_BOOTSTRAP) class Jump; #endif @@ -455,7 +455,7 @@ public: AssemblerLabel m_label; }; -#if CPU(ARM_THUMB2) || defined(V4_BOOTSTRAP) +#if CPU(ARM_THUMB2) || CPU(ARM64) || defined(V4_BOOTSTRAP) using Jump = typename AssemblerType::template Jump<Label>; friend Jump; #endif @@ -510,7 +510,7 @@ public: // into the code buffer - it is typically used to link the jump, setting the // relative offset such that when executed it will jump to the desired // destination. -#if !CPU(ARM_THUMB2) && !defined(V4_BOOTSTRAP) +#if !CPU(ARM_THUMB2) && !CPU(ARM64) && !defined(V4_BOOTSTRAP) class Jump { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; diff --git a/src/3rdparty/masm/assembler/LinkBuffer.h b/src/3rdparty/masm/assembler/LinkBuffer.h index 3a659a23ce..bfd0e402ca 100644 --- a/src/3rdparty/masm/assembler/LinkBuffer.h +++ b/src/3rdparty/masm/assembler/LinkBuffer.h @@ -505,7 +505,7 @@ public: }; #endif -#if CPU(ARM64) +#if CPU(ARM64) || defined(V4_BOOTSTRAP) template <> class LinkBuffer<JSC::MacroAssembler<MacroAssemblerARM64>> : public BranchCompactingLinkBuffer<JSC::MacroAssembler<MacroAssemblerARM64>> { diff --git a/src/3rdparty/masm/assembler/MacroAssembler.h b/src/3rdparty/masm/assembler/MacroAssembler.h index 87794c8ef4..7d9f156c8c 100644 --- a/src/3rdparty/masm/assembler/MacroAssembler.h +++ b/src/3rdparty/masm/assembler/MacroAssembler.h @@ -31,12 +31,12 @@ #if ENABLE(ASSEMBLER) #include "MacroAssemblerARMv7.h" +#include "MacroAssemblerARM64.h" #if CPU(ARM_THUMB2) namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; }; #elif CPU(ARM64) -#include "MacroAssemblerARM64.h" namespace JSC { typedef MacroAssemblerARM64 MacroAssemblerBase; }; #elif CPU(ARM_TRADITIONAL) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerARM64.h b/src/3rdparty/masm/assembler/MacroAssemblerARM64.h index 3e425a0246..a11637f7ca 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARM64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARM64.h @@ -26,7 +26,7 @@ #ifndef MacroAssemblerARM64_h #define MacroAssemblerARM64_h -#if ENABLE(ASSEMBLER) +#if ENABLE(ASSEMBLER) && (CPU(ARM64) || defined(V4_BOOTSTRAP)) #include "ARM64Assembler.h" #include "AbstractMacroAssembler.h" @@ -42,7 +42,7 @@ class MacroAssemblerARM64 : public AbstractMacroAssembler<ARM64Assembler> { friend class DataLabelPtr; friend class DataLabel32; friend class DataLabelCompact; - friend class Jump; +// template <typename> friend class Jump; friend class Label; public: @@ -119,9 +119,9 @@ public: private: static const ARM64Registers::FPRegisterID fpTempRegister = ARM64Registers::q31; static const ARM64Assembler::SetFlags S = ARM64Assembler::S; - static const intptr_t maskHalfWord0 = 0xffffl; - static const intptr_t maskHalfWord1 = 0xffff0000l; - static const intptr_t maskUpperWord = 0xffffffff00000000l; + static const int64_t maskHalfWord0 = 0xffffl; + static const int64_t maskHalfWord1 = 0xffff0000l; + static const int64_t maskUpperWord = 0xffffffff00000000l; // 4 instructions - 3 to load the function pointer, + blr. static const ptrdiff_t REPATCH_OFFSET_CALL_TO_POINTER = -16; @@ -209,6 +209,33 @@ public: static bool shouldBlindForSpecificArch(uint32_t value) { return value >= 0x00ffffff; } static bool shouldBlindForSpecificArch(uint64_t value) { return value >= 0x00ffffff; } +#if defined(V4_BOOTSTRAP) + void loadPtr(ImplicitAddress address, RegisterID dest) + { + load32(address, dest); + } + + void subPtr(TrustedImm32 imm, RegisterID dest) + { + sub32(imm, dest); + } + + void addPtr(TrustedImm32 imm, RegisterID dest) + { + add32(imm, dest); + } + + void addPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + add32(imm, src, dest); + } + + void storePtr(RegisterID src, ImplicitAddress address) + { + store32(src, address); + } +#endif + // Integer operations: void add32(RegisterID a, RegisterID b, RegisterID dest) @@ -2757,6 +2784,7 @@ public: return branch32(cond, left, dataTempRegister); } +#if !defined(V4_BOOTSTRAP) PatchableJump patchableBranchPtr(RelationalCondition cond, Address left, TrustedImmPtr right) { m_makeJumpPatchable = true; @@ -2764,6 +2792,7 @@ public: m_makeJumpPatchable = false; return PatchableJump(result); } +#endif PatchableJump patchableBranchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { @@ -3000,7 +3029,7 @@ private: return m_cachedMemoryTempRegister.registerIDInvalidate(); } - ALWAYS_INLINE bool isInIntRange(intptr_t value) + ALWAYS_INLINE bool isInIntRange(int64_t value) { return value == ((value << 32) >> 32); } @@ -3354,6 +3383,8 @@ private: } template <typename, template <typename> class> friend class LinkBufferBase; + template <typename> friend class BranchCompactingLinkBuffer; + template <typename> friend struct BranchCompactingExecutableOffsetCalculator; void recordLinkOffsets(int32_t regionStart, int32_t regionEnd, int32_t offset) {return m_assembler.recordLinkOffsets(regionStart, regionEnd, offset); } int executableOffsetFor(int location) { return m_assembler.executableOffsetFor(location); } |