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 /*
9 **stacktest1:
10 ** sub sp, sp, #16
11 ** str h0, \[sp, 14\]
12 ** ldr h0, \[sp, 14\]
13 ** add sp, sp, 16
14 ** ret
15 */
16 bfloat16_t stacktest1 (bfloat16_t __a)
17 {
18 volatile bfloat16_t b = __a;
19 return b;
20 }
21
22 /*
23 **bfloat_mov_ww:
24 ** mov v1.h\[0\], v2.h\[0\]
25 ** ret
26 */
27 void bfloat_mov_ww (void)
28 {
29 register bfloat16_t x asm ("h2");
30 register bfloat16_t y asm ("h1");
31 asm volatile ("" : "=w" (x));
32 y = x;
33 asm volatile ("" :: "w" (y));
34 }
35
36 /*
37 **bfloat_mov_rw:
38 ** dup v1.4h, w1
39 ** ret
40 */
41 void bfloat_mov_rw (void)
42 {
43 register bfloat16_t x asm ("w1");
44 register bfloat16_t y asm ("h1");
45 asm volatile ("" : "=r" (x));
46 y = x;
47 asm volatile ("" :: "w" (y));
48 }
49
50 /*
51 **bfloat_mov_wr:
52 ** umov w1, v1.h\[0\]
53 ** ret
54 */
55 void bfloat_mov_wr (void)
56 {
57 register bfloat16_t x asm ("h1");
58 register bfloat16_t y asm ("w1");
59 asm volatile ("" : "=w" (x));
60 y = x;
61 asm volatile ("" :: "r" (y));
62 }
63
64 /*
65 **bfloat_mov_rr:
66 ** mov w1, w2
67 ** ret
68 */
69 void bfloat_mov_rr (void)
70 {
71 register bfloat16_t x asm ("w2");
72 register bfloat16_t y asm ("w1");
73 asm volatile ("" : "=r" (x));
74 y = x;
75 asm volatile ("" :: "r" (y));
76 }
77
78 /*
79 **bfloat_mov_rm:
80 ** strh w2, \[x0\]
81 ** ret
82 */
83 void bfloat_mov_rm (bfloat16_t *ptr)
84 {
85 register bfloat16_t x asm ("w2");
86 asm volatile ("" : "=r" (x));
87 *ptr = x;
88 }
89
90 /*
91 **bfloat_mov_mr:
92 ** ldrh w2, \[x0\]
93 ** ret
94 */
95 void bfloat_mov_mr (bfloat16_t *ptr)
96 {
97 register bfloat16_t y asm ("w2");
98 y = *ptr;
99 asm volatile ("" :: "r" (y));
100 }
101