1 #define EXTERN
2 #include "a.h"
3 #include "y.tab.h"
4 #include <ctype.h>
5
6 void
main(int argc,char * argv[])7 main(int argc, char *argv[])
8 {
9 char *p;
10 int nout, nproc, status, i, c;
11
12 thechar = 'q';
13 thestring = "power";
14 memset(debug, 0, sizeof(debug));
15 cinit();
16 outfile = 0;
17 include[ninclude++] = ".";
18 ARGBEGIN {
19 default:
20 c = ARGC();
21 if(c >= 0 || c < sizeof(debug))
22 debug[c] = 1;
23 break;
24
25 case 'o':
26 outfile = ARGF();
27 break;
28
29 case 'D':
30 p = ARGF();
31 if(p)
32 Dlist[nDlist++] = p;
33 break;
34
35 case 'I':
36 p = ARGF();
37 setinclude(p);
38 break;
39 } ARGEND
40 if(*argv == 0) {
41 print("usage: %ca [-options] file.s\n", thechar);
42 errorexit();
43 }
44 if(argc > 1 && systemtype(Windows)){
45 print("can't assemble multiple files on windows\n");
46 errorexit();
47 }
48 if(argc > 1) {
49 nproc = 1;
50 if(p = getenv("NPROC"))
51 nproc = atol(p);
52 c = 0;
53 nout = 0;
54 for(;;) {
55 while(nout < nproc && argc > 0) {
56 i = myfork();
57 if(i < 0) {
58 i = mywait(&status);
59 if(i < 0)
60 errorexit();
61 if(status)
62 c++;
63 nout--;
64 continue;
65 }
66 if(i == 0) {
67 print("%s:\n", *argv);
68 if(assemble(*argv))
69 errorexit();
70 exits(0);
71 }
72 nout++;
73 argc--;
74 argv++;
75 }
76 i = mywait(&status);
77 if(i < 0) {
78 if(c)
79 errorexit();
80 exits(0);
81 }
82 if(status)
83 c++;
84 nout--;
85 }
86 }
87 if(assemble(argv[0]))
88 errorexit();
89 exits(0);
90 }
91
92 int
assemble(char * file)93 assemble(char *file)
94 {
95 char ofile[100], incfile[20], *p;
96 int i, of;
97
98 strcpy(ofile, file);
99 if(p = strrchr(ofile, pathchar())) {
100 include[0] = ofile;
101 *p++ = 0;
102 } else
103 p = ofile;
104 if(outfile == 0) {
105 outfile = p;
106 if(p = strrchr(outfile, '.'))
107 if(p[1] == 's' && p[2] == 0)
108 p[0] = 0;
109 p = strrchr(outfile, 0);
110 p[0] = '.';
111 p[1] = thechar;
112 p[2] = 0;
113 }
114 p = getenv("INCLUDE");
115 if(p) {
116 setinclude(p);
117 } else {
118 if(systemtype(Plan9)) {
119 sprint(incfile,"/%s/include", thestring);
120 setinclude(strdup(incfile));
121 }
122 }
123
124 of = mycreat(outfile, 0664);
125 if(of < 0) {
126 yyerror("%ca: cannot create %s", thechar, outfile);
127 errorexit();
128 }
129 Binit(&obuf, of, OWRITE);
130
131 pass = 1;
132 nosched = 0;
133 pinit(file);
134 for(i=0; i<nDlist; i++)
135 dodefine(Dlist[i]);
136 yyparse();
137 if(nerrors) {
138 cclean();
139 return nerrors;
140 }
141
142 pass = 2;
143 nosched = 0;
144 outhist();
145 pinit(file);
146 for(i=0; i<nDlist; i++)
147 dodefine(Dlist[i]);
148 yyparse();
149 cclean();
150 return nerrors;
151 }
152
153 struct
154 {
155 char *name;
156 ushort type;
157 ushort value;
158 } itab[] =
159 {
160 "SP", LSP, D_AUTO,
161 "SB", LSB, D_EXTERN,
162 "FP", LFP, D_PARAM,
163 "PC", LPC, D_BRANCH,
164
165 "LR", LLR, D_LR,
166 "CTR", LCTR, D_CTR,
167
168 "XER", LSPREG, D_XER,
169 "MSR", LMSR, D_MSR,
170 "FPSCR", LFPSCR, D_FPSCR,
171 "SPR", LSPR, D_SPR,
172 "DCR", LDCR, D_DCR,
173
174 "SEG", LSEG, D_SREG,
175
176 "CR", LCR, 0,
177 "CR0", LCREG, 0,
178 "CR1", LCREG, 1,
179 "CR2", LCREG, 2,
180 "CR3", LCREG, 3,
181 "CR4", LCREG, 4,
182 "CR5", LCREG, 5,
183 "CR6", LCREG, 6,
184 "CR7", LCREG, 7,
185
186 "R", LR, 0,
187 "R0", LREG, 0,
188 "R1", LREG, 1,
189 "R2", LREG, 2,
190 "R3", LREG, 3,
191 "R4", LREG, 4,
192 "R5", LREG, 5,
193 "R6", LREG, 6,
194 "R7", LREG, 7,
195 "R8", LREG, 8,
196 "R9", LREG, 9,
197 "R10", LREG, 10,
198 "R11", LREG, 11,
199 "R12", LREG, 12,
200 "R13", LREG, 13,
201 "R14", LREG, 14,
202 "R15", LREG, 15,
203 "R16", LREG, 16,
204 "R17", LREG, 17,
205 "R18", LREG, 18,
206 "R19", LREG, 19,
207 "R20", LREG, 20,
208 "R21", LREG, 21,
209 "R22", LREG, 22,
210 "R23", LREG, 23,
211 "R24", LREG, 24,
212 "R25", LREG, 25,
213 "R26", LREG, 26,
214 "R27", LREG, 27,
215 "R28", LREG, 28,
216 "R29", LREG, 29,
217 "R30", LREG, 30,
218 "R31", LREG, 31,
219
220 "F", LF, 0,
221 "F0", LFREG, 0,
222 "F1", LFREG, 1,
223 "F2", LFREG, 2,
224 "F3", LFREG, 3,
225 "F4", LFREG, 4,
226 "F5", LFREG, 5,
227 "F6", LFREG, 6,
228 "F7", LFREG, 7,
229 "F8", LFREG, 8,
230 "F9", LFREG, 9,
231 "F10", LFREG, 10,
232 "F11", LFREG, 11,
233 "F12", LFREG, 12,
234 "F13", LFREG, 13,
235 "F14", LFREG, 14,
236 "F15", LFREG, 15,
237 "F16", LFREG, 16,
238 "F17", LFREG, 17,
239 "F18", LFREG, 18,
240 "F19", LFREG, 19,
241 "F20", LFREG, 20,
242 "F21", LFREG, 21,
243 "F22", LFREG, 22,
244 "F23", LFREG, 23,
245 "F24", LFREG, 24,
246 "F25", LFREG, 25,
247 "F26", LFREG, 26,
248 "F27", LFREG, 27,
249 "F28", LFREG, 28,
250 "F29", LFREG, 29,
251 "F30", LFREG, 30,
252 "F31", LFREG, 31,
253
254 "CREQV", LCROP, ACREQV,
255 "CRXOR", LCROP, ACRXOR,
256 "CRAND", LCROP, ACRAND,
257 "CROR", LCROP, ACROR,
258 "CRANDN", LCROP, ACRANDN,
259 "CRORN", LCROP, ACRORN,
260 "CRNAND", LCROP, ACRNAND,
261 "CRNOR", LCROP, ACRNOR,
262
263 "ADD", LADDW, AADD,
264 "ADDV", LADDW, AADDV,
265 "ADDCC", LADDW, AADDCC,
266 "ADDVCC", LADDW, AADDVCC,
267 "ADDC", LADDW, AADDC,
268 "ADDCV", LADDW, AADDCV,
269 "ADDCCC", LADDW, AADDCCC,
270 "ADDCVCC", LADDW, AADDCVCC,
271 "ADDE", LLOGW, AADDE,
272 "ADDEV", LLOGW, AADDEV,
273 "ADDECC", LLOGW, AADDECC,
274 "ADDEVCC", LLOGW, AADDEVCC,
275
276 "ADDME", LABS, AADDME,
277 "ADDMEV", LABS, AADDMEV,
278 "ADDMECC", LABS, AADDMECC,
279 "ADDMEVCC", LABS, AADDMEVCC,
280 "ADDZE", LABS, AADDZE,
281 "ADDZEV", LABS, AADDZEV,
282 "ADDZECC", LABS, AADDZECC,
283 "ADDZEVCC", LABS, AADDZEVCC,
284
285 "SUB", LADDW, ASUB,
286 "SUBV", LADDW, ASUBV,
287 "SUBCC", LADDW, ASUBCC,
288 "SUBVCC", LADDW, ASUBVCC,
289 "SUBE", LLOGW, ASUBE,
290 "SUBECC", LLOGW, ASUBECC,
291 "SUBEV", LLOGW, ASUBEV,
292 "SUBEVCC", LLOGW, ASUBEVCC,
293 "SUBC", LADDW, ASUBC,
294 "SUBCCC", LADDW, ASUBCCC,
295 "SUBCV", LADDW, ASUBCV,
296 "SUBCVCC", LADDW, ASUBCVCC,
297
298 "SUBME", LABS, ASUBME,
299 "SUBMEV", LABS, ASUBMEV,
300 "SUBMECC", LABS, ASUBMECC,
301 "SUBMEVCC", LABS, ASUBMEVCC,
302 "SUBZE", LABS, ASUBZE,
303 "SUBZEV", LABS, ASUBZEV,
304 "SUBZECC", LABS, ASUBZECC,
305 "SUBZEVCC", LABS, ASUBZEVCC,
306
307 "AND", LADDW, AAND,
308 "ANDCC", LADDW, AANDCC, /* includes andil & andiu */
309 "ANDN", LLOGW, AANDN,
310 "ANDNCC", LLOGW, AANDNCC,
311 "EQV", LLOGW, AEQV,
312 "EQVCC", LLOGW, AEQVCC,
313 "NAND", LLOGW, ANAND,
314 "NANDCC", LLOGW, ANANDCC,
315 "NOR", LLOGW, ANOR,
316 "NORCC", LLOGW, ANORCC,
317 "OR", LADDW, AOR, /* includes oril & oriu */
318 "ORCC", LADDW, AORCC,
319 "ORN", LLOGW, AORN,
320 "ORNCC", LLOGW, AORNCC,
321 "XOR", LADDW, AXOR, /* includes xoril & xoriu */
322 "XORCC", LLOGW, AXORCC,
323
324 "EXTSB", LABS, AEXTSB,
325 "EXTSBCC", LABS, AEXTSBCC,
326 "EXTSH", LABS, AEXTSH,
327 "EXTSHCC", LABS, AEXTSHCC,
328
329 "CNTLZW", LABS, ACNTLZW,
330 "CNTLZWCC", LABS, ACNTLZWCC,
331
332 "RLWMI", LRLWM, ARLWMI,
333 "RLWMICC", LRLWM, ARLWMICC,
334 "RLWNM", LRLWM, ARLWNM,
335 "RLWNMCC", LRLWM, ARLWNMCC,
336
337 "SLW", LSHW, ASLW,
338 "SLWCC", LSHW, ASLWCC,
339 "SRW", LSHW, ASRW,
340 "SRWCC", LSHW, ASRWCC,
341 "SRAW", LSHW, ASRAW,
342 "SRAWCC", LSHW, ASRAWCC,
343
344 "BR", LBRA, ABR,
345 "BC", LBRA, ABC,
346 "BCL", LBRA, ABC,
347 "BL", LBRA, ABL,
348 "BEQ", LBRA, ABEQ,
349 "BNE", LBRA, ABNE,
350 "BGT", LBRA, ABGT,
351 "BGE", LBRA, ABGE,
352 "BLT", LBRA, ABLT,
353 "BLE", LBRA, ABLE,
354 "BVC", LBRA, ABVC,
355 "BVS", LBRA, ABVS,
356
357 "CMP", LCMP, ACMP,
358 "CMPU", LCMP, ACMPU,
359
360 "DIVW", LLOGW, ADIVW,
361 "DIVWV", LLOGW, ADIVWV,
362 "DIVWCC", LLOGW, ADIVWCC,
363 "DIVWVCC", LLOGW, ADIVWVCC,
364 "DIVWU", LLOGW, ADIVWU,
365 "DIVWUV", LLOGW, ADIVWUV,
366 "DIVWUCC", LLOGW, ADIVWUCC,
367 "DIVWUVCC", LLOGW, ADIVWUVCC,
368
369 "FABS", LFCONV, AFABS,
370 "FABSCC", LFCONV, AFABSCC,
371 "FNEG", LFCONV, AFNEG,
372 "FNEGCC", LFCONV, AFNEGCC,
373 "FNABS", LFCONV, AFNABS,
374 "FNABSCC", LFCONV, AFNABSCC,
375
376 "FADD", LFADD, AFADD,
377 "FADDCC", LFADD, AFADDCC,
378 "FSUB", LFADD, AFSUB,
379 "FSUBCC", LFADD, AFSUBCC,
380 "FMUL", LFADD, AFMUL,
381 "FMULCC", LFADD, AFMULCC,
382 "FDIV", LFADD, AFDIV,
383 "FDIVCC", LFADD, AFDIVCC,
384 "FRSP", LFCONV, AFRSP,
385 "FRSPCC", LFCONV, AFRSPCC,
386
387 "FMADD", LFMA, AFMADD,
388 "FMADDCC", LFMA, AFMADDCC,
389 "FMSUB", LFMA, AFMSUB,
390 "FMSUBCC", LFMA, AFMSUBCC,
391 "FNMADD", LFMA, AFNMADD,
392 "FNMADDCC", LFMA, AFNMADDCC,
393 "FNMSUB", LFMA, AFNMSUB,
394 "FNMSUBCC", LFMA, AFNMSUBCC,
395 "FMADDS", LFMA, AFMADDS,
396 "FMADDSCC", LFMA, AFMADDSCC,
397 "FMSUBS", LFMA, AFMSUBS,
398 "FMSUBSCC", LFMA, AFMSUBSCC,
399 "FNMADDS", LFMA, AFNMADDS,
400 "FNMADDSCC", LFMA, AFNMADDSCC,
401 "FNMSUBS", LFMA, AFNMSUBS,
402 "FNMSUBSCC", LFMA, AFNMSUBSCC,
403
404 "FCMPU", LFCMP, AFCMPU,
405 "FCMPO", LFCMP, AFCMPO,
406 "MTFSB0", LMTFSB, AMTFSB0,
407 "MTFSB1", LMTFSB, AMTFSB1,
408
409 "FMOVD", LFMOV, AFMOVD,
410 "FMOVS", LFMOV, AFMOVS,
411 "FMOVDCC", LFCONV, AFMOVDCC, /* fmr. */
412
413 "GLOBL", LTEXT, AGLOBL,
414
415 "MOVB", LMOVB, AMOVB,
416 "MOVBZ", LMOVB, AMOVBZ,
417 "MOVBU", LMOVB, AMOVBU,
418 "MOVBZU", LMOVB, AMOVBZU,
419 "MOVH", LMOVB, AMOVH,
420 "MOVHZ", LMOVB, AMOVHZ,
421 "MOVHU", LMOVB, AMOVHU,
422 "MOVHZU", LMOVB, AMOVHZU,
423 "MOVHBR", LXMV, AMOVHBR,
424 "MOVWBR", LXMV, AMOVWBR,
425 "MOVW", LMOVW, AMOVW,
426 "MOVWU", LMOVW, AMOVWU,
427 "MOVMW", LMOVMW, AMOVMW,
428 "MOVFL", LMOVW, AMOVFL,
429
430 "MULLW", LADDW, AMULLW, /* includes multiply immediate 10-139 */
431 "MULLWV", LLOGW, AMULLWV,
432 "MULLWCC", LLOGW, AMULLWCC,
433 "MULLWVCC", LLOGW, AMULLWVCC,
434
435 "MULHW", LLOGW, AMULHW,
436 "MULHWCC", LLOGW, AMULHWCC,
437 "MULHWU", LLOGW, AMULHWU,
438 "MULHWUCC", LLOGW, AMULHWUCC,
439
440 "NEG", LABS, ANEG,
441 "NEGV", LABS, ANEGV,
442 "NEGCC", LABS, ANEGCC,
443 "NEGVCC", LABS, ANEGVCC,
444
445 "NOP", LNOP, ANOP, /* ori 0,0,0 */
446 "SYSCALL", LNOP, ASYSCALL,
447
448 "RETURN", LRETRN, ARETURN,
449 "RFI", LRETRN, ARFI,
450 "RFCI", LRETRN, ARFCI,
451
452 "DATA", LDATA, ADATA,
453 "END", LEND, AEND,
454 "TEXT", LTEXT, ATEXT,
455
456 /* IBM powerpc embedded */
457 "MACCHW", LMA, AMACCHW,
458 "MACCHWCC", LMA, AMACCHWCC,
459 "MACCHWS", LMA, AMACCHWS,
460 "MACCHWSCC", LMA, AMACCHWSCC,
461 "MACCHWSU", LMA, AMACCHWSU,
462 "MACCHWSUCC", LMA, AMACCHWSUCC,
463 "MACCHWSUV", LMA, AMACCHWSUV,
464 "MACCHWSUVCC", LMA, AMACCHWSUVCC,
465 "MACCHWSV", LMA, AMACCHWSV,
466 "MACCHWSVCC", LMA, AMACCHWSVCC,
467 "MACCHWU", LMA, AMACCHWU,
468 "MACCHWUCC", LMA, AMACCHWUCC,
469 "MACCHWUV", LMA, AMACCHWUV,
470 "MACCHWUVCC", LMA, AMACCHWUVCC,
471 "MACCHWV", LMA, AMACCHWV,
472 "MACCHWVCC", LMA, AMACCHWVCC,
473 "MACHHW", LMA, AMACHHW,
474 "MACHHWCC", LMA, AMACHHWCC,
475 "MACHHWS", LMA, AMACHHWS,
476 "MACHHWSCC", LMA, AMACHHWSCC,
477 "MACHHWSU", LMA, AMACHHWSU,
478 "MACHHWSUCC", LMA, AMACHHWSUCC,
479 "MACHHWSUV", LMA, AMACHHWSUV,
480 "MACHHWSUVCC", LMA, AMACHHWSUVCC,
481 "MACHHWSV", LMA, AMACHHWSV,
482 "MACHHWSVCC", LMA, AMACHHWSVCC,
483 "MACHHWU", LMA, AMACHHWU,
484 "MACHHWUCC", LMA, AMACHHWUCC,
485 "MACHHWUV", LMA, AMACHHWUV,
486 "MACHHWUVCC", LMA, AMACHHWUVCC,
487 "MACHHWV", LMA, AMACHHWV,
488 "MACHHWVCC", LMA, AMACHHWVCC,
489 "MACLHW", LMA, AMACLHW,
490 "MACLHWCC", LMA, AMACLHWCC,
491 "MACLHWS", LMA, AMACLHWS,
492 "MACLHWSCC", LMA, AMACLHWSCC,
493 "MACLHWSU", LMA, AMACLHWSU,
494 "MACLHWSUCC", LMA, AMACLHWSUCC,
495 "MACLHWSUV", LMA, AMACLHWSUV,
496 "MACLHWSUVCC", LMA, AMACLHWSUVCC,
497 "MACLHWSV", LMA, AMACLHWSV,
498 "MACLHWSVCC", LMA, AMACLHWSVCC,
499 "MACLHWU", LMA, AMACLHWU,
500 "MACLHWUCC", LMA, AMACLHWUCC,
501 "MACLHWUV", LMA, AMACLHWUV,
502 "MACLHWUVCC", LMA, AMACLHWUVCC,
503 "MACLHWV", LMA, AMACLHWV,
504 "MACLHWVCC", LMA, AMACLHWVCC,
505 "MULCHW", LLOGW, AMULCHW,
506 "MULCHWCC", LLOGW, AMULCHWCC,
507 "MULCHWU", LLOGW, AMULCHWU,
508 "MULCHWUCC", LLOGW, AMULCHWUCC,
509 "MULHHW", LLOGW, AMULHHW,
510 "MULHHWCC", LLOGW, AMULHHWCC,
511 "MULHHWU", LLOGW, AMULHHWU,
512 "MULHHWUCC", LLOGW, AMULHHWUCC,
513 "MULLHW", LLOGW, AMULLHW,
514 "MULLHWCC", LLOGW, AMULLHWCC,
515 "MULLHWU", LLOGW, AMULLHWU,
516 "MULLHWUCC", LLOGW, AMULLHWUCC,
517 "NMACCHW", LMA, ANMACCHW,
518 "NMACCHWCC", LMA, ANMACCHWCC,
519 "NMACCHWS", LMA, ANMACCHWS,
520 "NMACCHWSCC", LMA, ANMACCHWSCC,
521 "NMACCHWSV", LMA, ANMACCHWSV,
522 "NMACCHWSVCC", LMA, ANMACCHWSVCC,
523 "NMACCHWV", LMA, ANMACCHWV,
524 "NMACCHWVCC", LMA, ANMACCHWVCC,
525 "NMACHHW", LMA, ANMACHHW,
526 "NMACHHWCC", LMA, ANMACHHWCC,
527 "NMACHHWS", LMA, ANMACHHWS,
528 "NMACHHWSCC", LMA, ANMACHHWSCC,
529 "NMACHHWSV", LMA, ANMACHHWSV,
530 "NMACHHWSVCC", LMA, ANMACHHWSVCC,
531 "NMACHHWV", LMA, ANMACHHWV,
532 "NMACHHWVCC", LMA, ANMACHHWVCC,
533 "NMACLHW", LMA, ANMACLHW,
534 "NMACLHWCC", LMA, ANMACLHWCC,
535 "NMACLHWS", LMA, ANMACLHWS,
536 "NMACLHWSCC", LMA, ANMACLHWSCC,
537 "NMACLHWSV", LMA, ANMACLHWSV,
538 "NMACLHWSVCC", LMA, ANMACLHWSVCC,
539 "NMACLHWV", LMA, ANMACLHWV,
540 "NMACLHWVCC", LMA, ANMACLHWVCC,
541
542 /* optional on 32-bit */
543 "FRES", LFCONV, AFRES,
544 "FRESCC", LFCONV, AFRESCC,
545 "FRSQRTE", LFCONV, AFRSQRTE,
546 "FRSQRTECC", LFCONV, AFRSQRTECC,
547 "FSEL", LFMA, AFSEL,
548 "FSELCC", LFMA, AFSELCC,
549 "FSQRT", LFCONV, AFSQRT,
550 "FSQRTCC", LFCONV, AFSQRTCC,
551 "FSQRTS", LFCONV, AFSQRTS,
552 "FSQRTSCC", LFCONV, AFSQRTSCC,
553
554 /* parallel, cross, and secondary (fp2) */
555 "FPSEL", LFMA, AFPSEL,
556 "FPMUL", LFADD, AFPMUL,
557 "FXMUL", LFADD, AFXMUL,
558 "FXPMUL", LFADD, AFXPMUL,
559 "FXSMUL", LFADD, AFXSMUL,
560 "FPADD", LFADD, AFPADD,
561 "FPSUB", LFADD, AFPSUB,
562 "FPRE", LFCONV, AFPRE,
563 "FPRSQRTE", LFCONV, AFPRSQRTE,
564 "FPMADD", LFMA, AFPMADD,
565 "FXMADD", LFMA, AFXMADD,
566 "FXCPMADD", LFMA, AFXCPMADD,
567 "FXCSMADD", LFMA, AFXCSMADD,
568 "FPNMADD", LFMA, AFPNMADD,
569 "FXNMADD", LFMA, AFXNMADD,
570 "FXCPNMADD", LFMA, AFXCPNMADD,
571 "FXCSNMADD", LFMA, AFXCSNMADD,
572 "FPMSUB", LFMA, AFPMSUB,
573 "FXMSUB", LFMA, AFXMSUB,
574 "FXCPMSUB", LFMA, AFXCPMSUB,
575 "FXCSMSUB", LFMA, AFXCSMSUB,
576 "FPNMSUB", LFMA, AFPNMSUB,
577 "FXNMSUB", LFMA, AFXNMSUB,
578 "FXCPNMSUB", LFMA, AFXCPNMSUB,
579 "FXCSNMSUB", LFMA, AFXCSNMSUB,
580 "FPABS", LFCONV, AFPABS,
581 "FPNEG", LFCONV, AFPNEG,
582 "FPRSP", LFCONV, AFPRSP,
583 "FPNABS", LFCONV, AFPNABS,
584 "FSMOVD", LFMOV, AFSMOVD,
585 "FSCMP", LFCMP, AFSCMP,
586 "FSABS", LFCONV, AFSABS,
587 "FSNEG", LFCONV, AFSNEG,
588 "FSNABS", LFCONV, AFSNABS,
589 "FPCTIW", LFCONV, AFPCTIW,
590 "FPCTIWZ", LFCONV, AFPCTIWZ,
591 "FMOVSPD", LFCONV, AFMOVSPD,
592 "FMOVPSD", LFCONV, AFMOVPSD,
593 "FXCPNPMA", LFMA, AFXCPNPMA,
594 "FXCSNPMA", LFMA, AFXCSNPMA,
595 "FXCPNSMA", LFMA, AFXCPNSMA,
596 "FXCSNSMA", LFMA, AFXCSNSMA,
597 "FXCXNPMA", LFMA, AFXCXNPMA,
598 "FXCXNSMA", LFMA, AFXCXNSMA,
599 "FXCXMA", LFMA, AFXCXMA,
600 "FXCXNMS", LFMA, AFXCXNMS,
601
602 /* parallel, cross, and secondary load and store (fp2) */
603 "FSMOVS", LFMOVX, AFSMOVS,
604 "FSMOVSU", LFMOVX, AFSMOVSU,
605 "FSMOVD", LFMOVX, AFSMOVD,
606 "FSMOVDU", LFMOVX, AFSMOVDU,
607 "FXMOVS", LFMOVX, AFXMOVS,
608 "FXMOVSU", LFMOVX, AFXMOVSU,
609 "FXMOVD", LFMOVX, AFXMOVD,
610 "FXMOVDU", LFMOVX, AFXMOVDU,
611 "FPMOVS", LFMOVX, AFPMOVS,
612 "FPMOVSU", LFMOVX, AFPMOVSU,
613 "FPMOVD", LFMOVX, AFPMOVD,
614 "FPMOVDU", LFMOVX, AFPMOVDU,
615 "FPMOVIW", LFMOVX, AFPMOVIW,
616
617 "AFMOVSPD", LFMOV, AFMOVSPD,
618 "AFMOVPSD", LFMOV, AFMOVPSD,
619
620 /* special instructions */
621 "DCBF", LXOP, ADCBF,
622 "DCBI", LXOP, ADCBI,
623 "DCBST", LXOP, ADCBST,
624 "DCBT", LXOP, ADCBT,
625 "DCBTST", LXOP, ADCBTST,
626 "DCBZ", LXOP, ADCBZ,
627 "ICBI", LXOP, AICBI,
628
629 "ECIWX", LXLD, AECIWX,
630 "ECOWX", LXST, AECOWX,
631 "LWAR", LXLD, ALWAR,
632 "STWCCC", LXST, ASTWCCC,
633 "EIEIO", LRETRN, AEIEIO,
634 "TLBIE", LNOP, ATLBIE,
635 "LSW", LXLD, ALSW,
636 "STSW", LXST, ASTSW,
637
638 "ISYNC", LRETRN, AISYNC,
639 "SYNC", LRETRN, ASYNC,
640 /* "TW", LADDW, ATW,*/
641
642 "WORD", LWORD, AWORD,
643 "SCHED", LSCHED, 0,
644 "NOSCHED", LSCHED, 0x80,
645
646 0
647 };
648
649 void
cinit(void)650 cinit(void)
651 {
652 Sym *s;
653 int i;
654
655 nullgen.sym = S;
656 nullgen.offset = 0;
657 nullgen.type = D_NONE;
658 nullgen.name = D_NONE;
659 nullgen.reg = NREG;
660 nullgen.xreg = NREG;
661 if(FPCHIP)
662 nullgen.dval = 0;
663 for(i=0; i<sizeof(nullgen.sval); i++)
664 nullgen.sval[i] = 0;
665
666 nerrors = 0;
667 iostack = I;
668 iofree = I;
669 peekc = IGN;
670 nhunk = 0;
671 for(i=0; i<NHASH; i++)
672 hash[i] = S;
673 for(i=0; itab[i].name; i++) {
674 s = slookup(itab[i].name);
675 s->type = itab[i].type;
676 s->value = itab[i].value;
677 }
678 ALLOCN(pathname, 0, 100);
679 if(mygetwd(pathname, 99) == 0) {
680 ALLOCN(pathname, 100, 900);
681 if(mygetwd(pathname, 999) == 0)
682 strcpy(pathname, "/???");
683 }
684 }
685
686 void
syminit(Sym * s)687 syminit(Sym *s)
688 {
689
690 s->type = LNAME;
691 s->value = 0;
692 }
693
694 void
cclean(void)695 cclean(void)
696 {
697
698 outcode(AEND, &nullgen, NREG, &nullgen);
699 Bflush(&obuf);
700 }
701
702 void
zname(char * n,int t,int s)703 zname(char *n, int t, int s)
704 {
705
706 Bputc(&obuf, ANAME);
707 Bputc(&obuf, ANAME>>8);
708 Bputc(&obuf, t); /* type */
709 Bputc(&obuf, s); /* sym */
710 while(*n) {
711 Bputc(&obuf, *n);
712 n++;
713 }
714 Bputc(&obuf, 0);
715 }
716
717 void
zaddr(Gen * a,int s)718 zaddr(Gen *a, int s)
719 {
720 long l;
721 int i;
722 char *n;
723 Ieee e;
724
725 Bputc(&obuf, a->type);
726 Bputc(&obuf, a->reg);
727 Bputc(&obuf, s);
728 Bputc(&obuf, a->name);
729 switch(a->type) {
730 default:
731 print("unknown type %d\n", a->type);
732 exits("arg");
733
734 case D_NONE:
735 case D_REG:
736 case D_FREG:
737 case D_CREG:
738 case D_FPSCR:
739 case D_MSR:
740 case D_SREG:
741 case D_OPT:
742 break;
743
744 case D_DCR:
745 case D_SPR:
746 case D_OREG:
747 case D_CONST:
748 case D_BRANCH:
749 l = a->offset;
750 Bputc(&obuf, l);
751 Bputc(&obuf, l>>8);
752 Bputc(&obuf, l>>16);
753 Bputc(&obuf, l>>24);
754 break;
755
756 case D_SCONST:
757 n = a->sval;
758 for(i=0; i<NSNAME; i++) {
759 Bputc(&obuf, *n);
760 n++;
761 }
762 break;
763
764 case D_FCONST:
765 ieeedtod(&e, a->dval);
766 Bputc(&obuf, e.l);
767 Bputc(&obuf, e.l>>8);
768 Bputc(&obuf, e.l>>16);
769 Bputc(&obuf, e.l>>24);
770 Bputc(&obuf, e.h);
771 Bputc(&obuf, e.h>>8);
772 Bputc(&obuf, e.h>>16);
773 Bputc(&obuf, e.h>>24);
774 break;
775 }
776 }
777
778 int
outsim(Gen * g)779 outsim(Gen *g)
780 {
781 Sym *s;
782 int sno, t;
783
784 s = g->sym;
785 if(s == S)
786 return 0;
787 sno = s->sym;
788 if(sno < 0 || sno >= NSYM)
789 sno = 0;
790 t = g->name;
791 if(h[sno].type == t && h[sno].sym == s)
792 return sno;
793 zname(s->name, t, sym);
794 s->sym = sym;
795 h[sym].sym = s;
796 h[sym].type = t;
797 sno = sym;
798 sym++;
799 if(sym >= NSYM)
800 sym = 1;
801 return sno;
802 }
803
804 void
outcode(int a,Gen * g1,int reg,Gen * g2)805 outcode(int a, Gen *g1, int reg, Gen *g2)
806 {
807 int sf, st;
808
809 if(a != AGLOBL && a != ADATA)
810 pc++;
811 if(pass == 1)
812 return;
813 if(g1->xreg != NREG) {
814 if(reg != NREG || g2->xreg != NREG)
815 yyerror("bad addressing modes");
816 reg = g1->xreg;
817 } else
818 if(g2->xreg != NREG) {
819 if(reg != NREG)
820 yyerror("bad addressing modes");
821 reg = g2->xreg;
822 }
823 do {
824 sf = outsim(g1);
825 st = outsim(g2);
826 } while(sf != 0 && st == sf);
827 Bputc(&obuf, a);
828 Bputc(&obuf, a>>8);
829 Bputc(&obuf, reg|nosched);
830 Bputc(&obuf, lineno);
831 Bputc(&obuf, lineno>>8);
832 Bputc(&obuf, lineno>>16);
833 Bputc(&obuf, lineno>>24);
834 zaddr(g1, sf);
835 zaddr(g2, st);
836 }
837
838 void
outgcode(int a,Gen * g1,int reg,Gen * g2,Gen * g3)839 outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
840 {
841 int s1, s2, s3, flag;
842
843 if(a != AGLOBL && a != ADATA)
844 pc++;
845 if(pass == 1)
846 return;
847 do {
848 s1 = outsim(g1);
849 s2 = outsim(g2);
850 s3 = outsim(g3);
851 } while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
852 flag = 0;
853 if(g2->type != D_NONE)
854 flag = 0x40; /* flags extra operand */
855 Bputc(&obuf, a);
856 Bputc(&obuf, a>>8);
857 Bputc(&obuf, reg | nosched | flag);
858 Bputc(&obuf, lineno);
859 Bputc(&obuf, lineno>>8);
860 Bputc(&obuf, lineno>>16);
861 Bputc(&obuf, lineno>>24);
862 zaddr(g1, s1);
863 if(flag)
864 zaddr(g2, s2);
865 zaddr(g3, s3);
866 }
867
868 void
outhist(void)869 outhist(void)
870 {
871 Gen g;
872 Hist *h;
873 char *p, *q, *op, c;
874 int n;
875
876 g = nullgen;
877 c = pathchar();
878 for(h = hist; h != H; h = h->link) {
879 p = h->name;
880 op = 0;
881 /* on windows skip drive specifier in pathname */
882 if(systemtype(Windows) && p && p[1] == ':'){
883 p += 2;
884 c = *p;
885 }
886 if(p && p[0] != c && h->offset == 0 && pathname){
887 /* on windows skip drive specifier in pathname */
888 if(systemtype(Windows) && pathname[1] == ':') {
889 op = p;
890 p = pathname+2;
891 c = *p;
892 } else if(pathname[0] == c){
893 op = p;
894 p = pathname;
895 }
896 }
897 while(p) {
898 q = strchr(p, c);
899 if(q) {
900 n = q-p;
901 if(n == 0){
902 n = 1; /* leading "/" */
903 *p = '/'; /* don't emit "\" on windows */
904 }
905 q++;
906 } else {
907 n = strlen(p);
908 q = 0;
909 }
910 if(n) {
911 Bputc(&obuf, ANAME);
912 Bputc(&obuf, ANAME>>8);
913 Bputc(&obuf, D_FILE); /* type */
914 Bputc(&obuf, 1); /* sym */
915 Bputc(&obuf, '<');
916 Bwrite(&obuf, p, n);
917 Bputc(&obuf, 0);
918 }
919 p = q;
920 if(p == 0 && op) {
921 p = op;
922 op = 0;
923 }
924 }
925 g.offset = h->offset;
926
927 Bputc(&obuf, AHISTORY);
928 Bputc(&obuf, AHISTORY>>8);
929 Bputc(&obuf, 0);
930 Bputc(&obuf, h->line);
931 Bputc(&obuf, h->line>>8);
932 Bputc(&obuf, h->line>>16);
933 Bputc(&obuf, h->line>>24);
934 zaddr(&nullgen, 0);
935 zaddr(&g, 0);
936 }
937 }
938
939 #include "../cc/lexbody"
940 #include "../cc/macbody"
941 #include "../cc/compat"
942