91 lines
1.7 KiB
ArmAsm
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
|