1 #define EXTERN 2 #include "a.h" 3 #include "y.tab.h" 4 #include <ctype.h> 5 6 void 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 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 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 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 1033 syminit(Sym *s) 1034 { 1035 1036 s->type = LNAME; 1037 s->value = 0; 1038 } 1039 1040 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 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 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 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 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