Skip to content

Commit de674fb

Browse files
committed
[AArch64] Add vector tests for add(trunc(shift))
1 parent 93f2deb commit de674fb

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64-none-elf < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64-none-elf -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
define <2 x i32> @test_v2i64(<2 x i64> %n) {
6+
; CHECK-LABEL: test_v2i64:
7+
; CHECK: // %bb.0: // %entry
8+
; CHECK-NEXT: ushr v1.2d, v0.2d, #63
9+
; CHECK-NEXT: sshr v0.2d, v0.2d, #35
10+
; CHECK-NEXT: xtn v1.2s, v1.2d
11+
; CHECK-NEXT: xtn v0.2s, v0.2d
12+
; CHECK-NEXT: add v0.2s, v1.2s, v0.2s
13+
; CHECK-NEXT: ret
14+
entry:
15+
%shr = lshr <2 x i64> %n, splat (i64 63)
16+
%vmovn.i4 = trunc nuw nsw <2 x i64> %shr to <2 x i32>
17+
%shr1 = ashr <2 x i64> %n, splat (i64 35)
18+
%vmovn.i = trunc nsw <2 x i64> %shr1 to <2 x i32>
19+
%add = add nsw <2 x i32> %vmovn.i4, %vmovn.i
20+
ret <2 x i32> %add
21+
}
22+
23+
define <4 x i16> @test_v4i32(<4 x i32> %n) {
24+
; CHECK-LABEL: test_v4i32:
25+
; CHECK: // %bb.0: // %entry
26+
; CHECK-NEXT: ushr v1.4s, v0.4s, #31
27+
; CHECK-NEXT: sshr v0.4s, v0.4s, #17
28+
; CHECK-NEXT: xtn v1.4h, v1.4s
29+
; CHECK-NEXT: xtn v0.4h, v0.4s
30+
; CHECK-NEXT: add v0.4h, v1.4h, v0.4h
31+
; CHECK-NEXT: ret
32+
entry:
33+
%shr = lshr <4 x i32> %n, splat (i32 31)
34+
%vmovn.i4 = trunc nuw nsw <4 x i32> %shr to <4 x i16>
35+
%shr1 = ashr <4 x i32> %n, splat (i32 17)
36+
%vmovn.i = trunc nsw <4 x i32> %shr1 to <4 x i16>
37+
%add = add nsw <4 x i16> %vmovn.i4, %vmovn.i
38+
ret <4 x i16> %add
39+
}
40+
41+
define <8 x i8> @test_v8i16(<8 x i16> %n) {
42+
; CHECK-LABEL: test_v8i16:
43+
; CHECK: // %bb.0: // %entry
44+
; CHECK-NEXT: ushr v1.8h, v0.8h, #15
45+
; CHECK-NEXT: sshr v0.8h, v0.8h, #9
46+
; CHECK-NEXT: xtn v1.8b, v1.8h
47+
; CHECK-NEXT: xtn v0.8b, v0.8h
48+
; CHECK-NEXT: add v0.8b, v1.8b, v0.8b
49+
; CHECK-NEXT: ret
50+
entry:
51+
%shr = lshr <8 x i16> %n, splat (i16 15)
52+
%vmovn.i4 = trunc nuw nsw <8 x i16> %shr to <8 x i8>
53+
%shr1 = ashr <8 x i16> %n, splat (i16 9)
54+
%vmovn.i = trunc nsw <8 x i16> %shr1 to <8 x i8>
55+
%add = add nsw <8 x i8> %vmovn.i4, %vmovn.i
56+
ret <8 x i8> %add
57+
}
58+
59+
define <2 x i32> @test_v2i64_smallsrl(<2 x i64> %n) {
60+
; CHECK-LABEL: test_v2i64_smallsrl:
61+
; CHECK: // %bb.0: // %entry
62+
; CHECK-NEXT: ushr v1.2d, v0.2d, #62
63+
; CHECK-NEXT: sshr v0.2d, v0.2d, #35
64+
; CHECK-NEXT: xtn v1.2s, v1.2d
65+
; CHECK-NEXT: xtn v0.2s, v0.2d
66+
; CHECK-NEXT: add v0.2s, v1.2s, v0.2s
67+
; CHECK-NEXT: ret
68+
entry:
69+
%shr = lshr <2 x i64> %n, splat (i64 62)
70+
%vmovn.i4 = trunc nuw nsw <2 x i64> %shr to <2 x i32>
71+
%shr1 = ashr <2 x i64> %n, splat (i64 35)
72+
%vmovn.i = trunc nsw <2 x i64> %shr1 to <2 x i32>
73+
%add = add nsw <2 x i32> %vmovn.i4, %vmovn.i
74+
ret <2 x i32> %add
75+
}
76+
77+
define <2 x i32> @test_v2i64_smallsra(<2 x i64> %n) {
78+
; CHECK-LABEL: test_v2i64_smallsra:
79+
; CHECK: // %bb.0: // %entry
80+
; CHECK-NEXT: ushr v1.2d, v0.2d, #63
81+
; CHECK-NEXT: shrn v0.2s, v0.2d, #27
82+
; CHECK-NEXT: xtn v1.2s, v1.2d
83+
; CHECK-NEXT: add v0.2s, v1.2s, v0.2s
84+
; CHECK-NEXT: ret
85+
entry:
86+
%shr = lshr <2 x i64> %n, splat (i64 63)
87+
%vmovn.i4 = trunc nuw nsw <2 x i64> %shr to <2 x i32>
88+
%shr1 = ashr <2 x i64> %n, splat (i64 27)
89+
%vmovn.i = trunc nsw <2 x i64> %shr1 to <2 x i32>
90+
%add = add nsw <2 x i32> %vmovn.i4, %vmovn.i
91+
ret <2 x i32> %add
92+
}
93+
94+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
95+
; CHECK-GI: {{.*}}
96+
; CHECK-SD: {{.*}}

0 commit comments

Comments
 (0)