blob: ce8c033d2eaa35d3cbec35904091b2fd01bf0dd4 [file] [log] [blame]
/*
* Copyright (C) 2013 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 <machine/cpu-features.h>
#include <machine/asm.h>
#define SNIP_START(x) \
.globl x; x:
#define SNIP_END(x) \
.globl x##_end; x##_end: \
.globl x##_len; x##_len: \
.word x##_end-x
SNIP_START(_N_ColorMatrix_prefix)
stmfd sp!, {r4, lr}
vpush {q4-q7}
vld1.16 {q2}, [r2]!
vld1.16 {q3}, [r2]!
vld1.16 {d8}, [r2]!
SNIP_END(_N_ColorMatrix_prefix)
SNIP_START(_N_ColorMatrix_postfix1)
subs r3, r3, #1
#bne 1b
SNIP_END(_N_ColorMatrix_postfix1)
SNIP_START(_N_ColorMatrix_postfix2)
#mov r0, #0
#ldr r0, [r0]
vpop {q4-q7}
ldmfd sp!, {r4, lr}
bx lr
SNIP_END(_N_ColorMatrix_postfix2)
SNIP_START(_N_ColorMatrix_load_u8_4)
vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
SNIP_END(_N_ColorMatrix_load_u8_4)
SNIP_START(_N_ColorMatrix_load_u8_2)
vld2.8 {d0[0],d1[0]}, [r1]!
vld2.8 {d0[1],d1[1]}, [r1]!
vld2.8 {d0[2],d1[2]}, [r1]!
vld2.8 {d0[3],d1[3]}, [r1]!
SNIP_END(_N_ColorMatrix_load_u8_2)
SNIP_START(_N_ColorMatrix_load_u8_1)
vld1.32 {d0}, [r1]!
SNIP_END(_N_ColorMatrix_load_u8_1)
SNIP_START(_N_ColorMatrix_store_u8_4)
vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
SNIP_END(_N_ColorMatrix_store_u8_4)
SNIP_START(_N_ColorMatrix_store_u8_2)
vst2.8 {d0[0],d1[0]}, [r0]!
vst2.8 {d0[1],d1[1]}, [r0]!
vst2.8 {d0[2],d1[2]}, [r0]!
vst2.8 {d0[3],d1[3]}, [r0]!
SNIP_END(_N_ColorMatrix_store_u8_2)
SNIP_START(_N_ColorMatrix_store_u8_1)
vst1.32 {d0}, [r0]!
SNIP_END(_N_ColorMatrix_store_u8_1)
SNIP_START(_N_ColorMatrix_unpack_u8_4)
vmovl.u8 q12, d0 /* R */
vmovl.u8 q13, d1 /* G */
vmovl.u8 q14, d2 /* B */
vmovl.u8 q15, d3 /* A */
SNIP_END(_N_ColorMatrix_unpack_u8_4)
SNIP_START(_N_ColorMatrix_unpack_u8_3)
vmovl.u8 q12, d0 /* R */
vmovl.u8 q13, d1 /* G */
vmovl.u8 q14, d2 /* B */
SNIP_END(_N_ColorMatrix_unpack_u8_3)
SNIP_START(_N_ColorMatrix_unpack_u8_2)
vmovl.u8 q12, d0 /* R */
vmovl.u8 q13, d1 /* G */
SNIP_END(_N_ColorMatrix_unpack_u8_2)
SNIP_START(_N_ColorMatrix_unpack_u8_1)
vmovl.u8 q12, d0 /* R */
SNIP_END(_N_ColorMatrix_unpack_u8_1)
SNIP_START(_N_ColorMatrix_pack_u8_4)
vshrn.i32 d24, q8, #8
vshrn.i32 d26, q9, #8
vshrn.i32 d28, q10, #8
vshrn.i32 d30, q11, #8
vqmovun.s16 d0, q12
vqmovun.s16 d1, q13
vqmovun.s16 d2, q14
vqmovun.s16 d3, q15
SNIP_END(_N_ColorMatrix_pack_u8_4)
SNIP_START(_N_ColorMatrix_pack_u8_3)
vshrn.i32 d24, q8, #8
vshrn.i32 d26, q9, #8
vshrn.i32 d28, q10, #8
vqmovun.s16 d0, q12
vqmovun.s16 d1, q13
vqmovun.s16 d2, q14
SNIP_END(_N_ColorMatrix_pack_u8_3)
SNIP_START(_N_ColorMatrix_pack_u8_2)
vshrn.i32 d24, q8, #8
vshrn.i32 d26, q9, #8
vqmovun.s16 d0, q12
vqmovun.s16 d1, q13
SNIP_END(_N_ColorMatrix_pack_u8_2)
SNIP_START(_N_ColorMatrix_pack_u8_1)
vshrn.i32 d24, q8, #8
vqmovun.s16 d0, q12
SNIP_END(_N_ColorMatrix_pack_u8_1)
SNIP_START(_N_ColorMatrix_dot)
vmov.u8 d1, d0
vmov.u8 d2, d0
SNIP_END(_N_ColorMatrix_dot)