bpf: disassembler support for XADD under sub-register mode
authorJiong Wang <jiwang@tilera.com>
Thu, 28 Feb 2019 19:22:34 +0000 (19:22 +0000)
committerJiong Wang <jiwang@tilera.com>
Thu, 28 Feb 2019 19:22:34 +0000 (19:22 +0000)
Like the other load/store instructions, "w" register is preferred when
disassembling BPF_STX | BPF_W | BPF_XADD.

v1 -> v2:
 - Updated testcase insn-unit.s (Yonghong)

Acked-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
llvm-svn: 355127

llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp
llvm/test/MC/BPF/insn-unit.s
llvm/test/MC/BPF/load-store-32.s

index ed09e44..c5be7cb 100644 (file)
@@ -171,9 +171,10 @@ DecodeStatus BPFDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
   if (Result == MCDisassembler::Fail) return MCDisassembler::Fail;
 
   uint8_t InstClass = getInstClass(Insn);
+  uint8_t InstMode = getInstMode(Insn);
   if ((InstClass == BPF_LDX || InstClass == BPF_STX) &&
       getInstSize(Insn) != BPF_DW &&
-      getInstMode(Insn) == BPF_MEM &&
+      (InstMode == BPF_MEM || InstMode == BPF_XADD) &&
       STI.getFeatureBits()[BPF::ALU32])
     Result = decodeInstruction(DecoderTableBPFALU3264, Instr, Insn, Address,
                                this, STI);
index c61c002..ff56cfa 100644 (file)
@@ -57,7 +57,8 @@
 
   lock *(u32 *)(r2 + 16) += r9  // BPF_STX | BPF_W | BPF_XADD
   lock *(u64 *)(r3 - 30) += r10 // BPF_STX | BPF_DW | BPF_XADD
-// CHECK: c3 92 10 00 00 00 00 00      lock *(u32 *)(r2 + 16) += r9
+// CHECK-64: c3 92 10 00 00 00 00 00   lock *(u32 *)(r2 + 16) += r9
+// CHECK-32: c3 92 10 00 00 00 00 00   lock *(u32 *)(r2 + 16) += w9
 // CHECK: db a3 e2 ff 00 00 00 00      lock *(u64 *)(r3 - 30) += r10
 
 // ======== BPF_JMP Class ========
index 73ed9fc..be576d2 100644 (file)
   *(u8 *)(r0 + 0) = w7    // BPF_STX | BPF_B
   *(u16 *)(r1 + 8) = w8   // BPF_STX | BPF_H
   *(u32 *)(r2 + 16) = w9  // BPF_STX | BPF_W
+  lock *(u32 *)(r2 + 16) += w9  // BPF_STX | BPF_W | BPF_XADD
 // CHECK-32: 73 70 00 00 00 00 00 00   *(u8 *)(r0 + 0) = w7
 // CHECK-32: 6b 81 08 00 00 00 00 00   *(u16 *)(r1 + 8) = w8
 // CHECK-32: 63 92 10 00 00 00 00 00   *(u32 *)(r2 + 16) = w9
+// CHECK-32: c3 92 10 00 00 00 00 00   lock *(u32 *)(r2 + 16) += w9
 // CHECK: 73 70 00 00 00 00 00 00      *(u8 *)(r0 + 0) = r7
 // CHECK: 6b 81 08 00 00 00 00 00      *(u16 *)(r1 + 8) = r8
 // CHECK: 63 92 10 00 00 00 00 00      *(u32 *)(r2 + 16) = r9
+// CHECK: c3 92 10 00 00 00 00 00      lock *(u32 *)(r2 + 16) += r9