From 6f67bb8d4533cddba6b6963f5c272379f906a87b Mon Sep 17 00:00:00 2001 From: Dmitry Preobrazhensky Date: Mon, 27 Nov 2017 17:14:35 +0000 Subject: [PATCH] [AMDGPU][MC][DISASSEMBLER][GFX9] Corrected decoding of GLOBAL/SCRATCH opcodes See bug 35433: https://bugs.llvm.org/show_bug.cgi?id=35433 Differential Revision: https://reviews.llvm.org/D40493 Reviewers: artem.tamazov, SamWot, arsenm git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319050 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/FLATInstructions.td | 4 +- .../AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp | 6 +- .../AMDGPU/InstPrinter/AMDGPUInstPrinter.h | 2 +- test/MC/Disassembler/AMDGPU/flat_gfx9.txt | 85 +++++++++++++++++++ 4 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 test/MC/Disassembler/AMDGPU/flat_gfx9.txt diff --git a/lib/Target/AMDGPU/FLATInstructions.td b/lib/Target/AMDGPU/FLATInstructions.td index 6413d6d714c..69386912808 100644 --- a/lib/Target/AMDGPU/FLATInstructions.td +++ b/lib/Target/AMDGPU/FLATInstructions.td @@ -305,7 +305,7 @@ multiclass FLAT_Global_Atomic_Pseudo< def _SADDR : FLAT_AtomicNoRet_Pseudo , + " $vaddr, $vdata, $saddr$offset$slc">, AtomicNoRet { let has_saddr = 1; let enabled_saddr = 1; @@ -315,7 +315,7 @@ multiclass FLAT_Global_Atomic_Pseudo< def _SADDR_RTN : FLAT_AtomicRet_Pseudo , + " $vdst, $vaddr, $vdata, $saddr$offset glc$slc">, AtomicNoRet { let has_saddr = 1; let enabled_saddr = 1; diff --git a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp index 537769bf27e..2768e5c9984 100644 --- a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp +++ b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp @@ -72,9 +72,9 @@ void AMDGPUInstPrinter::printU16ImmDecOperand(const MCInst *MI, unsigned OpNo, O << formatDec(MI->getOperand(OpNo).getImm() & 0xffff); } -void AMDGPUInstPrinter::printS16ImmDecOperand(const MCInst *MI, unsigned OpNo, +void AMDGPUInstPrinter::printS13ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) { - O << formatDec(static_cast(MI->getOperand(OpNo).getImm())); + O << formatDec(SignExtend32<13>(MI->getOperand(OpNo).getImm())); } void AMDGPUInstPrinter::printU32ImmOperand(const MCInst *MI, unsigned OpNo, @@ -129,7 +129,7 @@ void AMDGPUInstPrinter::printOffsetS13(const MCInst *MI, unsigned OpNo, uint16_t Imm = MI->getOperand(OpNo).getImm(); if (Imm != 0) { O << ((OpNo == 0)? "offset:" : " offset:"); - printS16ImmDecOperand(MI, OpNo, O); + printS13ImmDecOperand(MI, OpNo, O); } } diff --git a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h index a36a74c79b0..d97f04689e1 100644 --- a/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h +++ b/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.h @@ -42,7 +42,7 @@ private: void printU4ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printU8ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printU16ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); - void printS16ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); + void printS13ImmDecOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); void printU32ImmOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O); void printNamedBit(const MCInst *MI, unsigned OpNo, raw_ostream &O, diff --git a/test/MC/Disassembler/AMDGPU/flat_gfx9.txt b/test/MC/Disassembler/AMDGPU/flat_gfx9.txt new file mode 100644 index 00000000000..fa5c095d851 --- /dev/null +++ b/test/MC/Disassembler/AMDGPU/flat_gfx9.txt @@ -0,0 +1,85 @@ +# RUN: llvm-mc -arch=amdgcn -mcpu=gfx901 -disassemble -show-encoding < %s | FileCheck %s + +# CHECK: flat_atomic_add v[0:1], v0 ; encoding: [0x00,0x00,0x08,0xdd,0x00,0x00,0x00,0x00] +0x00,0x00,0x08,0xdd,0x00,0x00,0x00,0x00 + +# CHECK: flat_atomic_add v[0:1], v0 offset:7 ; encoding: [0x07,0x00,0x08,0xdd,0x00,0x00,0x00,0x00] +0x07,0x00,0x08,0xdd,0x00,0x00,0x00,0x00 + +# CHECK: flat_atomic_add v0, v[0:1], v0 offset:4095 glc ; encoding: [0xff,0x0f,0x09,0xdd,0x00,0x00,0x00,0x00] +0xff,0x0f,0x09,0xdd,0x00,0x00,0x00,0x00 + +# CHECK: flat_atomic_add v[0:1], v0 offset:4095 slc ; encoding: [0xff,0x0f,0x0a,0xdd,0x00,0x00,0x00,0x00] +0xff,0x0f,0x0a,0xdd,0x00,0x00,0x00,0x00 + +# CHECK: flat_load_dword v0, v[0:1] ; encoding: [0x00,0x00,0x50,0xdc,0x00,0x00,0x00,0x00] +0x00,0x00,0x50,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: flat_load_dword v0, v[0:1] offset:7 ; encoding: [0x07,0x00,0x50,0xdc,0x00,0x00,0x00,0x00] +0x07,0x00,0x50,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: flat_load_dword v0, v[0:1] offset:4095 glc ; encoding: [0xff,0x0f,0x51,0xdc,0x00,0x00,0x00,0x00] +0xff,0x0f,0x51,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: flat_store_byte v[0:1], v0 ; encoding: [0x00,0x00,0x60,0xdc,0x00,0x00,0x00,0x00] +0x00,0x00,0x60,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: flat_store_byte v[0:1], v0 offset:7 ; encoding: [0x07,0x00,0x60,0xdc,0x00,0x00,0x00,0x00] +0x07,0x00,0x60,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: flat_store_byte v[0:1], v0 offset:4095 glc ; encoding: [0xff,0x0f,0x61,0xdc,0x00,0x00,0x00,0x00] +0xff,0x0f,0x61,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: global_atomic_add v[2:3], v4, s[0:1] ; encoding: [0x00,0x80,0x08,0xdd,0x02,0x04,0x00,0x00] +0x00,0x80,0x08,0xdd,0x02,0x04,0x00,0x00 + +# CHECK: global_atomic_add v[2:3], v4, s[0:1] offset:4095 ; encoding: [0xff,0x8f,0x08,0xdd,0x02,0x04,0x00,0x00] +0xff,0x8f,0x08,0xdd,0x02,0x04,0x00,0x00 + +# CHECK: global_atomic_add v[2:3], v4, s[0:1] offset:-4096 ; encoding: [0x00,0x90,0x08,0xdd,0x02,0x04,0x00,0x00] +0x00,0x90,0x08,0xdd,0x02,0x04,0x00,0x00 + +# CHECK: global_atomic_add v0, v[2:3], v4, s[0:1] offset:-1 glc ; encoding: [0xff,0x9f,0x09,0xdd,0x02,0x04,0x00,0x00] +0xff,0x9f,0x09,0xdd,0x02,0x04,0x00,0x00 + +# CHECK: global_load_sbyte v0, v[2:3], s[0:1] ; encoding: [0x00,0x80,0x44,0xdc,0x02,0x00,0x00,0x00] +0x00,0x80,0x44,0xdc,0x02,0x00,0x00,0x00 + +# CHECK: global_load_sbyte v0, v[2:3], s[0:1] offset:4095 ; encoding: [0xff,0x8f,0x44,0xdc,0x02,0x00,0x00,0x00] +0xff,0x8f,0x44,0xdc,0x02,0x00,0x00,0x00 + +# CHECK: global_load_sbyte v0, v[2:3], s[0:1] offset:-4096 ; encoding: [0x00,0x90,0x44,0xdc,0x02,0x00,0x00,0x00] +0x00,0x90,0x44,0xdc,0x02,0x00,0x00,0x00 + +# CHECK: global_store_dwordx2 v[2:3], v[4:5], s[0:1] ; encoding: [0x00,0x80,0x74,0xdc,0x02,0x04,0x00,0x00] +0x00,0x80,0x74,0xdc,0x02,0x04,0x00,0x00 + +# CHECK: global_store_dwordx2 v[2:3], v[4:5], s[0:1] offset:4095 ; encoding: [0xff,0x8f,0x74,0xdc,0x02,0x04,0x00,0x00] +0xff,0x8f,0x74,0xdc,0x02,0x04,0x00,0x00 + +# CHECK: global_store_dwordx2 v[2:3], v[4:5], s[0:1] offset:-4096 ; encoding: [0x00,0x90,0x74,0xdc,0x02,0x04,0x00,0x00] +0x00,0x90,0x74,0xdc,0x02,0x04,0x00,0x00 + +# CHECK: scratch_load_dword v0, v0, off offset:-1 ; encoding: [0xff,0x5f,0x50,0xdc,0x00,0x00,0x7f,0x00] +0xff,0x5f,0x50,0xdc,0x00,0x00,0x7f,0x00 + +# CHECK: scratch_load_dword v0, off, s0 ; encoding: [0x00,0x40,0x50,0xdc,0x00,0x00,0x00,0x00] +0x00,0x40,0x50,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: scratch_load_dword v0, off, s0 offset:4095 ; encoding: [0xff,0x4f,0x50,0xdc,0x00,0x00,0x00,0x00] +0xff,0x4f,0x50,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: scratch_load_dword v0, off, s0 offset:-4096 ; encoding: [0x00,0x50,0x50,0xdc,0x00,0x00,0x00,0x00] +0x00,0x50,0x50,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: scratch_store_short v0, v0, off offset:-1 ; encoding: [0xff,0x5f,0x68,0xdc,0x00,0x00,0x7f,0x00] +0xff,0x5f,0x68,0xdc,0x00,0x00,0x7f,0x00 + +# CHECK: scratch_store_short off, v0, s0 ; encoding: [0x00,0x40,0x68,0xdc,0x00,0x00,0x00,0x00] +0x00,0x40,0x68,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: scratch_store_short off, v0, s0 offset:4095 ; encoding: [0xff,0x4f,0x68,0xdc,0x00,0x00,0x00,0x00] +0xff,0x4f,0x68,0xdc,0x00,0x00,0x00,0x00 + +# CHECK: scratch_store_short off, v0, s0 offset:-4096 ; encoding: [0x00,0x50,0x68,0xdc,0x00,0x00,0x00,0x00] +0x00,0x50,0x68,0xdc,0x00,0x00,0x00,0x00 -- 2.50.1