[FFmpeg-cvslog] r17657 - trunk/libavcodec/arm/h264dsp_neon.S
mru
subversion
Sat Feb 28 14:48:54 CET 2009
Author: mru
Date: Sat Feb 28 14:48:54 2009
New Revision: 17657
Log:
ARM: fix corner-case overflow in H.264 weighted prediction
Modified:
trunk/libavcodec/arm/h264dsp_neon.S
Modified: trunk/libavcodec/arm/h264dsp_neon.S
==============================================================================
--- trunk/libavcodec/arm/h264dsp_neon.S Sat Feb 28 14:14:46 2009 (r17656)
+++ trunk/libavcodec/arm/h264dsp_neon.S Sat Feb 28 14:48:54 2009 (r17657)
@@ -1539,77 +1539,75 @@ function ff_biweight_h264_pixels_\w\()x\
@ Weighted prediction
- .macro weight_16 mac
+ .macro weight_16 add
vdup.8 d0, r3
- vmov q2, q8
- vmov q3, q8
1: subs ip, ip, #2
vld1.8 {d20-d21},[r0,:128], r1
- \mac q2, d0, d20
+ vmull.u8 q2, d0, d20
pld [r0]
- \mac q3, d0, d21
- vmov q12, q8
+ vmull.u8 q3, d0, d21
vld1.8 {d28-d29},[r0,:128], r1
- vmov q13, q8
- \mac q12, d0, d28
+ vmull.u8 q12, d0, d28
pld [r0]
- \mac q13, d0, d29
- vshl.s16 q2, q2, q9
- vshl.s16 q3, q3, q9
+ vmull.u8 q13, d0, d29
+ \add q2, q8, q2
+ vrshl.s16 q2, q2, q9
+ \add q3, q8, q3
+ vrshl.s16 q3, q3, q9
vqmovun.s16 d4, q2
vqmovun.s16 d5, q3
- vshl.s16 q12, q12, q9
- vshl.s16 q13, q13, q9
+ \add q12, q8, q12
+ vrshl.s16 q12, q12, q9
+ \add q13, q8, q13
+ vrshl.s16 q13, q13, q9
vqmovun.s16 d24, q12
vqmovun.s16 d25, q13
- vmov q3, q8
vst1.8 {d4- d5}, [r4,:128], r1
- vmov q2, q8
vst1.8 {d24-d25},[r4,:128], r1
bne 1b
pop {r4, pc}
.endm
- .macro weight_8 mac
+ .macro weight_8 add
vdup.8 d0, r3
- vmov q1, q8
- vmov q10, q8
1: subs ip, ip, #2
vld1.8 {d4},[r0,:64], r1
- \mac q1, d0, d4
+ vmull.u8 q1, d0, d4
pld [r0]
vld1.8 {d6},[r0,:64], r1
- \mac q10, d0, d6
+ vmull.u8 q10, d0, d6
+ \add q1, q8, q1
pld [r0]
- vshl.s16 q1, q1, q9
+ vrshl.s16 q1, q1, q9
vqmovun.s16 d2, q1
- vshl.s16 q10, q10, q9
+ \add q10, q8, q10
+ vrshl.s16 q10, q10, q9
vqmovun.s16 d4, q10
- vmov q10, q8
vst1.8 {d2},[r4,:64], r1
- vmov q1, q8
vst1.8 {d4},[r4,:64], r1
bne 1b
pop {r4, pc}
.endm
- .macro weight_4 mac
+ .macro weight_4 add
vdup.8 d0, r3
vmov q1, q8
vmov q10, q8
1: subs ip, ip, #4
vld1.32 {d4[0]},[r0,:32], r1
vld1.32 {d4[1]},[r0,:32], r1
- \mac q1, d0, d4
+ vmull.u8 q1, d0, d4
pld [r0]
blt 2f
vld1.32 {d6[0]},[r0,:32], r1
vld1.32 {d6[1]},[r0,:32], r1
- \mac q10, d0, d6
+ vmull.u8 q10, d0, d6
pld [r0]
- vshl.s16 q1, q1, q9
+ \add q1, q8, q1
+ vrshl.s16 q1, q1, q9
vqmovun.s16 d2, q1
- vshl.s16 q10, q10, q9
+ \add q10, q8, q10
+ vrshl.s16 q10, q10, q9
vqmovun.s16 d4, q10
vmov q10, q8
vst1.32 {d2[0]},[r4,:32], r1
@@ -1619,7 +1617,8 @@ function ff_biweight_h264_pixels_\w\()x\
vst1.32 {d4[1]},[r4,:32], r1
bne 1b
pop {r4, pc}
-2: vshl.s16 q1, q1, q9
+2: \add q1, q8, q1
+ vrshl.s16 q1, q1, q9
vqmovun.s16 d2, q1
vst1.32 {d2[0]},[r4,:32], r1
vst1.32 {d2[1]},[r4,:32], r1
@@ -1630,19 +1629,25 @@ function ff_biweight_h264_pixels_\w\()x\
function weight_h264_pixels_\w\()_neon
push {r4, lr}
ldr r4, [sp, #8]
- vdup.16 q9, r2
- mov lr, #1
+ cmp r2, #1
lsl r4, r4, r2
- subs r2, r2, #1
- vneg.s16 q9, q9
- addge r4, r4, lr, lsl r2
- cmp r3, #0
vdup.16 q8, r4
mov r4, r0
+ ble 20f
+ rsb lr, r2, #1
+ vdup.16 q9, lr
+ cmp r3, #0
blt 10f
- weight_\w vmlal.u8
+ weight_\w vhadd.s16
10: rsb r3, r3, #0
- weight_\w vmlsl.u8
+ weight_\w vhsub.s16
+20: rsb lr, r2, #0
+ vdup.16 q9, lr
+ cmp r3, #0
+ blt 10f
+ weight_\w vadd.s16
+10: rsb r3, r3, #0
+ weight_\w vsub.s16
.endfunc
.endm
More information about the ffmpeg-cvslog
mailing list