90 lines
1.8 KiB
ArmAsm
90 lines
1.8 KiB
ArmAsm
/*++
|
|
|
|
Copyright (C) 2023 Loongson Technology Corporation Limited. All rights reserved.
|
|
|
|
Licensed under the MIT License.
|
|
|
|
Module Name:
|
|
|
|
SgemmTransposePackB16x4LSX.s
|
|
|
|
Abstract:
|
|
|
|
This module implements routines for packing buffers for the single precision
|
|
matrix/matrix multiply operation (SGEMM).
|
|
|
|
This implementation uses Lsx instructions.
|
|
|
|
--*/
|
|
|
|
#include "asmmacro.h"
|
|
|
|
.text
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine transposes elements from the source matrix to the destination
|
|
packed buffer.
|
|
|
|
4 columns of 16 rows from the source matrix are transposed to 16 columns of 4
|
|
rows in the destination packed buffer.
|
|
|
|
Arguments:
|
|
|
|
D (a0) - Supplies the address of the destination packed buffer.
|
|
|
|
B (a1) - Supplies the address of the source matrix.
|
|
|
|
ldb (a2) - Supplies the number of elements per row of the source matrix.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
FUNCTION_ENTRY MlasSgemmTransposePackB16x4LSX
|
|
addi.d $sp, $sp, -64
|
|
st.d $s0, $sp, 0*8
|
|
st.d $s1, $sp, 1*8
|
|
slli.d $a2, $a2, 2 # convert ldb to bytes
|
|
ori $a3, $zero, 4 # transpose four 4x4 blocks
|
|
vxor.v $vr7, $vr7, $vr7
|
|
.LTransposeBlockLoop:
|
|
slli.d $s0, $a2, 1
|
|
add.d $s1, $a1, $s0
|
|
vld $vr0, $a1, 0
|
|
vldx $vr1, $a1, $a2
|
|
vld $vr2, $s1, 0
|
|
vldx $vr3, $s1, $a2
|
|
|
|
vor.v $vr4, $vr0, $vr7
|
|
vilvl.w $vr4, $vr1, $vr4
|
|
vilvh.w $vr0, $vr1, $vr0
|
|
vor.v $vr5, $vr2, $vr7
|
|
vilvl.w $vr5, $vr3, $vr5
|
|
vilvh.w $vr2, $vr3, $vr2
|
|
vor.v $vr1, $vr4, $vr7
|
|
vilvl.d $vr1, $vr5, $vr1
|
|
vilvh.d $vr4, $vr5, $vr4
|
|
vor.v $vr3, $vr0, $vr7
|
|
vilvl.d $vr3, $vr2, $vr3
|
|
vilvh.d $vr0, $vr2, $vr0
|
|
vst $vr1, $a0, 0
|
|
vst $vr4, $a0, 0x40
|
|
vst $vr3, $a0, 0x80
|
|
vst $vr0, $a0, 0xc0
|
|
addi.d $a0, $a0, 0x10
|
|
slli.d $s0, $a2, 1
|
|
add.d $a1, $s0, $s1
|
|
addi.d $a3, $a3, -1
|
|
bnez $a3, .LTransposeBlockLoop
|
|
ld.d $s0, $sp, 0*8
|
|
ld.d $s1, $sp, 1*8
|
|
addi.d $sp, $sp, 64
|
|
jr $ra
|
|
|
|
.end
|