You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
814 lines
25 KiB
814 lines
25 KiB
//****************************************************************************** |
|
//* |
|
//* 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 Name : impeg2_inter_pred.s |
|
//// |
|
//// Description : This file has motion compensation related |
|
//// interpolation functions on Neon + CortexA-8 platform |
|
//// |
|
//// Reference Document : |
|
//// |
|
//// Revision History : |
|
//// Date Author Detail Description |
|
//// ------------ ---------------- ---------------------------------- |
|
//// 18 jun 2010 S Hamsalekha Created |
|
//// |
|
////------------------------------------------------------------------------- |
|
//*/ |
|
|
|
///* |
|
//// ---------------------------------------------------------------------------- |
|
//// Include Files |
|
//// ---------------------------------------------------------------------------- |
|
//*/ |
|
// PRESERVE8 |
|
.text |
|
.include "impeg2_neon_macros.s" |
|
|
|
///* |
|
//// ---------------------------------------------------------------------------- |
|
//// Struct/Union Types and Define |
|
//// ---------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
///* |
|
//// ---------------------------------------------------------------------------- |
|
//// Static Global Data section variables |
|
//// ---------------------------------------------------------------------------- |
|
//*/ |
|
//// -------------------------- NONE -------------------------------------------- |
|
|
|
|
|
///* |
|
//// ---------------------------------------------------------------------------- |
|
//// Static Prototype Functions |
|
//// ---------------------------------------------------------------------------- |
|
//*/ |
|
//// -------------------------- NONE -------------------------------------------- |
|
|
|
///* |
|
//// ---------------------------------------------------------------------------- |
|
//// Exported functions |
|
//// ---------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_copy_mb_av8() |
|
//// |
|
//// Detail Description : Copies one MB worth of data from src to the dst |
|
//// |
|
//// Inputs : x0 - pointer to src |
|
//// x1 - pointer to dst |
|
//// x2 - source width |
|
//// x3 - destination width |
|
//// Registers Used : v0, v1 |
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
|
|
.global impeg2_copy_mb_av8 |
|
|
|
|
|
impeg2_copy_mb_av8: |
|
|
|
//STMFD x13!,{x4,x5,x12,x14} |
|
push_v_regs |
|
|
|
|
|
ldr x4, [x0] //src->y |
|
ldr x5, [x1] //dst->y |
|
|
|
//Read one row of data from the src |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
|
|
////Repeat 15 times for y |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b, v1.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b, v1.8b}, [x5], x3 //Store and increment dst |
|
|
|
lsr x2, x2, #1 //src_offset /= 2 |
|
lsr x3, x3, #1 //dst_offset /= 2 |
|
|
|
ldr x4, [x0, #8] //src->u |
|
ldr x5, [x1, #8] //dst->u |
|
|
|
//Read one row of data from the src |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
|
|
////Repeat 7 times for u |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
|
|
ldr x4, [x0, #16] //src->v |
|
ldr x5, [x1, #16] //dst->v |
|
|
|
//Read one row of data from the src |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
|
|
////Repeat 7 times for v |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
ld1 {v0.8b}, [x4], x2 //Load and increment src |
|
st1 {v0.8b}, [x5], x3 //Store and increment dst |
|
|
|
//LDMFD x13!,{x4,x5,x12,PC} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_mc_fullx_halfy_8x8_av8() |
|
//// |
|
//// Detail Description : This function pastes the reference block in the |
|
//// current frame buffer.This function is called for |
|
//// blocks that are not coded and have motion vectors |
|
//// with a half pel resolution. |
|
//// |
|
//// Inputs : x0 - out : Current Block Pointer |
|
//// x1 - ref : Refernce Block Pointer |
|
//// x2 - ref_wid : Refernce Block Width |
|
//// x3 - out_wid @ Current Block Width |
|
//// |
|
//// Registers Used : x14, D0-D9 |
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : The Motion Compensated Block |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
.global impeg2_mc_fullx_halfy_8x8_av8 |
|
|
|
impeg2_mc_fullx_halfy_8x8_av8: |
|
|
|
//STMFD x13!,{x12,x14} |
|
push_v_regs |
|
add x14, x1, x2 |
|
lsl x2, x2, #1 |
|
|
|
///* Load 8 + 1 rows from reference block */ |
|
///* Do the addition with out rounding off as rounding value is 1 */ |
|
ld1 {v0.8b}, [x1], x2 //// first row hence x1 = D0 |
|
ld1 {v2.8b}, [x14], x2 //// second row hence x2 = D2 |
|
ld1 {v4.8b}, [x1], x2 //// third row hence x3 = D4 |
|
ld1 {v6.8b}, [x14], x2 //// fourth row hence x4 = D6 |
|
ld1 {v1.8b}, [x1], x2 //// fifth row hence x5 = D1 |
|
ld1 {v3.8b}, [x14], x2 //// sixth row hence x6 = D3 |
|
urhadd v9.8b, v1.8b , v6.8b //// estimated row 4 = D9 |
|
ld1 {v5.8b}, [x1], x2 //// seventh row hence x7 = D5 |
|
urhadd v0.16b, v0.16b , v2.16b //// estimated row 1 = D0, row 5 = D1 |
|
urhadd v1.16b, v1.16b , v3.16b //// estimated row 1 = D0, row 5 = D1 |
|
ld1 {v7.8b}, [x14], x2 //// eighth row hence x8 = D7 |
|
urhadd v2.16b, v2.16b , v4.16b //// estimated row 2 = D2, row 6 = D3 |
|
urhadd v3.16b, v3.16b , v5.16b //// estimated row 2 = D2, row 6 = D3 |
|
ld1 {v8.8b}, [x1], x2 //// ninth row hence x9 = D8 |
|
urhadd v4.16b, v4.16b , v6.16b //// estimated row 3 = D4, row 7 = D5 |
|
urhadd v5.16b, v5.16b , v7.16b //// estimated row 3 = D4, row 7 = D5 |
|
|
|
add x14, x0, x3 |
|
lsl x3, x3, #1 |
|
|
|
///* Store the eight rows calculated above */ |
|
st1 {v2.8b}, [x14], x3 //// second row hence D2 |
|
urhadd v7.8b, v7.8b , v8.8b //// estimated row 8 = D7 |
|
st1 {v0.8b}, [x0], x3 //// first row hence D0 |
|
st1 {v9.8b}, [x14], x3 //// fourth row hence D9 |
|
st1 {v4.8b}, [x0], x3 //// third row hence D4 |
|
st1 {v3.8b}, [x14], x3 //// sixth row hence x6 = D3 |
|
st1 {v1.8b}, [x0], x3 //// fifth row hence x5 = D1 |
|
st1 {v7.8b}, [x14], x3 //// eighth row hence x8 = D7 |
|
st1 {v5.8b}, [x0], x3 //// seventh row hence x7 = D5 |
|
|
|
// LDMFD sp!,{x12,pc} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
|
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_mc_halfx_fully_8x8_av8() |
|
//// |
|
//// Detail Description : This function pastes the reference block in the |
|
//// current frame buffer.This function is called for |
|
//// blocks that are not coded and have motion vectors |
|
//// with a half pel resolutionand VopRoundingType is 0 .. |
|
//// |
|
//// Inputs : x0 - out : Current Block Pointer |
|
//// x1 - ref : Refernce Block Pointer |
|
//// x2 - ref_wid : Refernce Block Width |
|
//// x3 - out_wid @ Current Block Width |
|
//// |
|
//// Registers Used : x12, x14, v0-v10, v12-v14, v16-v18, v20-v22 |
|
|
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : The Motion Compensated Block |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
|
|
.global impeg2_mc_halfx_fully_8x8_av8 |
|
|
|
|
|
|
|
impeg2_mc_halfx_fully_8x8_av8: |
|
|
|
// STMFD sp!,{x12,x14} |
|
push_v_regs |
|
|
|
add x14, x1, x2, lsl #2 |
|
|
|
add x12, x0, x3, lsl#2 |
|
|
|
ld1 {v0.8b, v1.8b}, [x1], x2 //load 16 pixels of row1 |
|
|
|
ld1 {v2.8b, v3.8b}, [x14], x2 // row5 |
|
|
|
|
|
ld1 {v4.8b, v5.8b}, [x1], x2 //load 16 pixels row2 |
|
|
|
ld1 {v6.8b, v7.8b}, [x14], x2 //row6 |
|
|
|
|
|
ext v8.8b, v0.8b , v1.8b , #1 |
|
|
|
ext v12.8b, v2.8b , v3.8b , #1 |
|
|
|
ext v16.8b, v4.8b , v5.8b , #1 |
|
|
|
ext v20.8b, v6.8b , v7.8b , #1 |
|
|
|
|
|
ld1 {v9.8b, v10.8b}, [x1], x2 //load row3 |
|
|
|
ld1 {v13.8b, v14.8b}, [x14], x2 //load row7 |
|
|
|
ld1 {v17.8b, v18.8b}, [x1], x2 //load row4 |
|
|
|
ld1 {v21.8b, v22.8b}, [x14], x2 //load row8 |
|
|
|
|
|
ext v1.8b, v9.8b , v10.8b , #1 |
|
|
|
ext v3.8b, v13.8b , v14.8b , #1 |
|
|
|
|
|
|
|
ext v5.8b, v17.8b , v18.8b , #1 |
|
|
|
ext v7.8b, v21.8b , v22.8b , #1 |
|
|
|
|
|
urhadd v0.16b, v0.16b , v8.16b //operate on row1 and row3 |
|
urhadd v1.16b, v1.16b , v9.16b //operate on row1 and row3 |
|
|
|
urhadd v2.16b, v2.16b , v12.16b //operate on row5 and row7 |
|
urhadd v3.16b, v3.16b , v13.16b //operate on row5 and row7 |
|
|
|
|
|
urhadd v4.16b, v4.16b , v16.16b //operate on row2 and row4 |
|
urhadd v5.16b, v5.16b , v17.16b //operate on row2 and row4 |
|
|
|
|
|
urhadd v6.16b, v6.16b , v20.16b //operate on row6 and row8 |
|
urhadd v7.16b, v7.16b , v21.16b //operate on row6 and row8 |
|
|
|
st1 {v0.8b}, [x0], x3 //store row1 |
|
|
|
st1 {v2.8b}, [x12], x3 //store row5 |
|
|
|
st1 {v4.8b}, [x0], x3 //store row2 |
|
|
|
st1 {v6.8b}, [x12], x3 //store row6 |
|
|
|
st1 {v1.8b}, [x0], x3 //store row3 |
|
|
|
st1 {v3.8b}, [x12], x3 //store row7 |
|
|
|
st1 {v5.8b}, [x0], x3 //store row4 |
|
|
|
st1 {v7.8b}, [x12], x3 //store row8 |
|
|
|
|
|
|
|
// LDMFD sp!,{x12,pc} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_mc_halfx_halfy_8x8_av8() |
|
//// |
|
//// Detail Description : This function pastes the reference block in the |
|
//// current frame buffer.This function is called for |
|
//// blocks that are not coded and have motion vectors |
|
//// with a half pel resolutionand VopRoundingType is 0 .. |
|
//// |
|
//// Inputs : x0 - out : Current Block Pointer |
|
//// x1 - ref : Refernce Block Pointer |
|
//// x2 - ref_wid : Refernce Block Width |
|
//// x3 - out_wid @ Current Block Width |
|
//// |
|
//// Registers Used : x14, v0-v18, v22, v24, v26, v28, v30 |
|
|
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : The Motion Compensated Block |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
.global impeg2_mc_halfx_halfy_8x8_av8 |
|
|
|
impeg2_mc_halfx_halfy_8x8_av8: |
|
|
|
// STMFD sp!,{x12,x14} |
|
push_v_regs |
|
|
|
add x14, x1, x2, lsl #2 |
|
|
|
ld1 {v0.8b, v1.8b}, [x1], x2 //load 16 pixels of row1 |
|
|
|
ld1 {v2.8b, v3.8b}, [x14], x2 // row5 |
|
|
|
ld1 {v4.8b, v5.8b}, [x1], x2 //load 16 pixels row2 |
|
|
|
ld1 {v6.8b, v7.8b}, [x14], x2 //row6 |
|
|
|
ext v1.8b, v0.8b , v1.8b , #1 |
|
|
|
|
|
|
|
ext v3.8b, v2.8b , v3.8b , #1 |
|
|
|
|
|
|
|
ext v5.8b, v4.8b , v5.8b , #1 |
|
|
|
ext v7.8b, v6.8b , v7.8b , #1 |
|
|
|
|
|
|
|
|
|
ld1 {v8.8b, v9.8b}, [x1], x2 //load row3 |
|
|
|
|
|
|
|
ld1 {v10.8b, v11.8b}, [x14], x2 //load row7 |
|
|
|
ld1 {v12.8b, v13.8b}, [x1], x2 //load row4 |
|
|
|
ld1 {v14.8b, v15.8b}, [x14], x2 //load row8 |
|
|
|
ext v9.8b, v8.8b , v9.8b , #1 |
|
|
|
ld1 {v16.8b, v17.8b}, [x14], x2 //load row9 |
|
|
|
|
|
|
|
|
|
|
|
ext v11.8b, v10.8b , v11.8b , #1 |
|
|
|
|
|
|
|
ext v13.8b, v12.8b , v13.8b , #1 |
|
|
|
|
|
|
|
ext v15.8b, v14.8b , v15.8b , #1 |
|
|
|
ext v17.8b, v16.8b , v17.8b , #1 |
|
|
|
|
|
//interpolation in x direction |
|
|
|
uaddl v0.8h, v0.8b, v1.8b //operate row1 |
|
|
|
uaddl v2.8h, v2.8b, v3.8b //operate row5 |
|
|
|
uaddl v4.8h, v4.8b, v5.8b //operate row2 |
|
|
|
uaddl v6.8h, v6.8b, v7.8b //operate row6 |
|
|
|
uaddl v8.8h, v8.8b, v9.8b //operate row3 |
|
|
|
uaddl v10.8h, v10.8b, v11.8b //operate row7 |
|
|
|
uaddl v12.8h, v12.8b, v13.8b //operate row4 |
|
|
|
uaddl v14.8h, v14.8b, v15.8b //operate row8 |
|
|
|
uaddl v16.8h, v16.8b, v17.8b //operate row9 |
|
|
|
//interpolation in y direction |
|
|
|
add x14, x0, x3, lsl #2 |
|
|
|
|
|
|
|
add v18.8h, v0.8h , v4.8h //operate row1 and row2 |
|
|
|
add v26.8h, v2.8h , v6.8h //operate row5 and row6 |
|
|
|
add v20.8h, v4.8h , v8.8h //operate row2 and row3 |
|
|
|
add v28.8h, v6.8h , v10.8h //operate row6 and row7 |
|
|
|
rshrn v18.8b, v18.8h, #2 //row1 |
|
|
|
rshrn v26.8b, v26.8h, #2 //row5 |
|
|
|
rshrn v20.8b, v20.8h, #2 //row2 |
|
|
|
rshrn v28.8b, v28.8h, #2 //row6 |
|
|
|
add v22.8h, v8.8h , v12.8h //operate row3 and row4 |
|
|
|
st1 {v18.8b}, [x0], x3 //store row1 |
|
|
|
add v30.8h, v10.8h , v14.8h //operate row7 and row8 |
|
|
|
st1 {v26.8b}, [x14], x3 //store row5 |
|
|
|
add v24.8h, v12.8h , v2.8h //operate row4 and row5 |
|
|
|
st1 {v20.8b}, [x0], x3 //store row2 |
|
|
|
add v14.8h, v14.8h , v16.8h //operate row8 and row9 |
|
|
|
st1 {v28.8b}, [x14], x3 //store row6 |
|
|
|
|
|
|
|
rshrn v22.8b, v22.8h, #2 //row3 |
|
|
|
rshrn v30.8b, v30.8h, #2 //row7 |
|
|
|
rshrn v24.8b, v24.8h, #2 //row4 |
|
|
|
rshrn v14.8b, v14.8h, #2 //row8 |
|
|
|
|
|
st1 {v22.8b}, [x0], x3 //store row3 |
|
st1 {v30.8b}, [x14], x3 //store row7 |
|
st1 {v24.8b}, [x0], x3 //store row4 |
|
st1 {v14.8b}, [x14], x3 //store row8 |
|
|
|
|
|
|
|
// LDMFD sp!,{x12,pc} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_mc_fullx_fully_8x8_av8() |
|
//// |
|
//// Detail Description : This function pastes the reference block in the |
|
//// current frame buffer.This function is called for |
|
//// blocks that are not coded and have motion vectors |
|
//// with a half pel resolutionand .. |
|
//// |
|
//// Inputs : x0 - out : Current Block Pointer |
|
//// x1 - ref : Refernce Block Pointer |
|
//// x2 - ref_wid : Refernce Block Width |
|
//// x3 - out_wid @ Current Block Width |
|
//// |
|
//// Registers Used : x12, x14, v0-v3 |
|
|
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : The Motion Compensated Block |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
.global impeg2_mc_fullx_fully_8x8_av8 |
|
impeg2_mc_fullx_fully_8x8_av8: |
|
|
|
|
|
// STMFD sp!,{x12,x14} |
|
push_v_regs |
|
|
|
add x14, x1, x2, lsl #2 |
|
|
|
add x12, x0, x3, lsl #2 |
|
|
|
|
|
ld1 {v0.8b}, [x1], x2 //load row1 |
|
|
|
ld1 {v1.8b}, [x14], x2 //load row4 |
|
|
|
ld1 {v2.8b}, [x1], x2 //load row2 |
|
|
|
ld1 {v3.8b}, [x14], x2 //load row5 |
|
|
|
|
|
st1 {v0.8b}, [x0], x3 //store row1 |
|
|
|
st1 {v1.8b}, [x12], x3 //store row4 |
|
|
|
st1 {v2.8b}, [x0], x3 //store row2 |
|
|
|
st1 {v3.8b}, [x12], x3 //store row5 |
|
|
|
|
|
ld1 {v0.8b}, [x1], x2 //load row3 |
|
|
|
ld1 {v1.8b}, [x14], x2 //load row6 |
|
|
|
ld1 {v2.8b}, [x1], x2 //load row4 |
|
|
|
ld1 {v3.8b}, [x14], x2 //load row8 |
|
|
|
|
|
st1 {v0.8b}, [x0], x3 //store row3 |
|
|
|
st1 {v1.8b}, [x12], x3 //store row6 |
|
|
|
st1 {v2.8b}, [x0], x3 //store row4 |
|
|
|
st1 {v3.8b}, [x12], x3 //store row8 |
|
|
|
|
|
// LDMFD sp!,{x12,pc} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
|
|
|
|
///* |
|
////--------------------------------------------------------------------------- |
|
//// Function Name : impeg2_interpolate_av8() |
|
//// |
|
//// Detail Description : interpolates two buffers and adds pred |
|
//// |
|
//// Inputs : x0 - pointer to src1 |
|
//// x1 - pointer to src2 |
|
//// x2 - dest buf |
|
//// x3 - dst stride |
|
//// Registers Used : x12, v0-v15 |
|
//// |
|
//// Stack Usage : 64 bytes |
|
//// |
|
//// Outputs : The Motion Compensated Block |
|
//// |
|
//// Return Data : None |
|
//// |
|
//// Programming Note : <program limitation> |
|
////----------------------------------------------------------------------------- |
|
//*/ |
|
|
|
|
|
.global impeg2_interpolate_av8 |
|
|
|
|
|
impeg2_interpolate_av8: |
|
|
|
//STMFD x13!,{x4-x7,x12,x14} |
|
push_v_regs |
|
|
|
ldr x4, [x0, #0] //ptr_y src1 |
|
|
|
ldr x5, [x1, #0] //ptr_y src2 |
|
|
|
ldr x7, [x2, #0] //ptr_y dst buf |
|
|
|
mov x12, #4 //counter for number of blocks |
|
|
|
|
|
interp_lumablocks_stride: |
|
ld1 {v0.16b}, [x4], #16 //row1 src1 |
|
|
|
ld1 {v2.16b}, [x4], #16 //row2 src1 |
|
|
|
ld1 {v4.16b}, [x4], #16 //row3 src1 |
|
|
|
ld1 {v6.16b}, [x4], #16 //row4 src1 |
|
|
|
|
|
ld1 {v8.16b}, [x5], #16 //row1 src2 |
|
|
|
ld1 {v10.16b}, [x5], #16 //row2 src2 |
|
|
|
ld1 {v12.16b}, [x5], #16 //row3 src2 |
|
|
|
ld1 {v14.16b}, [x5], #16 //row4 src2 |
|
|
|
urhadd v0.16b, v0.16b , v8.16b //operate on row1 |
|
|
|
urhadd v2.16b, v2.16b , v10.16b //operate on row2 |
|
|
|
urhadd v4.16b, v4.16b , v12.16b //operate on row3 |
|
|
|
urhadd v6.16b, v6.16b , v14.16b //operate on row4 |
|
st1 {v0.16b}, [x7], x3 //row1 |
|
|
|
st1 {v2.16b}, [x7], x3 //row2 |
|
|
|
st1 {v4.16b}, [x7], x3 //row3 |
|
|
|
st1 {v6.16b}, [x7], x3 //row4 |
|
|
|
subs x12, x12, #1 |
|
|
|
bne interp_lumablocks_stride |
|
|
|
|
|
lsr x3, x3, #1 //stride >> 1 |
|
|
|
ldr x4, [x0, #8] //ptr_u src1 |
|
|
|
ldr x5, [x1, #8] //ptr_u src2 |
|
|
|
ldr x7 , [x2, #8] //ptr_u dst buf |
|
|
|
mov x12, #2 //counter for number of blocks |
|
|
|
|
|
|
|
//chroma blocks |
|
|
|
interp_chromablocks_stride: |
|
ld1 {v0.8b, v1.8b}, [x4], #16 //row1 & 2 src1 |
|
|
|
ld1 {v2.8b, v3.8b}, [x4], #16 //row3 & 4 src1 |
|
|
|
ld1 {v4.8b, v5.8b}, [x4], #16 //row5 & 6 src1 |
|
|
|
ld1 {v6.8b, v7.8b}, [x4], #16 //row7 & 8 src1 |
|
|
|
|
|
ld1 {v8.8b, v9.8b}, [x5], #16 //row1 & 2 src2 |
|
|
|
ld1 {v10.8b, v11.8b}, [x5], #16 //row3 & 4 src2 |
|
|
|
ld1 {v12.8b, v13.8b}, [x5], #16 //row5 & 6 src2 |
|
|
|
ld1 {v14.8b, v15.8b}, [x5], #16 //row7 & 8 src2 |
|
|
|
urhadd v0.16b, v0.16b , v8.16b //operate on row1 & 2 |
|
urhadd v1.16b, v1.16b , v9.16b //operate on row1 & 2 |
|
|
|
urhadd v2.16b, v2.16b , v10.16b //operate on row3 & 4 |
|
urhadd v3.16b, v3.16b , v11.16b //operate on row3 & 4 |
|
|
|
urhadd v4.16b, v4.16b , v12.16b //operate on row5 & 6 |
|
urhadd v5.16b, v5.16b , v13.16b //operate on row5 & 6 |
|
|
|
urhadd v6.16b, v6.16b , v14.16b //operate on row7 & 8 |
|
urhadd v7.16b, v7.16b , v15.16b //operate on row7 & 8 |
|
|
|
st1 {v0.8b}, [x7], x3 //row1 |
|
|
|
st1 {v1.8b}, [x7], x3 //row2 |
|
|
|
st1 {v2.8b}, [x7], x3 //row3 |
|
|
|
st1 {v3.8b}, [x7], x3 //row4 |
|
|
|
st1 {v4.8b}, [x7], x3 //row5 |
|
|
|
st1 {v5.8b}, [x7], x3 //row6 |
|
|
|
st1 {v6.8b}, [x7], x3 //row7 |
|
|
|
st1 {v7.8b}, [x7], x3 //row8 |
|
|
|
|
|
ldr x4, [x0, #16] //ptr_v src1 |
|
|
|
ldr x5, [x1, #16] //ptr_v src2 |
|
|
|
ldr x7, [x2, #16] //ptr_v dst buf |
|
|
|
subs x12, x12, #1 |
|
|
|
bne interp_chromablocks_stride |
|
|
|
|
|
//LDMFD x13!,{x4-x7,x12,PC} |
|
pop_v_regs |
|
ret |
|
|
|
|
|
|
|
|
|
|