17dd7cddfSDavid du Colombier #include "gc.h"
27dd7cddfSDavid du Colombier
37dd7cddfSDavid du Colombier void
peep(void)47dd7cddfSDavid du Colombier peep(void)
57dd7cddfSDavid du Colombier {
67dd7cddfSDavid du Colombier Reg *r, *r1, *r2;
77dd7cddfSDavid du Colombier Prog *p, *p1;
87dd7cddfSDavid du Colombier int t;
97dd7cddfSDavid du Colombier /*
107dd7cddfSDavid du Colombier * complete R structure
117dd7cddfSDavid du Colombier */
127dd7cddfSDavid du Colombier t = 0;
137dd7cddfSDavid du Colombier for(r=firstr; r!=R; r=r1) {
147dd7cddfSDavid du Colombier r1 = r->link;
157dd7cddfSDavid du Colombier if(r1 == R)
167dd7cddfSDavid du Colombier break;
177dd7cddfSDavid du Colombier p = r->prog->link;
187dd7cddfSDavid du Colombier while(p != r1->prog)
197dd7cddfSDavid du Colombier switch(p->as) {
207dd7cddfSDavid du Colombier default:
217dd7cddfSDavid du Colombier r2 = rega();
227dd7cddfSDavid du Colombier r->link = r2;
237dd7cddfSDavid du Colombier r2->link = r1;
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier r2->prog = p;
267dd7cddfSDavid du Colombier r2->p1 = r;
277dd7cddfSDavid du Colombier r->s1 = r2;
287dd7cddfSDavid du Colombier r2->s1 = r1;
297dd7cddfSDavid du Colombier r1->p1 = r2;
307dd7cddfSDavid du Colombier
317dd7cddfSDavid du Colombier r = r2;
327dd7cddfSDavid du Colombier t++;
337dd7cddfSDavid du Colombier
347dd7cddfSDavid du Colombier case ADATA:
357dd7cddfSDavid du Colombier case AGLOBL:
367dd7cddfSDavid du Colombier case ANAME:
37375daca8SDavid du Colombier case ASIGNAME:
387dd7cddfSDavid du Colombier p = p->link;
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier loop1:
437dd7cddfSDavid du Colombier t = 0;
447dd7cddfSDavid du Colombier for(r=firstr; r!=R; r=r->link) {
457dd7cddfSDavid du Colombier p = r->prog;
467dd7cddfSDavid du Colombier if(p->as == AMOVW || p->as == AFMOVS || p->as == AFMOVD)
477dd7cddfSDavid du Colombier if(regtyp(&p->to)) {
487dd7cddfSDavid du Colombier if(regtyp(&p->from))
497dd7cddfSDavid du Colombier if(p->from.type == p->to.type) {
507dd7cddfSDavid du Colombier if(copyprop(r)) {
517dd7cddfSDavid du Colombier excise(r);
527dd7cddfSDavid du Colombier t++;
537dd7cddfSDavid du Colombier } else
547dd7cddfSDavid du Colombier if(subprop(r) && copyprop(r)) {
557dd7cddfSDavid du Colombier excise(r);
567dd7cddfSDavid du Colombier t++;
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier }
597dd7cddfSDavid du Colombier if(regzer(&p->from))
607dd7cddfSDavid du Colombier if(p->to.type == D_REG) {
617dd7cddfSDavid du Colombier p->from.type = D_REG;
627dd7cddfSDavid du Colombier p->from.reg = REGZERO;
637dd7cddfSDavid du Colombier if(copyprop(r)) {
647dd7cddfSDavid du Colombier excise(r);
657dd7cddfSDavid du Colombier t++;
667dd7cddfSDavid du Colombier } else
677dd7cddfSDavid du Colombier if(subprop(r) && copyprop(r)) {
687dd7cddfSDavid du Colombier excise(r);
697dd7cddfSDavid du Colombier t++;
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier }
737dd7cddfSDavid du Colombier }
747dd7cddfSDavid du Colombier if(t)
757dd7cddfSDavid du Colombier goto loop1;
767dd7cddfSDavid du Colombier /*
777dd7cddfSDavid du Colombier * look for MOVB x,R; MOVB R,R
787dd7cddfSDavid du Colombier */
797dd7cddfSDavid du Colombier for(r=firstr; r!=R; r=r->link) {
807dd7cddfSDavid du Colombier p = r->prog;
817dd7cddfSDavid du Colombier switch(p->as) {
827dd7cddfSDavid du Colombier default:
837dd7cddfSDavid du Colombier continue;
847dd7cddfSDavid du Colombier case AMOVH:
857dd7cddfSDavid du Colombier case AMOVHZ:
867dd7cddfSDavid du Colombier case AMOVB:
877dd7cddfSDavid du Colombier case AMOVBZ:
887dd7cddfSDavid du Colombier if(p->to.type != D_REG)
897dd7cddfSDavid du Colombier continue;
907dd7cddfSDavid du Colombier break;
917dd7cddfSDavid du Colombier }
927dd7cddfSDavid du Colombier r1 = r->link;
937dd7cddfSDavid du Colombier if(r1 == R)
947dd7cddfSDavid du Colombier continue;
957dd7cddfSDavid du Colombier p1 = r1->prog;
967dd7cddfSDavid du Colombier if(p1->as != p->as)
977dd7cddfSDavid du Colombier continue;
987dd7cddfSDavid du Colombier if(p1->from.type != D_REG || p1->from.reg != p->to.reg)
997dd7cddfSDavid du Colombier continue;
1007dd7cddfSDavid du Colombier if(p1->to.type != D_REG || p1->to.reg != p->to.reg)
1017dd7cddfSDavid du Colombier continue;
1027dd7cddfSDavid du Colombier excise(r1);
1037dd7cddfSDavid du Colombier }
104375daca8SDavid du Colombier
105375daca8SDavid du Colombier if(debug['Q'] > 1)
106375daca8SDavid du Colombier return; /* allow following code improvement to be suppressed */
107375daca8SDavid du Colombier
108375daca8SDavid du Colombier /*
109375daca8SDavid du Colombier * look for OP x,y,R; CMP R, $0 -> OPCC x,y,R
110375daca8SDavid du Colombier * when OP can set condition codes correctly
111375daca8SDavid du Colombier */
112375daca8SDavid du Colombier for(r=firstr; r!=R; r=r->link) {
113375daca8SDavid du Colombier p = r->prog;
114375daca8SDavid du Colombier switch(p->as) {
115375daca8SDavid du Colombier case ACMP:
116375daca8SDavid du Colombier if(!regzer(&p->to))
117375daca8SDavid du Colombier continue;
118375daca8SDavid du Colombier r1 = r->s1;
119375daca8SDavid du Colombier if(r1 == R)
120375daca8SDavid du Colombier continue;
121375daca8SDavid du Colombier switch(r1->prog->as) {
122375daca8SDavid du Colombier default:
123375daca8SDavid du Colombier continue;
124375daca8SDavid du Colombier case ABCL:
125375daca8SDavid du Colombier case ABC:
126375daca8SDavid du Colombier /* the conditions can be complex and these are currently little used */
127375daca8SDavid du Colombier continue;
128375daca8SDavid du Colombier case ABEQ:
129375daca8SDavid du Colombier case ABGE:
130375daca8SDavid du Colombier case ABGT:
131375daca8SDavid du Colombier case ABLE:
132375daca8SDavid du Colombier case ABLT:
133375daca8SDavid du Colombier case ABNE:
134375daca8SDavid du Colombier case ABVC:
135375daca8SDavid du Colombier case ABVS:
136375daca8SDavid du Colombier break;
137375daca8SDavid du Colombier }
138375daca8SDavid du Colombier r1 = r;
139375daca8SDavid du Colombier do
140375daca8SDavid du Colombier r1 = uniqp(r1);
141375daca8SDavid du Colombier while (r1 != R && r1->prog->as == ANOP);
142375daca8SDavid du Colombier if(r1 == R)
143375daca8SDavid du Colombier continue;
144375daca8SDavid du Colombier p1 = r1->prog;
145375daca8SDavid du Colombier if(p1->to.type != D_REG || p1->to.reg != p->from.reg)
146375daca8SDavid du Colombier continue;
147375daca8SDavid du Colombier switch(p1->as) {
148375daca8SDavid du Colombier case ASUB:
149375daca8SDavid du Colombier case AADD:
150375daca8SDavid du Colombier case AXOR:
151375daca8SDavid du Colombier case AOR:
152375daca8SDavid du Colombier /* irregular instructions */
153375daca8SDavid du Colombier if(p1->from.type == D_CONST)
154375daca8SDavid du Colombier continue;
155375daca8SDavid du Colombier break;
156375daca8SDavid du Colombier }
157375daca8SDavid du Colombier switch(p1->as) {
158375daca8SDavid du Colombier default:
159375daca8SDavid du Colombier continue;
160375daca8SDavid du Colombier case AMOVW:
161375daca8SDavid du Colombier if(p1->from.type != D_REG)
162375daca8SDavid du Colombier continue;
163375daca8SDavid du Colombier continue;
164375daca8SDavid du Colombier case AANDCC:
165375daca8SDavid du Colombier case AANDNCC:
166375daca8SDavid du Colombier case AORCC:
167375daca8SDavid du Colombier case AORNCC:
168375daca8SDavid du Colombier case AXORCC:
169375daca8SDavid du Colombier case ASUBCC:
1706891d857SDavid du Colombier case ASUBECC:
1716891d857SDavid du Colombier case ASUBMECC:
1726891d857SDavid du Colombier case ASUBZECC:
173375daca8SDavid du Colombier case AADDCC:
1746891d857SDavid du Colombier case AADDCCC:
1756891d857SDavid du Colombier case AADDECC:
1766891d857SDavid du Colombier case AADDMECC:
1776891d857SDavid du Colombier case AADDZECC:
1786891d857SDavid du Colombier case ARLWMICC:
1796891d857SDavid du Colombier case ARLWNMCC:
180375daca8SDavid du Colombier t = p1->as;
181375daca8SDavid du Colombier break;
182375daca8SDavid du Colombier /* don't deal with floating point instructions for now */
183375daca8SDavid du Colombier /*
184375daca8SDavid du Colombier case AFABS: t = AFABSCC; break;
185375daca8SDavid du Colombier case AFADD: t = AFADDCC; break;
186375daca8SDavid du Colombier case AFADDS: t = AFADDSCC; break;
187375daca8SDavid du Colombier case AFCTIW: t = AFCTIWCC; break;
188375daca8SDavid du Colombier case AFCTIWZ: t = AFCTIWZCC; break;
189375daca8SDavid du Colombier case AFDIV: t = AFDIVCC; break;
190375daca8SDavid du Colombier case AFDIVS: t = AFDIVSCC; break;
191375daca8SDavid du Colombier case AFMADD: t = AFMADDCC; break;
192375daca8SDavid du Colombier case AFMADDS: t = AFMADDSCC; break;
193375daca8SDavid du Colombier case AFMOVD: t = AFMOVDCC; break;
194375daca8SDavid du Colombier case AFMSUB: t = AFMSUBCC; break;
195375daca8SDavid du Colombier case AFMSUBS: t = AFMSUBSCC; break;
196375daca8SDavid du Colombier case AFMUL: t = AFMULCC; break;
197375daca8SDavid du Colombier case AFMULS: t = AFMULSCC; break;
198375daca8SDavid du Colombier case AFNABS: t = AFNABSCC; break;
199375daca8SDavid du Colombier case AFNEG: t = AFNEGCC; break;
200375daca8SDavid du Colombier case AFNMADD: t = AFNMADDCC; break;
201375daca8SDavid du Colombier case AFNMADDS: t = AFNMADDSCC; break;
202375daca8SDavid du Colombier case AFNMSUB: t = AFNMSUBCC; break;
203375daca8SDavid du Colombier case AFNMSUBS: t = AFNMSUBSCC; break;
204375daca8SDavid du Colombier case AFRSP: t = AFRSPCC; break;
205375daca8SDavid du Colombier case AFSUB: t = AFSUBCC; break;
206375daca8SDavid du Colombier case AFSUBS: t = AFSUBSCC; break;
207375daca8SDavid du Colombier case ACNTLZW: t = ACNTLZWCC; break;
208375daca8SDavid du Colombier case AMTFSB0: t = AMTFSB0CC; break;
209375daca8SDavid du Colombier case AMTFSB1: t = AMTFSB1CC; break;
210375daca8SDavid du Colombier */
211375daca8SDavid du Colombier case AADD: t = AADDCC; break;
212375daca8SDavid du Colombier case AADDV: t = AADDVCC; break;
213375daca8SDavid du Colombier case AADDC: t = AADDCCC; break;
214375daca8SDavid du Colombier case AADDCV: t = AADDCVCC; break;
215375daca8SDavid du Colombier case AADDME: t = AADDMECC; break;
216375daca8SDavid du Colombier case AADDMEV: t = AADDMEVCC; break;
217375daca8SDavid du Colombier case AADDE: t = AADDECC; break;
218375daca8SDavid du Colombier case AADDEV: t = AADDEVCC; break;
219375daca8SDavid du Colombier case AADDZE: t = AADDZECC; break;
220375daca8SDavid du Colombier case AADDZEV: t = AADDZEVCC; break;
221375daca8SDavid du Colombier case AAND: t = AANDCC; break;
222375daca8SDavid du Colombier case AANDN: t = AANDNCC; break;
223375daca8SDavid du Colombier case ADIVW: t = ADIVWCC; break;
224375daca8SDavid du Colombier case ADIVWV: t = ADIVWVCC; break;
225375daca8SDavid du Colombier case ADIVWU: t = ADIVWUCC; break;
226375daca8SDavid du Colombier case ADIVWUV: t = ADIVWUVCC; break;
227375daca8SDavid du Colombier case AEQV: t = AEQVCC; break;
228375daca8SDavid du Colombier case AEXTSB: t = AEXTSBCC; break;
229375daca8SDavid du Colombier case AEXTSH: t = AEXTSHCC; break;
230375daca8SDavid du Colombier case AMULHW: t = AMULHWCC; break;
231375daca8SDavid du Colombier case AMULHWU: t = AMULHWUCC; break;
232375daca8SDavid du Colombier case AMULLW: t = AMULLWCC; break;
233375daca8SDavid du Colombier case AMULLWV: t = AMULLWVCC; break;
234375daca8SDavid du Colombier case ANAND: t = ANANDCC; break;
235375daca8SDavid du Colombier case ANEG: t = ANEGCC; break;
236375daca8SDavid du Colombier case ANEGV: t = ANEGVCC; break;
237375daca8SDavid du Colombier case ANOR: t = ANORCC; break;
238375daca8SDavid du Colombier case AOR: t = AORCC; break;
239375daca8SDavid du Colombier case AORN: t = AORNCC; break;
240375daca8SDavid du Colombier case AREM: t = AREMCC; break;
241375daca8SDavid du Colombier case AREMV: t = AREMVCC; break;
242375daca8SDavid du Colombier case AREMU: t = AREMUCC; break;
243375daca8SDavid du Colombier case AREMUV: t = AREMUVCC; break;
244375daca8SDavid du Colombier case ARLWMI: t = ARLWMICC; break;
245375daca8SDavid du Colombier case ARLWNM: t = ARLWNMCC; break;
246375daca8SDavid du Colombier case ASLW: t = ASLWCC; break;
247375daca8SDavid du Colombier case ASRAW: t = ASRAWCC; break;
248375daca8SDavid du Colombier case ASRW: t = ASRWCC; break;
249375daca8SDavid du Colombier case ASUB: t = ASUBCC; break;
250375daca8SDavid du Colombier case ASUBV: t = ASUBVCC; break;
251375daca8SDavid du Colombier case ASUBC: t = ASUBCCC; break;
252375daca8SDavid du Colombier case ASUBCV: t = ASUBCVCC; break;
253375daca8SDavid du Colombier case ASUBME: t = ASUBMECC; break;
254375daca8SDavid du Colombier case ASUBMEV: t = ASUBMEVCC; break;
255375daca8SDavid du Colombier case ASUBE: t = ASUBECC; break;
256375daca8SDavid du Colombier case ASUBEV: t = ASUBEVCC; break;
257375daca8SDavid du Colombier case ASUBZE: t = ASUBZECC; break;
258375daca8SDavid du Colombier case ASUBZEV: t = ASUBZEVCC; break;
259375daca8SDavid du Colombier case AXOR: t = AXORCC; break;
260375daca8SDavid du Colombier break;
261375daca8SDavid du Colombier }
262375daca8SDavid du Colombier if(debug['Q'])
263375daca8SDavid du Colombier print("cmp %P; %P -> ", p1, p);
264375daca8SDavid du Colombier p1->as = t;
265375daca8SDavid du Colombier if(debug['Q'])
266375daca8SDavid du Colombier print("%P\n", p1);
267375daca8SDavid du Colombier excise(r);
268375daca8SDavid du Colombier continue;
269375daca8SDavid du Colombier }
270375daca8SDavid du Colombier }
2717dd7cddfSDavid du Colombier }
2727dd7cddfSDavid du Colombier
2737dd7cddfSDavid du Colombier void
excise(Reg * r)2747dd7cddfSDavid du Colombier excise(Reg *r)
2757dd7cddfSDavid du Colombier {
2767dd7cddfSDavid du Colombier Prog *p;
2777dd7cddfSDavid du Colombier
2787dd7cddfSDavid du Colombier p = r->prog;
2797dd7cddfSDavid du Colombier p->as = ANOP;
2807dd7cddfSDavid du Colombier p->from = zprog.from;
2816891d857SDavid du Colombier p->from3 = zprog.from3;
2827dd7cddfSDavid du Colombier p->to = zprog.to;
2837dd7cddfSDavid du Colombier p->reg = zprog.reg; /**/
2847dd7cddfSDavid du Colombier }
2857dd7cddfSDavid du Colombier
2867dd7cddfSDavid du Colombier Reg*
uniqp(Reg * r)2877dd7cddfSDavid du Colombier uniqp(Reg *r)
2887dd7cddfSDavid du Colombier {
2897dd7cddfSDavid du Colombier Reg *r1;
2907dd7cddfSDavid du Colombier
2917dd7cddfSDavid du Colombier r1 = r->p1;
2927dd7cddfSDavid du Colombier if(r1 == R) {
2937dd7cddfSDavid du Colombier r1 = r->p2;
2947dd7cddfSDavid du Colombier if(r1 == R || r1->p2link != R)
2957dd7cddfSDavid du Colombier return R;
2967dd7cddfSDavid du Colombier } else
2977dd7cddfSDavid du Colombier if(r->p2 != R)
2987dd7cddfSDavid du Colombier return R;
2997dd7cddfSDavid du Colombier return r1;
3007dd7cddfSDavid du Colombier }
3017dd7cddfSDavid du Colombier
3027dd7cddfSDavid du Colombier Reg*
uniqs(Reg * r)3037dd7cddfSDavid du Colombier uniqs(Reg *r)
3047dd7cddfSDavid du Colombier {
3057dd7cddfSDavid du Colombier Reg *r1;
3067dd7cddfSDavid du Colombier
3077dd7cddfSDavid du Colombier r1 = r->s1;
3087dd7cddfSDavid du Colombier if(r1 == R) {
3097dd7cddfSDavid du Colombier r1 = r->s2;
3107dd7cddfSDavid du Colombier if(r1 == R)
3117dd7cddfSDavid du Colombier return R;
3127dd7cddfSDavid du Colombier } else
3137dd7cddfSDavid du Colombier if(r->s2 != R)
3147dd7cddfSDavid du Colombier return R;
3157dd7cddfSDavid du Colombier return r1;
3167dd7cddfSDavid du Colombier }
3177dd7cddfSDavid du Colombier
3187dd7cddfSDavid du Colombier /*
319375daca8SDavid du Colombier * if the system forces R0 to be zero,
320375daca8SDavid du Colombier * convert references to $0 to references to R0.
3217dd7cddfSDavid du Colombier */
regzer(Adr * a)3227dd7cddfSDavid du Colombier regzer(Adr *a)
3237dd7cddfSDavid du Colombier {
324375daca8SDavid du Colombier if(R0ISZERO) {
3257dd7cddfSDavid du Colombier if(a->type == D_CONST)
3267dd7cddfSDavid du Colombier if(a->sym == S)
3277dd7cddfSDavid du Colombier if(a->offset == 0)
3287dd7cddfSDavid du Colombier return 1;
3297dd7cddfSDavid du Colombier if(a->type == D_REG)
330375daca8SDavid du Colombier if(a->reg == REGZERO)
3317dd7cddfSDavid du Colombier return 1;
332375daca8SDavid du Colombier }
3337dd7cddfSDavid du Colombier return 0;
3347dd7cddfSDavid du Colombier }
3357dd7cddfSDavid du Colombier
regtyp(Adr * a)3367dd7cddfSDavid du Colombier regtyp(Adr *a)
3377dd7cddfSDavid du Colombier {
3387dd7cddfSDavid du Colombier
3397dd7cddfSDavid du Colombier if(a->type == D_REG) {
340375daca8SDavid du Colombier if(!R0ISZERO || a->reg != REGZERO)
3417dd7cddfSDavid du Colombier return 1;
3427dd7cddfSDavid du Colombier return 0;
3437dd7cddfSDavid du Colombier }
3447dd7cddfSDavid du Colombier if(a->type == D_FREG)
3457dd7cddfSDavid du Colombier return 1;
3467dd7cddfSDavid du Colombier return 0;
3477dd7cddfSDavid du Colombier }
3487dd7cddfSDavid du Colombier
3497dd7cddfSDavid du Colombier /*
3507dd7cddfSDavid du Colombier * the idea is to substitute
3517dd7cddfSDavid du Colombier * one register for another
3527dd7cddfSDavid du Colombier * from one MOV to another
3537dd7cddfSDavid du Colombier * MOV a, R0
3547dd7cddfSDavid du Colombier * ADD b, R0 / no use of R1
3557dd7cddfSDavid du Colombier * MOV R0, R1
3567dd7cddfSDavid du Colombier * would be converted to
3577dd7cddfSDavid du Colombier * MOV a, R1
3587dd7cddfSDavid du Colombier * ADD b, R1
3597dd7cddfSDavid du Colombier * MOV R1, R0
3607dd7cddfSDavid du Colombier * hopefully, then the former or latter MOV
3617dd7cddfSDavid du Colombier * will be eliminated by copy propagation.
3627dd7cddfSDavid du Colombier */
3637dd7cddfSDavid du Colombier int
subprop(Reg * r0)3647dd7cddfSDavid du Colombier subprop(Reg *r0)
3657dd7cddfSDavid du Colombier {
3667dd7cddfSDavid du Colombier Prog *p;
3677dd7cddfSDavid du Colombier Adr *v1, *v2;
3687dd7cddfSDavid du Colombier Reg *r;
3697dd7cddfSDavid du Colombier int t;
3707dd7cddfSDavid du Colombier
3717dd7cddfSDavid du Colombier p = r0->prog;
3727dd7cddfSDavid du Colombier v1 = &p->from;
3737dd7cddfSDavid du Colombier if(!regtyp(v1))
3747dd7cddfSDavid du Colombier return 0;
3757dd7cddfSDavid du Colombier v2 = &p->to;
3767dd7cddfSDavid du Colombier if(!regtyp(v2))
3777dd7cddfSDavid du Colombier return 0;
3787dd7cddfSDavid du Colombier for(r=uniqp(r0); r!=R; r=uniqp(r)) {
3797dd7cddfSDavid du Colombier if(uniqs(r) == R)
3807dd7cddfSDavid du Colombier break;
3817dd7cddfSDavid du Colombier p = r->prog;
3827dd7cddfSDavid du Colombier switch(p->as) {
3837dd7cddfSDavid du Colombier case ABL:
3847dd7cddfSDavid du Colombier return 0;
3857dd7cddfSDavid du Colombier
3867dd7cddfSDavid du Colombier case AADD:
3876891d857SDavid du Colombier case AADDC:
3886891d857SDavid du Colombier case AADDCC:
3896891d857SDavid du Colombier case AADDE:
3906891d857SDavid du Colombier case AADDECC:
3917dd7cddfSDavid du Colombier case ASUB:
3926891d857SDavid du Colombier case ASUBCC:
3936891d857SDavid du Colombier case ASUBC:
3946891d857SDavid du Colombier case ASUBCCC:
3956891d857SDavid du Colombier case ASUBE:
3966891d857SDavid du Colombier case ASUBECC:
3977dd7cddfSDavid du Colombier case ASLW:
3986891d857SDavid du Colombier case ASLWCC:
3997dd7cddfSDavid du Colombier case ASRW:
4006891d857SDavid du Colombier case ASRWCC:
4017dd7cddfSDavid du Colombier case ASRAW:
4026891d857SDavid du Colombier case ASRAWCC:
4037dd7cddfSDavid du Colombier case AOR:
404375daca8SDavid du Colombier case AORCC:
405375daca8SDavid du Colombier case AORN:
406375daca8SDavid du Colombier case AORNCC:
4077dd7cddfSDavid du Colombier case AAND:
4087dd7cddfSDavid du Colombier case AANDCC:
409375daca8SDavid du Colombier case AANDN:
410375daca8SDavid du Colombier case AANDNCC:
411375daca8SDavid du Colombier case ANAND:
412375daca8SDavid du Colombier case ANANDCC:
4137dd7cddfSDavid du Colombier case ANOR:
4147dd7cddfSDavid du Colombier case ANORCC:
4157dd7cddfSDavid du Colombier case AXOR:
4167dd7cddfSDavid du Colombier case AXORCC:
4176891d857SDavid du Colombier case AMULHW:
4186891d857SDavid du Colombier case AMULHWU:
4197dd7cddfSDavid du Colombier case AMULLW:
4207dd7cddfSDavid du Colombier case ADIVW:
4217dd7cddfSDavid du Colombier case ADIVWU:
4227dd7cddfSDavid du Colombier case AREM:
4237dd7cddfSDavid du Colombier case AREMU:
4246891d857SDavid du Colombier case ARLWNM:
4256891d857SDavid du Colombier case ARLWNMCC:
4267dd7cddfSDavid du Colombier
4277dd7cddfSDavid du Colombier case AFADD:
4287dd7cddfSDavid du Colombier case AFADDS:
4297dd7cddfSDavid du Colombier case AFSUB:
4307dd7cddfSDavid du Colombier case AFSUBS:
4317dd7cddfSDavid du Colombier case AFMUL:
4327dd7cddfSDavid du Colombier case AFMULS:
4337dd7cddfSDavid du Colombier case AFDIV:
4347dd7cddfSDavid du Colombier case AFDIVS:
4357dd7cddfSDavid du Colombier if(p->to.type == v1->type)
4367dd7cddfSDavid du Colombier if(p->to.reg == v1->reg) {
4377dd7cddfSDavid du Colombier if(p->reg == NREG)
4387dd7cddfSDavid du Colombier p->reg = p->to.reg;
4397dd7cddfSDavid du Colombier goto gotit;
4407dd7cddfSDavid du Colombier }
4417dd7cddfSDavid du Colombier break;
4427dd7cddfSDavid du Colombier
4436891d857SDavid du Colombier case AADDME:
4446891d857SDavid du Colombier case AADDMECC:
4456891d857SDavid du Colombier case AADDZE:
4466891d857SDavid du Colombier case AADDZECC:
4476891d857SDavid du Colombier case ASUBME:
4486891d857SDavid du Colombier case ASUBMECC:
4496891d857SDavid du Colombier case ASUBZE:
4506891d857SDavid du Colombier case ASUBZECC:
4516891d857SDavid du Colombier case ANEG:
4526891d857SDavid du Colombier case ANEGCC:
4536891d857SDavid du Colombier case AFNEG:
4546891d857SDavid du Colombier case AFNEGCC:
4557dd7cddfSDavid du Colombier case AFMOVS:
4567dd7cddfSDavid du Colombier case AFMOVD:
4577dd7cddfSDavid du Colombier case AMOVW:
4587dd7cddfSDavid du Colombier if(p->to.type == v1->type)
4597dd7cddfSDavid du Colombier if(p->to.reg == v1->reg)
4607dd7cddfSDavid du Colombier goto gotit;
4617dd7cddfSDavid du Colombier break;
4627dd7cddfSDavid du Colombier }
4637dd7cddfSDavid du Colombier if(copyau(&p->from, v2) ||
4647dd7cddfSDavid du Colombier copyau1(p, v2) ||
4657dd7cddfSDavid du Colombier copyau(&p->to, v2))
4667dd7cddfSDavid du Colombier break;
4677dd7cddfSDavid du Colombier if(copysub(&p->from, v1, v2, 0) ||
4687dd7cddfSDavid du Colombier copysub1(p, v1, v2, 0) ||
4697dd7cddfSDavid du Colombier copysub(&p->to, v1, v2, 0))
4707dd7cddfSDavid du Colombier break;
4717dd7cddfSDavid du Colombier }
4727dd7cddfSDavid du Colombier return 0;
4737dd7cddfSDavid du Colombier
4747dd7cddfSDavid du Colombier gotit:
4757dd7cddfSDavid du Colombier copysub(&p->to, v1, v2, 1);
4767dd7cddfSDavid du Colombier if(debug['P']) {
4777dd7cddfSDavid du Colombier print("gotit: %D->%D\n%P", v1, v2, r->prog);
4787dd7cddfSDavid du Colombier if(p->from.type == v2->type)
4797dd7cddfSDavid du Colombier print(" excise");
4807dd7cddfSDavid du Colombier print("\n");
4817dd7cddfSDavid du Colombier }
4827dd7cddfSDavid du Colombier for(r=uniqs(r); r!=r0; r=uniqs(r)) {
4837dd7cddfSDavid du Colombier p = r->prog;
4847dd7cddfSDavid du Colombier copysub(&p->from, v1, v2, 1);
4857dd7cddfSDavid du Colombier copysub1(p, v1, v2, 1);
4867dd7cddfSDavid du Colombier copysub(&p->to, v1, v2, 1);
4877dd7cddfSDavid du Colombier if(debug['P'])
4887dd7cddfSDavid du Colombier print("%P\n", r->prog);
4897dd7cddfSDavid du Colombier }
4907dd7cddfSDavid du Colombier t = v1->reg;
4917dd7cddfSDavid du Colombier v1->reg = v2->reg;
4927dd7cddfSDavid du Colombier v2->reg = t;
4937dd7cddfSDavid du Colombier if(debug['P'])
4947dd7cddfSDavid du Colombier print("%P last\n", r->prog);
4957dd7cddfSDavid du Colombier return 1;
4967dd7cddfSDavid du Colombier }
4977dd7cddfSDavid du Colombier
4987dd7cddfSDavid du Colombier /*
4997dd7cddfSDavid du Colombier * The idea is to remove redundant copies.
5007dd7cddfSDavid du Colombier * v1->v2 F=0
5017dd7cddfSDavid du Colombier * (use v2 s/v2/v1/)*
5027dd7cddfSDavid du Colombier * set v1 F=1
5037dd7cddfSDavid du Colombier * use v2 return fail
5047dd7cddfSDavid du Colombier * -----------------
5057dd7cddfSDavid du Colombier * v1->v2 F=0
5067dd7cddfSDavid du Colombier * (use v2 s/v2/v1/)*
5077dd7cddfSDavid du Colombier * set v1 F=1
5087dd7cddfSDavid du Colombier * set v2 return success
5097dd7cddfSDavid du Colombier */
5107dd7cddfSDavid du Colombier int
copyprop(Reg * r0)5117dd7cddfSDavid du Colombier copyprop(Reg *r0)
5127dd7cddfSDavid du Colombier {
5137dd7cddfSDavid du Colombier Prog *p;
5147dd7cddfSDavid du Colombier Adr *v1, *v2;
5157dd7cddfSDavid du Colombier Reg *r;
5167dd7cddfSDavid du Colombier
5177dd7cddfSDavid du Colombier p = r0->prog;
5187dd7cddfSDavid du Colombier v1 = &p->from;
5197dd7cddfSDavid du Colombier v2 = &p->to;
5207dd7cddfSDavid du Colombier if(copyas(v1, v2))
5217dd7cddfSDavid du Colombier return 1;
5227dd7cddfSDavid du Colombier for(r=firstr; r!=R; r=r->link)
5237dd7cddfSDavid du Colombier r->active = 0;
5247dd7cddfSDavid du Colombier return copy1(v1, v2, r0->s1, 0);
5257dd7cddfSDavid du Colombier }
5267dd7cddfSDavid du Colombier
copy1(Adr * v1,Adr * v2,Reg * r,int f)5277dd7cddfSDavid du Colombier copy1(Adr *v1, Adr *v2, Reg *r, int f)
5287dd7cddfSDavid du Colombier {
5297dd7cddfSDavid du Colombier int t;
5307dd7cddfSDavid du Colombier Prog *p;
5317dd7cddfSDavid du Colombier
5327dd7cddfSDavid du Colombier if(r->active) {
5337dd7cddfSDavid du Colombier if(debug['P'])
5347dd7cddfSDavid du Colombier print("act set; return 1\n");
5357dd7cddfSDavid du Colombier return 1;
5367dd7cddfSDavid du Colombier }
5377dd7cddfSDavid du Colombier r->active = 1;
5387dd7cddfSDavid du Colombier if(debug['P'])
5397dd7cddfSDavid du Colombier print("copy %D->%D f=%d\n", v1, v2, f);
5407dd7cddfSDavid du Colombier for(; r != R; r = r->s1) {
5417dd7cddfSDavid du Colombier p = r->prog;
5427dd7cddfSDavid du Colombier if(debug['P'])
5437dd7cddfSDavid du Colombier print("%P", p);
5447dd7cddfSDavid du Colombier if(!f && uniqp(r) == R) {
5457dd7cddfSDavid du Colombier f = 1;
5467dd7cddfSDavid du Colombier if(debug['P'])
5477dd7cddfSDavid du Colombier print("; merge; f=%d", f);
5487dd7cddfSDavid du Colombier }
5497dd7cddfSDavid du Colombier t = copyu(p, v2, A);
5507dd7cddfSDavid du Colombier switch(t) {
5517dd7cddfSDavid du Colombier case 2: /* rar, cant split */
5527dd7cddfSDavid du Colombier if(debug['P'])
5537dd7cddfSDavid du Colombier print("; %Drar; return 0\n", v2);
5547dd7cddfSDavid du Colombier return 0;
5557dd7cddfSDavid du Colombier
5567dd7cddfSDavid du Colombier case 3: /* set */
5577dd7cddfSDavid du Colombier if(debug['P'])
5587dd7cddfSDavid du Colombier print("; %Dset; return 1\n", v2);
5597dd7cddfSDavid du Colombier return 1;
5607dd7cddfSDavid du Colombier
5617dd7cddfSDavid du Colombier case 1: /* used, substitute */
5627dd7cddfSDavid du Colombier case 4: /* use and set */
5637dd7cddfSDavid du Colombier if(f) {
5647dd7cddfSDavid du Colombier if(!debug['P'])
5657dd7cddfSDavid du Colombier return 0;
5667dd7cddfSDavid du Colombier if(t == 4)
5677dd7cddfSDavid du Colombier print("; %Dused+set and f=%d; return 0\n", v2, f);
5687dd7cddfSDavid du Colombier else
5697dd7cddfSDavid du Colombier print("; %Dused and f=%d; return 0\n", v2, f);
5707dd7cddfSDavid du Colombier return 0;
5717dd7cddfSDavid du Colombier }
5727dd7cddfSDavid du Colombier if(copyu(p, v2, v1)) {
5737dd7cddfSDavid du Colombier if(debug['P'])
5747dd7cddfSDavid du Colombier print("; sub fail; return 0\n");
5757dd7cddfSDavid du Colombier return 0;
5767dd7cddfSDavid du Colombier }
5777dd7cddfSDavid du Colombier if(debug['P'])
5787dd7cddfSDavid du Colombier print("; sub%D/%D", v2, v1);
5797dd7cddfSDavid du Colombier if(t == 4) {
5807dd7cddfSDavid du Colombier if(debug['P'])
5817dd7cddfSDavid du Colombier print("; %Dused+set; return 1\n", v2);
5827dd7cddfSDavid du Colombier return 1;
5837dd7cddfSDavid du Colombier }
5847dd7cddfSDavid du Colombier break;
5857dd7cddfSDavid du Colombier }
5867dd7cddfSDavid du Colombier if(!f) {
5877dd7cddfSDavid du Colombier t = copyu(p, v1, A);
5887dd7cddfSDavid du Colombier if(!f && (t == 2 || t == 3 || t == 4)) {
5897dd7cddfSDavid du Colombier f = 1;
5907dd7cddfSDavid du Colombier if(debug['P'])
5917dd7cddfSDavid du Colombier print("; %Dset and !f; f=%d", v1, f);
5927dd7cddfSDavid du Colombier }
5937dd7cddfSDavid du Colombier }
5947dd7cddfSDavid du Colombier if(debug['P'])
5957dd7cddfSDavid du Colombier print("\n");
5967dd7cddfSDavid du Colombier if(r->s2)
5977dd7cddfSDavid du Colombier if(!copy1(v1, v2, r->s2, f))
5987dd7cddfSDavid du Colombier return 0;
5997dd7cddfSDavid du Colombier }
6007dd7cddfSDavid du Colombier return 1;
6017dd7cddfSDavid du Colombier }
6027dd7cddfSDavid du Colombier
6037dd7cddfSDavid du Colombier /*
6047dd7cddfSDavid du Colombier * return
6057dd7cddfSDavid du Colombier * 1 if v only used (and substitute),
6067dd7cddfSDavid du Colombier * 2 if read-alter-rewrite
6077dd7cddfSDavid du Colombier * 3 if set
6087dd7cddfSDavid du Colombier * 4 if set and used
6097dd7cddfSDavid du Colombier * 0 otherwise (not touched)
6107dd7cddfSDavid du Colombier */
6117dd7cddfSDavid du Colombier int
copyu(Prog * p,Adr * v,Adr * s)6127dd7cddfSDavid du Colombier copyu(Prog *p, Adr *v, Adr *s)
6137dd7cddfSDavid du Colombier {
6147dd7cddfSDavid du Colombier
6157dd7cddfSDavid du Colombier switch(p->as) {
6167dd7cddfSDavid du Colombier
6177dd7cddfSDavid du Colombier default:
6187dd7cddfSDavid du Colombier if(debug['P'])
6197dd7cddfSDavid du Colombier print(" (???)");
6207dd7cddfSDavid du Colombier return 2;
6217dd7cddfSDavid du Colombier
6227dd7cddfSDavid du Colombier case ANOP: /* read, write */
6237dd7cddfSDavid du Colombier case AMOVW:
6247dd7cddfSDavid du Colombier case AMOVH:
6257dd7cddfSDavid du Colombier case AMOVHZ:
6267dd7cddfSDavid du Colombier case AMOVB:
6277dd7cddfSDavid du Colombier case AMOVBZ:
6287dd7cddfSDavid du Colombier
6297dd7cddfSDavid du Colombier case ANEG:
6307dd7cddfSDavid du Colombier case ANEGCC:
6316891d857SDavid du Colombier case AADDME:
6326891d857SDavid du Colombier case AADDMECC:
6336891d857SDavid du Colombier case AADDZE:
6346891d857SDavid du Colombier case AADDZECC:
6356891d857SDavid du Colombier case ASUBME:
6366891d857SDavid du Colombier case ASUBMECC:
6376891d857SDavid du Colombier case ASUBZE:
6386891d857SDavid du Colombier case ASUBZECC:
6397dd7cddfSDavid du Colombier
6407dd7cddfSDavid du Colombier case AFCTIW:
6417dd7cddfSDavid du Colombier case AFCTIWZ:
6427dd7cddfSDavid du Colombier case AFMOVS:
6437dd7cddfSDavid du Colombier case AFMOVD:
6447dd7cddfSDavid du Colombier case AFRSP:
6457dd7cddfSDavid du Colombier case AFNEG:
6467dd7cddfSDavid du Colombier case AFNEGCC:
6477dd7cddfSDavid du Colombier if(s != A) {
6487dd7cddfSDavid du Colombier if(copysub(&p->from, v, s, 1))
6497dd7cddfSDavid du Colombier return 1;
6507dd7cddfSDavid du Colombier if(!copyas(&p->to, v))
6517dd7cddfSDavid du Colombier if(copysub(&p->to, v, s, 1))
6527dd7cddfSDavid du Colombier return 1;
6537dd7cddfSDavid du Colombier return 0;
6547dd7cddfSDavid du Colombier }
6557dd7cddfSDavid du Colombier if(copyas(&p->to, v)) {
6567dd7cddfSDavid du Colombier if(copyau(&p->from, v))
6577dd7cddfSDavid du Colombier return 4;
6587dd7cddfSDavid du Colombier return 3;
6597dd7cddfSDavid du Colombier }
6607dd7cddfSDavid du Colombier if(copyau(&p->from, v))
6617dd7cddfSDavid du Colombier return 1;
6627dd7cddfSDavid du Colombier if(copyau(&p->to, v))
6637dd7cddfSDavid du Colombier return 1;
6647dd7cddfSDavid du Colombier return 0;
6657dd7cddfSDavid du Colombier
666*cb8c047aSDavid du Colombier case ARLWMI: /* read read rar */
667*cb8c047aSDavid du Colombier case ARLWMICC:
668*cb8c047aSDavid du Colombier if(copyas(&p->to, v))
669*cb8c047aSDavid du Colombier return 2;
670*cb8c047aSDavid du Colombier /* fall through */
671*cb8c047aSDavid du Colombier
6727dd7cddfSDavid du Colombier case AADD: /* read read write */
6736891d857SDavid du Colombier case AADDC:
6746891d857SDavid du Colombier case AADDE:
6757dd7cddfSDavid du Colombier case ASUB:
6767dd7cddfSDavid du Colombier case ASLW:
6777dd7cddfSDavid du Colombier case ASRW:
6787dd7cddfSDavid du Colombier case ASRAW:
6797dd7cddfSDavid du Colombier case AOR:
680375daca8SDavid du Colombier case AORCC:
681375daca8SDavid du Colombier case AORN:
682375daca8SDavid du Colombier case AORNCC:
6837dd7cddfSDavid du Colombier case AAND:
6847dd7cddfSDavid du Colombier case AANDCC:
685375daca8SDavid du Colombier case AANDN:
686375daca8SDavid du Colombier case AANDNCC:
687375daca8SDavid du Colombier case ANAND:
688375daca8SDavid du Colombier case ANANDCC:
6897dd7cddfSDavid du Colombier case ANOR:
6907dd7cddfSDavid du Colombier case ANORCC:
6917dd7cddfSDavid du Colombier case AXOR:
6926891d857SDavid du Colombier case AMULHW:
6936891d857SDavid du Colombier case AMULHWU:
6947dd7cddfSDavid du Colombier case AMULLW:
6957dd7cddfSDavid du Colombier case ADIVW:
6967dd7cddfSDavid du Colombier case ADIVWU:
6977dd7cddfSDavid du Colombier case AREM:
6987dd7cddfSDavid du Colombier case AREMU:
6996891d857SDavid du Colombier case ARLWNM:
7006891d857SDavid du Colombier case ARLWNMCC:
7017dd7cddfSDavid du Colombier
7027dd7cddfSDavid du Colombier case AFADDS:
7037dd7cddfSDavid du Colombier case AFADD:
7047dd7cddfSDavid du Colombier case AFSUBS:
7057dd7cddfSDavid du Colombier case AFSUB:
7067dd7cddfSDavid du Colombier case AFMULS:
7077dd7cddfSDavid du Colombier case AFMUL:
7087dd7cddfSDavid du Colombier case AFDIVS:
7097dd7cddfSDavid du Colombier case AFDIV:
7107dd7cddfSDavid du Colombier if(s != A) {
7117dd7cddfSDavid du Colombier if(copysub(&p->from, v, s, 1))
7127dd7cddfSDavid du Colombier return 1;
7137dd7cddfSDavid du Colombier if(copysub1(p, v, s, 1))
7147dd7cddfSDavid du Colombier return 1;
7157dd7cddfSDavid du Colombier if(!copyas(&p->to, v))
7167dd7cddfSDavid du Colombier if(copysub(&p->to, v, s, 1))
7177dd7cddfSDavid du Colombier return 1;
7187dd7cddfSDavid du Colombier return 0;
7197dd7cddfSDavid du Colombier }
7207dd7cddfSDavid du Colombier if(copyas(&p->to, v)) {
7217dd7cddfSDavid du Colombier if(p->reg == NREG)
7227dd7cddfSDavid du Colombier p->reg = p->to.reg;
7237dd7cddfSDavid du Colombier if(copyau(&p->from, v))
7247dd7cddfSDavid du Colombier return 4;
7257dd7cddfSDavid du Colombier if(copyau1(p, v))
7267dd7cddfSDavid du Colombier return 4;
7277dd7cddfSDavid du Colombier return 3;
7287dd7cddfSDavid du Colombier }
7297dd7cddfSDavid du Colombier if(copyau(&p->from, v))
7307dd7cddfSDavid du Colombier return 1;
7317dd7cddfSDavid du Colombier if(copyau1(p, v))
7327dd7cddfSDavid du Colombier return 1;
7337dd7cddfSDavid du Colombier if(copyau(&p->to, v))
7347dd7cddfSDavid du Colombier return 1;
7357dd7cddfSDavid du Colombier return 0;
7367dd7cddfSDavid du Colombier
7377dd7cddfSDavid du Colombier case ABEQ:
7387dd7cddfSDavid du Colombier case ABGT:
7397dd7cddfSDavid du Colombier case ABGE:
7407dd7cddfSDavid du Colombier case ABLT:
7417dd7cddfSDavid du Colombier case ABLE:
7427dd7cddfSDavid du Colombier case ABNE:
7437dd7cddfSDavid du Colombier case ABVC:
7447dd7cddfSDavid du Colombier case ABVS:
7457dd7cddfSDavid du Colombier break;
7467dd7cddfSDavid du Colombier
7477dd7cddfSDavid du Colombier case ACMP: /* read read */
7487dd7cddfSDavid du Colombier case ACMPU:
7497dd7cddfSDavid du Colombier case AFCMPO:
7507dd7cddfSDavid du Colombier case AFCMPU:
7517dd7cddfSDavid du Colombier if(s != A) {
7527dd7cddfSDavid du Colombier if(copysub(&p->from, v, s, 1))
7537dd7cddfSDavid du Colombier return 1;
7547dd7cddfSDavid du Colombier return copysub(&p->to, v, s, 1);
7557dd7cddfSDavid du Colombier }
7567dd7cddfSDavid du Colombier if(copyau(&p->from, v))
7577dd7cddfSDavid du Colombier return 1;
7587dd7cddfSDavid du Colombier if(copyau(&p->to, v))
7597dd7cddfSDavid du Colombier return 1;
7607dd7cddfSDavid du Colombier break;
7617dd7cddfSDavid du Colombier
7627dd7cddfSDavid du Colombier case ABR: /* funny */
7637dd7cddfSDavid du Colombier if(s != A) {
7647dd7cddfSDavid du Colombier if(copysub(&p->to, v, s, 1))
7657dd7cddfSDavid du Colombier return 1;
7667dd7cddfSDavid du Colombier return 0;
7677dd7cddfSDavid du Colombier }
7687dd7cddfSDavid du Colombier if(copyau(&p->to, v))
7697dd7cddfSDavid du Colombier return 1;
7707dd7cddfSDavid du Colombier return 0;
7717dd7cddfSDavid du Colombier
7727dd7cddfSDavid du Colombier case ARETURN: /* funny */
7737dd7cddfSDavid du Colombier if(v->type == D_REG)
7747dd7cddfSDavid du Colombier if(v->reg == REGRET)
7757dd7cddfSDavid du Colombier return 2;
7767dd7cddfSDavid du Colombier if(v->type == D_FREG)
7777dd7cddfSDavid du Colombier if(v->reg == FREGRET)
7787dd7cddfSDavid du Colombier return 2;
7797dd7cddfSDavid du Colombier
7807dd7cddfSDavid du Colombier case ABL: /* funny */
7817dd7cddfSDavid du Colombier if(v->type == D_REG) {
7827dd7cddfSDavid du Colombier if(v->reg <= REGEXT && v->reg > exregoffset)
7837dd7cddfSDavid du Colombier return 2;
7847dd7cddfSDavid du Colombier if(v->reg == REGARG)
7857dd7cddfSDavid du Colombier return 2;
7867dd7cddfSDavid du Colombier }
7877dd7cddfSDavid du Colombier if(v->type == D_FREG) {
7887dd7cddfSDavid du Colombier if(v->reg <= FREGEXT && v->reg > exfregoffset)
7897dd7cddfSDavid du Colombier return 2;
7907dd7cddfSDavid du Colombier }
7917dd7cddfSDavid du Colombier
7927dd7cddfSDavid du Colombier if(s != A) {
7937dd7cddfSDavid du Colombier if(copysub(&p->to, v, s, 1))
7947dd7cddfSDavid du Colombier return 1;
7957dd7cddfSDavid du Colombier return 0;
7967dd7cddfSDavid du Colombier }
7977dd7cddfSDavid du Colombier if(copyau(&p->to, v))
7987dd7cddfSDavid du Colombier return 4;
7997dd7cddfSDavid du Colombier return 3;
8007dd7cddfSDavid du Colombier
8017dd7cddfSDavid du Colombier case ATEXT: /* funny */
8027dd7cddfSDavid du Colombier if(v->type == D_REG)
8037dd7cddfSDavid du Colombier if(v->reg == REGARG)
8047dd7cddfSDavid du Colombier return 3;
8057dd7cddfSDavid du Colombier return 0;
8067dd7cddfSDavid du Colombier }
8077dd7cddfSDavid du Colombier return 0;
8087dd7cddfSDavid du Colombier }
8097dd7cddfSDavid du Colombier
8107dd7cddfSDavid du Colombier int
a2type(Prog * p)8117dd7cddfSDavid du Colombier a2type(Prog *p)
8127dd7cddfSDavid du Colombier {
8137dd7cddfSDavid du Colombier
8147dd7cddfSDavid du Colombier switch(p->as) {
8157dd7cddfSDavid du Colombier case AADD:
8166891d857SDavid du Colombier case AADDC:
8177dd7cddfSDavid du Colombier case AADDCC:
8186891d857SDavid du Colombier case AADDCCC:
8196891d857SDavid du Colombier case AADDE:
8206891d857SDavid du Colombier case AADDECC:
8216891d857SDavid du Colombier case AADDME:
8226891d857SDavid du Colombier case AADDMECC:
8236891d857SDavid du Colombier case AADDZE:
8246891d857SDavid du Colombier case AADDZECC:
8257dd7cddfSDavid du Colombier case ASUB:
8266891d857SDavid du Colombier case ASUBC:
8277dd7cddfSDavid du Colombier case ASUBCC:
8286891d857SDavid du Colombier case ASUBCCC:
8296891d857SDavid du Colombier case ASUBE:
8306891d857SDavid du Colombier case ASUBECC:
8316891d857SDavid du Colombier case ASUBME:
8326891d857SDavid du Colombier case ASUBMECC:
8336891d857SDavid du Colombier case ASUBZE:
8346891d857SDavid du Colombier case ASUBZECC:
8357dd7cddfSDavid du Colombier case ASLW:
8367dd7cddfSDavid du Colombier case ASLWCC:
8377dd7cddfSDavid du Colombier case ASRW:
8387dd7cddfSDavid du Colombier case ASRWCC:
8397dd7cddfSDavid du Colombier case ASRAW:
8407dd7cddfSDavid du Colombier case ASRAWCC:
8417dd7cddfSDavid du Colombier case AOR:
8427dd7cddfSDavid du Colombier case AORCC:
843375daca8SDavid du Colombier case AORN:
844375daca8SDavid du Colombier case AORNCC:
8457dd7cddfSDavid du Colombier case AAND:
8467dd7cddfSDavid du Colombier case AANDCC:
847375daca8SDavid du Colombier case AANDN:
848375daca8SDavid du Colombier case AANDNCC:
8497dd7cddfSDavid du Colombier case AXOR:
8507dd7cddfSDavid du Colombier case AXORCC:
8517dd7cddfSDavid du Colombier case ANEG:
8527dd7cddfSDavid du Colombier case ANEGCC:
8536891d857SDavid du Colombier case AMULHW:
8546891d857SDavid du Colombier case AMULHWU:
8557dd7cddfSDavid du Colombier case AMULLW:
8567dd7cddfSDavid du Colombier case AMULLWCC:
8577dd7cddfSDavid du Colombier case ADIVW:
8587dd7cddfSDavid du Colombier case ADIVWCC:
8597dd7cddfSDavid du Colombier case ADIVWU:
8607dd7cddfSDavid du Colombier case ADIVWUCC:
8617dd7cddfSDavid du Colombier case AREM:
8627dd7cddfSDavid du Colombier case AREMCC:
8637dd7cddfSDavid du Colombier case AREMU:
8647dd7cddfSDavid du Colombier case AREMUCC:
865375daca8SDavid du Colombier case ANAND:
866375daca8SDavid du Colombier case ANANDCC:
8677dd7cddfSDavid du Colombier case ANOR:
8687dd7cddfSDavid du Colombier case ANORCC:
8696891d857SDavid du Colombier case ARLWMI:
8706891d857SDavid du Colombier case ARLWMICC:
8716891d857SDavid du Colombier case ARLWNM:
8726891d857SDavid du Colombier case ARLWNMCC:
8737dd7cddfSDavid du Colombier return D_REG;
8747dd7cddfSDavid du Colombier
8757dd7cddfSDavid du Colombier case AFADDS:
8767dd7cddfSDavid du Colombier case AFADDSCC:
8777dd7cddfSDavid du Colombier case AFADD:
8787dd7cddfSDavid du Colombier case AFADDCC:
8797dd7cddfSDavid du Colombier case AFSUBS:
8807dd7cddfSDavid du Colombier case AFSUBSCC:
8817dd7cddfSDavid du Colombier case AFSUB:
8827dd7cddfSDavid du Colombier case AFSUBCC:
8837dd7cddfSDavid du Colombier case AFMULS:
8847dd7cddfSDavid du Colombier case AFMULSCC:
8857dd7cddfSDavid du Colombier case AFMUL:
8867dd7cddfSDavid du Colombier case AFMULCC:
8877dd7cddfSDavid du Colombier case AFDIVS:
8887dd7cddfSDavid du Colombier case AFDIVSCC:
8897dd7cddfSDavid du Colombier case AFDIV:
8907dd7cddfSDavid du Colombier case AFDIVCC:
8917dd7cddfSDavid du Colombier case AFNEG:
8927dd7cddfSDavid du Colombier case AFNEGCC:
8937dd7cddfSDavid du Colombier return D_FREG;
8947dd7cddfSDavid du Colombier }
8957dd7cddfSDavid du Colombier return D_NONE;
8967dd7cddfSDavid du Colombier }
8977dd7cddfSDavid du Colombier
8987dd7cddfSDavid du Colombier /*
8997dd7cddfSDavid du Colombier * direct reference,
9007dd7cddfSDavid du Colombier * could be set/use depending on
9017dd7cddfSDavid du Colombier * semantics
9027dd7cddfSDavid du Colombier */
9037dd7cddfSDavid du Colombier int
copyas(Adr * a,Adr * v)9047dd7cddfSDavid du Colombier copyas(Adr *a, Adr *v)
9057dd7cddfSDavid du Colombier {
9067dd7cddfSDavid du Colombier
9077dd7cddfSDavid du Colombier if(regtyp(v))
9087dd7cddfSDavid du Colombier if(a->type == v->type)
9097dd7cddfSDavid du Colombier if(a->reg == v->reg)
9107dd7cddfSDavid du Colombier return 1;
9117dd7cddfSDavid du Colombier return 0;
9127dd7cddfSDavid du Colombier }
9137dd7cddfSDavid du Colombier
9147dd7cddfSDavid du Colombier /*
9157dd7cddfSDavid du Colombier * either direct or indirect
9167dd7cddfSDavid du Colombier */
9177dd7cddfSDavid du Colombier int
copyau(Adr * a,Adr * v)9187dd7cddfSDavid du Colombier copyau(Adr *a, Adr *v)
9197dd7cddfSDavid du Colombier {
9207dd7cddfSDavid du Colombier
9217dd7cddfSDavid du Colombier if(copyas(a, v))
9227dd7cddfSDavid du Colombier return 1;
9237dd7cddfSDavid du Colombier if(v->type == D_REG)
9247dd7cddfSDavid du Colombier if(a->type == D_OREG)
9257dd7cddfSDavid du Colombier if(v->reg == a->reg)
9267dd7cddfSDavid du Colombier return 1;
9277dd7cddfSDavid du Colombier return 0;
9287dd7cddfSDavid du Colombier }
9297dd7cddfSDavid du Colombier
9307dd7cddfSDavid du Colombier int
copyau1(Prog * p,Adr * v)9317dd7cddfSDavid du Colombier copyau1(Prog *p, Adr *v)
9327dd7cddfSDavid du Colombier {
9337dd7cddfSDavid du Colombier
9347dd7cddfSDavid du Colombier if(regtyp(v))
9357dd7cddfSDavid du Colombier if(p->from.type == v->type || p->to.type == v->type)
9367dd7cddfSDavid du Colombier if(p->reg == v->reg) {
9377dd7cddfSDavid du Colombier if(a2type(p) != v->type)
9387dd7cddfSDavid du Colombier print("botch a2type %P\n", p);
9397dd7cddfSDavid du Colombier return 1;
9407dd7cddfSDavid du Colombier }
9417dd7cddfSDavid du Colombier return 0;
9427dd7cddfSDavid du Colombier }
9437dd7cddfSDavid du Colombier
9447dd7cddfSDavid du Colombier /*
9457dd7cddfSDavid du Colombier * substitute s for v in a
9467dd7cddfSDavid du Colombier * return failure to substitute
9477dd7cddfSDavid du Colombier */
9487dd7cddfSDavid du Colombier int
copysub(Adr * a,Adr * v,Adr * s,int f)9497dd7cddfSDavid du Colombier copysub(Adr *a, Adr *v, Adr *s, int f)
9507dd7cddfSDavid du Colombier {
9517dd7cddfSDavid du Colombier
9527dd7cddfSDavid du Colombier if(f)
9537dd7cddfSDavid du Colombier if(copyau(a, v))
9547dd7cddfSDavid du Colombier a->reg = s->reg;
9557dd7cddfSDavid du Colombier return 0;
9567dd7cddfSDavid du Colombier }
9577dd7cddfSDavid du Colombier
9587dd7cddfSDavid du Colombier int
copysub1(Prog * p1,Adr * v,Adr * s,int f)9597dd7cddfSDavid du Colombier copysub1(Prog *p1, Adr *v, Adr *s, int f)
9607dd7cddfSDavid du Colombier {
9617dd7cddfSDavid du Colombier
9627dd7cddfSDavid du Colombier if(f)
9637dd7cddfSDavid du Colombier if(copyau1(p1, v))
9647dd7cddfSDavid du Colombier p1->reg = s->reg;
9657dd7cddfSDavid du Colombier return 0;
9667dd7cddfSDavid du Colombier }
967