饱和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