@@ -1517,3 +1517,66 @@ define <4 x i32> @subhn2_4s_natural(<2 x i32> %low, ptr %A, ptr %B) nounwind {
1517
1517
%res = shufflevector <2 x i32 > %low , <2 x i32 > %narrowed , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
1518
1518
ret <4 x i32 > %res
1519
1519
}
1520
+
1521
+ define <16 x i8 > @neg_narrow_i8 (<16 x i16 > %a ) {
1522
+ ; CHECK-SD-LABEL: neg_narrow_i8:
1523
+ ; CHECK-SD: // %bb.0:
1524
+ ; CHECK-SD-NEXT: mvn v1.16b, v1.16b
1525
+ ; CHECK-SD-NEXT: mvn v0.16b, v0.16b
1526
+ ; CHECK-SD-NEXT: uzp2 v0.16b, v0.16b, v1.16b
1527
+ ; CHECK-SD-NEXT: ret
1528
+ ;
1529
+ ; CHECK-GI-LABEL: neg_narrow_i8:
1530
+ ; CHECK-GI: // %bb.0:
1531
+ ; CHECK-GI-NEXT: mvn v0.16b, v0.16b
1532
+ ; CHECK-GI-NEXT: mvn v1.16b, v1.16b
1533
+ ; CHECK-GI-NEXT: shrn v0.8b, v0.8h, #8
1534
+ ; CHECK-GI-NEXT: shrn2 v0.16b, v1.8h, #8
1535
+ ; CHECK-GI-NEXT: ret
1536
+ %not.i = xor <16 x i16 > %a , splat (i16 -1 )
1537
+ %s = lshr <16 x i16 > %not.i , splat (i16 8 )
1538
+ %vshrn_n = trunc nuw <16 x i16 > %s to <16 x i8 >
1539
+ ret <16 x i8 > %vshrn_n
1540
+ }
1541
+
1542
+ define <8 x i16 > @neg_narrow_i16 (<8 x i32 > %a ) {
1543
+ ; CHECK-SD-LABEL: neg_narrow_i16:
1544
+ ; CHECK-SD: // %bb.0:
1545
+ ; CHECK-SD-NEXT: mvn v1.16b, v1.16b
1546
+ ; CHECK-SD-NEXT: mvn v0.16b, v0.16b
1547
+ ; CHECK-SD-NEXT: uzp2 v0.8h, v0.8h, v1.8h
1548
+ ; CHECK-SD-NEXT: ret
1549
+ ;
1550
+ ; CHECK-GI-LABEL: neg_narrow_i16:
1551
+ ; CHECK-GI: // %bb.0:
1552
+ ; CHECK-GI-NEXT: mvn v0.16b, v0.16b
1553
+ ; CHECK-GI-NEXT: mvn v1.16b, v1.16b
1554
+ ; CHECK-GI-NEXT: shrn v0.4h, v0.4s, #16
1555
+ ; CHECK-GI-NEXT: shrn2 v0.8h, v1.4s, #16
1556
+ ; CHECK-GI-NEXT: ret
1557
+ %not.i = xor <8 x i32 > %a , splat (i32 -1 )
1558
+ %s = lshr <8 x i32 > %not.i , splat (i32 16 )
1559
+ %vshrn_n = trunc nuw <8 x i32 > %s to <8 x i16 >
1560
+ ret <8 x i16 > %vshrn_n
1561
+ }
1562
+
1563
+ define <4 x i32 > @neg_narrow_i32 (<4 x i64 > %a ) {
1564
+ ; CHECK-SD-LABEL: neg_narrow_i32:
1565
+ ; CHECK-SD: // %bb.0:
1566
+ ; CHECK-SD-NEXT: mvn v1.16b, v1.16b
1567
+ ; CHECK-SD-NEXT: mvn v0.16b, v0.16b
1568
+ ; CHECK-SD-NEXT: uzp2 v0.4s, v0.4s, v1.4s
1569
+ ; CHECK-SD-NEXT: ret
1570
+ ;
1571
+ ; CHECK-GI-LABEL: neg_narrow_i32:
1572
+ ; CHECK-GI: // %bb.0:
1573
+ ; CHECK-GI-NEXT: mvn v0.16b, v0.16b
1574
+ ; CHECK-GI-NEXT: mvn v1.16b, v1.16b
1575
+ ; CHECK-GI-NEXT: shrn v0.2s, v0.2d, #32
1576
+ ; CHECK-GI-NEXT: shrn2 v0.4s, v1.2d, #32
1577
+ ; CHECK-GI-NEXT: ret
1578
+ %not.i = xor <4 x i64 > %a , splat (i64 -1 )
1579
+ %s = lshr <4 x i64 > %not.i , splat (i64 32 )
1580
+ %vshrn_n = trunc nuw <4 x i64 > %s to <4 x i32 >
1581
+ ret <4 x i32 > %vshrn_n
1582
+ }
0 commit comments