@@ -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:
@@ -1784,14 +1785,16 @@ let hasSideEffects = false, isAsCheapAsAMove = true in {
1784
1785
}
1785
1786
1786
1787
def IMOV1r : MOVr<Int1Regs, "pred">;
1787
- def IMOV1i : MOVi<Int1Regs, "pred", i1, i1imm, imm>;
1788
1788
def MOV16r : MOVr<Int16Regs, "b16">;
1789
- def IMOV16i : MOVi<Int16Regs, "b16", i16, i16imm, imm>;
1790
1789
def IMOV32r : MOVr<Int32Regs, "b32">;
1791
- def IMOV32i : MOVi<Int32Regs, "b32", i32, i32imm, imm>;
1792
1790
def IMOV64r : MOVr<Int64Regs, "b64">;
1793
- def IMOV64i : MOVi<Int64Regs, "b64", i64, i64imm, imm>;
1794
1791
def IMOV128r : MOVr<Int128Regs, "b128">;
1792
+
1793
+
1794
+ def IMOV1i : MOVi<Int1Regs, "pred", i1, i1imm, imm>;
1795
+ def IMOV16i : MOVi<Int16Regs, "b16", i16, i16imm, imm>;
1796
+ def IMOV32i : MOVi<Int32Regs, "b32", i32, i32imm, imm>;
1797
+ def IMOV64i : MOVi<Int64Regs, "b64", i64, i64imm, imm>;
1795
1798
def FMOV16i : MOVi<Int16Regs, "b16", f16, f16imm, fpimm>;
1796
1799
def BFMOV16i : MOVi<Int16Regs, "b16", bf16, bf16imm, fpimm>;
1797
1800
def FMOV32i : MOVi<Float32Regs, "b32", f32, f32imm, fpimm>;
@@ -2336,7 +2339,7 @@ def DeclareScalarRegInst :
2336
2339
".reg .b$size param$a;",
2337
2340
[(DeclareScalarParam (i32 imm:$a), (i32 imm:$size), (i32 1))]>;
2338
2341
2339
- class MoveParamSymbolInst<RegTypeInfo t> :
2342
+ class MoveParamSymbolInst<RegTyInfo t> :
2340
2343
BasicNVPTXInst<(outs t.RC:$dst), (ins t.RC:$src),
2341
2344
"mov.b" # t.Size,
2342
2345
[(set t.Ty:$dst, (MoveParam texternalsym:$src))]>;
@@ -2355,21 +2358,18 @@ def PseudoUseParamI16 : PseudoUseParamInst<Int16Regs, i16>;
2355
2358
def PseudoUseParamF64 : PseudoUseParamInst<Float64Regs, f64>;
2356
2359
def PseudoUseParamF32 : PseudoUseParamInst<Float32Regs, f32>;
2357
2360
2358
- class ProxyRegInst<string SzStr, NVPTXRegClass regclass> :
2359
- BasicNVPTXInst<(outs regclass :$dst), (ins regclass :$src),
2361
+ multiclass ProxyRegInst<string SzStr, NVPTXRegClass rc> {
2362
+ def NAME : BasicNVPTXInst<(outs rc :$dst), (ins rc :$src),
2360
2363
"mov." # SzStr>;
2361
-
2362
- def ProxyRegB1 : ProxyRegInst<"pred", Int1Regs>;
2363
- def ProxyRegB16 : ProxyRegInst<"b16", Int16Regs>;
2364
- def ProxyRegB32 : ProxyRegInst<"b32", Int32Regs>;
2365
- def ProxyRegB64 : ProxyRegInst<"b64", Int64Regs>;
2366
-
2367
- foreach rc = [Int1Regs, Int16Regs, Int32Regs, Int64Regs] in {
2368
- defvar ProxyRegInst = cast<NVPTXInst>(ProxyRegB # rc.Size);
2369
2364
foreach vt = rc.RegTypes in
2370
- def: Pat<(vt (ProxyReg vt:$src)), (ProxyRegInst $src)>;
2365
+ def : Pat<(vt (ProxyReg vt:$src)), (!cast<NVPTXInst>(NAME) $src)>;
2371
2366
}
2372
2367
2368
+ defm ProxyRegB1 : ProxyRegInst<"pred", Int1Regs>;
2369
+ defm ProxyRegB16 : ProxyRegInst<"b16", Int16Regs>;
2370
+ defm ProxyRegB32 : ProxyRegInst<"b32", Int32Regs>;
2371
+ defm ProxyRegB64 : ProxyRegInst<"b64", Int64Regs>;
2372
+
2373
2373
//
2374
2374
// Load / Store Handling
2375
2375
//
@@ -2745,13 +2745,10 @@ foreach vt = [v2f16, v2bf16, v2i16] in {
2745
2745
2746
2746
def : Pat<(extractelt vt:$src, 0), (I32toI16L $src)>;
2747
2747
def : Pat<(extractelt vt:$src, 1), (I32toI16H $src)>;
2748
+
2749
+ def : Pat<(vt (build_vector vt.ElementType:$a, vt.ElementType:$b)),
2750
+ (V2I16toI32 $a, $b)>;
2748
2751
}
2749
- def : Pat<(v2f16 (build_vector f16:$a, f16:$b)),
2750
- (V2I16toI32 $a, $b)>;
2751
- def : Pat<(v2bf16 (build_vector bf16:$a, bf16:$b)),
2752
- (V2I16toI32 $a, $b)>;
2753
- def : Pat<(v2i16 (build_vector i16:$a, i16:$b)),
2754
- (V2I16toI32 $a, $b)>;
2755
2752
2756
2753
def: Pat<(v2i16 (scalar_to_vector i16:$a)),
2757
2754
(CVT_u32_u16 $a, CvtNONE)>;
0 commit comments