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
|