@@ -1517,3 +1517,66 @@ define <4 x i32> @subhn2_4s_natural(<2 x i32> %low, ptr %A, ptr %B) nounwind {
15171517 %res = shufflevector <2 x i32 > %low , <2 x i32 > %narrowed , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
15181518 ret <4 x i32 > %res
15191519}
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