/*
 * Copyright (C) 2007-2008 ARM Limited
 *
 * 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.
 *
 */
/*
 *
 */

    .eabi_attribute 24, 1
    .eabi_attribute 25, 1

    .arm
    .fpu neon

    .text
    .align 4

armVCM4P10_WidthBranchTableMVIsNotZero:
    .word   WidthIs2MVIsNotZero-(P0+8), WidthIs2MVIsNotZero-(P0+8)
    .word   WidthIs4MVIsNotZero-(P0+8), WidthIs4MVIsNotZero-(P0+8)
    .word   WidthIs8MVIsNotZero-(P0+8)

armVCM4P10_WidthBranchTableMVIsZero:
    .word   WidthIs2MVIsZero-(P0+8), WidthIs2MVIsZero-(P0+8)
    .word   WidthIs4MVIsZero-(P0+8), WidthIs4MVIsZero-(P0+8)
    .word   WidthIs8MVIsZero-(P0+8)

    .global armVCM4P10_Interpolate_Chroma
    .func   armVCM4P10_Interpolate_Chroma
armVCM4P10_Interpolate_Chroma:
    PUSH     {r4-r12,lr}
    VPUSH    {d8-d15}
    LDRD     r6,r7,[sp,#0x70]
    LDRD     r4,r5,[sp,#0x68]
    RSB      r8,r6,#8
    RSB      r9,r7,#8
    CMN      r6,r7
    MOV      r10,#1
    ADREQ    r11, armVCM4P10_WidthBranchTableMVIsZero
    SUB      lr,r1,r10
    ADRNE    r11, armVCM4P10_WidthBranchTableMVIsNotZero
    VLD1.8   {d0},[r0],r10
    SMULBB   r12,r8,r9
    SMULBB   r9,r6,r9
    VLD1.8   {d1},[r0],lr
    SMULBB   r8,r8,r7
    SMULBB   r6,r6,r7
    VDUP.8   d12,r12
    VDUP.8   d13,r9
    VDUP.8   d14,r8
    VDUP.8   d15,r6
    LDR      r11,[r11, r4, lsl #1]
P0: ADD      pc,r11

WidthIs8MVIsNotZero:
    VLD1.8   {d2},[r0],r10
    VMULL.U8 q2,d0,d12
    VLD1.8   {d3},[r0],lr
    VMULL.U8 q3,d2,d12
    VLD1.8   {d16},[r0],r10
    VMLAL.U8 q2,d1,d13
    VLD1.8   {d17},[r0],lr
    VMULL.U8 q11,d16,d12
    VMLAL.U8 q3,d3,d13
    VLD1.8   {d18},[r0],r10
    VMLAL.U8 q2,d2,d14
    VMLAL.U8 q11,d17,d13
    VMULL.U8 q12,d18,d12
    VLD1.8   {d19},[r0],lr
    VMLAL.U8 q3,d16,d14
    VLD1.8   {d0},[r0],r10
    VMLAL.U8 q12,d19,d13
    VMLAL.U8 q11,d18,d14
    VMLAL.U8 q2,d3,d15
    VLD1.8   {d1},[r0],lr
    VMLAL.U8 q12,d0,d14
    VMLAL.U8 q3,d17,d15
    VMLAL.U8 q11,d19,d15
    SUBS     r5,r5,#4
    VMLAL.U8 q12,d1,d15
    VQRSHRN.U16 d8,q2,#6
    VQRSHRN.U16 d9,q3,#6
    VQRSHRN.U16 d20,q11,#6
    VST1.64  {d8},[r2],r3
    VQRSHRN.U16 d21,q12,#6
    VST1.64  {d9},[r2],r3
    VST1.64  {d20},[r2],r3
    VST1.64  {d21},[r2],r3
    BGT      WidthIs8MVIsNotZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}

WidthIs4MVIsNotZero:
    VLD1.8   {d2},[r0],r10
    VMULL.U8 q2,d0,d12
    VMULL.U8 q3,d2,d12
    VLD1.8   {d3},[r0],lr
    VMLAL.U8 q2,d1,d13
    VMLAL.U8 q3,d3,d13
    VLD1.8   {d0},[r0],r10
    VMLAL.U8 q2,d2,d14
    VMLAL.U8 q3,d0,d14
    VLD1.8   {d1},[r0],lr
    SUBS     r5,r5,#2
    VMLAL.U8 q3,d1,d15
    VMLAL.U8 q2,d3,d15
    VQRSHRN.U16 d9,q3,#6
    VQRSHRN.U16 d8,q2,#6
    VST1.32  {d8[0]},[r2],r3
    VST1.32  {d9[0]},[r2],r3
    BGT      WidthIs4MVIsNotZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}

WidthIs2MVIsNotZero:
    VLD1.8   {d2},[r0],r10
    VMULL.U8 q2,d0,d12
    VMULL.U8 q3,d2,d12
    VLD1.8   {d3},[r0],lr
    VMLAL.U8 q2,d1,d13
    VMLAL.U8 q3,d3,d13
    VLD1.8   {d0},[r0],r10
    VMLAL.U8 q2,d2,d14
    VMLAL.U8 q3,d0,d14
    VLD1.8   {d1},[r0],lr
    SUBS     r5,r5,#2
    VMLAL.U8 q3,d1,d15
    VMLAL.U8 q2,d3,d15
    VQRSHRN.U16 d9,q3,#6
    VQRSHRN.U16 d8,q2,#6
    VST1.16  {d8[0]},[r2],r3
    VST1.16  {d9[0]},[r2],r3
    BGT      WidthIs2MVIsNotZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}

WidthIs8MVIsZero:
    SUB      r0,r0,r1
WidthIs8LoopMVIsZero:
    VLD1.8   {d0},[r0],r1
    SUBS     r5,r5,#2
    VLD1.8   {d1},[r0],r1
    VST1.64  {d0},[r2],r3
    VST1.64  {d1},[r2],r3
    BGT      WidthIs8LoopMVIsZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}

WidthIs4MVIsZero:
    VLD1.8   {d1},[r0],r1
    SUBS     r5,r5,#2
    VST1.32  {d0[0]},[r2],r3
    VLD1.8   {d0},[r0],r1
    VST1.32  {d1[0]},[r2],r3
    BGT      WidthIs4MVIsZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}

WidthIs2MVIsZero:
    VLD1.8   {d1},[r0],r1
    SUBS     r5,r5,#2
    VST1.16  {d0[0]},[r2],r3
    VLD1.8   {d0},[r0],r1
    VST1.16  {d1[0]},[r2],r3
    BGT      WidthIs2MVIsZero
    MOV      r0,#0
    VPOP     {d8-d15}
    POP      {r4-r12,pc}
    .endfunc

    .end

