From 4c30f56d4332c937021f8c80df5deba64f881b10 Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Thu, 28 Feb 2019 19:22:34 +0000 Subject: [PATCH] bpf: disassembler support for XADD under sub-register mode 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 Signed-off-by: Jiong Wang git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355127 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/BPF/Disassembler/BPFDisassembler.cpp | 3 ++- test/MC/BPF/insn-unit.s | 3 ++- test/MC/BPF/load-store-32.s | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Target/BPF/Disassembler/BPFDisassembler.cpp b/lib/Target/BPF/Disassembler/BPFDisassembler.cpp index ed09e446e73..c5be7cb1a4e 100644 --- a/lib/Target/BPF/Disassembler/BPFDisassembler.cpp +++ b/lib/Target/BPF/Disassembler/BPFDisassembler.cpp @@ -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); diff --git a/test/MC/BPF/insn-unit.s b/test/MC/BPF/insn-unit.s index c61c0024128..ff56cfa3966 100644 --- a/test/MC/BPF/insn-unit.s +++ b/test/MC/BPF/insn-unit.s @@ -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 ======== diff --git a/test/MC/BPF/load-store-32.s b/test/MC/BPF/load-store-32.s index 73ed9fcb3e0..be576d27204 100644 --- a/test/MC/BPF/load-store-32.s +++ b/test/MC/BPF/load-store-32.s @@ -17,9 +17,12 @@ *(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 -- 2.40.0