forked from Hara-Laboratory/subleq-mips
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
subleqr-test.sq.m4
157 lines (132 loc) · 3.8 KB
/
subleqr-test.sq.m4
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
146
147
148
149
150
151
152
153
154
155
156
@@sltSub Rd,Rs,Rt, T0, AEnd
Rt T0; Rd;
Z Rs Lsnz;
Lsp:Z Rt Lf;
Lsptp:Rd Rd Lcomp;
Lsnz:Z Rt Lcomp;
Lsnztp:Rd Rd Lt;
Lcomp:Rs Rt;
$(@@jnzp Rt, Lf, Lf, Lt);
Lt:Inc Rd;
Lf:Rt; T0 Rt; T0 T0 AEnd;
@@add Ad,As,At, AEnd
As Z; // Z <- -As, it assumes Z = 0
At Z; // Z <- Z - At = -(As + At)
Ad; // clear Ad
Z Ad;
Z Z AEnd;
@@sllsub Rd, Rt, Sa, S1, S2, Aend
Rt S2; Rd; S2 Rd;
Sa S1; // S1 = -Sa
Loop:Inc S1 LBody;
LFinish:S2; S1 S1 Aend;
LBody:S2 Rd; S2; Rd S2; Z Z Loop;
@@srlsub Rd, Rt, Sa, S1, S2, Aend
Rt S2 (- L2); L2:Rd; L3:S2 Rd (- L4);
L4:Sa S1; // S1 = -Sa
Loop:Inc S1 LBody;
LFinish:S2; S1 S1 Aend;
LBody:S2 Rd (- LB2); LB2:S2; Rd S2 (- LB4); LB4:Z Z Loop;
@@srasub Rd, Rt, Sa, S1, S2, S3, Aend
Rt S2 (- L2); L2:Rd; L3:S2 Rd (- L4);
L4:Sa S1; // S1 = -Sa
$(@@jnzp Rt, Ln, Loop, Loop);
Ln:Min S3;
Loop:Inc S1 LBody;
LFinish:S2; S3; S1 S1 Aend;
LBody:S2 Rd (- LB2); LB2:S2; S3 Rd; Rd S2 (- LB4); LB4:Z Z Loop;
@@sl1d Ah, Al, Aend // {1'd_, Ah, Al} <- {Ah, Al, 1'd0}
$(@@sl1m Ah, L1); L1:Z Al Lzn;
Lp:$(@@sl1m Al, Aend);
Lzn:Inc Al Ln; Dec Al Lp;
Ln:Dec Al; Inc Ah; $(@@sl1m Al, Aend);
@@sl1dc Ad, Ah, Al, Aend // {Ad, Al} <- {(w-1)'b0, Al, 1'b0}; {1'_, Ah} <- {Ah, Ad[0]}
$(@@sl1m Ah, L1); L1:Ad;
Z Al Lzn;
Lp:$(@@sl1m Al, Aend);
Lzn:Inc Al Ln; Dec Al Lp;
Ln:Dec Al; Inc Ad; Inc Ah; $(@@sl1m Al, Aend);
@@sl1c Ad, Al, Aend // {Ad, Al} <- {(w-1)'b0, Al, 1'd0}
L1:Ad;
Z Al Lzn;
Lp:$(@@sl1m Al, Aend);
Lzn:Inc Al Ln; Dec Al Lp;
Ln:Dec Al; Inc Ad; $(@@sl1m Al, Aend);
@@srl1 Ad, As, Aend // {Ad, 1'_} <- {1'b0, As}
As Z (- L2); L2:Ad; Z Ad (- L4); L4:Z Ad (- L5); L5:Z Z Aend;
@@srl1m A, Aend // {A, 1'd_} <- {1'd0, A}
A Z (- L2); L2:Z A (- L3); L3:Z Z Aend;
@@sl1 Ad, As, Aend
As Z; Ad; Z Ad; Z Ad; Z Z Aend;
@@sl1m A, Aend // {1'd_, A} <- {A, 1'd0}
A Z; Z A; Z Z Aend;
@@jnzp A, An, Az, Ap // goto An if A < 0, Az if A = 0, Ap if A > 0
Z A Lzn; Z Z Ap;
Lzn:Inc A Ln; Dec A Az;
Ln:Dec A An;
@@jezo A, Ae, Az, Ao // goto Az if zero, Ae if A is even, Ao if A is odd.
Z A (- Lzo); Z Z Ae;
Lzo:Inc A (- Lo); Lz:Min A (- Az);
Lo:Min A (- Ao);
@@jeo A, Ae, Ao // goto Ae if A is even, Ao if A is odd.
$(@@jezo A, Ae, Ae, Ao);
@@addc Ah, Al, A, T, Aend
$(@@jnzp Al, Lln, Llp, Llp);
Lln:Inc T;
Llp:$(@@jnzp A, Lan, Lap, Lap);
Lan:Inc T;
Lap:A Z; Z Al; Z;
$(@@jnzp Al, Lxn, Lxp, Lxp);
Lxn:Dec T;
Lxp:Z T Ltnz;
Ltp:Inc Ah;
Ltnz:T T Aend;
@@multuDumbSub Hi, Lo, Rs, Rt, T0, T1, T2, T3, End
Lo; Hi; Rs T1;
Loop:Z Rs Lnz;
Lp:Dec Rs; $(@@addc Hi, Lo, Rt, T0, Loop);
Lnz:Inc Rs Ln;
LFinish:T0; Rs; T1 Rs; T1 T1 End;
Ln:Dec Dec Rs; Z Z Lp;
@@multuDumbSub2 Hi, Lo, Rs, Rt, T0, T1, T2, T3, End
Lo; Hi; Rs T1;
Loop:$(@@jnzp Rs, LBody, LFinish, LBody);
LFinish:T0; Rs; T1 Rs; T1 T1 End;
LBody:Dec Rs; $(@@addc Hi, Lo, Rt, T0, Loop);
@@multuSubO Hi, Lo, Rs, Rt, T0, T1, T2, T3, End
Lo; Rs T1;
CW T0;
Loop:Inc T0 LBody;
LFinish:T0; Rs; T1 Rs; T1; T3 T3 End;
LBody:$(@@sl1d Hi, Lo, LBody2);
LBody2:$(@@sl1c T3, Rs, LBody3);
LBody3:Z T3 Loop;
$(@@addc Hi, Lo, Rt, T2, Loop);
@@multuSub Hi, Lo, Rs, Rt, TRth, T2, Ts, Tt, End
Hi; Lo; Rs Ts; Rt Tt;
Loop:$(@@jezo Rs, LBodyE, LFinish, LBodyO);
LFinish:Ts Rs; Ts; Rt; Tt Rt; TRth; Tt Tt End;
LBodyO:$(@@addc Hi, Lo, Rt, T2, LBodyO1);
LBodyO1:TRth Z; Z Hi; Z;
LBodyE:$(@@sl1d TRth, Rt, LBodyE1);
LBodyE1:$(@@srl1m Rs, Loop);
@@neg Ad, A, T, Aend
A Z; Z T; Ad; T Ad; T; Z Z Aend;
@@inv Ad, A, T, Aend
$(@@neg Ad, A, T, L);
L:Dec Ad Aend;
@@divuSub Hi, Lo, Rs, Rt, T0, T1, T2, T3, End
Hi; Rs T1;
CW T0;
Loop:Inc T0 LBody;
LFinish:T0; Rs; T1 Rs; T3; T1 T1 End;
LBody:$(@@sl1m Lo); $(@@sl1d Hi, Rs, LBody2);
LBody2:T2; Rs T2; Rt Rs; $(@@jnzp Rs, LResume, LNext, LNext);
LNext:End; // we must fix
LResume:Rs; T2 Rs; T2 T2;
$(@@addc Hi, Lo, Rt, T2, Loop);
@runningTest R1, R2, R3, R4
L2:$(@@srasub R2, Big4, Three, T1, T2, T3, L3);
L3:$(@@multuSub R3, R4, Big5, Big6, T1, T2, T3, T4, End);
One:1 Two:2 Three:3;
Big4:214748364 Big5:23452345 Big6:8383838;