1 #include <ctype.h> 2 #define EXTERN 3 #include "a.h" 4 #include "y.tab.h" 5 6 void 7 main(int argc, char *argv[]) 8 { 9 char *p; 10 int nout, nproc, status, i, c; 11 12 thechar = '8'; 13 thestring = "386"; 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 "AH", LBREG, D_AH, 173 "CH", LBREG, D_CH, 174 "DH", LBREG, D_DH, 175 "BH", LBREG, D_BH, 176 177 "AX", LLREG, D_AX, 178 "CX", LLREG, D_CX, 179 "DX", LLREG, D_DX, 180 "BX", LLREG, D_BX, 181 /* "SP", LLREG, D_SP, */ 182 "BP", LLREG, D_BP, 183 "SI", LLREG, D_SI, 184 "DI", LLREG, D_DI, 185 186 "F0", LFREG, D_F0+0, 187 "F1", LFREG, D_F0+1, 188 "F2", LFREG, D_F0+2, 189 "F3", LFREG, D_F0+3, 190 "F4", LFREG, D_F0+4, 191 "F5", LFREG, D_F0+5, 192 "F6", LFREG, D_F0+6, 193 "F7", LFREG, D_F0+7, 194 195 "CS", LSREG, D_CS, 196 "SS", LSREG, D_SS, 197 "DS", LSREG, D_DS, 198 "ES", LSREG, D_ES, 199 "FS", LSREG, D_FS, 200 "GS", LSREG, D_GS, 201 202 "GDTR", LBREG, D_GDTR, 203 "IDTR", LBREG, D_IDTR, 204 "LDTR", LBREG, D_LDTR, 205 "MSW", LBREG, D_MSW, 206 "TASK", LBREG, D_TASK, 207 208 "CR0", LBREG, D_CR+0, 209 "CR1", LBREG, D_CR+1, 210 "CR2", LBREG, D_CR+2, 211 "CR3", LBREG, D_CR+3, 212 "CR4", LBREG, D_CR+4, 213 "CR5", LBREG, D_CR+5, 214 "CR6", LBREG, D_CR+6, 215 "CR7", LBREG, D_CR+7, 216 217 "DR0", LBREG, D_DR+0, 218 "DR1", LBREG, D_DR+1, 219 "DR2", LBREG, D_DR+2, 220 "DR3", LBREG, D_DR+3, 221 "DR4", LBREG, D_DR+4, 222 "DR5", LBREG, D_DR+5, 223 "DR6", LBREG, D_DR+6, 224 "DR7", LBREG, D_DR+7, 225 226 "TR0", LBREG, D_TR+0, 227 "TR1", LBREG, D_TR+1, 228 "TR2", LBREG, D_TR+2, 229 "TR3", LBREG, D_TR+3, 230 "TR4", LBREG, D_TR+4, 231 "TR5", LBREG, D_TR+5, 232 "TR6", LBREG, D_TR+6, 233 "TR7", LBREG, D_TR+7, 234 235 "AAA", LTYPE0, AAAA, 236 "AAD", LTYPE0, AAAD, 237 "AAM", LTYPE0, AAAM, 238 "AAS", LTYPE0, AAAS, 239 "ADCB", LTYPE3, AADCB, 240 "ADCL", LTYPE3, AADCL, 241 "ADCW", LTYPE3, AADCW, 242 "ADDB", LTYPE3, AADDB, 243 "ADDL", LTYPE3, AADDL, 244 "ADDW", LTYPE3, AADDW, 245 "ADJSP", LTYPE2, AADJSP, 246 "ANDB", LTYPE3, AANDB, 247 "ANDL", LTYPE3, AANDL, 248 "ANDW", LTYPE3, AANDW, 249 "ARPL", LTYPE3, AARPL, 250 "BOUNDL", LTYPE3, ABOUNDL, 251 "BOUNDW", LTYPE3, ABOUNDW, 252 "BSFL", LTYPE3, ABSFL, 253 "BSFW", LTYPE3, ABSFW, 254 "BSRL", LTYPE3, ABSRL, 255 "BSRW", LTYPE3, ABSRW, 256 "BTCL", LTYPE3, ABTCL, 257 "BTCW", LTYPE3, ABTCW, 258 "BTL", LTYPE3, ABTL, 259 "BTRL", LTYPE3, ABTRL, 260 "BTRW", LTYPE3, ABTRW, 261 "BTSL", LTYPE3, ABTSL, 262 "BTSW", LTYPE3, ABTSW, 263 "BTW", LTYPE3, ABTW, 264 "BYTE", LTYPE2, ABYTE, 265 "CALL", LTYPEC, ACALL, 266 "CLC", LTYPE0, ACLC, 267 "CLD", LTYPE0, ACLD, 268 "CLI", LTYPE0, ACLI, 269 "CLTS", LTYPE0, ACLTS, 270 "CMC", LTYPE0, ACMC, 271 "CMPB", LTYPE4, ACMPB, 272 "CMPL", LTYPE4, ACMPL, 273 "CMPW", LTYPE4, ACMPW, 274 "CMPSB", LTYPE0, ACMPSB, 275 "CMPSL", LTYPE0, ACMPSL, 276 "CMPSW", LTYPE0, ACMPSW, 277 "CMPXCHGB", LTYPE3, ACMPXCHGB, 278 "CMPXCHGL", LTYPE3, ACMPXCHGL, 279 "CMPXCHGW", LTYPE3, ACMPXCHGW, 280 "DAA", LTYPE0, ADAA, 281 "DAS", LTYPE0, ADAS, 282 "DATA", LTYPED, ADATA, 283 "DECB", LTYPE1, ADECB, 284 "DECL", LTYPE1, ADECL, 285 "DECW", LTYPE1, ADECW, 286 "DIVB", LTYPE2, ADIVB, 287 "DIVL", LTYPE2, ADIVL, 288 "DIVW", LTYPE2, ADIVW, 289 "END", LTYPE0, AEND, 290 "ENTER", LTYPE2, AENTER, 291 "GLOBL", LTYPEG, AGLOBL, 292 "HLT", LTYPE0, AHLT, 293 "IDIVB", LTYPE2, AIDIVB, 294 "IDIVL", LTYPE2, AIDIVL, 295 "IDIVW", LTYPE2, AIDIVW, 296 "IMULB", LTYPEI, AIMULB, 297 "IMULL", LTYPEI, AIMULL, 298 "IMULW", LTYPEI, AIMULW, 299 "INB", LTYPE0, AINB, 300 "INL", LTYPE0, AINL, 301 "INW", LTYPE0, AINW, 302 "INCB", LTYPE1, AINCB, 303 "INCL", LTYPE1, AINCL, 304 "INCW", LTYPE1, AINCW, 305 "INSB", LTYPE0, AINSB, 306 "INSL", LTYPE0, AINSL, 307 "INSW", LTYPE0, AINSW, 308 "INT", LTYPE2, AINT, 309 "INTO", LTYPE0, AINTO, 310 "IRETL", LTYPE0, AIRETL, 311 "IRETW", LTYPE0, AIRETW, 312 313 "JOS", LTYPER, AJOS, 314 "JO", LTYPER, AJOS, /* alternate */ 315 "JOC", LTYPER, AJOC, 316 "JNO", LTYPER, AJOC, /* alternate */ 317 "JCS", LTYPER, AJCS, 318 "JB", LTYPER, AJCS, /* alternate */ 319 "JC", LTYPER, AJCS, /* alternate */ 320 "JNAE", LTYPER, AJCS, /* alternate */ 321 "JLO", LTYPER, AJCS, /* alternate */ 322 "JCC", LTYPER, AJCC, 323 "JAE", LTYPER, AJCC, /* alternate */ 324 "JNB", LTYPER, AJCC, /* alternate */ 325 "JNC", LTYPER, AJCC, /* alternate */ 326 "JHS", LTYPER, AJCC, /* alternate */ 327 "JEQ", LTYPER, AJEQ, 328 "JE", LTYPER, AJEQ, /* alternate */ 329 "JZ", LTYPER, AJEQ, /* alternate */ 330 "JNE", LTYPER, AJNE, 331 "JNZ", LTYPER, AJNE, /* alternate */ 332 "JLS", LTYPER, AJLS, 333 "JBE", LTYPER, AJLS, /* alternate */ 334 "JNA", LTYPER, AJLS, /* alternate */ 335 "JHI", LTYPER, AJHI, 336 "JA", LTYPER, AJHI, /* alternate */ 337 "JNBE", LTYPER, AJHI, /* alternate */ 338 "JMI", LTYPER, AJMI, 339 "JS", LTYPER, AJMI, /* alternate */ 340 "JPL", LTYPER, AJPL, 341 "JNS", LTYPER, AJPL, /* alternate */ 342 "JPS", LTYPER, AJPS, 343 "JP", LTYPER, AJPS, /* alternate */ 344 "JPE", LTYPER, AJPS, /* alternate */ 345 "JPC", LTYPER, AJPC, 346 "JNP", LTYPER, AJPC, /* alternate */ 347 "JPO", LTYPER, AJPC, /* alternate */ 348 "JLT", LTYPER, AJLT, 349 "JL", LTYPER, AJLT, /* alternate */ 350 "JNGE", LTYPER, AJLT, /* alternate */ 351 "JGE", LTYPER, AJGE, 352 "JNL", LTYPER, AJGE, /* alternate */ 353 "JLE", LTYPER, AJLE, 354 "JNG", LTYPER, AJLE, /* alternate */ 355 "JGT", LTYPER, AJGT, 356 "JG", LTYPER, AJGT, /* alternate */ 357 "JNLE", LTYPER, AJGT, /* alternate */ 358 359 "JCXZ", LTYPER, AJCXZ, 360 "JMP", LTYPEC, AJMP, 361 "LAHF", LTYPE0, ALAHF, 362 "LARL", LTYPE3, ALARL, 363 "LARW", LTYPE3, ALARW, 364 "LEAL", LTYPE3, ALEAL, 365 "LEAW", LTYPE3, ALEAW, 366 "LEAVEL", LTYPE0, ALEAVEL, 367 "LEAVEW", LTYPE0, ALEAVEW, 368 "LOCK", LTYPE0, ALOCK, 369 "LODSB", LTYPE0, ALODSB, 370 "LODSL", LTYPE0, ALODSL, 371 "LODSW", LTYPE0, ALODSW, 372 "LONG", LTYPE2, ALONG, 373 "LOOP", LTYPER, ALOOP, 374 "LOOPEQ", LTYPER, ALOOPEQ, 375 "LOOPNE", LTYPER, ALOOPNE, 376 "LSLL", LTYPE3, ALSLL, 377 "LSLW", LTYPE3, ALSLW, 378 "MOVB", LTYPE3, AMOVB, 379 "MOVL", LTYPEM, AMOVL, 380 "MOVW", LTYPEM, AMOVW, 381 "MOVBLSX", LTYPE3, AMOVBLSX, 382 "MOVBLZX", LTYPE3, AMOVBLZX, 383 "MOVBWSX", LTYPE3, AMOVBWSX, 384 "MOVBWZX", LTYPE3, AMOVBWZX, 385 "MOVWLSX", LTYPE3, AMOVWLSX, 386 "MOVWLZX", LTYPE3, AMOVWLZX, 387 "MOVSB", LTYPE0, AMOVSB, 388 "MOVSL", LTYPE0, AMOVSL, 389 "MOVSW", LTYPE0, AMOVSW, 390 "MULB", LTYPE2, AMULB, 391 "MULL", LTYPE2, AMULL, 392 "MULW", LTYPE2, AMULW, 393 "NEGB", LTYPE1, ANEGB, 394 "NEGL", LTYPE1, ANEGL, 395 "NEGW", LTYPE1, ANEGW, 396 "NOP", LTYPEN, ANOP, 397 "NOTB", LTYPE1, ANOTB, 398 "NOTL", LTYPE1, ANOTL, 399 "NOTW", LTYPE1, ANOTW, 400 "ORB", LTYPE3, AORB, 401 "ORL", LTYPE3, AORL, 402 "ORW", LTYPE3, AORW, 403 "OUTB", LTYPE0, AOUTB, 404 "OUTL", LTYPE0, AOUTL, 405 "OUTW", LTYPE0, AOUTW, 406 "OUTSB", LTYPE0, AOUTSB, 407 "OUTSL", LTYPE0, AOUTSL, 408 "OUTSW", LTYPE0, AOUTSW, 409 "POPAL", LTYPE0, APOPAL, 410 "POPAW", LTYPE0, APOPAW, 411 "POPFL", LTYPE0, APOPFL, 412 "POPFW", LTYPE0, APOPFW, 413 "POPL", LTYPE1, APOPL, 414 "POPW", LTYPE1, APOPW, 415 "PUSHAL", LTYPE0, APUSHAL, 416 "PUSHAW", LTYPE0, APUSHAW, 417 "PUSHFL", LTYPE0, APUSHFL, 418 "PUSHFW", LTYPE0, APUSHFW, 419 "PUSHL", LTYPE2, APUSHL, 420 "PUSHW", LTYPE2, APUSHW, 421 "RCLB", LTYPE3, ARCLB, 422 "RCLL", LTYPE3, ARCLL, 423 "RCLW", LTYPE3, ARCLW, 424 "RCRB", LTYPE3, ARCRB, 425 "RCRL", LTYPE3, ARCRL, 426 "RCRW", LTYPE3, ARCRW, 427 "REP", LTYPE0, AREP, 428 "REPN", LTYPE0, AREPN, 429 "RET", LTYPE0, ARET, 430 "ROLB", LTYPE3, AROLB, 431 "ROLL", LTYPE3, AROLL, 432 "ROLW", LTYPE3, AROLW, 433 "RORB", LTYPE3, ARORB, 434 "RORL", LTYPE3, ARORL, 435 "RORW", LTYPE3, ARORW, 436 "SAHF", LTYPE0, ASAHF, 437 "SALB", LTYPE3, ASALB, 438 "SALL", LTYPE3, ASALL, 439 "SALW", LTYPE3, ASALW, 440 "SARB", LTYPE3, ASARB, 441 "SARL", LTYPE3, ASARL, 442 "SARW", LTYPE3, ASARW, 443 "SBBB", LTYPE3, ASBBB, 444 "SBBL", LTYPE3, ASBBL, 445 "SBBW", LTYPE3, ASBBW, 446 "SCASB", LTYPE0, ASCASB, 447 "SCASL", LTYPE0, ASCASL, 448 "SCASW", LTYPE0, ASCASW, 449 "SETCC", LTYPE1, ASETCC, 450 "SETCS", LTYPE1, ASETCS, 451 "SETEQ", LTYPE1, ASETEQ, 452 "SETGE", LTYPE1, ASETGE, 453 "SETGT", LTYPE1, ASETGT, 454 "SETHI", LTYPE1, ASETHI, 455 "SETLE", LTYPE1, ASETLE, 456 "SETLS", LTYPE1, ASETLS, 457 "SETLT", LTYPE1, ASETLT, 458 "SETMI", LTYPE1, ASETMI, 459 "SETNE", LTYPE1, ASETNE, 460 "SETOC", LTYPE1, ASETOC, 461 "SETOS", LTYPE1, ASETOS, 462 "SETPC", LTYPE1, ASETPC, 463 "SETPL", LTYPE1, ASETPL, 464 "SETPS", LTYPE1, ASETPS, 465 "CDQ", LTYPE0, ACDQ, 466 "CWD", LTYPE0, ACWD, 467 "SHLB", LTYPE3, ASHLB, 468 "SHLL", LTYPES, ASHLL, 469 "SHLW", LTYPES, ASHLW, 470 "SHRB", LTYPE3, ASHRB, 471 "SHRL", LTYPES, ASHRL, 472 "SHRW", LTYPES, ASHRW, 473 "STC", LTYPE0, ASTC, 474 "STD", LTYPE0, ASTD, 475 "STI", LTYPE0, ASTI, 476 "STOSB", LTYPE0, ASTOSB, 477 "STOSL", LTYPE0, ASTOSL, 478 "STOSW", LTYPE0, ASTOSW, 479 "SUBB", LTYPE3, ASUBB, 480 "SUBL", LTYPE3, ASUBL, 481 "SUBW", LTYPE3, ASUBW, 482 "SYSCALL", LTYPE0, ASYSCALL, 483 "TESTB", LTYPE3, ATESTB, 484 "TESTL", LTYPE3, ATESTL, 485 "TESTW", LTYPE3, ATESTW, 486 "TEXT", LTYPET, ATEXT, 487 "VERR", LTYPE2, AVERR, 488 "VERW", LTYPE2, AVERW, 489 "WAIT", LTYPE0, AWAIT, 490 "WORD", LTYPE2, AWORD, 491 "XCHGB", LTYPE3, AXCHGB, 492 "XCHGL", LTYPE3, AXCHGL, 493 "XCHGW", LTYPE3, AXCHGW, 494 "XLAT", LTYPE2, AXLAT, 495 "XORB", LTYPE3, AXORB, 496 "XORL", LTYPE3, AXORL, 497 "XORW", LTYPE3, AXORW, 498 499 "CMOVLCC", LTYPE3, ACMOVLCC, 500 "CMOVLCS", LTYPE3, ACMOVLCS, 501 "CMOVLEQ", LTYPE3, ACMOVLEQ, 502 "CMOVLGE", LTYPE3, ACMOVLGE, 503 "CMOVLGT", LTYPE3, ACMOVLGT, 504 "CMOVLHI", LTYPE3, ACMOVLHI, 505 "CMOVLLE", LTYPE3, ACMOVLLE, 506 "CMOVLLS", LTYPE3, ACMOVLLS, 507 "CMOVLLT", LTYPE3, ACMOVLLT, 508 "CMOVLMI", LTYPE3, ACMOVLMI, 509 "CMOVLNE", LTYPE3, ACMOVLNE, 510 "CMOVLOC", LTYPE3, ACMOVLOC, 511 "CMOVLOS", LTYPE3, ACMOVLOS, 512 "CMOVLPC", LTYPE3, ACMOVLPC, 513 "CMOVLPL", LTYPE3, ACMOVLPL, 514 "CMOVLPS", LTYPE3, ACMOVLPS, 515 "CMOVWCC", LTYPE3, ACMOVWCC, 516 "CMOVWCS", LTYPE3, ACMOVWCS, 517 "CMOVWEQ", LTYPE3, ACMOVWEQ, 518 "CMOVWGE", LTYPE3, ACMOVWGE, 519 "CMOVWGT", LTYPE3, ACMOVWGT, 520 "CMOVWHI", LTYPE3, ACMOVWHI, 521 "CMOVWLE", LTYPE3, ACMOVWLE, 522 "CMOVWLS", LTYPE3, ACMOVWLS, 523 "CMOVWLT", LTYPE3, ACMOVWLT, 524 "CMOVWMI", LTYPE3, ACMOVWMI, 525 "CMOVWNE", LTYPE3, ACMOVWNE, 526 "CMOVWOC", LTYPE3, ACMOVWOC, 527 "CMOVWOS", LTYPE3, ACMOVWOS, 528 "CMOVWPC", LTYPE3, ACMOVWPC, 529 "CMOVWPL", LTYPE3, ACMOVWPL, 530 "CMOVWPS", LTYPE3, ACMOVWPS, 531 532 "FMOVB", LTYPE3, AFMOVB, 533 "FMOVBP", LTYPE3, AFMOVBP, 534 "FMOVD", LTYPE3, AFMOVD, 535 "FMOVDP", LTYPE3, AFMOVDP, 536 "FMOVF", LTYPE3, AFMOVF, 537 "FMOVFP", LTYPE3, AFMOVFP, 538 "FMOVL", LTYPE3, AFMOVL, 539 "FMOVLP", LTYPE3, AFMOVLP, 540 "FMOVV", LTYPE3, AFMOVV, 541 "FMOVVP", LTYPE3, AFMOVVP, 542 "FMOVW", LTYPE3, AFMOVW, 543 "FMOVWP", LTYPE3, AFMOVWP, 544 "FMOVX", LTYPE3, AFMOVX, 545 "FMOVXP", LTYPE3, AFMOVXP, 546 "FCMOVCC", LTYPE3, AFCMOVCC, 547 "FCMOVCS", LTYPE3, AFCMOVCS, 548 "FCMOVEQ", LTYPE3, AFCMOVEQ, 549 "FCMOVHI", LTYPE3, AFCMOVHI, 550 "FCMOVLS", LTYPE3, AFCMOVLS, 551 "FCMOVNE", LTYPE3, AFCMOVNE, 552 "FCMOVNU", LTYPE3, AFCMOVNU, 553 "FCMOVUN", LTYPE3, AFCMOVUN, 554 "FCOMB", LTYPE3, AFCOMB, 555 "FCOMBP", LTYPE3, AFCOMBP, 556 "FCOMD", LTYPE3, AFCOMD, 557 "FCOMDP", LTYPE3, AFCOMDP, 558 "FCOMDPP", LTYPE3, AFCOMDPP, 559 "FCOMF", LTYPE3, AFCOMF, 560 "FCOMFP", LTYPE3, AFCOMFP, 561 "FCOMI", LTYPE3, AFCOMI, 562 "FCOMIP", LTYPE3, AFCOMIP, 563 "FCOML", LTYPE3, AFCOML, 564 "FCOMLP", LTYPE3, AFCOMLP, 565 "FCOMW", LTYPE3, AFCOMW, 566 "FCOMWP", LTYPE3, AFCOMWP, 567 "FUCOM", LTYPE3, AFUCOM, 568 "FUCOMI", LTYPE3, AFUCOMI, 569 "FUCOMIP", LTYPE3, AFUCOMIP, 570 "FUCOMP", LTYPE3, AFUCOMP, 571 "FUCOMPP", LTYPE3, AFUCOMPP, 572 "FADDW", LTYPE3, AFADDW, 573 "FADDL", LTYPE3, AFADDL, 574 "FADDF", LTYPE3, AFADDF, 575 "FADDD", LTYPE3, AFADDD, 576 "FADDDP", LTYPE3, AFADDDP, 577 "FSUBDP", LTYPE3, AFSUBDP, 578 "FSUBW", LTYPE3, AFSUBW, 579 "FSUBL", LTYPE3, AFSUBL, 580 "FSUBF", LTYPE3, AFSUBF, 581 "FSUBD", LTYPE3, AFSUBD, 582 "FSUBRDP", LTYPE3, AFSUBRDP, 583 "FSUBRW", LTYPE3, AFSUBRW, 584 "FSUBRL", LTYPE3, AFSUBRL, 585 "FSUBRF", LTYPE3, AFSUBRF, 586 "FSUBRD", LTYPE3, AFSUBRD, 587 "FMULDP", LTYPE3, AFMULDP, 588 "FMULW", LTYPE3, AFMULW, 589 "FMULL", LTYPE3, AFMULL, 590 "FMULF", LTYPE3, AFMULF, 591 "FMULD", LTYPE3, AFMULD, 592 "FDIVDP", LTYPE3, AFDIVDP, 593 "FDIVW", LTYPE3, AFDIVW, 594 "FDIVL", LTYPE3, AFDIVL, 595 "FDIVF", LTYPE3, AFDIVF, 596 "FDIVD", LTYPE3, AFDIVD, 597 "FDIVRDP", LTYPE3, AFDIVRDP, 598 "FDIVRW", LTYPE3, AFDIVRW, 599 "FDIVRL", LTYPE3, AFDIVRL, 600 "FDIVRF", LTYPE3, AFDIVRF, 601 "FDIVRD", LTYPE3, AFDIVRD, 602 "FXCHD", LTYPE3, AFXCHD, 603 "FFREE", LTYPE1, AFFREE, 604 "FLDCW", LTYPE2, AFLDCW, 605 "FLDENV", LTYPE1, AFLDENV, 606 "FRSTOR", LTYPE2, AFRSTOR, 607 "FSAVE", LTYPE1, AFSAVE, 608 "FSTCW", LTYPE1, AFSTCW, 609 "FSTENV", LTYPE1, AFSTENV, 610 "FSTSW", LTYPE1, AFSTSW, 611 "F2XM1", LTYPE0, AF2XM1, 612 "FABS", LTYPE0, AFABS, 613 "FCHS", LTYPE0, AFCHS, 614 "FCLEX", LTYPE0, AFCLEX, 615 "FCOS", LTYPE0, AFCOS, 616 "FDECSTP", LTYPE0, AFDECSTP, 617 "FINCSTP", LTYPE0, AFINCSTP, 618 "FINIT", LTYPE0, AFINIT, 619 "FLD1", LTYPE0, AFLD1, 620 "FLDL2E", LTYPE0, AFLDL2E, 621 "FLDL2T", LTYPE0, AFLDL2T, 622 "FLDLG2", LTYPE0, AFLDLG2, 623 "FLDLN2", LTYPE0, AFLDLN2, 624 "FLDPI", LTYPE0, AFLDPI, 625 "FLDZ", LTYPE0, AFLDZ, 626 "FNOP", LTYPE0, AFNOP, 627 "FPATAN", LTYPE0, AFPATAN, 628 "FPREM", LTYPE0, AFPREM, 629 "FPREM1", LTYPE0, AFPREM1, 630 "FPTAN", LTYPE0, AFPTAN, 631 "FRNDINT", LTYPE0, AFRNDINT, 632 "FSCALE", LTYPE0, AFSCALE, 633 "FSIN", LTYPE0, AFSIN, 634 "FSINCOS", LTYPE0, AFSINCOS, 635 "FSQRT", LTYPE0, AFSQRT, 636 "FTST", LTYPE0, AFTST, 637 "FXAM", LTYPE0, AFXAM, 638 "FXTRACT", LTYPE0, AFXTRACT, 639 "FYL2X", LTYPE0, AFYL2X, 640 "FYL2XP1", LTYPE0, AFYL2XP1, 641 642 0 643 }; 644 645 void 646 cinit(void) 647 { 648 Sym *s; 649 int i; 650 651 nullgen.sym = S; 652 nullgen.offset = 0; 653 if(FPCHIP) 654 nullgen.dval = 0; 655 for(i=0; i<sizeof(nullgen.sval); i++) 656 nullgen.sval[i] = 0; 657 nullgen.type = D_NONE; 658 nullgen.index = D_NONE; 659 nullgen.scale = 0; 660 661 nerrors = 0; 662 iostack = I; 663 iofree = I; 664 peekc = IGN; 665 nhunk = 0; 666 for(i=0; i<NHASH; i++) 667 hash[i] = S; 668 for(i=0; itab[i].name; i++) { 669 s = slookup(itab[i].name); 670 if(s->type != LNAME) 671 yyerror("double initialization %s", itab[i].name); 672 s->type = itab[i].type; 673 s->value = itab[i].value; 674 } 675 676 pathname = allocn(pathname, 0, 100); 677 if(mygetwd(pathname, 99) == 0) { 678 pathname = allocn(pathname, 100, 900); 679 if(mygetwd(pathname, 999) == 0) 680 strcpy(pathname, "/?"); 681 } 682 } 683 684 void 685 checkscale(int scale) 686 { 687 688 switch(scale) { 689 case 1: 690 case 2: 691 case 4: 692 case 8: 693 return; 694 } 695 yyerror("scale must be 1248: %d", scale); 696 } 697 698 void 699 syminit(Sym *s) 700 { 701 702 s->type = LNAME; 703 s->value = 0; 704 } 705 706 void 707 cclean(void) 708 { 709 Gen2 g2; 710 711 g2.from = nullgen; 712 g2.to = nullgen; 713 outcode(AEND, &g2); 714 Bflush(&obuf); 715 } 716 717 void 718 zname(char *n, int t, int s) 719 { 720 721 Bputc(&obuf, ANAME); /* as(2) */ 722 Bputc(&obuf, ANAME>>8); 723 Bputc(&obuf, t); /* type */ 724 Bputc(&obuf, s); /* sym */ 725 while(*n) { 726 Bputc(&obuf, *n); 727 n++; 728 } 729 Bputc(&obuf, 0); 730 } 731 732 void 733 zaddr(Gen *a, int s) 734 { 735 long l; 736 int i, t; 737 char *n; 738 Ieee e; 739 740 t = 0; 741 if(a->index != D_NONE || a->scale != 0) 742 t |= T_INDEX; 743 if(a->offset != 0) 744 t |= T_OFFSET; 745 if(s != 0) 746 t |= T_SYM; 747 748 switch(a->type) { 749 default: 750 t |= T_TYPE; 751 break; 752 case D_FCONST: 753 t |= T_FCONST; 754 break; 755 case D_CONST2: 756 t |= T_OFFSET|T_OFFSET2; 757 break; 758 case D_SCONST: 759 t |= T_SCONST; 760 break; 761 case D_NONE: 762 break; 763 } 764 Bputc(&obuf, t); 765 766 if(t & T_INDEX) { /* implies index, scale */ 767 Bputc(&obuf, a->index); 768 Bputc(&obuf, a->scale); 769 } 770 if(t & T_OFFSET) { /* implies offset */ 771 l = a->offset; 772 Bputc(&obuf, l); 773 Bputc(&obuf, l>>8); 774 Bputc(&obuf, l>>16); 775 Bputc(&obuf, l>>24); 776 } 777 if(t & T_OFFSET2) { 778 l = a->offset2; 779 Bputc(&obuf, l); 780 Bputc(&obuf, l>>8); 781 Bputc(&obuf, l>>16); 782 Bputc(&obuf, l>>24); 783 } 784 if(t & T_SYM) /* implies sym */ 785 Bputc(&obuf, s); 786 if(t & T_FCONST) { 787 ieeedtod(&e, a->dval); 788 l = e.l; 789 Bputc(&obuf, l); 790 Bputc(&obuf, l>>8); 791 Bputc(&obuf, l>>16); 792 Bputc(&obuf, l>>24); 793 l = e.h; 794 Bputc(&obuf, l); 795 Bputc(&obuf, l>>8); 796 Bputc(&obuf, l>>16); 797 Bputc(&obuf, l>>24); 798 return; 799 } 800 if(t & T_SCONST) { 801 n = a->sval; 802 for(i=0; i<NSNAME; i++) { 803 Bputc(&obuf, *n); 804 n++; 805 } 806 return; 807 } 808 if(t & T_TYPE) 809 Bputc(&obuf, a->type); 810 } 811 812 void 813 outcode(int a, Gen2 *g2) 814 { 815 int sf, st, t; 816 Sym *s; 817 818 if(pass == 1) 819 goto out; 820 821 jackpot: 822 sf = 0; 823 s = g2->from.sym; 824 while(s != S) { 825 sf = s->sym; 826 if(sf < 0 || sf >= NSYM) 827 sf = 0; 828 t = g2->from.type; 829 if(t == D_ADDR) 830 t = g2->from.index; 831 if(h[sf].type == t) 832 if(h[sf].sym == s) 833 break; 834 zname(s->name, t, sym); 835 s->sym = sym; 836 h[sym].sym = s; 837 h[sym].type = t; 838 sf = sym; 839 sym++; 840 if(sym >= NSYM) 841 sym = 1; 842 break; 843 } 844 st = 0; 845 s = g2->to.sym; 846 while(s != S) { 847 st = s->sym; 848 if(st < 0 || st >= NSYM) 849 st = 0; 850 t = g2->to.type; 851 if(t == D_ADDR) 852 t = g2->to.index; 853 if(h[st].type == t) 854 if(h[st].sym == s) 855 break; 856 zname(s->name, t, sym); 857 s->sym = sym; 858 h[sym].sym = s; 859 h[sym].type = t; 860 st = sym; 861 sym++; 862 if(sym >= NSYM) 863 sym = 1; 864 if(st == sf) 865 goto jackpot; 866 break; 867 } 868 Bputc(&obuf, a); 869 Bputc(&obuf, a>>8); 870 Bputc(&obuf, lineno); 871 Bputc(&obuf, lineno>>8); 872 Bputc(&obuf, lineno>>16); 873 Bputc(&obuf, lineno>>24); 874 zaddr(&g2->from, sf); 875 zaddr(&g2->to, st); 876 877 out: 878 if(a != AGLOBL && a != ADATA) 879 pc++; 880 } 881 882 void 883 outhist(void) 884 { 885 Gen g; 886 Hist *h; 887 char *p, *q, *op, c; 888 int n; 889 890 g = nullgen; 891 c = pathchar(); 892 for(h = hist; h != H; h = h->link) { 893 p = h->name; 894 op = 0; 895 /* on windows skip drive specifier in pathname */ 896 if(systemtype(Windows) && p && p[1] == ':'){ 897 p += 2; 898 c = *p; 899 } 900 if(p && p[0] != c && h->offset == 0 && pathname){ 901 /* on windows skip drive specifier in pathname */ 902 if(systemtype(Windows) && pathname[1] == ':') { 903 op = p; 904 p = pathname+2; 905 c = *p; 906 } else if(pathname[0] == c){ 907 op = p; 908 p = pathname; 909 } 910 } 911 while(p) { 912 q = strchr(p, c); 913 if(q) { 914 n = q-p; 915 if(n == 0){ 916 n = 1; /* leading "/" */ 917 *p = '/'; /* don't emit "\" on windows */ 918 } 919 q++; 920 } else { 921 n = strlen(p); 922 q = 0; 923 } 924 if(n) { 925 Bputc(&obuf, ANAME); 926 Bputc(&obuf, ANAME>>8); 927 Bputc(&obuf, D_FILE); /* type */ 928 Bputc(&obuf, 1); /* sym */ 929 Bputc(&obuf, '<'); 930 Bwrite(&obuf, p, n); 931 Bputc(&obuf, 0); 932 } 933 p = q; 934 if(p == 0 && op) { 935 p = op; 936 op = 0; 937 } 938 } 939 g.offset = h->offset; 940 941 Bputc(&obuf, AHISTORY); 942 Bputc(&obuf, AHISTORY>>8); 943 Bputc(&obuf, h->line); 944 Bputc(&obuf, h->line>>8); 945 Bputc(&obuf, h->line>>16); 946 Bputc(&obuf, h->line>>24); 947 zaddr(&nullgen, 0); 948 zaddr(&g, 0); 949 } 950 } 951 952 #include "../cc/lexbody" 953 #include "../cc/macbody" 954