| @ |
| @ Copyright (C) 2009 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. |
| @ |
| |
| #include "asm_common.S" |
| |
| PRESERVE8 |
| |
| .fpu neon |
| .text |
| |
| /* Input / output registers */ |
| |
| #define ref r0 |
| #define fill r1 |
| #define left r2 |
| #define tmp2 r2 |
| #define center r3 |
| #define right r4 |
| #define tmp1 r5 |
| |
| /* -- NEON registers -- */ |
| |
| #define qTmp0 Q0 |
| #define qTmp1 Q1 |
| #define dTmp0 D0 |
| #define dTmp1 D1 |
| #define dTmp2 D2 |
| #define dTmp3 D3 |
| |
| /* |
| void h264bsdFillRow7(const u8 * ref, u8 * fill, i32 left, i32 center, |
| i32 right); |
| */ |
| |
| function h264bsdFillRow7, export=1 |
| |
| PUSH {r4-r6,lr} |
| CMP left, #0 |
| LDR right, [sp,#0x10] |
| BEQ switch_center |
| LDRB tmp1, [ref,#0] |
| |
| loop_left: |
| SUBS left, left, #1 |
| STRB tmp1, [fill], #1 |
| BNE loop_left |
| |
| switch_center: |
| ASR tmp2,center,#2 |
| CMP tmp2,#9 |
| ADDCC pc,pc,tmp2,LSL #2 |
| B loop_center |
| B loop_center |
| B case_1 |
| B case_2 |
| B case_3 |
| B case_4 |
| B case_5 |
| B case_6 |
| B case_7 |
| B case_8 |
| |
| case_8: |
| VLD1.8 {qTmp0, qTmp1}, [ref]! |
| SUB center, center, #32 |
| VST1.8 {qTmp0}, [fill]! |
| VST1.8 {qTmp1}, [fill]! |
| B loop_center |
| case_7: |
| VLD1.8 {dTmp0,dTmp1,dTmp2}, [ref]! |
| SUB center, center, #28 |
| LDR tmp2, [ref], #4 |
| VST1.8 {dTmp0,dTmp1,dTmp2}, [fill]! |
| STR tmp2, [fill],#4 |
| B loop_center |
| case_6: |
| VLD1.8 {dTmp0,dTmp1,dTmp2}, [ref]! |
| SUB center, center, #24 |
| VST1.8 {dTmp0,dTmp1,dTmp2}, [fill]! |
| B loop_center |
| case_5: |
| VLD1.8 {qTmp0}, [ref]! |
| SUB center, center, #20 |
| LDR tmp2, [ref], #4 |
| VST1.8 {qTmp0}, [fill]! |
| STR tmp2, [fill],#4 |
| B loop_center |
| case_4: |
| VLD1.8 {qTmp0}, [ref]! |
| SUB center, center, #16 |
| VST1.8 {qTmp0}, [fill]! |
| B loop_center |
| case_3: |
| VLD1.8 {dTmp0}, [ref]! |
| SUB center, center, #12 |
| LDR tmp2, [ref], #4 |
| VST1.8 dTmp0, [fill]! |
| STR tmp2, [fill],#4 |
| B loop_center |
| case_2: |
| LDR tmp2, [ref],#4 |
| SUB center, center, #4 |
| STR tmp2, [fill], #4 |
| case_1: |
| LDR tmp2, [ref],#4 |
| SUB center, center, #4 |
| STR tmp2, [fill], #4 |
| |
| loop_center: |
| CMP center, #0 |
| BEQ jump |
| LDRB tmp2, [ref], #1 |
| SUB center, center, #1 |
| STRB tmp2, [fill], #1 |
| BNE loop_center |
| jump: |
| CMP right,#0 |
| POPEQ {r4-r6,pc} |
| LDRB tmp2, [ref,#-1] |
| |
| loop_right: |
| STRB tmp2, [fill], #1 |
| SUBS right, right, #1 |
| BNE loop_right |
| |
| POP {r4-r6,pc} |
| |
| endfunction |
| |
| |