arm平台适配总结

cmake获取平台信息:set(PLATFORM = $(strip $(shell echo `uname -m`)))

1. 编译参数

arm平台不支持“-m32"和“-m64"这样的编译参数。取而代之用 “-mabi=ilp32“ 和 “-mabi=lp64” 代替。还可以在指定 cpu的架构版本,如:
bazel build --cxxopt="-march=armv8-a" --cpu aarch64 ...

2. 内存对齐

arm平台默认的内存pagesize 和 x86平台不一致。

3. 原子操作

4.获取精确时间

#ifdef __aarch64__

#define RDTSC() ({ uint64_t time; __asm__ __volatile__ ("mrs %0, PMCCNTR_EL0" : "+r" (time)); time; })

#elif defined( __x86_64__)

#define RDTSC() ({ register uint32_t a,d; __asm__ __volatile__( "rdtsc" : "=a"(a), "=d"(d)); (((uint64_t)a)+(((uint64_t)d)<<32)); })

#else

#define RDTSC() ({ register uint64_t time; __asm__ __volatile__( "rdtsc" : "=A"(time)); time; })

5.内存屏障差异

#ifdef __aarch64__

#define CAS32(ptr, val_old, val_new) __sync_bool_compare_and_swap(ptr, val_old, val_new)

#define wmb() asm volatile("dmb ishst" ::: "memory")

#define rmb() asm volatile("dmb ishld" ::: "memory")

#else

#define CAS32(ptr, val_old, val_new)({ char ret; __asm__ __volatile__("lock; cmpxchgl %2,%0; setz %1": "+m"(*ptr), "=q"(ret): "r"(val_new),"a"(val_old): "memory"); ret;})

#define wmb() __asm__ __volatile__("sfence":::"memory")

#define rmb() __asm__ __volatile__("lfence":::"memory")

你可能感兴趣的:(杂七杂八,跨平台)