@/****************************************************************************** @ * @ * Copyright (C) 2015 The Android Open Source Project @ * @ * Licensed under the Apache License, Version 2.0 (the "License"); @ * you may not use this file except in compliance with the License. @ * You may obtain a copy of the License at: @ * @ * http://www.apache.org/licenses/LICENSE-2.0 @ * @ * Unless required by applicable law or agreed to in writing, software @ * distributed under the License is distributed on an "AS IS" BASIS, @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @ * See the License for the specific language governing permissions and @ * limitations under the License. @ * @ ***************************************************************************** @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore @*/ @** @****************************************************************************** @* @file @* ih264_intra_pred_luma_4x4_a9q.s @* @* @brief @* Contains function definitions for intra 4x4 Luma prediction . @* @* @author @* Ittiam @* @* @par List of Functions: @* @* -ih264_intra_pred_luma_4x4_mode_vert_a9q @* -ih264_intra_pred_luma_4x4_mode_horz_a9q @* -ih264_intra_pred_luma_4x4_mode_dc_a9q @* -ih264_intra_pred_luma_4x4_mode_diag_dl_a9q @* -ih264_intra_pred_luma_4x4_mode_diag_dr_a9q @* -ih264_intra_pred_luma_4x4_mode_vert_r_a9q @* -ih264_intra_pred_luma_4x4_mode_horz_d_a9q @* -ih264_intra_pred_luma_4x4_mode_vert_l_a9q @* -ih264_intra_pred_luma_4x4_mode_horz_u_a9q @* @* @remarks @* None @* @******************************************************************************* @* @* All the functions here are replicated from ih264_intra_pred_filters.c @ .text .p2align 2 @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_vert @* @* @brief @* Perform Intra prediction for luma_4x4 mode:vertical @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:vertical ,described in sec 8.3.1.2.1 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels(Not used in this function) @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_vert(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_vert_a9q ih264_intra_pred_luma_4x4_mode_vert_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack add r0, r0, #5 vld1.32 d0[0], [r0] vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @****************************************************************************** @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_horz @* @* @brief @* Perform Intra prediction for luma_4x4 mode:horizontal @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:horizontal ,described in sec 8.3.1.2.2 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels(Not used in this function) @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @* @void ih264_intra_pred_luma_4x4_mode_horz(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_horz_a9q ih264_intra_pred_luma_4x4_mode_horz_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack add r0, r0, #3 mov r2 , #-1 ldrb r5, [r0], r2 vdup.u8 d0, r5 ldrb r6, [r0], r2 vst1.32 d0[0], [r1], r3 vdup.u8 d1, r6 ldrb r7, [r0], r2 vst1.32 d1[0], [r1], r3 vdup.u8 d2, r7 ldrb r8, [r0], r2 vst1.32 d2[0], [r1], r3 vdup.u8 d3, r8 vst1.32 d3[0], [r1], r3 ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @****************************************************************************** @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_dc @* @* @brief @* Perform Intra prediction for luma_4x4 mode:DC @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:DC ,described in sec 8.3.1.2.3 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_dc(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_dc_a9q ih264_intra_pred_luma_4x4_mode_dc_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack ldr r4, [sp, #40] @ r4 => ui_neighboravailability ands r5, r4, #0x01 beq top_available @LEFT NOT AVAILABLE add r10, r0, #3 mov r2, #-1 ldrb r5, [r10], r2 ldrb r6, [r10], r2 ldrb r7, [r10], r2 add r5, r5, r6 ldrb r8, [r10], r2 add r5, r5, r7 ands r11, r4, #0x04 @ CHECKING IF TOP_AVAILABLE ELSE BRANCHING TO ONLY LEFT AVAILABLE add r5, r5, r8 beq left_available add r10, r0, #5 @ BOTH LEFT AND TOP AVAILABLE ldrb r6, [r10], #1 ldrb r7, [r10], #1 add r5, r5, r6 ldrb r8, [r10], #1 add r5, r5, r7 ldrb r9, [r10], #1 add r5, r5, r8 add r5, r5, r9 add r5, r5, #4 lsr r5, r5, #3 vdup.u8 d0, r5 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 b end_func top_available: @ ONLT TOP AVAILABLE ands r11, r4, #0x04 @ CHECKING TOP AVAILABILTY OR ELSE BRANCH TO NONE AVAILABLE beq none_available add r10, r0, #5 ldrb r6, [r10], #1 ldrb r7, [r10], #1 ldrb r8, [r10], #1 add r5, r6, r7 ldrb r9, [r10], #1 add r5, r5, r8 add r5, r5, r9 add r5, r5, #2 lsr r5, r5, #2 vdup.u8 d0, r5 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 b end_func left_available: @ONLY LEFT AVAILABLE add r5, r5, #2 lsr r5, r5, #2 vdup.u8 d0, r5 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 b end_func none_available: @NONE AVAILABLE mov r5, #128 vdup.u8 d0, r5 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 vst1.32 d0[0], [r1], r3 b end_func end_func: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_diag_dl @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Left ,described in sec 8.3.1.2.4 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_diag_dl(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_diag_dl_a9q ih264_intra_pred_luma_4x4_mode_diag_dl_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack add r0, r0, #5 sub r5, r3, #2 add r6, r0, #7 vld1.8 {d0}, [r0] vext.8 d1, d0, d0, #1 vext.8 d2, d0, d0, #2 vld1.8 {d2[6]}, [r6] vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d3, q12, #2 vst1.32 {d3[0]}, [r1], r3 vext.8 d4, d3, d3, #1 vst1.32 {d4[0]}, [r1], r3 vst1.16 {d3[1]}, [r1]! vst1.16 {d3[2]}, [r1], r5 vst1.16 {d4[1]}, [r1]! vst1.16 {d4[2]}, [r1] end_func_diag_dl: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_diag_dr @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Diagonal_Down_Right ,described in sec 8.3.1.2.5 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_diag_dr(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_diag_dr_a9q ih264_intra_pred_luma_4x4_mode_diag_dr_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack vld1.u8 {d0}, [r0] add r0, r0, #1 vld1.u8 {d1}, [r0] vext.8 d2, d1, d1, #1 vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d3, q12, #2 vext.8 d4, d3, d3, #1 sub r5, r3, #2 vst1.16 {d4[1]}, [r1]! vst1.16 {d4[2]}, [r1], r5 vst1.16 {d3[1]}, [r1]! vst1.16 {d3[2]}, [r1], r5 vst1.32 {d4[0]}, [r1], r3 vst1.32 {d3[0]}, [r1], r3 end_func_diag_dr: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_vert_r @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Vertical_Right @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Vertical_Right ,described in sec 8.3.1.2.6 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_vert_r(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_vert_r_a9q ih264_intra_pred_luma_4x4_mode_vert_r_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack vld1.u8 {d0}, [r0] add r0, r0, #1 vld1.u8 {d1}, [r0] vext.8 d2, d1, d1, #1 vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d4, q10, #1 vqrshrun.s16 d3, q12, #2 sub r5, r3, #2 vext.8 d5, d3, d3, #3 vst1.32 {d4[1]}, [r1], r3 vst1.32 {d5[0]}, [r1], r3 sub r8, r3, #3 vst1.u8 {d3[2]}, [r1]! vst1.16 {d4[2]}, [r1]! vst1.u8 {d4[6]}, [r1], r8 vst1.u8 {d3[1]}, [r1]! vst1.16 {d5[0]}, [r1]! vst1.u8 {d5[2]}, [r1] end_func_vert_r: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_horz_d @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Horizontal_Down @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Horizontal_Down ,described in sec 8.3.1.2.7 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_horz_d(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_horz_d_a9q ih264_intra_pred_luma_4x4_mode_horz_d_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack vld1.u8 {d0}, [r0] add r0, r0, #1 vld1.u8 {d1}, [r0] vext.8 d2, d1, d0, #1 vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d4, q10, #1 vqrshrun.s16 d5, q12, #2 sub r5, r3, #2 vmov.8 d6, d5 vtrn.8 d4, d5 @ vst1.u16 {d5[1]}, [r1]! vst1.16 {d6[2]}, [r1], r5 vst1.u16 {d4[1]}, [r1]! vst1.16 {d5[1]}, [r1], r5 vst1.u16 {d5[0]}, [r1]! vst1.16 {d4[1]}, [r1], r5 vst1.u16 {d4[0]}, [r1]! vst1.16 {d5[0]}, [r1], r5 end_func_horz_d: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_vert_l @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Vertical_Left @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Vertical_Left ,described in sec 8.3.1.2.8 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_vert_l(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_vert_l_a9q ih264_intra_pred_luma_4x4_mode_vert_l_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack add r0, r0, #4 vld1.u8 {d0}, [r0] add r0, r0, #1 vld1.u8 {d1}, [r0] vext.8 d2, d1, d0, #1 vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d4, q10, #1 vqrshrun.s16 d5, q12, #2 vext.8 d6, d4, d4, #1 vext.8 d7, d5, d5, #1 vst1.32 {d6[0]}, [r1], r3 vext.8 d16, d4, d4, #2 vext.8 d17, d5, d5, #2 vst1.32 {d7[0]}, [r1], r3 vst1.32 {d16[0]}, [r1], r3 vst1.32 {d17[0]}, [r1], r3 end_func_vert_l: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack @** @******************************************************************************* @* @*ih264_intra_pred_luma_4x4_mode_horz_u @* @* @brief @* Perform Intra prediction for luma_4x4 mode:Horizontal_Up @* @* @par Description: @* Perform Intra prediction for luma_4x4 mode:Horizontal_Up ,described in sec 8.3.1.2.9 @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[out] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] src_strd @* integer source stride @* @* @param[in] dst_strd @* integer destination stride @* @* @param[in] ui_neighboravailability @* availability of neighbouring pixels @* @* @returns @* @* @remarks @* None @* @******************************************************************************* @void ih264_intra_pred_luma_4x4_mode_horz_u(UWORD8 *pu1_src, @ UWORD8 *pu1_dst, @ WORD32 src_strd, @ WORD32 dst_strd, @ WORD32 ui_neighboravailability) @**************Variables Vs Registers***************************************** @ r0 => *pu1_src @ r1 => *pu1_dst @ r2 => src_strd @ r3 => dst_strd @ r4 => ui_neighboravailability .global ih264_intra_pred_luma_4x4_mode_horz_u_a9q ih264_intra_pred_luma_4x4_mode_horz_u_a9q: stmfd sp!, {r4-r12, r14} @store register values to stack mov r10, r0 vld1.u8 {d0}, [r0] ldrb r9, [r0], #1 vext.8 d1, d0, d0, #1 vld1.u8 {d0[7]}, [r10] vext.8 d2, d1, d1, #1 vaddl.u8 q10, d0, d1 vaddl.u8 q11, d1, d2 vadd.u16 q12, q10, q11 vqrshrun.s16 d4, q10, #1 vqrshrun.s16 d5, q12, #2 vmov d6, d4 vext.8 d6, d5, d4, #1 vst1.8 {d4[2]}, [r1]! vst1.8 {d6[0]}, [r1]! vtrn.8 d6, d5 @ sub r5, r3, #2 vtrn.8 d4, d6 @ vdup.8 d7, r9 vst1.16 {d6[0]}, [r1], r5 vst1.16 {d6[0]}, [r1]! vst1.16 {d5[3]}, [r1], r5 vst1.16 {d5[3]}, [r1]! vst1.16 {d7[3]}, [r1], r5 vst1.32 {d7[0]}, [r1], r3 end_func_horz_u: ldmfd sp!, {r4-r12, pc} @Restoring registers from stack