summaryrefslogtreecommitdiff
path: root/input/matrix-vector.asm
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-05-11 22:03:02 -0400
committerbd <bdunahu@operationnull.com>2025-05-11 22:03:02 -0400
commit0f098df58940efa75f4dffd8291a0922bd34eac2 (patch)
treeb98efce9a331f7f974d29f14860b0b0742de8554 /input/matrix-vector.asm
parent8af0269e0897a8700ac6953257671e6ed002d334 (diff)
Add two new tests for vector (strides + matrix)
Diffstat (limited to 'input/matrix-vector.asm')
-rw-r--r--input/matrix-vector.asm98
1 files changed, 98 insertions, 0 deletions
diff --git a/input/matrix-vector.asm b/input/matrix-vector.asm
new file mode 100644
index 0000000..7b91a6a
--- /dev/null
+++ b/input/matrix-vector.asm
@@ -0,0 +1,98 @@
+;;;;;;;;
+;;; performs a matrix multiply the matrices m1 and m2:
+;;; 9 4 3 1 0 4 2 2 65 21 55 72 40
+;;; 1 4 2 8 3 1 9 4 49 18 18 50 22
+;;; 9 4 7 8 3 5 6 2 = 97 33 75 96 48
+;;; 6 6 6 102 36 60 102 48
+;;; the result of which is placed into r
+;;; does not use designated vector instructions
+
+.data
+ m1 9 4 3 1 4 2 9 4 7 6 6 6
+ m2 1 0 4 2 2 8 3 1 9 4 8 3 5 6 2
+ n 3 ; # of columns of m1, rows of m2
+ m 4 ; # of rows of m1
+ p 5 ; # of columns of m2
+ r 0 ; a matrix of size n,p
+
+.text
+ addi $5 $2 0x0 ; establish frame pointer
+ jmp MAIN
+
+MAIN:
+ push $5 ; function preamble
+ addi $5 $2 0x0
+ subi $2 $2 0x0
+
+;;;
+;;; setup vector stuff, rotate num, column stride
+ load $4 n($0)
+ addi $14 $4 0x0
+ load $6 p($0)
+ load $7 m($0)
+ addi $15 $0 0x1
+ addi $8 $0 0x0
+ jrl STRCOND
+STR:
+ addv $17 $17 $16 ; set column stride
+ addi $8 $8 0x1
+STRCOND:
+ cmp $6 $8
+ bgt STR
+;;; end vector setup
+;;;
+
+ addi $8 $0 0x0 ; tracks M
+ jrl MCOND
+
+MITER:
+ load $4 n($0) ; set vector length to n
+ addi $9 $0 0x0 ; tracks P
+ jrl PCOND
+PITER:
+ mul $10 $4 $8 ; index m1
+ addi $10 $10 m1
+
+ addi $11 $9 m2 ; index m2
+
+ srdl $18 $10 $16 ; load row
+ srdl $19 $11 $17 ; load column
+
+ mulv $18 $18 $19 ; mul elements
+
+ addi $13 $0 0x1 ; tracks iterations
+ jrl ROTCOND
+ROT:
+ rotv $18 $18 $15
+ addi $13 $13 0x1
+ROTCOND:
+ addi $4 $0 0x1
+ addv $20 $20 $18
+ addi $4 $14 0x0
+ cmp $4 $13
+ bgt ROT
+
+ mul $13 $6 $8 ; store the result
+ add $13 $13 $9
+ addi $13 $13 r
+ srds $20 $13 $16
+
+ addi $4 $0 0x0 ; clear the accumulator
+ addv $20 $20 $20
+ addi $4 $14 0x0
+
+ addi $9 $9 0x1 ; increment columns in m2
+PCOND:
+ cmp $6 $9
+ bgt PITER
+
+ addi $8 $8 0x1 ; increment rows in m1
+MCOND:
+ cmp $7 $8
+ bgt MITER
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop