tree-optimization/114855 - more update_ssa speedup
[official-gcc.git] / gcc / testsuite / gcc.target / arm / armv8_1m-fp16-move-1.c
blobe6ed76870b49bb0129631df4bae0781ef516e9e5
1 /* { dg-do compile } */
2 /* { dg-options "-O -mfp16-format=ieee" } */
3 /* { dg-require-effective-target arm_v8_1m_mve_ok } */
4 /* { dg-add-options arm_v8_1m_mve } */
5 /* { dg-additional-options "-mfloat-abi=hard" } */
6 /* { dg-final { check-function-bodies "**" "" } } */
8 /*
9 ** r_w:
10 ** vmov.f16 r0, s0 @ __fp16
11 ** bx lr
13 void
14 r_w (_Float16 s0)
16 register _Float16 r0 asm ("r0");
17 r0 = s0;
18 asm volatile ("" :: "r" (r0));
22 ** w_r:
23 ** vmov.f16 s0, r0 @ __fp16
24 ** bx lr
26 _Float16
27 w_r ()
29 register _Float16 r0 asm ("r0");
30 asm volatile ("" : "=r" (r0));
31 return r0;
35 ** w_w:
36 ** vmov s1, s0 @ __fp16
37 ** bx lr
39 void
40 w_w (_Float16 s0)
42 register _Float16 s1 asm ("s1");
43 s1 = s0;
44 asm volatile ("" :: "w" (s1));
48 ** r_m_m128:
49 ** sub (r[0-9]+), r0, #256
50 ** ldrh r1, \[\1\] @ __fp16
51 ** bx lr
53 void
54 r_m_m128 (_Float16 *r0)
56 register _Float16 r1 asm ("r1");
57 r1 = r0[-128];
58 asm volatile ("" :: "r" (r1));
62 ** r_m_m127:
63 ** ldrh r1, \[r0, #-254\] @ __fp16
64 ** bx lr
66 void
67 r_m_m127 (_Float16 *r0)
69 register _Float16 r1 asm ("r1");
70 r1 = r0[-127];
71 asm volatile ("" :: "r" (r1));
75 ** r_m_m1:
76 ** ldrh r1, \[r0, #-2\] @ __fp16
77 ** bx lr
79 void
80 r_m_m1 (_Float16 *r0)
82 register _Float16 r1 asm ("r1");
83 r1 = r0[-1];
84 asm volatile ("" :: "r" (r1));
88 ** r_m_0:
89 ** ldrh r1, \[r0\] @ __fp16
90 ** bx lr
92 void
93 r_m_0 (_Float16 *r0)
95 register _Float16 r1 asm ("r1");
96 r1 = r0[0];
97 asm volatile ("" :: "r" (r1));
101 ** r_m_1:
102 ** ldrh r1, \[r0, #2\] @ __fp16
103 ** bx lr
105 void
106 r_m_1 (_Float16 *r0)
108 register _Float16 r1 asm ("r1");
109 r1 = r0[1];
110 asm volatile ("" :: "r" (r1));
114 ** r_m_255:
115 ** ldrh r1, \[r0, #510\] @ __fp16
116 ** bx lr
118 void
119 r_m_255 (_Float16 *r0)
121 register _Float16 r1 asm ("r1");
122 r1 = r0[255];
123 asm volatile ("" :: "r" (r1));
127 ** r_m_256:
128 ** ldrh r1, \[r0, #512\] @ __fp16
129 ** bx lr
131 void
132 r_m_256 (_Float16 *r0)
134 register _Float16 r1 asm ("r1");
135 r1 = r0[256];
136 asm volatile ("" :: "r" (r1));
139 /* ??? This could be done in one instruction, but without mve.fp,
140 it makes more sense for memory_operand to enforce the GPR range. */
142 ** w_m_m128:
143 ** sub (r[0-9]+), r0, #256
144 ** vldr.16 s0, \[\1\]
145 ** bx lr
147 void
148 w_m_m128 (_Float16 *r0)
150 register _Float16 s0 asm ("s0");
151 s0 = r0[-128];
152 asm volatile ("" :: "w" (s0));
156 ** w_m_m127:
157 ** vldr.16 s0, \[r0, #-254\]
158 ** bx lr
160 void
161 w_m_m127 (_Float16 *r0)
163 register _Float16 s0 asm ("s0");
164 s0 = r0[-127];
165 asm volatile ("" :: "w" (s0));
169 ** w_m_m1:
170 ** vldr.16 s0, \[r0, #-2\]
171 ** bx lr
173 void
174 w_m_m1 (_Float16 *r0)
176 register _Float16 s0 asm ("s0");
177 s0 = r0[-1];
178 asm volatile ("" :: "w" (s0));
182 ** w_m_0:
183 ** vldr.16 s0, \[r0\]
184 ** bx lr
186 void
187 w_m_0 (_Float16 *r0)
189 register _Float16 s0 asm ("s0");
190 s0 = r0[0];
191 asm volatile ("" :: "w" (s0));
195 ** w_m_1:
196 ** vldr.16 s0, \[r0, #2\]
197 ** bx lr
199 void
200 w_m_1 (_Float16 *r0)
202 register _Float16 s0 asm ("s0");
203 s0 = r0[1];
204 asm volatile ("" :: "w" (s0));
208 ** w_m_255:
209 ** vldr.16 s0, \[r0, #510\]
210 ** bx lr
212 void
213 w_m_255 (_Float16 *r0)
215 register _Float16 s0 asm ("s0");
216 s0 = r0[255];
217 asm volatile ("" :: "w" (s0));
221 ** w_m_256:
222 ** add (r[0-9]+), r0, #512
223 ** vldr.16 s0, \[\1\]
224 ** bx lr
226 void
227 w_m_256 (_Float16 *r0)
229 register _Float16 s0 asm ("s0");
230 s0 = r0[256];
231 asm volatile ("" :: "w" (s0));
235 ** m_m128_r:
236 ** sub (r[0-9]+), r0, #256
237 ** strh r1, \[\1\] @ __fp16
238 ** bx lr
240 void
241 m_m128_r (_Float16 *r0)
243 register _Float16 r1 asm ("r1");
244 asm volatile ("" : "=r" (r1));
245 r0[-128] = r1;
249 ** m_m127_r:
250 ** strh r1, \[r0, #-254\] @ __fp16
251 ** bx lr
253 void
254 m_m127_r (_Float16 *r0)
256 register _Float16 r1 asm ("r1");
257 asm volatile ("" : "=r" (r1));
258 r0[-127] = r1;
262 ** m_m1_r:
263 ** strh r1, \[r0, #-2\] @ __fp16
264 ** bx lr
266 void
267 m_m1_r (_Float16 *r0)
269 register _Float16 r1 asm ("r1");
270 asm volatile ("" : "=r" (r1));
271 r0[-1] = r1;
275 ** m_0_r:
276 ** strh r1, \[r0\] @ __fp16
277 ** bx lr
279 void
280 m_0_r (_Float16 *r0)
282 register _Float16 r1 asm ("r1");
283 asm volatile ("" : "=r" (r1));
284 r0[0] = r1;
288 ** m_1_r:
289 ** strh r1, \[r0, #2\] @ __fp16
290 ** bx lr
292 void
293 m_1_r (_Float16 *r0)
295 register _Float16 r1 asm ("r1");
296 asm volatile ("" : "=r" (r1));
297 r0[1] = r1;
301 ** m_255_r:
302 ** strh r1, \[r0, #510\] @ __fp16
303 ** bx lr
305 void
306 m_255_r (_Float16 *r0)
308 register _Float16 r1 asm ("r1");
309 asm volatile ("" : "=r" (r1));
310 r0[255] = r1;
314 ** m_256_r:
315 ** strh r1, \[r0, #512\] @ __fp16
316 ** bx lr
318 void
319 m_256_r (_Float16 *r0)
321 register _Float16 r1 asm ("r1");
322 asm volatile ("" : "=r" (r1));
323 r0[256] = r1;
326 /* ??? This could be done in one instruction, but without mve.fp,
327 it makes more sense for memory_operand to enforce the GPR range. */
329 ** m_m128_w:
330 ** sub (r[0-9]+), r0, #256
331 ** vstr.16 s0, \[\1\]
332 ** bx lr
334 void
335 m_m128_w (_Float16 *r0)
337 register _Float16 s0 asm ("s0");
338 asm volatile ("" : "=w" (s0));
339 r0[-128] = s0;
343 ** m_m127_w:
344 ** vstr.16 s0, \[r0, #-254\]
345 ** bx lr
347 void
348 m_m127_w (_Float16 *r0)
350 register _Float16 s0 asm ("s0");
351 asm volatile ("" : "=w" (s0));
352 r0[-127] = s0;
356 ** m_m1_w:
357 ** vstr.16 s0, \[r0, #-2\]
358 ** bx lr
360 void
361 m_m1_w (_Float16 *r0)
363 register _Float16 s0 asm ("s0");
364 asm volatile ("" : "=w" (s0));
365 r0[-1] = s0;
369 ** m_0_w:
370 ** vstr.16 s0, \[r0\]
371 ** bx lr
373 void
374 m_0_w (_Float16 *r0)
376 register _Float16 s0 asm ("s0");
377 asm volatile ("" : "=w" (s0));
378 r0[0] = s0;
382 ** m_1_w:
383 ** vstr.16 s0, \[r0, #2\]
384 ** bx lr
386 void
387 m_1_w (_Float16 *r0)
389 register _Float16 s0 asm ("s0");
390 asm volatile ("" : "=w" (s0));
391 r0[1] = s0;
395 ** m_255_w:
396 ** vstr.16 s0, \[r0, #510\]
397 ** bx lr
399 void
400 m_255_w (_Float16 *r0)
402 register _Float16 s0 asm ("s0");
403 asm volatile ("" : "=w" (s0));
404 r0[255] = s0;
408 ** m_256_w:
409 ** add (r[0-9]+), r0, #512
410 ** vstr.16 s0, \[\1\]
411 ** bx lr
413 void
414 m_256_w (_Float16 *r0)
416 register _Float16 s0 asm ("s0");
417 asm volatile ("" : "=w" (s0));
418 r0[256] = s0;