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

119 lines
1.9 KiB
ArmAsm

//
// MNNSamplerC4NearestOpt.S
// MNN
//
// Created by MNN on 2018/12/22.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
//void MNNSamplerC4NearestOpt(const unsigned char* source, unsigned char* dest, float* points, size_t count, size_t iw, size_t ih, size_t yStride);
asm_function MNNSamplerC4NearestOpt
//Auto: x0:source, x1:dest, x2:points, x3:count
//x4: xMax, x5: yMax, x6:yStride
movi v19.4s, #0
ld1 {v0.2s, v1.2s}, [x2]
L4:
cmp x3, #4
blt L1
dup v16.4s, w4
dup v17.4s, w5
movi v3.2s, #4
scvtf v3.2s, v3.2s
fmul v3.2s, v3.2s, v1.2s
dup v25.4s, v3.s[0]
dup v26.4s, v3.s[1]
fadd v2.2s, v0.2s, v1.2s
mov v4.s[0], v0.s[0]
fadd v3.2s, v2.2s, v1.2s
mov v5.s[0], v0.s[1]
mov v4.s[1], v2.s[0]
mov v5.s[1], v2.s[1]
mov v4.s[2], v3.s[0]
fadd v2.2s, v3.2s, v1.2s
mov v5.s[2], v3.s[1]
mov v4.s[3], v2.s[0]
mov v5.s[3], v2.s[1]
dup v23.4s, w6 // yStride
movi v24.4s, #4
dup v22.2d, x0
L4Loop:
fcvtas v6.4s, v4.4s // x
fcvtas v7.4s, v5.4s // y
smin v6.4s, v6.4s, v16.4s
smin v7.4s, v7.4s, v17.4s
smax v6.4s, v6.4s, v19.4s
smax v7.4s, v7.4s, v19.4s
mul v7.4s, v7.4s, v23.4s
mla v7.4s, v6.4s, v24.4s // offset = y * yStride + bpp * x
uxtl v6.2d, v7.2s
uxtl2 v7.2d, v7.4s
add v6.2d, v6.2d, v22.2d
add v7.2d, v7.2d, v22.2d
mov x12, v6.d[0]
mov x13, v6.d[1]
ld1 {v3.s}[0], [x12]
mov x12, v7.d[0]
ld1 {v3.s}[1], [x13]
fadd v5.4s, v26.4s, v5.4s
mov x13, v7.d[1]
ld1 {v3.s}[2], [x12]
fadd v4.4s, v25.4s, v4.4s
ld1 {v3.s}[3], [x13]
st1 {v3.4s}, [x1], #16
sub x3, x3, #4
cmp x3, #4
bge L4Loop
mov v0.s[0], v4.s[0]
mov v0.s[1], v5.s[0]
L1:
cmp x3, #0
beq End
mov v6.s[0], w4
mov v6.s[1], w5
mov w12, #4
L1Loop:
fcvtas v2.2s, v0.2s
smax v2.2s, v2.2s, v19.2s
smin v2.2s, v2.2s, v6.2s
mov w4, v2.s[0]
mov w5, v2.s[1]
umull x5, w5, w6
umull x4, w4, w12
add x7, x0, x5
add x4, x4, x7
ld1 {v2.s}[0], [x4]
fadd v0.2s, v0.2s, v1.2s
subs x3, x3, #1
st1 {v2.s}[0], [x1], #4
bne L1Loop
End:
ret
#endif