@@ -208,6 +208,9 @@ class ValueToRegClass<ValueType T> {
208
208
209
209
class OneUse1<SDPatternOperator operator>
210
210
: PatFrag<(ops node:$A), (operator node:$A), [{ return N->hasOneUse(); }]>;
211
+ class OneUse2<SDPatternOperator operator>
212
+ : PatFrag<(ops node:$A, node:$B), (operator node:$A, node:$B), [{ return N->hasOneUse(); }]>;
213
+
211
214
212
215
class fpimm_pos_inf<ValueType vt>
213
216
: FPImmLeaf<vt, [{ return Imm.isPosInfinity(); }]>;
@@ -1071,9 +1074,7 @@ def : Pat<(mul (zext i16:$a), (i32 UInt16Const:$b)),
1071
1074
//
1072
1075
// Integer multiply-add
1073
1076
//
1074
- def mul_oneuse : PatFrag<(ops node:$a, node:$b), (mul node:$a, node:$b), [{
1075
- return N->hasOneUse();
1076
- }]>;
1077
+ def mul_oneuse : OneUse2<mul>;
1077
1078
1078
1079
multiclass MAD<string Ptx, ValueType VT, NVPTXRegClass Reg, Operand Imm> {
1079
1080
def rrr:
@@ -1778,14 +1779,16 @@ let hasSideEffects = false, isAsCheapAsAMove = true in {
1778
1779
}
1779
1780
1780
1781
def IMOV1r : MOVr<Int1Regs, "pred">;
1781
- def IMOV1i : MOVi<Int1Regs, "pred", i1, i1imm, imm>;
1782
1782
def MOV16r : MOVr<Int16Regs, "b16">;
1783
- def IMOV16i : MOVi<Int16Regs, "b16", i16, i16imm, imm>;
1784
1783
def IMOV32r : MOVr<Int32Regs, "b32">;
1785
- def IMOV32i : MOVi<Int32Regs, "b32", i32, i32imm, imm>;
1786
1784
def IMOV64r : MOVr<Int64Regs, "b64">;
1787
- def IMOV64i : MOVi<Int64Regs, "b64", i64, i64imm, imm>;
1788
1785
def IMOV128r : MOVr<Int128Regs, "b128">;
1786
+
1787
+
1788
+ def IMOV1i : MOVi<Int1Regs, "pred", i1, i1imm, imm>;
1789
+ def IMOV16i : MOVi<Int16Regs, "b16", i16, i16imm, imm>;
1790
+ def IMOV32i : MOVi<Int32Regs, "b32", i32, i32imm, imm>;
1791
+ def IMOV64i : MOVi<Int64Regs, "b64", i64, i64imm, imm>;
1789
1792
def FMOV16i : MOVi<Int16Regs, "b16", f16, f16imm, fpimm>;
1790
1793
def BFMOV16i : MOVi<Int16Regs, "b16", bf16, bf16imm, fpimm>;
1791
1794
def FMOV32i : MOVi<Float32Regs, "b32", f32, f32imm, fpimm>;
@@ -2330,7 +2333,7 @@ def DeclareScalarRegInst :
2330
2333
".reg .b$size param$a;",
2331
2334
[(DeclareScalarParam (i32 imm:$a), (i32 imm:$size), (i32 1))]>;
2332
2335
2333
- class MoveParamSymbolInst<RegTypeInfo t> :
2336
+ class MoveParamSymbolInst<RegTyInfo t> :
2334
2337
BasicNVPTXInst<(outs t.RC:$dst), (ins t.RC:$src),
2335
2338
"mov.b" # t.Size,
2336
2339
[(set t.Ty:$dst, (MoveParam texternalsym:$src))]>;
@@ -2349,21 +2352,18 @@ def PseudoUseParamI16 : PseudoUseParamInst<Int16Regs, i16>;
2349
2352
def PseudoUseParamF64 : PseudoUseParamInst<Float64Regs, f64>;
2350
2353
def PseudoUseParamF32 : PseudoUseParamInst<Float32Regs, f32>;
2351
2354
2352
- class ProxyRegInst<string SzStr, NVPTXRegClass regclass> :
2353
- BasicNVPTXInst<(outs regclass :$dst), (ins regclass :$src),
2355
+ multiclass ProxyRegInst<string SzStr, NVPTXRegClass rc> {
2356
+ def NAME : BasicNVPTXInst<(outs rc :$dst), (ins rc :$src),
2354
2357
"mov." # SzStr>;
2355
-
2356
- def ProxyRegB1 : ProxyRegInst<"pred", Int1Regs>;
2357
- def ProxyRegB16 : ProxyRegInst<"b16", Int16Regs>;
2358
- def ProxyRegB32 : ProxyRegInst<"b32", Int32Regs>;
2359
- def ProxyRegB64 : ProxyRegInst<"b64", Int64Regs>;
2360
-
2361
- foreach rc = [Int1Regs, Int16Regs, Int32Regs, Int64Regs] in {
2362
- defvar ProxyRegInst = cast<NVPTXInst>(ProxyRegB # rc.Size);
2363
2358
foreach vt = rc.RegTypes in
2364
- def: Pat<(vt (ProxyReg vt:$src)), (ProxyRegInst $src)>;
2359
+ def : Pat<(vt (ProxyReg vt:$src)), (!cast<NVPTXInst>(NAME) $src)>;
2365
2360
}
2366
2361
2362
+ defm ProxyRegB1 : ProxyRegInst<"pred", Int1Regs>;
2363
+ defm ProxyRegB16 : ProxyRegInst<"b16", Int16Regs>;
2364
+ defm ProxyRegB32 : ProxyRegInst<"b32", Int32Regs>;
2365
+ defm ProxyRegB64 : ProxyRegInst<"b64", Int64Regs>;
2366
+
2367
2367
//
2368
2368
// Load / Store Handling
2369
2369
//
@@ -2739,13 +2739,10 @@ foreach vt = [v2f16, v2bf16, v2i16] in {
2739
2739
2740
2740
def : Pat<(extractelt vt:$src, 0), (I32toI16L $src)>;
2741
2741
def : Pat<(extractelt vt:$src, 1), (I32toI16H $src)>;
2742
+
2743
+ def : Pat<(vt (build_vector vt.ElementType:$a, vt.ElementType:$b)),
2744
+ (V2I16toI32 $a, $b)>;
2742
2745
}
2743
- def : Pat<(v2f16 (build_vector f16:$a, f16:$b)),
2744
- (V2I16toI32 $a, $b)>;
2745
- def : Pat<(v2bf16 (build_vector bf16:$a, bf16:$b)),
2746
- (V2I16toI32 $a, $b)>;
2747
- def : Pat<(v2i16 (build_vector i16:$a, i16:$b)),
2748
- (V2I16toI32 $a, $b)>;
2749
2746
2750
2747
def: Pat<(v2i16 (scalar_to_vector i16:$a)),
2751
2748
(CVT_u32_u16 $a, CvtNONE)>;
0 commit comments