154 lines
3.2 KiB
ArmAsm
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
|