/* { dg-do assemble { target { arm*-*-* } } } */ /* { dg-require-effective-target arm_v8_neon_ok } */ /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */ /* { dg-additional-options "-march=armv8.2-a -mfloat-abi=hard -mfpu=neon-fp-armv8" } */ /* { dg-additional-options "-O3 --save-temps -std=gnu90" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include /* **stacktest1: ** ... ** vst1.16 {d[0-9]+\[[0-9]+\]}, \[r[0-9]+\] ** vld1.16 {d[0-9]+\[[0-9]+\]}, \[r[0-9]+\] ** ... ** bx lr */ bfloat16_t stacktest1 (bfloat16_t __a) { volatile bfloat16_t b = __a; return b; } /* **bfloat_mov_ww: ** ... ** vmov.f32 s1, s15 ** ... ** bx lr */ void bfloat_mov_ww (void) { register bfloat16_t x asm ("s15"); register bfloat16_t y asm ("s1"); asm volatile ("#foo" : "=t" (x)); y = x; asm volatile ("#foo" :: "t" (y)); } /* **bfloat_mov_rw: ** ... ** vmov s1, r4 ** ... ** bx lr */ void bfloat_mov_rw (void) { register bfloat16_t x asm ("r4"); register bfloat16_t y asm ("s1"); asm volatile ("#foo" : "=r" (x)); y = x; asm volatile ("#foo" :: "t" (y)); } /* **bfloat_mov_wr: ** ... ** vmov r4, s1 ** ... ** bx lr */ void bfloat_mov_wr (void) { register bfloat16_t x asm ("s1"); register bfloat16_t y asm ("r4"); asm volatile ("#foo" : "=t" (x)); y = x; asm volatile ("#foo" :: "r" (y)); } /* **bfloat_mov_rr: ** ... ** mov r4, r5 @ __bf16 ** ... ** bx lr */ void bfloat_mov_rr (void) { register bfloat16_t x asm ("r5"); register bfloat16_t y asm ("r4"); asm volatile ("#foo" : "=r" (x)); y = x; asm volatile ("#foo" :: "r" (y)); } /* **bfloat_mov_rm: ** ... ** strh r4, \[.*\] @ __bf16 ** ... ** bx lr */ void bfloat_mov_rm (void) { register bfloat16_t x asm ("r4"); volatile bfloat16_t y; asm volatile ("#foo" : "=r" (x)); y = x; asm volatile ("#foo" : : : "memory"); } /* **bfloat_mov_mr: ** ... ** ldrh r4, \[.*\] @ __bf16 ** ... ** bx lr */ void bfloat_mov_mr (void) { volatile bfloat16_t x; register bfloat16_t y asm ("r4"); asm volatile ("#foo" : : : "memory"); y = x; asm volatile ("#foo" :: "r" (y)); }