179 lines
3.1 KiB
ArmAsm
179 lines
3.1 KiB
ArmAsm
//
|
|
// MNNReluWithSlopeChannel.S
|
|
// MNN
|
|
//
|
|
// Created by MNN on 2023/07/06.
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
//
|
|
/*
|
|
struct QuanPrePostParameters{
|
|
float* inputScale;
|
|
float* outputScale;
|
|
ssize_t* inputZeroPoint;
|
|
ssize_t* outputZeroPoint;
|
|
ssize_t minValue;
|
|
ssize_t maxValue;
|
|
};
|
|
*/
|
|
#ifdef __aarch64__
|
|
#include "MNNAsmGlobal.h"
|
|
|
|
.text
|
|
.align 5
|
|
|
|
asm_function MNNReluWithSlopeChannelInt8
|
|
// MNNReluWithSlopeChannelInt8(int8_t* dst, const int8_t* src, const float* slope, size_t planeNumber, size_t depthQuad, QuanPrePostParameters *params)
|
|
// Auto load:
|
|
// x0: dst, x1: src, x2: slope, x3: planeNumber, x4: depthQuad, x5: params
|
|
// Load from x5: x9: outputZeroPoint, x10: minValue, x11: maxValue
|
|
|
|
ldr x12, [x5, #0]
|
|
ldr x13, [x5, #8]
|
|
ldr x8, [x5, #16]
|
|
ldr x9, [x5, #24]
|
|
ldr x10, [x5, #32]
|
|
ldr x11, [x5, #40]
|
|
|
|
|
|
stp d14, d15, [sp, #-64]!
|
|
stp d12, d13, [sp, #16]
|
|
stp d10, d11, [sp, #32]
|
|
stp d8, d9, [sp, #48]
|
|
|
|
cmp x3, #0
|
|
beq End
|
|
cmp x4, #0
|
|
beq End
|
|
|
|
ld1r {v29.16b}, [x8] // inputZeroPoint
|
|
ld1r {v28.16b}, [x9] // outputZeroPoint
|
|
dup v26.16b, w10
|
|
dup v27.16b, w11
|
|
ld1r {v24.4s}, [x12] // inputscale
|
|
ld1r {v25.4s}, [x13] // outputscale
|
|
/*
|
|
Quant parameters
|
|
*/
|
|
|
|
|
|
PReluZLoop:
|
|
ld1 {v31.4s}, [x2], #16 // slope
|
|
mov x5, x3
|
|
cmp x5, #3
|
|
ble PReluL1
|
|
|
|
PReluL4Loop:
|
|
ld1 {v0.16b}, [x1], #16
|
|
|
|
sxtl v1.8h, v0.8b
|
|
sxtl2 v2.8h, v0.16b
|
|
ssubw v1.8h, v1.8h, v29.8b
|
|
ssubw v2.8h, v2.8h, v29.8b
|
|
sxtl v3.4s, v1.4h
|
|
sxtl2 v4.4s, v1.8h
|
|
sxtl v5.4s, v2.4h
|
|
sxtl2 v6.4s, v2.8h
|
|
|
|
scvtf v3.4s, v3.4s
|
|
scvtf v4.4s, v4.4s
|
|
scvtf v5.4s, v5.4s
|
|
scvtf v6.4s, v6.4s
|
|
|
|
// input_scale
|
|
fmul v3.4s, v3.4s, v24.4s
|
|
fmul v4.4s, v4.4s, v24.4s
|
|
fmul v5.4s, v5.4s, v24.4s
|
|
fmul v6.4s, v6.4s, v24.4s
|
|
|
|
fcmle v7.4s, v3.4s, #0
|
|
fcmle v8.4s, v4.4s, #0
|
|
fcmle v9.4s, v5.4s, #0
|
|
fcmle v10.4s, v6.4s, #0
|
|
|
|
// *slope
|
|
fmul v11.4s, v3.4s, v31.4s
|
|
fmul v12.4s, v4.4s, v31.4s
|
|
fmul v13.4s, v5.4s, v31.4s
|
|
fmul v14.4s, v6.4s, v31.4s
|
|
|
|
bit v3.16b, v11.16b, v7.16b
|
|
bit v4.16b, v12.16b, v8.16b
|
|
bit v5.16b, v13.16b, v9.16b
|
|
bit v6.16b, v14.16b, v10.16b
|
|
|
|
// *output_scale
|
|
fmul v3.4s, v3.4s, v25.4s
|
|
fmul v4.4s, v4.4s, v25.4s
|
|
fmul v5.4s, v5.4s, v25.4s
|
|
fmul v6.4s, v6.4s, v25.4s
|
|
|
|
fcvtas v3.4s, v3.4s
|
|
fcvtas v4.4s, v4.4s
|
|
fcvtas v5.4s, v5.4s
|
|
fcvtas v6.4s, v6.4s
|
|
|
|
sqxtn v7.4h, v3.4s
|
|
sqxtn2 v7.8h, v4.4s
|
|
sqxtn v8.4h, v5.4s
|
|
sqxtn2 v8.8h, v6.4s
|
|
|
|
saddw v7.8h, v7.8h, v28.8b
|
|
saddw v8.8h, v8.8h, v28.8b
|
|
|
|
sqxtn v9.8b, v7.8h
|
|
sqxtn2 v9.16b, v8.8h
|
|
smax v9.16b, v9.16b, v26.16b
|
|
smin v9.16b, v9.16b, v27.16b
|
|
|
|
st1 {v9.16b}, [x0], #16
|
|
|
|
sub x5, x5, #4
|
|
cmp x5, #4
|
|
bge PReluL4Loop
|
|
|
|
PReluL1:
|
|
cmp x5, #0
|
|
|
|
beq PReluL1End
|
|
|
|
PReluL1Loop:
|
|
ld1 {v0.s}[0], [x1], #4
|
|
|
|
sxtl v1.8h, v0.8b
|
|
ssubw v1.8h, v1.8h, v29.8b
|
|
sxtl v1.4s, v1.4h
|
|
scvtf v1.4s, v1.4s
|
|
// *input_scale
|
|
fmul v1.4s, v1.4s, v24.4s
|
|
fcmle v7.4s, v1.4s, #0
|
|
// *slope
|
|
fmul v11.4s, v1.4s, v31.4s
|
|
bit v1.16b, v11.16b, v7.16b
|
|
// *output_scale
|
|
fmul v1.4s, v1.4s, v25.4s
|
|
|
|
fcvtas v1.4s, v1.4s
|
|
sqxtn v1.4h, v1.4s
|
|
saddw v1.8h, v1.8h, v28.8b
|
|
sqxtn v1.8b, v1.8h
|
|
smax v1.8b, v1.8b, v26.8b
|
|
smin v1.8b, v1.8b, v27.8b
|
|
|
|
st1 {v1.s}[0], [x0], #4
|
|
subs x5, x5, #1
|
|
bne PReluL1Loop
|
|
|
|
PReluL1End:
|
|
|
|
subs x4, x4, #1
|
|
bne PReluZLoop
|
|
|
|
End:
|
|
ldp d8, d9, [sp, #48]
|
|
ldp d10, d11, [sp, #32]
|
|
ldp d12, d13, [sp, #16]
|
|
ldp d14, d15, [sp], #64
|
|
ret
|
|
|
|
#endif
|