[Mips][Disassembler] When disassembler meets cache/pref instructions for r6 it crashe...
authorVladimir Medic <Vladimir.Medic@imgtec.com>
Thu, 29 Jan 2015 11:33:41 +0000 (11:33 +0000)
committerVladimir Medic <Vladimir.Medic@imgtec.com>
Thu, 29 Jan 2015 11:33:41 +0000 (11:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227430 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/Disassembler/MipsDisassembler.cpp
lib/Target/Mips/Mips32r6InstrInfo.td
test/MC/Disassembler/Mips/mips32r6/valid-mips32r6-el.txt
test/MC/Disassembler/Mips/mips32r6/valid-mips32r6.txt
test/MC/Disassembler/Mips/mips32r6/valid-xfail-mips32r6.txt
test/MC/Disassembler/Mips/mips64r6/valid-mips64r6-el.txt
test/MC/Disassembler/Mips/mips64r6/valid-mips64r6.txt
test/MC/Disassembler/Mips/mips64r6/valid-xfail-mips64r6.txt

index 29998e92f2ad3aade7920a28cef28339cc7003b4..9dab45c6d4ad6ce9803b7fc69f1ecb282ef06e7c 100644 (file)
@@ -266,6 +266,11 @@ static DecodeStatus DecodeCacheOp(MCInst &Inst,
                               uint64_t Address,
                               const void *Decoder);
 
+static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
+                                    unsigned Insn,
+                                    uint64_t Address,
+                                    const void *Decoder);
+
 static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
                                     unsigned Insn,
                                     uint64_t Address,
@@ -1137,6 +1142,23 @@ static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
   return MCDisassembler::Success;
 }
 
+static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
+                                    unsigned Insn,
+                                    uint64_t Address,
+                                    const void *Decoder) {
+  int Offset = fieldFromInstruction(Insn, 7, 9);
+  unsigned Hint = fieldFromInstruction(Insn, 16, 5);
+  unsigned Base = fieldFromInstruction(Insn, 21, 5);
+
+  Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
+
+  Inst.addOperand(MCOperand::CreateReg(Base));
+  Inst.addOperand(MCOperand::CreateImm(Offset));
+  Inst.addOperand(MCOperand::CreateImm(Hint));
+
+  return MCDisassembler::Success;
+}
+
 static DecodeStatus DecodeSyncI(MCInst &Inst,
                               unsigned Insn,
                               uint64_t Address,
index 2175160a45ac25a5cd9bf07b70186253654d2004..49c63226dc06a0d0193c0fdb514c0411163cce97 100644 (file)
@@ -549,6 +549,7 @@ class CACHE_HINT_DESC<string instr_asm, Operand MemOpnd,
   dag InOperandList = (ins MemOpnd:$addr, uimm5:$hint);
   string AsmString = !strconcat(instr_asm, "\t$hint, $addr");
   list<dag> Pattern = [];
+  string DecoderMethod = "DecodeCacheOpR6";
 }
 
 class CACHE_DESC : CACHE_HINT_DESC<"cache", mem_simm9, GPR32Opnd>;
index 85d1a0eff4e17f367ed7620f4487a157aca6424b..c10d16699b77fa71c2840f0460daf6b25316215f 100644 (file)
 0x30 0x81 0x79 0x49 # CHECK: swc2 $25, 304($16)
 0x00 0x01 0x05 0xf8 # CHECK: jialc $5, 256
 0x00 0x01 0x05 0xd8 # CHECK: jic $5, 256
+0x25 0x04 0xa1 0x7c # CHECK: cache 1, 8($5)
+0x35 0x04 0xa1 0x7c # CHECK: pref 1, 8($5
index 3c4d1e22e8c94e5232b4b43a57de92c86f2390c9..0b78003420b65d1ed7b1dbacb31f05320eb97391 100644 (file)
 0x49 0x79 0x81 0x30 # CHECK: swc2 $25, 304($16)
 0xf8 0x05 0x01 0x00 # CHECK: jialc $5, 256
 0xd8 0x05 0x01 0x00 # CHECK: jic $5, 256
-
+0x7c 0xa1 0x04 0x25 # CHECK: cache 1, 8($5)
+0x7c 0xa1 0x04 0x35 # CHECK: pref 1, 8($5)
index dc29c0c1768553454d943b4d2016312b594ff379..e9afd03ddd60e2e7513d5eed523a36a75ca5ce34 100644 (file)
@@ -13,5 +13,3 @@
 0x60 0xc0 0x00 0x40 # CHECK: bnec $6, $zero, 256
 0x60 0xa0 0x00 0x40 # CHECK: bnec $5, $zero, 256
 0x60 0xa6 0x00 0x40 # CHECK: bnec $5, $6, 256
-0x7c 0xa1 0x04 0x25 # CHECK: cache 1, 8($5)
-0x7c 0xa1 0x04 0x35 # CHECK: pref 1, 8($5)
index 0d83a347a1fe4211391e145d9b331d3b779acbf4..b92c79387d6390cf2a6a564a4282afb9642f5d57 100644 (file)
 0x30 0x81 0x79 0x49 # CHECK: swc2 $25, 304($16)
 0x00 0x01 0x05 0xf8 # CHECK: jialc $5, 256
 0x00 0x01 0x05 0xd8 # CHECK: jic $5, 256
-
+0x25 0x04 0xa1 0x7c # CHECK: cache 1, 8($5)
+0x35 0x04 0xa1 0x7c # CHECK: pref 1, 8($5)
index f4ce8f7ae5465d856b0d444b86f66f850ec159b6..debbe5027ffc52220ce6fe61a7d7b3bd2ff4fc55 100644 (file)
 0x49 0x79 0x81 0x30 # CHECK: swc2 $25, 304($16)
 0xf8 0x05 0x01 0x00 # CHECK: jialc $5, 256
 0xd8 0x05 0x01 0x00 # CHECK: jic $5, 256
-
+0x7c 0xa1 0x04 0x25 # CHECK: cache 1, 8($5)
+0x7c 0xa1 0x04 0x35 # CHECK: pref 1, 8($5)
index fe38c1fb35fc496fa43db581459f44756685fd99..8ca8b815414cf436534adc7043c9725804f9df5f 100644 (file)
@@ -13,8 +13,6 @@
 0x60 0xc0 0x00 0x40 # CHECK: bnec $6, $zero, 256
 0x60 0xa0 0x00 0x40 # CHECK: bnec $5, $zero, 256
 0x60 0xa6 0x00 0x40 # CHECK: bnec $5, $6, 256
-0x7c 0xa1 0x04 0x25 # CHECK: cache 1, 8($5)
-0x7c 0xa1 0x04 0x35 # CHECK: pref 1, 8($5)
 0x64 0x58 0x46 0x9f # CHECK: daddiu $24, $2, 18079
 0x66 0x73 0x69 0x3f # CHECK: daddiu $19, $19, 26943
 0x65 0x6f 0xec 0x5f # CHECK: daddiu $15, $11, -5025