[llvm] AMDGPU: Add tonearest and towardzero roundings for intrinsic llvm.fptrunc.round (PR #104486)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 16 11:45:03 PDT 2024
================
@@ -7089,23 +7089,31 @@ bool AMDGPULegalizerInfo::legalizeBVHIntrinsic(MachineInstr &MI,
}
bool AMDGPULegalizerInfo::legalizeFPTruncRound(MachineInstr &MI,
+ MachineRegisterInfo &MRI,
MachineIRBuilder &B) const {
- unsigned Opc;
- int RoundMode = MI.getOperand(2).getImm();
+ Register Src = MI.getOperand(1).getReg();
+ if (MRI.getType(Src) != LLT::scalar(32))
+ return false;
- if (RoundMode == (int)RoundingMode::TowardPositive)
- Opc = AMDGPU::G_FPTRUNC_ROUND_UPWARD;
- else if (RoundMode == (int)RoundingMode::TowardNegative)
- Opc = AMDGPU::G_FPTRUNC_ROUND_DOWNWARD;
- else
+ // Only support towardzero, tonearest, upward and downward.
+ int RoundMode = MI.getOperand(2).getImm();
+ if (RoundMode != (int)RoundingMode::TowardZero &&
+ RoundMode != (int)RoundingMode::TowardNegative &&
+ RoundMode != (int)RoundingMode::TowardPositive &&
+ RoundMode != (int)RoundingMode::TowardNegative)
return false;
- B.buildInstr(Opc)
+ // "round.towardzero" -> TowardZero 0 -> FP_ROUND_ROUND_TO_ZERO 3
+ // "round.tonearest" -> NearestTiesToEven 1 -> FP_ROUND_ROUND_TO_NEAREST 0
+ // "round.upward" -> TowardPositive 2 -> FP_ROUND_ROUND_TO_INF 1
+ // "round.downward -> TowardNegative 3 -> FP_ROUND_ROUND_TO_NEGINF 2
+ unsigned HW_Mode = (RoundMode + 3) % 4;
+ B.buildInstr(AMDGPU::G_FPTRUNC_ROUND)
.addDef(MI.getOperand(0).getReg())
- .addUse(MI.getOperand(1).getReg());
+ .addUse(Src)
+ .addImm(HW_Mode);
----------------
arsenm wrote:
All this is really doing is just remapping the encoded rounding mode values. At that point it should just be a selection pattern
https://github.com/llvm/llvm-project/pull/104486
More information about the llvm-commits
mailing list