Files
alibaba--mnn/source/backend/cpu/arm/arm32/MNNStrassenMergeCFunction.S
2026-07-13 13:33:03 +08:00

91 lines
1.7 KiB
ArmAsm

//
// MNNStrassenMergeCFunction.S
// MNN
//
// Created by MNN on 2019/02/14.
// Copyright © 2018, Alibaba Group Holding Limited
//
#ifdef __arm__
#ifndef __aarch64__
#include "MNNAsmGlobal.h"
.text
.align 5
asm_function MNNStrassenMergeCFunction
//void MNNStrassenMergeCFunction(float* c11, float* c12, float* c21, float* c22,
// float* xAddr, size_t cStride, size_t eSub, size_t hSub) {
push {r4-r8, r10, r11, lr} // avoid to touch platform-register r-9
//Auto: r0: c11, r1:c12, r2:c21, r3:c22
//Load from sp: r4: xAddr, r5: cStride, r6: eSub, r7: hSub
ldr r4, [sp, #32]
ldr r5, [sp, #36]
ldr r6, [sp, #40]
ldr r7, [sp, #44]
//r5 -> cExtraOffset
mov r12, #4 //sizeof(float)
mul r5, r12, r5
mov r11, #16
mul r11, r6, r11
sub r5, r5, r11
LoopY:
XL1:
subs r12, r6, #1
vld1.32 {q8}, [r4]!//x
vld1.32 {q12}, [r1]//c12
vld1.32 {q9}, [r2]//c21
vadd.f32 q12, q12, q8
vld1.32 {q10}, [r3]//c22
vadd.f32 q9, q9, q12
beq XEnd
LoopXL1:
vadd.f32 q12, q12, q10
vst1.32 {q9}, [r2]!
vld1.32 {q11}, [r0]! //c11
vadd.f32 q10, q10, q9
vld1.32 {q8}, [r4]!//x
vadd.f32 q12, q12, q11
vst1.32 {q10}, [r3]!
vst1.32 {q12}, [r1]!
vld1.32 {q12}, [r1]//c12
vld1.32 {q9}, [r2]//c21
vadd.f32 q12, q12, q8
vld1.32 {q10}, [r3]//c22
vadd.f32 q9, q9, q12
subs r12, r12, #1
bne LoopXL1
XEnd:
vadd.f32 q12, q12, q10
vst1.32 {q9}, [r2]!
vld1.32 {q11}, [r0]! //c11
vadd.f32 q10, q10, q9
vadd.f32 q12, q12, q11
vst1.32 {q10}, [r3]!
vst1.32 {q12}, [r1]!
add r0, r0, r5
add r1, r1, r5
add r2, r2, r5
add r3, r3, r5
subs r7, r7, #1
bne LoopY
pop {r4-r8, r10, r11, pc}
#endif
#endif