aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-10-10 13:34:12 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-17 10:10:41 +0200
commit0640fbc8e53644facf199ab0bd3a7414cf149068 (patch)
treeb14fc087d1152ccfe366ea64216a17251744d6ed /src
parent7b1a8fa821ef5bac4ecad91be7f0e62809e80a12 (diff)
V4 ARM: extend disassembler.
Added VADD/VSUB/VLDR/VSTR. Change-Id: I25fbb338652c3457e15cc9ef17209d35c63fefe5 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.cpp41
-rw-r--r--src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.h36
2 files changed, 77 insertions, 0 deletions
diff --git a/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.cpp b/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.cpp
index 81081b8fbb..81063e2b11 100644
--- a/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.cpp
+++ b/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.cpp
@@ -116,8 +116,10 @@ static Opcode32GroupInitializer opcode32BitGroupList[] = {
OPCODE_GROUP_ENTRY(0x5, ARMv7DOpcodeDataProcessingShiftedReg),
OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVMOVSinglePrecision),
OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVMOVDoublePrecision),
+ OPCODE_GROUP_ENTRY(0x6, ARMv7DOpcodeVLDRVSTR),
OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeFPTransfer),
OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeVMSR),
+ OPCODE_GROUP_ENTRY(0x7, ARMv7DOpcodeVADDVSUB),
OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeDataProcessingModifiedImmediate),
OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeConditionalBranchT3),
OPCODE_GROUP_ENTRY(0x8, ARMv7DOpcodeBranchOrBranchLink),
@@ -1561,6 +1563,45 @@ const char* ARMv7DOpcodeVMSR::format()
return m_formatBuffer;
}
+const char* ARMv7DOpcodeVADDVSUB::format()
+{
+ char regPrefix = sz() ? 'd' : 's';
+ if (isSub())
+ appendInstructionName("vsub");
+ else
+ appendInstructionName("vadd");
+ appendFPRegisterName(regPrefix, vd());
+ appendSeparator();
+ appendFPRegisterName(regPrefix, vn());
+ appendSeparator();
+ appendFPRegisterName(regPrefix, vm());
+
+ return m_formatBuffer;
+}
+
+const char* ARMv7DOpcodeVLDRVSTR::format()
+{
+ appendInstructionName(opName());
+
+ char regPrefix = sz() ? 'd' : 's';
+ appendFPRegisterName(regPrefix, vd());
+
+ appendSeparator();
+ appendCharacter('[');
+ appendRegisterName(rn());
+
+ if (immediate8() || !uBit()) {
+ appendSeparator();
+ if (uBit())
+ appendUnsignedImmediate(immediate8() << 2);
+ else
+ appendSignedImmediate(0 - static_cast<int>(immediate8() << 2));
+ }
+ appendCharacter(']');
+
+ return m_formatBuffer;
+}
+
} } // namespace JSC::ARMv7Disassembler
#endif // #if USE(ARMV7_DISASSEMBLER)
diff --git a/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.h b/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.h
index 3f1f062e44..ca5f955ba1 100644
--- a/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.h
+++ b/src/3rdparty/masm/disassembler/ARMv7/ARMv7DOpcode.h
@@ -1132,6 +1132,42 @@ protected:
unsigned rt() { return (m_opcode >> 12) & 0xf; }
};
+class ARMv7DOpcodeVADDVSUB : public ARMv7D32BitOpcode {
+public:
+ static const uint32_t s_mask = 0xffb00e50;
+ static const uint32_t s_pattern = 0xee300a00;
+
+ DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVADDVSUB, thisObj);
+
+protected:
+ const char* format();
+
+ unsigned sz() { return (m_opcode >> 8) & 0x1; }
+ unsigned isSub() { return (m_opcode >> 6) & 0x1; }
+ unsigned vm() { return (m_opcode & 0xf) | ((m_opcode >> 1) & 0x10); }
+ unsigned vn() { return ((m_opcode >> 16) & 0xf) | ((m_opcode >> 3) & 0x10); }
+ unsigned vd() { return ((m_opcode >> 12) & 0xf) | ((m_opcode >> 18) & 0x10); }
+};
+
+class ARMv7DOpcodeVLDRVSTR : public ARMv7D32BitOpcode {
+public:
+ static const uint32_t s_mask = 0xff200a00;
+ static const uint32_t s_pattern = 0xed000a00;
+
+ DEFINE_STATIC_FORMAT32(ARMv7DOpcodeVLDRVSTR, thisObj);
+
+protected:
+ const char* format();
+
+ const char *opName() { return op() ? "vldr" : "vstr"; }
+
+ unsigned sz() { return (m_opcode >> 8) & 0x1; }
+ unsigned op() { return (m_opcode >> 20) & 0x1; }
+ unsigned uBit() { return (m_opcode >> 23) & 0x1; }
+ unsigned rn() { return (m_opcode >> 16) & 0xf; }
+ unsigned vd() { return ((m_opcode >> 12) & 0xf) | ((m_opcode >> 18) & 0x10); }
+ unsigned immediate8() { return m_opcode & 0xff; }
+};
} } // namespace JSC::ARMv7Disassembler