Skip to content

Commit 60f4aff

Browse files
Implement more floating-point ops
1 parent fb87992 commit 60f4aff

File tree

4 files changed

+74
-9
lines changed

4 files changed

+74
-9
lines changed

llvm/lib/Target/WebAssembly/GISel/WebAssemblyLegalizerInfo.cpp

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ WebAssemblyLegalizerInfo::WebAssemblyLegalizerInfo(
8787
.clampScalar(0, s32, s64);
8888

8989
getActionDefinitionsBuilder({G_ASHR, G_LSHR, G_SHL, G_CTLZ, G_CTLZ_ZERO_UNDEF,
90-
G_CTTZ, G_CTTZ_ZERO_UNDEF, G_CTPOP, G_ROTL, G_ROTR})
90+
G_CTTZ, G_CTTZ_ZERO_UNDEF, G_CTPOP, G_ROTL,
91+
G_ROTR})
9192
.legalFor({{s32, s32}, {s64, s64}})
9293
.widenScalarToNextPow2(0)
9394
.clampScalar(0, s32, s64)
@@ -110,14 +111,16 @@ WebAssemblyLegalizerInfo::WebAssemblyLegalizerInfo(
110111
getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FDIV, G_FMUL, G_FNEG, G_FABS,
111112
G_FCEIL, G_FFLOOR, G_FSQRT, G_INTRINSIC_TRUNC,
112113
G_FNEARBYINT, G_FRINT, G_INTRINSIC_ROUNDEVEN,
113-
G_FMINIMUM, G_FMAXIMUM})
114+
G_FMINIMUM, G_FMAXIMUM, G_STRICT_FMUL})
114115
.legalFor({s32, s64})
115116
.minScalar(0, s32);
116117

117-
// TODO: _IEEE not lowering correctly?
118-
getActionDefinitionsBuilder(
119-
{G_FMINNUM, G_FMAXNUM, G_FMINNUM_IEEE, G_FMAXNUM_IEEE})
120-
.lowerFor({s32, s64})
118+
getActionDefinitionsBuilder({G_FMINNUM, G_FMAXNUM})
119+
.customFor({s32, s64})
120+
.minScalar(0, s32);
121+
122+
getActionDefinitionsBuilder(G_FCANONICALIZE)
123+
.customFor({s32, s64})
121124
.minScalar(0, s32);
122125

