Files
alibaba--mnn/source/backend/cpu/arm/arm32/MNNLineDepthWiseInt8AddBiasScaleUnit.S
2026-07-13 13:33:03 +08:00

154 lines
3.2 KiB
ArmAsm

//
// MNNLineDepthWiseInt8AddBiasScaleUnit.S
// MNN
//
// Created by MNN on 2019/06/05.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __arm__
#ifndef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
asm_function MNNLineDepthWiseInt8AddBiasScaleUnit
//void MNNLineDepthWiseInt8AddBiasScaleUnit(int8_t* dst, const int8_t* src, const int8_t* weight, const QuanPostTreatParameters* parameters,
// size_t width, size_t src_w_step, size_t fw, size_t fh, size_t dilateX_step,
// size_t dilateY_step) {
//struct QuanPostTreatParameters {
// const float* scale;
// const int32_t* bias;
// int32_t maxValue;
// int32_t minValue;
// float roundValuePos = 0.5f;
// float roundValueNeg = -0.5f;
//};
// Auto Load:
// r0: dst*, r1: src*, r2: weight*, r3: parameters*
// Load from sp
// r4: width, r5: src_w_step, r6: fw, r7: fh, r8: dilateX_step, lr: dilateY_step, r10: scale_z, r11: mode
push {r4-r8, r10, r11, lr} // avoid to touch platform-register r-9
ldr r4, [sp, #32]
ldr r5, [sp, #36]
ldr r6, [sp, #40]
ldr r7, [sp, #44]
ldr r8, [sp, #48]
ldr lr, [sp, #52]
vpush {q4-q7}
ldr r10, [r3, #0]
vld1.32 {q12, q13}, [r10]! // scale, pack=16
vld1.32 {q14, q15}, [r10]!
ldr r11, [r3, #8]
// d23: max, d22: min
vdup.i8 d23, r11
ldr r11, [r3, #12]
vdup.i8 d22, r11
ldr r3, [r3, #44] // bias
mul r10, r6, r8
sub lr, lr, r10
L1:
cmp r4, #0
beq End
L1Loop:
vld1.32 {q7, q8}, [r3]!
vld1.32 {q9, q10}, [r3]
sub r3, r3, #32
vmov.i32 d12[0], r1
vmov.i32 d12[1], r2
mov r10, r7
L1LoopH:
mov r11, r6
L1LoopW:
vld1.32 {q1}, [r2]!
vld1.32 {q0}, [r1], r8
vmovl.s8 q2, d0
vmovl.s8 q3, d1
vmovl.s8 q4, d2
vmovl.s8 q5, d3
vmlal.s16 q7, d4, d8
vmlal.s16 q8, d5, d9
vmlal.s16 q9, d6, d10
vmlal.s16 q10, d7, d11
subs r11, r11, #1
bne L1LoopW
L1LoopWEnd:
subs r10, r10, #1
add r1, r1, lr
bne L1LoopH
vmov.f32 q0, #0.5
vmov.f32 q1, #-0.5
vcvt.f32.s32 q7, q7
vcvt.f32.s32 q8, q8
vcvt.f32.s32 q9, q9
vcvt.f32.s32 q10, q10
vmul.f32 q7, q7, q12
vmul.f32 q8, q8, q13
vmul.f32 q9, q9, q14
vmul.f32 q10, q10, q15
/*
vrshrn.s32 d14, q7, #14
vrshrn.s32 d15, q8, #14
vrshrn.s32 d18, q9, #14
vrshrn.s32 d19, q10, #14
*/
.macro ROUND_TWO x0, x1
vcgt.f32 q2, \x0, #0
vcgt.f32 q3, \x1, #0
vbsl.f32 q2, q0, q1
vbsl.f32 q3, q0, q1
vadd.f32 \x0, q2, \x0
vadd.f32 \x1, q3, \x1
vcvt.s32.f32 \x0, \x0
vcvt.s32.f32 \x1, \x1
.endm
ROUND_TWO q7, q8
ROUND_TWO q9, q10
vqmovn.s32 d14, q7
vqmovn.s32 d15, q8
vqmovn.s32 d18, q9
vqmovn.s32 d19, q10
vqmovn.s16 d14, q7
vqmovn.s16 d15, q9
vmin.s8 d14, d14, d23
vmax.s8 d14, d14, d22
vmin.s8 d15, d15, d23
vmax.s8 d15, d15, d22
vst1.32 {q7}, [r0]!
vmov.i32 r1, d12[0]
vmov.i32 r2, d12[1]
add r1, r1, r5
subs r4, r4, #1
bne L1Loop
End:
vpop {q4-q7}
pop {r4-r8, r10, r11, pc}
#endif
#endif