diff options
author | Dmitry Preobrazhensky <d-pre@mail.ru> | 2022-07-26 17:34:48 +0300 |
---|---|---|
committer | Dmitry Preobrazhensky <d-pre@mail.ru> | 2022-07-26 17:36:22 +0300 |
commit | 0eb9f18520a9a46395a01f9acc9eb829827f340c (patch) | |
tree | f6d7dbf1dafafaa74dfad001a6256faa43257b92 /llvm/lib | |
parent | 6cfaab5692e9d7c65922f82a0e4657d2c7dada37 (diff) | |
download | llvm-0eb9f18520a9a46395a01f9acc9eb829827f340c.zip llvm-0eb9f18520a9a46395a01f9acc9eb829827f340c.tar.gz llvm-0eb9f18520a9a46395a01f9acc9eb829827f340c.tar.bz2 |
[AMDGPU][MC][GFX11] Correct encoding of VOP3/VOP3_DPP v_cmpx* opcodes
Encode dst=EXEC but allow disassembler accept any dst value.
Differential Revision: https://reviews.llvm.org/D130345
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/MCTargetDesc/SIMCCodeEmitter.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/SIMCCodeEmitter.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/SIMCCodeEmitter.cpp index e093d78..d9d7d4e 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/SIMCCodeEmitter.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/SIMCCodeEmitter.cpp @@ -309,6 +309,11 @@ uint64_t SIMCCodeEmitter::getImplicitOpSelHiEncoding(int Opcode) const { return OP_SEL_HI_0 | OP_SEL_HI_1 | OP_SEL_HI_2; } +static bool isVCMPX64(const MCInstrDesc &Desc) { + return (Desc.TSFlags & SIInstrFlags::VOP3) && + Desc.hasImplicitDefOfPhysReg(AMDGPU::EXEC); +} + void SIMCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const { @@ -326,6 +331,17 @@ void SIMCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream &OS, Encoding |= getImplicitOpSelHiEncoding(Opcode); } + // GFX11 v_cmpx opcodes promoted to VOP3 have implied dst=EXEC. + // Documentation requires dst to be encoded as EXEC (0x7E), + // but it looks like the actual value encoded for dst operand + // is ignored by HW. It was decided to define dst as "do not care" + // in td files to allow disassembler accept any dst value. + // However, dst is encoded as EXEC for compatibility with SP3. + if (AMDGPU::isGFX11Plus(STI) && isVCMPX64(Desc)) { + assert((Encoding & 0xFF) == 0); + Encoding |= MRI.getEncodingValue(AMDGPU::EXEC_LO); + } + for (unsigned i = 0; i < bytes; i++) { OS.write((uint8_t)Encoding.extractBitsAsZExtValue(8, 8 * i)); } |