parent
19874b83e7
commit
96d01f17ec
@ -0,0 +1,130 @@
|
||||
|
||||
.text
|
||||
.align 5
|
||||
.global PreSum4x16Int8Peroc
|
||||
#ifndef __APPLE__
|
||||
.type PreSum4x16Int8Peroc, %function
|
||||
#endif
|
||||
|
||||
|
||||
//void PreSum4x16Int8Peroc(const int8_t *src, int32_t *sum, int32_t *zp, size_t hw4, size_t ic16, int32_t oc_div2,
|
||||
// size_t oc_res2, size_t stride);
|
||||
|
||||
// r0 src
|
||||
// r1 sum
|
||||
// r2 zp
|
||||
// r3 hw4
|
||||
// r4 ic16
|
||||
// r5 oc_div2
|
||||
// r6 oc_res2
|
||||
// r7 stride
|
||||
|
||||
PreSum4x16Int8Peroc:
|
||||
push {r4-r8, r10, r11, lr}
|
||||
vpush {q4-q7}
|
||||
add sp, sp, #96
|
||||
|
||||
ldr r4, [sp]
|
||||
ldr r5, [sp, #4]
|
||||
ldr r6, [sp, #8]
|
||||
ldr r7, [sp, #12]
|
||||
|
||||
mov r8, #0
|
||||
mov r10, #8
|
||||
|
||||
RowLoop:
|
||||
cmp r8, r3
|
||||
beq End
|
||||
add r8, r8, #4
|
||||
vmov.s32 q13, #0
|
||||
mov r9, #0
|
||||
mov r11, r2
|
||||
|
||||
Sum:
|
||||
cmp r9, r4
|
||||
beq Mul
|
||||
add r9, r9, #16
|
||||
|
||||
vld1.8 {q0, q1}, [r0]!
|
||||
vld1.8 {q2, q3}, [r0]!
|
||||
|
||||
vpaddl.s8 q4, q0
|
||||
vpaddl.s8 q5, q1
|
||||
vpaddl.s8 q6, q2
|
||||
vpaddl.s8 q7, q3
|
||||
|
||||
vpaddl.s16 q0, q4
|
||||
vpaddl.s16 q1, q5
|
||||
vpaddl.s16 q2, q6
|
||||
vpaddl.s16 q3, q7
|
||||
|
||||
vpaddl.s32 q4, q0
|
||||
vpaddl.s32 q5, q1
|
||||
vpaddl.s32 q6, q2
|
||||
vpaddl.s32 q7, q3
|
||||
|
||||
vqmovn.s64 d0, q4
|
||||
vqmovn.s64 d1, q5
|
||||
vqmovn.s64 d2, q6
|
||||
vqmovn.s64 d3, q7
|
||||
|
||||
vpaddl.s32 q4, q0
|
||||
vpaddl.s32 q5, q1
|
||||
|
||||
vqmovn.s64 d0, q4
|
||||
vqmovn.s64 d1, q5
|
||||
|
||||
vadd.i32 q13, q13, q0
|
||||
b Sum
|
||||
|
||||
Mul:
|
||||
mov r12, r1
|
||||
add r1, r1, #32
|
||||
mov r9, #0
|
||||
|
||||
vdup.32 d1, d26[0]
|
||||
vdup.32 d2, d26[1]
|
||||
vdup.32 d3, d27[0]
|
||||
vdup.32 d4, d27[1]
|
||||
|
||||
Write:
|
||||
|
||||
cmp r9, r5
|
||||
beq OcRes
|
||||
add r9, r9, #2
|
||||
vld1.32 {d9}, [r11]!
|
||||
|
||||
vmul.i32 d5, d1, d9
|
||||
vmul.i32 d6, d2, d9
|
||||
vmul.i32 d7, d3, d9
|
||||
vmul.i32 d8, d4, d9
|
||||
|
||||
vst1.32 d5, [r12], r10
|
||||
vst1.32 d6, [r12], r10
|
||||
vst1.32 d7, [r12], r10
|
||||
vst1.32 d8, [r12], r10
|
||||
add r12, r12, r7
|
||||
b Write
|
||||
|
||||
OcRes:
|
||||
cmp r6, #0
|
||||
beq RowLoop
|
||||
|
||||
vmov.s32 d9, #0
|
||||
vld1.8 {d9[0]}, [r11]
|
||||
|
||||
vmul.i32 d5, d1, d9
|
||||
vmul.i32 d6, d2, d9
|
||||
vmul.i32 d7, d3, d9
|
||||
vmul.i32 d8, d4, d9
|
||||
|
||||
vst1.32 d5, [r12], r10
|
||||
vst1.32 d6, [r12], r10
|
||||
vst1.32 d7, [r12], r10
|
||||
vst1.32 d8, [r12], r10
|
||||
b RowLoop
|
||||
|
||||
End:
|
||||
sub sp, sp, #96
|
||||
vpop {q4-q7}
|
||||
pop {r4-r8, r10, r11, pc}
|
@ -0,0 +1,81 @@
|
||||
|
||||
.text
|
||||
.align 5
|
||||
.global PreSum4x16Int8Pert
|
||||
#ifndef __APPLE__
|
||||
.type PreSum4x16Int8Pert, %function
|
||||
#endif
|
||||
|
||||
|
||||
// void PreSum4x16Int8Pert(const int8_t *src, int32_t *sum, size_t row4, size_t col16, int32_t filter_zp);
|
||||
|
||||
// r0 src
|
||||
// r1 sum
|
||||
// r2 row4
|
||||
// r3 co16
|
||||
// r4 filter_zp
|
||||
|
||||
PreSum4x16Int8Pert:
|
||||
push {r4-r8, r10, r11, lr}
|
||||
vpush {q4-q7}
|
||||
add sp, sp, #96
|
||||
|
||||
ldr r4, [sp]
|
||||
|
||||
vdup.32 q10, r4
|
||||
mov r5, #0
|
||||
mov r7, #16
|
||||
|
||||
RowLoop:
|
||||
cmp r5, r2
|
||||
beq End
|
||||
add r5, r5, #4
|
||||
vmov.s32 q13, #0
|
||||
mov r6, #0
|
||||
|
||||
CalLoop:
|
||||
cmp r6, r3
|
||||
beq Write
|
||||
add r6, r6, #16
|
||||
|
||||
vld1.8 {q0, q1}, [r0]!
|
||||
vld1.8 {q2, q3}, [r0]!
|
||||
|
||||
vpaddl.s8 q4, q0
|
||||
vpaddl.s8 q5, q1
|
||||
vpaddl.s8 q6, q2
|
||||
vpaddl.s8 q7, q3
|
||||
|
||||
vpaddl.s16 q0, q4
|
||||
vpaddl.s16 q1, q5
|
||||
vpaddl.s16 q2, q6
|
||||
vpaddl.s16 q3, q7
|
||||
|
||||
vpaddl.s32 q4, q0
|
||||
vpaddl.s32 q5, q1
|
||||
vpaddl.s32 q6, q2
|
||||
vpaddl.s32 q7, q3
|
||||
|
||||
vqmovn.s64 d0, q4
|
||||
vqmovn.s64 d1, q5
|
||||
vqmovn.s64 d2, q6
|
||||
vqmovn.s64 d3, q7
|
||||
|
||||
vpaddl.s32 q4, q0
|
||||
vpaddl.s32 q5, q1
|
||||
|
||||
vqmovn.s64 d0, q4
|
||||
vqmovn.s64 d1, q5
|
||||
|
||||
vadd.i32 q13, q13, q0
|
||||
b CalLoop
|
||||
|
||||
Write:
|
||||
vmul.i32 q13, q13, q10
|
||||
vst1.32 q13, [r1], r7
|
||||
beq RowLoop
|
||||
|
||||
End:
|
||||
sub sp, sp, #96
|
||||
vpop {q4-q7}
|
||||
pop {r4-r8, r10, r11, pc}
|
@ -0,0 +1,129 @@
|
||||
|
||||
#ifdef __aarch64__
|
||||
.text
|
||||
.align 5
|
||||
//.p2align 5,,15
|
||||
.global PreSum4x16Int8Peroc
|
||||
#ifndef __APPLE__
|
||||
.type PreSum4x16Int8Peroc, %function
|
||||
#endif
|
||||
|
||||
//void PreSum4x16Int8Peroc(const int8_t *src, int32_t *sum, int32_t *zp, size_t hw4, size_t ic16, int32_t oc_div4,
|
||||
// size_t oc_res4, size_t stride);
|
||||
|
||||
// x0 src
|
||||
// x1 sum
|
||||
// x2 zp
|
||||
// w3 hw4
|
||||
// w4 ic16
|
||||
// w5 oc_div4
|
||||
// w6 oc_res4
|
||||
// w7 stride
|
||||
|
||||
PreSum4x16Int8Peroc:
|
||||
mov w8, #0
|
||||
|
||||
RowLoop:
|
||||
cmp w8, w3
|
||||
beq End
|
||||
add w8, w8, #4
|
||||
dup v16.4s, wzr
|
||||
mov w9, #0
|
||||
mov x16, x2
|
||||
|
||||
Sum:
|
||||
cmp w9, w4
|
||||
beq Mul
|
||||
add w9, w9, #16
|
||||
|
||||
ld1 {v0.16b}, [x0], #16
|
||||
ld1 {v1.16b}, [x0], #16
|
||||
ld1 {v2.16b}, [x0], #16
|
||||
ld1 {v3.16b}, [x0], #16
|
||||
|
||||
saddlp v4.8h, v0.16b
|
||||
saddlp v5.8h, v1.16b
|
||||
saddlp v6.8h, v2.16b
|
||||
saddlp v7.8h, v3.16b
|
||||
saddlp v0.4S, v4.8h
|
||||
saddlp v1.4S, v5.8h
|
||||
saddlp v2.4S, v6.8h
|
||||
saddlp v3.4S, v7.8h
|
||||
addv s4, v0.4S
|
||||
addv s5, v1.4S
|
||||
addv s6, v2.4S
|
||||
addv s7, v3.4S
|
||||
mov v0.s[0], v4.s[0]
|
||||
mov v0.s[1], v5.s[0]
|
||||
mov v0.s[2], v6.s[0]
|
||||
mov v0.s[3], v7.s[0]
|
||||
|
||||
add v16.4s, v16.4s, v0.4s
|
||||
b Sum
|
||||
|
||||
Mul:
|
||||
mov x12, x1
|
||||
add x1, x1, #64
|
||||
mov w9, #0
|
||||
|
||||
dup v1.4s, v16.s[0]
|
||||
dup v2.4s, v16.s[1]
|
||||
dup v3.4s, v16.s[2]
|
||||
dup v4.4s, v16.s[3]
|
||||
|
||||
WriteOc4:
|
||||
cmp w9, w5
|
||||
beq OcRes4
|
||||
add w9, w9, #4
|
||||
ld1 {v5.4s}, [x16], #16
|
||||
|
||||
mul v16.4s, v5.4s, v1.4s
|
||||
mul v17.4s, v5.4s, v2.4s
|
||||
mul v18.4s, v5.4s, v3.4s
|
||||
mul v19.4s, v5.4s, v4.4s
|
||||
st1 {v16.4s}, [x12], #16
|
||||
st1 {v17.4s}, [x12], #16
|
||||
st1 {v18.4s}, [x12], #16
|
||||
st1 {v19.4s}, [x12], #16
|
||||
add x12, x12, x7
|
||||
b WriteOc4
|
||||
|
||||
OcRes4:
|
||||
cmp w6, #0
|
||||
beq RowLoop
|
||||
dup v15.4s, wzr
|
||||
cmp w6, #1
|
||||
beq OcRes4_1
|
||||
cmp w6, #2
|
||||
beq OcRes4_2
|
||||
cmp w6, #3
|
||||
beq OcRes4_3
|
||||
|
||||
OcRes4_1:
|
||||
ld1 {v15.s}[0], [x16]
|
||||
b OcRes4End
|
||||
|
||||
OcRes4_2:
|
||||
ld1 {v15.h}[0], [x16]
|
||||
b OcRes4End
|
||||
|
||||
OcRes4_3:
|
||||
ld1 {v15.h}[0], [x16]
|
||||
add x16, x16, #8
|
||||
ld1 {v15.s}[2], [x16]
|
||||
b OcRes4End
|
||||
|
||||
OcRes4End:
|
||||
mul v16.4s, v15.4s, v1.4s
|
||||
mul v17.4s, v15.4s, v2.4s
|
||||
mul v18.4s, v15.4s, v3.4s
|
||||
mul v19.4s, v15.4s, v4.4s
|
||||
st1 {v16.4s}, [x12], #16
|
||||
st1 {v17.4s}, [x12], #16
|
||||
st1 {v18.4s}, [x12], #16
|
||||
st1 {v19.4s}, [x12], #16
|
||||
b RowLoop
|
||||
|
||||
End:
|
||||
ret
|
||||
#endif
|
@ -0,0 +1,70 @@
|
||||
|
||||
#ifdef __aarch64__
|
||||
.text
|
||||
.align 5
|
||||
//.p2align 5,,15
|
||||
.global PreSum4x16Int8Pert
|
||||
#ifndef __APPLE__
|
||||
.type PreSum4x16Int8Pert, %function
|
||||
#endif
|
||||
|
||||
// void PreSum4x16Int8Pert(const int8_t *src, int32_t *dst, size_t row4, size_t col16, int32_t filter_zp);
|
||||
|
||||
// x0 src
|
||||
// x1 dst
|
||||
// w2 row4
|
||||
// w3 co16
|
||||
// w4 filter_zp
|
||||
|
||||
PreSum4x16Int8Pert:
|
||||
dup v17.4s, w4
|
||||
mov w5, #0
|
||||
|
||||
RowLoop:
|
||||
cmp w5, w2
|
||||
beq End
|
||||
add w5, w5, #4
|
||||
dup v16.4s, wzr
|
||||
mov w6, #0
|
||||
|
||||
CalLoop:
|
||||
cmp w6, w3
|
||||
beq Write
|
||||
add w6, w6, #16
|
||||
|
||||
ld1 {v0.16b}, [x0], #16
|
||||
ld1 {v1.16b}, [x0], #16
|
||||
ld1 {v2.16b}, [x0], #16
|
||||
ld1 {v3.16b}, [x0], #16
|
||||
|
||||
saddlp v4.8h, v0.16b
|
||||
saddlp v5.8h, v1.16b
|
||||
saddlp v6.8h, v2.16b
|
||||
saddlp v7.8h, v3.16b
|
||||
|
||||
saddlp v0.4S, v4.8h
|
||||
saddlp v1.4S, v5.8h
|
||||
saddlp v2.4S, v6.8h
|
||||
saddlp v3.4S, v7.8h
|
||||
|
||||
addv s4, v0.4S
|
||||
addv s5, v1.4S
|
||||
addv s6, v2.4S
|
||||
addv s7, v3.4S
|
||||
|
||||
mov v0.s[0], v4.s[0]
|
||||
mov v0.s[1], v5.s[0]
|
||||
mov v0.s[2], v6.s[0]
|
||||
mov v0.s[3], v7.s[0]
|
||||
|
||||
add v16.4s, v16.4s, v0.4s
|
||||
b CalLoop
|
||||
|
||||
Write:
|
||||
mul v16.4s, v16.4s, v17.4s
|
||||
st1 {v16.4s}, [x1], #16
|
||||
beq RowLoop
|
||||
|
||||
End:
|
||||
ret
|
||||
#endif
|
Loading…
Reference in new issue