summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2010-04-16 22:40:20 +0000
committerJohnny Chen <johnny.chen@apple.com>2010-04-16 22:40:20 +0000
commitb90b6f1a352e95a0cf50a48a82605cc275d6f061 (patch)
treea42a7b17fa6e720e1156bb294061f9afd9e19d9c
parentae4b5df81751edd2b0e253cf643875d570a65592 (diff)
downloadbcm5719-llvm-b90b6f1a352e95a0cf50a48a82605cc275d6f061.tar.gz
bcm5719-llvm-b90b6f1a352e95a0cf50a48a82605cc275d6f061.zip
Fixed a bug in DisassembleN1RegModImmFrm() where a break stmt was missing for a
case. Also, the 0xFF hex literal involved in the shift for ESize64 should be suffixed "ul" to preserve the shift result. Implemented printHex*ImmOperand() by copying from ARMAsmPrinter.cpp and added a test case for DisassembleN1RegModImmFrm()/printHex64ImmOperand(). llvm-svn: 101557
-rw-r--r--llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp20
-rw-r--r--llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h8
-rw-r--r--llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp3
-rw-r--r--llvm/test/MC/Disassembler/neon-tests.txt3
4 files changed, 29 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
index bc61a15e7a6..ac6331f931f 100644
--- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
+++ b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
@@ -18,6 +18,7 @@
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -777,3 +778,22 @@ void ARMInstPrinter::printVFPf64ImmOperand(const MCInst *MI, unsigned OpNum,
O << '#' << MI->getOperand(OpNum).getImm();
}
+void ARMInstPrinter::printHex8ImmOperand(const MCInst *MI, unsigned OpNum,
+ raw_ostream &O) {
+ O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xff);
+}
+
+void ARMInstPrinter::printHex16ImmOperand(const MCInst *MI, unsigned OpNum,
+ raw_ostream &O) {
+ O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xffff);
+}
+
+void ARMInstPrinter::printHex32ImmOperand(const MCInst *MI, unsigned OpNum,
+ raw_ostream &O) {
+ O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm() & 0xffffffff);
+}
+
+void ARMInstPrinter::printHex64ImmOperand(const MCInst *MI, unsigned OpNum,
+ raw_ostream &O) {
+ O << "#0x" << utohexstr(MI->getOperand(OpNum).getImm());
+}
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
index dd006fc52e7..be0b7c1eb02 100644
--- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
+++ b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
@@ -104,10 +104,10 @@ public:
void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
void printVFPf32ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
void printVFPf64ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
- void printHex8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {}
- void printHex16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {}
- void printHex32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {}
- void printHex64ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O) {}
+ void printHex8ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
+ void printHex16ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
+ void printHex32ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
+ void printHex64ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O);
// FIXME: Implement.
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
index 50ed8b5d6f5..5eda8e14bbd 100644
--- a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
+++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
@@ -2104,7 +2104,7 @@ static uint64_t decodeN1VImm(uint32_t insn, ElemSize esize) {
case ESize64: {
for (unsigned i = 0; i < 8; ++i)
if ((Imm8 >> i) & 1)
- Imm64 |= 0xFF << 8*i;
+ Imm64 |= 0xFFul << 8*i;
break;
}
default:
@@ -2450,6 +2450,7 @@ static bool DisassembleN1RegModImmFrm(MCInst &MI, unsigned Opcode,
case ARM::VMOVv1i64:
case ARM::VMOVv2i64:
esize = ESize64;
+ break;
default:
assert(0 && "Unreachable code!");
return false;
diff --git a/llvm/test/MC/Disassembler/neon-tests.txt b/llvm/test/MC/Disassembler/neon-tests.txt
index 5d37b8c6416..cf9f21bea87 100644
--- a/llvm/test/MC/Disassembler/neon-tests.txt
+++ b/llvm/test/MC/Disassembler/neon-tests.txt
@@ -18,6 +18,9 @@
# CHECK: vmov d0, d15
0x1f 0x01 0x2f 0xf2
+# CHECK: vmov.i64 q6, #0xFF00FF00FF
+0x75 0xde 0x81 0xf2
+
# CHECK: vmul.f32 d0, d0, d6
0x16 0x0d 0x00 0xf3
OpenPOWER on IntegriCloud