@@ -5418,64 +5418,75 @@ def VImm7FFF: PatLeaf<(AArch64movi_msl (i32 127), (i32 264))>;
5418
5418
def VImm8000: PatLeaf<(AArch64mvni_msl (i32 127), (i32 264))>;
5419
5419
5420
5420
// trunc(umin(X, 255)) -> UQXTRN v8i8
5421
- def : Pat<(v8i8 (trunc (umin ( v8i16 V128:$Vn), (v8i16 VImmFF) ))),
5421
+ def : Pat<(v8i8 (truncusat_u ( v8i16 V128:$Vn))),
5422
5422
(UQXTNv8i8 V128:$Vn)>;
5423
5423
// trunc(umin(X, 65535)) -> UQXTRN v4i16
5424
- def : Pat<(v4i16 (trunc (umin ( v4i32 V128:$Vn), (v4i32 VImmFFFF) ))),
5424
+ def : Pat<(v4i16 (truncusat_u ( v4i32 V128:$Vn))),
5425
5425
(UQXTNv4i16 V128:$Vn)>;
5426
+ // trunc(umin(X, 4294967295)) -> UQXTRN v2i32
5427
+ def : Pat<(v2i32 (truncusat_u (v2i64 V128:$Vn))),
5428
+ (UQXTNv2i32 V128:$Vn)>;
5426
5429
// trunc(smin(smax(X, -128), 128)) -> SQXTRN
5427
- // with reversed min/max
5428
- def : Pat<(v8i8 (trunc (smin (smax (v8i16 V128:$Vn), (v8i16 VImm80)),
5429
- (v8i16 VImm7F)))),
5430
- (SQXTNv8i8 V128:$Vn)>;
5431
- def : Pat<(v8i8 (trunc (smax (smin (v8i16 V128:$Vn), (v8i16 VImm7F)),
5432
- (v8i16 VImm80)))),
5430
+ def : Pat<(v8i8 (truncssat_s (v8i16 V128:$Vn))),
5433
5431
(SQXTNv8i8 V128:$Vn)>;
5434
5432
// trunc(smin(smax(X, -32768), 32767)) -> SQXTRN
5435
- // with reversed min/max
5436
- def : Pat<(v4i16 (trunc (smin (smax (v4i32 V128:$Vn), (v4i32 VImm8000)),
5437
- (v4i32 VImm7FFF)))),
5438
- (SQXTNv4i16 V128:$Vn)>;
5439
- def : Pat<(v4i16 (trunc (smax (smin (v4i32 V128:$Vn), (v4i32 VImm7FFF)),
5440
- (v4i32 VImm8000)))),
5433
+ def : Pat<(v4i16 (truncssat_s (v4i32 V128:$Vn))),
5441
5434
(SQXTNv4i16 V128:$Vn)>;
5442
-
5443
- // concat_vectors(Vd, trunc(umin(X, 255))) -> UQXTRN(Vd, Vn)
5435
+ // trunc(smin(smax(X, -2147483648), 2147483647)) -> SQXTRN
5436
+ def : Pat<(v2i32 (truncssat_s (v2i64 V128:$Vn))),
5437
+ (SQXTNv2i32 V128:$Vn)>;
5438
+ // trunc(umin(smax(X, 0), 255)) -> SQXTUN
5439
+ def : Pat<(v8i8 (truncssat_u (v8i16 V128:$Vn))),
5440
+ (SQXTUNv8i8 V128:$Vn)>;
5441
+ // trunc(umin(smax(X, 0), 65535)) -> SQXTUN
5442
+ def : Pat<(v4i16 (truncssat_u (v4i32 V128:$Vn))),
5443
+ (SQXTUNv4i16 V128:$Vn)>;
5444
+ // trunc(umin(smax(X, 0), 4294967295)) -> SQXTUN
5445
+ def : Pat<(v2i32 (truncssat_u (v2i64 V128:$Vn))),
5446
+ (SQXTUNv2i32 V128:$Vn)>;
5447
+
5448
+ // truncusat_u
5449
+ // concat_vectors(Vd, truncusat_u(Vn)) ~> UQXTRN(Vd, Vn)
5444
5450
def : Pat<(v16i8 (concat_vectors
5445
5451
(v8i8 V64:$Vd),
5446
- (v8i8 (trunc (umin ( v8i16 V128:$Vn), (v8i16 VImmFF) ))))),
5452
+ (v8i8 (truncusat_u ( v8i16 V128:$Vn))))),
5447
5453
(UQXTNv16i8 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5448
- // concat_vectors(Vd, trunc(umin(X, 65535))) -> UQXTRN(Vd, Vn)
5449
5454
def : Pat<(v8i16 (concat_vectors
5450
5455
(v4i16 V64:$Vd),
5451
- (v4i16 (trunc (umin ( v4i32 V128:$Vn), (v4i32 VImmFFFF) ))))),
5456
+ (v4i16 (truncusat_u ( v4i32 V128:$Vn))))),
5452
5457
(UQXTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5458
+ def : Pat<(v4i32 (concat_vectors
5459
+ (v2i32 V64:$Vd),
5460
+ (v2i32 (truncusat_u (v2i64 V128:$Vn))))),
5461
+ (UQXTNv4i32 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5453
5462
5454
- // concat_vectors(Vd, trunc(smin(smax Vm, -128), 127) ~> SQXTN2(Vd, Vn)
5455
- // with reversed min/max
5463
+ // concat_vectors(Vd, truncssat_s(Vn)) ~> SQXTN2(Vd, Vn)
5456
5464
def : Pat<(v16i8 (concat_vectors
5457
5465
(v8i8 V64:$Vd),
5458
- (v8i8 (trunc (smin (smax (v8i16 V128:$Vn), (v8i16 VImm80)),
5459
- (v8i16 VImm7F)))))),
5466
+ (v8i8 (truncssat_s (v8i16 V128:$Vn))))),
5460
5467
(SQXTNv16i8 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5461
- def : Pat<(v16i8 (concat_vectors
5462
- (v8i8 V64:$Vd),
5463
- (v8i8 (trunc (smax (smin (v8i16 V128:$Vn), (v8i16 VImm7F)),
5464
- (v8i16 VImm80)))))),
5465
- (SQXTNv16i8 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5466
-
5467
- // concat_vectors(Vd, trunc(smin(smax Vm, -32768), 32767) ~> SQXTN2(Vd, Vn)
5468
- // with reversed min/max
5469
5468
def : Pat<(v8i16 (concat_vectors
5470
5469
(v4i16 V64:$Vd),
5471
- (v4i16 (trunc (smin (smax (v4i32 V128:$Vn), (v4i32 VImm8000)),
5472
- (v4i32 VImm7FFF)))))),
5470
+ (v4i16 (truncssat_s (v4i32 V128:$Vn))))),
5473
5471
(SQXTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5472
+ def : Pat<(v4i32 (concat_vectors
5473
+ (v2i32 V64:$Vd),
5474
+ (v2i32 (truncssat_s (v2i64 V128:$Vn))))),
5475
+ (SQXTNv4i32 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5476
+
5477
+ // concat_vectors(Vd, truncssat_u(Vn)) ~> SQXTUN2(Vd, Vn)
5478
+ def : Pat<(v16i8 (concat_vectors
5479
+ (v8i8 V64:$Vd),
5480
+ (v8i8 (truncssat_u (v8i16 V128:$Vn))))),
5481
+ (SQXTUNv16i8 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5474
5482
def : Pat<(v8i16 (concat_vectors
5475
5483
(v4i16 V64:$Vd),
5476
- (v4i16 (trunc (smax (smin (v4i32 V128:$Vn), (v4i32 VImm7FFF)),
5477
- (v4i32 VImm8000)))))),
5478
- (SQXTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5484
+ (v4i16 (truncssat_u (v4i32 V128:$Vn))))),
5485
+ (SQXTUNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5486
+ def : Pat<(v4i32 (concat_vectors
5487
+ (v2i32 V64:$Vd),
5488
+ (v2i32 (truncssat_u (v2i64 V128:$Vn))))),
5489
+ (SQXTUNv4i32 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Vd, dsub), V128:$Vn)>;
5479
5490
5480
5491
// Select BSWAP vector instructions into REV instructions
5481
5492
def : Pat<(v4i16 (bswap (v4i16 V64:$Rn))),
0 commit comments