@@ -2338,6 +2338,64 @@ defm : VPatBinaryVL_VV_VX_VI<riscv_uaddsat_vl, "PseudoVSADDU">;
2338
2338
defm : VPatBinaryVL_VV_VX<riscv_ssubsat_vl, "PseudoVSSUB">;
2339
2339
defm : VPatBinaryVL_VV_VX<riscv_usubsat_vl, "PseudoVSSUBU">;
2340
2340
2341
+ // 12.5. Vector Narrowing Fixed-Point Clip Instructions
2342
+ class VPatTruncSatClipMaxMinBase<string inst,
2343
+ VTypeInfo vti,
2344
+ VTypeInfo wti,
2345
+ SDPatternOperator op1,
2346
+ int op1_value,
2347
+ SDPatternOperator op2,
2348
+ int op2_value> :
2349
+ Pat<(vti.Vector (riscv_trunc_vector_vl
2350
+ (wti.Vector (op1
2351
+ (wti.Vector (op2
2352
+ (wti.Vector wti.RegClass:$rs1),
2353
+ (wti.Vector (riscv_vmv_v_x_vl (wti.Vector undef), op2_value, (XLenVT srcvalue))),
2354
+ (wti.Vector undef),(wti.Mask V0), VLOpFrag)),
2355
+ (wti.Vector (riscv_vmv_v_x_vl (wti.Vector undef), op1_value, (XLenVT srcvalue))),
2356
+ (wti.Vector undef), (wti.Mask V0), VLOpFrag)),
2357
+ (vti.Mask V0), VLOpFrag)),
2358
+ (!cast<Instruction>(inst#"_WI_"#vti.LMul.MX#"_MASK")
2359
+ (vti.Vector (IMPLICIT_DEF)), wti.RegClass:$rs1, 0,
2360
+ (vti.Mask V0), 0, GPR:$vl, vti.Log2SEW, TA_MA)>;
2361
+
2362
+ class VPatTruncSatClipUMin<VTypeInfo vti,
2363
+ VTypeInfo wti,
2364
+ int uminval> :
2365
+ Pat<(vti.Vector (riscv_trunc_vector_vl
2366
+ (wti.Vector (riscv_umin_vl
2367
+ (wti.Vector wti.RegClass:$rs1),
2368
+ (wti.Vector (riscv_vmv_v_x_vl (wti.Vector undef), uminval, (XLenVT srcvalue))),
2369
+ (wti.Vector undef), (wti.Mask V0), VLOpFrag)),
2370
+ (vti.Mask V0), VLOpFrag)),
2371
+ (!cast<Instruction>("PseudoVNCLIPU_WI_"#vti.LMul.MX#"_MASK")
2372
+ (vti.Vector (IMPLICIT_DEF)), wti.RegClass:$rs1, 0,
2373
+ (vti.Mask V0), 0, GPR:$vl, vti.Log2SEW, TA_MA)>;
2374
+
2375
+ multiclass VPatTruncSatClipMaxMin<string inst, VTypeInfo vti, VTypeInfo wti,
2376
+ SDPatternOperator max, int maxval, SDPatternOperator min, int minval> {
2377
+ def : VPatTruncSatClipMaxMinBase<inst, vti, wti, max, maxval, min, minval>;
2378
+ def : VPatTruncSatClipMaxMinBase<inst, vti, wti, min, minval, max, maxval>;
2379
+ }
2380
+
2381
+ multiclass VPatTruncSatClip<VTypeInfo vti, VTypeInfo wti> {
2382
+ defvar sew = vti.SEW;
2383
+ defvar uminval = !sub(!shl(1, sew), 1);
2384
+ defvar sminval = !sub(!shl(1, !sub(sew, 1)), 1);
2385
+ defvar smaxval = !sub(0, !shl(1, !sub(sew, 1)));
2386
+
2387
+ let Predicates = !listconcat(GetVTypePredicates<vti>.Predicates,
2388
+ GetVTypePredicates<wti>.Predicates) in {
2389
+ defm : VPatTruncSatClipMaxMin<"PseudoVNCLIP", vti, wti, riscv_smin_vl,
2390
+ sminval, riscv_smax_vl, smaxval>;
2391
+ def : VPatTruncSatClipUMin<vti, wti, uminval>;
2392
+ }
2393
+
2394
+ }
2395
+
2396
+ foreach vtiToWti = AllWidenableIntVectors in
2397
+ defm : VPatTruncSatClip<vtiToWti.Vti, vtiToWti.Wti>;
2398
+
2341
2399
// 13. Vector Floating-Point Instructions
2342
2400
2343
2401
// 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
0 commit comments