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 = '6';
13 thestring = "amd64";
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 && !systemtype(Windows)) {
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 p = utfrrune(ofile, pathchar());
100 if(p) {
101 include[0] = ofile;
102 *p++ = 0;
103 } else
104 p = ofile;
105 if(outfile == 0) {
106 outfile = p;
107 if(outfile){
108 p = utfrrune(outfile, '.');
109 if(p)
110 if(p[1] == 's' && p[2] == 0)
111 p[0] = 0;
112 p = utfrune(outfile, 0);
113 p[0] = '.';
114 p[1] = thechar;
115 p[2] = 0;
116 } else
117 outfile = "/dev/null";
118 }
119 p = getenv("INCLUDE");
120 if(p) {
121 setinclude(p);
122 } else {
123 if(systemtype(Plan9)) {
124 sprint(incfile,"/%s/include", thestring);
125 setinclude(strdup(incfile));
126 }
127 }
128
129 of = mycreat(outfile, 0664);
130 if(of < 0) {
131 yyerror("%ca: cannot create %s", thechar, outfile);
132 errorexit();
133 }
134 Binit(&obuf, of, OWRITE);
135
136 pass = 1;
137 pinit(file);
138 for(i=0; i<nDlist; i++)
139 dodefine(Dlist[i]);
140 yyparse();
141 if(nerrors) {
142 cclean();
143 return nerrors;
144 }
145
146 pass = 2;
147 outhist();
148 pinit(file);
149 for(i=0; i<nDlist; i++)
150 dodefine(Dlist[i]);
151 yyparse();
152 cclean();
153 return nerrors;
154 }
155
156 struct
157 {
158 char *name;
159 ushort type;
160 ushort value;
161 } itab[] =
162 {
163 "SP", LSP, D_AUTO,
164 "SB", LSB, D_EXTERN,
165 "FP", LFP, D_PARAM,
166 "PC", LPC, D_BRANCH,
167
168 "AL", LBREG, D_AL,
169 "CL", LBREG, D_CL,
170 "DL", LBREG, D_DL,
171 "BL", LBREG, D_BL,
172 /* "SPB", LBREG, D_SPB, */
173 "SIB", LBREG, D_SIB,
174 "DIB", LBREG, D_DIB,
175 "BPB", LBREG, D_BPB,
176 "R8B", LBREG, D_R8B,
177 "R9B", LBREG, D_R9B,
178 "R10B", LBREG, D_R10B,
179 "R11B", LBREG, D_R11B,
180 "R12B", LBREG, D_R12B,
181 "R13B", LBREG, D_R13B,
182 "R14B", LBREG, D_R14B,
183 "R15B", LBREG, D_R15B,
184
185 "AH", LBREG, D_AH,
186 "CH", LBREG, D_CH,
187 "DH", LBREG, D_DH,
188 "BH", LBREG, D_BH,
189
190 "AX", LLREG, D_AX,
191 "CX", LLREG, D_CX,
192 "DX", LLREG, D_DX,
193 "BX", LLREG, D_BX,
194 /* "SP", LLREG, D_SP, */
195 "BP", LLREG, D_BP,
196 "SI", LLREG, D_SI,
197 "DI", LLREG, D_DI,
198 "R8", LLREG, D_R8,
199 "R9", LLREG, D_R9,
200 "R10", LLREG, D_R10,
201 "R11", LLREG, D_R11,
202 "R12", LLREG, D_R12,
203 "R13", LLREG, D_R13,
204 "R14", LLREG, D_R14,
205 "R15", LLREG, D_R15,
206
207 "RARG", LLREG, REGARG,
208
209 "F0", LFREG, D_F0+0,
210 "F1", LFREG, D_F0+1,
211 "F2", LFREG, D_F0+2,
212 "F3", LFREG, D_F0+3,
213 "F4", LFREG, D_F0+4,
214 "F5", LFREG, D_F0+5,
215 "F6", LFREG, D_F0+6,
216 "F7", LFREG, D_F0+7,
217
218 "M0", LMREG, D_M0+0,
219 "M1", LMREG, D_M0+1,
220 "M2", LMREG, D_M0+2,
221 "M3", LMREG, D_M0+3,
222 "M4", LMREG, D_M0+4,
223 "M5", LMREG, D_M0+5,
224 "M6", LMREG, D_M0+6,
225 "M7", LMREG, D_M0+7,
226
227 "X0", LXREG, D_X0+0,
228 "X1", LXREG, D_X0+1,
229 "X2", LXREG, D_X0+2,
230 "X3", LXREG, D_X0+3,
231 "X4", LXREG, D_X0+4,
232 "X5", LXREG, D_X0+5,
233 "X6", LXREG, D_X0+6,
234 "X7", LXREG, D_X0+7,
235 "X8", LXREG, D_X0+8,
236 "X9", LXREG, D_X0+9,
237 "X10", LXREG, D_X0+10,
238 "X11", LXREG, D_X0+11,
239 "X12", LXREG, D_X0+12,
240 "X13", LXREG, D_X0+13,
241 "X14", LXREG, D_X0+14,
242 "X15", LXREG, D_X0+15,
243
244 "CS", LSREG, D_CS,
245 "SS", LSREG, D_SS,
246 "DS", LSREG, D_DS,
247 "ES", LSREG, D_ES,
248 "FS", LSREG, D_FS,
249 "GS", LSREG, D_GS,
250
251 "GDTR", LBREG, D_GDTR,
252 "IDTR", LBREG, D_IDTR,
253 "LDTR", LBREG, D_LDTR,
254 "MSW", LBREG, D_MSW,
255 "TASK", LBREG, D_TASK,
256
257 "CR0", LBREG, D_CR+0,
258 "CR1", LBREG, D_CR+1,
259 "CR2", LBREG, D_CR+2,
260 "CR3", LBREG, D_CR+3,
261 "CR4", LBREG, D_CR+4,
262 "CR5", LBREG, D_CR+5,
263 "CR6", LBREG, D_CR+6,
264 "CR7", LBREG, D_CR+7,
265 "CR8", LBREG, D_CR+8,
266 "CR9", LBREG, D_CR+9,
267 "CR10", LBREG, D_CR+10,
268 "CR11", LBREG, D_CR+11,
269 "CR12", LBREG, D_CR+12,
270 "CR13", LBREG, D_CR+13,
271 "CR14", LBREG, D_CR+14,
272 "CR15", LBREG, D_CR+15,
273
274 "DR0", LBREG, D_DR+0,
275 "DR1", LBREG, D_DR+1,
276 "DR2", LBREG, D_DR+2,
277 "DR3", LBREG, D_DR+3,
278 "DR4", LBREG, D_DR+4,
279 "DR5", LBREG, D_DR+5,
280 "DR6", LBREG, D_DR+6,
281 "DR7", LBREG, D_DR+7,
282
283 "TR0", LBREG, D_TR+0,
284 "TR1", LBREG, D_TR+1,
285 "TR2", LBREG, D_TR+2,
286 "TR3", LBREG, D_TR+3,
287 "TR4", LBREG, D_TR+4,
288 "TR5", LBREG, D_TR+5,
289 "TR6", LBREG, D_TR+6,
290 "TR7", LBREG, D_TR+7,
291
292 "AAA", LTYPE0, AAAA,
293 "AAD", LTYPE0, AAAD,
294 "AAM", LTYPE0, AAAM,
295 "AAS", LTYPE0, AAAS,
296 "ADCB", LTYPE3, AADCB,
297 "ADCL", LTYPE3, AADCL,
298 "ADCQ", LTYPE3, AADCQ,
299 "ADCW", LTYPE3, AADCW,
300 "ADDB", LTYPE3, AADDB,
301 "ADDL", LTYPE3, AADDL,
302 "ADDQ", LTYPE3, AADDQ,
303 "ADDW", LTYPE3, AADDW,
304 "ADJSP", LTYPE2, AADJSP,
305 "ANDB", LTYPE3, AANDB,
306 "ANDL", LTYPE3, AANDL,
307 "ANDQ", LTYPE3, AANDQ,
308 "ANDW", LTYPE3, AANDW,
309 "ARPL", LTYPE3, AARPL,
310 "BOUNDL", LTYPE3, ABOUNDL,
311 "BOUNDW", LTYPE3, ABOUNDW,
312 "BSFL", LTYPE3, ABSFL,
313 "BSFQ", LTYPE3, ABSFQ,
314 "BSFW", LTYPE3, ABSFW,
315 "BSRL", LTYPE3, ABSRL,
316 "BSRQ", LTYPE3, ABSRQ,
317 "BSRW", LTYPE3, ABSRW,
318 "BTCL", LTYPE3, ABTCL,
319 "BTCQ", LTYPE3, ABTCQ,
320 "BTCW", LTYPE3, ABTCW,
321 "BTL", LTYPE3, ABTL,
322 "BTQ", LTYPE3, ABTQ,
323 "BTRL", LTYPE3, ABTRL,
324 "BTRQ", LTYPE3, ABTRQ,
325 "BTRW", LTYPE3, ABTRW,
326 "BTSL", LTYPE3, ABTSL,
327 "BTSQ", LTYPE3, ABTSQ,
328 "BTSW", LTYPE3, ABTSW,
329 "BTW", LTYPE3, ABTW,
330 "BYTE", LTYPE2, ABYTE,
331 "CALL", LTYPEC, ACALL,
332 "CLC", LTYPE0, ACLC,
333 "CLD", LTYPE0, ACLD,
334 "CLI", LTYPE0, ACLI,
335 "CLTS", LTYPE0, ACLTS,
336 "CMC", LTYPE0, ACMC,
337 "CMPB", LTYPE4, ACMPB,
338 "CMPL", LTYPE4, ACMPL,
339 "CMPQ", LTYPE4, ACMPQ,
340 "CMPW", LTYPE4, ACMPW,
341 "CMPSB", LTYPE0, ACMPSB,
342 "CMPSL", LTYPE0, ACMPSL,
343 "CMPSQ", LTYPE0, ACMPSQ,
344 "CMPSW", LTYPE0, ACMPSW,
345 "CMPXCHG8B", LTYPE1, ACMPXCHG8B,
346 "CMPXCHGB", LTYPE3, ACMPXCHGB, /* LTYPE3? */
347 "CMPXCHGL", LTYPE3, ACMPXCHGL,
348 "CMPXCHGQ", LTYPE3, ACMPXCHGQ,
349 "CMPXCHGW", LTYPE3, ACMPXCHGW,
350 "CPUID", LTYPE0, ACPUID,
351 "DAA", LTYPE0, ADAA,
352 "DAS", LTYPE0, ADAS,
353 "DATA", LTYPED, ADATA,
354 "DECB", LTYPE1, ADECB,
355 "DECL", LTYPE1, ADECL,
356 "DECQ", LTYPE1, ADECQ,
357 "DECW", LTYPE1, ADECW,
358 "DIVB", LTYPE2, ADIVB,
359 "DIVL", LTYPE2, ADIVL,
360 "DIVQ", LTYPE2, ADIVQ,
361 "DIVW", LTYPE2, ADIVW,
362 "EMMS", LTYPE0, AEMMS,
363 "END", LTYPE0, AEND,
364 "ENTER", LTYPE2, AENTER,
365 "GLOBL", LTYPET, AGLOBL,
366 "HLT", LTYPE0, AHLT,
367 "IDIVB", LTYPE2, AIDIVB,
368 "IDIVL", LTYPE2, AIDIVL,
369 "IDIVQ", LTYPE2, AIDIVQ,
370 "IDIVW", LTYPE2, AIDIVW,
371 "IMULB", LTYPEI, AIMULB,
372 "IMULL", LTYPEI, AIMULL,
373 "IMULQ", LTYPEI, AIMULQ,
374 "IMULW", LTYPEI, AIMULW,
375 "INB", LTYPE0, AINB,
376 "INL", LTYPE0, AINL,
377 "INW", LTYPE0, AINW,
378 "INCB", LTYPE1, AINCB,
379 "INCL", LTYPE1, AINCL,
380 "INCQ", LTYPE1, AINCQ,
381 "INCW", LTYPE1, AINCW,
382 "INSB", LTYPE0, AINSB,
383 "INSL", LTYPE0, AINSL,
384 "INSW", LTYPE0, AINSW,
385 "INT", LTYPE2, AINT,
386 "INTO", LTYPE0, AINTO,
387 "INVD", LTYPE0, AINVD,
388 "INVLPG", LTYPE2, AINVLPG,
389 "IRETL", LTYPE0, AIRETL,
390 "IRETQ", LTYPE0, AIRETQ,
391 "IRETW", LTYPE0, AIRETW,
392
393 "JOS", LTYPER, AJOS,
394 "JO", LTYPER, AJOS, /* alternate */
395 "JOC", LTYPER, AJOC,
396 "JNO", LTYPER, AJOC, /* alternate */
397 "JCS", LTYPER, AJCS,
398 "JB", LTYPER, AJCS, /* alternate */
399 "JC", LTYPER, AJCS, /* alternate */
400 "JNAE", LTYPER, AJCS, /* alternate */
401 "JLO", LTYPER, AJCS, /* alternate */
402 "JCC", LTYPER, AJCC,
403 "JAE", LTYPER, AJCC, /* alternate */
404 "JNB", LTYPER, AJCC, /* alternate */
405 "JNC", LTYPER, AJCC, /* alternate */
406 "JHS", LTYPER, AJCC, /* alternate */
407 "JEQ", LTYPER, AJEQ,
408 "JE", LTYPER, AJEQ, /* alternate */
409 "JZ", LTYPER, AJEQ, /* alternate */
410 "JNE", LTYPER, AJNE,
411 "JNZ", LTYPER, AJNE, /* alternate */
412 "JLS", LTYPER, AJLS,
413 "JBE", LTYPER, AJLS, /* alternate */
414 "JNA", LTYPER, AJLS, /* alternate */
415 "JHI", LTYPER, AJHI,
416 "JA", LTYPER, AJHI, /* alternate */
417 "JNBE", LTYPER, AJHI, /* alternate */
418 "JMI", LTYPER, AJMI,
419 "JS", LTYPER, AJMI, /* alternate */
420 "JPL", LTYPER, AJPL,
421 "JNS", LTYPER, AJPL, /* alternate */
422 "JPS", LTYPER, AJPS,
423 "JP", LTYPER, AJPS, /* alternate */
424 "JPE", LTYPER, AJPS, /* alternate */
425 "JPC", LTYPER, AJPC,
426 "JNP", LTYPER, AJPC, /* alternate */
427 "JPO", LTYPER, AJPC, /* alternate */
428 "JLT", LTYPER, AJLT,
429 "JL", LTYPER, AJLT, /* alternate */
430 "JNGE", LTYPER, AJLT, /* alternate */
431 "JGE", LTYPER, AJGE,
432 "JNL", LTYPER, AJGE, /* alternate */
433 "JLE", LTYPER, AJLE,
434 "JNG", LTYPER, AJLE, /* alternate */
435 "JGT", LTYPER, AJGT,
436 "JG", LTYPER, AJGT, /* alternate */
437 "JNLE", LTYPER, AJGT, /* alternate */
438
439 "JCXZ", LTYPER, AJCXZ,
440 "JMP", LTYPEC, AJMP,
441 "LAHF", LTYPE0, ALAHF,
442 "LARL", LTYPE3, ALARL,
443 "LARW", LTYPE3, ALARW,
444 "LEAL", LTYPE3, ALEAL,
445 "LEAQ", LTYPE3, ALEAQ,
446 "LEAW", LTYPE3, ALEAW,
447 "LEAVEL", LTYPE0, ALEAVEL,
448 "LEAVEQ", LTYPE0, ALEAVEQ,
449 "LEAVEW", LTYPE0, ALEAVEW,
450 "LFENCE", LTYPE0, ALFENCE,
451 "LOCK", LTYPE0, ALOCK,
452 "LODSB", LTYPE0, ALODSB,
453 "LODSL", LTYPE0, ALODSL,
454 "LODSQ", LTYPE0, ALODSQ,
455 "LODSW", LTYPE0, ALODSW,
456 "LONG", LTYPE2, ALONG,
457 "LOOP", LTYPER, ALOOP,
458 "LOOPEQ", LTYPER, ALOOPEQ,
459 "LOOPNE", LTYPER, ALOOPNE,
460 "LSLL", LTYPE3, ALSLL,
461 "LSLW", LTYPE3, ALSLW,
462 "MFENCE", LTYPE0, AMFENCE,
463 "MODE", LTYPE2, AMODE,
464 "MOVB", LTYPE3, AMOVB,
465 "MOVL", LTYPEM, AMOVL,
466 "MOVQ", LTYPEM, AMOVQ,
467 "MOVW", LTYPEM, AMOVW,
468 "MOVBLSX", LTYPE3, AMOVBLSX,
469 "MOVBLZX", LTYPE3, AMOVBLZX,
470 "MOVBQSX", LTYPE3, AMOVBQSX,
471 "MOVBQZX", LTYPE3, AMOVBQZX,
472 "MOVBWSX", LTYPE3, AMOVBWSX,
473 "MOVBWZX", LTYPE3, AMOVBWZX,
474 "MOVLQSX", LTYPE3, AMOVLQSX,
475 "MOVLQZX", LTYPE3, AMOVLQZX,
476 "MOVNTIL", LTYPE3, AMOVNTIL,
477 "MOVNTIQ", LTYPE3, AMOVNTIQ,
478 "MOVWLSX", LTYPE3, AMOVWLSX,
479 "MOVWLZX", LTYPE3, AMOVWLZX,
480 "MOVWQSX", LTYPE3, AMOVWQSX,
481 "MOVWQZX", LTYPE3, AMOVWQZX,
482 "MOVSB", LTYPE0, AMOVSB,
483 "MOVSL", LTYPE0, AMOVSL,
484 "MOVSQ", LTYPE0, AMOVSQ,
485 "MOVSW", LTYPE0, AMOVSW,
486 "MULB", LTYPE2, AMULB,
487 "MULL", LTYPE2, AMULL,
488 "MULQ", LTYPE2, AMULQ,
489 "MULW", LTYPE2, AMULW,
490 "NEGB", LTYPE1, ANEGB,
491 "NEGL", LTYPE1, ANEGL,
492 "NEGQ", LTYPE1, ANEGQ,
493 "NEGW", LTYPE1, ANEGW,
494 "NOP", LTYPEN, ANOP,
495 "NOTB", LTYPE1, ANOTB,
496 "NOTL", LTYPE1, ANOTL,
497 "NOTQ", LTYPE1, ANOTQ,
498 "NOTW", LTYPE1, ANOTW,
499 "ORB", LTYPE3, AORB,
500 "ORL", LTYPE3, AORL,
501 "ORQ", LTYPE3, AORQ,
502 "ORW", LTYPE3, AORW,
503 "OUTB", LTYPE0, AOUTB,
504 "OUTL", LTYPE0, AOUTL,
505 "OUTW", LTYPE0, AOUTW,
506 "OUTSB", LTYPE0, AOUTSB,
507 "OUTSL", LTYPE0, AOUTSL,
508 "OUTSW", LTYPE0, AOUTSW,
509 "POPAL", LTYPE0, APOPAL,
510 "POPAW", LTYPE0, APOPAW,
511 "POPFL", LTYPE0, APOPFL,
512 "POPFQ", LTYPE0, APOPFQ,
513 "POPFW", LTYPE0, APOPFW,
514 "POPL", LTYPE1, APOPL,
515 "POPQ", LTYPE1, APOPQ,
516 "POPW", LTYPE1, APOPW,
517 "PUSHAL", LTYPE0, APUSHAL,
518 "PUSHAW", LTYPE0, APUSHAW,
519 "PUSHFL", LTYPE0, APUSHFL,
520 "PUSHFQ", LTYPE0, APUSHFQ,
521 "PUSHFW", LTYPE0, APUSHFW,
522 "PUSHL", LTYPE2, APUSHL,
523 "PUSHQ", LTYPE2, APUSHQ,
524 "PUSHW", LTYPE2, APUSHW,
525 "RCLB", LTYPE3, ARCLB,
526 "RCLL", LTYPE3, ARCLL,
527 "RCLQ", LTYPE3, ARCLQ,
528 "RCLW", LTYPE3, ARCLW,
529 "RCRB", LTYPE3, ARCRB,
530 "RCRL", LTYPE3, ARCRL,
531 "RCRQ", LTYPE3, ARCRQ,
532 "RCRW", LTYPE3, ARCRW,
533 "RDMSR", LTYPE0, ARDMSR,
534 "RDPMC", LTYPE0, ARDPMC,
535 "RDTSC", LTYPE0, ARDTSC,
536 "REP", LTYPE0, AREP,
537 "REPN", LTYPE0, AREPN,
538 "RET", LTYPE0, ARET,
539 "RETFL", LTYPERT,ARETFL,
540 "RETFW", LTYPERT,ARETFW,
541 "RETFQ", LTYPERT,ARETFQ,
542 "ROLB", LTYPE3, AROLB,
543 "ROLL", LTYPE3, AROLL,
544 "ROLQ", LTYPE3, AROLQ,
545 "ROLW", LTYPE3, AROLW,
546 "RORB", LTYPE3, ARORB,
547 "RORL", LTYPE3, ARORL,
548 "RORQ", LTYPE3, ARORQ,
549 "RORW", LTYPE3, ARORW,
550 "RSM", LTYPE0, ARSM,
551 "SAHF", LTYPE0, ASAHF,
552 "SALB", LTYPE3, ASALB,
553 "SALL", LTYPE3, ASALL,
554 "SALQ", LTYPE3, ASALQ,
555 "SALW", LTYPE3, ASALW,
556 "SARB", LTYPE3, ASARB,
557 "SARL", LTYPE3, ASARL,
558 "SARQ", LTYPE3, ASARQ,
559 "SARW", LTYPE3, ASARW,
560 "SBBB", LTYPE3, ASBBB,
561 "SBBL", LTYPE3, ASBBL,
562 "SBBQ", LTYPE3, ASBBQ,
563 "SBBW", LTYPE3, ASBBW,
564 "SCASB", LTYPE0, ASCASB,
565 "SCASL", LTYPE0, ASCASL,
566 "SCASQ", LTYPE0, ASCASQ,
567 "SCASW", LTYPE0, ASCASW,
568 "SETCC", LTYPE1, ASETCC,
569 "SETCS", LTYPE1, ASETCS,
570 "SETEQ", LTYPE1, ASETEQ,
571 "SETGE", LTYPE1, ASETGE,
572 "SETGT", LTYPE1, ASETGT,
573 "SETHI", LTYPE1, ASETHI,
574 "SETLE", LTYPE1, ASETLE,
575 "SETLS", LTYPE1, ASETLS,
576 "SETLT", LTYPE1, ASETLT,
577 "SETMI", LTYPE1, ASETMI,
578 "SETNE", LTYPE1, ASETNE,
579 "SETOC", LTYPE1, ASETOC,
580 "SETOS", LTYPE1, ASETOS,
581 "SETPC", LTYPE1, ASETPC,
582 "SETPL", LTYPE1, ASETPL,
583 "SETPS", LTYPE1, ASETPS,
584 "SFENCE", LTYPE0, ASFENCE,
585 "CDQ", LTYPE0, ACDQ,
586 "CWD", LTYPE0, ACWD,
587 "CQO", LTYPE0, ACQO,
588 "SHLB", LTYPE3, ASHLB,
589 "SHLL", LTYPES, ASHLL,
590 "SHLQ", LTYPES, ASHLQ,
591 "SHLW", LTYPES, ASHLW,
592 "SHRB", LTYPE3, ASHRB,
593 "SHRL", LTYPES, ASHRL,
594 "SHRQ", LTYPES, ASHRQ,
595 "SHRW", LTYPES, ASHRW,
596 "STC", LTYPE0, ASTC,
597 "STD", LTYPE0, ASTD,
598 "STI", LTYPE0, ASTI,
599 "STOSB", LTYPE0, ASTOSB,
600 "STOSL", LTYPE0, ASTOSL,
601 "STOSQ", LTYPE0, ASTOSQ,
602 "STOSW", LTYPE0, ASTOSW,
603 "SUBB", LTYPE3, ASUBB,
604 "SUBL", LTYPE3, ASUBL,
605 "SUBQ", LTYPE3, ASUBQ,
606 "SUBW", LTYPE3, ASUBW,
607 "SYSCALL", LTYPE0, ASYSCALL,
608 "SYSRET", LTYPE0, ASYSRET,
609 "SWAPGS", LTYPE0, ASWAPGS,
610 "TESTB", LTYPE3, ATESTB,
611 "TESTL", LTYPE3, ATESTL,
612 "TESTQ", LTYPE3, ATESTQ,
613 "TESTW", LTYPE3, ATESTW,
614 "TEXT", LTYPET, ATEXT,
615 "VERR", LTYPE2, AVERR,
616 "VERW", LTYPE2, AVERW,
617 "QUAD", LTYPE2, AQUAD,
618 "WAIT", LTYPE0, AWAIT,
619 "WBINVD", LTYPE0, AWBINVD,
620 "WRMSR", LTYPE0, AWRMSR,
621 "WORD", LTYPE2, AWORD,
622 "XADDB", LTYPE3, AXADDB,
623 "XADDL", LTYPE3, AXADDL,
624 "XADDQ", LTYPE3, AXADDQ,
625 "XADDW", LTYPE3, AXADDW,
626 "XCHGB", LTYPE3, AXCHGB,
627 "XCHGL", LTYPE3, AXCHGL,
628 "XCHGQ", LTYPE3, AXCHGQ,
629 "XCHGW", LTYPE3, AXCHGW,
630 "XLAT", LTYPE2, AXLAT,
631 "XORB", LTYPE3, AXORB,
632 "XORL", LTYPE3, AXORL,
633 "XORQ", LTYPE3, AXORQ,
634 "XORW", LTYPE3, AXORW,
635
636 "CMOVLCC", LTYPE3, ACMOVLCC,
637 "CMOVLCS", LTYPE3, ACMOVLCS,
638 "CMOVLEQ", LTYPE3, ACMOVLEQ,
639 "CMOVLGE", LTYPE3, ACMOVLGE,
640 "CMOVLGT", LTYPE3, ACMOVLGT,
641 "CMOVLHI", LTYPE3, ACMOVLHI,
642 "CMOVLLE", LTYPE3, ACMOVLLE,
643 "CMOVLLS", LTYPE3, ACMOVLLS,
644 "CMOVLLT", LTYPE3, ACMOVLLT,
645 "CMOVLMI", LTYPE3, ACMOVLMI,
646 "CMOVLNE", LTYPE3, ACMOVLNE,
647 "CMOVLOC", LTYPE3, ACMOVLOC,
648 "CMOVLOS", LTYPE3, ACMOVLOS,
649 "CMOVLPC", LTYPE3, ACMOVLPC,
650 "CMOVLPL", LTYPE3, ACMOVLPL,
651 "CMOVLPS", LTYPE3, ACMOVLPS,
652 "CMOVQCC", LTYPE3, ACMOVQCC,
653 "CMOVQCS", LTYPE3, ACMOVQCS,
654 "CMOVQEQ", LTYPE3, ACMOVQEQ,
655 "CMOVQGE", LTYPE3, ACMOVQGE,
656 "CMOVQGT", LTYPE3, ACMOVQGT,
657 "CMOVQHI", LTYPE3, ACMOVQHI,
658 "CMOVQLE", LTYPE3, ACMOVQLE,
659 "CMOVQLS", LTYPE3, ACMOVQLS,
660 "CMOVQLT", LTYPE3, ACMOVQLT,
661 "CMOVQMI", LTYPE3, ACMOVQMI,
662 "CMOVQNE", LTYPE3, ACMOVQNE,
663 "CMOVQOC", LTYPE3, ACMOVQOC,
664 "CMOVQOS", LTYPE3, ACMOVQOS,
665 "CMOVQPC", LTYPE3, ACMOVQPC,
666 "CMOVQPL", LTYPE3, ACMOVQPL,
667 "CMOVQPS", LTYPE3, ACMOVQPS,
668 "CMOVWCC", LTYPE3, ACMOVWCC,
669 "CMOVWCS", LTYPE3, ACMOVWCS,
670 "CMOVWEQ", LTYPE3, ACMOVWEQ,
671 "CMOVWGE", LTYPE3, ACMOVWGE,
672 "CMOVWGT", LTYPE3, ACMOVWGT,
673 "CMOVWHI", LTYPE3, ACMOVWHI,
674 "CMOVWLE", LTYPE3, ACMOVWLE,
675 "CMOVWLS", LTYPE3, ACMOVWLS,
676 "CMOVWLT", LTYPE3, ACMOVWLT,
677 "CMOVWMI", LTYPE3, ACMOVWMI,
678 "CMOVWNE", LTYPE3, ACMOVWNE,
679 "CMOVWOC", LTYPE3, ACMOVWOC,
680 "CMOVWOS", LTYPE3, ACMOVWOS,
681 "CMOVWPC", LTYPE3, ACMOVWPC,
682 "CMOVWPL", LTYPE3, ACMOVWPL,
683 "CMOVWPS", LTYPE3, ACMOVWPS,
684
685 "FMOVB", LTYPE3, AFMOVB,
686 "FMOVBP", LTYPE3, AFMOVBP,
687 "FMOVD", LTYPE3, AFMOVD,
688 "FMOVDP", LTYPE3, AFMOVDP,
689 "FMOVF", LTYPE3, AFMOVF,
690 "FMOVFP", LTYPE3, AFMOVFP,
691 "FMOVL", LTYPE3, AFMOVL,
692 "FMOVLP", LTYPE3, AFMOVLP,
693 "FMOVV", LTYPE3, AFMOVV,
694 "FMOVVP", LTYPE3, AFMOVVP,
695 "FMOVW", LTYPE3, AFMOVW,
696 "FMOVWP", LTYPE3, AFMOVWP,
697 "FMOVX", LTYPE3, AFMOVX,
698 "FMOVXP", LTYPE3, AFMOVXP,
699 "FCOMB", LTYPE3, AFCOMB,
700 "FCOMBP", LTYPE3, AFCOMBP,
701 "FCOMD", LTYPE3, AFCOMD,
702 "FCOMDP", LTYPE3, AFCOMDP,
703 "FCOMDPP", LTYPE3, AFCOMDPP,
704 "FCOMF", LTYPE3, AFCOMF,
705 "FCOMFP", LTYPE3, AFCOMFP,
706 "FCOML", LTYPE3, AFCOML,
707 "FCOMLP", LTYPE3, AFCOMLP,
708 "FCOMW", LTYPE3, AFCOMW,
709 "FCOMWP", LTYPE3, AFCOMWP,
710 "FUCOM", LTYPE3, AFUCOM,
711 "FUCOMP", LTYPE3, AFUCOMP,
712 "FUCOMPP", LTYPE3, AFUCOMPP,
713 "FADDW", LTYPE3, AFADDW,
714 "FADDL", LTYPE3, AFADDL,
715 "FADDF", LTYPE3, AFADDF,
716 "FADDD", LTYPE3, AFADDD,
717 "FADDDP", LTYPE3, AFADDDP,
718 "FSUBDP", LTYPE3, AFSUBDP,
719 "FSUBW", LTYPE3, AFSUBW,
720 "FSUBL", LTYPE3, AFSUBL,
721 "FSUBF", LTYPE3, AFSUBF,
722 "FSUBD", LTYPE3, AFSUBD,
723 "FSUBRDP", LTYPE3, AFSUBRDP,
724 "FSUBRW", LTYPE3, AFSUBRW,
725 "FSUBRL", LTYPE3, AFSUBRL,
726 "FSUBRF", LTYPE3, AFSUBRF,
727 "FSUBRD", LTYPE3, AFSUBRD,
728 "FMULDP", LTYPE3, AFMULDP,
729 "FMULW", LTYPE3, AFMULW,
730 "FMULL", LTYPE3, AFMULL,
731 "FMULF", LTYPE3, AFMULF,
732 "FMULD", LTYPE3, AFMULD,
733 "FDIVDP", LTYPE3, AFDIVDP,
734 "FDIVW", LTYPE3, AFDIVW,
735 "FDIVL", LTYPE3, AFDIVL,
736 "FDIVF", LTYPE3, AFDIVF,
737 "FDIVD", LTYPE3, AFDIVD,
738 "FDIVRDP", LTYPE3, AFDIVRDP,
739 "FDIVRW", LTYPE3, AFDIVRW,
740 "FDIVRL", LTYPE3, AFDIVRL,
741 "FDIVRF", LTYPE3, AFDIVRF,
742 "FDIVRD", LTYPE3, AFDIVRD,
743 "FXCHD", LTYPE3, AFXCHD,
744 "FFREE", LTYPE1, AFFREE,
745 "FLDCW", LTYPE2, AFLDCW,
746 "FLDENV", LTYPE1, AFLDENV,
747 "FRSTOR", LTYPE2, AFRSTOR,
748 "FSAVE", LTYPE1, AFSAVE,
749 "FSTCW", LTYPE1, AFSTCW,
750 "FSTENV", LTYPE1, AFSTENV,
751 "FSTSW", LTYPE1, AFSTSW,
752 "F2XM1", LTYPE0, AF2XM1,
753 "FABS", LTYPE0, AFABS,
754 "FCHS", LTYPE0, AFCHS,
755 "FCLEX", LTYPE0, AFCLEX,
756 "FCOS", LTYPE0, AFCOS,
757 "FDECSTP", LTYPE0, AFDECSTP,
758 "FINCSTP", LTYPE0, AFINCSTP,
759 "FINIT", LTYPE0, AFINIT,
760 "FLD1", LTYPE0, AFLD1,
761 "FLDL2E", LTYPE0, AFLDL2E,
762 "FLDL2T", LTYPE0, AFLDL2T,
763 "FLDLG2", LTYPE0, AFLDLG2,
764 "FLDLN2", LTYPE0, AFLDLN2,
765 "FLDPI", LTYPE0, AFLDPI,
766 "FLDZ", LTYPE0, AFLDZ,
767 "FNOP", LTYPE0, AFNOP,
768 "FPATAN", LTYPE0, AFPATAN,
769 "FPREM", LTYPE0, AFPREM,
770 "FPREM1", LTYPE0, AFPREM1,
771 "FPTAN", LTYPE0, AFPTAN,
772 "FRNDINT", LTYPE0, AFRNDINT,
773 "FSCALE", LTYPE0, AFSCALE,
774 "FSIN", LTYPE0, AFSIN,
775 "FSINCOS", LTYPE0, AFSINCOS,
776 "FSQRT", LTYPE0, AFSQRT,
777 "FTST", LTYPE0, AFTST,
778 "FXAM", LTYPE0, AFXAM,
779 "FXTRACT", LTYPE0, AFXTRACT,
780 "FYL2X", LTYPE0, AFYL2X,
781 "FYL2XP1", LTYPE0, AFYL2XP1,
782
783 "ADDPD", LTYPE3, AADDPD,
784 "ADDPS", LTYPE3, AADDPS,
785 "ADDSD", LTYPE3, AADDSD,
786 "ADDSS", LTYPE3, AADDSS,
787 "ANDNPD", LTYPE3, AANDNPD,
788 "ANDNPS", LTYPE3, AANDNPS,
789 "ANDPD", LTYPE3, AANDPD,
790 "ANDPS", LTYPE3, AANDPS,
791 "CMPPD", LTYPEXC,ACMPPD,
792 "CMPPS", LTYPEXC,ACMPPS,
793 "CMPSD", LTYPEXC,ACMPSD,
794 "CMPSS", LTYPEXC,ACMPSS,
795 "COMISD", LTYPE3, ACOMISD,
796 "COMISS", LTYPE3, ACOMISS,
797 "CVTPL2PD", LTYPE3, ACVTPL2PD,
798 "CVTPL2PS", LTYPE3, ACVTPL2PS,
799 "CVTPD2PL", LTYPE3, ACVTPD2PL,
800 "CVTPD2PS", LTYPE3, ACVTPD2PS,
801 "CVTPS2PL", LTYPE3, ACVTPS2PL,
802 "PF2IW", LTYPE3, APF2IW,
803 "PF2IL", LTYPE3, APF2IL,
804 "PF2ID", LTYPE3, APF2IL, /* syn */
805 "PI2FL", LTYPE3, API2FL,
806 "PI2FD", LTYPE3, API2FL, /* syn */
807 "PI2FW", LTYPE3, API2FW,
808 "CVTPS2PD", LTYPE3, ACVTPS2PD,
809 "CVTSD2SL", LTYPE3, ACVTSD2SL,
810 "CVTSD2SQ", LTYPE3, ACVTSD2SQ,
811 "CVTSD2SS", LTYPE3, ACVTSD2SS,
812 "CVTSL2SD", LTYPE3, ACVTSL2SD,
813 "CVTSQ2SD", LTYPE3, ACVTSQ2SD,
814 "CVTSL2SS", LTYPE3, ACVTSL2SS,
815 "CVTSQ2SS", LTYPE3, ACVTSQ2SS,
816 "CVTSS2SD", LTYPE3, ACVTSS2SD,
817 "CVTSS2SL", LTYPE3, ACVTSS2SL,
818 "CVTSS2SQ", LTYPE3, ACVTSS2SQ,
819 "CVTTPD2PL", LTYPE3, ACVTTPD2PL,
820 "CVTTPS2PL", LTYPE3, ACVTTPS2PL,
821 "CVTTSD2SL", LTYPE3, ACVTTSD2SL,
822 "CVTTSD2SQ", LTYPE3, ACVTTSD2SQ,
823 "CVTTSS2SL", LTYPE3, ACVTTSS2SL,
824 "CVTTSS2SQ", LTYPE3, ACVTTSS2SQ,
825 "DIVPD", LTYPE3, ADIVPD,
826 "DIVPS", LTYPE3, ADIVPS,
827 "DIVSD", LTYPE3, ADIVSD,
828 "DIVSS", LTYPE3, ADIVSS,
829 "FXRSTOR", LTYPE2, AFXRSTOR,
830 "FXRSTOR64", LTYPE2, AFXRSTOR64,
831 "FXSAVE", LTYPE1, AFXSAVE,
832 "FXSAVE64", LTYPE1, AFXSAVE64,
833 "LDMXCSR", LTYPE2, ALDMXCSR,
834 "MASKMOVOU", LTYPE3, AMASKMOVOU,
835 "MASKMOVDQU", LTYPE3, AMASKMOVOU, /* syn */
836 "MASKMOVQ", LTYPE3, AMASKMOVQ,
837 "MAXPD", LTYPE3, AMAXPD,
838 "MAXPS", LTYPE3, AMAXPS,
839 "MAXSD", LTYPE3, AMAXSD,
840 "MAXSS", LTYPE3, AMAXSS,
841 "MINPD", LTYPE3, AMINPD,
842 "MINPS", LTYPE3, AMINPS,
843 "MINSD", LTYPE3, AMINSD,
844 "MINSS", LTYPE3, AMINSS,
845 "MOVAPD", LTYPE3, AMOVAPD,
846 "MOVAPS", LTYPE3, AMOVAPS,
847 "MOVD", LTYPE3, AMOVQ, /* syn */
848 "MOVDQ2Q", LTYPE3, AMOVQ, /* syn */
849 "MOVO", LTYPE3, AMOVO,
850 "MOVOA", LTYPE3, AMOVO, /* syn */
851 "MOVOU", LTYPE3, AMOVOU,
852 "MOVHLPS", LTYPE3, AMOVHLPS,
853 "MOVHPD", LTYPE3, AMOVHPD,
854 "MOVHPS", LTYPE3, AMOVHPS,
855 "MOVLHPS", LTYPE3, AMOVLHPS,
856 "MOVLPD", LTYPE3, AMOVLPD,
857 "MOVLPS", LTYPE3, AMOVLPS,
858 "MOVMSKPD", LTYPE3, AMOVMSKPD,
859 "MOVMSKPS", LTYPE3, AMOVMSKPS,
860 "MOVNTO", LTYPE3, AMOVNTO,
861 "MOVNTDQ", LTYPE3, AMOVNTO, /* syn */
862 "MOVNTPD", LTYPE3, AMOVNTPD,
863 "MOVNTPS", LTYPE3, AMOVNTPS,
864 "MOVNTQ", LTYPE3, AMOVNTQ,
865 "MOVQOZX", LTYPE3, AMOVQOZX,
866 "MOVSD", LTYPE3, AMOVSD,
867 "MOVSS", LTYPE3, AMOVSS,
868 "MOVUPD", LTYPE3, AMOVUPD,
869 "MOVUPS", LTYPE3, AMOVUPS,
870 "MULPD", LTYPE3, AMULPD,
871 "MULPS", LTYPE3, AMULPS,
872 "MULSD", LTYPE3, AMULSD,
873 "MULSS", LTYPE3, AMULSS,
874 "ORPD", LTYPE3, AORPD,
875 "ORPS", LTYPE3, AORPS,
876 "PACKSSLW", LTYPE3, APACKSSLW,
877 "PACKSSWB", LTYPE3, APACKSSWB,
878 "PACKUSWB", LTYPE3, APACKUSWB,
879 "PADDB", LTYPE3, APADDB,
880 "PADDL", LTYPE3, APADDL,
881 "PADDQ", LTYPE3, APADDQ,
882 "PADDSB", LTYPE3, APADDSB,
883 "PADDSW", LTYPE3, APADDSW,
884 "PADDUSB", LTYPE3, APADDUSB,
885 "PADDUSW", LTYPE3, APADDUSW,
886 "PADDW", LTYPE3, APADDW,
887 "PAND", LTYPE3, APAND,
888 "PANDB", LTYPE3, APANDB,
889 "PANDL", LTYPE3, APANDL,
890 "PANDSB", LTYPE3, APANDSB,
891 "PANDSW", LTYPE3, APANDSW,
892 "PANDUSB", LTYPE3, APANDUSB,
893 "PANDUSW", LTYPE3, APANDUSW,
894 "PANDW", LTYPE3, APANDW,
895 "PANDN", LTYPE3, APANDN,
896 "PAVGB", LTYPE3, APAVGB,
897 "PAVGW", LTYPE3, APAVGW,
898 "PCMPEQB", LTYPE3, APCMPEQB,
899 "PCMPEQL", LTYPE3, APCMPEQL,
900 "PCMPEQW", LTYPE3, APCMPEQW,
901 "PCMPGTB", LTYPE3, APCMPGTB,
902 "PCMPGTL", LTYPE3, APCMPGTL,
903 "PCMPGTW", LTYPE3, APCMPGTW,
904 "PEXTRW", LTYPEX, APEXTRW,
905 "PINSRW", LTYPEX, APINSRW,
906 "PMADDWL", LTYPE3, APMADDWL,
907 "PMAXSW", LTYPE3, APMAXSW,
908 "PMAXUB", LTYPE3, APMAXUB,
909 "PMINSW", LTYPE3, APMINSW,
910 "PMINUB", LTYPE3, APMINUB,
911 "PMOVMSKB", LTYPE3, APMOVMSKB,
912 "PMULHRW", LTYPE3, APMULHRW,
913 "PMULHUW", LTYPE3, APMULHUW,
914 "PMULHW", LTYPE3, APMULHW,
915 "PMULLW", LTYPE3, APMULLW,
916 "PMULULQ", LTYPE3, APMULULQ,
917 "POR", LTYPE3, APOR,
918 "PSADBW", LTYPE3, APSADBW,
919 "PSHUFHW", LTYPEX, APSHUFHW,
920 "PSHUFL", LTYPEX, APSHUFL,
921 "PSHUFLW", LTYPEX, APSHUFLW,
922 "PSHUFW", LTYPEX, APSHUFW,
923 "PSLLO", LTYPE3, APSLLO,
924 "PSLLDQ", LTYPE3, APSLLO, /* syn */
925 "PSLLL", LTYPE3, APSLLL,
926 "PSLLQ", LTYPE3, APSLLQ,
927 "PSLLW", LTYPE3, APSLLW,
928 "PSRAL", LTYPE3, APSRAL,
929 "PSRAW", LTYPE3, APSRAW,
930 "PSRLO", LTYPE3, APSRLO,
931 "PSRLDQ", LTYPE3, APSRLO, /* syn */
932 "PSRLL", LTYPE3, APSRLL,
933 "PSRLQ", LTYPE3, APSRLQ,
934 "PSRLW", LTYPE3, APSRLW,
935 "PSUBB", LTYPE3, APSUBB,
936 "PSUBL", LTYPE3, APSUBL,
937 "PSUBQ", LTYPE3, APSUBQ,
938 "PSUBSB", LTYPE3, APSUBSB,
939 "PSUBSW", LTYPE3, APSUBSW,
940 "PSUBUSB", LTYPE3, APSUBUSB,
941 "PSUBUSW", LTYPE3, APSUBUSW,
942 "PSUBW", LTYPE3, APSUBW,
943 "PUNPCKHBW", LTYPE3, APUNPCKHBW,
944 "PUNPCKHLQ", LTYPE3, APUNPCKHLQ,
945 "PUNPCKHQDQ", LTYPE3, APUNPCKHQDQ,
946 "PUNPCKHWL", LTYPE3, APUNPCKHWL,
947 "PUNPCKLBW", LTYPE3, APUNPCKLBW,
948 "PUNPCKLLQ", LTYPE3, APUNPCKLLQ,
949 "PUNPCKLQDQ", LTYPE3, APUNPCKLQDQ,
950 "PUNPCKLWL", LTYPE3, APUNPCKLWL,
951 "PXOR", LTYPE3, APXOR,
952 "RCPPS", LTYPE3, ARCPPS,
953 "RCPSS", LTYPE3, ARCPSS,
954 "RSQRTPS", LTYPE3, ARSQRTPS,
955 "RSQRTSS", LTYPE3, ARSQRTSS,
956 "SHUFPD", LTYPEX, ASHUFPD,
957 "SHUFPS", LTYPEX, ASHUFPS,
958 "SQRTPD", LTYPE3, ASQRTPD,
959 "SQRTPS", LTYPE3, ASQRTPS,
960 "SQRTSD", LTYPE3, ASQRTSD,
961 "SQRTSS", LTYPE3, ASQRTSS,
962 "STMXCSR", LTYPE1, ASTMXCSR,
963 "SUBPD", LTYPE3, ASUBPD,
964 "SUBPS", LTYPE3, ASUBPS,
965 "SUBSD", LTYPE3, ASUBSD,
966 "SUBSS", LTYPE3, ASUBSS,
967 "UCOMISD", LTYPE3, AUCOMISD,
968 "UCOMISS", LTYPE3, AUCOMISS,
969 "UNPCKHPD", LTYPE3, AUNPCKHPD,
970 "UNPCKHPS", LTYPE3, AUNPCKHPS,
971 "UNPCKLPD", LTYPE3, AUNPCKLPD,
972 "UNPCKLPS", LTYPE3, AUNPCKLPS,
973 "XORPD", LTYPE3, AXORPD,
974 "XORPS", LTYPE3, AXORPS,
975
976 0
977 };
978
979 void
cinit(void)980 cinit(void)
981 {
982 Sym *s;
983 int i;
984
985 nullgen.sym = S;
986 nullgen.offset = 0;
987 if(FPCHIP)
988 nullgen.dval = 0;
989 for(i=0; i<sizeof(nullgen.sval); i++)
990 nullgen.sval[i] = 0;
991 nullgen.type = D_NONE;
992 nullgen.index = D_NONE;
993 nullgen.scale = 0;
994
995 nerrors = 0;
996 iostack = I;
997 iofree = I;
998 peekc = IGN;
999 nhunk = 0;
1000 for(i=0; i<NHASH; i++)
1001 hash[i] = S;
1002 for(i=0; itab[i].name; i++) {
1003 s = slookup(itab[i].name);
1004 if(s->type != LNAME)
1005 yyerror("double initialization %s", itab[i].name);
1006 s->type = itab[i].type;
1007 s->value = itab[i].value;
1008 }
1009
1010 pathname = allocn(pathname, 0, 100);
1011 if(mygetwd(pathname, 99) == 0) {
1012 pathname = allocn(pathname, 100, 900);
1013 if(mygetwd(pathname, 999) == 0)
1014 strcpy(pathname, "/???");
1015 }
1016 }
1017
1018 void
checkscale(int scale)1019 checkscale(int scale)
1020 {
1021
1022 switch(scale) {
1023 case 1:
1024 case 2:
1025 case 4:
1026 case 8:
1027 return;
1028 }
1029 yyerror("scale must be 1248: %d", scale);
1030 }
1031
1032 void
syminit(Sym * s)1033 syminit(Sym *s)
1034 {
1035
1036 s->type = LNAME;
1037 s->value = 0;
1038 }
1039
1040 void
cclean(void)1041 cclean(void)
1042 {
1043 Gen2 g2;
1044
1045 g2.from = nullgen;
1046 g2.to = nullgen;
1047 outcode(AEND, &g2);
1048 Bflush(&obuf);
1049 }
1050
1051 void
zname(char * n,int t,int s)1052 zname(char *n, int t, int s)
1053 {
1054
1055 Bputc(&obuf, ANAME); /* as(2) */
1056 Bputc(&obuf, ANAME>>8);
1057 Bputc(&obuf, t); /* type */
1058 Bputc(&obuf, s); /* sym */
1059 while(*n) {
1060 Bputc(&obuf, *n);
1061 n++;
1062 }
1063 Bputc(&obuf, 0);
1064 }
1065
1066 void
zaddr(Gen * a,int s)1067 zaddr(Gen *a, int s)
1068 {
1069 long l;
1070 int i, t;
1071 char *n;
1072 Ieee e;
1073
1074 t = 0;
1075 if(a->index != D_NONE || a->scale != 0)
1076 t |= T_INDEX;
1077 if(a->offset != 0) {
1078 t |= T_OFFSET;
1079 l = a->offset;
1080 if((vlong)l != a->offset)
1081 t |= T_64;
1082 }
1083 if(s != 0)
1084 t |= T_SYM;
1085
1086 switch(a->type) {
1087 default:
1088 t |= T_TYPE;
1089 break;
1090 case D_FCONST:
1091 t |= T_FCONST;
1092 break;
1093 case D_SCONST:
1094 t |= T_SCONST;
1095 break;
1096 case D_NONE:
1097 break;
1098 }
1099 Bputc(&obuf, t);
1100
1101 if(t & T_INDEX) { /* implies index, scale */
1102 Bputc(&obuf, a->index);
1103 Bputc(&obuf, a->scale);
1104 }
1105 if(t & T_OFFSET) { /* implies offset */
1106 l = a->offset;
1107 Bputc(&obuf, l);
1108 Bputc(&obuf, l>>8);
1109 Bputc(&obuf, l>>16);
1110 Bputc(&obuf, l>>24);
1111 if(t & T_64) {
1112 l = a->offset>>32;
1113 Bputc(&obuf, l);
1114 Bputc(&obuf, l>>8);
1115 Bputc(&obuf, l>>16);
1116 Bputc(&obuf, l>>24);
1117 }
1118 }
1119 if(t & T_SYM) /* implies sym */
1120 Bputc(&obuf, s);
1121 if(t & T_FCONST) {
1122 ieeedtod(&e, a->dval);
1123 l = e.l;
1124 Bputc(&obuf, l);
1125 Bputc(&obuf, l>>8);
1126 Bputc(&obuf, l>>16);
1127 Bputc(&obuf, l>>24);
1128 l = e.h;
1129 Bputc(&obuf, l);
1130 Bputc(&obuf, l>>8);
1131 Bputc(&obuf, l>>16);
1132 Bputc(&obuf, l>>24);
1133 return;
1134 }
1135 if(t & T_SCONST) {
1136 n = a->sval;
1137 for(i=0; i<NSNAME; i++) {
1138 Bputc(&obuf, *n);
1139 n++;
1140 }
1141 return;
1142 }
1143 if(t & T_TYPE)
1144 Bputc(&obuf, a->type);
1145 }
1146
1147 void
outcode(int a,Gen2 * g2)1148 outcode(int a, Gen2 *g2)
1149 {
1150 int sf, st, t;
1151 Sym *s;
1152
1153 if(pass == 1)
1154 goto out;
1155
1156 jackpot:
1157 sf = 0;
1158 s = g2->from.sym;
1159 while(s != S) {
1160 sf = s->sym;
1161 if(sf < 0 || sf >= NSYM)
1162 sf = 0;
1163 t = g2->from.type;
1164 if(t == D_ADDR)
1165 t = g2->from.index;
1166 if(h[sf].type == t)
1167 if(h[sf].sym == s)
1168 break;
1169 zname(s->name, t, sym);
1170 s->sym = sym;
1171 h[sym].sym = s;
1172 h[sym].type = t;
1173 sf = sym;
1174 sym++;
1175 if(sym >= NSYM)
1176 sym = 1;
1177 break;
1178 }
1179 st = 0;
1180 s = g2->to.sym;
1181 while(s != S) {
1182 st = s->sym;
1183 if(st < 0 || st >= NSYM)
1184 st = 0;
1185 t = g2->to.type;
1186 if(t == D_ADDR)
1187 t = g2->to.index;
1188 if(h[st].type == t)
1189 if(h[st].sym == s)
1190 break;
1191 zname(s->name, t, sym);
1192 s->sym = sym;
1193 h[sym].sym = s;
1194 h[sym].type = t;
1195 st = sym;
1196 sym++;
1197 if(sym >= NSYM)
1198 sym = 1;
1199 if(st == sf)
1200 goto jackpot;
1201 break;
1202 }
1203 Bputc(&obuf, a);
1204 Bputc(&obuf, a>>8);
1205 Bputc(&obuf, lineno);
1206 Bputc(&obuf, lineno>>8);
1207 Bputc(&obuf, lineno>>16);
1208 Bputc(&obuf, lineno>>24);
1209 zaddr(&g2->from, sf);
1210 zaddr(&g2->to, st);
1211
1212 out:
1213 if(a != AGLOBL && a != ADATA && a != AMODE)
1214 pc++;
1215 }
1216
1217 void
outhist(void)1218 outhist(void)
1219 {
1220 Gen g;
1221 Hist *h;
1222 char *p, *q, *op, c;
1223 int n;
1224
1225 g = nullgen;
1226 c = pathchar();
1227 for(h = hist; h != H; h = h->link) {
1228 p = h->name;
1229 op = 0;
1230 /* on windows skip drive specifier in pathname */
1231 if(systemtype(Windows) && p && p[1] == ':'){
1232 p += 2;
1233 c = *p;
1234 }
1235 if(p && p[0] != c && h->offset == 0 && pathname){
1236 /* on windows skip drive specifier in pathname */
1237 if(systemtype(Windows) && pathname[1] == ':') {
1238 op = p;
1239 p = pathname+2;
1240 c = *p;
1241 } else if(pathname[0] == c){
1242 op = p;
1243 p = pathname;
1244 }
1245 }
1246 while(p) {
1247 q = strchr(p, c);
1248 if(q) {
1249 n = q-p;
1250 if(n == 0){
1251 n = 1; /* leading "/" */
1252 *p = '/'; /* don't emit "\" on windows */
1253 }
1254 q++;
1255 } else {
1256 n = strlen(p);
1257 q = 0;
1258 }
1259 if(n) {
1260 Bputc(&obuf, ANAME);
1261 Bputc(&obuf, ANAME>>8);
1262 Bputc(&obuf, D_FILE); /* type */
1263 Bputc(&obuf, 1); /* sym */
1264 Bputc(&obuf, '<');
1265 Bwrite(&obuf, p, n);
1266 Bputc(&obuf, 0);
1267 }
1268 p = q;
1269 if(p == 0 && op) {
1270 p = op;
1271 op = 0;
1272 }
1273 }
1274 g.offset = h->offset;
1275
1276 Bputc(&obuf, AHISTORY);
1277 Bputc(&obuf, AHISTORY>>8);
1278 Bputc(&obuf, h->line);
1279 Bputc(&obuf, h->line>>8);
1280 Bputc(&obuf, h->line>>16);
1281 Bputc(&obuf, h->line>>24);
1282 zaddr(&nullgen, 0);
1283 zaddr(&g, 0);
1284 }
1285 }
1286
1287 #include "../cc/lexbody"
1288 #include "../cc/macbody"
1289 #include "../cc/compat"
1290