101 lines
2.1 KiB
ArmAsm
101 lines
2.1 KiB
ArmAsm
.set noreorder
|
|
|
|
.include "gtereg.h"
|
|
.include "inline_s.h"
|
|
|
|
.set MATRIX_r11r12, 0
|
|
.set MATRIX_r13r21, 4
|
|
.set MATRIX_r22r23, 8
|
|
.set MATRIX_r31r32, 12
|
|
.set MATRIX_r33, 16
|
|
.set MATRIX_trx, 20
|
|
.set MATRIX_try, 24
|
|
.set MATRIX_trz, 28
|
|
|
|
|
|
.global CompMatrixLV
|
|
.type CompMatrixLV, @function
|
|
CompMatrixLV:
|
|
|
|
# Load matrix v0 to GTE
|
|
lw $t0, MATRIX_r11r12($a0)
|
|
lw $t1, MATRIX_r13r21($a0)
|
|
ctc2 $t0, C2_R11R12
|
|
ctc2 $t1, C2_R13R21
|
|
lw $t0, MATRIX_r22r23($a0)
|
|
lw $t1, MATRIX_r31r32($a0)
|
|
lhu $t2, MATRIX_r33($a0)
|
|
ctc2 $t0, C2_R22R23
|
|
lw $t0, MATRIX_trx($a0)
|
|
ctc2 $t1, C2_R31R32
|
|
lw $t1, MATRIX_try($a0)
|
|
ctc2 $t2, C2_R33
|
|
lw $t2, MATRIX_trz($a0)
|
|
ctc2 $t0, C2_TRX
|
|
ctc2 $t1, C2_TRY
|
|
ctc2 $t2, C2_TRZ
|
|
|
|
lw $t0, MATRIX_trx($a1)
|
|
lw $t1, MATRIX_try($a1)
|
|
mtc2 $t0, C2_IR1
|
|
lw $t0, MATRIX_trz($a1)
|
|
mtc2 $t1, C2_IR2
|
|
mtc2 $t0, C2_IR3
|
|
|
|
nMVMVA(1, 0, 3, 0, 0)
|
|
|
|
swc2 C2_IR1, MATRIX_trx($a2)
|
|
swc2 C2_IR2, MATRIX_try($a2)
|
|
swc2 C2_IR3, MATRIX_trz($a2)
|
|
|
|
lhu $t1, 2*(0+(3*1))($a1) # Load values for first
|
|
lhu $t0, 2*(0+(3*0))($a1) # R11 R21 R31
|
|
sll $t1, 16
|
|
or $t0, $t1
|
|
lhu $t1, 2*(0+(3*2))($a1)
|
|
mtc2 $t0, C2_VXY0
|
|
mtc2 $t1, C2_VZ0
|
|
|
|
lhu $t1, 2*(1+(3*1))($a1) # Load values for second
|
|
lhu $t0, 2*(1+(3*0))($a1) # R12 R22 R32
|
|
MVMVA(1, 0, 0, 3, 0) # First multiply
|
|
sll $t1, 16
|
|
or $t0, $t1
|
|
lhu $t1, 2*(1+(3*2))($a1)
|
|
mtc2 $t0, C2_VXY0
|
|
mtc2 $t1, C2_VZ0
|
|
|
|
mfc2 $t0, C2_IR1 # Store results of first
|
|
mfc2 $t1, C2_IR2
|
|
sh $t0, 2*(0+(3*0))($a2)
|
|
mfc2 $t0, C2_IR3
|
|
sh $t1, 2*(0+(3*1))($a2)
|
|
sh $t0, 2*(0+(3*2))($a2)
|
|
|
|
lhu $t1, 2*(2+(3*1))($a1) # Load values for third
|
|
lhu $t0, 2*(2+(3*0))($a1) # R13 R23 R33
|
|
MVMVA(1, 0, 0, 3, 0) # Second multiply
|
|
sll $t1, 16
|
|
or $t0, $t1
|
|
lhu $t1, 2*(2+(3*2))($a1)
|
|
mtc2 $t0, C2_VXY0
|
|
mtc2 $t1, C2_VZ0
|
|
|
|
mfc2 $t0, C2_IR1 # Store results of second
|
|
mfc2 $t1, C2_IR2
|
|
sh $t0, 2*(1+(3*0))($a2)
|
|
mfc2 $t0, C2_IR3
|
|
sh $t1, 2*(1+(3*1))($a2)
|
|
sh $t0, 2*(1+(3*2))($a2)
|
|
MVMVA(1, 0, 0, 3, 0) # Third multiply
|
|
|
|
mfc2 $t0, C2_IR1 # Store results of third
|
|
mfc2 $t1, C2_IR2
|
|
sh $t0, 2*(2+(3*0))($a2)
|
|
mfc2 $t0, C2_IR3
|
|
sh $t1, 2*(2+(3*1))($a2)
|
|
sh $t0, 2*(2+(3*2))($a2)
|
|
|
|
jr $ra
|
|
move $v0, $a2
|