1 /* { dg-do assemble { target { arm*-*-* } } } */
2 /* { dg-require-effective-target arm_v8_neon_ok } */
3 /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */
4 /* { dg-additional-options "-march=armv8.2-a -mfloat-abi=softfp -mfpu=neon-fp-armv8" } */
5 /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */
6 /* { dg-final { check-function-bodies "**" "" } } */
7
8 #include <arm_bf16.h>
9
10 #pragma GCC push_options
11 #pragma GCC target ("+bf16")
12
13 /*
14 **stacktest1:
15 ** ...
16 ** strh r[0-9]+, \[r[0-9]+\] @ __bf16
17 ** ldrh r[0-9]+, \[sp, #[0-9]+\] @ __bf16
18 ** ...
19 ** bx lr
20 */
21 bfloat16_t stacktest1 (bfloat16_t __a)
22 {
23 volatile bfloat16_t b = __a;
24 return b;
25 }
26
27 /*
28 **bfloat_mov_ww:
29 ** ...
30 ** vmov.f32 s1, s15
31 ** ...
32 ** bx lr
33 */
34 void bfloat_mov_ww (void)
35 {
36 register bfloat16_t x asm ("s15");
37 register bfloat16_t y asm ("s1");
38 asm volatile ("#foo" : "=t" (x));
39 y = x;
40 asm volatile ("#foo" :: "t" (y));
41 }
42
43 /*
44 **bfloat_mov_rw:
45 ** ...
46 ** vmov s1, r4
47 ** ...
48 ** bx lr
49 */
50 void bfloat_mov_rw (void)
51 {
52 register bfloat16_t x asm ("r4");
53 register bfloat16_t y asm ("s1");
54 asm volatile ("#foo" : "=r" (x));
55 y = x;
56 asm volatile ("#foo" :: "t" (y));
57 }
58
59 /*
60 **bfloat_mov_wr:
61 ** ...
62 ** vmov r4, s1
63 ** ...
64 ** bx lr
65 */
66 void bfloat_mov_wr (void)
67 {
68 register bfloat16_t x asm ("s1");
69 register bfloat16_t y asm ("r4");
70 asm volatile ("#foo" : "=t" (x));
71 y = x;
72 asm volatile ("#foo" :: "r" (y));
73 }
74
75 /*
76 **bfloat_mov_rr:
77 ** ...
78 ** mov r4, r5 @ __bf16
79 ** ...
80 ** bx lr
81 */
82 void bfloat_mov_rr (void)
83 {
84 register bfloat16_t x asm ("r5");
85 register bfloat16_t y asm ("r4");
86 asm volatile ("#foo" : "=r" (x));
87 y = x;
88 asm volatile ("#foo" :: "r" (y));
89 }
90
91 /*
92 **bfloat_mov_rm:
93 ** ...
94 ** strh r4, \[.*\] @ __bf16
95 ** ...
96 ** bx lr
97 */
98 void bfloat_mov_rm (void)
99 {
100 register bfloat16_t x asm ("r4");
101 volatile bfloat16_t y;
102 asm volatile ("#foo" : "=r" (x));
103 y = x;
104 asm volatile ("#foo" : : : "memory");
105 }
106
107 /*
108 **bfloat_mov_mr:
109 ** ...
110 ** ldrh r4, \[.*\] @ __bf16
111 ** ...
112 ** bx lr
113 */
114 void bfloat_mov_mr (void)
115 {
116 volatile bfloat16_t x;
117 register bfloat16_t y asm ("r4");
118 asm volatile ("#foo" : : : "memory");
119 y = x;
120 asm volatile ("#foo" :: "r" (y));
121 }
122
123 #pragma GCC pop_options
124