1 /* { dg-do assemble { target { aarch64*-*-* } } } */
2 /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
3 /* { dg-additional-options "-march=armv8.2-a -O3 --save-temps -std=gnu90" } */
4 /* { dg-final { check-function-bodies "**" "" } } */
5
6 #include <arm_bf16.h>
7
8 #pragma GCC push_options
9 #pragma GCC target ("+bf16")
10
11 /*
12 **stacktest1:
13 ** sub sp, sp, #16
14 ** str h0, \[sp, 14\]
15 ** ldr h0, \[sp, 14\]
16 ** add sp, sp, 16
17 ** ret
18 */
19 bfloat16_t stacktest1 (bfloat16_t __a)
20 {
21 volatile bfloat16_t b = __a;
22 return b;
23 }
24
25 /*
26 **bfloat_mov_ww:
27 ** mov v1.h\[0\], v2.h\[0\]
28 ** ret
29 */
30 void bfloat_mov_ww (void)
31 {
32 register bfloat16_t x asm ("h2");
33 register bfloat16_t y asm ("h1");
34 asm volatile ("" : "=w" (x));
35 y = x;
36 asm volatile ("" :: "w" (y));
37 }
38
39 /*
40 **bfloat_mov_rw:
41 ** dup v1.4h, w1
42 ** ret
43 */
44 void bfloat_mov_rw (void)
45 {
46 register bfloat16_t x asm ("w1");
47 register bfloat16_t y asm ("h1");
48 asm volatile ("" : "=r" (x));
49 y = x;
50 asm volatile ("" :: "w" (y));
51 }
52
53 /*
54 **bfloat_mov_wr:
55 ** umov w1, v1.h\[0\]
56 ** ret
57 */
58 void bfloat_mov_wr (void)
59 {
60 register bfloat16_t x asm ("h1");
61 register bfloat16_t y asm ("w1");
62 asm volatile ("" : "=w" (x));
63 y = x;
64 asm volatile ("" :: "r" (y));
65 }
66
67 /*
68 **bfloat_mov_rr:
69 ** mov w1, w2
70 ** ret
71 */
72 void bfloat_mov_rr (void)
73 {
74 register bfloat16_t x asm ("w2");
75 register bfloat16_t y asm ("w1");
76 asm volatile ("" : "=r" (x));
77 y = x;
78 asm volatile ("" :: "r" (y));
79 }
80
81 /*
82 **bfloat_mov_rm:
83 ** strh w2, \[x0\]
84 ** ret
85 */
86 void bfloat_mov_rm (bfloat16_t *ptr)
87 {
88 register bfloat16_t x asm ("w2");
89 asm volatile ("" : "=r" (x));
90 *ptr = x;
91 }
92
93 /*
94 **bfloat_mov_mr:
95 ** ldrh w2, \[x0\]
96 ** ret
97 */
98 void bfloat_mov_mr (bfloat16_t *ptr)
99 {
100 register bfloat16_t y asm ("w2");
101 y = *ptr;
102 asm volatile ("" :: "r" (y));
103 }
104
105 #pragma GCC pop_options
106