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 "**" "" } } */
10 ** vmov.f16 r0, s0 @ __fp16
16 register _Float16 r0
asm ("r0");
18 asm volatile ("" :: "r" (r0
));
23 ** vmov.f16 s0, r0 @ __fp16
29 register _Float16 r0
asm ("r0");
30 asm volatile ("" : "=r" (r0
));
36 ** vmov s1, s0 @ __fp16
42 register _Float16 s1
asm ("s1");
44 asm volatile ("" :: "w" (s1
));
49 ** sub (r[0-9]+), r0, #256
50 ** ldrh r1, \[\1\] @ __fp16
54 r_m_m128 (_Float16
*r0
)
56 register _Float16 r1
asm ("r1");
58 asm volatile ("" :: "r" (r1
));
63 ** ldrh r1, \[r0, #-254\] @ __fp16
67 r_m_m127 (_Float16
*r0
)
69 register _Float16 r1
asm ("r1");
71 asm volatile ("" :: "r" (r1
));
76 ** ldrh r1, \[r0, #-2\] @ __fp16
82 register _Float16 r1
asm ("r1");
84 asm volatile ("" :: "r" (r1
));
89 ** ldrh r1, \[r0\] @ __fp16
95 register _Float16 r1
asm ("r1");
97 asm volatile ("" :: "r" (r1
));
102 ** ldrh r1, \[r0, #2\] @ __fp16
108 register _Float16 r1
asm ("r1");
110 asm volatile ("" :: "r" (r1
));
115 ** ldrh r1, \[r0, #510\] @ __fp16
119 r_m_255 (_Float16
*r0
)
121 register _Float16 r1
asm ("r1");
123 asm volatile ("" :: "r" (r1
));
128 ** ldrh r1, \[r0, #512\] @ __fp16
132 r_m_256 (_Float16
*r0
)
134 register _Float16 r1
asm ("r1");
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. */
143 ** sub (r[0-9]+), r0, #256
144 ** vldr.16 s0, \[\1\]
148 w_m_m128 (_Float16
*r0
)
150 register _Float16 s0
asm ("s0");
152 asm volatile ("" :: "w" (s0
));
157 ** vldr.16 s0, \[r0, #-254\]
161 w_m_m127 (_Float16
*r0
)
163 register _Float16 s0
asm ("s0");
165 asm volatile ("" :: "w" (s0
));
170 ** vldr.16 s0, \[r0, #-2\]
174 w_m_m1 (_Float16
*r0
)
176 register _Float16 s0
asm ("s0");
178 asm volatile ("" :: "w" (s0
));
183 ** vldr.16 s0, \[r0\]
189 register _Float16 s0
asm ("s0");
191 asm volatile ("" :: "w" (s0
));
196 ** vldr.16 s0, \[r0, #2\]
202 register _Float16 s0
asm ("s0");
204 asm volatile ("" :: "w" (s0
));
209 ** vldr.16 s0, \[r0, #510\]
213 w_m_255 (_Float16
*r0
)
215 register _Float16 s0
asm ("s0");
217 asm volatile ("" :: "w" (s0
));
222 ** add (r[0-9]+), r0, #512
223 ** vldr.16 s0, \[\1\]
227 w_m_256 (_Float16
*r0
)
229 register _Float16 s0
asm ("s0");
231 asm volatile ("" :: "w" (s0
));
236 ** sub (r[0-9]+), r0, #256
237 ** strh r1, \[\1\] @ __fp16
241 m_m128_r (_Float16
*r0
)
243 register _Float16 r1
asm ("r1");
244 asm volatile ("" : "=r" (r1
));
250 ** strh r1, \[r0, #-254\] @ __fp16
254 m_m127_r (_Float16
*r0
)
256 register _Float16 r1
asm ("r1");
257 asm volatile ("" : "=r" (r1
));
263 ** strh r1, \[r0, #-2\] @ __fp16
267 m_m1_r (_Float16
*r0
)
269 register _Float16 r1
asm ("r1");
270 asm volatile ("" : "=r" (r1
));
276 ** strh r1, \[r0\] @ __fp16
282 register _Float16 r1
asm ("r1");
283 asm volatile ("" : "=r" (r1
));
289 ** strh r1, \[r0, #2\] @ __fp16
295 register _Float16 r1
asm ("r1");
296 asm volatile ("" : "=r" (r1
));
302 ** strh r1, \[r0, #510\] @ __fp16
306 m_255_r (_Float16
*r0
)
308 register _Float16 r1
asm ("r1");
309 asm volatile ("" : "=r" (r1
));
315 ** strh r1, \[r0, #512\] @ __fp16
319 m_256_r (_Float16
*r0
)
321 register _Float16 r1
asm ("r1");
322 asm volatile ("" : "=r" (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. */
330 ** sub (r[0-9]+), r0, #256
331 ** vstr.16 s0, \[\1\]
335 m_m128_w (_Float16
*r0
)
337 register _Float16 s0
asm ("s0");
338 asm volatile ("" : "=w" (s0
));
344 ** vstr.16 s0, \[r0, #-254\]
348 m_m127_w (_Float16
*r0
)
350 register _Float16 s0
asm ("s0");
351 asm volatile ("" : "=w" (s0
));
357 ** vstr.16 s0, \[r0, #-2\]
361 m_m1_w (_Float16
*r0
)
363 register _Float16 s0
asm ("s0");
364 asm volatile ("" : "=w" (s0
));
370 ** vstr.16 s0, \[r0\]
376 register _Float16 s0
asm ("s0");
377 asm volatile ("" : "=w" (s0
));
383 ** vstr.16 s0, \[r0, #2\]
389 register _Float16 s0
asm ("s0");
390 asm volatile ("" : "=w" (s0
));
396 ** vstr.16 s0, \[r0, #510\]
400 m_255_w (_Float16
*r0
)
402 register _Float16 s0
asm ("s0");
403 asm volatile ("" : "=w" (s0
));
409 ** add (r[0-9]+), r0, #512
410 ** vstr.16 s0, \[\1\]
414 m_256_w (_Float16
*r0
)
416 register _Float16 s0
asm ("s0");
417 asm volatile ("" : "=w" (s0
));