From 30e5deae5da1c8d6ad73a58d69f16c6d6330a6b9 Mon Sep 17 00:00:00 2001 From: Johann Date: Tue, 2 Aug 2011 19:20:27 -0400 Subject: [PATCH] update extend frame borders the neon code made several assumptions which were broken by a recent change: https://review.webmproject.org/2676 update the code with new assumptions and guard them with a compile time assert Change-Id: I32a8378030759966068f34618d7b4b1b02e101a0 --- vp8/common/asm_com_offsets.c | 8 + .../vp8_vpxyv12_extendframeborders_neon.asm | 403 +++--------------- 2 files changed, 68 insertions(+), 343 deletions(-) diff --git a/vp8/common/asm_com_offsets.c b/vp8/common/asm_com_offsets.c index e167d2654..e135a4d78 100644 --- a/vp8/common/asm_com_offsets.c +++ b/vp8/common/asm_com_offsets.c @@ -9,6 +9,8 @@ */ +#include "vpx_config.h" +#include "vpx/vpx_codec.h" #include "vpx_ports/asm_offsets.h" #include "vpx_scale/yv12config.h" @@ -25,8 +27,14 @@ DEFINE(yv12_buffer_config_y_buffer, offsetof(YV12_BUFFER_CONFIG, y_b DEFINE(yv12_buffer_config_u_buffer, offsetof(YV12_BUFFER_CONFIG, u_buffer)); DEFINE(yv12_buffer_config_v_buffer, offsetof(YV12_BUFFER_CONFIG, v_buffer)); DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border)); +DEFINE(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS); END /* add asserts for any offset that is not supported by assembly code */ /* add asserts for any size that is not supported by assembly code */ + +#if HAVE_ARMV7 +/* vp8_yv12_extend_frame_borders_neon makes several assumptions based on this */ +ct_assert(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS == 32) +#endif diff --git a/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm b/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm index b0a3b93a2..8444b8e03 100644 --- a/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm +++ b/vpx_scale/arm/neon/vp8_vpxyv12_extendframeborders_neon.asm @@ -18,42 +18,32 @@ AREA ||.text||, CODE, READONLY, ALIGN=2 ;void vp8_yv12_extend_frame_borders_neon (YV12_BUFFER_CONFIG *ybf); -;Note: this is VP8 function, which has border=32 and 16. Internal y_width and y_height -; are always multiples of 16. +; we depend on VP8BORDERINPIXELS being 32 |vp8_yv12_extend_frame_borders_neon| PROC push {r4 - r10, lr} vpush {d8 - d15} - ;Not need to load y_width, since: y_width = y_stride - 2*border - ldr r3, [r0, #yv12_buffer_config_border] - ldr r1, [r0, #yv12_buffer_config_y_buffer] ;srcptr1 - ldr r4, [r0, #yv12_buffer_config_y_height] - ldr lr, [r0, #yv12_buffer_config_y_stride] + ; Border = 32 + ldr r3, [r0, #yv12_buffer_config_y_width] ; plane_width + ldr r1, [r0, #yv12_buffer_config_y_buffer] ; src_ptr1 + ldr r4, [r0, #yv12_buffer_config_y_height] ; plane_height + ldr lr, [r0, #yv12_buffer_config_y_stride] ; plane_stride - cmp r3, #16 - beq b16_extend_frame_borders +; Border copy for Y plane +; copy the left and right most columns out + add r6, r1, r3 ; dest_ptr2 = src_ptr2 + 1 (src_ptr1 + plane_width) + sub r2, r6, #1 ; src_ptr2 = src_ptr1 + plane_width - 1 + sub r5, r1, #32 ; dest_ptr1 = src_ptr1 - Border -;======================= -b32_extend_frame_borders -;border = 32 -;======================= -;Border copy for Y plane -;copy the left and right most columns out - sub r5, r1, r3 ;destptr1 - add r6, r1, lr - sub r6, r6, r3, lsl #1 ;destptr2 - sub r2, r6, #1 ;srcptr2 - - ;Do four rows at one time - mov r12, r4, lsr #2 + mov r12, r4, lsr #2 ; plane_height / 4 copy_left_right_y vld1.8 {d0[], d1[]}, [r1], lr vld1.8 {d4[], d5[]}, [r2], lr vld1.8 {d8[], d9[]}, [r1], lr vld1.8 {d12[], d13[]}, [r2], lr - vld1.8 {d16[], d17[]}, [r1], lr + vld1.8 {d16[], d17[]}, [r1], lr vld1.8 {d20[], d21[]}, [r2], lr vld1.8 {d24[], d25[]}, [r1], lr vld1.8 {d28[], d29[]}, [r2], lr @@ -81,15 +71,16 @@ copy_left_right_y bne copy_left_right_y ;Now copy the top and bottom source lines into each line of the respective borders - ldr r7, [r0, #yv12_buffer_config_y_buffer] ;srcptr1 - mul r8, r3, lr + ldr r1, [r0, #yv12_buffer_config_y_buffer] ; y_buffer + mul r8, r4, lr ; plane_height * plane_stride - mov r12, lr, lsr #7 + ; copy width is plane_stride + mov r12, lr, lsr #7 ; plane_stride / 128 - sub r6, r1, r3 ;destptr2 - sub r2, r6, lr ;srcptr2 - sub r1, r7, r3 ;srcptr1 - sub r5, r1, r8 ;destptr1 + sub r1, r1, #32 ; src_ptr1 = y_buffer - Border + add r6, r1, r8 ; dest_ptr2 = src_ptr2 - plane_stride (src_ptr1 + (plane_height * plane_stride)) + sub r2, r6, lr ; src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride + sub r5, r1, lr, asl #5 ; dest_ptr1 = src_ptr1 - (Border * plane_stride) copy_top_bottom_y vld1.8 {q0, q1}, [r1]! @@ -101,7 +92,7 @@ copy_top_bottom_y vld1.8 {q6, q7}, [r1]! vld1.8 {q14, q15}, [r2]! - mov r7, r3 + mov r7, #32 ; Border top_bottom_32 subs r7, r7, #1 @@ -115,44 +106,41 @@ top_bottom_32 vst1.8 {q6, q7}, [r5]! vst1.8 {q14, q15}, [r6]! - add r5, r5, lr - sub r5, r5, #128 - add r6, r6, lr - sub r6, r6, #128 + add r5, r5, lr ; dest_ptr1 += plane_stride + sub r5, r5, #128 ; dest_ptr1 -= 128 + add r6, r6, lr ; dest_ptr2 += plane_stride + sub r6, r6, #128 ; dest_ptr2 -= 128 bne top_bottom_32 - sub r5, r1, r8 - add r6, r2, lr + sub r5, r1, lr, asl #5 ; src_ptr1 - (Border* plane_stride) + add r6, r2, lr ; src_ptr2 + plane_stride subs r12, r12, #1 bne copy_top_bottom_y - mov r7, lr, lsr #4 ;check to see if extra copy is needed + mov r7, lr, lsr #4 ; check to see if extra copy is needed ands r7, r7, #0x7 bne extra_top_bottom_y end_of_border_copy_y ;Border copy for U, V planes - ldr r1, [r0, #yv12_buffer_config_u_buffer] ;srcptr1 - mov lr, lr, lsr #1 ;uv_stride - mov r3, r3, lsr #1 ;border - mov r4, r4, lsr #1 ;uv_height - mov r8, r8, lsr #2 +; Border = 16 + ldr r7, [r0, #yv12_buffer_config_u_buffer] ; src_ptr1 + ldr lr, [r0, #yv12_buffer_config_uv_stride] ; plane_stride + ldr r3, [r0, #yv12_buffer_config_uv_width] ; plane_width + ldr r4, [r0, #yv12_buffer_config_uv_height] ; plane_height mov r10, #2 ;copy the left and right most columns out border_copy_uv - sub r5, r1, r3 ;destptr1 - add r6, r1, lr - sub r6, r6, r3, lsl #1 ;destptr2 - sub r2, r6, #1 ;srcptr2 + mov r1, r7 ; src_ptr1 needs to be saved for second half of loop + sub r5, r1, #16 ; dest_ptr1 = src_ptr1 - Border + add r6, r1, r3 ; dest_ptr2 = src_ptr2 + 1 (src_ptr1 + plane_width) + sub r2, r6, #1 ; src_ptr2 = src_ptr1 + plane_width - 1 - mov r7, r1 - - ;Do eight rows at one time - mov r12, r4, lsr #3 + mov r12, r4, lsr #3 ; plane_height / 8 copy_left_right_uv vld1.8 {d0[], d1[]}, [r1], lr @@ -167,7 +155,7 @@ copy_left_right_uv vld1.8 {d18[], d19[]}, [r2], lr vld1.8 {d20[], d21[]}, [r1], lr vld1.8 {d22[], d23[]}, [r2], lr - vld1.8 {d24[], d25[]}, [r1], lr + vld1.8 {d24[], d25[]}, [r1], lr vld1.8 {d26[], d27[]}, [r2], lr vld1.8 {d28[], d29[]}, [r1], lr vld1.8 {d30[], d31[]}, [r2], lr @@ -194,12 +182,14 @@ copy_left_right_uv bne copy_left_right_uv ;Now copy the top and bottom source lines into each line of the respective borders - mov r12, lr, lsr #6 + mov r1, r7 + mul r8, r4, lr ; plane_height * plane_stride + mov r12, lr, lsr #6 ; plane_stride / 64 - sub r6, r1, r3 ;destptr2 - sub r2, r6, lr ;srcptr2 - sub r1, r7, r3 ;srcptr1 - sub r5, r1, r8 ;destptr1 + sub r1, r1, #16 ; src_ptr1 = u_buffer - Border + add r6, r1, r8 ; dest_ptr2 = src_ptr2 + plane_stride (src_ptr1 + (plane_height * plane_stride) + sub r2, r6, lr ; src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride + sub r5, r1, lr, asl #4 ; dest_ptr1 = src_ptr1 - (Border * plane_stride) copy_top_bottom_uv vld1.8 {q0, q1}, [r1]! @@ -207,7 +197,7 @@ copy_top_bottom_uv vld1.8 {q2, q3}, [r1]! vld1.8 {q10, q11}, [r2]! - mov r7, r3 + mov r7, #16 ; Border top_bottom_16 subs r7, r7, #1 @@ -217,38 +207,37 @@ top_bottom_16 vst1.8 {q2, q3}, [r5]! vst1.8 {q10, q11}, [r6]! - add r5, r5, lr + add r5, r5, lr ; dest_ptr1 += plane_stride sub r5, r5, #64 - add r6, r6, lr + add r6, r6, lr ; dest_ptr2 += plane_stride sub r6, r6, #64 bne top_bottom_16 - sub r5, r1, r8 - add r6, r2, lr + sub r5, r1, lr, asl #4 ; dest_ptr1 = src_ptr1 - (Border * plane_stride) + add r6, r2, lr ; dest_ptr2 = src_ptr2 + plane_stride subs r12, r12, #1 bne copy_top_bottom_uv - mov r7, lr, lsr #3 ;check to see if extra copy is needed + mov r7, lr, lsr #3 ; check to see if extra copy is needed ands r7, r7, #0x7 bne extra_top_bottom_uv end_of_border_copy_uv subs r10, r10, #1 - ldrne r1, [r0, #yv12_buffer_config_v_buffer] ;srcptr1 + ldrne r7, [r0, #yv12_buffer_config_v_buffer] ; src_ptr1 bne border_copy_uv vpop {d8 - d15} pop {r4 - r10, pc} ;;;;;;;;;;;;;;;;;;;;;; -;extra copy part for Y extra_top_bottom_y vld1.8 {q0}, [r1]! vld1.8 {q2}, [r2]! - mov r9, r3, lsr #3 + mov r9, #4 ; 32 >> 3 extra_top_bottom_32 subs r9, r9, #1 @@ -271,19 +260,18 @@ extra_top_bottom_32 vst1.8 {q2}, [r6], lr bne extra_top_bottom_32 - sub r5, r1, r8 - add r6, r2, lr + sub r5, r1, lr, asl #5 ; src_ptr1 - (Border * plane_stride) + add r6, r2, lr ; src_ptr2 + plane_stride subs r7, r7, #1 bne extra_top_bottom_y b end_of_border_copy_y -;extra copy part for UV extra_top_bottom_uv vld1.8 {d0}, [r1]! vld1.8 {d8}, [r2]! - mov r9, r3, lsr #3 + mov r9, #2 ; 16 >> 3 extra_top_bottom_16 subs r9, r9, #1 @@ -306,283 +294,12 @@ extra_top_bottom_16 vst1.8 {d8}, [r6], lr bne extra_top_bottom_16 - sub r5, r1, r8 - add r6, r2, lr + sub r5, r1, lr, asl #4 ; src_ptr1 - (Border * plane_stride) + add r6, r2, lr ; src_ptr2 + plane_stride subs r7, r7, #1 bne extra_top_bottom_uv b end_of_border_copy_uv - -;======================= -b16_extend_frame_borders -;border = 16 -;======================= -;Border copy for Y plane -;copy the left and right most columns out - sub r5, r1, r3 ;destptr1 - add r6, r1, lr - sub r6, r6, r3, lsl #1 ;destptr2 - sub r2, r6, #1 ;srcptr2 - - ;Do four rows at one time - mov r12, r4, lsr #2 - -copy_left_right_y_b16 - vld1.8 {d0[], d1[]}, [r1], lr - vld1.8 {d4[], d5[]}, [r2], lr - vld1.8 {d8[], d9[]}, [r1], lr - vld1.8 {d12[], d13[]}, [r2], lr - vld1.8 {d16[], d17[]}, [r1], lr - vld1.8 {d20[], d21[]}, [r2], lr - vld1.8 {d24[], d25[]}, [r1], lr - vld1.8 {d28[], d29[]}, [r2], lr - - subs r12, r12, #1 - - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q4}, [r5], lr - vst1.8 {q6}, [r6], lr - vst1.8 {q8}, [r5], lr - vst1.8 {q10}, [r6], lr - vst1.8 {q12}, [r5], lr - vst1.8 {q14}, [r6], lr - - bne copy_left_right_y_b16 - -;Now copy the top and bottom source lines into each line of the respective borders - ldr r7, [r0, #yv12_buffer_config_y_buffer] ;srcptr1 - mul r8, r3, lr - - mov r12, lr, lsr #7 - - sub r6, r1, r3 ;destptr2 - sub r2, r6, lr ;srcptr2 - sub r1, r7, r3 ;srcptr1 - sub r5, r1, r8 ;destptr1 - -copy_top_bottom_y_b16 - vld1.8 {q0, q1}, [r1]! - vld1.8 {q8, q9}, [r2]! - vld1.8 {q2, q3}, [r1]! - vld1.8 {q10, q11}, [r2]! - vld1.8 {q4, q5}, [r1]! - vld1.8 {q12, q13}, [r2]! - vld1.8 {q6, q7}, [r1]! - vld1.8 {q14, q15}, [r2]! - - mov r7, r3 - -top_bottom_16_b16 - subs r7, r7, #1 - - vst1.8 {q0, q1}, [r5]! - vst1.8 {q8, q9}, [r6]! - vst1.8 {q2, q3}, [r5]! - vst1.8 {q10, q11}, [r6]! - vst1.8 {q4, q5}, [r5]! - vst1.8 {q12, q13}, [r6]! - vst1.8 {q6, q7}, [r5]! - vst1.8 {q14, q15}, [r6]! - - add r5, r5, lr - sub r5, r5, #128 - add r6, r6, lr - sub r6, r6, #128 - - bne top_bottom_16_b16 - - sub r5, r1, r8 - add r6, r2, lr - - subs r12, r12, #1 - bne copy_top_bottom_y_b16 - - mov r7, lr, lsr #4 ;check to see if extra copy is needed - ands r7, r7, #0x7 - bne extra_top_bottom_y_b16 -end_of_border_copy_y_b16 - -;Border copy for U, V planes - ldr r1, [r0, #yv12_buffer_config_u_buffer] ;srcptr1 - mov lr, lr, lsr #1 ;uv_stride - mov r3, r3, lsr #1 ;border - mov r4, r4, lsr #1 ;uv_height - mov r8, r8, lsr #2 - - mov r10, #2 - -;copy the left and right most columns out -border_copy_uv_b16 - sub r5, r1, r3 ;destptr1 - add r6, r1, lr - sub r6, r6, r3, lsl #1 ;destptr2 - sub r2, r6, #1 ;srcptr2 - - mov r7, r1 - - ;Do eight rows at one time - mov r12, r4, lsr #3 - -copy_left_right_uv_b16 - vld1.8 {d0[]}, [r1], lr - vld1.8 {d2[]}, [r2], lr - vld1.8 {d4[]}, [r1], lr - vld1.8 {d6[]}, [r2], lr - vld1.8 {d8[]}, [r1], lr - vld1.8 {d10[]}, [r2], lr - vld1.8 {d12[]}, [r1], lr - vld1.8 {d14[]}, [r2], lr - vld1.8 {d16[]}, [r1], lr - vld1.8 {d18[]}, [r2], lr - vld1.8 {d20[]}, [r1], lr - vld1.8 {d22[]}, [r2], lr - vld1.8 {d24[]}, [r1], lr - vld1.8 {d26[]}, [r2], lr - vld1.8 {d28[]}, [r1], lr - vld1.8 {d30[]}, [r2], lr - - subs r12, r12, #1 - - vst1.8 {d0}, [r5], lr - vst1.8 {d2}, [r6], lr - vst1.8 {d4}, [r5], lr - vst1.8 {d6}, [r6], lr - vst1.8 {d8}, [r5], lr - vst1.8 {d10}, [r6], lr - vst1.8 {d12}, [r5], lr - vst1.8 {d14}, [r6], lr - vst1.8 {d16}, [r5], lr - vst1.8 {d18}, [r6], lr - vst1.8 {d20}, [r5], lr - vst1.8 {d22}, [r6], lr - vst1.8 {d24}, [r5], lr - vst1.8 {d26}, [r6], lr - vst1.8 {d28}, [r5], lr - vst1.8 {d30}, [r6], lr - - bne copy_left_right_uv_b16 - -;Now copy the top and bottom source lines into each line of the respective borders - mov r12, lr, lsr #6 - - sub r6, r1, r3 ;destptr2 - sub r2, r6, lr ;srcptr2 - sub r1, r7, r3 ;srcptr1 - sub r5, r1, r8 ;destptr1 - -copy_top_bottom_uv_b16 - vld1.8 {q0, q1}, [r1]! - vld1.8 {q8, q9}, [r2]! - vld1.8 {q2, q3}, [r1]! - vld1.8 {q10, q11}, [r2]! - - mov r7, r3 - -top_bottom_8_b16 - subs r7, r7, #1 - - vst1.8 {q0, q1}, [r5]! - vst1.8 {q8, q9}, [r6]! - vst1.8 {q2, q3}, [r5]! - vst1.8 {q10, q11}, [r6]! - - add r5, r5, lr - sub r5, r5, #64 - add r6, r6, lr - sub r6, r6, #64 - - bne top_bottom_8_b16 - - sub r5, r1, r8 - add r6, r2, lr - - subs r12, r12, #1 - bne copy_top_bottom_uv_b16 - - mov r7, lr, lsr #3 ;check to see if extra copy is needed - ands r7, r7, #0x7 - bne extra_top_bottom_uv_b16 - -end_of_border_copy_uv_b16 - subs r10, r10, #1 - ldrne r1, [r0, #yv12_buffer_config_v_buffer] ;srcptr1 - bne border_copy_uv_b16 - - vpop {d8-d15} - pop {r4 - r10, pc} - -;;;;;;;;;;;;;;;;;;;;;; -;extra copy part for Y -extra_top_bottom_y_b16 - vld1.8 {q0}, [r1]! - vld1.8 {q2}, [r2]! - - mov r9, r3, lsr #3 - -extra_top_bottom_16_b16 - subs r9, r9, #1 - - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - vst1.8 {q0}, [r5], lr - vst1.8 {q2}, [r6], lr - bne extra_top_bottom_16_b16 - - sub r5, r1, r8 - add r6, r2, lr - subs r7, r7, #1 - bne extra_top_bottom_y_b16 - - b end_of_border_copy_y_b16 - -;extra copy part for UV -extra_top_bottom_uv_b16 - vld1.8 {d0}, [r1]! - vld1.8 {d8}, [r2]! - - mov r9, r3, lsr #3 - -extra_top_bottom_8_b16 - subs r9, r9, #1 - - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - vst1.8 {d0}, [r5], lr - vst1.8 {d8}, [r6], lr - bne extra_top_bottom_8_b16 - - sub r5, r1, r8 - add r6, r2, lr - subs r7, r7, #1 - bne extra_top_bottom_uv_b16 - - b end_of_border_copy_uv_b16 - ENDP END -- 2.40.0