@@ -141,6 +141,7 @@ def hasLDG : Predicate<"Subtarget->hasLDG()">;
141141def hasLDU : Predicate<"Subtarget->hasLDU()">;
142142def hasPTXASUnreachableBug : Predicate<"Subtarget->hasPTXASUnreachableBug()">;
143143def noPTXASUnreachableBug : Predicate<"!Subtarget->hasPTXASUnreachableBug()">;
144+ def hasOptEnabled : Predicate<"TM.getOptLevel() != CodeGenOptLevel::None">;
144145
145146def doF32FTZ : Predicate<"useF32FTZ()">;
146147def doNoF32FTZ : Predicate<"!useF32FTZ()">;
@@ -1092,73 +1093,39 @@ def : Pat<(mul (zext i16:$a), (i32 UInt16Const:$b)),
10921093//
10931094// Integer multiply-add
10941095//
1095- def SDTIMAD :
1096- SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisInt<0>, SDTCisInt<2>,
1097- SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>]>;
1098- def imad : SDNode<"NVPTXISD::IMAD", SDTIMAD>;
1099-
1100- def MAD16rrr :
1101- NVPTXInst<(outs Int16Regs:$dst),
1102- (ins Int16Regs:$a, Int16Regs:$b, Int16Regs:$c),
1103- "mad.lo.s16 \t$dst, $a, $b, $c;",
1104- [(set i16:$dst, (imad i16:$a, i16:$b, i16:$c))]>;
1105- def MAD16rri :
1106- NVPTXInst<(outs Int16Regs:$dst),
1107- (ins Int16Regs:$a, Int16Regs:$b, i16imm:$c),
1108- "mad.lo.s16 \t$dst, $a, $b, $c;",
1109- [(set i16:$dst, (imad i16:$a, i16:$b, imm:$c))]>;
1110- def MAD16rir :
1111- NVPTXInst<(outs Int16Regs:$dst),
1112- (ins Int16Regs:$a, i16imm:$b, Int16Regs:$c),
1113- "mad.lo.s16 \t$dst, $a, $b, $c;",
1114- [(set i16:$dst, (imad i16:$a, imm:$b, i16:$c))]>;
1115- def MAD16rii :
1116- NVPTXInst<(outs Int16Regs:$dst),
1117- (ins Int16Regs:$a, i16imm:$b, i16imm:$c),
1118- "mad.lo.s16 \t$dst, $a, $b, $c;",
1119- [(set i16:$dst, (imad i16:$a, imm:$b, imm:$c))]>;
1120-
1121- def MAD32rrr :
1122- NVPTXInst<(outs Int32Regs:$dst),
1123- (ins Int32Regs:$a, Int32Regs:$b, Int32Regs:$c),
1124- "mad.lo.s32 \t$dst, $a, $b, $c;",
1125- [(set i32:$dst, (imad i32:$a, i32:$b, i32:$c))]>;
1126- def MAD32rri :
1127- NVPTXInst<(outs Int32Regs:$dst),
1128- (ins Int32Regs:$a, Int32Regs:$b, i32imm:$c),
1129- "mad.lo.s32 \t$dst, $a, $b, $c;",
1130- [(set i32:$dst, (imad i32:$a, i32:$b, imm:$c))]>;
1131- def MAD32rir :
1132- NVPTXInst<(outs Int32Regs:$dst),
1133- (ins Int32Regs:$a, i32imm:$b, Int32Regs:$c),
1134- "mad.lo.s32 \t$dst, $a, $b, $c;",
1135- [(set i32:$dst, (imad i32:$a, imm:$b, i32:$c))]>;
1136- def MAD32rii :
1137- NVPTXInst<(outs Int32Regs:$dst),
1138- (ins Int32Regs:$a, i32imm:$b, i32imm:$c),
1139- "mad.lo.s32 \t$dst, $a, $b, $c;",
1140- [(set i32:$dst, (imad i32:$a, imm:$b, imm:$c))]>;
1141-
1142- def MAD64rrr :
1143- NVPTXInst<(outs Int64Regs:$dst),
1144- (ins Int64Regs:$a, Int64Regs:$b, Int64Regs:$c),
1145- "mad.lo.s64 \t$dst, $a, $b, $c;",
1146- [(set i64:$dst, (imad i64:$a, i64:$b, i64:$c))]>;
1147- def MAD64rri :
1148- NVPTXInst<(outs Int64Regs:$dst),
1149- (ins Int64Regs:$a, Int64Regs:$b, i64imm:$c),
1150- "mad.lo.s64 \t$dst, $a, $b, $c;",
1151- [(set i64:$dst, (imad i64:$a, i64:$b, imm:$c))]>;
1152- def MAD64rir :
1153- NVPTXInst<(outs Int64Regs:$dst),
1154- (ins Int64Regs:$a, i64imm:$b, Int64Regs:$c),
1155- "mad.lo.s64 \t$dst, $a, $b, $c;",
1156- [(set i64:$dst, (imad i64:$a, imm:$b, i64:$c))]>;
1157- def MAD64rii :
1158- NVPTXInst<(outs Int64Regs:$dst),
1159- (ins Int64Regs:$a, i64imm:$b, i64imm:$c),
1160- "mad.lo.s64 \t$dst, $a, $b, $c;",
1161- [(set i64:$dst, (imad i64:$a, imm:$b, imm:$c))]>;
1096+ def mul_oneuse : PatFrag<(ops node:$a, node:$b), (mul node:$a, node:$b), [{
1097+ return N->hasOneUse();
1098+ }]>;
1099+
1100+ multiclass MAD<string Ptx, ValueType VT, NVPTXRegClass Reg, Operand Imm> {
1101+ def rrr:
1102+ NVPTXInst<(outs Reg:$dst),
1103+ (ins Reg:$a, Reg:$b, Reg:$c),
1104+ Ptx # " \t$dst, $a, $b, $c;",
1105+ [(set VT:$dst, (add (mul_oneuse VT:$a, VT:$b), VT:$c))]>;
1106+
1107+ def rir:
1108+ NVPTXInst<(outs Reg:$dst),
1109+ (ins Reg:$a, Imm:$b, Reg:$c),
1110+ Ptx # " \t$dst, $a, $b, $c;",
1111+ [(set VT:$dst, (add (mul_oneuse VT:$a, imm:$b), VT:$c))]>;
1112+ def rri:
1113+ NVPTXInst<(outs Reg:$dst),
1114+ (ins Reg:$a, Reg:$b, Imm:$c),
1115+ Ptx # " \t$dst, $a, $b, $c;",
1116+ [(set VT:$dst, (add (mul_oneuse VT:$a, VT:$b), imm:$c))]>;
1117+ def rii:
1118+ NVPTXInst<(outs Reg:$dst),
1119+ (ins Reg:$a, Imm:$b, Imm:$c),
1120+ Ptx # " \t$dst, $a, $b, $c;",
1121+ [(set VT:$dst, (add (mul_oneuse VT:$a, imm:$b), imm:$c))]>;
1122+ }
1123+
1124+ let Predicates = [hasOptEnabled] in {
1125+ defm MAD16 : MAD<"mad.lo.s16", i16, Int16Regs, i16imm>;
1126+ defm MAD32 : MAD<"mad.lo.s32", i32, Int32Regs, i32imm>;
1127+ defm MAD64 : MAD<"mad.lo.s64", i64, Int64Regs, i64imm>;
1128+ }
11621129
11631130def INEG16 :
11641131 NVPTXInst<(outs Int16Regs:$dst), (ins Int16Regs:$src),
0 commit comments