Files
opencv/3rdparty/mlas/lib/loongarch64/SgemmTransposePackB16x4Lasx.S
T

127 lines
2.7 KiB
ArmAsm

/*++
Copyright (C) 2023 Loongson Technology Corporation Limited. All rights reserved.
Licensed under the MIT License.
Module Name:
SgemmTransposePackB16x4Lasx.s
Abstract:
This module implements routines for packing buffers for the single precision
matrix/matrix multiply operation (SGEMM).
This implementation uses Lasx instructions.
--*/
#include "asmmacro.h"
.text
/*++
Macro Description:
4 columns of 8 rows from the source matrix are transposed to 8 columns of 4
rows in the destination packed buffer.
Arguments:
StoreOffset - Supplies the relative byte offset into the destination packed
buffer.
Implicit Arguments:
a0 - Supplies the address of the destination packed buffer.
a1 - Supplies the address of the source matrix.
a2 - Supplies the number of elements per row of the source matrix.
--*/
.macro TransposePackB8x4BlockLasx StoreOffset
//
// Load 4 columns from 8 rows of the source matrix into the lower and upper
// halves of 4 XR registers.
//
add.d $t0, $a2, $a2
add.d $t6, $a1, $t0
vld $vr0, $a1, 0
vldx $vr1, $a1, $a2
add.d $t0, $a2, $a2
add.d $a1, $t6, $t0
vld $vr2, $t6, 0
vldx $vr3, $t6, $a2
add.d $t0, $a2, $a2
add.d $t6, $a1, $t0
vld $vr4, $a1, 0
xvpermi.q $xr0, $xr4, 0x2
vldx $vr5, $a1, $a2
xvpermi.q $xr1, $xr5, 0x2
vld $vr4, $t6, 0
xvpermi.q $xr2, $xr4, 0x2
vldx $vr5, $t6, $a2
xvpermi.q $xr3, $xr5, 0x2
//
// Transpose the lower and upper halves of the 4 XR registers as two 4x4
// matrices and store the output to the destination packed buffer.
//
xvilvl.w $xr4, $xr1, $xr0
xvilvh.w $xr5, $xr1, $xr0
xvilvl.w $xr0, $xr3, $xr2
xvilvh.w $xr1, $xr3, $xr2
xvilvl.d $xr2, $xr0, $xr4
xvilvh.d $xr3, $xr0, $xr4
xvst $xr2, $a0, \StoreOffset\()
xvst $xr3, $a0, 0x40+\StoreOffset\()
xvilvl.d $xr0, $xr1, $xr5
xvilvh.d $xr4, $xr1, $xr5
xvst $xr0, $a0, 0x80+\StoreOffset\()
xvst $xr4, $a0, 0xc0+\StoreOffset\()
.endm
/*++
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 MlasSgemmTransposePackB16x4Lasx
slli.d $a2, $a2, 2 # convert ldb to bytes
TransposePackB8x4BlockLasx 0*4
add.d $t0, $a2, $a2
add.d $a1, $t0, $t6
TransposePackB8x4BlockLasx 8*4
jr $ra
.end