@@ -125,8 +125,6 @@ def doF32FTZ : Predicate<"useF32FTZ()">;
125125def doNoF32FTZ : Predicate<"!useF32FTZ()">;
126126def doRsqrtOpt : Predicate<"doRsqrtOpt()">;
127127
128- def doMulWide : Predicate<"doMulWide">;
129-
130128def hasHWROT32 : Predicate<"Subtarget->hasHWROT32()">;
131129def noHWROT32 : Predicate<"!Subtarget->hasHWROT32()">;
132130def hasDotInstructions : Predicate<"Subtarget->hasDotInstructions()">;
@@ -860,11 +858,11 @@ def MULWIDEU32Imm32 :
860858 BasicNVPTXInst<(outs B32:$dst), (ins B16:$a, i32imm:$b), "mul.wide.u16">;
861859
862860def SDTMulWide : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>, SDTCisSameAs<1, 2>]>;
863- def mul_wide_signed : SDNode<"NVPTXISD::MUL_WIDE_SIGNED", SDTMulWide>;
864- def mul_wide_unsigned : SDNode<"NVPTXISD::MUL_WIDE_UNSIGNED", SDTMulWide>;
861+ def mul_wide_signed : SDNode<"NVPTXISD::MUL_WIDE_SIGNED", SDTMulWide, [SDNPCommutative] >;
862+ def mul_wide_unsigned : SDNode<"NVPTXISD::MUL_WIDE_UNSIGNED", SDTMulWide, [SDNPCommutative] >;
865863
866864// Matchers for signed, unsigned mul.wide ISD nodes.
867- let Predicates = [doMulWide ] in {
865+ let Predicates = [hasOptEnabled ] in {
868866 def : Pat<(i32 (mul_wide_signed i16:$a, i16:$b)), (MULWIDES32 $a, $b)>;
869867 def : Pat<(i32 (mul_wide_signed i16:$a, imm:$b)), (MULWIDES32Imm $a, imm:$b)>;
870868 def : Pat<(i32 (mul_wide_unsigned i16:$a, i16:$b)), (MULWIDEU32 $a, $b)>;
@@ -876,85 +874,6 @@ let Predicates = [doMulWide] in {
876874 def : Pat<(i64 (mul_wide_unsigned i32:$a, imm:$b)), (MULWIDEU64Imm $a, imm:$b)>;
877875}
878876
879- // Predicates used for converting some patterns to mul.wide.
880- def SInt32Const : PatLeaf<(imm), [{
881- const APInt &v = N->getAPIntValue();
882- return v.isSignedIntN(32);
883- }]>;
884-
885- def UInt32Const : PatLeaf<(imm), [{
886- const APInt &v = N->getAPIntValue();
887- return v.isIntN(32);
888- }]>;
889-
890- def SInt16Const : PatLeaf<(imm), [{
891- const APInt &v = N->getAPIntValue();
892- return v.isSignedIntN(16);
893- }]>;
894-
895- def UInt16Const : PatLeaf<(imm), [{
896- const APInt &v = N->getAPIntValue();
897- return v.isIntN(16);
898- }]>;
899-
900- def IntConst_0_30 : PatLeaf<(imm), [{
901- // Check if 0 <= v < 31; only then will the result of (x << v) be an int32.
902- const APInt &v = N->getAPIntValue();
903- return v.sge(0) && v.slt(31);
904- }]>;
905-
906- def IntConst_0_14 : PatLeaf<(imm), [{
907- // Check if 0 <= v < 15; only then will the result of (x << v) be an int16.
908- const APInt &v = N->getAPIntValue();
909- return v.sge(0) && v.slt(15);
910- }]>;
911-
912- def SHL2MUL32 : SDNodeXForm<imm, [{
913- const APInt &v = N->getAPIntValue();
914- APInt temp(32, 1);
915- return CurDAG->getTargetConstant(temp.shl(v), SDLoc(N), MVT::i32);
916- }]>;
917-
918- def SHL2MUL16 : SDNodeXForm<imm, [{
919- const APInt &v = N->getAPIntValue();
920- APInt temp(16, 1);
921- return CurDAG->getTargetConstant(temp.shl(v), SDLoc(N), MVT::i16);
922- }]>;
923-
924- // Convert "sign/zero-extend, then shift left by an immediate" to mul.wide.
925- let Predicates = [doMulWide] in {
926- def : Pat<(shl (sext i32:$a), (i32 IntConst_0_30:$b)),
927- (MULWIDES64Imm $a, (SHL2MUL32 $b))>;
928- def : Pat<(shl (zext i32:$a), (i32 IntConst_0_30:$b)),
929- (MULWIDEU64Imm $a, (SHL2MUL32 $b))>;
930-
931- def : Pat<(shl (sext i16:$a), (i16 IntConst_0_14:$b)),
932- (MULWIDES32Imm $a, (SHL2MUL16 $b))>;
933- def : Pat<(shl (zext i16:$a), (i16 IntConst_0_14:$b)),
934- (MULWIDEU32Imm $a, (SHL2MUL16 $b))>;
935-
936- // Convert "sign/zero-extend then multiply" to mul.wide.
937- def : Pat<(mul (sext i32:$a), (sext i32:$b)),
938- (MULWIDES64 $a, $b)>;
939- def : Pat<(mul (sext i32:$a), (i64 SInt32Const:$b)),
940- (MULWIDES64Imm64 $a, (i64 SInt32Const:$b))>;
941-
942- def : Pat<(mul (zext i32:$a), (zext i32:$b)),
943- (MULWIDEU64 $a, $b)>;
944- def : Pat<(mul (zext i32:$a), (i64 UInt32Const:$b)),
945- (MULWIDEU64Imm64 $a, (i64 UInt32Const:$b))>;
946-
947- def : Pat<(mul (sext i16:$a), (sext i16:$b)),
948- (MULWIDES32 $a, $b)>;
949- def : Pat<(mul (sext i16:$a), (i32 SInt16Const:$b)),
950- (MULWIDES32Imm32 $a, (i32 SInt16Const:$b))>;
951-
952- def : Pat<(mul (zext i16:$a), (zext i16:$b)),
953- (MULWIDEU32 $a, $b)>;
954- def : Pat<(mul (zext i16:$a), (i32 UInt16Const:$b)),
955- (MULWIDEU32Imm32 $a, (i32 UInt16Const:$b))>;
956- }
957-
958877//
959878// Integer multiply-add
960879//
@@ -990,33 +909,38 @@ defm MAD32 : MAD<"mad.lo.s32", i32, B32, i32imm>;
990909defm MAD64 : MAD<"mad.lo.s64", i64, B64, i64imm>;
991910}
992911
993- multiclass MAD_WIDE<string PtxSuffix, SDNode Op, ValueType BigVT, NVPTXRegClass BigReg, Operand BigImm, ValueType SmallVT, NVPTXRegClass SmallReg, Operand SmallImm > {
912+ multiclass MAD_WIDE<string PtxSuffix, OneUse2 Op, RegTyInfo BigT, RegTyInfo SmallT > {
994913 def rrr:
995- BasicNVPTXInst<(outs BigReg :$dst),
996- (ins SmallReg :$a, SmallReg :$b, BigReg :$c),
914+ BasicNVPTXInst<(outs BigT.RC :$dst),
915+ (ins SmallT.RC :$a, SmallT.RC :$b, BigT.RC :$c),
997916 "mad.wide." # PtxSuffix,
998- [(set BigVT :$dst, (add (Op SmallVT :$a, SmallVT :$b), BigVT :$c))]>;
917+ [(set BigT.Ty :$dst, (add (Op SmallT.Ty :$a, SmallT.Ty :$b), BigT.Ty :$c))]>;
999918 def rri:
1000- BasicNVPTXInst<(outs BigReg :$dst),
1001- (ins SmallReg :$a, SmallReg :$b, BigImm :$c),
919+ BasicNVPTXInst<(outs BigT.RC :$dst),
920+ (ins SmallT.RC :$a, SmallT.RC :$b, BigT.Imm :$c),
1002921 "mad.wide." # PtxSuffix,
1003- [(set BigVT :$dst, (add (Op SmallVT :$a, SmallVT :$b), imm:$c))]>;
922+ [(set BigT.Ty :$dst, (add (Op SmallT.Ty :$a, SmallT.Ty :$b), imm:$c))]>;
1004923 def rir:
1005- BasicNVPTXInst<(outs BigReg :$dst),
1006- (ins SmallReg :$a, SmallImm :$b, BigReg :$c),
924+ BasicNVPTXInst<(outs BigT.RC :$dst),
925+ (ins SmallT.RC :$a, SmallT.Imm :$b, BigT.RC :$c),
1007926 "mad.wide." # PtxSuffix,
1008- [(set BigVT :$dst, (add (Op SmallVT :$a, imm:$b), BigVT :$c))]>;
927+ [(set BigT.Ty :$dst, (add (Op SmallT.Ty :$a, imm:$b), BigT.Ty :$c))]>;
1009928 def rii:
1010- BasicNVPTXInst<(outs BigReg :$dst),
1011- (ins SmallReg :$a, SmallImm :$b, BigImm :$c),
929+ BasicNVPTXInst<(outs BigT.RC :$dst),
930+ (ins SmallT.RC :$a, SmallT.Imm :$b, BigT.Imm :$c),
1012931 "mad.wide." # PtxSuffix,
1013- [(set BigVT :$dst, (add (Op SmallVT :$a, imm:$b), imm:$c))]>;
932+ [(set BigT.Ty :$dst, (add (Op SmallT.Ty :$a, imm:$b), imm:$c))]>;
1014933}
1015934
1016- defm MAD_WIDE_U16 : MAD_WIDE<"u16", mul_wide_unsigned, i32, B32, i32imm, i16, B16, i16imm>;
1017- defm MAD_WIDE_S16 : MAD_WIDE<"s16", mul_wide_signed, i32, B32, i32imm, i16, B16, i16imm>;
1018- defm MAD_WIDE_U32 : MAD_WIDE<"u32", mul_wide_unsigned, i64, B64, i64imm, i32, B32, i32imm>;
1019- defm MAD_WIDE_S32 : MAD_WIDE<"s32", mul_wide_signed, i64, B64, i64imm, i32, B32, i32imm>;
935+ def mul_wide_unsigned_oneuse : OneUse2<mul_wide_unsigned>;
936+ def mul_wide_signed_oneuse : OneUse2<mul_wide_signed>;
937+
938+ let Predicates = [hasOptEnabled] in {
939+ defm MAD_WIDE_U16 : MAD_WIDE<"u16", mul_wide_unsigned_oneuse, I32RT, I16RT>;
940+ defm MAD_WIDE_S16 : MAD_WIDE<"s16", mul_wide_signed_oneuse, I32RT, I16RT>;
941+ defm MAD_WIDE_U32 : MAD_WIDE<"u32", mul_wide_unsigned_oneuse, I64RT, I32RT>;
942+ defm MAD_WIDE_S32 : MAD_WIDE<"s32", mul_wide_signed_oneuse, I64RT, I32RT>;
943+ }
1020944
1021945foreach t = [I16RT, I32RT, I64RT] in {
1022946 def NEG_S # t.Size :
0 commit comments