Files
2026-07-13 13:33:03 +08:00

92 lines
1.5 KiB
ArmAsm

//
// MNNNV21ToRGBUnit.S
// MNN
//
// Created by MNN on 2018/12/25.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __arm__
#ifndef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
//void MNNNV21ToRGBUnit(const unsigned char* source, unsigned char* dest, size_t count, const unsigned char* uv);
//Auto: r0:source, r1:dest, r2:count, r3:uv
asm_function MNNNV21ToRGBUnit
push {r4, lr}
vpush {q4}
mov r4, #73
vmov.i8 d31, #128
mov r12, #25
vmov.i16 d0[0], r4
vmov.i16 d0[1], r12
mov r4, #37
mov r12, #130
vmov.i16 d0[2], r4
vmov.i16 d0[3], r12
vmov.i16 q4, #0
LoopL1:
vld2.8 {d18, d19}, [r3]!
vsubl.u8 q11, d18, d31
vld2.8 {d16, d17}, [r0]!
vsubl.u8 q10, d19, d31
//q1-q3: RGB offset
vmul.s16 q1, q11, d0[0]// + R Offset
vmul.s16 q2, q10, d0[1]
vmul.s16 q3, q10, d0[3]// + B Offset
vmla.s16 q2, q11, d0[2]// - G Offset
vshll.u8 q10, d16, #6
vshll.u8 q11, d17, #6
vadd.s16 q12, q10, q1
vsub.s16 q13, q10, q2
vadd.s16 q14, q10, q3
vmax.s16 q12, q12, q4
vmax.s16 q13, q13, q4
vmax.s16 q14, q14, q4
vqshrn.u16 d16, q12, #6
vqshrn.u16 d17, q13, #6
vqshrn.u16 d18, q14, #6
vadd.s16 q12, q11, q1
vsub.s16 q13, q11, q2
vadd.s16 q14, q11, q3
vmax.s16 q12, q12, q4
vmax.s16 q13, q13, q4
vmax.s16 q14, q14, q4
vqshrn.u16 d19, q12, #6
vqshrn.u16 d20, q13, #6
vqshrn.u16 d21, q14, #6
vzip.8 d16, d19
vzip.8 d17, d20
vzip.8 d18, d21
vst3.u8 {d16, d17, d18}, [r1]!
vst3.u8 {d19, d20, d21}, [r1]!
subs r2, r2, #1
bne LoopL1
vpop {q4}
pop {r4, pc}
#endif
#endif