diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 30dcd6d81f16d..4090820445be1 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -4464,12 +4464,13 @@ bool AMDGPUAsmParser::validateOffset(const MCInst &Inst, return validateSMEMOffset(Inst, Operands); const auto &Op = Inst.getOperand(OpNum); + // GFX12+ buffer ops: InstOffset is signed 24, but must be positive if (isGFX12Plus() && (TSFlags & (SIInstrFlags::MUBUF | SIInstrFlags::MTBUF))) { const unsigned OffsetSize = 24; - if (!isIntN(OffsetSize, Op.getImm())) { + if (!isUIntN(OffsetSize - 1, Op.getImm())) { Error(getFlatOffsetLoc(Operands), - Twine("expected a ") + Twine(OffsetSize) + "-bit signed offset"); + Twine("expected a ") + Twine(OffsetSize - 1) + "-bit non-negative offset for buffer ops"); return false; } } else { @@ -4552,7 +4553,9 @@ bool AMDGPUAsmParser::validateSMEMOffset(const MCInst &Inst, return true; Error(getSMEMOffsetLoc(Operands), - isGFX12Plus() ? "expected a 24-bit signed offset" + isGFX12Plus() && IsBuffer + ? "expected a 23-bit non-negative offset for S_BUFFER ops" + : isGFX12Plus() ? "expected a 24-bit signed offset" : (isVI() || IsBuffer) ? "expected a 20-bit unsigned offset" : "expected a 21-bit signed offset"); diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp index 59c72fcbff18a..6160fd73dfa28 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -812,6 +812,18 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size, } } + // Validate buffer instruction offsets for GFX12+ - must be non-negative + if (isGFX12Plus() && isBufferInstruction(MI)) { + int OffsetIdx = + AMDGPU::getNamedOperandIdx(MI.getOpcode(), AMDGPU::OpName::offset); + if (OffsetIdx != -1) { + uint32_t Imm = MI.getOperand(OffsetIdx).getImm(); + int64_t SignedOffset = SignExtend64<24>(Imm); + if (SignedOffset < 0) + return MCDisassembler::Fail; + } + } + if (MCII->get(MI.getOpcode()).TSFlags & (SIInstrFlags::MTBUF | SIInstrFlags::MUBUF)) { int SWZOpIdx = @@ -2608,6 +2620,20 @@ const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(StringRef Id, return MCSymbolRefExpr::create(Sym, Ctx); } +bool AMDGPUDisassembler::isBufferInstruction(const MCInst &MI) const { + const uint64_t TSFlags = MCII->get(MI.getOpcode()).TSFlags; + + // Check for MUBUF and MTBUF instructions + if (TSFlags & (SIInstrFlags::MTBUF | SIInstrFlags::MUBUF)) + return true; + + // Check for SMEM buffer instructions (S_BUFFER_* instructions) + if ((TSFlags & SIInstrFlags::SMRD) && AMDGPU::getSMEMIsBuffer(MI.getOpcode())) + return true; + + return false; +} + //===----------------------------------------------------------------------===// // AMDGPUSymbolizer //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h index 67156b4a3a188..8acddde4f8eb6 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h @@ -236,6 +236,9 @@ class AMDGPUDisassembler : public MCDisassembler { bool hasKernargPreload() const; bool isMacDPP(MCInst &MI) const; + + /// Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER) + bool isBufferInstruction(const MCInst &MI) const; }; //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp index 13549e5c4e58b..a04892e2db541 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp +++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp @@ -2954,8 +2954,11 @@ bool isLegalSMRDEncodedUnsignedOffset(const MCSubtargetInfo &ST, bool isLegalSMRDEncodedSignedOffset(const MCSubtargetInfo &ST, int64_t EncodedOffset, bool IsBuffer) { - if (isGFX12Plus(ST)) + if (isGFX12Plus(ST)) { + if (IsBuffer && EncodedOffset < 0) + return false; return isInt<24>(EncodedOffset); + } return !IsBuffer && hasSMRDSignedImmOffset(ST) && isInt<21>(EncodedOffset); } diff --git a/llvm/test/MC/AMDGPU/gfx12_err.s b/llvm/test/MC/AMDGPU/gfx12_err.s index 9ddb91e25afe6..302ffc0f05972 100644 --- a/llvm/test/MC/AMDGPU/gfx12_err.s +++ b/llvm/test/MC/AMDGPU/gfx12_err.s @@ -125,3 +125,261 @@ s_alloc_vgpr exec s_alloc_vgpr vcc // GFX12-ERR: :[[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction + +buffer_load_dword v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_dword v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_dwordx2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_dwordx3 v[0:2], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_dwordx4 v[0:3], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_short_d16 v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_format_d16_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_format_d16_xy v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_format_d16_xyz v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_format_d16_xyzw v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_short_d16_hi v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_format_d16_hi_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_sbyte_d16_hi v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_ubyte_d16_hi v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_sbyte_d16 v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_ubyte_d16 v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_sbyte v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_sshort v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_ubyte v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_load_ushort v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_byte v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_short v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_dword v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_dwordx2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_dwordx3 v[0:2], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_dwordx4 v[0:3], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_format_d16_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_format_d16_xy v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_format_d16_xyz v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_format_d16_xyzw v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_byte_d16_hi v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_short_d16_hi v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_store_format_d16_hi_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_add v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_add_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_and v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_and_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_cmpswap v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_cmpswap_x2 v[0:3], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_csub v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_dec v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_dec_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_inc v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_inc_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_fmax v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_smax v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_smax_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_umax v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_umax_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_fmin v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_smin v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_smin_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_umin v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_umin_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_or v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_or_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_sub v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_sub_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_swap v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_swap_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_xor v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +buffer_atomic_xor_x2 v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_d16_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_d16_xy v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_d16_xyz v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_d16_xyzw v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_xy v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_xyz v[0:2], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_load_format_xyzw v[0:3], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_d16_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_d16_xy v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_d16_xyz v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_d16_xyzw v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_x v0, off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_xy v[0:1], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_xyz v[0:2], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +tbuffer_store_format_xyzw v[0:3], off, s[4:7], s8 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for buffer ops + +s_buffer_load_b32 s5, s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_b64 s[10:11], s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_b96 s[20:22], s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_i8 s5, s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_u8 s5, s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_i16 s5, s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_load_u16 s5, s[4:7], s0 offset:-1 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops + +s_buffer_prefetch_data s[20:23], -1, s10, 7 +// GFX12-ERR: [[@LINE-1]]:{{[0-9]+}}: error: expected a 23-bit non-negative offset for S_BUFFER ops diff --git a/llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_buffer_err.txt b/llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_buffer_err.txt new file mode 100644 index 0000000000000..2dfc6616e09aa --- /dev/null +++ b/llvm/test/MC/Disassembler/AMDGPU/gfx12_dasm_buffer_err.txt @@ -0,0 +1,65 @@ +# RUN: not llvm-mc -disassemble -triple=amdgcn -mcpu=gfx1200 -show-encoding %s 2>&1 | FileCheck --implicit-check-not=warning: --check-prefix=GFX12 %s + +# buffer_load_b32 v1, off, s[0:3], s4 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x04,0x00,0x05,0xc4,0x01,0x00,0x80,0x00,0xff,0xff,0xff,0xff] + +# buffer_load_b32 v0, off, s[4:7], s8 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x08,0x00,0x05,0xc4,0x00,0x08,0x80,0x00,0xff,0xff,0xff,0xff] + +# buffer_load_b64 v[0:1], off, s[4:7], s8 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x08,0x40,0x05,0xc4,0x00,0x08,0x80,0x00,0xff,0xff,0xff,0xff] + +# buffer_store_b32 v0, off, s[4:7], s8 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x08,0x80,0x06,0xc4,0x00,0x08,0x80,0x00,0xff,0xff,0xff,0xff] + +# buffer_atomic_add v0, off, s[4:7], s8 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x08,0x40,0x0d,0xc4,0x00,0x08,0x80,0x00,0xff,0xff,0xff,0xff] + +# tbuffer_load_format_x v0, off, s[4:7], s8 format:0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x08,0x00,0x20,0xc4,0x00,0x08,0x00,0x00,0xff,0xff,0xff,0xff] + +# s_buffer_load_b32 s5, s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x42,0x01,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_b64 s[10:11], s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x82,0x22,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_b96 s[20:22], s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x82,0x52,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_b128 s[10:13], s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x82,0x22,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_b256 s[20:27], s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x82,0x52,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_b512 s[20:35], s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x82,0x52,0x02,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_i8 s5, s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x42,0x01,0x03,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_u8 s5, s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x42,0x21,0x03,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_i16 s5, s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x42,0x41,0x03,0xf4,0xff,0xff,0xff,0x00] + +# s_buffer_load_u16 s5, s[4:7], s0 offset:-1 +# GFX12: warning: invalid instruction encoding +[0x42,0x61,0x03,0xf4,0xff,0xff,0xff,0x00]