ARM V8 base instruction -- ldrx stxr

自旋锁的底层实现。    

static inline int
    __ll_sc_atomic_add_return_acquire(int i, atomic_t *v)
    {
        unsigned long tmp;
        int result;
     
        asm volatile(
    "       // 将v->counter预取到CPU缓存\n"                                   \
    "    prfm    pstl1strm, %2\n"                    \
    "       // 将v->counter独占的读入result中\n"                              \
    "1:    ldaxr    %w0, %2\n"                            \
    "       // result = result + i\n"                                       \
    "    add    %w0, %w0, %w3\n"                                \
    "       // 将result的值独占的存入v->counter中\n"                           \
    "       // 如果存入时独占标记被清除则将tmp置1\n"                             \
    "    stxr    %w1, %w0, %2\n"                            \
    "       // 如果tmp被置1则从头再次执行一遍\n"                                \
    "    cbnz    %w1, 1b\n"                        \
            )                                \
        : "=&r" (result), "=&r" (tmp), "+Q" (v->counter)        \
        : __stringify(I) "r" (i)                        \
        : "memory");                                    \
                                        \
        return result;                            \
    }

    static inline int                            \
    __ll_sc_atomic_fetch_or_release(int i, atomic_t *v)            \
    {                                    \
        unsigned long tmp;                        \
        int val, result;                        \
                                        \
        asm volatile(                                            \
    "       // 将v->counter预取到CPU缓存\n"                                   \
    "    prfm    pstl1strm, %3\n"                    \
    "       // 将v->counter独占的读入result中\n"                              \
    "1:    ldxr    %w0, %3\n"                            \
    "       // val = result | i\n"                                          \
    "    orr    %w1, %w0, %w4\n"                        \
    "       // 将val的值独占的存入v->counter中\n"                              \
    "       // 如果存入时独占标记被清除则将tmp置1\n"                             \
    "    stlxr    %w2, %w1, %3\n"                            \
    "       // 如果tmp被置1则从头再次执行一遍\n"                                \
    "    cbnz    %w2, 1b\n"                        \
        : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter)    \
        : __stringify(K) "r" (i)                        \
        : "memory");                            \
                                        \
        return result;                            \
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值