ARM基本运算优化

饱和32位数到16位
ldr m, =0x00007fff
mov a, b, asr #15         ; a = (b >> 15)
teq a, b, asr #31         ; if (a != sign(b))
eorne b, m, b, asr #31    ; b = 0x7fff ^ sign(b)

饱和左移
mov m, #0x7fffffff
mov a, b, lsl c           ; a = b << c
teq b, a, asr c           ; if (b != (a >> c))
eorne a, m, b, asr #31    ; a = 0x7fffffff ^ sign(b)

舍入右移
adds b, b, #0             ; clear carry so works for c = 0
movs a, b, asr c          ; a = b >> c, carry = b bit c - 1
adc a, a, #0              ; if (carry) a++ to round

饱和的32位加减法
mov m, #0x80000000
adds a, b, c              ; a = b + c, V records overflow
eorvs a, m, a, asr #31    ; if (V) a = 0x80000000 ^ sign(a)

mov m, #0x80000000
subs a, b, c              ; a = b - c, V records overflow
eorvs a, m, a, asr #31    ; if (V) a = 0x80000000 ^ sign(a)

饱和绝对值
如果输入值是0x80000000,绝对值运算就会溢出。下面2个周期的代码处理了这种情况
sub a, b, b, lsr #31      ; a = b - (b < 0)
eor a, a, a, asr #31      ; a = a ^ sign(a)

;a=b+abs(c)
eors a, c, c, asr #32     ; a = c^sign(c) = abs(c) - (c<0)
adc a, b, a               ; a = b + a + (c<0)

字节反转                  ; n = [a, b, c, d]
eor t, n, n, ror #16      ; t = [a^c, b^d, c^a, d^b]
mov t, t, LSR #8          ; t = [0, a^c, b^d, c^a]
bic t, t, #0xff00         ; t = [0, a^c, 0, c^a]
eor n, t, n, ror #8       ; n = [d, c, b, a]

转自:http://hi.baidu.com/yeyingxian/blog/item/3dee244eb44ae7cad0c86a5e.html

转载于:https://www.cnblogs.com/MirAcle-baozi/archive/2011/11/07/2239192.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值