X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=c_auto.h;h=84eb4e3347dc1ad58ad5b5a12717c2d76b4e1b48;hb=HEAD;hp=b3b1afc162ae2f8ca249f1c144d6bbabe36f2708;hpb=1fe8d40ebdb232ab6be27af1a3b94a2869cc3779;p=ia32rtools.git diff --git a/c_auto.h b/c_auto.h index b3b1afc..84eb4e3 100644 --- a/c_auto.h +++ b/c_auto.h @@ -63,4 +63,43 @@ static inline int do_parity(unsigned int v) printf("%s:%d: skip_code_abort\n", __FILE__, __LINE__); \ *(volatile int *)0 = 1 +#define barrier() \ + asm volatile("" ::: "memory") + +/* gcc always emits vldr/vstr which requires alignment, + * so in some cases these unaligned helpers are needed */ +#ifdef __ARM_NEON__ + +static inline float float_load(u32 ptr) +{ + register float v asm("s0"); + + asm ("vld1.32 {d0[0]}, [%1]" + : "=t"(v) : "r"(ptr)); + + return v; +} + +static inline void float_store(float v, u32 ptr) +{ + register float v1 asm("s0") = v; + + asm ("vst1.32 {d0[0]}, [%1]" + : : "t"(v1), "r"(ptr) : "memory"); +} + +#else + +static inline float float_load(u32 ptr) +{ + return *(const float *)ptr; +} + +static inline void float_store(float v, u32 ptr) +{ + *(float *)ptr = v; +} + +#endif + // vim:ts=2:sw=2:expandtab