summaryrefslogtreecommitdiff
path: root/input/matrix-vector.asm
blob: 7b91a6a157452cc8ff9093bc8e7b4b8d426201a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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