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

115 lines
2.9 KiB
ArmAsm

//
// MNNTranspose16Bit8x8.S
// MNN
//
// Created by MNN on 2023/11/08.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
.macro TRANSPOSE_8x8 s0, s1, s2, s3, s4, s5, s6, s7, d0, d1, d2, d3, d4, d5, d6, d7, t0, t1, t2, t3, t4, t5, t6, t7
zip1 \t0\().8h, \s0\().8h, \s1\().8h
zip2 \t1\().8h, \s0\().8h, \s1\().8h
zip1 \t2\().8h, \s2\().8h, \s3\().8h
zip2 \t3\().8h, \s2\().8h, \s3\().8h
zip1 \t4\().8h, \s4\().8h, \s5\().8h
zip2 \t5\().8h, \s4\().8h, \s5\().8h
zip1 \t6\().8h, \s6\().8h, \s7\().8h
zip2 \t7\().8h, \s6\().8h, \s7\().8h
zip1 \s0\().4s, \t0\().4s, \t2\().4s
zip2 \s1\().4s, \t0\().4s, \t2\().4s
zip1 \s2\().4s, \t1\().4s, \t3\().4s
zip2 \s3\().4s, \t1\().4s, \t3\().4s
zip1 \s4\().4s, \t4\().4s, \t6\().4s
zip2 \s5\().4s, \t4\().4s, \t6\().4s
zip1 \s6\().4s, \t5\().4s, \t7\().4s
zip2 \s7\().4s, \t5\().4s, \t7\().4s
zip1 \d0\().2d, \s0\().2d, \s4\().2d
zip2 \d1\().2d, \s0\().2d, \s4\().2d
zip1 \d2\().2d, \s1\().2d, \s5\().2d
zip2 \d3\().2d, \s1\().2d, \s5\().2d
zip1 \d4\().2d, \s2\().2d, \s6\().2d
zip2 \d5\().2d, \s2\().2d, \s6\().2d
zip1 \d6\().2d, \s3\().2d, \s7\().2d
zip2 \d7\().2d, \s3\().2d, \s7\().2d
.endm
asm_function MNNTranspose16Bit8x8
//void MNNTranspose16Bit8x8(int16_t* dstO, const int16_t* srcO, int* dim)
//Auto: x0: dstO, x1:srcO, x2: dim
stp d14, d15, [sp, #(-16 * 4)]!
stp d12, d13, [sp, #(16 * 1)]
stp d10, d11, [sp, #(16 * 2)]
stp d8, d9, [sp, #(16 * 3)]
mov x4, #0
mov x5, #0
mov x6, #0
mov x7, #0
ldr w4, [x2, #0]
ldr w5, [x2, #4]
ldr w6, [x2, #8]
ldr w7, [x2, #12]
// x4, x5 -> wC8, hC8
lsr x4, x4, #3
lsr x5, x5, #3
// x6, x7 -> srcStride * sizeof(half), dstStride * sizeof(half)
lsl x6, x6, #1
lsl x7, x7, #1
LoopY:
mov x2, x4
mov x8, x0
mov x9, x1
LoopX:
ld1 {v0.8h}, [x1], x6
ld1 {v1.8h}, [x1], x6
ld1 {v2.8h}, [x1], x6
ld1 {v3.8h}, [x1], x6
ld1 {v4.8h}, [x1], x6
ld1 {v5.8h}, [x1], x6
ld1 {v6.8h}, [x1], x6
ld1 {v7.8h}, [x1], x6
TRANSPOSE_8x8 v0, v1, v2, v3, v4, v5, v6, v7, \
v8, v9, v10, v11, v12, v13, v14, v15, \
v16, v17, v18, v19, v20, v21, v22, v23
mov x12, x0
st1 {v8.8h}, [x12], x7
st1 {v9.8h}, [x12], x7
st1 {v10.8h}, [x12], x7
st1 {v11.8h}, [x12], x7
st1 {v12.8h}, [x12], x7
st1 {v13.8h}, [x12], x7
st1 {v14.8h}, [x12], x7
st1 {v15.8h}, [x12], x7
add x0, x0, #16 // 8 * sizeof(half)
subs x2, x2, #1
bne LoopX
lsl x12, x7, #3 // 8 * dstStride
subs x5, x5, #1
add x1, x9, #16 // 8 * sizeof(half)
add x0, x8, x12
bne LoopY
End:
ldp d8, d9, [sp, #(16 * 3)]
ldp d10, d11, [sp, #(16 * 2)]
ldp d12, d13, [sp, #(16 * 1)]
ldp d14, d15, [sp], #(16 * 4)
ret
#endif