1*fbadb1c4SDavid du Colombier #define EXTERN
2*fbadb1c4SDavid du Colombier #include "a.h"
3*fbadb1c4SDavid du Colombier #include "y.tab.h"
4*fbadb1c4SDavid du Colombier #include <ctype.h>
5*fbadb1c4SDavid du Colombier
6*fbadb1c4SDavid du Colombier void
main(int argc,char * argv[])7*fbadb1c4SDavid du Colombier main(int argc, char *argv[])
8*fbadb1c4SDavid du Colombier {
9*fbadb1c4SDavid du Colombier char *p;
10*fbadb1c4SDavid du Colombier int nout, nproc, status, i, c;
11*fbadb1c4SDavid du Colombier
12*fbadb1c4SDavid du Colombier thechar = '9';
13*fbadb1c4SDavid du Colombier thestring = "power64";
14*fbadb1c4SDavid du Colombier memset(debug, 0, sizeof(debug));
15*fbadb1c4SDavid du Colombier cinit();
16*fbadb1c4SDavid du Colombier outfile = 0;
17*fbadb1c4SDavid du Colombier include[ninclude++] = ".";
18*fbadb1c4SDavid du Colombier ARGBEGIN {
19*fbadb1c4SDavid du Colombier default:
20*fbadb1c4SDavid du Colombier c = ARGC();
21*fbadb1c4SDavid du Colombier if(c >= 0 || c < sizeof(debug))
22*fbadb1c4SDavid du Colombier debug[c] = 1;
23*fbadb1c4SDavid du Colombier break;
24*fbadb1c4SDavid du Colombier
25*fbadb1c4SDavid du Colombier case 'o':
26*fbadb1c4SDavid du Colombier outfile = ARGF();
27*fbadb1c4SDavid du Colombier break;
28*fbadb1c4SDavid du Colombier
29*fbadb1c4SDavid du Colombier case 'D':
30*fbadb1c4SDavid du Colombier p = ARGF();
31*fbadb1c4SDavid du Colombier if(p)
32*fbadb1c4SDavid du Colombier Dlist[nDlist++] = p;
33*fbadb1c4SDavid du Colombier break;
34*fbadb1c4SDavid du Colombier
35*fbadb1c4SDavid du Colombier case 'I':
36*fbadb1c4SDavid du Colombier p = ARGF();
37*fbadb1c4SDavid du Colombier setinclude(p);
38*fbadb1c4SDavid du Colombier break;
39*fbadb1c4SDavid du Colombier } ARGEND
40*fbadb1c4SDavid du Colombier if(*argv == 0) {
41*fbadb1c4SDavid du Colombier print("usage: %ca [-options] file.s\n", thechar);
42*fbadb1c4SDavid du Colombier errorexit();
43*fbadb1c4SDavid du Colombier }
44*fbadb1c4SDavid du Colombier if(argc > 1 && systemtype(Windows)){
45*fbadb1c4SDavid du Colombier print("can't assemble multiple files on windows\n");
46*fbadb1c4SDavid du Colombier errorexit();
47*fbadb1c4SDavid du Colombier }
48*fbadb1c4SDavid du Colombier if(argc > 1) {
49*fbadb1c4SDavid du Colombier nproc = 1;
50*fbadb1c4SDavid du Colombier if(p = getenv("NPROC"))
51*fbadb1c4SDavid du Colombier nproc = atol(p);
52*fbadb1c4SDavid du Colombier c = 0;
53*fbadb1c4SDavid du Colombier nout = 0;
54*fbadb1c4SDavid du Colombier for(;;) {
55*fbadb1c4SDavid du Colombier while(nout < nproc && argc > 0) {
56*fbadb1c4SDavid du Colombier i = myfork();
57*fbadb1c4SDavid du Colombier if(i < 0) {
58*fbadb1c4SDavid du Colombier i = mywait(&status);
59*fbadb1c4SDavid du Colombier if(i < 0)
60*fbadb1c4SDavid du Colombier errorexit();
61*fbadb1c4SDavid du Colombier if(status)
62*fbadb1c4SDavid du Colombier c++;
63*fbadb1c4SDavid du Colombier nout--;
64*fbadb1c4SDavid du Colombier continue;
65*fbadb1c4SDavid du Colombier }
66*fbadb1c4SDavid du Colombier if(i == 0) {
67*fbadb1c4SDavid du Colombier print("%s:\n", *argv);
68*fbadb1c4SDavid du Colombier if(assemble(*argv))
69*fbadb1c4SDavid du Colombier errorexit();
70*fbadb1c4SDavid du Colombier exits(0);
71*fbadb1c4SDavid du Colombier }
72*fbadb1c4SDavid du Colombier nout++;
73*fbadb1c4SDavid du Colombier argc--;
74*fbadb1c4SDavid du Colombier argv++;
75*fbadb1c4SDavid du Colombier }
76*fbadb1c4SDavid du Colombier i = mywait(&status);
77*fbadb1c4SDavid du Colombier if(i < 0) {
78*fbadb1c4SDavid du Colombier if(c)
79*fbadb1c4SDavid du Colombier errorexit();
80*fbadb1c4SDavid du Colombier exits(0);
81*fbadb1c4SDavid du Colombier }
82*fbadb1c4SDavid du Colombier if(status)
83*fbadb1c4SDavid du Colombier c++;
84*fbadb1c4SDavid du Colombier nout--;
85*fbadb1c4SDavid du Colombier }
86*fbadb1c4SDavid du Colombier }
87*fbadb1c4SDavid du Colombier if(assemble(argv[0]))
88*fbadb1c4SDavid du Colombier errorexit();
89*fbadb1c4SDavid du Colombier exits(0);
90*fbadb1c4SDavid du Colombier }
91*fbadb1c4SDavid du Colombier
92*fbadb1c4SDavid du Colombier int
assemble(char * file)93*fbadb1c4SDavid du Colombier assemble(char *file)
94*fbadb1c4SDavid du Colombier {
95*fbadb1c4SDavid du Colombier char ofile[100], incfile[20], *p;
96*fbadb1c4SDavid du Colombier int i, of;
97*fbadb1c4SDavid du Colombier
98*fbadb1c4SDavid du Colombier strcpy(ofile, file);
99*fbadb1c4SDavid du Colombier if(p = strrchr(ofile, pathchar())) {
100*fbadb1c4SDavid du Colombier include[0] = ofile;
101*fbadb1c4SDavid du Colombier *p++ = 0;
102*fbadb1c4SDavid du Colombier } else
103*fbadb1c4SDavid du Colombier p = ofile;
104*fbadb1c4SDavid du Colombier if(outfile == 0) {
105*fbadb1c4SDavid du Colombier outfile = p;
106*fbadb1c4SDavid du Colombier if(p = strrchr(outfile, '.'))
107*fbadb1c4SDavid du Colombier if(p[1] == 's' && p[2] == 0)
108*fbadb1c4SDavid du Colombier p[0] = 0;
109*fbadb1c4SDavid du Colombier p = strrchr(outfile, 0);
110*fbadb1c4SDavid du Colombier p[0] = '.';
111*fbadb1c4SDavid du Colombier p[1] = thechar;
112*fbadb1c4SDavid du Colombier p[2] = 0;
113*fbadb1c4SDavid du Colombier }
114*fbadb1c4SDavid du Colombier p = getenv("INCLUDE");
115*fbadb1c4SDavid du Colombier if(p) {
116*fbadb1c4SDavid du Colombier setinclude(p);
117*fbadb1c4SDavid du Colombier } else {
118*fbadb1c4SDavid du Colombier if(systemtype(Plan9)) {
119*fbadb1c4SDavid du Colombier sprint(incfile,"/%s/include", thestring);
120*fbadb1c4SDavid du Colombier setinclude(strdup(incfile));
121*fbadb1c4SDavid du Colombier }
122*fbadb1c4SDavid du Colombier }
123*fbadb1c4SDavid du Colombier
124*fbadb1c4SDavid du Colombier of = mycreat(outfile, 0664);
125*fbadb1c4SDavid du Colombier if(of < 0) {
126*fbadb1c4SDavid du Colombier yyerror("%ca: cannot create %s", thechar, outfile);
127*fbadb1c4SDavid du Colombier errorexit();
128*fbadb1c4SDavid du Colombier }
129*fbadb1c4SDavid du Colombier Binit(&obuf, of, OWRITE);
130*fbadb1c4SDavid du Colombier
131*fbadb1c4SDavid du Colombier pass = 1;
132*fbadb1c4SDavid du Colombier nosched = 0;
133*fbadb1c4SDavid du Colombier pinit(file);
134*fbadb1c4SDavid du Colombier for(i=0; i<nDlist; i++)
135*fbadb1c4SDavid du Colombier dodefine(Dlist[i]);
136*fbadb1c4SDavid du Colombier yyparse();
137*fbadb1c4SDavid du Colombier if(nerrors) {
138*fbadb1c4SDavid du Colombier cclean();
139*fbadb1c4SDavid du Colombier return nerrors;
140*fbadb1c4SDavid du Colombier }
141*fbadb1c4SDavid du Colombier
142*fbadb1c4SDavid du Colombier pass = 2;
143*fbadb1c4SDavid du Colombier nosched = 0;
144*fbadb1c4SDavid du Colombier outhist();
145*fbadb1c4SDavid du Colombier pinit(file);
146*fbadb1c4SDavid du Colombier for(i=0; i<nDlist; i++)
147*fbadb1c4SDavid du Colombier dodefine(Dlist[i]);
148*fbadb1c4SDavid du Colombier yyparse();
149*fbadb1c4SDavid du Colombier cclean();
150*fbadb1c4SDavid du Colombier return nerrors;
151*fbadb1c4SDavid du Colombier }
152*fbadb1c4SDavid du Colombier
153*fbadb1c4SDavid du Colombier struct
154*fbadb1c4SDavid du Colombier {
155*fbadb1c4SDavid du Colombier char *name;
156*fbadb1c4SDavid du Colombier ushort type;
157*fbadb1c4SDavid du Colombier ushort value;
158*fbadb1c4SDavid du Colombier } itab[] =
159*fbadb1c4SDavid du Colombier {
160*fbadb1c4SDavid du Colombier "SP", LSP, D_AUTO,
161*fbadb1c4SDavid du Colombier "SB", LSB, D_EXTERN,
162*fbadb1c4SDavid du Colombier "FP", LFP, D_PARAM,
163*fbadb1c4SDavid du Colombier "PC", LPC, D_BRANCH,
164*fbadb1c4SDavid du Colombier
165*fbadb1c4SDavid du Colombier "LR", LLR, D_LR,
166*fbadb1c4SDavid du Colombier "CTR", LCTR, D_CTR,
167*fbadb1c4SDavid du Colombier
168*fbadb1c4SDavid du Colombier "XER", LSPREG, D_XER,
169*fbadb1c4SDavid du Colombier "MSR", LMSR, D_MSR,
170*fbadb1c4SDavid du Colombier "FPSCR", LFPSCR, D_FPSCR,
171*fbadb1c4SDavid du Colombier "SPR", LSPR, D_SPR,
172*fbadb1c4SDavid du Colombier "DCR", LSPR, D_DCR,
173*fbadb1c4SDavid du Colombier
174*fbadb1c4SDavid du Colombier "CR", LCR, 0,
175*fbadb1c4SDavid du Colombier "CR0", LCREG, 0,
176*fbadb1c4SDavid du Colombier "CR1", LCREG, 1,
177*fbadb1c4SDavid du Colombier "CR2", LCREG, 2,
178*fbadb1c4SDavid du Colombier "CR3", LCREG, 3,
179*fbadb1c4SDavid du Colombier "CR4", LCREG, 4,
180*fbadb1c4SDavid du Colombier "CR5", LCREG, 5,
181*fbadb1c4SDavid du Colombier "CR6", LCREG, 6,
182*fbadb1c4SDavid du Colombier "CR7", LCREG, 7,
183*fbadb1c4SDavid du Colombier
184*fbadb1c4SDavid du Colombier "R", LR, 0,
185*fbadb1c4SDavid du Colombier "R0", LREG, 0,
186*fbadb1c4SDavid du Colombier "R1", LREG, 1,
187*fbadb1c4SDavid du Colombier "R2", LREG, 2,
188*fbadb1c4SDavid du Colombier "R3", LREG, 3,
189*fbadb1c4SDavid du Colombier "R4", LREG, 4,
190*fbadb1c4SDavid du Colombier "R5", LREG, 5,
191*fbadb1c4SDavid du Colombier "R6", LREG, 6,
192*fbadb1c4SDavid du Colombier "R7", LREG, 7,
193*fbadb1c4SDavid du Colombier "R8", LREG, 8,
194*fbadb1c4SDavid du Colombier "R9", LREG, 9,
195*fbadb1c4SDavid du Colombier "R10", LREG, 10,
196*fbadb1c4SDavid du Colombier "R11", LREG, 11,
197*fbadb1c4SDavid du Colombier "R12", LREG, 12,
198*fbadb1c4SDavid du Colombier "R13", LREG, 13,
199*fbadb1c4SDavid du Colombier "R14", LREG, 14,
200*fbadb1c4SDavid du Colombier "R15", LREG, 15,
201*fbadb1c4SDavid du Colombier "R16", LREG, 16,
202*fbadb1c4SDavid du Colombier "R17", LREG, 17,
203*fbadb1c4SDavid du Colombier "R18", LREG, 18,
204*fbadb1c4SDavid du Colombier "R19", LREG, 19,
205*fbadb1c4SDavid du Colombier "R20", LREG, 20,
206*fbadb1c4SDavid du Colombier "R21", LREG, 21,
207*fbadb1c4SDavid du Colombier "R22", LREG, 22,
208*fbadb1c4SDavid du Colombier "R23", LREG, 23,
209*fbadb1c4SDavid du Colombier "R24", LREG, 24,
210*fbadb1c4SDavid du Colombier "R25", LREG, 25,
211*fbadb1c4SDavid du Colombier "R26", LREG, 26,
212*fbadb1c4SDavid du Colombier "R27", LREG, 27,
213*fbadb1c4SDavid du Colombier "R28", LREG, 28,
214*fbadb1c4SDavid du Colombier "R29", LREG, 29,
215*fbadb1c4SDavid du Colombier "R30", LREG, 30,
216*fbadb1c4SDavid du Colombier "R31", LREG, 31,
217*fbadb1c4SDavid du Colombier
218*fbadb1c4SDavid du Colombier "F", LF, 0,
219*fbadb1c4SDavid du Colombier "F0", LFREG, 0,
220*fbadb1c4SDavid du Colombier "F1", LFREG, 1,
221*fbadb1c4SDavid du Colombier "F2", LFREG, 2,
222*fbadb1c4SDavid du Colombier "F3", LFREG, 3,
223*fbadb1c4SDavid du Colombier "F4", LFREG, 4,
224*fbadb1c4SDavid du Colombier "F5", LFREG, 5,
225*fbadb1c4SDavid du Colombier "F6", LFREG, 6,
226*fbadb1c4SDavid du Colombier "F7", LFREG, 7,
227*fbadb1c4SDavid du Colombier "F8", LFREG, 8,
228*fbadb1c4SDavid du Colombier "F9", LFREG, 9,
229*fbadb1c4SDavid du Colombier "F10", LFREG, 10,
230*fbadb1c4SDavid du Colombier "F11", LFREG, 11,
231*fbadb1c4SDavid du Colombier "F12", LFREG, 12,
232*fbadb1c4SDavid du Colombier "F13", LFREG, 13,
233*fbadb1c4SDavid du Colombier "F14", LFREG, 14,
234*fbadb1c4SDavid du Colombier "F15", LFREG, 15,
235*fbadb1c4SDavid du Colombier "F16", LFREG, 16,
236*fbadb1c4SDavid du Colombier "F17", LFREG, 17,
237*fbadb1c4SDavid du Colombier "F18", LFREG, 18,
238*fbadb1c4SDavid du Colombier "F19", LFREG, 19,
239*fbadb1c4SDavid du Colombier "F20", LFREG, 20,
240*fbadb1c4SDavid du Colombier "F21", LFREG, 21,
241*fbadb1c4SDavid du Colombier "F22", LFREG, 22,
242*fbadb1c4SDavid du Colombier "F23", LFREG, 23,
243*fbadb1c4SDavid du Colombier "F24", LFREG, 24,
244*fbadb1c4SDavid du Colombier "F25", LFREG, 25,
245*fbadb1c4SDavid du Colombier "F26", LFREG, 26,
246*fbadb1c4SDavid du Colombier "F27", LFREG, 27,
247*fbadb1c4SDavid du Colombier "F28", LFREG, 28,
248*fbadb1c4SDavid du Colombier "F29", LFREG, 29,
249*fbadb1c4SDavid du Colombier "F30", LFREG, 30,
250*fbadb1c4SDavid du Colombier "F31", LFREG, 31,
251*fbadb1c4SDavid du Colombier
252*fbadb1c4SDavid du Colombier "CREQV", LCROP, ACREQV,
253*fbadb1c4SDavid du Colombier "CRXOR", LCROP, ACRXOR,
254*fbadb1c4SDavid du Colombier "CRAND", LCROP, ACRAND,
255*fbadb1c4SDavid du Colombier "CROR", LCROP, ACROR,
256*fbadb1c4SDavid du Colombier "CRANDN", LCROP, ACRANDN,
257*fbadb1c4SDavid du Colombier "CRORN", LCROP, ACRORN,
258*fbadb1c4SDavid du Colombier "CRNAND", LCROP, ACRNAND,
259*fbadb1c4SDavid du Colombier "CRNOR", LCROP, ACRNOR,
260*fbadb1c4SDavid du Colombier
261*fbadb1c4SDavid du Colombier "ADD", LADDW, AADD,
262*fbadb1c4SDavid du Colombier "ADDV", LADDW, AADDV,
263*fbadb1c4SDavid du Colombier "ADDCC", LADDW, AADDCC,
264*fbadb1c4SDavid du Colombier "ADDVCC", LADDW, AADDVCC,
265*fbadb1c4SDavid du Colombier "ADDC", LADDW, AADDC,
266*fbadb1c4SDavid du Colombier "ADDCV", LADDW, AADDCV,
267*fbadb1c4SDavid du Colombier "ADDCCC", LADDW, AADDCCC,
268*fbadb1c4SDavid du Colombier "ADDCVCC", LADDW, AADDCVCC,
269*fbadb1c4SDavid du Colombier "ADDE", LLOGW, AADDE,
270*fbadb1c4SDavid du Colombier "ADDEV", LLOGW, AADDEV,
271*fbadb1c4SDavid du Colombier "ADDECC", LLOGW, AADDECC,
272*fbadb1c4SDavid du Colombier "ADDEVCC", LLOGW, AADDEVCC,
273*fbadb1c4SDavid du Colombier
274*fbadb1c4SDavid du Colombier "ADDME", LABS, AADDME,
275*fbadb1c4SDavid du Colombier "ADDMEV", LABS, AADDMEV,
276*fbadb1c4SDavid du Colombier "ADDMECC", LABS, AADDMECC,
277*fbadb1c4SDavid du Colombier "ADDMEVCC", LABS, AADDMEVCC,
278*fbadb1c4SDavid du Colombier "ADDZE", LABS, AADDZE,
279*fbadb1c4SDavid du Colombier "ADDZEV", LABS, AADDZEV,
280*fbadb1c4SDavid du Colombier "ADDZECC", LABS, AADDZECC,
281*fbadb1c4SDavid du Colombier "ADDZEVCC", LABS, AADDZEVCC,
282*fbadb1c4SDavid du Colombier
283*fbadb1c4SDavid du Colombier "SUB", LADDW, ASUB,
284*fbadb1c4SDavid du Colombier "SUBV", LADDW, ASUBV,
285*fbadb1c4SDavid du Colombier "SUBCC", LADDW, ASUBCC,
286*fbadb1c4SDavid du Colombier "SUBVCC", LADDW, ASUBVCC,
287*fbadb1c4SDavid du Colombier "SUBE", LLOGW, ASUBE,
288*fbadb1c4SDavid du Colombier "SUBECC", LLOGW, ASUBECC,
289*fbadb1c4SDavid du Colombier "SUBEV", LLOGW, ASUBEV,
290*fbadb1c4SDavid du Colombier "SUBEVCC", LLOGW, ASUBEVCC,
291*fbadb1c4SDavid du Colombier "SUBC", LADDW, ASUBC,
292*fbadb1c4SDavid du Colombier "SUBCCC", LADDW, ASUBCCC,
293*fbadb1c4SDavid du Colombier "SUBCV", LADDW, ASUBCV,
294*fbadb1c4SDavid du Colombier "SUBCVCC", LADDW, ASUBCVCC,
295*fbadb1c4SDavid du Colombier
296*fbadb1c4SDavid du Colombier "SUBME", LABS, ASUBME,
297*fbadb1c4SDavid du Colombier "SUBMEV", LABS, ASUBMEV,
298*fbadb1c4SDavid du Colombier "SUBMECC", LABS, ASUBMECC,
299*fbadb1c4SDavid du Colombier "SUBMEVCC", LABS, ASUBMEVCC,
300*fbadb1c4SDavid du Colombier "SUBZE", LABS, ASUBZE,
301*fbadb1c4SDavid du Colombier "SUBZEV", LABS, ASUBZEV,
302*fbadb1c4SDavid du Colombier "SUBZECC", LABS, ASUBZECC,
303*fbadb1c4SDavid du Colombier "SUBZEVCC", LABS, ASUBZEVCC,
304*fbadb1c4SDavid du Colombier
305*fbadb1c4SDavid du Colombier "AND", LADDW, AAND,
306*fbadb1c4SDavid du Colombier "ANDCC", LADDW, AANDCC, /* includes andil & andiu */
307*fbadb1c4SDavid du Colombier "ANDN", LLOGW, AANDN,
308*fbadb1c4SDavid du Colombier "ANDNCC", LLOGW, AANDNCC,
309*fbadb1c4SDavid du Colombier "EQV", LLOGW, AEQV,
310*fbadb1c4SDavid du Colombier "EQVCC", LLOGW, AEQVCC,
311*fbadb1c4SDavid du Colombier "NAND", LLOGW, ANAND,
312*fbadb1c4SDavid du Colombier "NANDCC", LLOGW, ANANDCC,
313*fbadb1c4SDavid du Colombier "NOR", LLOGW, ANOR,
314*fbadb1c4SDavid du Colombier "NORCC", LLOGW, ANORCC,
315*fbadb1c4SDavid du Colombier "OR", LADDW, AOR, /* includes oril & oriu */
316*fbadb1c4SDavid du Colombier "ORCC", LADDW, AORCC,
317*fbadb1c4SDavid du Colombier "ORN", LLOGW, AORN,
318*fbadb1c4SDavid du Colombier "ORNCC", LLOGW, AORNCC,
319*fbadb1c4SDavid du Colombier "XOR", LADDW, AXOR, /* includes xoril & xoriu */
320*fbadb1c4SDavid du Colombier "XORCC", LLOGW, AXORCC,
321*fbadb1c4SDavid du Colombier
322*fbadb1c4SDavid du Colombier "EXTSB", LABS, AEXTSB,
323*fbadb1c4SDavid du Colombier "EXTSBCC", LABS, AEXTSBCC,
324*fbadb1c4SDavid du Colombier "EXTSH", LABS, AEXTSH,
325*fbadb1c4SDavid du Colombier "EXTSHCC", LABS, AEXTSHCC,
326*fbadb1c4SDavid du Colombier
327*fbadb1c4SDavid du Colombier "CNTLZW", LABS, ACNTLZW,
328*fbadb1c4SDavid du Colombier "CNTLZWCC", LABS, ACNTLZWCC,
329*fbadb1c4SDavid du Colombier
330*fbadb1c4SDavid du Colombier "RLWMI", LRLWM, ARLWMI,
331*fbadb1c4SDavid du Colombier "RLWMICC", LRLWM, ARLWMICC,
332*fbadb1c4SDavid du Colombier "RLWNM", LRLWM, ARLWNM,
333*fbadb1c4SDavid du Colombier "RLWNMCC", LRLWM, ARLWNMCC,
334*fbadb1c4SDavid du Colombier
335*fbadb1c4SDavid du Colombier "SLW", LSHW, ASLW,
336*fbadb1c4SDavid du Colombier "SLWCC", LSHW, ASLWCC,
337*fbadb1c4SDavid du Colombier "SRW", LSHW, ASRW,
338*fbadb1c4SDavid du Colombier "SRWCC", LSHW, ASRWCC,
339*fbadb1c4SDavid du Colombier "SRAW", LSHW, ASRAW,
340*fbadb1c4SDavid du Colombier "SRAWCC", LSHW, ASRAWCC,
341*fbadb1c4SDavid du Colombier
342*fbadb1c4SDavid du Colombier "BR", LBRA, ABR,
343*fbadb1c4SDavid du Colombier "BC", LBRA, ABC,
344*fbadb1c4SDavid du Colombier "BCL", LBRA, ABC,
345*fbadb1c4SDavid du Colombier "BL", LBRA, ABL,
346*fbadb1c4SDavid du Colombier "BEQ", LBRA, ABEQ,
347*fbadb1c4SDavid du Colombier "BNE", LBRA, ABNE,
348*fbadb1c4SDavid du Colombier "BGT", LBRA, ABGT,
349*fbadb1c4SDavid du Colombier "BGE", LBRA, ABGE,
350*fbadb1c4SDavid du Colombier "BLT", LBRA, ABLT,
351*fbadb1c4SDavid du Colombier "BLE", LBRA, ABLE,
352*fbadb1c4SDavid du Colombier "BVC", LBRA, ABVC,
353*fbadb1c4SDavid du Colombier "BVS", LBRA, ABVS,
354*fbadb1c4SDavid du Colombier
355*fbadb1c4SDavid du Colombier "CMP", LCMP, ACMP,
356*fbadb1c4SDavid du Colombier "CMPU", LCMP, ACMPU,
357*fbadb1c4SDavid du Colombier
358*fbadb1c4SDavid du Colombier "DIVW", LLOGW, ADIVW,
359*fbadb1c4SDavid du Colombier "DIVWV", LLOGW, ADIVWV,
360*fbadb1c4SDavid du Colombier "DIVWCC", LLOGW, ADIVWCC,
361*fbadb1c4SDavid du Colombier "DIVWVCC", LLOGW, ADIVWVCC,
362*fbadb1c4SDavid du Colombier "DIVWU", LLOGW, ADIVWU,
363*fbadb1c4SDavid du Colombier "DIVWUV", LLOGW, ADIVWUV,
364*fbadb1c4SDavid du Colombier "DIVWUCC", LLOGW, ADIVWUCC,
365*fbadb1c4SDavid du Colombier "DIVWUVCC", LLOGW, ADIVWUVCC,
366*fbadb1c4SDavid du Colombier
367*fbadb1c4SDavid du Colombier "FABS", LFCONV, AFABS,
368*fbadb1c4SDavid du Colombier "FABSCC", LFCONV, AFABSCC,
369*fbadb1c4SDavid du Colombier "FNEG", LFCONV, AFNEG,
370*fbadb1c4SDavid du Colombier "FNEGCC", LFCONV, AFNEGCC,
371*fbadb1c4SDavid du Colombier "FNABS", LFCONV, AFNABS,
372*fbadb1c4SDavid du Colombier "FNABSCC", LFCONV, AFNABSCC,
373*fbadb1c4SDavid du Colombier
374*fbadb1c4SDavid du Colombier "FADD", LFADD, AFADD,
375*fbadb1c4SDavid du Colombier "FADDCC", LFADD, AFADDCC,
376*fbadb1c4SDavid du Colombier "FSUB", LFADD, AFSUB,
377*fbadb1c4SDavid du Colombier "FSUBCC", LFADD, AFSUBCC,
378*fbadb1c4SDavid du Colombier "FMUL", LFADD, AFMUL,
379*fbadb1c4SDavid du Colombier "FMULCC", LFADD, AFMULCC,
380*fbadb1c4SDavid du Colombier "FDIV", LFADD, AFDIV,
381*fbadb1c4SDavid du Colombier "FDIVCC", LFADD, AFDIVCC,
382*fbadb1c4SDavid du Colombier "FRSP", LFCONV, AFRSP,
383*fbadb1c4SDavid du Colombier "FRSPCC", LFCONV, AFRSPCC,
384*fbadb1c4SDavid du Colombier "FCTIW", LFCONV, AFCTIW,
385*fbadb1c4SDavid du Colombier "FCTIWCC", LFCONV, AFCTIWCC,
386*fbadb1c4SDavid du Colombier "FCTIWZ", LFCONV, AFCTIWZ,
387*fbadb1c4SDavid du Colombier "FCTIWZCC", LFCONV, AFCTIWZCC,
388*fbadb1c4SDavid du Colombier
389*fbadb1c4SDavid du Colombier "FMADD", LFMA, AFMADD,
390*fbadb1c4SDavid du Colombier "FMADDCC", LFMA, AFMADDCC,
391*fbadb1c4SDavid du Colombier "FMSUB", LFMA, AFMSUB,
392*fbadb1c4SDavid du Colombier "FMSUBCC", LFMA, AFMSUBCC,
393*fbadb1c4SDavid du Colombier "FNMADD", LFMA, AFNMADD,
394*fbadb1c4SDavid du Colombier "FNMADDCC", LFMA, AFNMADDCC,
395*fbadb1c4SDavid du Colombier "FNMSUB", LFMA, AFNMSUB,
396*fbadb1c4SDavid du Colombier "FNMSUBCC", LFMA, AFNMSUBCC,
397*fbadb1c4SDavid du Colombier "FMADDS", LFMA, AFMADDS,
398*fbadb1c4SDavid du Colombier "FMADDSCC", LFMA, AFMADDSCC,
399*fbadb1c4SDavid du Colombier "FMSUBS", LFMA, AFMSUBS,
400*fbadb1c4SDavid du Colombier "FMSUBSCC", LFMA, AFMSUBSCC,
401*fbadb1c4SDavid du Colombier "FNMADDS", LFMA, AFNMADDS,
402*fbadb1c4SDavid du Colombier "FNMADDSCC", LFMA, AFNMADDSCC,
403*fbadb1c4SDavid du Colombier "FNMSUBS", LFMA, AFNMSUBS,
404*fbadb1c4SDavid du Colombier "FNMSUBSCC", LFMA, AFNMSUBSCC,
405*fbadb1c4SDavid du Colombier
406*fbadb1c4SDavid du Colombier "FCMPU", LFCMP, AFCMPU,
407*fbadb1c4SDavid du Colombier "FCMPO", LFCMP, AFCMPO,
408*fbadb1c4SDavid du Colombier "MTFSB0", LMTFSB, AMTFSB0,
409*fbadb1c4SDavid du Colombier "MTFSB1", LMTFSB, AMTFSB1,
410*fbadb1c4SDavid du Colombier
411*fbadb1c4SDavid du Colombier "FMOVD", LFMOV, AFMOVD,
412*fbadb1c4SDavid du Colombier "FMOVS", LFMOV, AFMOVS,
413*fbadb1c4SDavid du Colombier "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */
414*fbadb1c4SDavid du Colombier
415*fbadb1c4SDavid du Colombier "GLOBL", LTEXT, AGLOBL,
416*fbadb1c4SDavid du Colombier
417*fbadb1c4SDavid du Colombier "MOVB", LMOVB, AMOVB,
418*fbadb1c4SDavid du Colombier "MOVBZ", LMOVB, AMOVBZ,
419*fbadb1c4SDavid du Colombier "MOVBU", LMOVB, AMOVBU,
420*fbadb1c4SDavid du Colombier "MOVBZU", LMOVB, AMOVBZU,
421*fbadb1c4SDavid du Colombier "MOVH", LMOVB, AMOVH,
422*fbadb1c4SDavid du Colombier "MOVHZ", LMOVB, AMOVHZ,
423*fbadb1c4SDavid du Colombier "MOVHU", LMOVB, AMOVHU,
424*fbadb1c4SDavid du Colombier "MOVHZU", LMOVB, AMOVHZU,
425*fbadb1c4SDavid du Colombier "MOVHBR", LXMV, AMOVHBR,
426*fbadb1c4SDavid du Colombier "MOVWBR", LXMV, AMOVWBR,
427*fbadb1c4SDavid du Colombier "MOVW", LMOVW, AMOVW,
428*fbadb1c4SDavid du Colombier "MOVWU", LMOVW, AMOVWU,
429*fbadb1c4SDavid du Colombier "MOVMW", LMOVMW, AMOVMW,
430*fbadb1c4SDavid du Colombier "MOVFL", LMOVW, AMOVFL,
431*fbadb1c4SDavid du Colombier
432*fbadb1c4SDavid du Colombier "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */
433*fbadb1c4SDavid du Colombier "MULLWV", LLOGW, AMULLWV,
434*fbadb1c4SDavid du Colombier "MULLWCC", LLOGW, AMULLWCC,
435*fbadb1c4SDavid du Colombier "MULLWVCC", LLOGW, AMULLWVCC,
436*fbadb1c4SDavid du Colombier
437*fbadb1c4SDavid du Colombier "MULHW", LLOGW, AMULHW,
438*fbadb1c4SDavid du Colombier "MULHWCC", LLOGW, AMULHWCC,
439*fbadb1c4SDavid du Colombier "MULHWU", LLOGW, AMULHWU,
440*fbadb1c4SDavid du Colombier "MULHWUCC", LLOGW, AMULHWUCC,
441*fbadb1c4SDavid du Colombier
442*fbadb1c4SDavid du Colombier "NEG", LABS, ANEG,
443*fbadb1c4SDavid du Colombier "NEGV", LABS, ANEGV,
444*fbadb1c4SDavid du Colombier "NEGCC", LABS, ANEGCC,
445*fbadb1c4SDavid du Colombier "NEGVCC", LABS, ANEGVCC,
446*fbadb1c4SDavid du Colombier
447*fbadb1c4SDavid du Colombier "NOP", LNOP, ANOP, /* ori 0,0,0 */
448*fbadb1c4SDavid du Colombier "SYSCALL", LNOP, ASYSCALL,
449*fbadb1c4SDavid du Colombier
450*fbadb1c4SDavid du Colombier "RETURN", LRETRN, ARETURN,
451*fbadb1c4SDavid du Colombier "RFI", LRETRN, ARFI,
452*fbadb1c4SDavid du Colombier "RFCI", LRETRN, ARFCI,
453*fbadb1c4SDavid du Colombier
454*fbadb1c4SDavid du Colombier "DATA", LDATA, ADATA,
455*fbadb1c4SDavid du Colombier "END", LEND, AEND,
456*fbadb1c4SDavid du Colombier "TEXT", LTEXT, ATEXT,
457*fbadb1c4SDavid du Colombier
458*fbadb1c4SDavid du Colombier /* 64-bit instructions */
459*fbadb1c4SDavid du Colombier "CNTLZD", LABS, ACNTLZD,
460*fbadb1c4SDavid du Colombier "CNTLZDCC", LABS, ACNTLZDCC,
461*fbadb1c4SDavid du Colombier "DIVD", LLOGW, ADIVD,
462*fbadb1c4SDavid du Colombier "DIVDCC", LLOGW, ADIVDCC,
463*fbadb1c4SDavid du Colombier "DIVDVCC", LLOGW, ADIVDVCC,
464*fbadb1c4SDavid du Colombier "DIVDV", LLOGW, ADIVDV,
465*fbadb1c4SDavid du Colombier "DIVDU", LLOGW, ADIVDU,
466*fbadb1c4SDavid du Colombier "DIVDUCC", LLOGW, ADIVDUCC,
467*fbadb1c4SDavid du Colombier "DIVDUVCC", LLOGW, ADIVDUVCC,
468*fbadb1c4SDavid du Colombier "DIVDUV", LLOGW, ADIVDUV,
469*fbadb1c4SDavid du Colombier "EXTSW", LABS, AEXTSW,
470*fbadb1c4SDavid du Colombier "EXTSWCC", LABS, AEXTSWCC,
471*fbadb1c4SDavid du Colombier "FCTID", LFCONV, AFCTID,
472*fbadb1c4SDavid du Colombier "FCTIDCC", LFCONV, AFCTIDCC,
473*fbadb1c4SDavid du Colombier "FCTIDZ", LFCONV, AFCTIDZ,
474*fbadb1c4SDavid du Colombier "FCTIDZCC", LFCONV, AFCTIDZCC,
475*fbadb1c4SDavid du Colombier "FCFID", LFCONV, AFCFID,
476*fbadb1c4SDavid du Colombier "FCFIDCC", LFCONV, AFCFIDCC,
477*fbadb1c4SDavid du Colombier "LDAR", LXLD, ALDAR,
478*fbadb1c4SDavid du Colombier "MOVD", LMOVW, AMOVD,
479*fbadb1c4SDavid du Colombier "MOVDU", LMOVW, AMOVDU,
480*fbadb1c4SDavid du Colombier "MOVWZ", LMOVW, AMOVWZ,
481*fbadb1c4SDavid du Colombier "MOVWZU", LMOVW, AMOVWZU,
482*fbadb1c4SDavid du Colombier "MULHD", LLOGW, AMULHD,
483*fbadb1c4SDavid du Colombier "MULHDCC", LLOGW, AMULHDCC,
484*fbadb1c4SDavid du Colombier "MULHDU", LLOGW, AMULHDU,
485*fbadb1c4SDavid du Colombier "MULHDUCC", LLOGW, AMULHDUCC,
486*fbadb1c4SDavid du Colombier "MULLD", LADDW, AMULLD, /* includes multiply immediate? */
487*fbadb1c4SDavid du Colombier "MULLDCC", LLOGW, AMULLDCC,
488*fbadb1c4SDavid du Colombier "MULLDVCC", LLOGW, AMULLDVCC,
489*fbadb1c4SDavid du Colombier "MULLDV", LLOGW, AMULLDV,
490*fbadb1c4SDavid du Colombier "RFID", LRETRN, ARFID,
491*fbadb1c4SDavid du Colombier "HRFID", LRETRN, AHRFID,
492*fbadb1c4SDavid du Colombier "RLDMI", LRLWM, ARLDMI,
493*fbadb1c4SDavid du Colombier "RLDMICC", LRLWM, ARLDMICC,
494*fbadb1c4SDavid du Colombier "RLDC", LRLWM, ARLDC,
495*fbadb1c4SDavid du Colombier "RLDCCC", LRLWM, ARLDCCC,
496*fbadb1c4SDavid du Colombier "RLDCR", LRLWM, ARLDCR,
497*fbadb1c4SDavid du Colombier "RLDCRCC", LRLWM, ARLDCRCC,
498*fbadb1c4SDavid du Colombier "RLDCL", LRLWM, ARLDCL,
499*fbadb1c4SDavid du Colombier "RLDCLCC", LRLWM, ARLDCLCC,
500*fbadb1c4SDavid du Colombier "SLBIA", LNOP, ASLBIA,
501*fbadb1c4SDavid du Colombier "SLBIE", LNOP, ASLBIE,
502*fbadb1c4SDavid du Colombier "SLBMFEE", LABS, ASLBMFEE,
503*fbadb1c4SDavid du Colombier "SLBMFEV", LABS, ASLBMFEV,
504*fbadb1c4SDavid du Colombier "SLBMTE", LABS, ASLBMTE,
505*fbadb1c4SDavid du Colombier "SLD", LSHW, ASLD,
506*fbadb1c4SDavid du Colombier "SLDCC", LSHW, ASLDCC,
507*fbadb1c4SDavid du Colombier "SRD", LSHW, ASRD,
508*fbadb1c4SDavid du Colombier "SRAD", LSHW, ASRAD,
509*fbadb1c4SDavid du Colombier "SRADCC", LSHW, ASRADCC,
510*fbadb1c4SDavid du Colombier "SRDCC", LSHW, ASRDCC,
511*fbadb1c4SDavid du Colombier "STDCCC", LXST, ASTDCCC,
512*fbadb1c4SDavid du Colombier "TD", LADDW, ATD,
513*fbadb1c4SDavid du Colombier
514*fbadb1c4SDavid du Colombier /* pseudo instructions */
515*fbadb1c4SDavid du Colombier "REM", LLOGW, AREM,
516*fbadb1c4SDavid du Colombier "REMCC", LLOGW, AREMCC,
517*fbadb1c4SDavid du Colombier "REMV", LLOGW, AREMV,
518*fbadb1c4SDavid du Colombier "REMVCC", LLOGW, AREMVCC,
519*fbadb1c4SDavid du Colombier "REMU", LLOGW, AREMU,
520*fbadb1c4SDavid du Colombier "REMUCC", LLOGW, AREMUCC,
521*fbadb1c4SDavid du Colombier "REMUV", LLOGW, AREMUV,
522*fbadb1c4SDavid du Colombier "REMUVCC", LLOGW, AREMUVCC,
523*fbadb1c4SDavid du Colombier "REMD", LLOGW, AREMD,
524*fbadb1c4SDavid du Colombier "REMDCC", LLOGW, AREMDCC,
525*fbadb1c4SDavid du Colombier "REMDV", LLOGW, AREMDV,
526*fbadb1c4SDavid du Colombier "REMDVCC", LLOGW, AREMDVCC,
527*fbadb1c4SDavid du Colombier "REMDU", LLOGW, AREMDU,
528*fbadb1c4SDavid du Colombier "REMDUCC", LLOGW, AREMDUCC,
529*fbadb1c4SDavid du Colombier "REMDUV", LLOGW, AREMDUV,
530*fbadb1c4SDavid du Colombier "REMDUVCC", LLOGW, AREMDUVCC,
531*fbadb1c4SDavid du Colombier
532*fbadb1c4SDavid du Colombier /* special instructions */
533*fbadb1c4SDavid du Colombier "DCBF", LXOP, ADCBF,
534*fbadb1c4SDavid du Colombier "DCBI", LXOP, ADCBI,
535*fbadb1c4SDavid du Colombier "DCBST", LXOP, ADCBST,
536*fbadb1c4SDavid du Colombier "DCBT", LXOP, ADCBT,
537*fbadb1c4SDavid du Colombier "DCBTST", LXOP, ADCBTST,
538*fbadb1c4SDavid du Colombier "DCBZ", LXOP, ADCBZ,
539*fbadb1c4SDavid du Colombier "ICBI", LXOP, AICBI,
540*fbadb1c4SDavid du Colombier
541*fbadb1c4SDavid du Colombier "ECIWX", LXLD, AECIWX,
542*fbadb1c4SDavid du Colombier "ECOWX", LXST, AECOWX,
543*fbadb1c4SDavid du Colombier "LWAR", LXLD, ALWAR,
544*fbadb1c4SDavid du Colombier "LWAR", LXLD, ALWAR,
545*fbadb1c4SDavid du Colombier "STWCCC", LXST, ASTWCCC,
546*fbadb1c4SDavid du Colombier "EIEIO", LRETRN, AEIEIO,
547*fbadb1c4SDavid du Colombier "TLBIE", LNOP, ATLBIE,
548*fbadb1c4SDavid du Colombier "TLBIEL", LNOP, ATLBIEL,
549*fbadb1c4SDavid du Colombier "LSW", LXLD, ALSW,
550*fbadb1c4SDavid du Colombier "STSW", LXST, ASTSW,
551*fbadb1c4SDavid du Colombier
552*fbadb1c4SDavid du Colombier "ISYNC", LRETRN, AISYNC,
553*fbadb1c4SDavid du Colombier "SYNC", LRETRN, ASYNC,
554*fbadb1c4SDavid du Colombier "TLBSYNC", LRETRN, ATLBSYNC,
555*fbadb1c4SDavid du Colombier "PTESYNC", LRETRN, APTESYNC,
556*fbadb1c4SDavid du Colombier /* "TW", LADDW, ATW,*/
557*fbadb1c4SDavid du Colombier
558*fbadb1c4SDavid du Colombier "WORD", LWORD, AWORD,
559*fbadb1c4SDavid du Colombier "DWORD", LWORD, ADWORD,
560*fbadb1c4SDavid du Colombier "SCHED", LSCHED, 0,
561*fbadb1c4SDavid du Colombier "NOSCHED", LSCHED, 0x80,
562*fbadb1c4SDavid du Colombier
563*fbadb1c4SDavid du Colombier 0
564*fbadb1c4SDavid du Colombier };
565*fbadb1c4SDavid du Colombier
566*fbadb1c4SDavid du Colombier void
cinit(void)567*fbadb1c4SDavid du Colombier cinit(void)
568*fbadb1c4SDavid du Colombier {
569*fbadb1c4SDavid du Colombier Sym *s;
570*fbadb1c4SDavid du Colombier int i;
571*fbadb1c4SDavid du Colombier
572*fbadb1c4SDavid du Colombier nullgen.sym = S;
573*fbadb1c4SDavid du Colombier nullgen.offset = 0;
574*fbadb1c4SDavid du Colombier nullgen.type = D_NONE;
575*fbadb1c4SDavid du Colombier nullgen.name = D_NONE;
576*fbadb1c4SDavid du Colombier nullgen.reg = NREG;
577*fbadb1c4SDavid du Colombier nullgen.xreg = NREG;
578*fbadb1c4SDavid du Colombier if(FPCHIP)
579*fbadb1c4SDavid du Colombier nullgen.dval = 0;
580*fbadb1c4SDavid du Colombier for(i=0; i<sizeof(nullgen.sval); i++)
581*fbadb1c4SDavid du Colombier nullgen.sval[i] = 0;
582*fbadb1c4SDavid du Colombier
583*fbadb1c4SDavid du Colombier nerrors = 0;
584*fbadb1c4SDavid du Colombier iostack = I;
585*fbadb1c4SDavid du Colombier iofree = I;
586*fbadb1c4SDavid du Colombier peekc = IGN;
587*fbadb1c4SDavid du Colombier nhunk = 0;
588*fbadb1c4SDavid du Colombier for(i=0; i<NHASH; i++)
589*fbadb1c4SDavid du Colombier hash[i] = S;
590*fbadb1c4SDavid du Colombier for(i=0; itab[i].name; i++) {
591*fbadb1c4SDavid du Colombier s = slookup(itab[i].name);
592*fbadb1c4SDavid du Colombier s->type = itab[i].type;
593*fbadb1c4SDavid du Colombier s->value = itab[i].value;
594*fbadb1c4SDavid du Colombier }
595*fbadb1c4SDavid du Colombier ALLOCN(pathname, 0, 100);
596*fbadb1c4SDavid du Colombier if(mygetwd(pathname, 99) == 0) {
597*fbadb1c4SDavid du Colombier ALLOCN(pathname, 100, 900);
598*fbadb1c4SDavid du Colombier if(mygetwd(pathname, 999) == 0)
599*fbadb1c4SDavid du Colombier strcpy(pathname, "/???");
600*fbadb1c4SDavid du Colombier }
601*fbadb1c4SDavid du Colombier }
602*fbadb1c4SDavid du Colombier
603*fbadb1c4SDavid du Colombier void
syminit(Sym * s)604*fbadb1c4SDavid du Colombier syminit(Sym *s)
605*fbadb1c4SDavid du Colombier {
606*fbadb1c4SDavid du Colombier
607*fbadb1c4SDavid du Colombier s->type = LNAME;
608*fbadb1c4SDavid du Colombier s->value = 0;
609*fbadb1c4SDavid du Colombier }
610*fbadb1c4SDavid du Colombier
611*fbadb1c4SDavid du Colombier void
cclean(void)612*fbadb1c4SDavid du Colombier cclean(void)
613*fbadb1c4SDavid du Colombier {
614*fbadb1c4SDavid du Colombier
615*fbadb1c4SDavid du Colombier outcode(AEND, &nullgen, NREG, &nullgen);
616*fbadb1c4SDavid du Colombier Bflush(&obuf);
617*fbadb1c4SDavid du Colombier }
618*fbadb1c4SDavid du Colombier
619*fbadb1c4SDavid du Colombier void
zname(char * n,int t,int s)620*fbadb1c4SDavid du Colombier zname(char *n, int t, int s)
621*fbadb1c4SDavid du Colombier {
622*fbadb1c4SDavid du Colombier
623*fbadb1c4SDavid du Colombier Bputc(&obuf, ANAME);
624*fbadb1c4SDavid du Colombier Bputc(&obuf, ANAME>>8);
625*fbadb1c4SDavid du Colombier Bputc(&obuf, t); /* type */
626*fbadb1c4SDavid du Colombier Bputc(&obuf, s); /* sym */
627*fbadb1c4SDavid du Colombier while(*n) {
628*fbadb1c4SDavid du Colombier Bputc(&obuf, *n);
629*fbadb1c4SDavid du Colombier n++;
630*fbadb1c4SDavid du Colombier }
631*fbadb1c4SDavid du Colombier Bputc(&obuf, 0);
632*fbadb1c4SDavid du Colombier }
633*fbadb1c4SDavid du Colombier
634*fbadb1c4SDavid du Colombier void
zaddr(Gen * a,int s)635*fbadb1c4SDavid du Colombier zaddr(Gen *a, int s)
636*fbadb1c4SDavid du Colombier {
637*fbadb1c4SDavid du Colombier long l;
638*fbadb1c4SDavid du Colombier int i;
639*fbadb1c4SDavid du Colombier char *n;
640*fbadb1c4SDavid du Colombier Ieee e;
641*fbadb1c4SDavid du Colombier
642*fbadb1c4SDavid du Colombier if(a->type == D_CONST){
643*fbadb1c4SDavid du Colombier l = a->offset;
644*fbadb1c4SDavid du Colombier if((vlong)l != a->offset)
645*fbadb1c4SDavid du Colombier a->type = D_DCONST;
646*fbadb1c4SDavid du Colombier }
647*fbadb1c4SDavid du Colombier Bputc(&obuf, a->type);
648*fbadb1c4SDavid du Colombier Bputc(&obuf, a->reg);
649*fbadb1c4SDavid du Colombier Bputc(&obuf, s);
650*fbadb1c4SDavid du Colombier Bputc(&obuf, a->name);
651*fbadb1c4SDavid du Colombier switch(a->type) {
652*fbadb1c4SDavid du Colombier default:
653*fbadb1c4SDavid du Colombier print("unknown type %d\n", a->type);
654*fbadb1c4SDavid du Colombier exits("arg");
655*fbadb1c4SDavid du Colombier
656*fbadb1c4SDavid du Colombier case D_NONE:
657*fbadb1c4SDavid du Colombier case D_REG:
658*fbadb1c4SDavid du Colombier case D_FREG:
659*fbadb1c4SDavid du Colombier case D_CREG:
660*fbadb1c4SDavid du Colombier case D_FPSCR:
661*fbadb1c4SDavid du Colombier case D_MSR:
662*fbadb1c4SDavid du Colombier case D_OPT:
663*fbadb1c4SDavid du Colombier break;
664*fbadb1c4SDavid du Colombier
665*fbadb1c4SDavid du Colombier case D_DCR:
666*fbadb1c4SDavid du Colombier case D_SPR:
667*fbadb1c4SDavid du Colombier case D_OREG:
668*fbadb1c4SDavid du Colombier case D_CONST:
669*fbadb1c4SDavid du Colombier case D_BRANCH:
670*fbadb1c4SDavid du Colombier l = a->offset;
671*fbadb1c4SDavid du Colombier Bputc(&obuf, l);
672*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>8);
673*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>16);
674*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>24);
675*fbadb1c4SDavid du Colombier break;
676*fbadb1c4SDavid du Colombier
677*fbadb1c4SDavid du Colombier case D_DCONST:
678*fbadb1c4SDavid du Colombier l = a->offset;
679*fbadb1c4SDavid du Colombier Bputc(&obuf, l);
680*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>8);
681*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>16);
682*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>24);
683*fbadb1c4SDavid du Colombier l = a->offset>>32;
684*fbadb1c4SDavid du Colombier Bputc(&obuf, l);
685*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>8);
686*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>16);
687*fbadb1c4SDavid du Colombier Bputc(&obuf, l>>24);
688*fbadb1c4SDavid du Colombier break;
689*fbadb1c4SDavid du Colombier
690*fbadb1c4SDavid du Colombier case D_SCONST:
691*fbadb1c4SDavid du Colombier n = a->sval;
692*fbadb1c4SDavid du Colombier for(i=0; i<NSNAME; i++) {
693*fbadb1c4SDavid du Colombier Bputc(&obuf, *n);
694*fbadb1c4SDavid du Colombier n++;
695*fbadb1c4SDavid du Colombier }
696*fbadb1c4SDavid du Colombier break;
697*fbadb1c4SDavid du Colombier
698*fbadb1c4SDavid du Colombier case D_FCONST:
699*fbadb1c4SDavid du Colombier ieeedtod(&e, a->dval);
700*fbadb1c4SDavid du Colombier Bputc(&obuf, e.l);
701*fbadb1c4SDavid du Colombier Bputc(&obuf, e.l>>8);
702*fbadb1c4SDavid du Colombier Bputc(&obuf, e.l>>16);
703*fbadb1c4SDavid du Colombier Bputc(&obuf, e.l>>24);
704*fbadb1c4SDavid du Colombier Bputc(&obuf, e.h);
705*fbadb1c4SDavid du Colombier Bputc(&obuf, e.h>>8);
706*fbadb1c4SDavid du Colombier Bputc(&obuf, e.h>>16);
707*fbadb1c4SDavid du Colombier Bputc(&obuf, e.h>>24);
708*fbadb1c4SDavid du Colombier break;
709*fbadb1c4SDavid du Colombier }
710*fbadb1c4SDavid du Colombier }
711*fbadb1c4SDavid du Colombier
712*fbadb1c4SDavid du Colombier int
outsim(Gen * g)713*fbadb1c4SDavid du Colombier outsim(Gen *g)
714*fbadb1c4SDavid du Colombier {
715*fbadb1c4SDavid du Colombier Sym *s;
716*fbadb1c4SDavid du Colombier int sno, t;
717*fbadb1c4SDavid du Colombier
718*fbadb1c4SDavid du Colombier s = g->sym;
719*fbadb1c4SDavid du Colombier if(s == S)
720*fbadb1c4SDavid du Colombier return 0;
721*fbadb1c4SDavid du Colombier sno = s->sym;
722*fbadb1c4SDavid du Colombier if(sno < 0 || sno >= NSYM)
723*fbadb1c4SDavid du Colombier sno = 0;
724*fbadb1c4SDavid du Colombier t = g->name;
725*fbadb1c4SDavid du Colombier if(h[sno].type == t && h[sno].sym == s)
726*fbadb1c4SDavid du Colombier return sno;
727*fbadb1c4SDavid du Colombier zname(s->name, t, sym);
728*fbadb1c4SDavid du Colombier s->sym = sym;
729*fbadb1c4SDavid du Colombier h[sym].sym = s;
730*fbadb1c4SDavid du Colombier h[sym].type = t;
731*fbadb1c4SDavid du Colombier sno = sym;
732*fbadb1c4SDavid du Colombier sym++;
733*fbadb1c4SDavid du Colombier if(sym >= NSYM)
734*fbadb1c4SDavid du Colombier sym = 1;
735*fbadb1c4SDavid du Colombier return sno;
736*fbadb1c4SDavid du Colombier }
737*fbadb1c4SDavid du Colombier
738*fbadb1c4SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)739*fbadb1c4SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
740*fbadb1c4SDavid du Colombier {
741*fbadb1c4SDavid du Colombier int sf, st;
742*fbadb1c4SDavid du Colombier
743*fbadb1c4SDavid du Colombier if(a != AGLOBL && a != ADATA)
744*fbadb1c4SDavid du Colombier pc++;
745*fbadb1c4SDavid du Colombier if(pass == 1)
746*fbadb1c4SDavid du Colombier return;
747*fbadb1c4SDavid du Colombier if(g1->xreg != NREG) {
748*fbadb1c4SDavid du Colombier if(reg != NREG || g2->xreg != NREG)
749*fbadb1c4SDavid du Colombier yyerror("bad addressing modes");
750*fbadb1c4SDavid du Colombier reg = g1->xreg;
751*fbadb1c4SDavid du Colombier } else
752*fbadb1c4SDavid du Colombier if(g2->xreg != NREG) {
753*fbadb1c4SDavid du Colombier if(reg != NREG)
754*fbadb1c4SDavid du Colombier yyerror("bad addressing modes");
755*fbadb1c4SDavid du Colombier reg = g2->xreg;
756*fbadb1c4SDavid du Colombier }
757*fbadb1c4SDavid du Colombier do {
758*fbadb1c4SDavid du Colombier sf = outsim(g1);
759*fbadb1c4SDavid du Colombier st = outsim(g2);
760*fbadb1c4SDavid du Colombier } while(sf != 0 && st == sf);
761*fbadb1c4SDavid du Colombier Bputc(&obuf, a);
762*fbadb1c4SDavid du Colombier Bputc(&obuf, a>>8);
763*fbadb1c4SDavid du Colombier Bputc(&obuf, reg|nosched);
764*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno);
765*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>8);
766*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>16);
767*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>24);
768*fbadb1c4SDavid du Colombier zaddr(g1, sf);
769*fbadb1c4SDavid du Colombier zaddr(g2, st);
770*fbadb1c4SDavid du Colombier }
771*fbadb1c4SDavid du Colombier
772*fbadb1c4SDavid du Colombier void
outgcode(int a,Gen * g1,int reg,Gen * g2,Gen * g3)773*fbadb1c4SDavid du Colombier outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
774*fbadb1c4SDavid du Colombier {
775*fbadb1c4SDavid du Colombier int s1, s2, s3, flag;
776*fbadb1c4SDavid du Colombier
777*fbadb1c4SDavid du Colombier if(a != AGLOBL && a != ADATA)
778*fbadb1c4SDavid du Colombier pc++;
779*fbadb1c4SDavid du Colombier if(pass == 1)
780*fbadb1c4SDavid du Colombier return;
781*fbadb1c4SDavid du Colombier do {
782*fbadb1c4SDavid du Colombier s1 = outsim(g1);
783*fbadb1c4SDavid du Colombier s2 = outsim(g2);
784*fbadb1c4SDavid du Colombier s3 = outsim(g3);
785*fbadb1c4SDavid du Colombier } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
786*fbadb1c4SDavid du Colombier flag = 0;
787*fbadb1c4SDavid du Colombier if(g2->type != D_NONE)
788*fbadb1c4SDavid du Colombier flag = 0x40; /* flags extra operand */
789*fbadb1c4SDavid du Colombier Bputc(&obuf, a);
790*fbadb1c4SDavid du Colombier Bputc(&obuf, a>>8);
791*fbadb1c4SDavid du Colombier Bputc(&obuf, reg | nosched | flag);
792*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno);
793*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>8);
794*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>16);
795*fbadb1c4SDavid du Colombier Bputc(&obuf, lineno>>24);
796*fbadb1c4SDavid du Colombier zaddr(g1, s1);
797*fbadb1c4SDavid du Colombier if(flag)
798*fbadb1c4SDavid du Colombier zaddr(g2, s2);
799*fbadb1c4SDavid du Colombier zaddr(g3, s3);
800*fbadb1c4SDavid du Colombier }
801*fbadb1c4SDavid du Colombier
802*fbadb1c4SDavid du Colombier void
outhist(void)803*fbadb1c4SDavid du Colombier outhist(void)
804*fbadb1c4SDavid du Colombier {
805*fbadb1c4SDavid du Colombier Gen g;
806*fbadb1c4SDavid du Colombier Hist *h;
807*fbadb1c4SDavid du Colombier char *p, *q, *op, c;
808*fbadb1c4SDavid du Colombier int n;
809*fbadb1c4SDavid du Colombier
810*fbadb1c4SDavid du Colombier g = nullgen;
811*fbadb1c4SDavid du Colombier c = pathchar();
812*fbadb1c4SDavid du Colombier for(h = hist; h != H; h = h->link) {
813*fbadb1c4SDavid du Colombier p = h->name;
814*fbadb1c4SDavid du Colombier op = 0;
815*fbadb1c4SDavid du Colombier /* on windows skip drive specifier in pathname */
816*fbadb1c4SDavid du Colombier if(systemtype(Windows) && p && p[1] == ':'){
817*fbadb1c4SDavid du Colombier p += 2;
818*fbadb1c4SDavid du Colombier c = *p;
819*fbadb1c4SDavid du Colombier }
820*fbadb1c4SDavid du Colombier if(p && p[0] != c && h->offset == 0 && pathname){
821*fbadb1c4SDavid du Colombier /* on windows skip drive specifier in pathname */
822*fbadb1c4SDavid du Colombier if(systemtype(Windows) && pathname[1] == ':') {
823*fbadb1c4SDavid du Colombier op = p;
824*fbadb1c4SDavid du Colombier p = pathname+2;
825*fbadb1c4SDavid du Colombier c = *p;
826*fbadb1c4SDavid du Colombier } else if(pathname[0] == c){
827*fbadb1c4SDavid du Colombier op = p;
828*fbadb1c4SDavid du Colombier p = pathname;
829*fbadb1c4SDavid du Colombier }
830*fbadb1c4SDavid du Colombier }
831*fbadb1c4SDavid du Colombier while(p) {
832*fbadb1c4SDavid du Colombier q = strchr(p, c);
833*fbadb1c4SDavid du Colombier if(q) {
834*fbadb1c4SDavid du Colombier n = q-p;
835*fbadb1c4SDavid du Colombier if(n == 0){
836*fbadb1c4SDavid du Colombier n = 1; /* leading "/" */
837*fbadb1c4SDavid du Colombier *p = '/'; /* don't emit "\" on windows */
838*fbadb1c4SDavid du Colombier }
839*fbadb1c4SDavid du Colombier q++;
840*fbadb1c4SDavid du Colombier } else {
841*fbadb1c4SDavid du Colombier n = strlen(p);
842*fbadb1c4SDavid du Colombier q = 0;
843*fbadb1c4SDavid du Colombier }
844*fbadb1c4SDavid du Colombier if(n) {
845*fbadb1c4SDavid du Colombier Bputc(&obuf, ANAME);
846*fbadb1c4SDavid du Colombier Bputc(&obuf, ANAME>>8);
847*fbadb1c4SDavid du Colombier Bputc(&obuf, D_FILE); /* type */
848*fbadb1c4SDavid du Colombier Bputc(&obuf, 1); /* sym */
849*fbadb1c4SDavid du Colombier Bputc(&obuf, '<');
850*fbadb1c4SDavid du Colombier Bwrite(&obuf, p, n);
851*fbadb1c4SDavid du Colombier Bputc(&obuf, 0);
852*fbadb1c4SDavid du Colombier }
853*fbadb1c4SDavid du Colombier p = q;
854*fbadb1c4SDavid du Colombier if(p == 0 && op) {
855*fbadb1c4SDavid du Colombier p = op;
856*fbadb1c4SDavid du Colombier op = 0;
857*fbadb1c4SDavid du Colombier }
858*fbadb1c4SDavid du Colombier }
859*fbadb1c4SDavid du Colombier g.offset = h->offset;
860*fbadb1c4SDavid du Colombier
861*fbadb1c4SDavid du Colombier Bputc(&obuf, AHISTORY);
862*fbadb1c4SDavid du Colombier Bputc(&obuf, AHISTORY>>8);
863*fbadb1c4SDavid du Colombier Bputc(&obuf, 0);
864*fbadb1c4SDavid du Colombier Bputc(&obuf, h->line);
865*fbadb1c4SDavid du Colombier Bputc(&obuf, h->line>>8);
866*fbadb1c4SDavid du Colombier Bputc(&obuf, h->line>>16);
867*fbadb1c4SDavid du Colombier Bputc(&obuf, h->line>>24);
868*fbadb1c4SDavid du Colombier zaddr(&nullgen, 0);
869*fbadb1c4SDavid du Colombier zaddr(&g, 0);
870*fbadb1c4SDavid du Colombier }
871*fbadb1c4SDavid du Colombier }
872*fbadb1c4SDavid du Colombier
873*fbadb1c4SDavid du Colombier #include "../cc/lexbody"
874*fbadb1c4SDavid du Colombier #include "../cc/macbody"
875*fbadb1c4SDavid du Colombier #include "../cc/compat"
876