@@ -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
0 commit comments