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 = '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 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 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 687 syminit(Sym *s) 688 { 689 690 s->type = LNAME; 691 s->value = 0; 692 } 693 694 void 695 cclean(void) 696 { 697 698 outcode(AEND, &nullgen, NREG, &nullgen); 699 Bflush(&obuf); 700 } 701 702 void 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 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 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 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 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 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