-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMult32.s
More file actions
145 lines (125 loc) · 2.47 KB
/
Mult32.s
File metadata and controls
145 lines (125 loc) · 2.47 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
Mult32_SignedEntry:
;Get sign-extension bit patterns
LOD Mult32_Op1[0]
SIGNEX ACC
STR Mult32_Op1Ex[0]
LOD Mult32_Op2[0]
SIGNEX ACC
STR Mult32_Op2Ex[0]
Mult32_UnsignedEntry:
;appropriately extend Op1
LOD Mult32_Op1Ex[0]
STR Mult32_1full[0]
STR Mult32_1full[1]
STR Mult32_1full[2]
STR Mult32_1full[3]
STR Mult32_1full[4]
STR Mult32_1full[5]
STR Mult32_1full[6]
STR Mult32_1full[7]
;appropriately extend Op2
LOD Mult32_Op2Ex[0]
STR Mult32_2full[0]
STR Mult32_2full[1]
STR Mult32_2full[2]
STR Mult32_2full[3]
STR Mult32_2full[4]
STR Mult32_2full[5]
STR Mult32_2full[6]
STR Mult32_2full[7]
;64-bit version needs no extensions
Mult32_64Entry:
LOD N_[0]
STR Mult32_Ans[0]
STR Mult32_Ans[1]
STR Mult32_Ans[2]
STR Mult32_Ans[3]
STR Mult32_Ans[4]
STR Mult32_Ans[5]
STR Mult32_Ans[6]
STR Mult32_Ans[7]
STR Mult32_Ans[8]
STR Mult32_Ans[9]
STR Mult32_Ans[A]
STR Mult32_Ans[B]
STR Mult32_Ans[C]
STR Mult32_Ans[D]
STR Mult32_Ans[E]
STR Mult32_Ans[F]
STR Mult32_loopCount[0]
LOD N_[1]
STR Mult32_mask[0]
;Outer loop
Mult32_outerLoopStart:
LOD Mult32_2full[F]
STR Mult32_o2nib
;Inner loop
Mult32_innerLoopStart:
LOD Mult32_o2nib
NND Mult32_mask
NND N_[F]
;Add, if necessary
JMP Mult32_doneAdd
ADD64 Mult32_1full Mult32_Ans INTO Mult32_Ans
;Mess with operands appropriately
Mult32_doneAdd:
LSHIFT64 Mult32_1full INTO Mult32_1full
LROT Mult32_mask INTO Mult32_mask
;Leave inner loop, if it is time to do so
UCLC ACC
LOD Mult32_mask
ADD N_[F]
JMP Mult32_doneInner
LOD N_[0]
JMP Mult32_innerLoopStart
;Done inner loop. Do outer loop stuff.
Mult32_doneInner:
LOD Mult32_2full[E]
STR Mult32_2full[F]
LOD Mult32_2full[D]
STR Mult32_2full[E]
LOD Mult32_2full[C]
STR Mult32_2full[D]
LOD Mult32_2full[B]
STR Mult32_2full[C]
LOD Mult32_2full[A]
STR Mult32_2full[B]
LOD Mult32_2full[9]
STR Mult32_2full[A]
LOD Mult32_2full[8]
STR Mult32_2full[9]
LOD Mult32_2full[7]
STR Mult32_2full[8]
LOD Mult32_2full[6]
STR Mult32_2full[7]
LOD Mult32_2full[5]
STR Mult32_2full[6]
LOD Mult32_2full[4]
STR Mult32_2full[5]
LOD Mult32_2full[3]
STR Mult32_2full[4]
LOD Mult32_2full[2]
STR Mult32_2full[3]
LOD Mult32_2full[1]
STR Mult32_2full[2]
LOD Mult32_2full[0]
STR Mult32_2full[1]
UCLC ACC
LOD Mult32_loopCount
ADD N_[1]
STR Mult32_loopCount
;Return, if it is time
Mult32_RetAddr:
JMP 0000
LOD N_[0]
JMP Mult32_outerLoopStart
Mult32_Ans: .data 16
Mult32_1full: .data 8
Mult32_Op1: .data 8
Mult32_2full: .data 8
Mult32_Op2: .data 8
Mult32_loopCount: .data 1
Mult32_mask: .data 1
Mult32_o2nib: .data 1
Mult32_Op1Ex: .data 1
Mult32_Op2Ex: .data 1