@@ -87,9 +87,10 @@ class AMDGPUMCCodeEmitter : public MCCodeEmitter {
8787 const MCSubtargetInfo &STI) const ;
8888
8989 // / Encode an fp or int literal.
90- std::optional<uint32_t > getLitEncoding (const MCOperand &MO,
91- const MCOperandInfo &OpInfo,
92- const MCSubtargetInfo &STI) const ;
90+ std::optional<uint64_t >
91+ getLitEncoding (const MCOperand &MO, const MCOperandInfo &OpInfo,
92+ const MCSubtargetInfo &STI,
93+ bool HasMandatoryLiteral = false ) const ;
9394
9495 void getBinaryCodeForInstr (const MCInst &MI, SmallVectorImpl<MCFixup> &Fixups,
9596 APInt &Inst, APInt &Scratch,
@@ -265,10 +266,9 @@ static uint32_t getLit64Encoding(uint64_t Val, const MCSubtargetInfo &STI,
265266 : 255 ;
266267}
267268
268- std::optional<uint32_t >
269- AMDGPUMCCodeEmitter::getLitEncoding (const MCOperand &MO,
270- const MCOperandInfo &OpInfo,
271- const MCSubtargetInfo &STI) const {
269+ std::optional<uint64_t > AMDGPUMCCodeEmitter::getLitEncoding (
270+ const MCOperand &MO, const MCOperandInfo &OpInfo,
271+ const MCSubtargetInfo &STI, bool HasMandatoryLiteral) const {
272272 int64_t Imm;
273273 if (MO.isExpr ()) {
274274 if (!MO.getExpr ()->evaluateAsAbsolute (Imm))
@@ -303,9 +303,13 @@ AMDGPUMCCodeEmitter::getLitEncoding(const MCOperand &MO,
303303
304304 case AMDGPU::OPERAND_REG_INLINE_C_FP64:
305305 case AMDGPU::OPERAND_REG_INLINE_AC_FP64:
306- case AMDGPU::OPERAND_REG_IMM_FP64:
307306 return getLit64Encoding (static_cast <uint64_t >(Imm), STI, true );
308307
308+ case AMDGPU::OPERAND_REG_IMM_FP64: {
309+ auto Enc = getLit64Encoding (static_cast <uint64_t >(Imm), STI, true );
310+ return (HasMandatoryLiteral && Enc == 255 ) ? 254 : Enc;
311+ }
312+
309313 case AMDGPU::OPERAND_REG_IMM_INT16:
310314 case AMDGPU::OPERAND_REG_INLINE_C_INT16:
311315 return getLit16IntEncoding (static_cast <uint32_t >(Imm), STI);
@@ -339,6 +343,7 @@ AMDGPUMCCodeEmitter::getLitEncoding(const MCOperand &MO,
339343
340344 case AMDGPU::OPERAND_KIMM32:
341345 case AMDGPU::OPERAND_KIMM16:
346+ case AMDGPU::OPERAND_KIMM64:
342347 return MO.getImm ();
343348 default :
344349 llvm_unreachable (" invalid operand size" );
@@ -685,7 +690,10 @@ void AMDGPUMCCodeEmitter::getMachineOpValueCommon(
685690
686691 const MCInstrDesc &Desc = MCII.get (MI.getOpcode ());
687692 if (AMDGPU::isSISrcOperand (Desc, OpNo)) {
688- if (auto Enc = getLitEncoding (MO, Desc.operands ()[OpNo], STI)) {
693+ bool HasMandatoryLiteral =
694+ AMDGPU::hasNamedOperand (MI.getOpcode (), AMDGPU::OpName::imm);
695+ if (auto Enc = getLitEncoding (MO, Desc.operands ()[OpNo], STI,
696+ HasMandatoryLiteral)) {
689697 Op = *Enc;
690698 return ;
691699 }
0 commit comments