WebKit Bugzilla
Attachment 339955 Details for
Bug 185423
: [ARMv7] Drop ARMv7 disassembler in favor of capstone
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185423-20180509205307.patch (text/plain), 100.67 KB, created by
Yusuke Suzuki
on 2018-05-09 04:53:08 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2018-05-09 04:53:08 PDT
Size:
100.67 KB
patch
obsolete
>Subversion Revision: 231553 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index b129aaa3952ff5a8b321528351d057fa5e2ed885..2d934fdc75e08f4e8204e186dc115dd3a787bc6a 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,20 @@ >+2018-05-09 Yusuke Suzuki <utatane.tea@gmail.com> >+ >+ [ARMv7] Drop ARMv7 disassembler in favor of capstone >+ https://bugs.webkit.org/show_bug.cgi?id=185423 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch removes ARMv7Disassembler in our tree. >+ We already adopted Capstone, and it is already used in ARMv7 JIT environments. >+ >+ * CMakeLists.txt: >+ * JavaScriptCore.xcodeproj/project.pbxproj: >+ * Sources.txt: >+ * disassembler/ARMv7/ARMv7DOpcode.cpp: Removed. >+ * disassembler/ARMv7/ARMv7DOpcode.h: Removed. >+ * disassembler/ARMv7Disassembler.cpp: Removed. >+ > 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> > > [JSC][GTK][JSCONLY] Use capstone disassembler >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 6dd70e202d40fbc6ad8c9549113dbc83bc9c136c..9c3b0712748e259e9d947a430cff056c45f2adf6 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,14 @@ >+2018-05-09 Yusuke Suzuki <utatane.tea@gmail.com> >+ >+ [ARMv7] Drop ARMv7 disassembler in favor of capstone >+ https://bugs.webkit.org/show_bug.cgi?id=185423 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Remove USE_ARMV7_DISASSEMBLER. Just use Capstone. >+ >+ * wtf/Platform.h: >+ > 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> > > [JSC][GTK][JSCONLY] Use capstone disassembler >diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt >index 3a4e26e8e7bf9adcfe7f44e9ca199b95a1387063..3ff6dfe8bfa9104a275a16b26058b076936e3c40 100644 >--- a/Source/JavaScriptCore/CMakeLists.txt >+++ b/Source/JavaScriptCore/CMakeLists.txt >@@ -24,7 +24,6 @@ set(JavaScriptCore_PRIVATE_INCLUDE_DIRECTORIES > "${JAVASCRIPTCORE_DIR}/dfg" > "${JAVASCRIPTCORE_DIR}/disassembler" > "${JAVASCRIPTCORE_DIR}/disassembler/ARM64" >- "${JAVASCRIPTCORE_DIR}/disassembler/ARMv7" > "${JAVASCRIPTCORE_DIR}/disassembler/udis86" > "${JAVASCRIPTCORE_DIR}/domjit" > "${JAVASCRIPTCORE_DIR}/ftl" >diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >index 2fef54f3b49519210a8b494e593024c2cfa898d9..122303863628c00c2d914120c3480e9d465db28b 100644 >--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >@@ -1066,7 +1066,6 @@ > 658D3A5619638268003C45D6 /* VMEntryRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 658D3A5519638268003C45D6 /* VMEntryRecord.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 659CDA5B1F6753F200D3E53F /* YarrUnicodeProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 659CDA5A1F67509800D3E53F /* YarrUnicodeProperties.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 65B8392E1BACAD360044E824 /* CachedRecovery.h in Headers */ = {isa = PBXBuildFile; fileRef = 65B8392C1BACA92A0044E824 /* CachedRecovery.h */; }; >- 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65C0285B1717966800351E35 /* ARMv7DOpcode.h */; }; > 6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */; }; > 6AD2CB4D19B9140100065719 /* DebuggerEvalEnabler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 70113D4C1A8DB093003848C4 /* IteratorOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 70113D4A1A8DB093003848C4 /* IteratorOperations.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -3536,9 +3535,6 @@ > 65A946141C8E9F6F00A7209A /* YarrCanonicalizeUnicode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = YarrCanonicalizeUnicode.cpp; sourceTree = "<group>"; }; > 65B8392C1BACA92A0044E824 /* CachedRecovery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedRecovery.h; sourceTree = "<group>"; }; > 65B8392D1BACA9D30044E824 /* CachedRecovery.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CachedRecovery.cpp; sourceTree = "<group>"; }; >- 65C0284F171795E200351E35 /* ARMv7Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ARMv7Disassembler.cpp; path = disassembler/ARMv7Disassembler.cpp; sourceTree = "<group>"; }; >- 65C0285A1717966800351E35 /* ARMv7DOpcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ARMv7DOpcode.cpp; sourceTree = "<group>"; }; >- 65C0285B1717966800351E35 /* ARMv7DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARMv7DOpcode.h; sourceTree = "<group>"; }; > 65C02FBB0637462A003E7EE6 /* Protect.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = Protect.h; sourceTree = "<group>"; tabWidth = 8; }; > 65C7A1710A8EAACB00FA37EA /* JSWrapperObject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSWrapperObject.cpp; sourceTree = "<group>"; }; > 65C7A1720A8EAACB00FA37EA /* JSWrapperObject.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSWrapperObject.h; sourceTree = "<group>"; }; >@@ -5361,10 +5357,8 @@ > isa = PBXGroup; > children = ( > 652A3A1A1651A92400A80AFE /* ARM64 */, >- 65C028591717966800351E35 /* ARMv7 */, > 0FF42733158EBD64004CB9FF /* udis86 */, > 652A3A201651C66100A80AFE /* ARM64Disassembler.cpp */, >- 65C0284F171795E200351E35 /* ARMv7Disassembler.cpp */, > 0F9D336E165DBB8D005AD387 /* Disassembler.cpp */, > 0FF4272F158EBD44004CB9FF /* Disassembler.h */, > 0FF42730158EBD44004CB9FF /* UDis86Disassembler.cpp */, >@@ -6236,16 +6230,6 @@ > name = ARM64; > sourceTree = "<group>"; > }; >- 65C028591717966800351E35 /* ARMv7 */ = { >- isa = PBXGroup; >- children = ( >- 65C0285A1717966800351E35 /* ARMv7DOpcode.cpp */, >- 65C0285B1717966800351E35 /* ARMv7DOpcode.h */, >- ); >- name = ARMv7; >- path = disassembler/ARMv7; >- sourceTree = "<group>"; >- }; > 7ACDDECF1E252ACA0097AFEB /* cocoa */ = { > isa = PBXGroup; > children = ( >@@ -6599,9 +6583,9 @@ > E178633F0D9BEC0000D74E75 /* InitializeThreading.h */, > E35E035D1B7AB43E0073AD2A /* InspectorInstrumentationObject.cpp */, > E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */, >- A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */, > A7A8AF2C17ADB5F3005AB174 /* Int16Array.h */, > A7A8AF2D17ADB5F3005AB174 /* Int32Array.h */, >+ A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */, > BC9BB95B0E19680600DF8855 /* InternalFunction.cpp */, > BC11667A0E199C05008066DD /* InternalFunction.h */, > A1B9E2331B4E0D6700BC7FED /* IntlCollator.cpp */, >@@ -6709,9 +6693,9 @@ > BC756FC60E2031B200DE7D12 /* JSGlobalObjectFunctions.cpp */, > BC756FC70E2031B200DE7D12 /* JSGlobalObjectFunctions.h */, > 79B819921DD25CF500DDC714 /* JSGlobalObjectInlines.h */, >- 0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */, > 0F2B66CA17B6B5AB00A7AE3F /* JSInt16Array.h */, > 0F2B66CB17B6B5AB00A7AE3F /* JSInt32Array.h */, >+ 0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */, > E33F507E1B8429A400413856 /* JSInternalPromise.cpp */, > E33F507F1B8429A400413856 /* JSInternalPromise.h */, > E33F50761B84225700413856 /* JSInternalPromiseConstructor.cpp */, >@@ -6800,10 +6784,10 @@ > 53F256E11B87E28000B4B768 /* JSTypedArrayViewPrototype.cpp */, > 53917E7C1B791106000EBD33 /* JSTypedArrayViewPrototype.h */, > 6507D2970E871E4A00D7D896 /* JSTypeInfo.h */, >- 0F2B66D217B6B5AB00A7AE3F /* JSUint8Array.h */, >- 0F2B66D317B6B5AB00A7AE3F /* JSUint8ClampedArray.h */, > 0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */, > 0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */, >+ 0F2B66D217B6B5AB00A7AE3F /* JSUint8Array.h */, >+ 0F2B66D317B6B5AB00A7AE3F /* JSUint8ClampedArray.h */, > A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */, > A7CA3AE217DA41AE006538AF /* JSWeakMap.h */, > 709FB8611AE335C60039D069 /* JSWeakSet.cpp */, >@@ -7012,11 +6996,11 @@ > 0F2D4DE019832D91007D4B19 /* TypeProfilerLog.h */, > 0F2D4DE319832D91007D4B19 /* TypeSet.cpp */, > 0F2D4DE419832D91007D4B19 /* TypeSet.h */, >- A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */, >- A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */, > A7A8AF3217ADB5F3005AB174 /* Uint16Array.h */, > 866739D113BFDE710023D87C /* Uint16WithFraction.h */, > A7A8AF3317ADB5F3005AB174 /* Uint32Array.h */, >+ A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */, >+ A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */, > 0FE050231AA9095600D33B33 /* VarOffset.cpp */, > 0FE050241AA9095600D33B33 /* VarOffset.h */, > E18E3A570DF9278C00D90B34 /* VM.cpp */, >@@ -8211,7 +8195,6 @@ > A1A009C11831A26E00CF8711 /* ARM64Assembler.h in Headers */, > 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */, > 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */, >- 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */, > 0F8335B81639C1EA001443B5 /* ArrayAllocationProfile.h in Headers */, > A7A8AF3517ADB5F3005AB174 /* ArrayBuffer.h in Headers */, > 0FFC99D5184EE318009C10AB /* ArrayBufferNeuteringWatchpoint.h in Headers */, >@@ -8436,6 +8419,7 @@ > 0F15F15F14B7A73E005DE37D /* CommonSlowPaths.h in Headers */, > 6553A33217A1F1EE008CF6F3 /* CommonSlowPathsExceptions.h in Headers */, > A7E5A3A81797432D00E893C0 /* CompilationResult.h in Headers */, >+ 0F4F11E8209BCDAB00709654 /* CompilerTimingScope.h in Headers */, > 0FDCE12A1FAFA85F006F3901 /* CompleteSubspace.h in Headers */, > BC18C3F40E16F5CD00B34460 /* Completion.h in Headers */, > 0F6FC751196110A800E1D02D /* ComplexGetStatus.h in Headers */, >@@ -8489,6 +8473,7 @@ > 0F5E0FD8207C72730097F0DE /* DFGAbstractInterpreterClobberState.h in Headers */, > A704D90417A0BAA8006BA554 /* DFGAbstractInterpreterInlines.h in Headers */, > 0F620177143FCD3F0068B77C /* DFGAbstractValue.h in Headers */, >+ 0F4F11EB209D426600709654 /* DFGAbstractValueClobberEpoch.h in Headers */, > 0FD3E4021B618AAF00C80E1E /* DFGAdaptiveInferredPropertyValueWatchpoint.h in Headers */, > 0F18D3D01B55A6E0002C5C9F /* DFGAdaptiveStructureWatchpoint.h in Headers */, > 0F66E16B14DF3F1600B7B2E4 /* DFGAdjacencyList.h in Headers */, >@@ -8783,7 +8768,6 @@ > 0F2B66AC17B6B53F00A7AE3F /* GCIncomingRefCounted.h in Headers */, > 0F2B66AD17B6B54500A7AE3F /* GCIncomingRefCountedInlines.h in Headers */, > 0F2B66AE17B6B54500A7AE3F /* GCIncomingRefCountedSet.h in Headers */, >- 0F4F11E8209BCDAB00709654 /* CompilerTimingScope.h in Headers */, > 0F2B66AF17B6B54500A7AE3F /* GCIncomingRefCountedSetInlines.h in Headers */, > 2AABCDE718EF294200002096 /* GCLogging.h in Headers */, > 0F9715311EB28BEE00A1645D /* GCRequest.h in Headers */, >@@ -9045,7 +9029,6 @@ > A513E5C2185BFACC007E95AD /* JSInjectedScriptHostPrototype.h in Headers */, > 0F2B66F817B6B5AB00A7AE3F /* JSInt16Array.h in Headers */, > 0F2B66F917B6B5AB00A7AE3F /* JSInt32Array.h in Headers */, >- 0F4F11EB209D426600709654 /* DFGAbstractValueClobberEpoch.h in Headers */, > 0F2B66F717B6B5AB00A7AE3F /* JSInt8Array.h in Headers */, > A76C51761182748D00715B05 /* JSInterfaceJIT.h in Headers */, > E33F50811B8429A400413856 /* JSInternalPromise.h in Headers */, >diff --git a/Source/JavaScriptCore/Sources.txt b/Source/JavaScriptCore/Sources.txt >index e4f01ad8f6b154dc7aa432f42f852b3f516b1fcc..6c40a945f8e8baa8c4d85d0fb1eef74092b328c5 100644 >--- a/Source/JavaScriptCore/Sources.txt >+++ b/Source/JavaScriptCore/Sources.txt >@@ -411,7 +411,6 @@ dfg/DFGWatchpointCollectionPhase.cpp > dfg/DFGWorklist.cpp > > disassembler/ARM64Disassembler.cpp >-disassembler/ARMv7Disassembler.cpp > disassembler/CapstoneDisassembler.cpp > disassembler/Disassembler.cpp > disassembler/UDis86Disassembler.cpp >@@ -419,8 +418,6 @@ disassembler/X86Disassembler.cpp > > disassembler/ARM64/A64DOpcode.cpp > >-disassembler/ARMv7/ARMv7DOpcode.cpp >- > disassembler/udis86/udis86.c > disassembler/udis86/udis86_decode.c > disassembler/udis86/udis86_itab_holder.c >diff --git a/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.cpp b/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.cpp >deleted file mode 100644 >index 37b82cbf3ad0fec654bfc6b2770524926ece1696..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.cpp >+++ /dev/null >@@ -1,1733 +0,0 @@ >-/* >- * Copyright (C) 2013 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#include "config.h" >- >-#if USE(ARMV7_DISASSEMBLER) >- >-#include "ARMv7DOpcode.h" >- >-#include <stdarg.h> >-#include <stdint.h> >-#include <stdio.h> >-#include <string.h> >- >-namespace JSC { namespace ARMv7Disassembler { >- >-ARMv7D16BitOpcode::OpcodeGroup* ARMv7D16BitOpcode::opcodeTable[32]; >-ARMv7D32BitOpcode::OpcodeGroup* ARMv7D32BitOpcode::opcodeTable[16]; >- >-const char* const ARMv7DOpcode::s_conditionNames[16] = { >- "eq", "ne", "hs", "lo", "mi", "pl", "vs", "vc", >- "hi", "ls", "ge", "lt", "gt", "le", "al", "al" >-}; >- >-const char* const ARMv7DOpcode::s_optionName[8] = { >- "uxtb", "uxth", "uxtw", "uxtx", "sxtb", "sxth", "sxtw", "sxtx" >-}; >- >-const char* const ARMv7DOpcode::s_shiftNames[4] = { >- "lsl", "lsr", "asr", "ror" >-}; >- >-const char* const ARMv7DOpcode::s_specialRegisterNames[3] = { "sp", "lr", "pc" }; >- >-template <typename OpcodeType, typename InstructionType> >-struct OpcodeGroupInitializer { >- unsigned m_opcodeGroupNumber; >- InstructionType m_mask; >- InstructionType m_pattern; >- const char* (*m_format)(OpcodeType*); >-}; >- >-#define OPCODE_GROUP_ENTRY(groupIndex, groupClass) \ >-{ groupIndex, groupClass::s_mask, groupClass::s_pattern, groupClass::format } >- >-typedef OpcodeGroupInitializer<ARMv7D16BitOpcode, uint16_t> Opcode16GroupInitializer; >-typedef OpcodeGroupInitializer<ARMv7D32BitOpcode, uint32_t> Opcode32GroupInitializer; >- >-static Opcode16GroupInitializer opcode16BitGroupList[] = { >- OPCODE_GROUP_ENTRY(0x0, ARMv7DOpcodeLogicalImmediateT1), >- OPCODE_GROUP_ENTRY(0x1, ARMv7DOpcodeLogicalImmediateT1), >- OPCODE_GROUP_ENTRY(0x2, ARMv7DOpcodeLogicalImmediateT1), >- OPCODE_GROUP_ENTRY(0x3, ARMv7DOpcodeAddSubtractT1), >- OPCODE_GROUP_ENTRY(0x3, ARMv7DOpcodeAddSubtractImmediate3), >- OPCODE_GROUP_ENTRY(0x4, ARMv7DOpcodeMoveImmediateT1), >- OPCODE_GROUP_ENTRY(0x5, ARMv7DOpcodeCompareImmediateT1), >- OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeAddSubtractImmediate8), >- OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeAddSubtractImmediate8), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeDataProcessingRegisterT1), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeAddRegisterT2), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeCompareRegisterT2), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeCompareRegisterT1), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeMoveRegisterT1), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeBranchExchangeT1), >- OPCODE_GROUP_ENTRY(0x9, ARMv7DOpcodeLoadFromLiteralPool), >- OPCODE_GROUP_ENTRY(0xa, ARMv7DOpcodeLoadStoreRegisterOffsetT1), >- OPCODE_GROUP_ENTRY(0xb, ARMv7DOpcodeLoadStoreRegisterOffsetT1), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeLoadStoreRegisterImmediateWordAndByte), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeLoadStoreRegisterImmediateWordAndByte), >- OPCODE_GROUP_ENTRY(0xe, ARMv7DOpcodeLoadStoreRegisterImmediateWordAndByte), >- OPCODE_GROUP_ENTRY(0xf, ARMv7DOpcodeLoadStoreRegisterImmediateWordAndByte), >- OPCODE_GROUP_ENTRY(0x10, ARMv7DOpcodeStoreRegisterImmediateHalfWord), >- OPCODE_GROUP_ENTRY(0x11, ARMv7DOpcodeLoadRegisterImmediateHalfWord), >- OPCODE_GROUP_ENTRY(0x12, ARMv7DOpcodeLoadStoreRegisterSPRelative), >- OPCODE_GROUP_ENTRY(0x13, ARMv7DOpcodeLoadStoreRegisterSPRelative), >- OPCODE_GROUP_ENTRY(0x14, ARMv7DOpcodeGeneratePCRelativeAddress), >- OPCODE_GROUP_ENTRY(0x15, ARMv7DOpcodeAddSPPlusImmediate), >- OPCODE_GROUP_ENTRY(0x16, ARMv7DOpcodeMiscCompareAndBranch), >- OPCODE_GROUP_ENTRY(0x16, ARMv7DOpcodeMiscByteHalfwordOps), >- OPCODE_GROUP_ENTRY(0x16, ARMv7DOpcodeMiscPushPop), >- OPCODE_GROUP_ENTRY(0x16, ARMv7DOpcodeMiscAddSubSP), >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscHint16), // Needs to be before IfThenT1 >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscIfThenT1), >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscByteHalfwordOps), >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscCompareAndBranch), >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscPushPop), >- OPCODE_GROUP_ENTRY(0x17, ARMv7DOpcodeMiscBreakpointT1), >- OPCODE_GROUP_ENTRY(0x1a, ARMv7DOpcodeBranchConditionalT1), >- OPCODE_GROUP_ENTRY(0x1b, ARMv7DOpcodeBranchConditionalT1), >- OPCODE_GROUP_ENTRY(0x1c, ARMv7DOpcodeBranchT2) >-}; >- >-static Opcode32GroupInitializer opcode32BitGroupList[] = { >- OPCODE_GROUP_ENTRY(0x4, ARMv7DOpcodeDataPopMultiple), >- OPCODE_GROUP_ENTRY(0x4, ARMv7DOpcodeDataPushMultiple), >- OPCODE_GROUP_ENTRY(0x5, ARMv7DOpcodeDataProcessingShiftedReg), >- OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVLDRSTR), >- OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVMOVSinglePrecision), >- OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVMOVDoublePrecision), >- OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeFPTransfer), >- OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeVMSR), >- OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeVCMP), >- OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeVCVTBetweenFPAndInt), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeDataProcessingModifiedImmediate), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeConditionalBranchT3), >- OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeBranchOrBranchLink), >- OPCODE_GROUP_ENTRY(0x9, ARMv7DOpcodeUnmodifiedImmediate), >- OPCODE_GROUP_ENTRY(0x9, ARMv7DOpcodeHint32), >- OPCODE_GROUP_ENTRY(0x9, ARMv7DOpcodeConditionalBranchT3), >- OPCODE_GROUP_ENTRY(0x9, ARMv7DOpcodeBranchOrBranchLink), >- OPCODE_GROUP_ENTRY(0xa, ARMv7DOpcodeDataProcessingModifiedImmediate), >- OPCODE_GROUP_ENTRY(0xa, ARMv7DOpcodeConditionalBranchT3), >- OPCODE_GROUP_ENTRY(0xa, ARMv7DOpcodeBranchOrBranchLink), >- OPCODE_GROUP_ENTRY(0xb, ARMv7DOpcodeUnmodifiedImmediate), >- OPCODE_GROUP_ENTRY(0xb, ARMv7DOpcodeConditionalBranchT3), >- OPCODE_GROUP_ENTRY(0xb, ARMv7DOpcodeBranchOrBranchLink), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeLoadRegister), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeDataPushPopSingle), // Should be before StoreSingle* >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeDataPopMultiple), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeDataPushMultiple), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeStoreSingleRegister), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeStoreSingleImmediate12), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeStoreSingleImmediate8), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeLoadSignedImmediate), >- OPCODE_GROUP_ENTRY(0xc, ARMv7DOpcodeLoadUnsignedImmediate), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeLongMultipleDivide), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeDataProcessingRegShift), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeDataProcessingRegExtend), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeDataProcessingRegParallel), >- OPCODE_GROUP_ENTRY(0xd, ARMv7DOpcodeDataProcessingRegMisc), >- OPCODE_GROUP_ENTRY(0xe, ARMv7DOpcodeVLDRSTR), >- OPCODE_GROUP_ENTRY(0xf, ARMv7DOpcodeVCMP), >- OPCODE_GROUP_ENTRY(0xf, ARMv7DOpcodeVCVTBetweenFPAndInt), >-}; >- >-bool ARMv7DOpcode::s_initialized = false; >- >-void ARMv7DOpcode::init() >-{ >- if (s_initialized) >- return; >- >- ARMv7D16BitOpcode::init(); >- ARMv7D32BitOpcode::init(); >- >- s_initialized = true; >-} >- >-void ARMv7DOpcode::startITBlock(unsigned blocksize, unsigned firstCondition) >-{ >- ASSERT(blocksize > 0 && blocksize <= MaxITBlockSize); >- m_ITBlocksize = blocksize; >- m_ITConditionIndex = m_ITBlocksize + 1; >- m_currentITCondition = 0; >- m_ifThenConditions[0] = firstCondition; >-} >- >-void ARMv7DOpcode::saveITConditionAt(unsigned blockPosition, unsigned condition) >-{ >- if (blockPosition < m_ITBlocksize) >- m_ifThenConditions[blockPosition] = static_cast<unsigned char>(condition); >-} >- >-void ARMv7DOpcode::fetchOpcode(uint16_t*& newPC) >-{ >- m_bufferOffset = 0; >- m_formatBuffer[0] = '\0'; >- m_currentPC = newPC; >- >- m_opcode = *newPC++; >- >- if (is32BitInstruction()) { >- m_opcode <<= 16; >- m_opcode |= *newPC++; >- } >- >- if (m_ITConditionIndex < m_ITBlocksize) >- m_currentITCondition = m_ifThenConditions[m_ITConditionIndex]; >- else >- m_currentITCondition = CondNone; >-} >- >-const char* ARMv7DOpcode::disassemble(uint16_t*& currentPC) >-{ >- const char* result; >- fetchOpcode(currentPC); >- >- if (is32BitInstruction()) >- result = reinterpret_cast<ARMv7D32BitOpcode*>(this)->doDisassemble(); >- else >- result = reinterpret_cast<ARMv7D16BitOpcode*>(this)->doDisassemble(); >- >- if (startingITBlock()) >- m_ITConditionIndex = 0; >- else if (inITBlock() && (++m_ITConditionIndex >= m_ITBlocksize)) >- endITBlock(); >- >- return result; >-} >- >-void ARMv7DOpcode::bufferPrintf(const char* format, ...) >-{ >- if (m_bufferOffset >= bufferSize) >- return; >- >- va_list argList; >- va_start(argList, format); >- >- m_bufferOffset += vsnprintf(m_formatBuffer + m_bufferOffset, bufferSize - m_bufferOffset, format, argList); >- >- va_end(argList); >-} >- >-void ARMv7DOpcode::appendInstructionName(const char* instructionName, bool addS) >-{ >- if (!inITBlock() && !addS) { >- appendInstructionNameNoITBlock(instructionName); >- >- return; >- } >- >- const char sevenSpaces[8] = " "; >- >- unsigned length = strlen(instructionName); >- >- bufferPrintf(" %s", instructionName); >- if (inITBlock()) { >- const char* condition = conditionName(m_currentITCondition); >- length += strlen(condition); >- appendString(condition); >- } else if (addS) { >- length++; >- appendCharacter('s'); >- } >- >- if (length >= 7) >- length = 6; >- >- appendString(sevenSpaces + length); >-} >- >-void ARMv7DOpcode::appendRegisterName(unsigned registerNumber) >-{ >- registerNumber &= 0xf; >- >- if (registerNumber > 12) { >- appendString(s_specialRegisterNames[registerNumber - 13]); >- return; >- } >- >- bufferPrintf("r%u", registerNumber); >-} >- >-void ARMv7DOpcode::appendRegisterList(unsigned registers) >-{ >- unsigned numberPrinted = 0; >- >- appendCharacter('{'); >- >- for (unsigned i = 0; i < 16; i++) { >- if (registers & (1 << i)) { >- if (numberPrinted++) >- appendSeparator(); >- appendRegisterName(i); >- } >- } >- >- appendCharacter('}'); >-} >- >-void ARMv7DOpcode::appendFPRegisterName(char registerPrefix, unsigned registerNumber) >-{ >- bufferPrintf("%c%u", registerPrefix, registerNumber); >-} >- >-// 16 Bit Instructions >- >-void ARMv7D16BitOpcode::init() >-{ >- OpcodeGroup* lastGroups[OpcodeGroup::opcodeTableSize]; >- >- for (unsigned i = 0; i < OpcodeGroup::opcodeTableSize; i++) { >- opcodeTable[i] = 0; >- lastGroups[i] = 0; >- } >- >- for (unsigned i = 0; i < sizeof(opcode16BitGroupList) / sizeof(Opcode16GroupInitializer); i++) { >- OpcodeGroup* newOpcodeGroup = new OpcodeGroup(opcode16BitGroupList[i].m_mask, opcode16BitGroupList[i].m_pattern, opcode16BitGroupList[i].m_format); >- uint16_t opcodeGroupNumber = opcode16BitGroupList[i].m_opcodeGroupNumber; >- >- if (!opcodeTable[opcodeGroupNumber]) >- opcodeTable[opcodeGroupNumber] = newOpcodeGroup; >- else >- lastGroups[opcodeGroupNumber]->setNext(newOpcodeGroup); >- lastGroups[opcodeGroupNumber] = newOpcodeGroup; >- } >-} >- >-const char* ARMv7D16BitOpcode::doDisassemble() >-{ >- OpcodeGroup* opGroup = opcodeTable[opcodeGroupNumber(m_opcode)]; >- >- while (opGroup) { >- if (opGroup->matches(static_cast<uint16_t>(m_opcode))) >- return opGroup->format(this); >- opGroup = opGroup->next(); >- } >- >- return defaultFormat(); >-} >- >-const char* ARMv7D16BitOpcode::defaultFormat() >-{ >- bufferPrintf(" .word %04x", m_opcode); >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeAddRegisterT2::format() >-{ >- appendInstructionName("add"); >- appendRegisterName(rdn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeAddSPPlusImmediate::format() >-{ >- appendInstructionName("add"); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(RegSP); >- appendSeparator(); >- appendUnsignedImmediate(immediate8()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeAddSubtract::s_opNames[2] = { "add", "sub" }; >- >-const char* ARMv7DOpcodeAddSubtractT1::format() >-{ >- appendInstructionName(opName(), !inITBlock()); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeAddSubtractImmediate3::format() >-{ >- appendInstructionName(opName(), !inITBlock()); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendUnsignedImmediate(immediate3()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeAddSubtractImmediate8::format() >-{ >- appendInstructionName(opName(), !inITBlock()); >- appendRegisterName(rdn()); >- appendSeparator(); >- appendUnsignedImmediate(immediate8()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeBranchConditionalT1::format() >-{ >- if (condition() == 0xe) >- return defaultFormat(); >- >- if (condition() == 0xf) { >- appendInstructionName("svc"); >- appendUnsignedImmediate(offset()); >- >- return m_formatBuffer; >- } >- >- bufferPrintf(" b%-6.6s", conditionName(condition())); >- appendPCRelativeOffset(static_cast<int32_t>(offset()) + 2); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeBranchExchangeT1::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeBranchT2::format() >-{ >- appendInstructionName("b"); >- appendPCRelativeOffset(static_cast<int32_t>(immediate11()) + 2); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeCompareImmediateT1::format() >-{ >- appendInstructionName("cmp"); >- appendRegisterName(rn()); >- appendSeparator(); >- appendUnsignedImmediate(immediate8()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeCompareRegisterT1::format() >-{ >- appendInstructionName("cmp"); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeCompareRegisterT2::format() >-{ >- appendInstructionName("compare"); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataProcessingRegisterT1::s_opNames[16] = { >- "and", "eor", "lsl", "lsr", "asr", "adc", "sbc", "ror", "tst", "rsb", "cmp", "cmn", "orr", "mul", "bic", "mvn" >-}; >- >-const char* ARMv7DOpcodeDataProcessingRegisterT1::format() >-{ >- appendInstructionName(opName(), inITBlock() && (!(op() == 0x8) || (op() == 0xa) || (op() == 0xb))); >- appendRegisterName(rdn()); >- appendSeparator(); >- appendRegisterName(rm()); >- if (op() == 0x9) // rsb T1 >- appendString(", #0"); >- else if (op() == 0xd) { // mul T1 >- appendSeparator(); >- appendRegisterName(rdn()); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeGeneratePCRelativeAddress::format() >-{ >- appendInstructionName("adr"); >- appendRegisterName(rd()); >- appendSeparator(); >- appendPCRelativeOffset(static_cast<int32_t>(immediate8())); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeLoadFromLiteralPool::format() >-{ >- appendInstructionName("ldr"); >- appendRegisterName(rt()); >- appendSeparator(); >- appendPCRelativeOffset(static_cast<int32_t>(immediate8())); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeLoadStoreRegisterImmediate::s_opNames[6] = { >- "str", "ldr", "strb", "ldrb", "strh", "ldrh" >-}; >- >-const char* ARMv7DOpcodeLoadStoreRegisterImmediate::format() >-{ >- const char* instructionName = opName(); >- >- if (!instructionName) >- return defaultFormat(); >- >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- if (immediate5()) { >- appendSeparator(); >- appendUnsignedImmediate(immediate5() << scale()); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-unsigned ARMv7DOpcodeLoadStoreRegisterImmediate::scale() >-{ >- switch (op()) { >- case 0: >- case 1: >- return 2; >- case 2: >- case 3: >- return 0; >- case 4: >- case 5: >- return 1; >- default: >- break; >- } >- ASSERT_NOT_REACHED(); >- return 0; >-} >- >-const char* const ARMv7DOpcodeLoadStoreRegisterOffsetT1::s_opNames[8] = { >- "str", "strh", "strb", "ldrsb", "ldr", "ldrh", "ldrb", "ldrsh" >-}; >- >-const char* ARMv7DOpcodeLoadStoreRegisterOffsetT1::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeLoadStoreRegisterSPRelative::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(RegSP); >- if (immediate8()) { >- appendSeparator(); >- appendUnsignedImmediate(immediate8() << 2); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeLogicalImmediateT1::format() >-{ >- if (!op() && !immediate5()) { >- // mov T2 >- appendInstructionName("movs"); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >- } >- >- appendInstructionName(opName(), !inITBlock()); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendSeparator(); >- appendUnsignedImmediate((op() && !immediate5()) ? 32 : immediate5()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMiscAddSubSP::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(RegSP); >- appendSeparator(); >- appendRegisterName(RegSP); >- appendSeparator(); >- appendUnsignedImmediate(immediate7()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMiscBreakpointT1::format() >-{ >- appendInstructionNameNoITBlock("bkpt"); >- appendUnsignedImmediate(immediate8()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeMiscByteHalfwordOps::s_opNames[8] = { >- "sxth", "sxb", "uxth", "uxtb", "rev", "rev16", "revsh" >-}; >- >-const char* ARMv7DOpcodeMiscByteHalfwordOps::format() >-{ >- const char* instructionName = opName(); >- >- if (!instructionName) >- return defaultFormat(); >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMiscCompareAndBranch::format() >-{ >- appendInstructionName(opName()); >- appendPCRelativeOffset(immediate6() + 2); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeMiscHint16::s_opNames[16] = { >- "nop", "yield", "wfe", "wfi", "sev" >-}; >- >-const char* ARMv7DOpcodeMiscHint16::format() >-{ >- if (opA() > 4) >- return defaultFormat(); >- >- appendInstructionName(opName()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMiscIfThenT1::format() >-{ >- char opName[6]; >- opName[0] = 'i'; >- opName[1] = 't'; >- >- unsigned condition = firstCondition(); >- unsigned maskBits = mask(); >- unsigned blockLength = 0; >- >- for (unsigned i = 0; i < 4; ++i) { >- if (maskBits & (1 << i)) { >- blockLength = 4 - i; >- break; >- } >- } >- >- startITBlock(blockLength, condition); >- >- for (unsigned i = 1; i < blockLength; ++i) { >- unsigned currMaskBit = (maskBits >> (4-i)) & 0x1; >- opName[i + 1] = (currMaskBit ^ (condition & 1)) ? 'e' : 't'; >- saveITConditionAt(i, (condition & ~1) | currMaskBit); >- } >- opName[blockLength + 1] = '\0'; >- >- appendInstructionNameNoITBlock(opName); >- appendString(conditionName(condition)); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMiscPushPop::format() >-{ >- appendInstructionName(opName()); >- appendRegisterList(registerMask()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMoveImmediateT1::format() >-{ >- appendInstructionName("mov", !inITBlock()); >- appendRegisterName(rd()); >- appendSeparator(); >- appendUnsignedImmediate(immediate8()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeMoveRegisterT1::format() >-{ >- appendInstructionName("mov"); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-// 32 bit Intructions >- >-void ARMv7D32BitOpcode::init() >-{ >- OpcodeGroup* lastGroups[OpcodeGroup::opcodeTableSize]; >- >- for (unsigned i = 0; i < OpcodeGroup::opcodeTableSize; i++) { >- opcodeTable[i] = 0; >- lastGroups[i] = 0; >- } >- >- for (unsigned i = 0; i < sizeof(opcode32BitGroupList) / sizeof(Opcode32GroupInitializer); i++) { >- OpcodeGroup* newOpcodeGroup = new OpcodeGroup(opcode32BitGroupList[i].m_mask, opcode32BitGroupList[i].m_pattern, opcode32BitGroupList[i].m_format); >- uint16_t opcodeGroupNumber = opcode32BitGroupList[i].m_opcodeGroupNumber; >- >- if (!opcodeTable[opcodeGroupNumber]) >- opcodeTable[opcodeGroupNumber] = newOpcodeGroup; >- else >- lastGroups[opcodeGroupNumber]->setNext(newOpcodeGroup); >- lastGroups[opcodeGroupNumber] = newOpcodeGroup; >- } >-} >- >-const char* ARMv7D32BitOpcode::doDisassemble() >-{ >- OpcodeGroup* opGroup = opcodeTable[opcodeGroupNumber(m_opcode)]; >- >- while (opGroup) { >- if (opGroup->matches(m_opcode)) >- return opGroup->format(this); >- opGroup = opGroup->next(); >- } >- >- return defaultFormat(); >-} >- >-const char* ARMv7D32BitOpcode::defaultFormat() >-{ >- bufferPrintf(" .long %08x", m_opcode); >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeConditionalBranchT3::format() >-{ >- if (condition() < 0xe) >- bufferPrintf(" b%-6.6s", conditionName(condition())); >- else >- appendInstructionName("b"); >- appendPCRelativeOffset(offset() + 2); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeBranchOrBranchLink::format() >-{ >- appendInstructionName(isBL() ? "bl" : "b"); >- appendPCRelativeOffset(offset() + 2); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataProcessingLogicalAndRithmetic::s_opNames[16] = { >- "and", "bic", "orr", "orn", "eor", 0, "pkh", 0, "add", 0, "adc", "sbc", 0, "sub", "rsb", 0 >-}; >- >-void ARMv7DOpcodeDataProcessingModifiedImmediate::appendModifiedImmediate(unsigned immediate12) >-{ >- if (!(immediate12 & 0xc00)) { >- unsigned immediate = 0; >- unsigned lower8Bits = immediate12 & 0xff; >- >- switch ((immediate12 >> 8) & 3) { >- case 0: >- immediate = lower8Bits; >- break; >- case 1: >- immediate = (lower8Bits << 16) | lower8Bits; >- break; >- case 2: >- immediate = (lower8Bits << 24) | (lower8Bits << 8); >- break; >- case 3: >- immediate = (lower8Bits << 24) | (lower8Bits << 16) | (lower8Bits << 8) | lower8Bits; >- break; >- } >- appendUnsignedImmediate(immediate); >- return; >- } >- >- unsigned immediate8 = 0x80 | (immediate12 & 0x7f); >- unsigned shiftAmount = 32 - ((immediate12 >> 7) & 0x1f); >- >- appendUnsignedImmediate(immediate8 << shiftAmount); >-} >- >-const char* ARMv7DOpcodeDataProcessingModifiedImmediate::format() >-{ >- if ((op() == 0x5) || (op() == 0x6) || (op() == 0x7) || (op() == 0x9) || (op() == 0xc) || (op() == 0xf)) >- return defaultFormat(); >- >- const char* instructionName = opName(); >- >- if (rn() == 15) { >- if (op() == 2) { >- // MOV T2 >- instructionName = sBit() ? "movs" : "mov"; >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendModifiedImmediate(immediate12()); >- >- return m_formatBuffer; >- } >- >- if (op() == 3) { >- // MVN T1 >- instructionName = sBit() ? "mvns" : "mvn"; >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendModifiedImmediate(immediate12()); >- >- return m_formatBuffer; >- } >- } >- >- if (rd() == 15) { >- if (sBit()) { >- bool testOrCmpInstruction = false; >- >- switch (op()) { >- case 0x0: >- instructionName = "tst"; >- testOrCmpInstruction = true; >- break; >- case 0x4: >- instructionName = "teq"; >- testOrCmpInstruction = true; >- break; >- case 0x8: >- instructionName = "cmn"; >- testOrCmpInstruction = true; >- break; >- case 0xd: >- instructionName = "cmp"; >- testOrCmpInstruction = true; >- break; >- } >- >- if (testOrCmpInstruction) { >- appendInstructionName(instructionName); >- appendRegisterName(rn()); >- appendSeparator(); >- appendModifiedImmediate(immediate12()); >- >- return m_formatBuffer; >- } >- } >- } >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendModifiedImmediate(immediate12()); >- >- return m_formatBuffer; >-} >- >-void ARMv7DOpcodeDataProcessingShiftedReg::appendImmShift(unsigned type, unsigned immediate) >-{ >- if (type || immediate) { >- appendSeparator(); >- >- if (!immediate) { >- switch (type) { >- case 1: >- case 2: >- immediate = 32; >- break; >- case 3: >- appendString("rrx"); >- return; >- } >- } >- >- appendShiftType(type); >- appendUnsignedImmediate(immediate); >- } >-} >- >-const char* ARMv7DOpcodeDataProcessingShiftedReg::format() >-{ >- if ((op() == 0x5) || (op() == 0x7) || (op() == 0x9) || (op() == 0xc) || (op() == 0xf)) >- return defaultFormat(); >- >- if (op() == 6) { >- // pkhbt or pkhtb >- if (sBit() || tBit()) >- return defaultFormat(); >- >- if (tbBit()) >- appendInstructionName("pkhtb"); >- else >- appendInstructionName("pkhbt"); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendImmShift(tbBit() << 1, immediate5()); >- >- return m_formatBuffer; >- } >- >- const char* instructionName = opName(); >- >- if (rn() == 15) { >- if (op() == 2) { >- if (!type() && !immediate5()) { >- // MOV T3 >- instructionName = sBit() ? "movs" : "mov"; >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >- } >- >- if (type() == 3 && !immediate5()) { >- // RRX T1 >- instructionName = sBit() ? "rrx" : "rrx"; >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >- } >- >- // Logical >- if (sBit()) >- bufferPrintf("%ss ", shiftName(type())); >- else >- appendInstructionName(shiftName(type())); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendSeparator(); >- appendUnsignedImmediate(immediate5()); >- >- return m_formatBuffer; >- } >- >- if (op() == 3) { >- // MVN T2 >- instructionName = sBit() ? "mvns" : "mvn"; >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendImmShift(type(), immediate5()); >- >- return m_formatBuffer; >- } >- } >- >- if (rd() == 15) { >- if (sBit()) { >- bool testOrCmpInstruction = false; >- >- switch (op()) { >- case 0x0: >- instructionName = "tst"; >- testOrCmpInstruction = true; >- break; >- case 0x4: >- instructionName = "teq"; >- testOrCmpInstruction = true; >- break; >- case 0x8: >- instructionName = "cmn"; >- testOrCmpInstruction = true; >- break; >- case 0xd: >- instructionName = "cmp"; >- testOrCmpInstruction = true; >- break; >- } >- >- if (testOrCmpInstruction) { >- appendInstructionName(instructionName); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendImmShift(type(), immediate5()); >- >- return m_formatBuffer; >- } >- } >- } >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- appendImmShift(type(), immediate5()); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeFPTransfer::format() >-{ >- appendInstructionName("vmov"); >- >- if (opL()) { >- appendFPRegister(); >- appendSeparator(); >- } >- >- appendRegisterName(rt()); >- >- if (!opL()) { >- appendSeparator(); >- appendFPRegister(); >- } >- >- return m_formatBuffer; >-} >- >-void ARMv7DOpcodeFPTransfer::appendFPRegister() >-{ >- if (opC()) { >- appendFPRegisterName('d', vd()); >- bufferPrintf("[%u]", opH()); >- } else >- appendFPRegisterName('s', vn()); >-} >- >-const char* ARMv7DOpcodeDataProcessingRegShift::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataProcessingRegExtend::s_opExtendNames[8] = { >- "sxth", "uxth", "sxtb16", "uxtb16", "sxtb", "uxtb" >-}; >- >-const char* const ARMv7DOpcodeDataProcessingRegExtend::s_opExtendAndAddNames[8] = { >- "sxtah", "uxtah", "sxtab16", "uxtab16", "sxtab", "uxtab" >-}; >- >-const char* ARMv7DOpcodeDataProcessingRegExtend::format() >-{ >- const char* instructionName; >- >- if (rn() == 0xf) >- instructionName = opExtendName(); >- else >- instructionName = opExtendAndAddName(); >- >- if (!instructionName) >- return defaultFormat(); >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- if (rotate()) { >- appendSeparator(); >- appendString("ror "); >- appendUnsignedImmediate(rotate() * 8); >- } >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataProcessingRegParallel::s_opNames[16] = { >- "sadd8", "sadd16", "sasx", 0, "ssub8", "ssub16", "ssax", 0, >- "qadd8", "qadd16", "qasx", 0, "qsub8", "qsub16", "qsax", 0 >-}; >- >-const char* ARMv7DOpcodeDataProcessingRegParallel::format() >-{ >- const char* instructionName; >- >- instructionName = opName(); >- >- if (!instructionName) >- return defaultFormat(); >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataProcessingRegMisc::s_opNames[16] = { >- "qadd", "qdadd", "qsub", "qdsub", "rev", "rev16", "rbit", "revsh", >- "sel", 0, 0, 0, "clz" >-}; >- >-const char* ARMv7DOpcodeDataProcessingRegMisc::format() >-{ >- const char* instructionName; >- >- instructionName = opName(); >- >- if (!instructionName) >- return defaultFormat(); >- >- if ((op1() & 0x1) && (rn() != rm())) >- return defaultFormat(); >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- >- if (op1() == 0x2) { // sel >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >- } >- >- appendRegisterName(rm()); >- >- if (!(op1() & 0x1)) { >- appendSeparator(); >- appendRegisterName(rn()); >- } >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeHint32::s_opNames[8] = { >- "nop", "yield", "wfe", "wfi", "sev" >-}; >- >-const char* ARMv7DOpcodeHint32::format() >-{ >- if (isDebugHint()) { >- appendInstructionName("debug"); >- appendUnsignedImmediate(debugOption()); >- >- return m_formatBuffer; >- } >- >- if (op() > 0x4) >- return defaultFormat(); >- >- appendInstructionName(opName()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataLoad::s_opNames[8] = { >- "ldrb", "ldrh", "ldr", 0, "ldrsb", "ldrsh" >-}; >- >-const char* ARMv7DOpcodeLoadRegister::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- if (immediate2()) { >- appendSeparator(); >- appendUnsignedImmediate(immediate2()); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeLoadSignedImmediate::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- if (pBit()) { >- if (wBit() || immediate8()) { >- appendSeparator(); >- if (uBit()) >- appendUnsignedImmediate(immediate8()); >- else >- appendSignedImmediate(0 - static_cast<int>(immediate8())); >- } >- appendCharacter(']'); >- if (wBit()) >- appendCharacter('!'); >- } else { >- appendCharacter(']'); >- appendSeparator(); >- if (uBit()) >- appendUnsignedImmediate(immediate8()); >- else >- appendSignedImmediate(0 - static_cast<int>(immediate8())); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeLoadUnsignedImmediate::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- if (immediate12()) { >- appendSeparator(); >- appendUnsignedImmediate(immediate12()); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeLongMultipleDivide::s_opNames[8] = { >- "smull", "sdiv", "umull", "udiv", "smlal", "smlsld", "umlal", 0 >-}; >- >-const char* const ARMv7DOpcodeLongMultipleDivide::s_smlalOpNames[4] = { >- "smlalbb", "smlalbt", "smlaltb", "smlaltt" >-}; >- >-const char* const ARMv7DOpcodeLongMultipleDivide::s_smlaldOpNames[2] = { >- "smlald", "smlaldx" >-}; >- >-const char* const ARMv7DOpcodeLongMultipleDivide::s_smlsldOpNames[2] = { >- "smlsld", "smlsldx" >-}; >- >-const char* ARMv7DOpcodeLongMultipleDivide::format() >-{ >- const char* instructionName = opName(); >- >- switch (op1()) { >- case 0x0: >- case 0x2: >- if (op2()) >- return defaultFormat(); >- break; >- case 0x1: >- case 0x3: >- if (op2() != 0xf) >- return defaultFormat(); >- break; >- case 0x4: >- if ((op2() & 0xc) == 0x8) >- instructionName = smlalOpName(); >- else if ((op2() & 0xe) == 0xc) >- instructionName = smlaldOpName(); >- else if (op2()) >- return defaultFormat(); >- break; >- case 0x5: >- if ((op2() & 0xe) == 0xc) >- instructionName = smlaldOpName(); >- else >- return defaultFormat(); >- break; >- case 0x6: >- if (op2() == 0x5) >- instructionName = "umaal"; >- else if (op2()) >- return defaultFormat(); >- break; >- case 0x7: >- return defaultFormat(); >- break; >- } >- >- appendInstructionName(instructionName); >- if ((op1() & 0x5) == 0x1) { // sdiv and udiv >- if (rt() != 0xf) >- return defaultFormat(); >- } else { >- appendRegisterName(rdLo()); >- appendSeparator(); >- } >- appendRegisterName(rdHi()); >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeUnmodifiedImmediate::s_opNames[16] = { >- "addw", 0, "movw", 0, 0, "subw", "movt", 0, >- "ssat", "ssat16", "sbfx", "bfi", "usat" , "usat16", "ubfx", 0 >-}; >- >-const char* ARMv7DOpcodeUnmodifiedImmediate::format() >-{ >- const char* instructionName = opName(); >- >- switch (op() >> 1) { >- case 0x0: >- case 0x5: >- if (rn() == 0xf) >- instructionName = "adr"; >- break; >- case 0x9: >- if (immediate5()) >- instructionName = "ssat"; >- break; >- case 0xb: >- if (rn() == 0xf) >- instructionName = "bfc"; >- break; >- case 0xd: >- if (immediate5()) >- instructionName = "usat"; >- break; >- } >- >- if (!instructionName) >- return defaultFormat(); >- >- appendInstructionName(instructionName); >- appendRegisterName(rd()); >- appendSeparator(); >- >- if ((op() & 0x17) == 0x4) { // movw or movt >- appendUnsignedImmediate(immediate16()); >- >- return m_formatBuffer; >- } >- >- if (!op() || (op() == 0xa)) { // addw, subw and adr >- if (rn() == 0xf) { >- int32_t offset; >- >- if ((op() == 0xa) && (rn() == 0xf)) >- offset = 0 - static_cast<int32_t>(immediate12()); >- else >- offset = static_cast<int32_t>(immediate12()); >- >- appendPCRelativeOffset(offset); >- >- return m_formatBuffer; >- } >- >- appendRegisterName(rn()); >- appendSeparator(); >- appendUnsignedImmediate(immediate12()); >- >- return m_formatBuffer; >- } >- >- if (((op() & 0x15) == 0x10) || (((op() & 0x17) == 0x12) && immediate5())) { // ssat, usat, ssat16 & usat16 >- appendSeparator(); >- appendUnsignedImmediate(bitNumOrSatImmediate() + 1); >- appendSeparator(); >- appendRegisterName(rn()); >- if (shBit() || immediate5()) { >- appendSeparator(); >- appendShiftType(shBit() << 1); >- appendUnsignedImmediate(immediate5()); >- } >- >- return m_formatBuffer; >- } >- >- if (op() == 0x16) { // bfi or bfc >- int width = static_cast<int>(bitNumOrSatImmediate()) - static_cast<int>(immediate5()) + 1; >- >- if (width < 0) >- return defaultFormat(); >- >- if (rn() != 0xf) { >- appendSeparator(); >- appendRegisterName(rn()); >- } >- appendSeparator(); >- appendUnsignedImmediate(immediate5()); >- appendSeparator(); >- appendSignedImmediate(width); >- >- return m_formatBuffer; >- } >- >- // Must be sbfx or ubfx >- appendSeparator(); >- appendRegisterName(rn()); >- appendSeparator(); >- appendUnsignedImmediate(immediate5()); >- appendSeparator(); >- appendUnsignedImmediate(bitNumOrSatImmediate() + 1); >- >- return m_formatBuffer; >-} >- >-const char* const ARMv7DOpcodeDataStoreSingle::s_opNames[4] = { >- "strb", "strh", "str", 0 >-}; >- >-const char* ARMv7DOpcodeDataPushPopSingle::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- >- return m_formatBuffer; >-} >- >-void ARMv7DOpcodeDataPushPopMultiple::appendRegisterList() >-{ >- unsigned registers = registerList(); >- >- appendCharacter('{'); >- bool needSeparator = false; >- >- for (unsigned i = 0; i < 16; i++) { >- if (registers & (1 << i)) { >- if (needSeparator) >- appendSeparator(); >- appendRegisterName(i); >- needSeparator = true; >- } >- } >- appendCharacter('}'); >-} >- >-const char* ARMv7DOpcodeDataPopMultiple::format() >-{ >- if (condition() != 0xe) >- bufferPrintf(" pop%-4.4s", conditionName(condition())); >- else >- appendInstructionName("pop"); >- appendRegisterList(); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeDataPushMultiple::format() >-{ >- if (condition() != 0xe) >- bufferPrintf(" push%-3.3s", conditionName(condition())); >- else >- appendInstructionName("push"); >- appendRegisterList(); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeStoreSingleImmediate12::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- if (immediate12()) { >- appendSeparator(); >- appendUnsignedImmediate(immediate12()); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeStoreSingleImmediate8::format() >-{ >- if (pBit() && uBit() && !wBit()) // Really undecoded strt >- return defaultFormat(); >- >- if ((rn() == 0xf) || (!pBit() && !wBit())) >- return defaultFormat(); >- >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- >- if (!pBit()) { >- appendCharacter(']'); >- appendSeparator(); >- appendSignedImmediate(uBit() ? static_cast<int32_t>(immediate8()) : (0 - static_cast<int32_t>(immediate8()))); >- >- return m_formatBuffer; >- } >- >- if (immediate8()) { >- appendSeparator(); >- appendSignedImmediate(uBit() ? static_cast<int32_t>(immediate8()) : (0 - static_cast<int32_t>(immediate8()))); >- } >- appendCharacter(']'); >- >- if (wBit()) >- appendCharacter('!'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeStoreSingleRegister::format() >-{ >- appendInstructionName(opName()); >- appendRegisterName(rt()); >- appendSeparator(); >- appendCharacter('['); >- appendRegisterName(rn()); >- appendSeparator(); >- appendRegisterName(rm()); >- if (immediate2()) { >- appendSeparator(); >- appendString("lsl "); >- appendUnsignedImmediate(immediate2()); >- } >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVCMP::format() >-{ >- bufferPrintf(" vcmp"); >- >- if (eBit()) >- appendCharacter('e'); // Raise exception on qNaN >- >- if (condition() != 0xe) >- appendString(conditionName(condition())); >- >- appendCharacter('.'); >- appendString(szBit() ? "f64" : "f32"); >- appendCharacter(' '); >- if (szBit()) { >- appendFPRegisterName('d', (dBit() << 4) | vd()); >- appendSeparator(); >- appendFPRegisterName('d', (mBit() << 4) | vm()); >- } else { >- appendFPRegisterName('s', (vd() << 1) | dBit()); >- appendSeparator(); >- appendFPRegisterName('s', (vm() << 1) | mBit()); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVCVTBetweenFPAndInt::format() >-{ >- bufferPrintf(" vcvt"); >- bool convertToInteger = op2() & 0x4; >- >- if (convertToInteger) { >- if (!op()) >- appendCharacter('r'); // Round using mode in FPSCR >- if (condition() != 0xe) >- appendString(conditionName(condition())); >- appendCharacter('.'); >- appendCharacter((op2() & 1) ? 's' : 'u'); >- appendString("32.f"); >- appendString(szBit() ? "64" : "32"); >- appendCharacter(' '); >- appendFPRegisterName('s', (vd() << 1) | dBit()); >- appendSeparator(); >- if (szBit()) >- appendFPRegisterName('d', (mBit() << 4) | vm()); >- else >- appendFPRegisterName('s', (vm() << 1) | mBit()); >- } else { >- if (condition() != 0xe) >- appendString(conditionName(condition())); >- appendCharacter('.'); >- appendString(szBit() ? "f64." : "f32."); >- appendString(op() ? "s32" : "u32"); >- appendCharacter(' '); >- if (szBit()) >- appendFPRegisterName('d', (dBit() << 4) | vd()); >- else >- appendFPRegisterName('s', (vd() << 1) | dBit()); >- appendSeparator(); >- appendFPRegisterName('s', (vm() << 1) | mBit()); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVLDRSTR::format() >-{ >- if (condition() != 0xe) >- bufferPrintf(" %s%-3.3s", opName(), conditionName(condition())); >- else >- appendInstructionName(opName()); >- >- appendFPRegisterName(doubleReg() ? 'd' : 's', vd()); >- appendSeparator(); >- >- int immediate = immediate8() * 4; >- >- if (!uBit()) >- immediate = -immediate; >- >- appendCharacter('['); >- >- if (rn() == RegPC) >- appendPCRelativeOffset(immediate); >- else { >- appendRegisterName(rn()); >- >- if (immediate) { >- appendSeparator(); >- appendSignedImmediate(immediate); >- } >- } >- >- appendCharacter(']'); >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVMOVDoublePrecision::format() >-{ >- appendInstructionName("vmov"); >- if (op()) { >- appendRegisterName(rt()); >- appendSeparator(); >- appendRegisterName(rt2()); >- appendSeparator(); >- } >- >- appendFPRegisterName('d', vm()); >- >- if (!op()) { >- appendSeparator(); >- appendRegisterName(rt()); >- appendSeparator(); >- appendRegisterName(rt2()); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVMOVSinglePrecision::format() >-{ >- appendInstructionName("vmov"); >- if (op()) { >- appendRegisterName(rt()); >- appendSeparator(); >- appendRegisterName(rt2()); >- appendSeparator(); >- } >- >- appendFPRegisterName('s', vm()); >- appendSeparator(); >- appendFPRegisterName('s', (vm() + 1) % 32); >- >- if (!op()) { >- appendSeparator(); >- appendRegisterName(rt()); >- appendSeparator(); >- appendRegisterName(rt2()); >- } >- >- return m_formatBuffer; >-} >- >-const char* ARMv7DOpcodeVMSR::format() >-{ >- appendInstructionName("vmrs"); >- if (opL()) { >- if (rt() == 0xf) >- appendString("apsr_nzcv"); >- else >- appendRegisterName(rt()); >- appendSeparator(); >- } >- >- appendString("fpscr"); >- >- if (!opL()) { >- appendSeparator(); >- appendRegisterName(rt()); >- } >- >- return m_formatBuffer; >-} >- >-} } // namespace JSC::ARMv7Disassembler >- >-#endif // #if USE(ARMV7_DISASSEMBLER) >diff --git a/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.h b/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.h >deleted file mode 100644 >index 36597af5d8c4dd851f5c78b6731c0feebb40c0b7..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/disassembler/ARMv7/ARMv7DOpcode.h >+++ /dev/null >@@ -1,1235 +0,0 @@ >-/* >- * Copyright (C) 2013 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#pragma once >- >-#if USE(ARMV7_DISASSEMBLER) >- >-#include <stdint.h> >-#include <wtf/Assertions.h> >- >-namespace JSC { namespace ARMv7Disassembler { >- >-class ARMv7DOpcode { >-public: >- static void init(); >- >- ARMv7DOpcode() >- : m_opcode(0) >- , m_bufferOffset(0) >- { >- init(); >- >- for (unsigned i = 0; i < 4; i++) >- m_ifThenConditions[i] = CondNone; >- >- endITBlock(); >- >- m_formatBuffer[0] = '\0'; >- } >- >- const char* disassemble(uint16_t*& currentPC); >- >-protected: >- const unsigned RegSP = 0xd; >- const unsigned RegLR = 0xe; >- const unsigned RegPC = 0xf; >- >- void fetchOpcode(uint16_t*&); >- bool is32BitInstruction() { return (m_opcode & 0xfffff800) > 0xe000; } >- bool isFPInstruction() { return (m_opcode & 0xfc000e00) == 0xec000a00; } >- >- static const char* const s_conditionNames[16]; >- static const char* const s_shiftNames[4]; >- static const char* const s_optionName[8]; >- static const char* const s_specialRegisterNames[3]; >- >- static const char* conditionName(unsigned condition) { return s_conditionNames[condition & 0xf]; } >- static const char* shiftName(unsigned shiftValue) { return s_shiftNames[shiftValue & 0x3]; } >- >- bool inITBlock() { return m_ITConditionIndex < m_ITBlocksize; } >- bool startingITBlock() { return m_ITConditionIndex == m_ITBlocksize + 1; } >- >- void startITBlock(unsigned, unsigned); >- void saveITConditionAt(unsigned, unsigned); >- void endITBlock() >- { >- m_currentITCondition = CondNone; >- m_ITConditionIndex = 0; >- m_ITBlocksize = 0; >- } >- >- void bufferPrintf(const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); >- void appendInstructionName(const char*, bool addS = false); >- >- void appendInstructionNameNoITBlock(const char* instructionName) >- { >- bufferPrintf(" %-7.7s", instructionName); >- } >- >- void appendRegisterName(unsigned); >- void appendRegisterList(unsigned); >- void appendFPRegisterName(char, unsigned); >- >- void appendSeparator() >- { >- bufferPrintf(", "); >- } >- >- void appendCharacter(const char c) >- { >- bufferPrintf("%c", c); >- } >- >- void appendString(const char* string) >- { >- bufferPrintf("%s", string); >- } >- >- void appendShiftType(unsigned shiftValue) >- { >- bufferPrintf("%s ", shiftName(shiftValue)); >- } >- >- void appendSignedImmediate(int immediate) >- { >- bufferPrintf("#%d", immediate); >- } >- >- void appendUnsignedImmediate(unsigned immediate) >- { >- bufferPrintf("#%u", immediate); >- } >- >- void appendPCRelativeOffset(int32_t immediate) >- { >- bufferPrintf("0x%x", reinterpret_cast<uint32_t>(m_currentPC + immediate)); >- } >- >- void appendShiftAmount(unsigned amount) >- { >- bufferPrintf("lsl #%u", 16 * amount); >- } >- >- static const int bufferSize = 81; >- static const unsigned char CondNone = 0xe; >- static const unsigned MaxITBlockSize = 4; >- >- char m_formatBuffer[bufferSize]; >- unsigned char m_ifThenConditions[MaxITBlockSize]; >- uint16_t* m_currentPC; >- uint32_t m_opcode; >- int m_bufferOffset; >- int m_currentITCondition; >- unsigned m_ITConditionIndex; >- unsigned m_ITBlocksize; >- >-private: >- static bool s_initialized; >-}; >- >-#define DEFINE_STATIC_FORMAT16(klass, thisObj) \ >- static const char* format(ARMv7D16BitOpcode* thisObj) { return reinterpret_cast< klass *>(thisObj)->format(); } >- >-class ARMv7D16BitOpcode : public ARMv7DOpcode { >-private: >- class OpcodeGroup { >- public: >- OpcodeGroup(uint16_t opcodeMask, uint16_t opcodePattern, const char* (*format)(ARMv7D16BitOpcode*)) >- : m_opcodeMask(opcodeMask) >- , m_opcodePattern(opcodePattern) >- , m_format(format) >- , m_next(0) >- { >- } >- >- void setNext(OpcodeGroup* next) >- { >- m_next = next; >- } >- >- OpcodeGroup* next() >- { >- return m_next; >- } >- >- bool matches(uint16_t opcode) >- { >- return (opcode & m_opcodeMask) == m_opcodePattern; >- } >- >- const char* format(ARMv7D16BitOpcode* thisObj) >- { >- return m_format(thisObj); >- } >- >- public: >- static const unsigned opcodeTableSize = 32; >- static const unsigned opcodeTableMask = opcodeTableSize-1; >- >- // private: >- uint16_t m_opcodeMask; >- uint16_t m_opcodePattern; >- const char* (*m_format)(ARMv7D16BitOpcode*); >- OpcodeGroup* m_next; >- }; >- >-public: >- static void init(); >- >- const char* defaultFormat(); >- const char* doDisassemble(); >- >-protected: >- unsigned rm() { return (m_opcode >> 3) & 0x7; } >- unsigned rd() { return m_opcode & 0x7; } >- unsigned opcodeGroupNumber(unsigned opcode) { return (opcode >> 11) & OpcodeGroup::opcodeTableMask; } >- >-private: >- static OpcodeGroup* opcodeTable[OpcodeGroup::opcodeTableSize]; >-}; >- >-class ARMv7DOpcodeAddRegisterT2 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0x4400; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeAddRegisterT2, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rdn() { return ((m_opcode >> 4) & 0x8) | (m_opcode & 0x7); } >- unsigned rm() { return ((m_opcode >> 3) & 0xf); } >-}; >- >-class ARMv7DOpcodeAddSPPlusImmediate : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0xc800; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeAddSPPlusImmediate, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rd() { return (m_opcode >> 8) & 0x7; } >- unsigned immediate8() { return m_opcode & 0x0ff; } >-}; >- >-class ARMv7DOpcodeAddSubtract : public ARMv7D16BitOpcode { >-protected: >- static const char* const s_opNames[2]; >-}; >- >-class ARMv7DOpcodeAddSubtractT1 : public ARMv7DOpcodeAddSubtract { >-public: >- static const uint16_t s_mask = 0xfc00; >- static const uint16_t s_pattern = 0x1800; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeAddSubtractT1, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 9) & 0x1; } >- unsigned rm() { return (m_opcode >> 6) & 0x7; } >- unsigned rn() { return (m_opcode >> 3) & 0x7; } >-}; >- >-class ARMv7DOpcodeAddSubtractImmediate3 : public ARMv7DOpcodeAddSubtract { >-public: >- static const uint16_t s_mask = 0xfc00; >- static const uint16_t s_pattern = 0x1c00; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeAddSubtractImmediate3, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 9) & 0x1; } >- unsigned immediate3() { return (m_opcode >> 6) & 0x7; } >- unsigned rn() { return (m_opcode >> 3) & 0x7; } >-}; >- >-class ARMv7DOpcodeAddSubtractImmediate8 : public ARMv7DOpcodeAddSubtract { >-public: >- static const uint16_t s_mask = 0xf000; >- static const uint16_t s_pattern = 0x3000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeAddSubtractImmediate8, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 11) & 0x1; } >- unsigned rdn() { return (m_opcode >> 8) & 0x7; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeBranchConditionalT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf000; >- static const uint16_t s_pattern = 0xd000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeBranchConditionalT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned condition() { return (m_opcode >> 8) & 0xf; } >- int offset() { return static_cast<int>(m_opcode & 0xff); } >-}; >- >-class ARMv7DOpcodeBranchExchangeT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0x4700; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeBranchExchangeT1, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return (m_opcode & 0x80) ? "blx" : "bx"; } >- unsigned rm() { return ((m_opcode >> 3) & 0xf); } >-}; >- >-class ARMv7DOpcodeBranchT2 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0xe000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeBranchT2, thisObj); >- >-protected: >- const char* format(); >- >- int immediate11() { return static_cast<int>(m_opcode & 0x7ff); } >-}; >- >-class ARMv7DOpcodeCompareImmediateT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0x2800; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeCompareImmediateT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rn() { return (m_opcode >> 8) & 0x3; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeCompareRegisterT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xffc0; >- static const uint16_t s_pattern = 0x4280; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeCompareRegisterT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rn() { return m_opcode & 0x7; } >-}; >- >-class ARMv7DOpcodeCompareRegisterT2 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0x4500; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeCompareRegisterT2, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rn() { return ((m_opcode >> 4) & 0x8) | (m_opcode & 0x7); } >- unsigned rm() { return ((m_opcode >> 3) & 0xf); } >-}; >- >-class ARMv7DOpcodeDataProcessingRegisterT1 : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[16]; >- >-public: >- static const uint16_t s_mask = 0xfc00; >- static const uint16_t s_pattern = 0x4000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeDataProcessingRegisterT1, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 6) & 0xf; } >- >- unsigned rm() { return (m_opcode >> 3) & 0x7; } >- unsigned rdn() { return m_opcode & 0x7; } >-}; >- >-class ARMv7DOpcodeGeneratePCRelativeAddress : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0xa000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeGeneratePCRelativeAddress, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rd() { return (m_opcode >> 8) & 0x7; } >- unsigned immediate8() { return m_opcode & 0x0ff; } >-}; >- >-class ARMv7DOpcodeLoadFromLiteralPool : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0x4800; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadFromLiteralPool, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rt() { return (m_opcode >> 8) & 0x7; } >- unsigned immediate8() { return m_opcode & 0x0ff; } >-}; >- >-class ARMv7DOpcodeLoadStoreRegisterImmediate : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[6]; >- >-public: >- const char* format(); >- >-protected: >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return ((m_opcode >> 11) & 0x1f) - 0xc; } >- unsigned immediate5() { return (m_opcode >> 6) & 0x01f; } >- unsigned rn() { return (m_opcode >> 3) & 0x7; } >- unsigned rt() { return m_opcode & 0x7; } >- unsigned scale(); >-}; >- >-class ARMv7DOpcodeLoadStoreRegisterImmediateWordAndByte : public ARMv7DOpcodeLoadStoreRegisterImmediate { >-public: >- static const uint16_t s_mask = 0xe000; >- static const uint16_t s_pattern = 0x6000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadStoreRegisterImmediate, thisObj); >-}; >- >-class ARMv7DOpcodeStoreRegisterImmediateHalfWord : public ARMv7DOpcodeLoadStoreRegisterImmediate { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0x8000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadStoreRegisterImmediate, thisObj); >-}; >- >-class ARMv7DOpcodeLoadRegisterImmediateHalfWord : public ARMv7DOpcodeLoadStoreRegisterImmediate { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0x8800; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadStoreRegisterImmediate, thisObj); >-}; >- >-class ARMv7DOpcodeLoadStoreRegisterOffsetT1 : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[8]; >- >-public: >- static const uint16_t s_mask = 0xf000; >- static const uint16_t s_pattern = 0x5000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadStoreRegisterOffsetT1, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[opB()]; } >- >- unsigned opB() { return (m_opcode >> 9) & 0x7; } >- unsigned rm() { return (m_opcode >> 6) & 0x7; } >- unsigned rn() { return (m_opcode >> 3) & 0x7; } >- unsigned rt() { return m_opcode & 0x7; } >-}; >- >-class ARMv7DOpcodeLoadStoreRegisterSPRelative : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[8]; >- >-public: >- static const uint16_t s_mask = 0xf000; >- static const uint16_t s_pattern = 0x9000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLoadStoreRegisterSPRelative, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return op() ? "ldr" : "str"; } >- >- unsigned op() { return (m_opcode >> 11) & 0x1; } >- unsigned rt() { return (m_opcode >> 8) & 0x7; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeLogicalImmediateT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xe000; >- static const uint16_t s_pattern = 0x0000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeLogicalImmediateT1, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return shiftName(op()); } >- >- unsigned op() { return (m_opcode >> 12) & 0x3; } >- unsigned immediate5() { return (m_opcode >> 6) & 0x1f; } >-}; >- >-class ARMv7DOpcodeMiscAddSubSP : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0xb000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscAddSubSP, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return op() ? "sub" : "add"; } >- unsigned op() { return (m_opcode >> 7) & 0x1; } >- unsigned immediate7() { return m_opcode & 0x7f; } >-}; >- >-class ARMv7DOpcodeMiscByteHalfwordOps : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[8]; >- >-public: >- static const uint16_t s_mask = 0xf700; >- static const uint16_t s_pattern = 0xb200; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscByteHalfwordOps, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- unsigned op() { return ((m_opcode >> 9) & 0x4) || ((m_opcode >> 6) & 0x3); } >-}; >- >-class ARMv7DOpcodeMiscBreakpointT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0xbe00; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscBreakpointT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeMiscCompareAndBranch : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf500; >- static const uint16_t s_pattern = 0xb100; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscCompareAndBranch, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return op() ? "cbnz" : "cbz"; } >- unsigned op() { return (m_opcode >> 11) & 0x1; } >- int32_t immediate6() { return ((m_opcode >> 4) & 0x20) | ((m_opcode >> 3) & 0x1f); } >- unsigned rn() { return m_opcode & 0x7; } >-}; >- >-class ARMv7DOpcodeMiscHint16 : public ARMv7D16BitOpcode { >-private: >- static const char* const s_opNames[16]; >- >-public: >- static const uint16_t s_mask = 0xff0f; >- static const uint16_t s_pattern = 0xbf00; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscHint16, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[opA()]; } >- unsigned opA() { return (m_opcode >> 4) & 0xf; } >-}; >- >-class ARMv7DOpcodeMiscIfThenT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0xbf00; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscIfThenT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned firstCondition() { return (m_opcode >> 4) & 0xf; } >- unsigned mask() { return m_opcode & 0xf; } >-}; >- >-class ARMv7DOpcodeMiscPushPop : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf600; >- static const uint16_t s_pattern = 0xb400; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMiscPushPop, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return op() ? "pop" : "push"; } >- unsigned op() { return (m_opcode >> 11) & 0x1; } >- unsigned registerMask() { return ((m_opcode << 6) & 0x4000) | (m_opcode & 0xff); } >-}; >- >-class ARMv7DOpcodeMoveImmediateT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xf800; >- static const uint16_t s_pattern = 0x2000; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMoveImmediateT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rd() { return (m_opcode >> 8) & 0x3; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeMoveRegisterT1 : public ARMv7D16BitOpcode { >-public: >- static const uint16_t s_mask = 0xff00; >- static const uint16_t s_pattern = 0x4600; >- >- DEFINE_STATIC_FORMAT16(ARMv7DOpcodeMoveRegisterT1, thisObj); >- >-protected: >- const char* format(); >- >- unsigned rd() { return ((m_opcode >> 4) & 0x8) | (m_opcode & 0x7); } >- unsigned rm() { return ((m_opcode >> 3) & 0xf); } >-}; >- >-// 32 Bit instructions >- >-#define DEFINE_STATIC_FORMAT32(klass, thisObj) \ >- static const char* format(ARMv7D32BitOpcode* thisObj) { return reinterpret_cast< klass *>(thisObj)->format(); } >- >-class ARMv7D32BitOpcode : public ARMv7DOpcode { >-private: >- class OpcodeGroup { >- public: >- OpcodeGroup(uint32_t opcodeMask, uint32_t opcodePattern, const char* (*format)(ARMv7D32BitOpcode*)) >- : m_opcodeMask(opcodeMask) >- , m_opcodePattern(opcodePattern) >- , m_format(format) >- , m_next(0) >- { >- } >- >- void setNext(OpcodeGroup* next) >- { >- m_next = next; >- } >- >- OpcodeGroup* next() >- { >- return m_next; >- } >- >- bool matches(uint32_t opcode) >- { >- return (opcode & m_opcodeMask) == m_opcodePattern; >- } >- >- const char* format(ARMv7D32BitOpcode* thisObj) >- { >- return m_format(thisObj); >- } >- >- public: >- static const unsigned opcodeTableSize = 16; >- static const unsigned opcodeTableMask = opcodeTableSize-1; >- >- private: >- uint32_t m_opcodeMask; >- uint32_t m_opcodePattern; >- const char* (*m_format)(ARMv7D32BitOpcode*); >- OpcodeGroup* m_next; >- }; >- >-public: >- static void init(); >- >- const char* defaultFormat(); >- const char* doDisassemble(); >- >-protected: >- unsigned rd() { return (m_opcode >> 8) & 0xf; } >- unsigned rm() { return m_opcode & 0xf; } >- unsigned rn() { return (m_opcode >> 16) & 0xf; } >- unsigned rt() { return (m_opcode >> 12) & 0xf; } >- >- unsigned opcodeGroupNumber(unsigned opcode) { return (opcode >> 25) & OpcodeGroup::opcodeTableMask; } >- >-private: >- static OpcodeGroup* opcodeTable[OpcodeGroup::opcodeTableSize]; >-}; >- >-class ARMv7DOpcodeBranchRelative : public ARMv7D32BitOpcode { >-protected: >- unsigned sBit() { return (m_opcode >> 26) & 0x1; } >- unsigned j1() { return (m_opcode >> 13) & 0x1; } >- unsigned j2() { return (m_opcode >> 11) & 0x1; } >- unsigned immediate11() { return m_opcode & 0x7ff; } >-}; >- >-class ARMv7DOpcodeConditionalBranchT3 : public ARMv7DOpcodeBranchRelative { >-public: >- static const uint32_t s_mask = 0xf800d000; >- static const uint32_t s_pattern = 0xf0008000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeConditionalBranchT3, thisObj); >- >-protected: >- const char* format(); >- >- int32_t offset() { return ((static_cast<int32_t>(sBit() << 31)) >> 12) | static_cast<int32_t>((j1() << 18) | (j2() << 17) | (immediate6() << 11) | immediate11()); } >- unsigned condition() { return (m_opcode >> 22) & 0xf; } >- unsigned immediate6() { return (m_opcode >> 16) & 0x3f; } >-}; >- >-class ARMv7DOpcodeBranchOrBranchLink : public ARMv7DOpcodeBranchRelative { >-public: >- static const uint32_t s_mask = 0xf8009000; >- static const uint32_t s_pattern = 0xf0009000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeBranchOrBranchLink, thisObj); >- >-protected: >- const char* format(); >- >- int32_t offset() { return ((static_cast<int32_t>(sBit() << 31)) >> 8) | static_cast<int32_t>((~(j1() ^ sBit()) << 22) | (~(j2() ^ sBit()) << 21) | (immediate10() << 11) | immediate11()); } >- unsigned immediate10() { return (m_opcode >> 16) & 0x3ff; } >- bool isBL() { return !!((m_opcode >> 14) & 0x1); } >-}; >- >-class ARMv7DOpcodeDataProcessingLogicalAndRithmetic : public ARMv7D32BitOpcode { >-protected: >- static const char* const s_opNames[16]; >-}; >- >-class ARMv7DOpcodeDataProcessingModifiedImmediate : public ARMv7DOpcodeDataProcessingLogicalAndRithmetic { >-private: >- void appendImmShift(unsigned, unsigned); >- >-public: >- static const uint32_t s_mask = 0xfa008000; >- static const uint32_t s_pattern = 0xf0000000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingModifiedImmediate, thisObj); >- >-protected: >- const char* format(); >- void appendModifiedImmediate(unsigned); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 21) & 0xf; } >- unsigned sBit() { return (m_opcode >> 20) & 0x1; } >- unsigned immediate12() { return ((m_opcode >> 15) & 0x0800) | ((m_opcode >> 4) & 0x0700) | (m_opcode & 0x00ff); } >-}; >- >-class ARMv7DOpcodeDataProcessingShiftedReg : public ARMv7DOpcodeDataProcessingLogicalAndRithmetic { >-private: >- void appendImmShift(unsigned, unsigned); >- >-public: >- static const uint32_t s_mask = 0xfe000000; >- static const uint32_t s_pattern = 0xea000000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingShiftedReg, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- unsigned sBit() { return (m_opcode >> 20) & 0x1; } >- unsigned op() { return (m_opcode >> 21) & 0xf; } >- unsigned immediate5() { return ((m_opcode >> 10) & 0x1c) | ((m_opcode >> 6) & 0x3); } >- unsigned type() { return (m_opcode >> 4) & 0x3; } >- unsigned tbBit() { return (m_opcode >> 5) & 0x1; } >- unsigned tBit() { return (m_opcode >> 4) & 0x1; } >-}; >- >-class ARMv7DOpcodeDataProcessingReg : public ARMv7D32BitOpcode { >-protected: >- unsigned op1() { return (m_opcode >> 20) & 0xf; } >- unsigned op2() { return (m_opcode >> 4) & 0xf; } >-}; >- >-class ARMv7DOpcodeDataProcessingRegShift : public ARMv7DOpcodeDataProcessingReg { >-public: >- static const uint32_t s_mask = 0xffe0f0f0; >- static const uint32_t s_pattern = 0xfa00f000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingRegShift, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return shiftName((op1() >> 1) & 0x3); } >-}; >- >-class ARMv7DOpcodeDataProcessingRegExtend : public ARMv7DOpcodeDataProcessingReg { >-private: >- static const char* const s_opExtendNames[8]; >- static const char* const s_opExtendAndAddNames[8]; >- >-public: >- static const uint32_t s_mask = 0xff80f0c0; >- static const uint32_t s_pattern = 0xfa00f080; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingRegExtend, thisObj); >- >-protected: >- const char* format(); >- >- const char* opExtendName() { return s_opExtendNames[op1()]; } >- const char* opExtendAndAddName() { return s_opExtendAndAddNames[op1()]; } >- unsigned rotate() { return (m_opcode >> 4) & 0x3; } >-}; >- >-class ARMv7DOpcodeDataProcessingRegParallel : public ARMv7DOpcodeDataProcessingReg { >-private: >- static const char* const s_opNames[16]; >- >-public: >- static const uint32_t s_mask = 0xff80f0e0; >- static const uint32_t s_pattern = 0xfa00f000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingRegParallel, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[((op1() & 0x7) << 1) | (op2() & 0x1)]; } >-}; >- >-class ARMv7DOpcodeDataProcessingRegMisc : public ARMv7DOpcodeDataProcessingReg { >-private: >- static const char* const s_opNames[16]; >- >-public: >- static const uint32_t s_mask = 0xffc0f0c0; >- static const uint32_t s_pattern = 0xfa80f080; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataProcessingRegMisc, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[((op1() & 0x3) << 2) | (op2() & 0x3)]; } >-}; >- >-class ARMv7DOpcodeHint32 : public ARMv7D32BitOpcode { >-private: >- static const char* const s_opNames[8]; >- >-public: >- static const uint32_t s_mask = 0xfff0d000; >- static const uint32_t s_pattern = 0xf3a08000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeHint32, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op()]; } >- >- bool isDebugHint() { return (m_opcode & 0xf0) == 0xf0; } >- unsigned debugOption() { return m_opcode & 0xf; } >- unsigned op() { return m_opcode & 0x7; } >-}; >- >-class ARMv7DOpcodeFPTransfer : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0xffc00e7f; >- static const uint32_t s_pattern = 0xee000a10; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeFPTransfer, thisObj); >- >-protected: >- const char* format(); >- >- void appendFPRegister(); >- >- unsigned opH() { return (m_opcode >> 21) & 0x1; } >- unsigned opL() { return (m_opcode >> 20) & 0x1; } >- unsigned rt() { return (m_opcode >> 12) & 0xf; } >- unsigned opC() { return (m_opcode >> 8) & 0x1; } >- unsigned opB() { return (m_opcode >> 5) & 0x3; } >- unsigned vd() { return ((m_opcode >> 3) & 0x10) | ((m_opcode >> 16) & 0xf); } >- unsigned vn() { return ((m_opcode >> 7) & 0x1) | ((m_opcode >> 15) & 0x1e); } >-}; >- >-class ARMv7DOpcodeDataLoad : public ARMv7D32BitOpcode { >-protected: >- static const char* const s_opNames[8]; >- >-protected: >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return ((m_opcode >> 22) & 0x4) | ((m_opcode >> 21) & 0x3); } >-}; >- >-class ARMv7DOpcodeLoadRegister : public ARMv7DOpcodeDataLoad { >-public: >- static const uint32_t s_mask = 0xfe900800; >- static const uint32_t s_pattern = 0xf8100000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeLoadRegister, thisObj); >- >-protected: >- const char* format(); >- >- unsigned immediate2() { return (m_opcode >> 4) & 0x3; } >-}; >- >-class ARMv7DOpcodeLoadSignedImmediate : public ARMv7DOpcodeDataLoad { >-public: >- static const uint32_t s_mask = 0xfe900800; >- static const uint32_t s_pattern = 0xf8100800; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeLoadSignedImmediate, thisObj); >- >-protected: >- const char* format(); >- >- unsigned pBit() { return (m_opcode >> 10) & 0x1; } >- unsigned uBit() { return (m_opcode >> 9) & 0x1; } >- unsigned wBit() { return (m_opcode >> 8) & 0x1; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeLoadUnsignedImmediate : public ARMv7DOpcodeDataLoad { >-public: >- static const uint32_t s_mask = 0xfe900000; >- static const uint32_t s_pattern = 0xf8900000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeLoadUnsignedImmediate, thisObj); >- >-protected: >- const char* format(); >- >- unsigned immediate12() { return m_opcode & 0xfff; } >-}; >- >-class ARMv7DOpcodeLongMultipleDivide : public ARMv7D32BitOpcode { >-protected: >- static const char* const s_opNames[8]; >- static const char* const s_smlalOpNames[4]; >- static const char* const s_smlaldOpNames[2]; >- static const char* const s_smlsldOpNames[2]; >- >-public: >- static const uint32_t s_mask = 0xff800000; >- static const uint32_t s_pattern = 0xfb800000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeLongMultipleDivide, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op1()]; } >- const char* smlalOpName() { return s_smlalOpNames[(nBit() << 1) | mBit()]; } >- const char* smlaldOpName() { return s_smlaldOpNames[mBit()]; } >- const char* smlsldOpName() { return s_smlsldOpNames[mBit()]; } >- >- unsigned rdLo() { return rt(); } >- unsigned rdHi() { return rd(); } >- unsigned op1() { return (m_opcode >> 20) & 0x7; } >- unsigned op2() { return (m_opcode >> 4) & 0xf; } >- unsigned nBit() { return (m_opcode >> 5) & 0x1; } >- unsigned mBit() { return (m_opcode >> 4) & 0x1; } >-}; >- >-class ARMv7DOpcodeDataPushPopSingle : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0xffef0fff; >- static const uint32_t s_pattern = 0xf84d0d04; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataPushPopSingle, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return op() ? "pop" : "push"; } >- unsigned op() { return (m_opcode >> 20) & 0x1; } >-}; >- >-class ARMv7DOpcodeDataPushPopMultiple : public ARMv7D32BitOpcode { >-protected: >- void appendRegisterList(); >- >- unsigned registerList() { return m_opcode & 0xffff; } >- unsigned condition() { return m_opcode >> 28; } >-}; >- >-class ARMv7DOpcodeDataPopMultiple : public ARMv7DOpcodeDataPushPopMultiple { >-public: >- static const uint32_t s_mask = 0x0fff0000; >- static const uint32_t s_pattern = 0x08bd0000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataPopMultiple, thisObj); >- >-protected: >- const char* format(); >-}; >- >-class ARMv7DOpcodeDataPushMultiple : public ARMv7DOpcodeDataPushPopMultiple { >-public: >- static const uint32_t s_mask = 0xfe7f0000; >- static const uint32_t s_pattern = 0xe82d0000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeDataPushMultiple, thisObj); >- >-protected: >- const char* format(); >-}; >- >-class ARMv7DOpcodeDataStoreSingle : public ARMv7D32BitOpcode { >-protected: >- static const char* const s_opNames[4]; >- >-protected: >- const char* opName() { return s_opNames[op()]; } >- >- unsigned op() { return (m_opcode >> 21) & 0x3; } >-}; >- >-class ARMv7DOpcodeStoreSingleImmediate12 : public ARMv7DOpcodeDataStoreSingle { >-public: >- static const uint32_t s_mask = 0xfff00000; >- static const uint32_t s_pattern = 0xf8c00000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeStoreSingleImmediate12, thisObj); >- >- const char* format(); >- >-protected: >- unsigned immediate12() { return m_opcode & 0xfff; } >-}; >- >-class ARMv7DOpcodeStoreSingleImmediate8 : public ARMv7DOpcodeDataStoreSingle { >-public: >- static const uint32_t s_mask = 0xfff00800; >- static const uint32_t s_pattern = 0xf8400800; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeStoreSingleImmediate8, thisObj); >- >- const char* format(); >- >-protected: >- unsigned pBit() { return (m_opcode >> 10) & 0x1; } >- unsigned uBit() { return (m_opcode >> 9) & 0x1; } >- unsigned wBit() { return (m_opcode >> 8) & 0x1; } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeStoreSingleRegister : public ARMv7DOpcodeDataStoreSingle { >-public: >- static const uint32_t s_mask = 0xfff00fc0; >- static const uint32_t s_pattern = 0xf8400000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeStoreSingleRegister, thisObj); >- >-protected: >- const char* format(); >- >- unsigned immediate2() { return (m_opcode >> 4) & 0x3; } >-}; >- >-class ARMv7DOpcodeUnmodifiedImmediate : public ARMv7D32BitOpcode { >-protected: >- static const char* const s_opNames[16]; >- >-public: >- static const uint32_t s_mask = 0xfa008000; >- static const uint32_t s_pattern = 0xf2000000; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeUnmodifiedImmediate, thisObj); >- >-protected: >- const char* format(); >- >- const char* opName() { return s_opNames[op() >> 1]; } >- >- unsigned op() { return (m_opcode >> 20) & 0x1f; } >- unsigned shBit() { return (m_opcode >> 21) & 0x1; } >- unsigned bitNumOrSatImmediate() { return m_opcode & 0x1f; } >- unsigned immediate5() { return ((m_opcode >> 9) & 0x1c) | ((m_opcode >> 6) & 0x3); } >- unsigned immediate12() { return ((m_opcode >> 15) & 0x0800) | ((m_opcode >> 4) & 0x0700) | (m_opcode & 0x00ff); } >- unsigned immediate16() { return ((m_opcode >> 4) & 0xf000) | ((m_opcode >> 15) & 0x0800) | ((m_opcode >> 4) & 0x0700) | (m_opcode & 0x00ff); } >-}; >- >-class ARMv7DOpcodeVCMP : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0x0fbf0e50; >- static const uint32_t s_pattern = 0x0eb40a40; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVCMP, thisObj); >- >-protected: >- const char* format(); >- >- unsigned condition() { return m_opcode >> 28; } >- unsigned dBit() { return (m_opcode >> 22) & 0x1; } >- unsigned vd() { return (m_opcode >> 12) & 0xf; } >- unsigned szBit() { return (m_opcode >> 8) & 0x1; } >- unsigned eBit() { return (m_opcode >> 7) & 0x1; } >- unsigned mBit() { return (m_opcode >> 5) & 0x1; } >- unsigned vm() { return m_opcode & 0xf; } >-}; >- >-class ARMv7DOpcodeVCVTBetweenFPAndInt : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0x0fb80e50; >- static const uint32_t s_pattern = 0x0eb80a40; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVCVTBetweenFPAndInt, thisObj); >- >-protected: >- const char* format(); >- >- unsigned condition() { return m_opcode >> 28; } >- unsigned dBit() { return (m_opcode >> 22) & 0x1; } >- unsigned op2() { return (m_opcode >> 16) & 0x7; } >- unsigned vd() { return (m_opcode >> 12) & 0xf; } >- unsigned szBit() { return (m_opcode >> 8) & 0x1; } >- unsigned op() { return (m_opcode >> 7) & 0x1; } >- unsigned mBit() { return (m_opcode >> 5) & 0x1; } >- unsigned vm() { return m_opcode & 0xf; } >-}; >- >-class ARMv7DOpcodeVLDRSTR : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0x0f200e00; >- static const uint32_t s_pattern = 0x0d000a00; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVLDRSTR, thisObj); >- >-protected: >- const char* format(); >- >- const char *opName() { return (m_opcode >> 20) & 0x1 ? "vldr" : "vstr"; } >- unsigned condition() { return m_opcode >> 28; } >- unsigned uBit() { return (m_opcode >> 23) & 0x1; } >- unsigned rn() { return (m_opcode >> 16) & 0xf; } >- unsigned vd() { return ((m_opcode >> 18) & 0x10) | ((m_opcode >> 12) & 0xf); } >- bool doubleReg() { return !!(m_opcode & 0x100); } >- unsigned immediate8() { return m_opcode & 0xff; } >-}; >- >-class ARMv7DOpcodeVMOVDoublePrecision : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0xffe00fd0; >- static const uint32_t s_pattern = 0xec400b10; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVMOVDoublePrecision, thisObj); >- >-protected: >- const char* format(); >- >- unsigned op() { return (m_opcode >> 20) & 0x1; } >- unsigned rt2() { return (m_opcode >> 16) & 0xf; } >- unsigned rt() { return (m_opcode >> 12) & 0xf; } >- unsigned vm() { return (m_opcode & 0xf) | ((m_opcode >> 1) & 0x10); } >-}; >- >-class ARMv7DOpcodeVMOVSinglePrecision : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0xffe00fd0; >- static const uint32_t s_pattern = 0xec400a10; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVMOVSinglePrecision, thisObj); >- >-protected: >- const char* format(); >- >- unsigned op() { return (m_opcode >> 20) & 0x1; } >- unsigned rt2() { return (m_opcode >> 16) & 0xf; } >- unsigned rt() { return (m_opcode >> 12) & 0xf; } >- unsigned vm() { return ((m_opcode << 1) & 0x1e) | ((m_opcode >> 5) & 0x1); } >-}; >- >-class ARMv7DOpcodeVMSR : public ARMv7D32BitOpcode { >-public: >- static const uint32_t s_mask = 0xffef0fff; >- static const uint32_t s_pattern = 0xeee10a10; >- >- DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVMSR, thisObj); >- >-protected: >- const char* format(); >- >- unsigned opL() { return (m_opcode >> 20) & 0x1; } >- unsigned rt() { return (m_opcode >> 12) & 0xf; } >-}; >- >- >-} } // namespace JSC::ARMv7Disassembler >- >-using JSC::ARMv7Disassembler::ARMv7DOpcode; >- >-#endif // #if USE(ARMV7_DISASSEMBLER) >diff --git a/Source/JavaScriptCore/disassembler/ARMv7Disassembler.cpp b/Source/JavaScriptCore/disassembler/ARMv7Disassembler.cpp >deleted file mode 100644 >index 6be31c8e6bc2c1817094dbe38f261c2165812d02..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/disassembler/ARMv7Disassembler.cpp >+++ /dev/null >@@ -1,55 +0,0 @@ >-/* >- * Copyright (C) 2013-2018 Apple Inc. All rights reserved. >- * >- * Redistribution and use in source and binary forms, with or without >- * modification, are permitted provided that the following conditions >- * are met: >- * 1. Redistributions of source code must retain the above copyright >- * notice, this list of conditions and the following disclaimer. >- * 2. Redistributions in binary form must reproduce the above copyright >- * notice, this list of conditions and the following disclaimer in the >- * documentation and/or other materials provided with the distribution. >- * >- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >- */ >- >-#include "config.h" >-#include "Disassembler.h" >- >-#if USE(ARMV7_DISASSEMBLER) >- >-#include "ARMv7DOpcode.h" >-#include "MacroAssemblerCodeRef.h" >- >-namespace JSC { >- >-bool tryToDisassemble(const MacroAssemblerCodePtr<DisassemblyPtrTag>& codePtr, size_t size, const char* prefix, PrintStream& out) >-{ >- ARMv7DOpcode armOpcode; >- >- uint16_t* currentPC = reinterpret_cast<uint16_t*>(reinterpret_cast<uintptr_t>(codePtr.untaggedExecutableAddress())&~1); >- uint16_t* endPC = currentPC + (size / sizeof(uint16_t)); >- >- while (currentPC < endPC) { >- char pcString[12]; >- snprintf(pcString, sizeof(pcString), "0x%x", reinterpret_cast<unsigned>(currentPC)); >- out.printf("%s%10s: %s\n", prefix, pcString, armOpcode.disassemble(currentPC)); >- } >- >- return true; >-} >- >-} // namespace JSC >- >-#endif // USE(ARMV7_DISASSEMBLER) >- >diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h >index 8aea74fdab38f725e4598a460411c1cb99e89f7b..ad79f28837b69a8f4700f13662c6bddb33451750 100644 >--- a/Source/WTF/wtf/Platform.h >+++ b/Source/WTF/wtf/Platform.h >@@ -755,11 +755,7 @@ > #define USE_ARM64_DISASSEMBLER 1 > #endif > >-#if !defined(USE_ARMV7_DISASSEMBLER) && ENABLE(JIT) && CPU(ARM_THUMB2) && !USE(CAPSTONE) >-#define USE_ARMV7_DISASSEMBLER 1 >-#endif >- >-#if !defined(ENABLE_DISASSEMBLER) && (USE(UDIS86) || USE(ARMV7_DISASSEMBLER) || USE(ARM64_DISASSEMBLER) || (ENABLE(JIT) && USE(CAPSTONE))) >+#if !defined(ENABLE_DISASSEMBLER) && (USE(UDIS86) || USE(ARM64_DISASSEMBLER) || (ENABLE(JIT) && USE(CAPSTONE))) > #define ENABLE_DISASSEMBLER 1 > #endif >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
mcatanzaro
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185423
: 339955