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