1 // REQUIRES: aarch64-registered-target
2 // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
3 // RUN: -ffp-contract=fast -S -O3 -o - %s | FileCheck %s --check-prefix=CHECK \
4 // RUN: --check-prefix=CHECK-ARM64
5
6 // Test new aarch64 intrinsics with poly128
7 // FIXME: Currently, poly128_t equals to uint128, which will be spilt into
8 // two 64-bit GPR(eg X0, X1). Now moving data from X0, X1 to FPR128 will
9 // introduce 2 store and 1 load instructions(store X0, X1 to memory and
10 // then load back to Q0). If target has NEON, this is better replaced by
11 // FMOV or INS.
12
13 #include <arm_neon.h>
14
test_vstrq_p128(poly128_t * ptr,poly128_t val)15 void test_vstrq_p128(poly128_t * ptr, poly128_t val) {
16 // CHECK-LABEL: test_vstrq_p128
17 vstrq_p128(ptr, val);
18
19 // CHECK-ARM64: stp {{x[0-9]+}}, {{x[0-9]+}}, [x0]
20 }
21
test_vldrq_p128(poly128_t * ptr)22 poly128_t test_vldrq_p128(poly128_t * ptr) {
23 // CHECK-LABEL: test_vldrq_p128
24 return vldrq_p128(ptr);
25
26 // CHECK-ARM64: ldp {{x[0-9]+}}, {{x[0-9]+}}, [x0]
27 }
28
test_ld_st_p128(poly128_t * ptr)29 void test_ld_st_p128(poly128_t * ptr) {
30 // CHECK-LABEL: test_ld_st_p128
31 vstrq_p128(ptr+1, vldrq_p128(ptr));
32
33 // CHECK-ARM64: ldp [[PLO:x[0-9]+]], [[PHI:x[0-9]+]], [{{x[0-9]+}}]
34 // CHECK-ARM64-NEXT: stp [[PLO]], [[PHI]], [{{x[0-9]+}}, #16]
35 }
36
test_vmull_p64(poly64_t a,poly64_t b)37 poly128_t test_vmull_p64(poly64_t a, poly64_t b) {
38 // CHECK-LABEL: test_vmull_p64
39 return vmull_p64(a, b);
40 // CHECK: pmull {{v[0-9]+}}.1q, {{v[0-9]+}}.1d, {{v[0-9]+}}.1d
41 }
42
test_vmull_high_p64(poly64x2_t a,poly64x2_t b)43 poly128_t test_vmull_high_p64(poly64x2_t a, poly64x2_t b) {
44 // CHECK-LABEL: test_vmull_high_p64
45 return vmull_high_p64(a, b);
46 // CHECK: pmull2 {{v[0-9]+}}.1q, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
47 }
48
49 // CHECK-LABEL: test_vreinterpretq_p128_s8
50 // CHECK: ret
test_vreinterpretq_p128_s8(int8x16_t a)51 poly128_t test_vreinterpretq_p128_s8(int8x16_t a) {
52 return vreinterpretq_p128_s8(a);
53 }
54
55 // CHECK-LABEL: test_vreinterpretq_p128_s16
56 // CHECK: ret
test_vreinterpretq_p128_s16(int16x8_t a)57 poly128_t test_vreinterpretq_p128_s16(int16x8_t a) {
58 return vreinterpretq_p128_s16(a);
59 }
60
61 // CHECK-LABEL: test_vreinterpretq_p128_s32
62 // CHECK: ret
test_vreinterpretq_p128_s32(int32x4_t a)63 poly128_t test_vreinterpretq_p128_s32(int32x4_t a) {
64 return vreinterpretq_p128_s32(a);
65 }
66
67 // CHECK-LABEL: test_vreinterpretq_p128_s64
68 // CHECK: ret
test_vreinterpretq_p128_s64(int64x2_t a)69 poly128_t test_vreinterpretq_p128_s64(int64x2_t a) {
70 return vreinterpretq_p128_s64(a);
71 }
72
73 // CHECK-LABEL: test_vreinterpretq_p128_u8
74 // CHECK: ret
test_vreinterpretq_p128_u8(uint8x16_t a)75 poly128_t test_vreinterpretq_p128_u8(uint8x16_t a) {
76 return vreinterpretq_p128_u8(a);
77 }
78
79 // CHECK-LABEL: test_vreinterpretq_p128_u16
80 // CHECK: ret
test_vreinterpretq_p128_u16(uint16x8_t a)81 poly128_t test_vreinterpretq_p128_u16(uint16x8_t a) {
82 return vreinterpretq_p128_u16(a);
83 }
84
85 // CHECK-LABEL: test_vreinterpretq_p128_u32
86 // CHECK: ret
test_vreinterpretq_p128_u32(uint32x4_t a)87 poly128_t test_vreinterpretq_p128_u32(uint32x4_t a) {
88 return vreinterpretq_p128_u32(a);
89 }
90
91 // CHECK-LABEL: test_vreinterpretq_p128_u64
92 // CHECK: ret
test_vreinterpretq_p128_u64(uint64x2_t a)93 poly128_t test_vreinterpretq_p128_u64(uint64x2_t a) {
94 return vreinterpretq_p128_u64(a);
95 }
96
97 // CHECK-LABEL: test_vreinterpretq_p128_f32
98 // CHECK: ret
test_vreinterpretq_p128_f32(float32x4_t a)99 poly128_t test_vreinterpretq_p128_f32(float32x4_t a) {
100 return vreinterpretq_p128_f32(a);
101 }
102
103 // CHECK-LABEL: test_vreinterpretq_p128_f64
104 // CHECK: ret
test_vreinterpretq_p128_f64(float64x2_t a)105 poly128_t test_vreinterpretq_p128_f64(float64x2_t a) {
106 return vreinterpretq_p128_f64(a);
107 }
108
109 // CHECK-LABEL: test_vreinterpretq_p128_p8
110 // CHECK: ret
test_vreinterpretq_p128_p8(poly8x16_t a)111 poly128_t test_vreinterpretq_p128_p8(poly8x16_t a) {
112 return vreinterpretq_p128_p8(a);
113 }
114
115 // CHECK-LABEL: test_vreinterpretq_p128_p16
116 // CHECK: ret
test_vreinterpretq_p128_p16(poly16x8_t a)117 poly128_t test_vreinterpretq_p128_p16(poly16x8_t a) {
118 return vreinterpretq_p128_p16(a);
119 }
120
121 // CHECK-LABEL: test_vreinterpretq_p128_p64
122 // CHECK: ret
test_vreinterpretq_p128_p64(poly64x2_t a)123 poly128_t test_vreinterpretq_p128_p64(poly64x2_t a) {
124 return vreinterpretq_p128_p64(a);
125 }
126
127 // CHECK-LABEL: test_vreinterpretq_s8_p128
128 // CHECK: ret
test_vreinterpretq_s8_p128(poly128_t a)129 int8x16_t test_vreinterpretq_s8_p128(poly128_t a) {
130 return vreinterpretq_s8_p128(a);
131 }
132
133 // CHECK-LABEL: test_vreinterpretq_s16_p128
134 // CHECK: ret
test_vreinterpretq_s16_p128(poly128_t a)135 int16x8_t test_vreinterpretq_s16_p128(poly128_t a) {
136 return vreinterpretq_s16_p128(a);
137 }
138
139 // CHECK-LABEL: test_vreinterpretq_s32_p128
140 // CHECK: ret
test_vreinterpretq_s32_p128(poly128_t a)141 int32x4_t test_vreinterpretq_s32_p128(poly128_t a) {
142 return vreinterpretq_s32_p128(a);
143 }
144
145 // CHECK-LABEL: test_vreinterpretq_s64_p128
146 // CHECK: ret
test_vreinterpretq_s64_p128(poly128_t a)147 int64x2_t test_vreinterpretq_s64_p128(poly128_t a) {
148 return vreinterpretq_s64_p128(a);
149 }
150
151 // CHECK-LABEL: test_vreinterpretq_u8_p128
152 // CHECK: ret
test_vreinterpretq_u8_p128(poly128_t a)153 uint8x16_t test_vreinterpretq_u8_p128(poly128_t a) {
154 return vreinterpretq_u8_p128(a);
155 }
156
157 // CHECK-LABEL: test_vreinterpretq_u16_p128
158 // CHECK: ret
test_vreinterpretq_u16_p128(poly128_t a)159 uint16x8_t test_vreinterpretq_u16_p128(poly128_t a) {
160 return vreinterpretq_u16_p128(a);
161 }
162
163 // CHECK-LABEL: test_vreinterpretq_u32_p128
164 // CHECK: ret
test_vreinterpretq_u32_p128(poly128_t a)165 uint32x4_t test_vreinterpretq_u32_p128(poly128_t a) {
166 return vreinterpretq_u32_p128(a);
167 }
168
169 // CHECK-LABEL: test_vreinterpretq_u64_p128
170 // CHECK: ret
test_vreinterpretq_u64_p128(poly128_t a)171 uint64x2_t test_vreinterpretq_u64_p128(poly128_t a) {
172 return vreinterpretq_u64_p128(a);
173 }
174
175 // CHECK-LABEL: test_vreinterpretq_f32_p128
176 // CHECK: ret
test_vreinterpretq_f32_p128(poly128_t a)177 float32x4_t test_vreinterpretq_f32_p128(poly128_t a) {
178 return vreinterpretq_f32_p128(a);
179 }
180
181 // CHECK-LABEL: test_vreinterpretq_f64_p128
182 // CHECK: ret
test_vreinterpretq_f64_p128(poly128_t a)183 float64x2_t test_vreinterpretq_f64_p128(poly128_t a) {
184 return vreinterpretq_f64_p128(a);
185 }
186
187 // CHECK-LABEL: test_vreinterpretq_p8_p128
188 // CHECK: ret
test_vreinterpretq_p8_p128(poly128_t a)189 poly8x16_t test_vreinterpretq_p8_p128(poly128_t a) {
190 return vreinterpretq_p8_p128(a);
191 }
192
193 // CHECK-LABEL: test_vreinterpretq_p16_p128
194 // CHECK: ret
test_vreinterpretq_p16_p128(poly128_t a)195 poly16x8_t test_vreinterpretq_p16_p128(poly128_t a) {
196 return vreinterpretq_p16_p128(a);
197 }
198
199 // CHECK-LABEL: test_vreinterpretq_p64_p128
200 // CHECK: ret
test_vreinterpretq_p64_p128(poly128_t a)201 poly64x2_t test_vreinterpretq_p64_p128(poly128_t a) {
202 return vreinterpretq_p64_p128(a);
203 }
204
205
206