• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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