diff options
author | Tero Rintaluoma <teror@google.com> | 2011-09-19 10:59:52 +0300 |
---|---|---|
committer | Tero Rintaluoma <teror@google.com> | 2011-09-20 09:59:27 +0300 |
commit | 3c19bc3fb3d816e6587719d8af43a98c912113a0 (patch) | |
tree | d2cb82ca978eff66077b40b22a3e7fe25f3c82ae /vp8/encoder/arm | |
parent | 35ce4eb01d2ef02e0ab930bf8327aabd95189a52 (diff) | |
download | libvpx-3c19bc3fb3d816e6587719d8af43a98c912113a0.tar libvpx-3c19bc3fb3d816e6587719d8af43a98c912113a0.tar.gz libvpx-3c19bc3fb3d816e6587719d8af43a98c912113a0.tar.bz2 libvpx-3c19bc3fb3d816e6587719d8af43a98c912113a0.zip |
Fixed armv5te multiplications
Rd and Rm registers should be different in 'mul'. This register
combination results in unpredictable behaviour. GCC will give
a warning and RVCT an error in this case.
Restriction applies only to armv5 targets and not for armv6 and above.
Change-Id: I378d17c51e1f16a6820814fbed43e115aaabb03e
Diffstat (limited to 'vp8/encoder/arm')
4 files changed, 14 insertions, 14 deletions
diff --git a/vp8/encoder/arm/armv5te/boolhuff_armv5te.asm b/vp8/encoder/arm/armv5te/boolhuff_armv5te.asm index 3c05f5705..138ed46de 100644 --- a/vp8/encoder/arm/armv5te/boolhuff_armv5te.asm +++ b/vp8/encoder/arm/armv5te/boolhuff_armv5te.asm @@ -53,10 +53,10 @@ sub r7, r5, #1 ; range-1 cmp r1, #0 - mul r4, r4, r7 ; ((range-1) * probability) + mul r6, r4, r7 ; ((range-1) * probability) mov r7, #1 - add r4, r7, r4, lsr #8 ; 1 + (((range-1) * probability) >> 8) + add r4, r7, r6, lsr #8 ; 1 + (((range-1) * probability) >> 8) addne r2, r2, r4 ; if (bit) lowvalue += split subne r4, r5, r4 ; if (bit) range = range-split diff --git a/vp8/encoder/arm/armv5te/vp8_packtokens_armv5.asm b/vp8/encoder/arm/armv5te/vp8_packtokens_armv5.asm index d939287ff..933717c63 100644 --- a/vp8/encoder/arm/armv5te/vp8_packtokens_armv5.asm +++ b/vp8/encoder/arm/armv5te/vp8_packtokens_armv5.asm @@ -71,7 +71,7 @@ token_loop ; off of v, so set a flag here based on this. ; This value is refered to as "bb" lsls r12, r12, #1 ; bb = v >> n - mul r4, r4, r7 ; ((range-1) * pp[i>>1])) + mul r6, r4, r7 ; ((range-1) * pp[i>>1])) ; bb can only be 0 or 1. So only execute this statement ; if bb == 1, otherwise it will act like i + 0 @@ -79,7 +79,7 @@ token_loop mov r7, #1 ldrsb lr, [r10, lr] ; i = vp8_coef_tree[i+bb] - add r4, r7, r4, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split @@ -172,12 +172,12 @@ extra_bits_loop ldrb r4, [r9, lr, asr #1] ; pp[i>>1] sub r7, r5, #1 ; range-1 lsls r12, r12, #1 ; v >> n - mul r4, r4, r7 ; (range-1) * pp[i>>1] + mul r6, r4, r7 ; (range-1) * pp[i>>1] addcs lr, lr, #1 ; i + bb mov r7, #1 ldrsb lr, [r10, lr] ; i = b->tree[i+bb] - add r4, r7, r4, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split diff --git a/vp8/encoder/arm/armv5te/vp8_packtokens_mbrow_armv5.asm b/vp8/encoder/arm/armv5te/vp8_packtokens_mbrow_armv5.asm index ac2bba681..82bf71f35 100644 --- a/vp8/encoder/arm/armv5te/vp8_packtokens_mbrow_armv5.asm +++ b/vp8/encoder/arm/armv5te/vp8_packtokens_mbrow_armv5.asm @@ -93,7 +93,7 @@ token_loop ; off of v, so set a flag here based on this. ; This value is refered to as "bb" lsls r12, r12, #1 ; bb = v >> n - mul r4, r4, r7 ; ((range-1) * pp[i>>1])) + mul r6, r4, r7 ; ((range-1) * pp[i>>1])) ; bb can only be 0 or 1. So only execute this statement ; if bb == 1, otherwise it will act like i + 0 @@ -101,7 +101,7 @@ token_loop mov r7, #1 ldrsb lr, [r10, lr] ; i = vp8_coef_tree[i+bb] - add r4, r7, r4, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split @@ -194,12 +194,12 @@ extra_bits_loop ldrb r4, [r9, lr, asr #1] ; pp[i>>1] sub r7, r5, #1 ; range-1 lsls r12, r12, #1 ; v >> n - mul r4, r4, r7 ; (range-1) * pp[i>>1] + mul r6, r4, r7 ; (range-1) * pp[i>>1] addcs lr, lr, #1 ; i + bb mov r7, #1 ldrsb lr, [r10, lr] ; i = b->tree[i+bb] - add r4, r7, r4, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split diff --git a/vp8/encoder/arm/armv5te/vp8_packtokens_partitions_armv5.asm b/vp8/encoder/arm/armv5te/vp8_packtokens_partitions_armv5.asm index c2eccdb53..c00375e88 100644 --- a/vp8/encoder/arm/armv5te/vp8_packtokens_partitions_armv5.asm +++ b/vp8/encoder/arm/armv5te/vp8_packtokens_partitions_armv5.asm @@ -123,7 +123,7 @@ token_loop ; off of v, so set a flag here based on this. ; This value is refered to as "bb" lsls r12, r12, #1 ; bb = v >> n - mul r4, r4, r7 ; ((range-1) * pp[i>>1])) + mul r6, r4, r7 ; ((range-1) * pp[i>>1])) ; bb can only be 0 or 1. So only execute this statement ; if bb == 1, otherwise it will act like i + 0 @@ -131,7 +131,7 @@ token_loop mov r7, #1 ldrsb lr, [r10, lr] ; i = vp8_coef_tree[i+bb] - add r4, r7, r4, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split @@ -224,12 +224,12 @@ extra_bits_loop ldrb r4, [r9, lr, asr #1] ; pp[i>>1] sub r7, r5, #1 ; range-1 lsls r12, r12, #1 ; v >> n - mul r4, r4, r7 ; (range-1) * pp[i>>1] + mul r6, r4, r7 ; (range-1) * pp[i>>1] addcs lr, lr, #1 ; i + bb mov r7, #1 ldrsb lr, [r10, lr] ; i = b->tree[i+bb] - add r4, r7, r4, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) + add r4, r7, r6, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) addcs r2, r2, r4 ; if (bb) lowvalue += split subcs r4, r5, r4 ; if (bb) range = range-split |