1*fbadb1c4SDavid du Colombier #include "gc.h"
2*fbadb1c4SDavid du Colombier
3*fbadb1c4SDavid du Colombier static Reg*
rnops(Reg * r)4*fbadb1c4SDavid du Colombier rnops(Reg *r)
5*fbadb1c4SDavid du Colombier {
6*fbadb1c4SDavid du Colombier Prog *p;
7*fbadb1c4SDavid du Colombier Reg *r1;
8*fbadb1c4SDavid du Colombier
9*fbadb1c4SDavid du Colombier if(r != R)
10*fbadb1c4SDavid du Colombier for(;;){
11*fbadb1c4SDavid du Colombier p = r->prog;
12*fbadb1c4SDavid du Colombier if(p->as != ANOP || p->from.type != D_NONE || p->to.type != D_NONE)
13*fbadb1c4SDavid du Colombier break;
14*fbadb1c4SDavid du Colombier r1 = uniqs(r);
15*fbadb1c4SDavid du Colombier if(r1 == R)
16*fbadb1c4SDavid du Colombier break;
17*fbadb1c4SDavid du Colombier r = r1;
18*fbadb1c4SDavid du Colombier }
19*fbadb1c4SDavid du Colombier return r;
20*fbadb1c4SDavid du Colombier }
21*fbadb1c4SDavid du Colombier
22*fbadb1c4SDavid du Colombier void
peep(void)23*fbadb1c4SDavid du Colombier peep(void)
24*fbadb1c4SDavid du Colombier {
25*fbadb1c4SDavid du Colombier Reg *r, *r1, *r2;
26*fbadb1c4SDavid du Colombier Prog *p, *p1;
27*fbadb1c4SDavid du Colombier int t;
28*fbadb1c4SDavid du Colombier /*
29*fbadb1c4SDavid du Colombier * complete R structure
30*fbadb1c4SDavid du Colombier */
31*fbadb1c4SDavid du Colombier t = 0;
32*fbadb1c4SDavid du Colombier for(r=firstr; r!=R; r=r1) {
33*fbadb1c4SDavid du Colombier r1 = r->link;
34*fbadb1c4SDavid du Colombier if(r1 == R)
35*fbadb1c4SDavid du Colombier break;
36*fbadb1c4SDavid du Colombier p = r->prog->link;
37*fbadb1c4SDavid du Colombier while(p != r1->prog)
38*fbadb1c4SDavid du Colombier switch(p->as) {
39*fbadb1c4SDavid du Colombier default:
40*fbadb1c4SDavid du Colombier r2 = rega();
41*fbadb1c4SDavid du Colombier r->link = r2;
42*fbadb1c4SDavid du Colombier r2->link = r1;
43*fbadb1c4SDavid du Colombier
44*fbadb1c4SDavid du Colombier r2->prog = p;
45*fbadb1c4SDavid du Colombier r2->p1 = r;
46*fbadb1c4SDavid du Colombier r->s1 = r2;
47*fbadb1c4SDavid du Colombier r2->s1 = r1;
48*fbadb1c4SDavid du Colombier r1->p1 = r2;
49*fbadb1c4SDavid du Colombier
50*fbadb1c4SDavid du Colombier r = r2;
51*fbadb1c4SDavid du Colombier t++;
52*fbadb1c4SDavid du Colombier
53*fbadb1c4SDavid du Colombier case ADATA:
54*fbadb1c4SDavid du Colombier case AGLOBL:
55*fbadb1c4SDavid du Colombier case ANAME:
56*fbadb1c4SDavid du Colombier case ASIGNAME:
57*fbadb1c4SDavid du Colombier p = p->link;
58*fbadb1c4SDavid du Colombier }
59*fbadb1c4SDavid du Colombier }
60*fbadb1c4SDavid du Colombier
61*fbadb1c4SDavid du Colombier loop1:
62*fbadb1c4SDavid du Colombier t = 0;
63*fbadb1c4SDavid du Colombier for(r=firstr; r!=R; r=r->link) {
64*fbadb1c4SDavid du Colombier p = r->prog;
65*fbadb1c4SDavid du Colombier if(p->as == AMOVW || p->as == AMOVD || p->as == AFMOVS || p->as == AFMOVD)
66*fbadb1c4SDavid du Colombier if(regtyp(&p->to)) {
67*fbadb1c4SDavid du Colombier if(regtyp(&p->from))
68*fbadb1c4SDavid du Colombier if(p->from.type == p->to.type) {
69*fbadb1c4SDavid du Colombier if(copyprop(r)) {
70*fbadb1c4SDavid du Colombier excise(r);
71*fbadb1c4SDavid du Colombier t++;
72*fbadb1c4SDavid du Colombier } else
73*fbadb1c4SDavid du Colombier if(subprop(r) && copyprop(r)) {
74*fbadb1c4SDavid du Colombier excise(r);
75*fbadb1c4SDavid du Colombier t++;
76*fbadb1c4SDavid du Colombier }
77*fbadb1c4SDavid du Colombier }
78*fbadb1c4SDavid du Colombier if(regzer(&p->from))
79*fbadb1c4SDavid du Colombier if(p->to.type == D_REG) {
80*fbadb1c4SDavid du Colombier p->from.type = D_REG;
81*fbadb1c4SDavid du Colombier p->from.reg = REGZERO;
82*fbadb1c4SDavid du Colombier if(copyprop(r)) {
83*fbadb1c4SDavid du Colombier excise(r);
84*fbadb1c4SDavid du Colombier t++;
85*fbadb1c4SDavid du Colombier } else
86*fbadb1c4SDavid du Colombier if(subprop(r) && copyprop(r)) {
87*fbadb1c4SDavid du Colombier excise(r);
88*fbadb1c4SDavid du Colombier t++;
89*fbadb1c4SDavid du Colombier }
90*fbadb1c4SDavid du Colombier }
91*fbadb1c4SDavid du Colombier }
92*fbadb1c4SDavid du Colombier }
93*fbadb1c4SDavid du Colombier if(t)
94*fbadb1c4SDavid du Colombier goto loop1;
95*fbadb1c4SDavid du Colombier /*
96*fbadb1c4SDavid du Colombier * look for MOVB x,R; MOVB R,R
97*fbadb1c4SDavid du Colombier */
98*fbadb1c4SDavid du Colombier for(r=firstr; r!=R; r=r->link) {
99*fbadb1c4SDavid du Colombier p = r->prog;
100*fbadb1c4SDavid du Colombier switch(p->as) {
101*fbadb1c4SDavid du Colombier default:
102*fbadb1c4SDavid du Colombier continue;
103*fbadb1c4SDavid du Colombier case AMOVH:
104*fbadb1c4SDavid du Colombier case AMOVHZ:
105*fbadb1c4SDavid du Colombier case AMOVB:
106*fbadb1c4SDavid du Colombier case AMOVBZ:
107*fbadb1c4SDavid du Colombier case AMOVW:
108*fbadb1c4SDavid du Colombier case AMOVWZ:
109*fbadb1c4SDavid du Colombier if(p->to.type != D_REG)
110*fbadb1c4SDavid du Colombier continue;
111*fbadb1c4SDavid du Colombier break;
112*fbadb1c4SDavid du Colombier }
113*fbadb1c4SDavid du Colombier r1 = r->link;
114*fbadb1c4SDavid du Colombier if(r1 == R)
115*fbadb1c4SDavid du Colombier continue;
116*fbadb1c4SDavid du Colombier p1 = r1->prog;
117*fbadb1c4SDavid du Colombier if(p1->as != p->as)
118*fbadb1c4SDavid du Colombier continue;
119*fbadb1c4SDavid du Colombier if(p1->from.type != D_REG || p1->from.reg != p->to.reg)
120*fbadb1c4SDavid du Colombier continue;
121*fbadb1c4SDavid du Colombier if(p1->to.type != D_REG || p1->to.reg != p->to.reg)
122*fbadb1c4SDavid du Colombier continue;
123*fbadb1c4SDavid du Colombier excise(r1);
124*fbadb1c4SDavid du Colombier }
125*fbadb1c4SDavid du Colombier
126*fbadb1c4SDavid du Colombier if(debug['D'] > 1)
127*fbadb1c4SDavid du Colombier return; /* allow following code improvement to be suppressed */
128*fbadb1c4SDavid du Colombier
129*fbadb1c4SDavid du Colombier /*
130*fbadb1c4SDavid du Colombier * look for OP x,y,R; CMP R, $0 -> OPCC x,y,R
131*fbadb1c4SDavid du Colombier * when OP can set condition codes correctly
132*fbadb1c4SDavid du Colombier */
133*fbadb1c4SDavid du Colombier for(r=firstr; r!=R; r=r->link) {
134*fbadb1c4SDavid du Colombier p = r->prog;
135*fbadb1c4SDavid du Colombier switch(p->as) {
136*fbadb1c4SDavid du Colombier case ACMP:
137*fbadb1c4SDavid du Colombier case ACMPW: /* always safe? */
138*fbadb1c4SDavid du Colombier if(!regzer(&p->to))
139*fbadb1c4SDavid du Colombier continue;
140*fbadb1c4SDavid du Colombier r1 = r->s1;
141*fbadb1c4SDavid du Colombier if(r1 == R)
142*fbadb1c4SDavid du Colombier continue;
143*fbadb1c4SDavid du Colombier switch(r1->prog->as) {
144*fbadb1c4SDavid du Colombier default:
145*fbadb1c4SDavid du Colombier continue;
146*fbadb1c4SDavid du Colombier case ABCL:
147*fbadb1c4SDavid du Colombier case ABC:
148*fbadb1c4SDavid du Colombier /* the conditions can be complex and these are currently little used */
149*fbadb1c4SDavid du Colombier continue;
150*fbadb1c4SDavid du Colombier case ABEQ:
151*fbadb1c4SDavid du Colombier case ABGE:
152*fbadb1c4SDavid du Colombier case ABGT:
153*fbadb1c4SDavid du Colombier case ABLE:
154*fbadb1c4SDavid du Colombier case ABLT:
155*fbadb1c4SDavid du Colombier case ABNE:
156*fbadb1c4SDavid du Colombier case ABVC:
157*fbadb1c4SDavid du Colombier case ABVS:
158*fbadb1c4SDavid du Colombier break;
159*fbadb1c4SDavid du Colombier }
160*fbadb1c4SDavid du Colombier r1 = r;
161*fbadb1c4SDavid du Colombier do
162*fbadb1c4SDavid du Colombier r1 = uniqp(r1);
163*fbadb1c4SDavid du Colombier while (r1 != R && r1->prog->as == ANOP);
164*fbadb1c4SDavid du Colombier if(r1 == R)
165*fbadb1c4SDavid du Colombier continue;
166*fbadb1c4SDavid du Colombier p1 = r1->prog;
167*fbadb1c4SDavid du Colombier if(p1->to.type != D_REG || p1->to.reg != p->from.reg)
168*fbadb1c4SDavid du Colombier continue;
169*fbadb1c4SDavid du Colombier switch(p1->as) {
170*fbadb1c4SDavid du Colombier case ASUB:
171*fbadb1c4SDavid du Colombier case AADD:
172*fbadb1c4SDavid du Colombier case AXOR:
173*fbadb1c4SDavid du Colombier case AOR:
174*fbadb1c4SDavid du Colombier /* irregular instructions */
175*fbadb1c4SDavid du Colombier if(p1->from.type == D_CONST)
176*fbadb1c4SDavid du Colombier continue;
177*fbadb1c4SDavid du Colombier break;
178*fbadb1c4SDavid du Colombier }
179*fbadb1c4SDavid du Colombier switch(p1->as) {
180*fbadb1c4SDavid du Colombier default:
181*fbadb1c4SDavid du Colombier continue;
182*fbadb1c4SDavid du Colombier case AMOVW:
183*fbadb1c4SDavid du Colombier case AMOVD:
184*fbadb1c4SDavid du Colombier if(p1->from.type != D_REG)
185*fbadb1c4SDavid du Colombier continue;
186*fbadb1c4SDavid du Colombier continue;
187*fbadb1c4SDavid du Colombier case AANDCC:
188*fbadb1c4SDavid du Colombier case AANDNCC:
189*fbadb1c4SDavid du Colombier case AORCC:
190*fbadb1c4SDavid du Colombier case AORNCC:
191*fbadb1c4SDavid du Colombier case AXORCC:
192*fbadb1c4SDavid du Colombier case ASUBCC:
193*fbadb1c4SDavid du Colombier case ASUBECC:
194*fbadb1c4SDavid du Colombier case ASUBMECC:
195*fbadb1c4SDavid du Colombier case ASUBZECC:
196*fbadb1c4SDavid du Colombier case AADDCC:
197*fbadb1c4SDavid du Colombier case AADDCCC:
198*fbadb1c4SDavid du Colombier case AADDECC:
199*fbadb1c4SDavid du Colombier case AADDMECC:
200*fbadb1c4SDavid du Colombier case AADDZECC:
201*fbadb1c4SDavid du Colombier case ARLWMICC:
202*fbadb1c4SDavid du Colombier case ARLWNMCC:
203*fbadb1c4SDavid du Colombier t = p1->as;
204*fbadb1c4SDavid du Colombier break;
205*fbadb1c4SDavid du Colombier /* don't deal with floating point instructions for now */
206*fbadb1c4SDavid du Colombier /*
207*fbadb1c4SDavid du Colombier case AFABS: t = AFABSCC; break;
208*fbadb1c4SDavid du Colombier case AFADD: t = AFADDCC; break;
209*fbadb1c4SDavid du Colombier case AFADDS: t = AFADDSCC; break;
210*fbadb1c4SDavid du Colombier case AFCTIW: t = AFCTIWCC; break;
211*fbadb1c4SDavid du Colombier case AFCTIWZ: t = AFCTIWZCC; break;
212*fbadb1c4SDavid du Colombier case AFDIV: t = AFDIVCC; break;
213*fbadb1c4SDavid du Colombier case AFDIVS: t = AFDIVSCC; break;
214*fbadb1c4SDavid du Colombier case AFMADD: t = AFMADDCC; break;
215*fbadb1c4SDavid du Colombier case AFMADDS: t = AFMADDSCC; break;
216*fbadb1c4SDavid du Colombier case AFMOVD: t = AFMOVDCC; break;
217*fbadb1c4SDavid du Colombier case AFMSUB: t = AFMSUBCC; break;
218*fbadb1c4SDavid du Colombier case AFMSUBS: t = AFMSUBSCC; break;
219*fbadb1c4SDavid du Colombier case AFMUL: t = AFMULCC; break;
220*fbadb1c4SDavid du Colombier case AFMULS: t = AFMULSCC; break;
221*fbadb1c4SDavid du Colombier case AFNABS: t = AFNABSCC; break;
222*fbadb1c4SDavid du Colombier case AFNEG: t = AFNEGCC; break;
223*fbadb1c4SDavid du Colombier case AFNMADD: t = AFNMADDCC; break;
224*fbadb1c4SDavid du Colombier case AFNMADDS: t = AFNMADDSCC; break;
225*fbadb1c4SDavid du Colombier case AFNMSUB: t = AFNMSUBCC; break;
226*fbadb1c4SDavid du Colombier case AFNMSUBS: t = AFNMSUBSCC; break;
227*fbadb1c4SDavid du Colombier case AFRSP: t = AFRSPCC; break;
228*fbadb1c4SDavid du Colombier case AFSUB: t = AFSUBCC; break;
229*fbadb1c4SDavid du Colombier case AFSUBS: t = AFSUBSCC; break;
230*fbadb1c4SDavid du Colombier case ACNTLZW: t = ACNTLZWCC; break;
231*fbadb1c4SDavid du Colombier case AMTFSB0: t = AMTFSB0CC; break;
232*fbadb1c4SDavid du Colombier case AMTFSB1: t = AMTFSB1CC; break;
233*fbadb1c4SDavid du Colombier */
234*fbadb1c4SDavid du Colombier case AADD: t = AADDCC; break;
235*fbadb1c4SDavid du Colombier case AADDV: t = AADDVCC; break;
236*fbadb1c4SDavid du Colombier case AADDC: t = AADDCCC; break;
237*fbadb1c4SDavid du Colombier case AADDCV: t = AADDCVCC; break;
238*fbadb1c4SDavid du Colombier case AADDME: t = AADDMECC; break;
239*fbadb1c4SDavid du Colombier case AADDMEV: t = AADDMEVCC; break;
240*fbadb1c4SDavid du Colombier case AADDE: t = AADDECC; break;
241*fbadb1c4SDavid du Colombier case AADDEV: t = AADDEVCC; break;
242*fbadb1c4SDavid du Colombier case AADDZE: t = AADDZECC; break;
243*fbadb1c4SDavid du Colombier case AADDZEV: t = AADDZEVCC; break;
244*fbadb1c4SDavid du Colombier case AAND: t = AANDCC; break;
245*fbadb1c4SDavid du Colombier case AANDN: t = AANDNCC; break;
246*fbadb1c4SDavid du Colombier case ADIVW: t = ADIVWCC; break;
247*fbadb1c4SDavid du Colombier case ADIVWV: t = ADIVWVCC; break;
248*fbadb1c4SDavid du Colombier case ADIVWU: t = ADIVWUCC; break;
249*fbadb1c4SDavid du Colombier case ADIVWUV: t = ADIVWUVCC; break;
250*fbadb1c4SDavid du Colombier case ADIVD: t = ADIVDCC; break;
251*fbadb1c4SDavid du Colombier case ADIVDV: t = ADIVDVCC; break;
252*fbadb1c4SDavid du Colombier case ADIVDU: t = ADIVDUCC; break;
253*fbadb1c4SDavid du Colombier case ADIVDUV: t = ADIVDUVCC; break;
254*fbadb1c4SDavid du Colombier case AEQV: t = AEQVCC; break;
255*fbadb1c4SDavid du Colombier case AEXTSB: t = AEXTSBCC; break;
256*fbadb1c4SDavid du Colombier case AEXTSH: t = AEXTSHCC; break;
257*fbadb1c4SDavid du Colombier case AEXTSW: t = AEXTSWCC; break;
258*fbadb1c4SDavid du Colombier case AMULHW: t = AMULHWCC; break;
259*fbadb1c4SDavid du Colombier case AMULHWU: t = AMULHWUCC; break;
260*fbadb1c4SDavid du Colombier case AMULLW: t = AMULLWCC; break;
261*fbadb1c4SDavid du Colombier case AMULLWV: t = AMULLWVCC; break;
262*fbadb1c4SDavid du Colombier case AMULHD: t = AMULHDCC; break;
263*fbadb1c4SDavid du Colombier case AMULHDU: t = AMULHDUCC; break;
264*fbadb1c4SDavid du Colombier case AMULLD: t = AMULLDCC; break;
265*fbadb1c4SDavid du Colombier case AMULLDV: t = AMULLDVCC; break;
266*fbadb1c4SDavid du Colombier case ANAND: t = ANANDCC; break;
267*fbadb1c4SDavid du Colombier case ANEG: t = ANEGCC; break;
268*fbadb1c4SDavid du Colombier case ANEGV: t = ANEGVCC; break;
269*fbadb1c4SDavid du Colombier case ANOR: t = ANORCC; break;
270*fbadb1c4SDavid du Colombier case AOR: t = AORCC; break;
271*fbadb1c4SDavid du Colombier case AORN: t = AORNCC; break;
272*fbadb1c4SDavid du Colombier case AREM: t = AREMCC; break;
273*fbadb1c4SDavid du Colombier case AREMV: t = AREMVCC; break;
274*fbadb1c4SDavid du Colombier case AREMU: t = AREMUCC; break;
275*fbadb1c4SDavid du Colombier case AREMUV: t = AREMUVCC; break;
276*fbadb1c4SDavid du Colombier case AREMD: t = AREMDCC; break;
277*fbadb1c4SDavid du Colombier case AREMDV: t = AREMDVCC; break;
278*fbadb1c4SDavid du Colombier case AREMDU: t = AREMDUCC; break;
279*fbadb1c4SDavid du Colombier case AREMDUV: t = AREMDUVCC; break;
280*fbadb1c4SDavid du Colombier case ARLWMI: t = ARLWMICC; break;
281*fbadb1c4SDavid du Colombier case ARLWNM: t = ARLWNMCC; break;
282*fbadb1c4SDavid du Colombier case ASLW: t = ASLWCC; break;
283*fbadb1c4SDavid du Colombier case ASRAW: t = ASRAWCC; break;
284*fbadb1c4SDavid du Colombier case ASRW: t = ASRWCC; break;
285*fbadb1c4SDavid du Colombier case ASLD: t = ASLDCC; break;
286*fbadb1c4SDavid du Colombier case ASRAD: t = ASRADCC; break;
287*fbadb1c4SDavid du Colombier case ASRD: t = ASRDCC; break;
288*fbadb1c4SDavid du Colombier case ASUB: t = ASUBCC; break;
289*fbadb1c4SDavid du Colombier case ASUBV: t = ASUBVCC; break;
290*fbadb1c4SDavid du Colombier case ASUBC: t = ASUBCCC; break;
291*fbadb1c4SDavid du Colombier case ASUBCV: t = ASUBCVCC; break;
292*fbadb1c4SDavid du Colombier case ASUBME: t = ASUBMECC; break;
293*fbadb1c4SDavid du Colombier case ASUBMEV: t = ASUBMEVCC; break;
294*fbadb1c4SDavid du Colombier case ASUBE: t = ASUBECC; break;
295*fbadb1c4SDavid du Colombier case ASUBEV: t = ASUBEVCC; break;
296*fbadb1c4SDavid du Colombier case ASUBZE: t = ASUBZECC; break;
297*fbadb1c4SDavid du Colombier case ASUBZEV: t = ASUBZEVCC; break;
298*fbadb1c4SDavid du Colombier case AXOR: t = AXORCC; break;
299*fbadb1c4SDavid du Colombier break;
300*fbadb1c4SDavid du Colombier }
301*fbadb1c4SDavid du Colombier if(debug['D'])
302*fbadb1c4SDavid du Colombier print("cmp %P; %P -> ", p1, p);
303*fbadb1c4SDavid du Colombier p1->as = t;
304*fbadb1c4SDavid du Colombier if(debug['D'])
305*fbadb1c4SDavid du Colombier print("%P\n", p1);
306*fbadb1c4SDavid du Colombier excise(r);
307*fbadb1c4SDavid du Colombier continue;
308*fbadb1c4SDavid du Colombier }
309*fbadb1c4SDavid du Colombier }
310*fbadb1c4SDavid du Colombier }
311*fbadb1c4SDavid du Colombier
312*fbadb1c4SDavid du Colombier void
excise(Reg * r)313*fbadb1c4SDavid du Colombier excise(Reg *r)
314*fbadb1c4SDavid du Colombier {
315*fbadb1c4SDavid du Colombier Prog *p;
316*fbadb1c4SDavid du Colombier
317*fbadb1c4SDavid du Colombier p = r->prog;
318*fbadb1c4SDavid du Colombier p->as = ANOP;
319*fbadb1c4SDavid du Colombier p->from = zprog.from;
320*fbadb1c4SDavid du Colombier p->from3 = zprog.from3;
321*fbadb1c4SDavid du Colombier p->to = zprog.to;
322*fbadb1c4SDavid du Colombier p->reg = zprog.reg; /**/
323*fbadb1c4SDavid du Colombier }
324*fbadb1c4SDavid du Colombier
325*fbadb1c4SDavid du Colombier Reg*
uniqp(Reg * r)326*fbadb1c4SDavid du Colombier uniqp(Reg *r)
327*fbadb1c4SDavid du Colombier {
328*fbadb1c4SDavid du Colombier Reg *r1;
329*fbadb1c4SDavid du Colombier
330*fbadb1c4SDavid du Colombier r1 = r->p1;
331*fbadb1c4SDavid du Colombier if(r1 == R) {
332*fbadb1c4SDavid du Colombier r1 = r->p2;
333*fbadb1c4SDavid du Colombier if(r1 == R || r1->p2link != R)
334*fbadb1c4SDavid du Colombier return R;
335*fbadb1c4SDavid du Colombier } else
336*fbadb1c4SDavid du Colombier if(r->p2 != R)
337*fbadb1c4SDavid du Colombier return R;
338*fbadb1c4SDavid du Colombier return r1;
339*fbadb1c4SDavid du Colombier }
340*fbadb1c4SDavid du Colombier
341*fbadb1c4SDavid du Colombier Reg*
uniqs(Reg * r)342*fbadb1c4SDavid du Colombier uniqs(Reg *r)
343*fbadb1c4SDavid du Colombier {
344*fbadb1c4SDavid du Colombier Reg *r1;
345*fbadb1c4SDavid du Colombier
346*fbadb1c4SDavid du Colombier r1 = r->s1;
347*fbadb1c4SDavid du Colombier if(r1 == R) {
348*fbadb1c4SDavid du Colombier r1 = r->s2;
349*fbadb1c4SDavid du Colombier if(r1 == R)
350*fbadb1c4SDavid du Colombier return R;
351*fbadb1c4SDavid du Colombier } else
352*fbadb1c4SDavid du Colombier if(r->s2 != R)
353*fbadb1c4SDavid du Colombier return R;
354*fbadb1c4SDavid du Colombier return r1;
355*fbadb1c4SDavid du Colombier }
356*fbadb1c4SDavid du Colombier
357*fbadb1c4SDavid du Colombier /*
358*fbadb1c4SDavid du Colombier * if the system forces R0 to be zero,
359*fbadb1c4SDavid du Colombier * convert references to $0 to references to R0.
360*fbadb1c4SDavid du Colombier */
regzer(Adr * a)361*fbadb1c4SDavid du Colombier regzer(Adr *a)
362*fbadb1c4SDavid du Colombier {
363*fbadb1c4SDavid du Colombier if(R0ISZERO) {
364*fbadb1c4SDavid du Colombier if(a->type == D_CONST)
365*fbadb1c4SDavid du Colombier if(a->sym == S)
366*fbadb1c4SDavid du Colombier if(a->offset == 0)
367*fbadb1c4SDavid du Colombier return 1;
368*fbadb1c4SDavid du Colombier if(a->type == D_REG)
369*fbadb1c4SDavid du Colombier if(a->reg == REGZERO)
370*fbadb1c4SDavid du Colombier return 1;
371*fbadb1c4SDavid du Colombier }
372*fbadb1c4SDavid du Colombier return 0;
373*fbadb1c4SDavid du Colombier }
374*fbadb1c4SDavid du Colombier
regtyp(Adr * a)375*fbadb1c4SDavid du Colombier regtyp(Adr *a)
376*fbadb1c4SDavid du Colombier {
377*fbadb1c4SDavid du Colombier
378*fbadb1c4SDavid du Colombier if(a->type == D_REG) {
379*fbadb1c4SDavid du Colombier if(!R0ISZERO || a->reg != REGZERO)
380*fbadb1c4SDavid du Colombier return 1;
381*fbadb1c4SDavid du Colombier return 0;
382*fbadb1c4SDavid du Colombier }
383*fbadb1c4SDavid du Colombier if(a->type == D_FREG)
384*fbadb1c4SDavid du Colombier return 1;
385*fbadb1c4SDavid du Colombier return 0;
386*fbadb1c4SDavid du Colombier }
387*fbadb1c4SDavid du Colombier
388*fbadb1c4SDavid du Colombier /*
389*fbadb1c4SDavid du Colombier * the idea is to substitute
390*fbadb1c4SDavid du Colombier * one register for another
391*fbadb1c4SDavid du Colombier * from one MOV to another
392*fbadb1c4SDavid du Colombier * MOV a, R0
393*fbadb1c4SDavid du Colombier * ADD b, R0 / no use of R1
394*fbadb1c4SDavid du Colombier * MOV R0, R1
395*fbadb1c4SDavid du Colombier * would be converted to
396*fbadb1c4SDavid du Colombier * MOV a, R1
397*fbadb1c4SDavid du Colombier * ADD b, R1
398*fbadb1c4SDavid du Colombier * MOV R1, R0
399*fbadb1c4SDavid du Colombier * hopefully, then the former or latter MOV
400*fbadb1c4SDavid du Colombier * will be eliminated by copy propagation.
401*fbadb1c4SDavid du Colombier */
402*fbadb1c4SDavid du Colombier int
subprop(Reg * r0)403*fbadb1c4SDavid du Colombier subprop(Reg *r0)
404*fbadb1c4SDavid du Colombier {
405*fbadb1c4SDavid du Colombier Prog *p;
406*fbadb1c4SDavid du Colombier Adr *v1, *v2;
407*fbadb1c4SDavid du Colombier Reg *r;
408*fbadb1c4SDavid du Colombier int t;
409*fbadb1c4SDavid du Colombier
410*fbadb1c4SDavid du Colombier p = r0->prog;
411*fbadb1c4SDavid du Colombier v1 = &p->from;
412*fbadb1c4SDavid du Colombier if(!regtyp(v1))
413*fbadb1c4SDavid du Colombier return 0;
414*fbadb1c4SDavid du Colombier v2 = &p->to;
415*fbadb1c4SDavid du Colombier if(!regtyp(v2))
416*fbadb1c4SDavid du Colombier return 0;
417*fbadb1c4SDavid du Colombier for(r=uniqp(r0); r!=R; r=uniqp(r)) {
418*fbadb1c4SDavid du Colombier if(uniqs(r) == R)
419*fbadb1c4SDavid du Colombier break;
420*fbadb1c4SDavid du Colombier p = r->prog;
421*fbadb1c4SDavid du Colombier switch(p->as) {
422*fbadb1c4SDavid du Colombier case ABL:
423*fbadb1c4SDavid du Colombier return 0;
424*fbadb1c4SDavid du Colombier
425*fbadb1c4SDavid du Colombier case AADD:
426*fbadb1c4SDavid du Colombier case AADDC:
427*fbadb1c4SDavid du Colombier case AADDCC:
428*fbadb1c4SDavid du Colombier case AADDE:
429*fbadb1c4SDavid du Colombier case AADDECC:
430*fbadb1c4SDavid du Colombier case ASUB:
431*fbadb1c4SDavid du Colombier case ASUBCC:
432*fbadb1c4SDavid du Colombier case ASUBC:
433*fbadb1c4SDavid du Colombier case ASUBCCC:
434*fbadb1c4SDavid du Colombier case ASUBE:
435*fbadb1c4SDavid du Colombier case ASUBECC:
436*fbadb1c4SDavid du Colombier case ASLW:
437*fbadb1c4SDavid du Colombier case ASRW:
438*fbadb1c4SDavid du Colombier case ASRWCC:
439*fbadb1c4SDavid du Colombier case ASRAW:
440*fbadb1c4SDavid du Colombier case ASRAWCC:
441*fbadb1c4SDavid du Colombier case ASLD:
442*fbadb1c4SDavid du Colombier case ASRD:
443*fbadb1c4SDavid du Colombier case ASRAD:
444*fbadb1c4SDavid du Colombier case AOR:
445*fbadb1c4SDavid du Colombier case AORCC:
446*fbadb1c4SDavid du Colombier case AORN:
447*fbadb1c4SDavid du Colombier case AORNCC:
448*fbadb1c4SDavid du Colombier case AAND:
449*fbadb1c4SDavid du Colombier case AANDCC:
450*fbadb1c4SDavid du Colombier case AANDN:
451*fbadb1c4SDavid du Colombier case AANDNCC:
452*fbadb1c4SDavid du Colombier case ANAND:
453*fbadb1c4SDavid du Colombier case ANANDCC:
454*fbadb1c4SDavid du Colombier case ANOR:
455*fbadb1c4SDavid du Colombier case ANORCC:
456*fbadb1c4SDavid du Colombier case AXOR:
457*fbadb1c4SDavid du Colombier case AXORCC:
458*fbadb1c4SDavid du Colombier case AMULHW:
459*fbadb1c4SDavid du Colombier case AMULHWU:
460*fbadb1c4SDavid du Colombier case AMULLW:
461*fbadb1c4SDavid du Colombier case AMULLD:
462*fbadb1c4SDavid du Colombier case ADIVW:
463*fbadb1c4SDavid du Colombier case ADIVWU:
464*fbadb1c4SDavid du Colombier case ADIVD:
465*fbadb1c4SDavid du Colombier case ADIVDU:
466*fbadb1c4SDavid du Colombier case AREM:
467*fbadb1c4SDavid du Colombier case AREMU:
468*fbadb1c4SDavid du Colombier case AREMD:
469*fbadb1c4SDavid du Colombier case AREMDU:
470*fbadb1c4SDavid du Colombier case ARLWNM:
471*fbadb1c4SDavid du Colombier case ARLWNMCC:
472*fbadb1c4SDavid du Colombier
473*fbadb1c4SDavid du Colombier case AFADD:
474*fbadb1c4SDavid du Colombier case AFADDS:
475*fbadb1c4SDavid du Colombier case AFSUB:
476*fbadb1c4SDavid du Colombier case AFSUBS:
477*fbadb1c4SDavid du Colombier case AFMUL:
478*fbadb1c4SDavid du Colombier case AFMULS:
479*fbadb1c4SDavid du Colombier case AFDIV:
480*fbadb1c4SDavid du Colombier case AFDIVS:
481*fbadb1c4SDavid du Colombier if(p->to.type == v1->type)
482*fbadb1c4SDavid du Colombier if(p->to.reg == v1->reg) {
483*fbadb1c4SDavid du Colombier if(p->reg == NREG)
484*fbadb1c4SDavid du Colombier p->reg = p->to.reg;
485*fbadb1c4SDavid du Colombier goto gotit;
486*fbadb1c4SDavid du Colombier }
487*fbadb1c4SDavid du Colombier break;
488*fbadb1c4SDavid du Colombier
489*fbadb1c4SDavid du Colombier case AADDME:
490*fbadb1c4SDavid du Colombier case AADDMECC:
491*fbadb1c4SDavid du Colombier case AADDZE:
492*fbadb1c4SDavid du Colombier case AADDZECC:
493*fbadb1c4SDavid du Colombier case ASUBME:
494*fbadb1c4SDavid du Colombier case ASUBMECC:
495*fbadb1c4SDavid du Colombier case ASUBZE:
496*fbadb1c4SDavid du Colombier case ASUBZECC:
497*fbadb1c4SDavid du Colombier case ANEG:
498*fbadb1c4SDavid du Colombier case ANEGCC:
499*fbadb1c4SDavid du Colombier case AFNEG:
500*fbadb1c4SDavid du Colombier case AFNEGCC:
501*fbadb1c4SDavid du Colombier case AFMOVS:
502*fbadb1c4SDavid du Colombier case AFMOVD:
503*fbadb1c4SDavid du Colombier case AMOVW:
504*fbadb1c4SDavid du Colombier case AMOVD:
505*fbadb1c4SDavid du Colombier if(p->to.type == v1->type)
506*fbadb1c4SDavid du Colombier if(p->to.reg == v1->reg)
507*fbadb1c4SDavid du Colombier goto gotit;
508*fbadb1c4SDavid du Colombier break;
509*fbadb1c4SDavid du Colombier }
510*fbadb1c4SDavid du Colombier if(copyau(&p->from, v2) ||
511*fbadb1c4SDavid du Colombier copyau1(p, v2) ||
512*fbadb1c4SDavid du Colombier copyau(&p->to, v2))
513*fbadb1c4SDavid du Colombier break;
514*fbadb1c4SDavid du Colombier if(copysub(&p->from, v1, v2, 0) ||
515*fbadb1c4SDavid du Colombier copysub1(p, v1, v2, 0) ||
516*fbadb1c4SDavid du Colombier copysub(&p->to, v1, v2, 0))
517*fbadb1c4SDavid du Colombier break;
518*fbadb1c4SDavid du Colombier }
519*fbadb1c4SDavid du Colombier return 0;
520*fbadb1c4SDavid du Colombier
521*fbadb1c4SDavid du Colombier gotit:
522*fbadb1c4SDavid du Colombier copysub(&p->to, v1, v2, 1);
523*fbadb1c4SDavid du Colombier if(debug['P']) {
524*fbadb1c4SDavid du Colombier print("gotit: %D->%D\n%P", v1, v2, r->prog);
525*fbadb1c4SDavid du Colombier if(p->from.type == v2->type)
526*fbadb1c4SDavid du Colombier print(" excise");
527*fbadb1c4SDavid du Colombier print("\n");
528*fbadb1c4SDavid du Colombier }
529*fbadb1c4SDavid du Colombier for(r=uniqs(r); r!=r0; r=uniqs(r)) {
530*fbadb1c4SDavid du Colombier p = r->prog;
531*fbadb1c4SDavid du Colombier copysub(&p->from, v1, v2, 1);
532*fbadb1c4SDavid du Colombier copysub1(p, v1, v2, 1);
533*fbadb1c4SDavid du Colombier copysub(&p->to, v1, v2, 1);
534*fbadb1c4SDavid du Colombier if(debug['P'])
535*fbadb1c4SDavid du Colombier print("%P\n", r->prog);
536*fbadb1c4SDavid du Colombier }
537*fbadb1c4SDavid du Colombier t = v1->reg;
538*fbadb1c4SDavid du Colombier v1->reg = v2->reg;
539*fbadb1c4SDavid du Colombier v2->reg = t;
540*fbadb1c4SDavid du Colombier if(debug['P'])
541*fbadb1c4SDavid du Colombier print("%P last\n", r->prog);
542*fbadb1c4SDavid du Colombier return 1;
543*fbadb1c4SDavid du Colombier }
544*fbadb1c4SDavid du Colombier
545*fbadb1c4SDavid du Colombier /*
546*fbadb1c4SDavid du Colombier * The idea is to remove redundant copies.
547*fbadb1c4SDavid du Colombier * v1->v2 F=0
548*fbadb1c4SDavid du Colombier * (use v2 s/v2/v1/)*
549*fbadb1c4SDavid du Colombier * set v1 F=1
550*fbadb1c4SDavid du Colombier * use v2 return fail
551*fbadb1c4SDavid du Colombier * -----------------
552*fbadb1c4SDavid du Colombier * v1->v2 F=0
553*fbadb1c4SDavid du Colombier * (use v2 s/v2/v1/)*
554*fbadb1c4SDavid du Colombier * set v1 F=1
555*fbadb1c4SDavid du Colombier * set v2 return success
556*fbadb1c4SDavid du Colombier */
557*fbadb1c4SDavid du Colombier int
copyprop(Reg * r0)558*fbadb1c4SDavid du Colombier copyprop(Reg *r0)
559*fbadb1c4SDavid du Colombier {
560*fbadb1c4SDavid du Colombier Prog *p;
561*fbadb1c4SDavid du Colombier Adr *v1, *v2;
562*fbadb1c4SDavid du Colombier Reg *r;
563*fbadb1c4SDavid du Colombier
564*fbadb1c4SDavid du Colombier p = r0->prog;
565*fbadb1c4SDavid du Colombier v1 = &p->from;
566*fbadb1c4SDavid du Colombier v2 = &p->to;
567*fbadb1c4SDavid du Colombier if(copyas(v1, v2))
568*fbadb1c4SDavid du Colombier return 1;
569*fbadb1c4SDavid du Colombier for(r=firstr; r!=R; r=r->link)
570*fbadb1c4SDavid du Colombier r->active = 0;
571*fbadb1c4SDavid du Colombier return copy1(v1, v2, r0->s1, 0);
572*fbadb1c4SDavid du Colombier }
573*fbadb1c4SDavid du Colombier
copy1(Adr * v1,Adr * v2,Reg * r,int f)574*fbadb1c4SDavid du Colombier copy1(Adr *v1, Adr *v2, Reg *r, int f)
575*fbadb1c4SDavid du Colombier {
576*fbadb1c4SDavid du Colombier int t;
577*fbadb1c4SDavid du Colombier Prog *p;
578*fbadb1c4SDavid du Colombier
579*fbadb1c4SDavid du Colombier if(r->active) {
580*fbadb1c4SDavid du Colombier if(debug['P'])
581*fbadb1c4SDavid du Colombier print("act set; return 1\n");
582*fbadb1c4SDavid du Colombier return 1;
583*fbadb1c4SDavid du Colombier }
584*fbadb1c4SDavid du Colombier r->active = 1;
585*fbadb1c4SDavid du Colombier if(debug['P'])
586*fbadb1c4SDavid du Colombier print("copy %D->%D f=%d\n", v1, v2, f);
587*fbadb1c4SDavid du Colombier for(; r != R; r = r->s1) {
588*fbadb1c4SDavid du Colombier p = r->prog;
589*fbadb1c4SDavid du Colombier if(debug['P'])
590*fbadb1c4SDavid du Colombier print("%P", p);
591*fbadb1c4SDavid du Colombier if(!f && uniqp(r) == R) {
592*fbadb1c4SDavid du Colombier f = 1;
593*fbadb1c4SDavid du Colombier if(debug['P'])
594*fbadb1c4SDavid du Colombier print("; merge; f=%d", f);
595*fbadb1c4SDavid du Colombier }
596*fbadb1c4SDavid du Colombier t = copyu(p, v2, A);
597*fbadb1c4SDavid du Colombier switch(t) {
598*fbadb1c4SDavid du Colombier case 2: /* rar, cant split */
599*fbadb1c4SDavid du Colombier if(debug['P'])
600*fbadb1c4SDavid du Colombier print("; %Drar; return 0\n", v2);
601*fbadb1c4SDavid du Colombier return 0;
602*fbadb1c4SDavid du Colombier
603*fbadb1c4SDavid du Colombier case 3: /* set */
604*fbadb1c4SDavid du Colombier if(debug['P'])
605*fbadb1c4SDavid du Colombier print("; %Dset; return 1\n", v2);
606*fbadb1c4SDavid du Colombier return 1;
607*fbadb1c4SDavid du Colombier
608*fbadb1c4SDavid du Colombier case 1: /* used, substitute */
609*fbadb1c4SDavid du Colombier case 4: /* use and set */
610*fbadb1c4SDavid du Colombier if(f) {
611*fbadb1c4SDavid du Colombier if(!debug['P'])
612*fbadb1c4SDavid du Colombier return 0;
613*fbadb1c4SDavid du Colombier if(t == 4)
614*fbadb1c4SDavid du Colombier print("; %Dused+set and f=%d; return 0\n", v2, f);
615*fbadb1c4SDavid du Colombier else
616*fbadb1c4SDavid du Colombier print("; %Dused and f=%d; return 0\n", v2, f);
617*fbadb1c4SDavid du Colombier return 0;
618*fbadb1c4SDavid du Colombier }
619*fbadb1c4SDavid du Colombier if(copyu(p, v2, v1)) {
620*fbadb1c4SDavid du Colombier if(debug['P'])
621*fbadb1c4SDavid du Colombier print("; sub fail; return 0\n");
622*fbadb1c4SDavid du Colombier return 0;
623*fbadb1c4SDavid du Colombier }
624*fbadb1c4SDavid du Colombier if(debug['P'])
625*fbadb1c4SDavid du Colombier print("; sub%D/%D", v2, v1);
626*fbadb1c4SDavid du Colombier if(t == 4) {
627*fbadb1c4SDavid du Colombier if(debug['P'])
628*fbadb1c4SDavid du Colombier print("; %Dused+set; return 1\n", v2);
629*fbadb1c4SDavid du Colombier return 1;
630*fbadb1c4SDavid du Colombier }
631*fbadb1c4SDavid du Colombier break;
632*fbadb1c4SDavid du Colombier }
633*fbadb1c4SDavid du Colombier if(!f) {
634*fbadb1c4SDavid du Colombier t = copyu(p, v1, A);
635*fbadb1c4SDavid du Colombier if(!f && (t == 2 || t == 3 || t == 4)) {
636*fbadb1c4SDavid du Colombier f = 1;
637*fbadb1c4SDavid du Colombier if(debug['P'])
638*fbadb1c4SDavid du Colombier print("; %Dset and !f; f=%d", v1, f);
639*fbadb1c4SDavid du Colombier }
640*fbadb1c4SDavid du Colombier }
641*fbadb1c4SDavid du Colombier if(debug['P'])
642*fbadb1c4SDavid du Colombier print("\n");
643*fbadb1c4SDavid du Colombier if(r->s2)
644*fbadb1c4SDavid du Colombier if(!copy1(v1, v2, r->s2, f))
645*fbadb1c4SDavid du Colombier return 0;
646*fbadb1c4SDavid du Colombier }
647*fbadb1c4SDavid du Colombier return 1;
648*fbadb1c4SDavid du Colombier }
649*fbadb1c4SDavid du Colombier
650*fbadb1c4SDavid du Colombier /*
651*fbadb1c4SDavid du Colombier * return
652*fbadb1c4SDavid du Colombier * 1 if v only used (and substitute),
653*fbadb1c4SDavid du Colombier * 2 if read-alter-rewrite
654*fbadb1c4SDavid du Colombier * 3 if set
655*fbadb1c4SDavid du Colombier * 4 if set and used
656*fbadb1c4SDavid du Colombier * 0 otherwise (not touched)
657*fbadb1c4SDavid du Colombier */
658*fbadb1c4SDavid du Colombier int
copyu(Prog * p,Adr * v,Adr * s)659*fbadb1c4SDavid du Colombier copyu(Prog *p, Adr *v, Adr *s)
660*fbadb1c4SDavid du Colombier {
661*fbadb1c4SDavid du Colombier
662*fbadb1c4SDavid du Colombier switch(p->as) {
663*fbadb1c4SDavid du Colombier
664*fbadb1c4SDavid du Colombier default:
665*fbadb1c4SDavid du Colombier if(debug['P'])
666*fbadb1c4SDavid du Colombier print(" (???)");
667*fbadb1c4SDavid du Colombier return 2;
668*fbadb1c4SDavid du Colombier
669*fbadb1c4SDavid du Colombier
670*fbadb1c4SDavid du Colombier case ANOP: /* read, write */
671*fbadb1c4SDavid du Colombier case AMOVH:
672*fbadb1c4SDavid du Colombier case AMOVHZ:
673*fbadb1c4SDavid du Colombier case AMOVB:
674*fbadb1c4SDavid du Colombier case AMOVBZ:
675*fbadb1c4SDavid du Colombier case AMOVW:
676*fbadb1c4SDavid du Colombier case AMOVWZ:
677*fbadb1c4SDavid du Colombier case AMOVD:
678*fbadb1c4SDavid du Colombier
679*fbadb1c4SDavid du Colombier case ANEG:
680*fbadb1c4SDavid du Colombier case ANEGCC:
681*fbadb1c4SDavid du Colombier case AADDME:
682*fbadb1c4SDavid du Colombier case AADDMECC:
683*fbadb1c4SDavid du Colombier case AADDZE:
684*fbadb1c4SDavid du Colombier case AADDZECC:
685*fbadb1c4SDavid du Colombier case ASUBME:
686*fbadb1c4SDavid du Colombier case ASUBMECC:
687*fbadb1c4SDavid du Colombier case ASUBZE:
688*fbadb1c4SDavid du Colombier case ASUBZECC:
689*fbadb1c4SDavid du Colombier
690*fbadb1c4SDavid du Colombier case AFCTIW:
691*fbadb1c4SDavid du Colombier case AFCTIWZ:
692*fbadb1c4SDavid du Colombier case AFMOVS:
693*fbadb1c4SDavid du Colombier case AFMOVD:
694*fbadb1c4SDavid du Colombier case AFRSP:
695*fbadb1c4SDavid du Colombier case AFNEG:
696*fbadb1c4SDavid du Colombier case AFNEGCC:
697*fbadb1c4SDavid du Colombier if(s != A) {
698*fbadb1c4SDavid du Colombier if(copysub(&p->from, v, s, 1))
699*fbadb1c4SDavid du Colombier return 1;
700*fbadb1c4SDavid du Colombier if(!copyas(&p->to, v))
701*fbadb1c4SDavid du Colombier if(copysub(&p->to, v, s, 1))
702*fbadb1c4SDavid du Colombier return 1;
703*fbadb1c4SDavid du Colombier return 0;
704*fbadb1c4SDavid du Colombier }
705*fbadb1c4SDavid du Colombier if(copyas(&p->to, v)) {
706*fbadb1c4SDavid du Colombier if(copyau(&p->from, v))
707*fbadb1c4SDavid du Colombier return 4;
708*fbadb1c4SDavid du Colombier return 3;
709*fbadb1c4SDavid du Colombier }
710*fbadb1c4SDavid du Colombier if(copyau(&p->from, v))
711*fbadb1c4SDavid du Colombier return 1;
712*fbadb1c4SDavid du Colombier if(copyau(&p->to, v))
713*fbadb1c4SDavid du Colombier return 1;
714*fbadb1c4SDavid du Colombier return 0;
715*fbadb1c4SDavid du Colombier
716*fbadb1c4SDavid du Colombier case ARLWMI: /* read read rar */
717*fbadb1c4SDavid du Colombier case ARLWMICC:
718*fbadb1c4SDavid du Colombier if(copyas(&p->to, v))
719*fbadb1c4SDavid du Colombier return 2;
720*fbadb1c4SDavid du Colombier /* fall through */
721*fbadb1c4SDavid du Colombier
722*fbadb1c4SDavid du Colombier case AADD: /* read read write */
723*fbadb1c4SDavid du Colombier case AADDC:
724*fbadb1c4SDavid du Colombier case AADDE:
725*fbadb1c4SDavid du Colombier case ASUB:
726*fbadb1c4SDavid du Colombier case ASLW:
727*fbadb1c4SDavid du Colombier case ASRW:
728*fbadb1c4SDavid du Colombier case ASRAW:
729*fbadb1c4SDavid du Colombier case ASLD:
730*fbadb1c4SDavid du Colombier case ASRD:
731*fbadb1c4SDavid du Colombier case ASRAD:
732*fbadb1c4SDavid du Colombier case AOR:
733*fbadb1c4SDavid du Colombier case AORCC:
734*fbadb1c4SDavid du Colombier case AORN:
735*fbadb1c4SDavid du Colombier case AORNCC:
736*fbadb1c4SDavid du Colombier case AAND:
737*fbadb1c4SDavid du Colombier case AANDCC:
738*fbadb1c4SDavid du Colombier case AANDN:
739*fbadb1c4SDavid du Colombier case AANDNCC:
740*fbadb1c4SDavid du Colombier case ANAND:
741*fbadb1c4SDavid du Colombier case ANANDCC:
742*fbadb1c4SDavid du Colombier case ANOR:
743*fbadb1c4SDavid du Colombier case ANORCC:
744*fbadb1c4SDavid du Colombier case AXOR:
745*fbadb1c4SDavid du Colombier case AMULHW:
746*fbadb1c4SDavid du Colombier case AMULHWU:
747*fbadb1c4SDavid du Colombier case AMULLW:
748*fbadb1c4SDavid du Colombier case AMULLD:
749*fbadb1c4SDavid du Colombier case ADIVW:
750*fbadb1c4SDavid du Colombier case ADIVD:
751*fbadb1c4SDavid du Colombier case ADIVWU:
752*fbadb1c4SDavid du Colombier case ADIVDU:
753*fbadb1c4SDavid du Colombier case AREM:
754*fbadb1c4SDavid du Colombier case AREMU:
755*fbadb1c4SDavid du Colombier case AREMD:
756*fbadb1c4SDavid du Colombier case AREMDU:
757*fbadb1c4SDavid du Colombier case ARLWNM:
758*fbadb1c4SDavid du Colombier case ARLWNMCC:
759*fbadb1c4SDavid du Colombier
760*fbadb1c4SDavid du Colombier case AFADDS:
761*fbadb1c4SDavid du Colombier case AFADD:
762*fbadb1c4SDavid du Colombier case AFSUBS:
763*fbadb1c4SDavid du Colombier case AFSUB:
764*fbadb1c4SDavid du Colombier case AFMULS:
765*fbadb1c4SDavid du Colombier case AFMUL:
766*fbadb1c4SDavid du Colombier case AFDIVS:
767*fbadb1c4SDavid du Colombier case AFDIV:
768*fbadb1c4SDavid du Colombier if(s != A) {
769*fbadb1c4SDavid du Colombier if(copysub(&p->from, v, s, 1))
770*fbadb1c4SDavid du Colombier return 1;
771*fbadb1c4SDavid du Colombier if(copysub1(p, v, s, 1))
772*fbadb1c4SDavid du Colombier return 1;
773*fbadb1c4SDavid du Colombier if(!copyas(&p->to, v))
774*fbadb1c4SDavid du Colombier if(copysub(&p->to, v, s, 1))
775*fbadb1c4SDavid du Colombier return 1;
776*fbadb1c4SDavid du Colombier return 0;
777*fbadb1c4SDavid du Colombier }
778*fbadb1c4SDavid du Colombier if(copyas(&p->to, v)) {
779*fbadb1c4SDavid du Colombier if(p->reg == NREG)
780*fbadb1c4SDavid du Colombier p->reg = p->to.reg;
781*fbadb1c4SDavid du Colombier if(copyau(&p->from, v))
782*fbadb1c4SDavid du Colombier return 4;
783*fbadb1c4SDavid du Colombier if(copyau1(p, v))
784*fbadb1c4SDavid du Colombier return 4;
785*fbadb1c4SDavid du Colombier return 3;
786*fbadb1c4SDavid du Colombier }
787*fbadb1c4SDavid du Colombier if(copyau(&p->from, v))
788*fbadb1c4SDavid du Colombier return 1;
789*fbadb1c4SDavid du Colombier if(copyau1(p, v))
790*fbadb1c4SDavid du Colombier return 1;
791*fbadb1c4SDavid du Colombier if(copyau(&p->to, v))
792*fbadb1c4SDavid du Colombier return 1;
793*fbadb1c4SDavid du Colombier return 0;
794*fbadb1c4SDavid du Colombier
795*fbadb1c4SDavid du Colombier case ABEQ:
796*fbadb1c4SDavid du Colombier case ABGT:
797*fbadb1c4SDavid du Colombier case ABGE:
798*fbadb1c4SDavid du Colombier case ABLT:
799*fbadb1c4SDavid du Colombier case ABLE:
800*fbadb1c4SDavid du Colombier case ABNE:
801*fbadb1c4SDavid du Colombier case ABVC:
802*fbadb1c4SDavid du Colombier case ABVS:
803*fbadb1c4SDavid du Colombier break;
804*fbadb1c4SDavid du Colombier
805*fbadb1c4SDavid du Colombier case ACMP: /* read read */
806*fbadb1c4SDavid du Colombier case ACMPU:
807*fbadb1c4SDavid du Colombier case ACMPW:
808*fbadb1c4SDavid du Colombier case ACMPWU:
809*fbadb1c4SDavid du Colombier case AFCMPO:
810*fbadb1c4SDavid du Colombier case AFCMPU:
811*fbadb1c4SDavid du Colombier if(s != A) {
812*fbadb1c4SDavid du Colombier if(copysub(&p->from, v, s, 1))
813*fbadb1c4SDavid du Colombier return 1;
814*fbadb1c4SDavid du Colombier return copysub(&p->to, v, s, 1);
815*fbadb1c4SDavid du Colombier }
816*fbadb1c4SDavid du Colombier if(copyau(&p->from, v))
817*fbadb1c4SDavid du Colombier return 1;
818*fbadb1c4SDavid du Colombier if(copyau(&p->to, v))
819*fbadb1c4SDavid du Colombier return 1;
820*fbadb1c4SDavid du Colombier break;
821*fbadb1c4SDavid du Colombier
822*fbadb1c4SDavid du Colombier case ABR: /* funny */
823*fbadb1c4SDavid du Colombier if(s != A) {
824*fbadb1c4SDavid du Colombier if(copysub(&p->to, v, s, 1))
825*fbadb1c4SDavid du Colombier return 1;
826*fbadb1c4SDavid du Colombier return 0;
827*fbadb1c4SDavid du Colombier }
828*fbadb1c4SDavid du Colombier if(copyau(&p->to, v))
829*fbadb1c4SDavid du Colombier return 1;
830*fbadb1c4SDavid du Colombier return 0;
831*fbadb1c4SDavid du Colombier
832*fbadb1c4SDavid du Colombier case ARETURN: /* funny */
833*fbadb1c4SDavid du Colombier if(v->type == D_REG)
834*fbadb1c4SDavid du Colombier if(v->reg == REGRET)
835*fbadb1c4SDavid du Colombier return 2;
836*fbadb1c4SDavid du Colombier if(v->type == D_FREG)
837*fbadb1c4SDavid du Colombier if(v->reg == FREGRET)
838*fbadb1c4SDavid du Colombier return 2;
839*fbadb1c4SDavid du Colombier
840*fbadb1c4SDavid du Colombier case ABL: /* funny */
841*fbadb1c4SDavid du Colombier if(v->type == D_REG) {
842*fbadb1c4SDavid du Colombier if(v->reg <= REGEXT && v->reg > exregoffset)
843*fbadb1c4SDavid du Colombier return 2;
844*fbadb1c4SDavid du Colombier if(v->reg == REGARG)
845*fbadb1c4SDavid du Colombier return 2;
846*fbadb1c4SDavid du Colombier }
847*fbadb1c4SDavid du Colombier if(v->type == D_FREG) {
848*fbadb1c4SDavid du Colombier if(v->reg <= FREGEXT && v->reg > exfregoffset)
849*fbadb1c4SDavid du Colombier return 2;
850*fbadb1c4SDavid du Colombier }
851*fbadb1c4SDavid du Colombier
852*fbadb1c4SDavid du Colombier if(s != A) {
853*fbadb1c4SDavid du Colombier if(copysub(&p->to, v, s, 1))
854*fbadb1c4SDavid du Colombier return 1;
855*fbadb1c4SDavid du Colombier return 0;
856*fbadb1c4SDavid du Colombier }
857*fbadb1c4SDavid du Colombier if(copyau(&p->to, v))
858*fbadb1c4SDavid du Colombier return 4;
859*fbadb1c4SDavid du Colombier return 3;
860*fbadb1c4SDavid du Colombier
861*fbadb1c4SDavid du Colombier case ATEXT: /* funny */
862*fbadb1c4SDavid du Colombier if(v->type == D_REG)
863*fbadb1c4SDavid du Colombier if(v->reg == REGARG)
864*fbadb1c4SDavid du Colombier return 3;
865*fbadb1c4SDavid du Colombier return 0;
866*fbadb1c4SDavid du Colombier }
867*fbadb1c4SDavid du Colombier return 0;
868*fbadb1c4SDavid du Colombier }
869*fbadb1c4SDavid du Colombier
870*fbadb1c4SDavid du Colombier int
a2type(Prog * p)871*fbadb1c4SDavid du Colombier a2type(Prog *p)
872*fbadb1c4SDavid du Colombier {
873*fbadb1c4SDavid du Colombier
874*fbadb1c4SDavid du Colombier switch(p->as) {
875*fbadb1c4SDavid du Colombier case AADD:
876*fbadb1c4SDavid du Colombier case AADDC:
877*fbadb1c4SDavid du Colombier case AADDCC:
878*fbadb1c4SDavid du Colombier case AADDCCC:
879*fbadb1c4SDavid du Colombier case AADDE:
880*fbadb1c4SDavid du Colombier case AADDECC:
881*fbadb1c4SDavid du Colombier case AADDME:
882*fbadb1c4SDavid du Colombier case AADDMECC:
883*fbadb1c4SDavid du Colombier case AADDZE:
884*fbadb1c4SDavid du Colombier case AADDZECC:
885*fbadb1c4SDavid du Colombier case ASUB:
886*fbadb1c4SDavid du Colombier case ASUBC:
887*fbadb1c4SDavid du Colombier case ASUBCC:
888*fbadb1c4SDavid du Colombier case ASUBCCC:
889*fbadb1c4SDavid du Colombier case ASUBE:
890*fbadb1c4SDavid du Colombier case ASUBECC:
891*fbadb1c4SDavid du Colombier case ASUBME:
892*fbadb1c4SDavid du Colombier case ASUBMECC:
893*fbadb1c4SDavid du Colombier case ASUBZE:
894*fbadb1c4SDavid du Colombier case ASUBZECC:
895*fbadb1c4SDavid du Colombier case ASLW:
896*fbadb1c4SDavid du Colombier case ASLWCC:
897*fbadb1c4SDavid du Colombier case ASRW:
898*fbadb1c4SDavid du Colombier case ASRWCC:
899*fbadb1c4SDavid du Colombier case ASRAW:
900*fbadb1c4SDavid du Colombier case ASRAWCC:
901*fbadb1c4SDavid du Colombier case ASLD:
902*fbadb1c4SDavid du Colombier case ASLDCC:
903*fbadb1c4SDavid du Colombier case ASRD:
904*fbadb1c4SDavid du Colombier case ASRDCC:
905*fbadb1c4SDavid du Colombier case ASRAD:
906*fbadb1c4SDavid du Colombier case ASRADCC:
907*fbadb1c4SDavid du Colombier case AOR:
908*fbadb1c4SDavid du Colombier case AORCC:
909*fbadb1c4SDavid du Colombier case AORN:
910*fbadb1c4SDavid du Colombier case AORNCC:
911*fbadb1c4SDavid du Colombier case AAND:
912*fbadb1c4SDavid du Colombier case AANDCC:
913*fbadb1c4SDavid du Colombier case AANDN:
914*fbadb1c4SDavid du Colombier case AANDNCC:
915*fbadb1c4SDavid du Colombier case AXOR:
916*fbadb1c4SDavid du Colombier case AXORCC:
917*fbadb1c4SDavid du Colombier case ANEG:
918*fbadb1c4SDavid du Colombier case ANEGCC:
919*fbadb1c4SDavid du Colombier case AMULHW:
920*fbadb1c4SDavid du Colombier case AMULHWU:
921*fbadb1c4SDavid du Colombier case AMULLW:
922*fbadb1c4SDavid du Colombier case AMULLWCC:
923*fbadb1c4SDavid du Colombier case ADIVW:
924*fbadb1c4SDavid du Colombier case ADIVWCC:
925*fbadb1c4SDavid du Colombier case ADIVWU:
926*fbadb1c4SDavid du Colombier case ADIVWUCC:
927*fbadb1c4SDavid du Colombier case AREM:
928*fbadb1c4SDavid du Colombier case AREMCC:
929*fbadb1c4SDavid du Colombier case AREMU:
930*fbadb1c4SDavid du Colombier case AREMUCC:
931*fbadb1c4SDavid du Colombier case AMULLD:
932*fbadb1c4SDavid du Colombier case AMULLDCC:
933*fbadb1c4SDavid du Colombier case ADIVD:
934*fbadb1c4SDavid du Colombier case ADIVDCC:
935*fbadb1c4SDavid du Colombier case ADIVDU:
936*fbadb1c4SDavid du Colombier case ADIVDUCC:
937*fbadb1c4SDavid du Colombier case AREMD:
938*fbadb1c4SDavid du Colombier case AREMDCC:
939*fbadb1c4SDavid du Colombier case AREMDU:
940*fbadb1c4SDavid du Colombier case AREMDUCC:
941*fbadb1c4SDavid du Colombier case ANAND:
942*fbadb1c4SDavid du Colombier case ANANDCC:
943*fbadb1c4SDavid du Colombier case ANOR:
944*fbadb1c4SDavid du Colombier case ANORCC:
945*fbadb1c4SDavid du Colombier case ARLWMI:
946*fbadb1c4SDavid du Colombier case ARLWMICC:
947*fbadb1c4SDavid du Colombier case ARLWNM:
948*fbadb1c4SDavid du Colombier case ARLWNMCC:
949*fbadb1c4SDavid du Colombier return D_REG;
950*fbadb1c4SDavid du Colombier
951*fbadb1c4SDavid du Colombier case AFADDS:
952*fbadb1c4SDavid du Colombier case AFADDSCC:
953*fbadb1c4SDavid du Colombier case AFADD:
954*fbadb1c4SDavid du Colombier case AFADDCC:
955*fbadb1c4SDavid du Colombier case AFSUBS:
956*fbadb1c4SDavid du Colombier case AFSUBSCC:
957*fbadb1c4SDavid du Colombier case AFSUB:
958*fbadb1c4SDavid du Colombier case AFSUBCC:
959*fbadb1c4SDavid du Colombier case AFMULS:
960*fbadb1c4SDavid du Colombier case AFMULSCC:
961*fbadb1c4SDavid du Colombier case AFMUL:
962*fbadb1c4SDavid du Colombier case AFMULCC:
963*fbadb1c4SDavid du Colombier case AFDIVS:
964*fbadb1c4SDavid du Colombier case AFDIVSCC:
965*fbadb1c4SDavid du Colombier case AFDIV:
966*fbadb1c4SDavid du Colombier case AFDIVCC:
967*fbadb1c4SDavid du Colombier case AFNEG:
968*fbadb1c4SDavid du Colombier case AFNEGCC:
969*fbadb1c4SDavid du Colombier return D_FREG;
970*fbadb1c4SDavid du Colombier }
971*fbadb1c4SDavid du Colombier return D_NONE;
972*fbadb1c4SDavid du Colombier }
973*fbadb1c4SDavid du Colombier
974*fbadb1c4SDavid du Colombier /*
975*fbadb1c4SDavid du Colombier * direct reference,
976*fbadb1c4SDavid du Colombier * could be set/use depending on
977*fbadb1c4SDavid du Colombier * semantics
978*fbadb1c4SDavid du Colombier */
979*fbadb1c4SDavid du Colombier int
copyas(Adr * a,Adr * v)980*fbadb1c4SDavid du Colombier copyas(Adr *a, Adr *v)
981*fbadb1c4SDavid du Colombier {
982*fbadb1c4SDavid du Colombier
983*fbadb1c4SDavid du Colombier if(regtyp(v))
984*fbadb1c4SDavid du Colombier if(a->type == v->type)
985*fbadb1c4SDavid du Colombier if(a->reg == v->reg)
986*fbadb1c4SDavid du Colombier return 1;
987*fbadb1c4SDavid du Colombier return 0;
988*fbadb1c4SDavid du Colombier }
989*fbadb1c4SDavid du Colombier
990*fbadb1c4SDavid du Colombier /*
991*fbadb1c4SDavid du Colombier * either direct or indirect
992*fbadb1c4SDavid du Colombier */
993*fbadb1c4SDavid du Colombier int
copyau(Adr * a,Adr * v)994*fbadb1c4SDavid du Colombier copyau(Adr *a, Adr *v)
995*fbadb1c4SDavid du Colombier {
996*fbadb1c4SDavid du Colombier
997*fbadb1c4SDavid du Colombier if(copyas(a, v))
998*fbadb1c4SDavid du Colombier return 1;
999*fbadb1c4SDavid du Colombier if(v->type == D_REG)
1000*fbadb1c4SDavid du Colombier if(a->type == D_OREG)
1001*fbadb1c4SDavid du Colombier if(v->reg == a->reg)
1002*fbadb1c4SDavid du Colombier return 1;
1003*fbadb1c4SDavid du Colombier return 0;
1004*fbadb1c4SDavid du Colombier }
1005*fbadb1c4SDavid du Colombier
1006*fbadb1c4SDavid du Colombier int
copyau1(Prog * p,Adr * v)1007*fbadb1c4SDavid du Colombier copyau1(Prog *p, Adr *v)
1008*fbadb1c4SDavid du Colombier {
1009*fbadb1c4SDavid du Colombier
1010*fbadb1c4SDavid du Colombier if(regtyp(v))
1011*fbadb1c4SDavid du Colombier if(p->from.type == v->type || p->to.type == v->type)
1012*fbadb1c4SDavid du Colombier if(p->reg == v->reg) {
1013*fbadb1c4SDavid du Colombier if(a2type(p) != v->type)
1014*fbadb1c4SDavid du Colombier print("botch a2type %P\n", p);
1015*fbadb1c4SDavid du Colombier return 1;
1016*fbadb1c4SDavid du Colombier }
1017*fbadb1c4SDavid du Colombier return 0;
1018*fbadb1c4SDavid du Colombier }
1019*fbadb1c4SDavid du Colombier
1020*fbadb1c4SDavid du Colombier /*
1021*fbadb1c4SDavid du Colombier * substitute s for v in a
1022*fbadb1c4SDavid du Colombier * return failure to substitute
1023*fbadb1c4SDavid du Colombier */
1024*fbadb1c4SDavid du Colombier int
copysub(Adr * a,Adr * v,Adr * s,int f)1025*fbadb1c4SDavid du Colombier copysub(Adr *a, Adr *v, Adr *s, int f)
1026*fbadb1c4SDavid du Colombier {
1027*fbadb1c4SDavid du Colombier
1028*fbadb1c4SDavid du Colombier if(f)
1029*fbadb1c4SDavid du Colombier if(copyau(a, v))
1030*fbadb1c4SDavid du Colombier a->reg = s->reg;
1031*fbadb1c4SDavid du Colombier return 0;
1032*fbadb1c4SDavid du Colombier }
1033*fbadb1c4SDavid du Colombier
1034*fbadb1c4SDavid du Colombier int
copysub1(Prog * p1,Adr * v,Adr * s,int f)1035*fbadb1c4SDavid du Colombier copysub1(Prog *p1, Adr *v, Adr *s, int f)
1036*fbadb1c4SDavid du Colombier {
1037*fbadb1c4SDavid du Colombier
1038*fbadb1c4SDavid du Colombier if(f)
1039*fbadb1c4SDavid du Colombier if(copyau1(p1, v))
1040*fbadb1c4SDavid du Colombier p1->reg = s->reg;
1041*fbadb1c4SDavid du Colombier return 0;
1042*fbadb1c4SDavid du Colombier }
1043