summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2010-09-15 21:04:54 +0000
committerJim Grosbach <grosbach@apple.com>2010-09-15 21:04:54 +0000
commit27ab5fbd2b79125fa8084505ec0fb2a19dcb7286 (patch)
tree8958738821429b1c4dbadae528a5886db13dd513 /llvm
parent02dc8c73e19231d729cf6f3366152bc72e60c902 (diff)
downloadbcm5719-llvm-27ab5fbd2b79125fa8084505ec0fb2a19dcb7286.tar.gz
bcm5719-llvm-27ab5fbd2b79125fa8084505ec0fb2a19dcb7286.zip
Teach the MC disassembler to handle vmov.f32 and vmov.f64 immediate to register
moves. Previously, the immediate was printed as the encoded integer value, which is incorrect. llvm-svn: 114021
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp15
-rw-r--r--llvm/test/MC/Disassembler/neon-tests.txt2
2 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
index edfb20766ce..4dc16bb72f4 100644
--- a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
+++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
@@ -1573,8 +1573,7 @@ static unsigned decodeVFPRm(uint32_t insn, bool isSPVFP) {
}
// A7.5.1
-#if 0
-static uint64_t VFPExpandImm(unsigned char byte, unsigned N) {
+static APInt VFPExpandImm(unsigned char byte, unsigned N) {
assert(N == 32 || N == 64);
uint64_t Result;
@@ -1593,9 +1592,8 @@ static uint64_t VFPExpandImm(unsigned char byte, unsigned N) {
else
Result |= 0x1L << 62;
}
- return Result;
+ return APInt(N, Result);
}
-#endif
// VFP Unary Format Instructions:
//
@@ -1972,10 +1970,11 @@ static bool DisassembleVFPMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
// Extract/decode the f64/f32 immediate.
if (OpIdx < NumOps && OpInfo[OpIdx].RegClass < 0
&& !OpInfo[OpIdx].isPredicate() && !OpInfo[OpIdx].isOptionalDef()) {
- // The asm syntax specifies the before-expanded <imm>.
- // Not VFPExpandImm(slice(insn,19,16) << 4 | slice(insn, 3, 0),
- // Opcode == ARM::FCONSTD ? 64 : 32)
- MI.addOperand(MCOperand::CreateImm(slice(insn,19,16)<<4 | slice(insn,3,0)));
+ // The asm syntax specifies the floating point value, not the 8-bit literal.
+ APInt immRaw = VFPExpandImm(slice(insn,19,16) << 4 | slice(insn, 3, 0),
+ Opcode == ARM::FCONSTD ? 64 : 32);
+ MI.addOperand(MCOperand::CreateFPImm(APFloat(immRaw, true)));
+
++OpIdx;
}
diff --git a/llvm/test/MC/Disassembler/neon-tests.txt b/llvm/test/MC/Disassembler/neon-tests.txt
index 35d4bd4da9e..c6e16216bf9 100644
--- a/llvm/test/MC/Disassembler/neon-tests.txt
+++ b/llvm/test/MC/Disassembler/neon-tests.txt
@@ -51,3 +51,5 @@
# CHECK: vtbx.8 d18, {d4, d5, d6}, d7
0x47 0x2a 0xf4 0xf3
+# CHECK: vmov.f32 s0, #5.000000e-01
+0x00 0x0a 0xb6 0xee
OpenPOWER on IntegriCloud