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

476 lines
9.7 KiB
ArmAsm

//
// MNNFloat2Int8.S
// MNN
//
// Created by MNN on 2019/01/22.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
asm_function MNNFloat2Int8
//void MNNFloat2Int8(const float* src, int8_t* dst, size_t sizeQuad, float* scale, size_t aMin, size_t aMax, float* zeroPoint, ssize_t quanParamVec);
//x0:src, x1:dst, x2:sizeQuad, x3:scale, x4:aMin, x5:aMax, x6:zeroPoint, x7: quanParamVec
stp d14, d15, [sp, #-64]!
stp d12, d13, [sp, #16]
stp d10, d11, [sp, #32]
stp d8, d9, [sp, #48]
ld1r {v31.4s}, [x3]
dup v30.16b, w4
dup v29.16b, w5
// copy zero point
ld1r {v28.4s}, [x6]
cmp x7, #3
bne LOAD_SCALE_VEC
ld1 {v31.4s}, [x3] // scale
ld1 {v28.4s}, [x6] // zero
b FL32
LOAD_SCALE_VEC:
cmp x7, #1
bne LOAD_ZERO_VEC
ld1 {v31.4s}, [x3] // scale
b FL32
LOAD_ZERO_VEC:
cmp x7, #2
bne FL32
ld1 {v28.4s}, [x6] // zero
FL32:
cmp x2, #32
ble FL16
FLLoop32:
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64
ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x0], #64
ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0], #64
ld1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x0], #64
ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [x0], #64
ld1 {v20.4s, v21.4s, v22.4s, v23.4s}, [x0], #64
// ld1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x0], #64
// ld1 {v28.4s, v29.4s, v30.4s, v31.4s}, [x0], #64
fmul v0.4s, v0.4s, v31.4s
fmul v1.4s, v1.4s, v31.4s
fmul v2.4s, v2.4s, v31.4s
fmul v3.4s, v3.4s, v31.4s
fmul v4.4s, v4.4s, v31.4s
fmul v5.4s, v5.4s, v31.4s
fmul v6.4s, v6.4s, v31.4s
fmul v7.4s, v7.4s, v31.4s
fmul v8.4s, v8.4s, v31.4s
fmul v9.4s, v9.4s, v31.4s
fmul v10.4s, v10.4s, v31.4s
fmul v11.4s, v11.4s, v31.4s
fmul v12.4s, v12.4s, v31.4s
fmul v13.4s, v13.4s, v31.4s
fmul v14.4s, v14.4s, v31.4s
fmul v15.4s, v15.4s, v31.4s
fmul v16.4s, v16.4s, v31.4s
fmul v17.4s, v17.4s, v31.4s
fmul v18.4s, v18.4s, v31.4s
fmul v19.4s, v19.4s, v31.4s
fmul v20.4s, v20.4s, v31.4s
fmul v21.4s, v21.4s, v31.4s
fmul v22.4s, v22.4s, v31.4s
fmul v23.4s, v23.4s, v31.4s
fadd v0.4s, v0.4s, v28.4s
fadd v1.4s, v1.4s, v28.4s
fadd v2.4s, v2.4s, v28.4s
fadd v3.4s, v3.4s, v28.4s
fadd v4.4s, v4.4s, v28.4s
fadd v5.4s, v5.4s, v28.4s
fadd v6.4s, v6.4s, v28.4s
fadd v7.4s, v7.4s, v28.4s
fadd v8.4s, v8.4s, v28.4s
fadd v9.4s, v9.4s, v28.4s
fadd v10.4s, v10.4s, v28.4s
fadd v11.4s, v11.4s, v28.4s
fadd v12.4s, v12.4s, v28.4s
fadd v13.4s, v13.4s, v28.4s
fadd v14.4s, v14.4s, v28.4s
fadd v15.4s, v15.4s, v28.4s
fadd v16.4s, v16.4s, v28.4s
fadd v17.4s, v17.4s, v28.4s
fadd v18.4s, v18.4s, v28.4s
fadd v19.4s, v19.4s, v28.4s
fadd v20.4s, v20.4s, v28.4s
fadd v21.4s, v21.4s, v28.4s
fadd v22.4s, v22.4s, v28.4s
fadd v23.4s, v23.4s, v28.4s
fcvtas v0.4s, v0.4s
fcvtas v1.4s, v1.4s
fcvtas v2.4s, v2.4s
fcvtas v3.4s, v3.4s
fcvtas v4.4s, v4.4s
fcvtas v5.4s, v5.4s
fcvtas v6.4s, v6.4s
fcvtas v7.4s, v7.4s
fcvtas v8.4s, v8.4s
fcvtas v9.4s, v9.4s
fcvtas v10.4s, v10.4s
fcvtas v11.4s, v11.4s
fcvtas v12.4s, v12.4s
fcvtas v13.4s, v13.4s
fcvtas v14.4s, v14.4s
fcvtas v15.4s, v15.4s
fcvtas v16.4s, v16.4s
fcvtas v17.4s, v17.4s
fcvtas v18.4s, v18.4s
fcvtas v19.4s, v19.4s
fcvtas v20.4s, v20.4s
fcvtas v21.4s, v21.4s
fcvtas v22.4s, v22.4s
fcvtas v23.4s, v23.4s
sqxtn v24.4h, v0.4s
sqxtn2 v24.8h, v1.4s
sqxtn v25.4h, v2.4s
sqxtn2 v25.8h, v3.4s
sqxtn v26.4h, v4.4s
sqxtn2 v26.8h, v5.4s
sqxtn v27.4h, v6.4s
sqxtn2 v27.8h, v7.4s
sqxtn v0.4h, v8.4s
sqxtn2 v0.8h, v9.4s
sqxtn v1.4h, v10.4s
sqxtn2 v1.8h, v11.4s
sqxtn v2.4h, v12.4s
sqxtn2 v2.8h, v13.4s
sqxtn v3.4h, v14.4s
sqxtn2 v3.8h, v15.4s
sqxtn v4.4h, v16.4s
sqxtn2 v4.8h, v17.4s
sqxtn v5.4h, v18.4s
sqxtn2 v5.8h, v19.4s
sqxtn v6.4h, v20.4s
sqxtn2 v6.8h, v21.4s
sqxtn v7.4h, v22.4s
sqxtn2 v7.8h, v23.4s
ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0], #64
ld1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x0], #64
sqxtn v24.8b, v24.8h
sqxtn2 v24.16b, v25.8h
sqxtn v26.8b, v26.8h
sqxtn2 v26.16b, v27.8h
sqxtn v0.8b, v0.8h
sqxtn2 v0.16b, v1.8h
sqxtn v2.8b, v2.8h
sqxtn2 v2.16b, v3.8h
sqxtn v4.8b, v4.8h
sqxtn v6.8b, v6.8h
sqxtn2 v4.16b, v5.8h
sqxtn2 v6.16b, v7.8h
fmul v8.4s, v8.4s, v31.4s
fmul v9.4s, v9.4s, v31.4s
fmul v10.4s, v10.4s, v31.4s
fmul v11.4s, v11.4s, v31.4s
fmul v12.4s, v12.4s, v31.4s
fmul v13.4s, v13.4s, v31.4s
fmul v14.4s, v14.4s, v31.4s
fmul v15.4s, v15.4s, v31.4s
fadd v8.4s, v8.4s, v28.4s
fadd v9.4s, v9.4s, v28.4s
fadd v10.4s, v10.4s, v28.4s
fadd v11.4s, v11.4s, v28.4s
fadd v12.4s, v12.4s, v28.4s
fadd v13.4s, v13.4s, v28.4s
fadd v14.4s, v14.4s, v28.4s
fadd v15.4s, v15.4s, v28.4s
fcvtas v8.4s, v8.4s
fcvtas v9.4s, v9.4s
fcvtas v10.4s, v10.4s
fcvtas v11.4s, v11.4s
fcvtas v12.4s, v12.4s
fcvtas v13.4s, v13.4s
fcvtas v14.4s, v14.4s
fcvtas v15.4s, v15.4s
sqxtn v16.4h, v8.4s
sqxtn2 v16.8h, v9.4s
sqxtn v17.4h, v10.4s
sqxtn2 v17.8h, v11.4s
sqxtn v18.4h, v12.4s
sqxtn2 v18.8h, v13.4s
sqxtn v19.4h, v14.4s
sqxtn2 v19.8h, v15.4s
smin v24.16b, v24.16b, v29.16b
smin v25.16b, v26.16b, v29.16b
smax v24.16b, v24.16b, v30.16b
smax v25.16b, v25.16b, v30.16b
sqxtn v20.8b, v16.8h
sqxtn2 v20.16b, v17.8h
sqxtn v21.8b, v18.8h
sqxtn2 v21.16b, v19.8h
smin v26.16b, v0.16b, v29.16b
smin v27.16b, v2.16b, v29.16b
smax v26.16b, v26.16b, v30.16b
smax v27.16b, v27.16b, v30.16b
smin v12.16b, v4.16b, v29.16b
smin v13.16b, v6.16b, v29.16b
smax v12.16b, v12.16b, v30.16b
smax v13.16b, v13.16b, v30.16b
smin v14.16b, v20.16b, v29.16b
smin v15.16b, v21.16b, v29.16b
smax v14.16b, v14.16b, v30.16b
smax v15.16b, v15.16b, v30.16b
st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x1], #64
st1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x1], #64
sub x2, x2, #32
cmp x2, #32
bge FLLoop32
FL16:
cmp x2, #16
ble FL8
FLLoop16:
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64
ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x0], #64
ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0], #64
ld1 {v12.4s, v13.4s, v14.4s, v15.4s}, [x0], #64
fmul v0.4s, v0.4s, v31.4s
fmul v1.4s, v1.4s, v31.4s
fmul v2.4s, v2.4s, v31.4s
fmul v3.4s, v3.4s, v31.4s
fmul v4.4s, v4.4s, v31.4s
fmul v5.4s, v5.4s, v31.4s
fmul v6.4s, v6.4s, v31.4s
fmul v7.4s, v7.4s, v31.4s
fmul v8.4s, v8.4s, v31.4s
fmul v9.4s, v9.4s, v31.4s
fmul v10.4s, v10.4s, v31.4s
fmul v11.4s, v11.4s, v31.4s
fmul v12.4s, v12.4s, v31.4s
fmul v13.4s, v13.4s, v31.4s
fmul v14.4s, v14.4s, v31.4s
fmul v15.4s, v15.4s, v31.4s
fadd v0.4s, v0.4s, v28.4s
fadd v1.4s, v1.4s, v28.4s
fadd v2.4s, v2.4s, v28.4s
fadd v3.4s, v3.4s, v28.4s
fadd v4.4s, v4.4s, v28.4s
fadd v5.4s, v5.4s, v28.4s
fadd v6.4s, v6.4s, v28.4s
fadd v7.4s, v7.4s, v28.4s
fadd v8.4s, v8.4s, v28.4s
fadd v9.4s, v9.4s, v28.4s
fadd v10.4s, v10.4s, v28.4s
fadd v11.4s, v11.4s, v28.4s
fadd v12.4s, v12.4s, v28.4s
fadd v13.4s, v13.4s, v28.4s
fadd v14.4s, v14.4s, v28.4s
fadd v15.4s, v15.4s, v28.4s
fcvtas v0.4s, v0.4s
fcvtas v1.4s, v1.4s
fcvtas v2.4s, v2.4s
fcvtas v3.4s, v3.4s
fcvtas v4.4s, v4.4s
fcvtas v5.4s, v5.4s
fcvtas v6.4s, v6.4s
fcvtas v7.4s, v7.4s
fcvtas v8.4s, v8.4s
fcvtas v9.4s, v9.4s
fcvtas v10.4s, v10.4s
fcvtas v11.4s, v11.4s
fcvtas v12.4s, v12.4s
fcvtas v13.4s, v13.4s
fcvtas v14.4s, v14.4s
fcvtas v15.4s, v15.4s
sqxtn v16.4h, v0.4s
sqxtn2 v16.8h, v1.4s
sqxtn v17.4h, v2.4s
sqxtn2 v17.8h, v3.4s
sqxtn v18.4h, v4.4s
sqxtn2 v18.8h, v5.4s
sqxtn v19.4h, v6.4s
sqxtn2 v19.8h, v7.4s
sqxtn v20.4h, v8.4s
sqxtn2 v20.8h, v9.4s
sqxtn v21.4h, v10.4s
sqxtn2 v21.8h, v11.4s
sqxtn v22.4h, v12.4s
sqxtn2 v22.8h, v13.4s
sqxtn v23.4h, v14.4s
sqxtn2 v23.8h, v15.4s
sqxtn v24.8b, v16.8h
sqxtn2 v24.16b, v17.8h
sqxtn v25.8b, v18.8h
sqxtn2 v25.16b, v19.8h
sqxtn v26.8b, v20.8h
sqxtn2 v26.16b, v21.8h
sqxtn v27.8b, v22.8h
sqxtn2 v27.16b, v23.8h
smin v24.16b, v24.16b, v29.16b
smax v24.16b, v24.16b, v30.16b
smin v25.16b, v25.16b, v29.16b
smax v25.16b, v25.16b, v30.16b
smin v26.16b, v26.16b, v29.16b
smax v26.16b, v26.16b, v30.16b
smin v27.16b, v27.16b, v29.16b
smax v27.16b, v27.16b, v30.16b
st1 {v24.4s, v25.4s, v26.4s, v27.4s}, [x1], #64
sub x2, x2, #16
cmp x2, #16
bge FLLoop16
FL8:
cmp x2, #8
ble FL4
FLLoop8:
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64
ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x0], #64
fmul v0.4s, v0.4s, v31.4s
fmul v1.4s, v1.4s, v31.4s
fmul v2.4s, v2.4s, v31.4s
fmul v3.4s, v3.4s, v31.4s
fmul v4.4s, v4.4s, v31.4s
fmul v5.4s, v5.4s, v31.4s
fmul v6.4s, v6.4s, v31.4s
fmul v7.4s, v7.4s, v31.4s
fadd v0.4s, v0.4s, v28.4s
fadd v1.4s, v1.4s, v28.4s
fadd v2.4s, v2.4s, v28.4s
fadd v3.4s, v3.4s, v28.4s
fadd v4.4s, v4.4s, v28.4s
fadd v5.4s, v5.4s, v28.4s
fadd v6.4s, v6.4s, v28.4s
fadd v7.4s, v7.4s, v28.4s
fcvtas v0.4s, v0.4s
fcvtas v1.4s, v1.4s
fcvtas v2.4s, v2.4s
fcvtas v3.4s, v3.4s
fcvtas v4.4s, v4.4s
fcvtas v5.4s, v5.4s
fcvtas v6.4s, v6.4s
fcvtas v7.4s, v7.4s
sqxtn v8.4h, v0.4s
sqxtn2 v8.8h, v1.4s
sqxtn v9.4h, v2.4s
sqxtn2 v9.8h, v3.4s
sqxtn v10.4h, v4.4s
sqxtn2 v10.8h, v5.4s
sqxtn v11.4h, v6.4s
sqxtn2 v11.8h, v7.4s
sqxtn v12.8b, v8.8h
sqxtn2 v12.16b, v9.8h
sqxtn v13.8b, v10.8h
sqxtn2 v13.16b, v11.8h
smin v12.16b, v12.16b, v29.16b
smax v12.16b, v12.16b, v30.16b
smin v13.16b, v13.16b, v29.16b
smax v13.16b, v13.16b, v30.16b
st1 {v12.4s, v13.4s}, [x1], #32
sub x2, x2, #8
cmp x2, #8
bge FLLoop8
FL4:
cmp x2, #3
ble FL1
FLLoop4:
ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64
fmul v0.4s, v0.4s, v31.4s
fmul v1.4s, v1.4s, v31.4s
fmul v2.4s, v2.4s, v31.4s
fmul v3.4s, v3.4s, v31.4s
fadd v0.4s, v0.4s, v28.4s
fadd v1.4s, v1.4s, v28.4s
fadd v2.4s, v2.4s, v28.4s
fadd v3.4s, v3.4s, v28.4s
fcvtas v0.4s, v0.4s
fcvtas v4.4s, v2.4s
fcvtas v6.4s, v3.4s
fcvtas v2.4s, v1.4s
sqxtn v0.4h, v0.4s
sqxtn2 v0.8h, v2.4s
sqxtn v1.4h, v4.4s
sqxtn2 v1.8h, v6.4s
sqxtn v0.8b, v0.8h
sqxtn2 v0.16b, v1.8h
smin v0.16b, v0.16b, v29.16b
smax v0.16b, v0.16b, v30.16b
st1 {v0.4s}, [x1], #16
sub x2, x2, #4
cmp x2, #4
bge FLLoop4
FL1:
cmp x2, #0
beq FLEnd
FLLoop1:
ld1 {v0.4s}, [x0], #16
fmul v0.4s, v0.4s, v31.4s
fadd v0.4s, v0.4s, v28.4s
//st1 {v31.4s}, [x0], #16
fcvtas v0.4s, v0.4s
sqxtn v0.4h, v0.4s
sqxtn v0.8b, v0.8h
smin v0.8b, v0.8b, v29.8b
smax v0.8b, v0.8b, v30.8b
st1 {v0.s}[0], [x1], #4
subs x2, x2, #1
bne FLLoop1
FLEnd:
ldp d8, d9, [sp, #48]
ldp d10, d11, [sp, #32]
ldp d12, d13, [sp, #16]
ldp d14, d15, [sp], #64
ret
#endif