Skip to content

Commit 437caa3

Browse files
Add new opcode for rounding to odd
1 parent 43b1509 commit 437caa3

File tree

6 files changed

+36
-1
lines changed

6 files changed

+36
-1
lines changed

llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,20 @@ class LLVM_ABI MachineIRBuilder {
13321332
buildFPTrunc(const DstOp &Res, const SrcOp &Op,
13331333
std::optional<unsigned> Flags = std::nullopt);
13341334

1335+
/// Build and insert \p Res = G_FPTRUNC_ODD \p Op
1336+
///
1337+
/// G_FPTRUNC_ODD converts a floating-point value into one with a smaller type using round to odd.
1338+
///
1339+
/// \pre setBasicBlock or setMI must have been called.
1340+
/// \pre \p Res must be a generic virtual register with scalar or vector type.
1341+
/// \pre \p Op must be a generic virtual register with scalar or vector type.
1342+
/// \pre \p Res must be smaller than \p Op
1343+
///
1344+
/// \return The newly created instruction.
1345+
MachineInstrBuilder
1346+
buildFPTruncOdd(const DstOp &Res, const SrcOp &Op,
1347+
std::optional<unsigned> Flags = std::nullopt);
1348+
13351349
/// Build and insert \p Res = G_TRUNC \p Op
13361350
///
13371351
/// G_TRUNC extracts the low bits of a type. For a vector type each element is

llvm/include/llvm/Support/TargetOpcodes.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,9 @@ HANDLE_TARGET_OPCODE(G_FPEXT)
692692
/// Generic float to signed-int conversion
693693
HANDLE_TARGET_OPCODE(G_FPTRUNC)
694694

695+
/// Generic float to signed-int conversion using round to odd
696+
HANDLE_TARGET_OPCODE(G_FPTRUNC_ODD)
697+
695698
/// Generic float to signed-int conversion
696699
HANDLE_TARGET_OPCODE(G_FPTOSI)
697700

llvm/include/llvm/Target/GenericOpcodes.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,12 @@ def G_FPTRUNC : GenericInstruction {
782782
let hasSideEffects = false;
783783
}
784784

785+
def G_FPTRUNC_ODD : GenericInstruction {
786+
let OutOperandList = (outs type0:$dst);
787+
let InOperandList = (ins type1:$src);
788+
let hasSideEffects = false;
789+
}
790+
785791
def G_FPTOSI : GenericInstruction {
786792
let OutOperandList = (outs type0:$dst);
787793
let InOperandList = (ins type1:$src);

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5595,6 +5595,7 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
55955595
case G_ANYEXT:
55965596
case G_FPEXT:
55975597
case G_FPTRUNC:
5598+
case G_FPTRUNC_ODD:
55985599
case G_SITOFP:
55995600
case G_UITOFP:
56005601
case G_FPTOSI:

llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,12 @@ MachineIRBuilder::buildFPTrunc(const DstOp &Res, const SrcOp &Op,
936936
return buildInstr(TargetOpcode::G_FPTRUNC, Res, Op, Flags);
937937
}
938938

939+
MachineInstrBuilder
940+
MachineIRBuilder::buildFPTruncOdd(const DstOp &Res, const SrcOp &Op,
941+
std::optional<unsigned> Flags) {
942+
return buildInstr(TargetOpcode::G_FPTRUNC_ODD, Res, Op, Flags);
943+
}
944+
939945
MachineInstrBuilder MachineIRBuilder::buildICmp(CmpInst::Predicate Pred,
940946
const DstOp &Res,
941947
const SrcOp &Op0,

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,11 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
831831
.clampNumElements(1, v2s64, v2s64)
832832
.scalarize(0);
833833

834+
getActionDefinitionsBuilder(G_FPTRUNC_ODD)
835+
.legalFor({{s16, s32}, {s32, s64}, {v4s16, v4s32}, {v2s32, v2s64}})
836+
.clampMaxNumElements(1, s32, 4)
837+
.clampMaxNumElements(1, s64, 2);
838+
834839
getActionDefinitionsBuilder(G_FPEXT)
835840
.legalFor(
836841
{{s32, s16}, {s64, s16}, {s64, s32}, {v4s32, v4s16}, {v2s64, v2s32}})
@@ -2422,7 +2427,7 @@ bool AArch64LegalizerInfo::legalizeFptrunc(
24222427
default:
24232428
return false;
24242429
case TargetOpcode::G_FPTRUNC: {
2425-
Mid = MIRBuilder.buildFPTrunc(MidTy, Src);
2430+
Mid = MIRBuilder.buildFPTruncOdd(MidTy, Src);
24262431
Fin = MIRBuilder.buildFPTrunc(DstTy, Mid.getReg(0));
24272432
break;
24282433
}

0 commit comments

Comments
 (0)