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")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值