| Index: third_party/libvpx/source/libvpx/vp8/common/arm/armv6/loopfilter_v6.asm
|
| diff --git a/third_party/libvpx/source/libvpx/vp8/common/arm/armv6/loopfilter_v6.asm b/third_party/libvpx/source/libvpx/vp8/common/arm/armv6/loopfilter_v6.asm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1cbbbcdef5e2533b43a7095b9588d07b474d939b
|
| --- /dev/null
|
| +++ b/third_party/libvpx/source/libvpx/vp8/common/arm/armv6/loopfilter_v6.asm
|
| @@ -0,0 +1,1282 @@
|
| +;
|
| +; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
| +;
|
| +; Use of this source code is governed by a BSD-style license
|
| +; that can be found in the LICENSE file in the root of the source
|
| +; tree. An additional intellectual property rights grant can be found
|
| +; in the file PATENTS. All contributing project authors may
|
| +; be found in the AUTHORS file in the root of the source tree.
|
| +;
|
| +
|
| +
|
| + EXPORT |vp8_loop_filter_horizontal_edge_armv6|
|
| + EXPORT |vp8_mbloop_filter_horizontal_edge_armv6|
|
| + EXPORT |vp8_loop_filter_vertical_edge_armv6|
|
| + EXPORT |vp8_mbloop_filter_vertical_edge_armv6|
|
| +
|
| + AREA |.text|, CODE, READONLY ; name this block of code
|
| +
|
| + MACRO
|
| + TRANSPOSE_MATRIX $a0, $a1, $a2, $a3, $b0, $b1, $b2, $b3
|
| + ; input: $a0, $a1, $a2, $a3; output: $b0, $b1, $b2, $b3
|
| + ; a0: 03 02 01 00
|
| + ; a1: 13 12 11 10
|
| + ; a2: 23 22 21 20
|
| + ; a3: 33 32 31 30
|
| + ; b3 b2 b1 b0
|
| +
|
| + uxtb16 $b1, $a1 ; xx 12 xx 10
|
| + uxtb16 $b0, $a0 ; xx 02 xx 00
|
| + uxtb16 $b3, $a3 ; xx 32 xx 30
|
| + uxtb16 $b2, $a2 ; xx 22 xx 20
|
| + orr $b1, $b0, $b1, lsl #8 ; 12 02 10 00
|
| + orr $b3, $b2, $b3, lsl #8 ; 32 22 30 20
|
| +
|
| + uxtb16 $a1, $a1, ror #8 ; xx 13 xx 11
|
| + uxtb16 $a3, $a3, ror #8 ; xx 33 xx 31
|
| + uxtb16 $a0, $a0, ror #8 ; xx 03 xx 01
|
| + uxtb16 $a2, $a2, ror #8 ; xx 23 xx 21
|
| + orr $a0, $a0, $a1, lsl #8 ; 13 03 11 01
|
| + orr $a2, $a2, $a3, lsl #8 ; 33 23 31 21
|
| +
|
| + pkhtb $b2, $b3, $b1, asr #16 ; 32 22 12 02 -- p1
|
| + pkhbt $b0, $b1, $b3, lsl #16 ; 30 20 10 00 -- p3
|
| +
|
| + pkhtb $b3, $a2, $a0, asr #16 ; 33 23 13 03 -- p0
|
| + pkhbt $b1, $a0, $a2, lsl #16 ; 31 21 11 01 -- p2
|
| + MEND
|
| +
|
| +
|
| +src RN r0
|
| +pstep RN r1
|
| +count RN r5
|
| +
|
| +;r0 unsigned char *src_ptr,
|
| +;r1 int src_pixel_step,
|
| +;r2 const char *blimit,
|
| +;r3 const char *limit,
|
| +;stack const char *thresh,
|
| +;stack int count
|
| +
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| +|vp8_loop_filter_horizontal_edge_armv6| PROC
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| + stmdb sp!, {r4 - r11, lr}
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| + ldr count, [sp, #40] ; count for 8-in-parallel
|
| + ldr r6, [sp, #36] ; load thresh address
|
| + sub sp, sp, #16 ; create temp buffer
|
| +
|
| + ldr r9, [src], pstep ; p3
|
| + ldrb r4, [r2] ; blimit
|
| + ldr r10, [src], pstep ; p2
|
| + ldrb r2, [r3] ; limit
|
| + ldr r11, [src], pstep ; p1
|
| + orr r4, r4, r4, lsl #8
|
| + ldrb r3, [r6] ; thresh
|
| + orr r2, r2, r2, lsl #8
|
| + mov count, count, lsl #1 ; 4-in-parallel
|
| + orr r4, r4, r4, lsl #16
|
| + orr r3, r3, r3, lsl #8
|
| + orr r2, r2, r2, lsl #16
|
| + orr r3, r3, r3, lsl #16
|
| +
|
| +|Hnext8|
|
| + ; vp8_filter_mask() function
|
| + ; calculate breakout conditions
|
| + ldr r12, [src], pstep ; p0
|
| +
|
| + uqsub8 r6, r9, r10 ; p3 - p2
|
| + uqsub8 r7, r10, r9 ; p2 - p3
|
| + uqsub8 r8, r10, r11 ; p2 - p1
|
| + uqsub8 r10, r11, r10 ; p1 - p2
|
| +
|
| + orr r6, r6, r7 ; abs (p3-p2)
|
| + orr r8, r8, r10 ; abs (p2-p1)
|
| + uqsub8 lr, r6, r2 ; compare to limit. lr: vp8_filter_mask
|
| + uqsub8 r8, r8, r2 ; compare to limit
|
| + uqsub8 r6, r11, r12 ; p1 - p0
|
| + orr lr, lr, r8
|
| + uqsub8 r7, r12, r11 ; p0 - p1
|
| + ldr r9, [src], pstep ; q0
|
| + ldr r10, [src], pstep ; q1
|
| + orr r6, r6, r7 ; abs (p1-p0)
|
| + uqsub8 r7, r6, r2 ; compare to limit
|
| + uqsub8 r8, r6, r3 ; compare to thresh -- save r8 for later
|
| + orr lr, lr, r7
|
| +
|
| + uqsub8 r6, r11, r10 ; p1 - q1
|
| + uqsub8 r7, r10, r11 ; q1 - p1
|
| + uqsub8 r11, r12, r9 ; p0 - q0
|
| + uqsub8 r12, r9, r12 ; q0 - p0
|
| + orr r6, r6, r7 ; abs (p1-q1)
|
| + ldr r7, c0x7F7F7F7F
|
| + orr r12, r11, r12 ; abs (p0-q0)
|
| + ldr r11, [src], pstep ; q2
|
| + uqadd8 r12, r12, r12 ; abs (p0-q0) * 2
|
| + and r6, r7, r6, lsr #1 ; abs (p1-q1) / 2
|
| + uqsub8 r7, r9, r10 ; q0 - q1
|
| + uqadd8 r12, r12, r6 ; abs (p0-q0)*2 + abs (p1-q1)/2
|
| + uqsub8 r6, r10, r9 ; q1 - q0
|
| + uqsub8 r12, r12, r4 ; compare to flimit
|
| + uqsub8 r9, r11, r10 ; q2 - q1
|
| +
|
| + orr lr, lr, r12
|
| +
|
| + ldr r12, [src], pstep ; q3
|
| + uqsub8 r10, r10, r11 ; q1 - q2
|
| + orr r6, r7, r6 ; abs (q1-q0)
|
| + orr r10, r9, r10 ; abs (q2-q1)
|
| + uqsub8 r7, r6, r2 ; compare to limit
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| + uqsub8 r6, r6, r3 ; compare to thresh -- save r6 for later
|
| + orr lr, lr, r7
|
| + orr lr, lr, r10
|
| +
|
| + uqsub8 r10, r12, r11 ; q3 - q2
|
| + uqsub8 r9, r11, r12 ; q2 - q3
|
| +
|
| + mvn r11, #0 ; r11 == -1
|
| +
|
| + orr r10, r10, r9 ; abs (q3-q2)
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| +
|
| + mov r12, #0
|
| + orr lr, lr, r10
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + usub8 lr, r12, lr ; use usub8 instead of ssub8
|
| + sel lr, r11, r12 ; filter mask: lr
|
| +
|
| + cmp lr, #0
|
| + beq hskip_filter ; skip filtering
|
| +
|
| + sub src, src, pstep, lsl #1 ; move src pointer down by 6 lines
|
| +
|
| + ;vp8_hevmask() function
|
| + ;calculate high edge variance
|
| + orr r10, r6, r8 ; calculate vp8_hevmask
|
| +
|
| + ldr r7, [src], pstep ; p1
|
| +
|
| + usub8 r10, r12, r10 ; use usub8 instead of ssub8
|
| + sel r6, r12, r11 ; obtain vp8_hevmask: r6
|
| +
|
| + ;vp8_filter() function
|
| + ldr r8, [src], pstep ; p0
|
| + ldr r12, c0x80808080
|
| + ldr r9, [src], pstep ; q0
|
| + ldr r10, [src], pstep ; q1
|
| +
|
| + eor r7, r7, r12 ; p1 offset to convert to a signed value
|
| + eor r8, r8, r12 ; p0 offset to convert to a signed value
|
| + eor r9, r9, r12 ; q0 offset to convert to a signed value
|
| + eor r10, r10, r12 ; q1 offset to convert to a signed value
|
| +
|
| + str r9, [sp] ; store qs0 temporarily
|
| + str r8, [sp, #4] ; store ps0 temporarily
|
| + str r10, [sp, #8] ; store qs1 temporarily
|
| + str r7, [sp, #12] ; store ps1 temporarily
|
| +
|
| + qsub8 r7, r7, r10 ; vp8_signed_char_clamp(ps1-qs1)
|
| + qsub8 r8, r9, r8 ; vp8_signed_char_clamp(vp8_filter + 3 * ( qs0 - ps0))
|
| +
|
| + and r7, r7, r6 ; vp8_filter (r7) &= hev
|
| +
|
| + qadd8 r7, r7, r8
|
| + ldr r9, c0x03030303 ; r9 = 3 --modified for vp8
|
| +
|
| + qadd8 r7, r7, r8
|
| + ldr r10, c0x04040404
|
| +
|
| + qadd8 r7, r7, r8
|
| + and r7, r7, lr ; vp8_filter &= mask;
|
| +
|
| + ;modify code for vp8 -- Filter1 = vp8_filter (r7)
|
| + qadd8 r8 , r7 , r9 ; Filter2 (r8) = vp8_signed_char_clamp(vp8_filter+3)
|
| + qadd8 r7 , r7 , r10 ; vp8_filter = vp8_signed_char_clamp(vp8_filter+4)
|
| +
|
| + mov r9, #0
|
| + shadd8 r8 , r8 , r9 ; Filter2 >>= 3
|
| + shadd8 r7 , r7 , r9 ; vp8_filter >>= 3
|
| + shadd8 r8 , r8 , r9
|
| + shadd8 r7 , r7 , r9
|
| + shadd8 lr , r8 , r9 ; lr: Filter2
|
| + shadd8 r7 , r7 , r9 ; r7: filter
|
| +
|
| + ;usub8 lr, r8, r10 ; s = (s==4)*-1
|
| + ;sel lr, r11, r9
|
| + ;usub8 r8, r10, r8
|
| + ;sel r8, r11, r9
|
| + ;and r8, r8, lr ; -1 for each element that equals 4
|
| +
|
| + ;calculate output
|
| + ;qadd8 lr, r8, r7 ; u = vp8_signed_char_clamp(s + vp8_filter)
|
| +
|
| + ldr r8, [sp] ; load qs0
|
| + ldr r9, [sp, #4] ; load ps0
|
| +
|
| + ldr r10, c0x01010101
|
| +
|
| + qsub8 r8 ,r8, r7 ; u = vp8_signed_char_clamp(qs0 - vp8_filter)
|
| + qadd8 r9, r9, lr ; u = vp8_signed_char_clamp(ps0 + Filter2)
|
| +
|
| + ;end of modification for vp8
|
| +
|
| + mov lr, #0
|
| + sadd8 r7, r7 , r10 ; vp8_filter += 1
|
| + shadd8 r7, r7, lr ; vp8_filter >>= 1
|
| +
|
| + ldr r11, [sp, #12] ; load ps1
|
| + ldr r10, [sp, #8] ; load qs1
|
| +
|
| + bic r7, r7, r6 ; vp8_filter &= ~hev
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + qadd8 r11, r11, r7 ; u = vp8_signed_char_clamp(ps1 + vp8_filter)
|
| + qsub8 r10, r10,r7 ; u = vp8_signed_char_clamp(qs1 - vp8_filter)
|
| +
|
| + eor r11, r11, r12 ; *op1 = u^0x80
|
| + str r11, [src], pstep ; store op1
|
| + eor r9, r9, r12 ; *op0 = u^0x80
|
| + str r9, [src], pstep ; store op0 result
|
| + eor r8, r8, r12 ; *oq0 = u^0x80
|
| + str r8, [src], pstep ; store oq0 result
|
| + eor r10, r10, r12 ; *oq1 = u^0x80
|
| + str r10, [src], pstep ; store oq1
|
| +
|
| + sub src, src, pstep, lsl #1
|
| +
|
| +|hskip_filter|
|
| + add src, src, #4
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + subs count, count, #1
|
| +
|
| + ldrne r9, [src], pstep ; p3
|
| + ldrne r10, [src], pstep ; p2
|
| + ldrne r11, [src], pstep ; p1
|
| +
|
| + bne Hnext8
|
| +
|
| + add sp, sp, #16
|
| + ldmia sp!, {r4 - r11, pc}
|
| + ENDP ; |vp8_loop_filter_horizontal_edge_armv6|
|
| +
|
| +
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| +|vp8_mbloop_filter_horizontal_edge_armv6| PROC
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| + stmdb sp!, {r4 - r11, lr}
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| + ldr count, [sp, #40] ; count for 8-in-parallel
|
| + ldr r6, [sp, #36] ; load thresh address
|
| + sub sp, sp, #16 ; create temp buffer
|
| +
|
| + ldr r9, [src], pstep ; p3
|
| + ldrb r4, [r2] ; blimit
|
| + ldr r10, [src], pstep ; p2
|
| + ldrb r2, [r3] ; limit
|
| + ldr r11, [src], pstep ; p1
|
| + orr r4, r4, r4, lsl #8
|
| + ldrb r3, [r6] ; thresh
|
| + orr r2, r2, r2, lsl #8
|
| + mov count, count, lsl #1 ; 4-in-parallel
|
| + orr r4, r4, r4, lsl #16
|
| + orr r3, r3, r3, lsl #8
|
| + orr r2, r2, r2, lsl #16
|
| + orr r3, r3, r3, lsl #16
|
| +
|
| +|MBHnext8|
|
| +
|
| + ; vp8_filter_mask() function
|
| + ; calculate breakout conditions
|
| + ldr r12, [src], pstep ; p0
|
| +
|
| + uqsub8 r6, r9, r10 ; p3 - p2
|
| + uqsub8 r7, r10, r9 ; p2 - p3
|
| + uqsub8 r8, r10, r11 ; p2 - p1
|
| + uqsub8 r10, r11, r10 ; p1 - p2
|
| +
|
| + orr r6, r6, r7 ; abs (p3-p2)
|
| + orr r8, r8, r10 ; abs (p2-p1)
|
| + uqsub8 lr, r6, r2 ; compare to limit. lr: vp8_filter_mask
|
| + uqsub8 r8, r8, r2 ; compare to limit
|
| +
|
| + uqsub8 r6, r11, r12 ; p1 - p0
|
| + orr lr, lr, r8
|
| + uqsub8 r7, r12, r11 ; p0 - p1
|
| + ldr r9, [src], pstep ; q0
|
| + ldr r10, [src], pstep ; q1
|
| + orr r6, r6, r7 ; abs (p1-p0)
|
| + uqsub8 r7, r6, r2 ; compare to limit
|
| + uqsub8 r8, r6, r3 ; compare to thresh -- save r8 for later
|
| + orr lr, lr, r7
|
| +
|
| + uqsub8 r6, r11, r10 ; p1 - q1
|
| + uqsub8 r7, r10, r11 ; q1 - p1
|
| + uqsub8 r11, r12, r9 ; p0 - q0
|
| + uqsub8 r12, r9, r12 ; q0 - p0
|
| + orr r6, r6, r7 ; abs (p1-q1)
|
| + ldr r7, c0x7F7F7F7F
|
| + orr r12, r11, r12 ; abs (p0-q0)
|
| + ldr r11, [src], pstep ; q2
|
| + uqadd8 r12, r12, r12 ; abs (p0-q0) * 2
|
| + and r6, r7, r6, lsr #1 ; abs (p1-q1) / 2
|
| + uqsub8 r7, r9, r10 ; q0 - q1
|
| + uqadd8 r12, r12, r6 ; abs (p0-q0)*2 + abs (p1-q1)/2
|
| + uqsub8 r6, r10, r9 ; q1 - q0
|
| + uqsub8 r12, r12, r4 ; compare to flimit
|
| + uqsub8 r9, r11, r10 ; q2 - q1
|
| +
|
| + orr lr, lr, r12
|
| +
|
| + ldr r12, [src], pstep ; q3
|
| +
|
| + uqsub8 r10, r10, r11 ; q1 - q2
|
| + orr r6, r7, r6 ; abs (q1-q0)
|
| + orr r10, r9, r10 ; abs (q2-q1)
|
| + uqsub8 r7, r6, r2 ; compare to limit
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| + uqsub8 r6, r6, r3 ; compare to thresh -- save r6 for later
|
| + orr lr, lr, r7
|
| + orr lr, lr, r10
|
| +
|
| + uqsub8 r10, r12, r11 ; q3 - q2
|
| + uqsub8 r9, r11, r12 ; q2 - q3
|
| +
|
| + mvn r11, #0 ; r11 == -1
|
| +
|
| + orr r10, r10, r9 ; abs (q3-q2)
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| +
|
| + mov r12, #0
|
| +
|
| + orr lr, lr, r10
|
| +
|
| + usub8 lr, r12, lr ; use usub8 instead of ssub8
|
| + sel lr, r11, r12 ; filter mask: lr
|
| +
|
| + cmp lr, #0
|
| + beq mbhskip_filter ; skip filtering
|
| +
|
| + ;vp8_hevmask() function
|
| + ;calculate high edge variance
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 6 lines
|
| + sub src, src, pstep, lsl #1
|
| +
|
| + orr r10, r6, r8
|
| + ldr r7, [src], pstep ; p1
|
| +
|
| + usub8 r10, r12, r10
|
| + sel r6, r12, r11 ; hev mask: r6
|
| +
|
| + ;vp8_mbfilter() function
|
| + ;p2, q2 are only needed at the end. Don't need to load them in now.
|
| + ldr r8, [src], pstep ; p0
|
| + ldr r12, c0x80808080
|
| + ldr r9, [src], pstep ; q0
|
| + ldr r10, [src] ; q1
|
| +
|
| + eor r7, r7, r12 ; ps1
|
| + eor r8, r8, r12 ; ps0
|
| + eor r9, r9, r12 ; qs0
|
| + eor r10, r10, r12 ; qs1
|
| +
|
| + qsub8 r12, r9, r8 ; vp8_signed_char_clamp(vp8_filter + 3 * ( qs0 - ps0))
|
| + str r7, [sp, #12] ; store ps1 temporarily
|
| + qsub8 r7, r7, r10 ; vp8_signed_char_clamp(ps1-qs1)
|
| + str r10, [sp, #8] ; store qs1 temporarily
|
| + qadd8 r7, r7, r12
|
| + str r9, [sp] ; store qs0 temporarily
|
| + qadd8 r7, r7, r12
|
| + str r8, [sp, #4] ; store ps0 temporarily
|
| + qadd8 r7, r7, r12 ; vp8_filter: r7
|
| +
|
| + ldr r10, c0x03030303 ; r10 = 3 --modified for vp8
|
| + ldr r9, c0x04040404
|
| +
|
| + and r7, r7, lr ; vp8_filter &= mask (lr is free)
|
| +
|
| + mov r12, r7 ; Filter2: r12
|
| + and r12, r12, r6 ; Filter2 &= hev
|
| +
|
| + ;modify code for vp8
|
| + ;save bottom 3 bits so that we round one side +4 and the other +3
|
| + qadd8 r8 , r12 , r9 ; Filter1 (r8) = vp8_signed_char_clamp(Filter2+4)
|
| + qadd8 r12 , r12 , r10 ; Filter2 (r12) = vp8_signed_char_clamp(Filter2+3)
|
| +
|
| + mov r10, #0
|
| + shadd8 r8 , r8 , r10 ; Filter1 >>= 3
|
| + shadd8 r12 , r12 , r10 ; Filter2 >>= 3
|
| + shadd8 r8 , r8 , r10
|
| + shadd8 r12 , r12 , r10
|
| + shadd8 r8 , r8 , r10 ; r8: Filter1
|
| + shadd8 r12 , r12 , r10 ; r12: Filter2
|
| +
|
| + ldr r9, [sp] ; load qs0
|
| + ldr r11, [sp, #4] ; load ps0
|
| +
|
| + qsub8 r9 , r9, r8 ; qs0 = vp8_signed_char_clamp(qs0 - Filter1)
|
| + qadd8 r11, r11, r12 ; ps0 = vp8_signed_char_clamp(ps0 + Filter2)
|
| +
|
| + ;save bottom 3 bits so that we round one side +4 and the other +3
|
| + ;and r8, r12, r10 ; s = Filter2 & 7 (s: r8)
|
| + ;qadd8 r12 , r12 , r9 ; Filter2 = vp8_signed_char_clamp(Filter2+4)
|
| + ;mov r10, #0
|
| + ;shadd8 r12 , r12 , r10 ; Filter2 >>= 3
|
| + ;usub8 lr, r8, r9 ; s = (s==4)*-1
|
| + ;sel lr, r11, r10
|
| + ;shadd8 r12 , r12 , r10
|
| + ;usub8 r8, r9, r8
|
| + ;sel r8, r11, r10
|
| + ;ldr r9, [sp] ; load qs0
|
| + ;ldr r11, [sp, #4] ; load ps0
|
| + ;shadd8 r12 , r12 , r10
|
| + ;and r8, r8, lr ; -1 for each element that equals 4
|
| + ;qadd8 r10, r8, r12 ; u = vp8_signed_char_clamp(s + Filter2)
|
| + ;qsub8 r9 , r9, r12 ; qs0 = vp8_signed_char_clamp(qs0 - Filter2)
|
| + ;qadd8 r11, r11, r10 ; ps0 = vp8_signed_char_clamp(ps0 + u)
|
| +
|
| + ;end of modification for vp8
|
| +
|
| + bic r12, r7, r6 ; vp8_filter &= ~hev ( r6 is free)
|
| + ;mov r12, r7
|
| +
|
| + ;roughly 3/7th difference across boundary
|
| + mov lr, #0x1b ; 27
|
| + mov r7, #0x3f ; 63
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r7, r10, lr, r7
|
| + smultb r10, r10, lr
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + add r10, r10, #63
|
| + ssat r7, #8, r7, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + ldr lr, c0x80808080
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r7, r10, lsl #16
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + sub src, src, pstep
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 27)>>7)
|
| +
|
| + qsub8 r8, r9, r10 ; s = vp8_signed_char_clamp(qs0 - u)
|
| + qadd8 r10, r11, r10 ; s = vp8_signed_char_clamp(ps0 + u)
|
| + eor r8, r8, lr ; *oq0 = s^0x80
|
| + str r8, [src] ; store *oq0
|
| + sub src, src, pstep
|
| + eor r10, r10, lr ; *op0 = s^0x80
|
| + str r10, [src] ; store *op0
|
| +
|
| + ;roughly 2/7th difference across boundary
|
| + mov lr, #0x12 ; 18
|
| + mov r7, #0x3f ; 63
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r9, r10, lr, r7
|
| + smlatb r10, r10, lr, r7
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + ssat r9, #8, r9, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + ldr lr, c0x80808080
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r9, r10, lsl #16
|
| +
|
| + ldr r9, [sp, #8] ; load qs1
|
| + ldr r11, [sp, #12] ; load ps1
|
| +
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + sub src, src, pstep
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 18)>>7)
|
| +
|
| + qadd8 r11, r11, r10 ; s = vp8_signed_char_clamp(ps1 + u)
|
| + qsub8 r8, r9, r10 ; s = vp8_signed_char_clamp(qs1 - u)
|
| + eor r11, r11, lr ; *op1 = s^0x80
|
| + str r11, [src], pstep ; store *op1
|
| + eor r8, r8, lr ; *oq1 = s^0x80
|
| + add src, src, pstep, lsl #1
|
| +
|
| + mov r7, #0x3f ; 63
|
| +
|
| + str r8, [src], pstep ; store *oq1
|
| +
|
| + ;roughly 1/7th difference across boundary
|
| + mov lr, #0x9 ; 9
|
| + ldr r9, [src] ; load q2
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r12, r10, lr, r7
|
| + smlatb r10, r10, lr, r7
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + ssat r12, #8, r12, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r12, r10, lsl #16
|
| +
|
| + sub src, src, pstep
|
| + ldr lr, c0x80808080
|
| +
|
| + ldr r11, [src] ; load p2
|
| +
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + eor r9, r9, lr
|
| + eor r11, r11, lr
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 9)>>7)
|
| +
|
| + qadd8 r8, r11, r10 ; s = vp8_signed_char_clamp(ps2 + u)
|
| + qsub8 r10, r9, r10 ; s = vp8_signed_char_clamp(qs2 - u)
|
| + eor r8, r8, lr ; *op2 = s^0x80
|
| + str r8, [src], pstep, lsl #2 ; store *op2
|
| + add src, src, pstep
|
| + eor r10, r10, lr ; *oq2 = s^0x80
|
| + str r10, [src], pstep, lsl #1 ; store *oq2
|
| +
|
| +|mbhskip_filter|
|
| + add src, src, #4
|
| + sub src, src, pstep, lsl #3
|
| + subs count, count, #1
|
| +
|
| + ldrne r9, [src], pstep ; p3
|
| + ldrne r10, [src], pstep ; p2
|
| + ldrne r11, [src], pstep ; p1
|
| +
|
| + bne MBHnext8
|
| +
|
| + add sp, sp, #16
|
| + ldmia sp!, {r4 - r11, pc}
|
| + ENDP ; |vp8_mbloop_filter_horizontal_edge_armv6|
|
| +
|
| +
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| +|vp8_loop_filter_vertical_edge_armv6| PROC
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| + stmdb sp!, {r4 - r11, lr}
|
| +
|
| + sub src, src, #4 ; move src pointer down by 4
|
| + ldr count, [sp, #40] ; count for 8-in-parallel
|
| + ldr r12, [sp, #36] ; load thresh address
|
| + sub sp, sp, #16 ; create temp buffer
|
| +
|
| + ldr r6, [src], pstep ; load source data
|
| + ldrb r4, [r2] ; blimit
|
| + ldr r7, [src], pstep
|
| + ldrb r2, [r3] ; limit
|
| + ldr r8, [src], pstep
|
| + orr r4, r4, r4, lsl #8
|
| + ldrb r3, [r12] ; thresh
|
| + orr r2, r2, r2, lsl #8
|
| + ldr lr, [src], pstep
|
| + mov count, count, lsl #1 ; 4-in-parallel
|
| + orr r4, r4, r4, lsl #16
|
| + orr r3, r3, r3, lsl #8
|
| + orr r2, r2, r2, lsl #16
|
| + orr r3, r3, r3, lsl #16
|
| +
|
| +|Vnext8|
|
| +
|
| + ; vp8_filter_mask() function
|
| + ; calculate breakout conditions
|
| + ; transpose the source data for 4-in-parallel operation
|
| + TRANSPOSE_MATRIX r6, r7, r8, lr, r9, r10, r11, r12
|
| +
|
| + uqsub8 r7, r9, r10 ; p3 - p2
|
| + uqsub8 r8, r10, r9 ; p2 - p3
|
| + uqsub8 r9, r10, r11 ; p2 - p1
|
| + uqsub8 r10, r11, r10 ; p1 - p2
|
| + orr r7, r7, r8 ; abs (p3-p2)
|
| + orr r10, r9, r10 ; abs (p2-p1)
|
| + uqsub8 lr, r7, r2 ; compare to limit. lr: vp8_filter_mask
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + orr lr, lr, r10
|
| +
|
| + uqsub8 r6, r11, r12 ; p1 - p0
|
| + uqsub8 r7, r12, r11 ; p0 - p1
|
| + add src, src, #4 ; move src pointer up by 4
|
| + orr r6, r6, r7 ; abs (p1-p0)
|
| + str r11, [sp, #12] ; save p1
|
| + uqsub8 r10, r6, r2 ; compare to limit
|
| + uqsub8 r11, r6, r3 ; compare to thresh
|
| + orr lr, lr, r10
|
| +
|
| + ; transpose uses 8 regs(r6 - r12 and lr). Need to save reg value now
|
| + ; transpose the source data for 4-in-parallel operation
|
| + ldr r6, [src], pstep ; load source data
|
| + str r11, [sp] ; push r11 to stack
|
| + ldr r7, [src], pstep
|
| + str r12, [sp, #4] ; save current reg before load q0 - q3 data
|
| + ldr r8, [src], pstep
|
| + str lr, [sp, #8]
|
| + ldr lr, [src], pstep
|
| +
|
| + TRANSPOSE_MATRIX r6, r7, r8, lr, r9, r10, r11, r12
|
| +
|
| + ldr lr, [sp, #8] ; load back (f)limit accumulator
|
| +
|
| + uqsub8 r6, r12, r11 ; q3 - q2
|
| + uqsub8 r7, r11, r12 ; q2 - q3
|
| + uqsub8 r12, r11, r10 ; q2 - q1
|
| + uqsub8 r11, r10, r11 ; q1 - q2
|
| + orr r6, r6, r7 ; abs (q3-q2)
|
| + orr r7, r12, r11 ; abs (q2-q1)
|
| + uqsub8 r6, r6, r2 ; compare to limit
|
| + uqsub8 r7, r7, r2 ; compare to limit
|
| + ldr r11, [sp, #4] ; load back p0
|
| + ldr r12, [sp, #12] ; load back p1
|
| + orr lr, lr, r6
|
| + orr lr, lr, r7
|
| +
|
| + uqsub8 r6, r11, r9 ; p0 - q0
|
| + uqsub8 r7, r9, r11 ; q0 - p0
|
| + uqsub8 r8, r12, r10 ; p1 - q1
|
| + uqsub8 r11, r10, r12 ; q1 - p1
|
| + orr r6, r6, r7 ; abs (p0-q0)
|
| + ldr r7, c0x7F7F7F7F
|
| + orr r8, r8, r11 ; abs (p1-q1)
|
| + uqadd8 r6, r6, r6 ; abs (p0-q0) * 2
|
| + and r8, r7, r8, lsr #1 ; abs (p1-q1) / 2
|
| + uqsub8 r11, r10, r9 ; q1 - q0
|
| + uqadd8 r6, r8, r6 ; abs (p0-q0)*2 + abs (p1-q1)/2
|
| + uqsub8 r12, r9, r10 ; q0 - q1
|
| + uqsub8 r6, r6, r4 ; compare to flimit
|
| +
|
| + orr r9, r11, r12 ; abs (q1-q0)
|
| + uqsub8 r8, r9, r2 ; compare to limit
|
| + uqsub8 r10, r9, r3 ; compare to thresh
|
| + orr lr, lr, r6
|
| + orr lr, lr, r8
|
| +
|
| + mvn r11, #0 ; r11 == -1
|
| + mov r12, #0
|
| +
|
| + usub8 lr, r12, lr
|
| + ldr r9, [sp] ; load the compared result
|
| + sel lr, r11, r12 ; filter mask: lr
|
| +
|
| + cmp lr, #0
|
| + beq vskip_filter ; skip filtering
|
| +
|
| + ;vp8_hevmask() function
|
| + ;calculate high edge variance
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + orr r9, r9, r10
|
| +
|
| + ldrh r7, [src, #-2]
|
| + ldrh r8, [src], pstep
|
| +
|
| + usub8 r9, r12, r9
|
| + sel r6, r12, r11 ; hev mask: r6
|
| +
|
| + ;vp8_filter() function
|
| + ; load soure data to r6, r11, r12, lr
|
| + ldrh r9, [src, #-2]
|
| + ldrh r10, [src], pstep
|
| +
|
| + pkhbt r12, r7, r8, lsl #16
|
| +
|
| + ldrh r7, [src, #-2]
|
| + ldrh r8, [src], pstep
|
| +
|
| + pkhbt r11, r9, r10, lsl #16
|
| +
|
| + ldrh r9, [src, #-2]
|
| + ldrh r10, [src], pstep
|
| +
|
| + ; Transpose needs 8 regs(r6 - r12, and lr). Save r6 and lr first
|
| + str r6, [sp]
|
| + str lr, [sp, #4]
|
| +
|
| + pkhbt r6, r7, r8, lsl #16
|
| + pkhbt lr, r9, r10, lsl #16
|
| +
|
| + ;transpose r12, r11, r6, lr to r7, r8, r9, r10
|
| + TRANSPOSE_MATRIX r12, r11, r6, lr, r7, r8, r9, r10
|
| +
|
| + ;load back hev_mask r6 and filter_mask lr
|
| + ldr r12, c0x80808080
|
| + ldr r6, [sp]
|
| + ldr lr, [sp, #4]
|
| +
|
| + eor r7, r7, r12 ; p1 offset to convert to a signed value
|
| + eor r8, r8, r12 ; p0 offset to convert to a signed value
|
| + eor r9, r9, r12 ; q0 offset to convert to a signed value
|
| + eor r10, r10, r12 ; q1 offset to convert to a signed value
|
| +
|
| + str r9, [sp] ; store qs0 temporarily
|
| + str r8, [sp, #4] ; store ps0 temporarily
|
| + str r10, [sp, #8] ; store qs1 temporarily
|
| + str r7, [sp, #12] ; store ps1 temporarily
|
| +
|
| + qsub8 r7, r7, r10 ; vp8_signed_char_clamp(ps1-qs1)
|
| + qsub8 r8, r9, r8 ; vp8_signed_char_clamp(vp8_filter + 3 * ( qs0 - ps0))
|
| +
|
| + and r7, r7, r6 ; vp8_filter (r7) &= hev (r7 : filter)
|
| +
|
| + qadd8 r7, r7, r8
|
| + ldr r9, c0x03030303 ; r9 = 3 --modified for vp8
|
| +
|
| + qadd8 r7, r7, r8
|
| + ldr r10, c0x04040404
|
| +
|
| + qadd8 r7, r7, r8
|
| + ;mvn r11, #0 ; r11 == -1
|
| +
|
| + and r7, r7, lr ; vp8_filter &= mask
|
| +
|
| + ;modify code for vp8 -- Filter1 = vp8_filter (r7)
|
| + qadd8 r8 , r7 , r9 ; Filter2 (r8) = vp8_signed_char_clamp(vp8_filter+3)
|
| + qadd8 r7 , r7 , r10 ; vp8_filter = vp8_signed_char_clamp(vp8_filter+4)
|
| +
|
| + mov r9, #0
|
| + shadd8 r8 , r8 , r9 ; Filter2 >>= 3
|
| + shadd8 r7 , r7 , r9 ; vp8_filter >>= 3
|
| + shadd8 r8 , r8 , r9
|
| + shadd8 r7 , r7 , r9
|
| + shadd8 lr , r8 , r9 ; lr: filter2
|
| + shadd8 r7 , r7 , r9 ; r7: filter
|
| +
|
| + ;usub8 lr, r8, r10 ; s = (s==4)*-1
|
| + ;sel lr, r11, r9
|
| + ;usub8 r8, r10, r8
|
| + ;sel r8, r11, r9
|
| + ;and r8, r8, lr ; -1 for each element that equals 4 -- r8: s
|
| +
|
| + ;calculate output
|
| + ;qadd8 lr, r8, r7 ; u = vp8_signed_char_clamp(s + vp8_filter)
|
| +
|
| + ldr r8, [sp] ; load qs0
|
| + ldr r9, [sp, #4] ; load ps0
|
| +
|
| + ldr r10, c0x01010101
|
| +
|
| + qsub8 r8, r8, r7 ; u = vp8_signed_char_clamp(qs0 - vp8_filter)
|
| + qadd8 r9, r9, lr ; u = vp8_signed_char_clamp(ps0 + Filter2)
|
| + ;end of modification for vp8
|
| +
|
| + eor r8, r8, r12
|
| + eor r9, r9, r12
|
| +
|
| + mov lr, #0
|
| +
|
| + sadd8 r7, r7, r10
|
| + shadd8 r7, r7, lr
|
| +
|
| + ldr r10, [sp, #8] ; load qs1
|
| + ldr r11, [sp, #12] ; load ps1
|
| +
|
| + bic r7, r7, r6 ; r7: vp8_filter
|
| +
|
| + qsub8 r10 , r10, r7 ; u = vp8_signed_char_clamp(qs1 - vp8_filter)
|
| + qadd8 r11, r11, r7 ; u = vp8_signed_char_clamp(ps1 + vp8_filter)
|
| + eor r10, r10, r12
|
| + eor r11, r11, r12
|
| +
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + ;we can use TRANSPOSE_MATRIX macro to transpose output - input: q1, q0, p0, p1
|
| + ;output is b0, b1, b2, b3
|
| + ;b0: 03 02 01 00
|
| + ;b1: 13 12 11 10
|
| + ;b2: 23 22 21 20
|
| + ;b3: 33 32 31 30
|
| + ; p1 p0 q0 q1
|
| + ; (a3 a2 a1 a0)
|
| + TRANSPOSE_MATRIX r11, r9, r8, r10, r6, r7, r12, lr
|
| +
|
| + strh r6, [src, #-2] ; store the result
|
| + mov r6, r6, lsr #16
|
| + strh r6, [src], pstep
|
| +
|
| + strh r7, [src, #-2]
|
| + mov r7, r7, lsr #16
|
| + strh r7, [src], pstep
|
| +
|
| + strh r12, [src, #-2]
|
| + mov r12, r12, lsr #16
|
| + strh r12, [src], pstep
|
| +
|
| + strh lr, [src, #-2]
|
| + mov lr, lr, lsr #16
|
| + strh lr, [src], pstep
|
| +
|
| +|vskip_filter|
|
| + sub src, src, #4
|
| + subs count, count, #1
|
| +
|
| + ldrne r6, [src], pstep ; load source data
|
| + ldrne r7, [src], pstep
|
| + ldrne r8, [src], pstep
|
| + ldrne lr, [src], pstep
|
| +
|
| + bne Vnext8
|
| +
|
| + add sp, sp, #16
|
| +
|
| + ldmia sp!, {r4 - r11, pc}
|
| + ENDP ; |vp8_loop_filter_vertical_edge_armv6|
|
| +
|
| +
|
| +
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| +|vp8_mbloop_filter_vertical_edge_armv6| PROC
|
| +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
| + stmdb sp!, {r4 - r11, lr}
|
| +
|
| + sub src, src, #4 ; move src pointer down by 4
|
| + ldr count, [sp, #40] ; count for 8-in-parallel
|
| + ldr r12, [sp, #36] ; load thresh address
|
| + pld [src, #23] ; preload for next block
|
| + sub sp, sp, #16 ; create temp buffer
|
| +
|
| + ldr r6, [src], pstep ; load source data
|
| + ldrb r4, [r2] ; blimit
|
| + pld [src, #23]
|
| + ldr r7, [src], pstep
|
| + ldrb r2, [r3] ; limit
|
| + pld [src, #23]
|
| + ldr r8, [src], pstep
|
| + orr r4, r4, r4, lsl #8
|
| + ldrb r3, [r12] ; thresh
|
| + orr r2, r2, r2, lsl #8
|
| + pld [src, #23]
|
| + ldr lr, [src], pstep
|
| + mov count, count, lsl #1 ; 4-in-parallel
|
| + orr r4, r4, r4, lsl #16
|
| + orr r3, r3, r3, lsl #8
|
| + orr r2, r2, r2, lsl #16
|
| + orr r3, r3, r3, lsl #16
|
| +
|
| +|MBVnext8|
|
| + ; vp8_filter_mask() function
|
| + ; calculate breakout conditions
|
| + ; transpose the source data for 4-in-parallel operation
|
| + TRANSPOSE_MATRIX r6, r7, r8, lr, r9, r10, r11, r12
|
| +
|
| + uqsub8 r7, r9, r10 ; p3 - p2
|
| + uqsub8 r8, r10, r9 ; p2 - p3
|
| + uqsub8 r9, r10, r11 ; p2 - p1
|
| + uqsub8 r10, r11, r10 ; p1 - p2
|
| + orr r7, r7, r8 ; abs (p3-p2)
|
| + orr r10, r9, r10 ; abs (p2-p1)
|
| + uqsub8 lr, r7, r2 ; compare to limit. lr: vp8_filter_mask
|
| + uqsub8 r10, r10, r2 ; compare to limit
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + orr lr, lr, r10
|
| +
|
| + uqsub8 r6, r11, r12 ; p1 - p0
|
| + uqsub8 r7, r12, r11 ; p0 - p1
|
| + add src, src, #4 ; move src pointer up by 4
|
| + orr r6, r6, r7 ; abs (p1-p0)
|
| + str r11, [sp, #12] ; save p1
|
| + uqsub8 r10, r6, r2 ; compare to limit
|
| + uqsub8 r11, r6, r3 ; compare to thresh
|
| + orr lr, lr, r10
|
| +
|
| + ; transpose uses 8 regs(r6 - r12 and lr). Need to save reg value now
|
| + ; transpose the source data for 4-in-parallel operation
|
| + ldr r6, [src], pstep ; load source data
|
| + str r11, [sp] ; push r11 to stack
|
| + ldr r7, [src], pstep
|
| + str r12, [sp, #4] ; save current reg before load q0 - q3 data
|
| + ldr r8, [src], pstep
|
| + str lr, [sp, #8]
|
| + ldr lr, [src], pstep
|
| +
|
| +
|
| + TRANSPOSE_MATRIX r6, r7, r8, lr, r9, r10, r11, r12
|
| +
|
| + ldr lr, [sp, #8] ; load back (f)limit accumulator
|
| +
|
| + uqsub8 r6, r12, r11 ; q3 - q2
|
| + uqsub8 r7, r11, r12 ; q2 - q3
|
| + uqsub8 r12, r11, r10 ; q2 - q1
|
| + uqsub8 r11, r10, r11 ; q1 - q2
|
| + orr r6, r6, r7 ; abs (q3-q2)
|
| + orr r7, r12, r11 ; abs (q2-q1)
|
| + uqsub8 r6, r6, r2 ; compare to limit
|
| + uqsub8 r7, r7, r2 ; compare to limit
|
| + ldr r11, [sp, #4] ; load back p0
|
| + ldr r12, [sp, #12] ; load back p1
|
| + orr lr, lr, r6
|
| + orr lr, lr, r7
|
| +
|
| + uqsub8 r6, r11, r9 ; p0 - q0
|
| + uqsub8 r7, r9, r11 ; q0 - p0
|
| + uqsub8 r8, r12, r10 ; p1 - q1
|
| + uqsub8 r11, r10, r12 ; q1 - p1
|
| + orr r6, r6, r7 ; abs (p0-q0)
|
| + ldr r7, c0x7F7F7F7F
|
| + orr r8, r8, r11 ; abs (p1-q1)
|
| + uqadd8 r6, r6, r6 ; abs (p0-q0) * 2
|
| + and r8, r7, r8, lsr #1 ; abs (p1-q1) / 2
|
| + uqsub8 r11, r10, r9 ; q1 - q0
|
| + uqadd8 r6, r8, r6 ; abs (p0-q0)*2 + abs (p1-q1)/2
|
| + uqsub8 r12, r9, r10 ; q0 - q1
|
| + uqsub8 r6, r6, r4 ; compare to flimit
|
| +
|
| + orr r9, r11, r12 ; abs (q1-q0)
|
| + uqsub8 r8, r9, r2 ; compare to limit
|
| + uqsub8 r10, r9, r3 ; compare to thresh
|
| + orr lr, lr, r6
|
| + orr lr, lr, r8
|
| +
|
| + mvn r11, #0 ; r11 == -1
|
| + mov r12, #0
|
| +
|
| + usub8 lr, r12, lr
|
| + ldr r9, [sp] ; load the compared result
|
| + sel lr, r11, r12 ; filter mask: lr
|
| +
|
| + cmp lr, #0
|
| + beq mbvskip_filter ; skip filtering
|
| +
|
| +
|
| +
|
| + ;vp8_hevmask() function
|
| + ;calculate high edge variance
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + orr r9, r9, r10
|
| +
|
| + ldrh r7, [src, #-2]
|
| + ldrh r8, [src], pstep
|
| +
|
| + usub8 r9, r12, r9
|
| + sel r6, r12, r11 ; hev mask: r6
|
| +
|
| +
|
| + ; vp8_mbfilter() function
|
| + ; p2, q2 are only needed at the end. Don't need to load them in now.
|
| + ; Transpose needs 8 regs(r6 - r12, and lr). Save r6 and lr first
|
| + ; load soure data to r6, r11, r12, lr
|
| + ldrh r9, [src, #-2]
|
| + ldrh r10, [src], pstep
|
| +
|
| + pkhbt r12, r7, r8, lsl #16
|
| +
|
| + ldrh r7, [src, #-2]
|
| + ldrh r8, [src], pstep
|
| +
|
| + pkhbt r11, r9, r10, lsl #16
|
| +
|
| + ldrh r9, [src, #-2]
|
| + ldrh r10, [src], pstep
|
| +
|
| + str r6, [sp] ; save r6
|
| + str lr, [sp, #4] ; save lr
|
| +
|
| + pkhbt r6, r7, r8, lsl #16
|
| + pkhbt lr, r9, r10, lsl #16
|
| +
|
| + ;transpose r12, r11, r6, lr to p1, p0, q0, q1
|
| + TRANSPOSE_MATRIX r12, r11, r6, lr, r7, r8, r9, r10
|
| +
|
| + ;load back hev_mask r6 and filter_mask lr
|
| + ldr r12, c0x80808080
|
| + ldr r6, [sp]
|
| + ldr lr, [sp, #4]
|
| +
|
| + eor r7, r7, r12 ; ps1
|
| + eor r8, r8, r12 ; ps0
|
| + eor r9, r9, r12 ; qs0
|
| + eor r10, r10, r12 ; qs1
|
| +
|
| + qsub8 r12, r9, r8 ; vp8_signed_char_clamp(vp8_filter + 3 * ( qs0 - ps0))
|
| + str r7, [sp, #12] ; store ps1 temporarily
|
| + qsub8 r7, r7, r10 ; vp8_signed_char_clamp(ps1-qs1)
|
| + str r10, [sp, #8] ; store qs1 temporarily
|
| + qadd8 r7, r7, r12
|
| + str r9, [sp] ; store qs0 temporarily
|
| + qadd8 r7, r7, r12
|
| + str r8, [sp, #4] ; store ps0 temporarily
|
| + qadd8 r7, r7, r12 ; vp8_filter: r7
|
| +
|
| + ldr r10, c0x03030303 ; r10 = 3 --modified for vp8
|
| + ldr r9, c0x04040404
|
| + ;mvn r11, #0 ; r11 == -1
|
| +
|
| + and r7, r7, lr ; vp8_filter &= mask (lr is free)
|
| +
|
| + mov r12, r7 ; Filter2: r12
|
| + and r12, r12, r6 ; Filter2 &= hev
|
| +
|
| + ;modify code for vp8
|
| + ;save bottom 3 bits so that we round one side +4 and the other +3
|
| + qadd8 r8 , r12 , r9 ; Filter1 (r8) = vp8_signed_char_clamp(Filter2+4)
|
| + qadd8 r12 , r12 , r10 ; Filter2 (r12) = vp8_signed_char_clamp(Filter2+3)
|
| +
|
| + mov r10, #0
|
| + shadd8 r8 , r8 , r10 ; Filter1 >>= 3
|
| + shadd8 r12 , r12 , r10 ; Filter2 >>= 3
|
| + shadd8 r8 , r8 , r10
|
| + shadd8 r12 , r12 , r10
|
| + shadd8 r8 , r8 , r10 ; r8: Filter1
|
| + shadd8 r12 , r12 , r10 ; r12: Filter2
|
| +
|
| + ldr r9, [sp] ; load qs0
|
| + ldr r11, [sp, #4] ; load ps0
|
| +
|
| + qsub8 r9 , r9, r8 ; qs0 = vp8_signed_char_clamp(qs0 - Filter1)
|
| + qadd8 r11, r11, r12 ; ps0 = vp8_signed_char_clamp(ps0 + Filter2)
|
| +
|
| + ;save bottom 3 bits so that we round one side +4 and the other +3
|
| + ;and r8, r12, r10 ; s = Filter2 & 7 (s: r8)
|
| + ;qadd8 r12 , r12 , r9 ; Filter2 = vp8_signed_char_clamp(Filter2+4)
|
| + ;mov r10, #0
|
| + ;shadd8 r12 , r12 , r10 ; Filter2 >>= 3
|
| + ;usub8 lr, r8, r9 ; s = (s==4)*-1
|
| + ;sel lr, r11, r10
|
| + ;shadd8 r12 , r12 , r10
|
| + ;usub8 r8, r9, r8
|
| + ;sel r8, r11, r10
|
| + ;ldr r9, [sp] ; load qs0
|
| + ;ldr r11, [sp, #4] ; load ps0
|
| + ;shadd8 r12 , r12 , r10
|
| + ;and r8, r8, lr ; -1 for each element that equals 4
|
| + ;qadd8 r10, r8, r12 ; u = vp8_signed_char_clamp(s + Filter2)
|
| + ;qsub8 r9 , r9, r12 ; qs0 = vp8_signed_char_clamp(qs0 - Filter2)
|
| + ;qadd8 r11, r11, r10 ; ps0 = vp8_signed_char_clamp(ps0 + u)
|
| +
|
| + ;end of modification for vp8
|
| +
|
| + bic r12, r7, r6 ;vp8_filter &= ~hev ( r6 is free)
|
| + ;mov r12, r7
|
| +
|
| + ;roughly 3/7th difference across boundary
|
| + mov lr, #0x1b ; 27
|
| + mov r7, #0x3f ; 63
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r7, r10, lr, r7
|
| + smultb r10, r10, lr
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + add r10, r10, #63
|
| + ssat r7, #8, r7, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + ldr lr, c0x80808080
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r7, r10, lsl #16
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 27)>>7)
|
| +
|
| + qsub8 r8, r9, r10 ; s = vp8_signed_char_clamp(qs0 - u)
|
| + qadd8 r10, r11, r10 ; s = vp8_signed_char_clamp(ps0 + u)
|
| + eor r8, r8, lr ; *oq0 = s^0x80
|
| + eor r10, r10, lr ; *op0 = s^0x80
|
| +
|
| + strb r10, [src, #-1] ; store op0 result
|
| + strb r8, [src], pstep ; store oq0 result
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| + strb r10, [src, #-1]
|
| + strb r8, [src], pstep
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| + strb r10, [src, #-1]
|
| + strb r8, [src], pstep
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| + strb r10, [src, #-1]
|
| + strb r8, [src], pstep
|
| +
|
| + ;roughly 2/7th difference across boundary
|
| + mov lr, #0x12 ; 18
|
| + mov r7, #0x3f ; 63
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r9, r10, lr, r7
|
| +
|
| + smlatb r10, r10, lr, r7
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + ssat r9, #8, r9, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + sub src, src, pstep, lsl #2 ; move src pointer down by 4 lines
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r9, r10, lsl #16
|
| +
|
| + ldr r9, [sp, #8] ; load qs1
|
| + ldr r11, [sp, #12] ; load ps1
|
| + ldr lr, c0x80808080
|
| +
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + add src, src, #2
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 18)>>7)
|
| +
|
| + qsub8 r8, r9, r10 ; s = vp8_signed_char_clamp(qs1 - u)
|
| + qadd8 r10, r11, r10 ; s = vp8_signed_char_clamp(ps1 + u)
|
| + eor r8, r8, lr ; *oq1 = s^0x80
|
| + eor r10, r10, lr ; *op1 = s^0x80
|
| +
|
| + ldrb r11, [src, #-5] ; load p2 for 1/7th difference across boundary
|
| + strb r10, [src, #-4] ; store op1
|
| + strb r8, [src, #-1] ; store oq1
|
| + ldrb r9, [src], pstep ; load q2 for 1/7th difference across boundary
|
| +
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| +
|
| + ldrb r6, [src, #-5]
|
| + strb r10, [src, #-4]
|
| + strb r8, [src, #-1]
|
| + ldrb r7, [src], pstep
|
| +
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| + orr r11, r11, r6, lsl #8
|
| + orr r9, r9, r7, lsl #8
|
| +
|
| + ldrb r6, [src, #-5]
|
| + strb r10, [src, #-4]
|
| + strb r8, [src, #-1]
|
| + ldrb r7, [src], pstep
|
| +
|
| + mov r10, r10, lsr #8
|
| + mov r8, r8, lsr #8
|
| + orr r11, r11, r6, lsl #16
|
| + orr r9, r9, r7, lsl #16
|
| +
|
| + ldrb r6, [src, #-5]
|
| + strb r10, [src, #-4]
|
| + strb r8, [src, #-1]
|
| + ldrb r7, [src], pstep
|
| + orr r11, r11, r6, lsl #24
|
| + orr r9, r9, r7, lsl #24
|
| +
|
| + ;roughly 1/7th difference across boundary
|
| + eor r9, r9, lr
|
| + eor r11, r11, lr
|
| +
|
| + mov lr, #0x9 ; 9
|
| + mov r7, #0x3f ; 63
|
| +
|
| + sxtb16 r6, r12
|
| + sxtb16 r10, r12, ror #8
|
| + smlabb r8, r6, lr, r7
|
| + smlatb r6, r6, lr, r7
|
| + smlabb r12, r10, lr, r7
|
| + smlatb r10, r10, lr, r7
|
| + ssat r8, #8, r8, asr #7
|
| + ssat r6, #8, r6, asr #7
|
| + ssat r12, #8, r12, asr #7
|
| + ssat r10, #8, r10, asr #7
|
| +
|
| + sub src, src, pstep, lsl #2
|
| +
|
| + pkhbt r6, r8, r6, lsl #16
|
| + pkhbt r10, r12, r10, lsl #16
|
| +
|
| + uxtb16 r6, r6
|
| + uxtb16 r10, r10
|
| +
|
| + ldr lr, c0x80808080
|
| +
|
| + orr r10, r6, r10, lsl #8 ; u = vp8_signed_char_clamp((63 + Filter2 * 9)>>7)
|
| +
|
| + qadd8 r8, r11, r10 ; s = vp8_signed_char_clamp(ps2 + u)
|
| + qsub8 r10, r9, r10 ; s = vp8_signed_char_clamp(qs2 - u)
|
| + eor r8, r8, lr ; *op2 = s^0x80
|
| + eor r10, r10, lr ; *oq2 = s^0x80
|
| +
|
| + strb r8, [src, #-5] ; store *op2
|
| + strb r10, [src], pstep ; store *oq2
|
| + mov r8, r8, lsr #8
|
| + mov r10, r10, lsr #8
|
| + strb r8, [src, #-5]
|
| + strb r10, [src], pstep
|
| + mov r8, r8, lsr #8
|
| + mov r10, r10, lsr #8
|
| + strb r8, [src, #-5]
|
| + strb r10, [src], pstep
|
| + mov r8, r8, lsr #8
|
| + mov r10, r10, lsr #8
|
| + strb r8, [src, #-5]
|
| + strb r10, [src], pstep
|
| +
|
| + ;adjust src pointer for next loop
|
| + sub src, src, #2
|
| +
|
| +|mbvskip_filter|
|
| + sub src, src, #4
|
| + subs count, count, #1
|
| +
|
| + pld [src, #23] ; preload for next block
|
| + ldrne r6, [src], pstep ; load source data
|
| + pld [src, #23]
|
| + ldrne r7, [src], pstep
|
| + pld [src, #23]
|
| + ldrne r8, [src], pstep
|
| + pld [src, #23]
|
| + ldrne lr, [src], pstep
|
| +
|
| + bne MBVnext8
|
| +
|
| + add sp, sp, #16
|
| +
|
| + ldmia sp!, {r4 - r11, pc}
|
| + ENDP ; |vp8_mbloop_filter_vertical_edge_armv6|
|
| +
|
| +; Constant Pool
|
| +c0x80808080 DCD 0x80808080
|
| +c0x03030303 DCD 0x03030303
|
| +c0x04040404 DCD 0x04040404
|
| +c0x01010101 DCD 0x01010101
|
| +c0x7F7F7F7F DCD 0x7F7F7F7F
|
| +
|
| + END
|
|
|