123126
getActionDefinitionsBuilder({G_FMA, G_FREM})
@@ -262,7 +265,63 @@ bool WebAssemblyLegalizerInfo::legalizeCustom(
262265
auto &MIRBuilder = Helper.MIRBuilder;
263266

264267
switch (MI.getOpcode()) {
265-
case WebAssembly::G_PTRTOINT: {
268+
case TargetOpcode::G_FCANONICALIZE: {
269+
auto One = MRI.createGenericVirtualRegister(
270+
MRI.getType(MI.getOperand(0).getReg()));
271+
MIRBuilder.buildFConstant(One, 1.0);
272+
273+
MIRBuilder.buildInstr(TargetOpcode::G_STRICT_FMUL)
274+
.addDef(MI.getOperand(0).getReg())
275+
.addUse(MI.getOperand(1).getReg())
276+
.addUse(One)
277+
.setMIFlags(MI.getFlags())
278+
.setMIFlag(MachineInstr::MIFlag::NoFPExcept);
279+
280+
MI.eraseFromParent();
281+
return true;
282+
}
283+
case TargetOpcode::G_FMINNUM: {
284+
if (!MI.getFlag(MachineInstr::MIFlag::FmNoNans))
285+
return false;
286+
287+
if (MI.getFlag(MachineInstr::MIFlag::FmNsz)) {
288+
MIRBuilder.buildInstr(TargetOpcode::G_FMINIMUM)
289+
.addDef(MI.getOperand(0).getReg())
290+
.addUse(MI.getOperand(1).getReg())
291+
.addUse(MI.getOperand(2).getReg())
292+
.setMIFlags(MI.getFlags());
293+
} else {
294+
auto TmpReg = MRI.createGenericVirtualRegister(LLT::scalar(1));
295+
296+
MIRBuilder.buildFCmp(CmpInst::Predicate::FCMP_OLT, TmpReg,
297+
MI.getOperand(1), MI.getOperand(2));
298+
MIRBuilder.buildSelect(MI.getOperand(0), TmpReg, MI.getOperand(1),
299+
MI.getOperand(2));
300+
}
301+
MI.eraseFromParent();
302+
return true;
303+
}
304+
case TargetOpcode::G_FMAXNUM: {
305+
if (!MI.getFlag(MachineInstr::MIFlag::FmNoNans))
306+
return false;
307+
if (MI.getFlag(MachineInstr::MIFlag::FmNsz)) {
308+
MIRBuilder.buildInstr(TargetOpcode::G_FMAXIMUM)
309+
.addDef(MI.getOperand(0).getReg())
310+
.addUse(MI.getOperand(1).getReg())
311+
.addUse(MI.getOperand(2).getReg())
312+
.setMIFlags(MI.getFlags());
313+
} else {
314+
auto TmpReg = MRI.createGenericVirtualRegister(LLT::scalar(1));
315+
316+
MIRBuilder.buildFCmp(CmpInst::Predicate::FCMP_OGT, TmpReg,
317+
MI.getOperand(1), MI.getOperand(2));
318+
MIRBuilder.buildSelect(MI.getOperand(0), TmpReg, MI.getOperand(1),
319+
MI.getOperand(2));
320+
}
321+
MI.eraseFromParent();
322+
return true;
323+
}
324+
case TargetOpcode::G_PTRTOINT: {
266325
auto TmpReg = MRI.createGenericVirtualRegister(
267326
LLT::scalar(MIRBuilder.getDataLayout().getPointerSizeInBits(0)));
268327

@@ -271,7 +330,7 @@ bool WebAssemblyLegalizerInfo::legalizeCustom(
271330
MI.eraseFromParent();
272331
return true;
273332
}
274-
case WebAssembly::G_INTTOPTR: {
333+
case TargetOpcode::G_INTTOPTR: {
275334
auto TmpReg = MRI.createGenericVirtualRegister(
276335
LLT::scalar(MIRBuilder.getDataLayout().getPointerSizeInBits(0)));
277336

llvm/lib/Target/WebAssembly/GISel/WebAssemblyRegisterBankInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ WebAssemblyRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
193193
case G_FMA:
194194
case G_FREM:
195195
case G_FCOPYSIGN:
196+
case G_FCANONICALIZE:
197+
case G_STRICT_FMUL:
196198
OperandsMapping = &Op0FloatValueMapping;
197199
break;
198200
case G_SEXT_INREG:

llvm/lib/Target/WebAssembly/WebAssemblyGISel.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ def : Pat<(i64 (ctlz_zero_undef I64:$src)), (CLZ_I64 I64:$src)>;
123123
def : Pat<(i32 (cttz_zero_undef I32:$src)), (CTZ_I32 I32:$src)>;
124124
def : Pat<(i64 (cttz_zero_undef I64:$src)), (CTZ_I64 I64:$src)>;
125125

126+
127+
def : Pat<(f32 (strict_fmul F32:$lhs, F32:$rhs)), (MUL_F32 F32:$lhs, F32:$rhs)>;
128+
def : Pat<(f64 (strict_fmul F64:$lhs, F64:$rhs)), (MUL_F64 F64:$lhs, F64:$rhs)>;
129+
126130
//===----------------------------------------------------------------------===//
127131
// Complex pattern equivalents
128132
//===----------------------------------------------------------------------===//

llvm/lib/Target/WebAssembly/WebAssemblyRegisterBanks.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
def I32RegBank : RegisterBank<"I32RegBank", [I32]>;
1414
def I64RegBank : RegisterBank<"I64RegBank", [I64]>;
15-
def F32RegBank : RegisterBank<"F64RegBank", [F32]>;
15+
def F32RegBank : RegisterBank<"F32RegBank", [F32]>;
1616
def F64RegBank : RegisterBank<"F64RegBank", [F64]>;
1717

1818
def EXTERNREFRegBank : RegisterBank<"EXTERNREFRegBank", [EXTERNREF]>;

0 commit comments

Comments
 (0)