github.com/rohankumardubey/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/cmd/8a/lex.c (about) 1 // Inferno utils/8a/lex.c 2 // http://code.google.com/p/inferno-os/source/browse/utils/8a/lex.c 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) 6 // Portions Copyright © 1997-1999 Vita Nuova Limited 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright © 2004,2006 Bruce Ellis 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright © 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 #define EXTERN 32 #include <u.h> 33 #include <libc.h> 34 #include "a.h" 35 #include "y.tab.h" 36 37 enum 38 { 39 Plan9 = 1<<0, 40 Unix = 1<<1, 41 Windows = 1<<2, 42 }; 43 44 int 45 systemtype(int sys) 46 { 47 #ifdef _WIN32 48 return sys&Windows; 49 #else 50 return sys&Plan9; 51 #endif 52 } 53 54 int 55 pathchar(void) 56 { 57 return '/'; 58 } 59 60 void 61 main(int argc, char *argv[]) 62 { 63 char *p; 64 int c; 65 66 thechar = '8'; 67 thestring = "386"; 68 69 ensuresymb(NSYMB); 70 memset(debug, 0, sizeof(debug)); 71 cinit(); 72 outfile = 0; 73 setinclude("."); 74 ARGBEGIN { 75 default: 76 c = ARGC(); 77 if(c >= 0 && c < sizeof(debug)) 78 debug[c] = 1; 79 break; 80 81 case 'o': 82 outfile = ARGF(); 83 break; 84 85 case 'D': 86 p = ARGF(); 87 if(p) { 88 if (nDlist%8 == 0) 89 Dlist = allocn(Dlist, nDlist*sizeof(char *), 90 8*sizeof(char *)); 91 Dlist[nDlist++] = p; 92 } 93 break; 94 95 case 'I': 96 p = ARGF(); 97 setinclude(p); 98 break; 99 } ARGEND 100 if(*argv == 0) { 101 print("usage: %ca [-options] file.s\n", thechar); 102 errorexit(); 103 } 104 if(argc > 1){ 105 print("can't assemble multiple files\n"); 106 errorexit(); 107 } 108 if(assemble(argv[0])) 109 errorexit(); 110 exits(0); 111 } 112 113 int 114 assemble(char *file) 115 { 116 char *ofile, *p; 117 int i, of; 118 119 ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar) 120 strcpy(ofile, file); 121 p = utfrrune(ofile, pathchar()); 122 if(p) { 123 include[0] = ofile; 124 *p++ = 0; 125 } else 126 p = ofile; 127 if(outfile == 0) { 128 outfile = p; 129 if(outfile){ 130 p = utfrrune(outfile, '.'); 131 if(p) 132 if(p[1] == 's' && p[2] == 0) 133 p[0] = 0; 134 p = utfrune(outfile, 0); 135 p[0] = '.'; 136 p[1] = thechar; 137 p[2] = 0; 138 } else 139 outfile = "/dev/null"; 140 } 141 142 of = create(outfile, OWRITE, 0664); 143 if(of < 0) { 144 yyerror("%ca: cannot create %s", thechar, outfile); 145 errorexit(); 146 } 147 Binit(&obuf, of, OWRITE); 148 149 pass = 1; 150 pinit(file); 151 152 Bprint(&obuf, "go object %s %s %s\n", getgoos(), thestring, getgoversion()); 153 154 for(i=0; i<nDlist; i++) 155 dodefine(Dlist[i]); 156 yyparse(); 157 if(nerrors) { 158 cclean(); 159 return nerrors; 160 } 161 162 Bprint(&obuf, "\n!\n"); 163 164 pass = 2; 165 outhist(); 166 pinit(file); 167 for(i=0; i<nDlist; i++) 168 dodefine(Dlist[i]); 169 yyparse(); 170 cclean(); 171 return nerrors; 172 } 173 174 struct 175 { 176 char *name; 177 ushort type; 178 ushort value; 179 } itab[] = 180 { 181 "SP", LSP, D_AUTO, 182 "SB", LSB, D_EXTERN, 183 "FP", LFP, D_PARAM, 184 "PC", LPC, D_BRANCH, 185 186 "AL", LBREG, D_AL, 187 "CL", LBREG, D_CL, 188 "DL", LBREG, D_DL, 189 "BL", LBREG, D_BL, 190 "AH", LBREG, D_AH, 191 "CH", LBREG, D_CH, 192 "DH", LBREG, D_DH, 193 "BH", LBREG, D_BH, 194 195 "AX", LLREG, D_AX, 196 "CX", LLREG, D_CX, 197 "DX", LLREG, D_DX, 198 "BX", LLREG, D_BX, 199 /* "SP", LLREG, D_SP, */ 200 "BP", LLREG, D_BP, 201 "SI", LLREG, D_SI, 202 "DI", LLREG, D_DI, 203 204 "F0", LFREG, D_F0+0, 205 "F1", LFREG, D_F0+1, 206 "F2", LFREG, D_F0+2, 207 "F3", LFREG, D_F0+3, 208 "F4", LFREG, D_F0+4, 209 "F5", LFREG, D_F0+5, 210 "F6", LFREG, D_F0+6, 211 "F7", LFREG, D_F0+7, 212 213 "X0", LXREG, D_X0+0, 214 "X1", LXREG, D_X0+1, 215 "X2", LXREG, D_X0+2, 216 "X3", LXREG, D_X0+3, 217 "X4", LXREG, D_X0+4, 218 "X5", LXREG, D_X0+5, 219 "X6", LXREG, D_X0+6, 220 "X7", LXREG, D_X0+7, 221 222 "CS", LSREG, D_CS, 223 "SS", LSREG, D_SS, 224 "DS", LSREG, D_DS, 225 "ES", LSREG, D_ES, 226 "FS", LSREG, D_FS, 227 "GS", LSREG, D_GS, 228 229 "GDTR", LBREG, D_GDTR, 230 "IDTR", LBREG, D_IDTR, 231 "LDTR", LBREG, D_LDTR, 232 "MSW", LBREG, D_MSW, 233 "TASK", LBREG, D_TASK, 234 235 "CR0", LBREG, D_CR+0, 236 "CR1", LBREG, D_CR+1, 237 "CR2", LBREG, D_CR+2, 238 "CR3", LBREG, D_CR+3, 239 "CR4", LBREG, D_CR+4, 240 "CR5", LBREG, D_CR+5, 241 "CR6", LBREG, D_CR+6, 242 "CR7", LBREG, D_CR+7, 243 244 "DR0", LBREG, D_DR+0, 245 "DR1", LBREG, D_DR+1, 246 "DR2", LBREG, D_DR+2, 247 "DR3", LBREG, D_DR+3, 248 "DR4", LBREG, D_DR+4, 249 "DR5", LBREG, D_DR+5, 250 "DR6", LBREG, D_DR+6, 251 "DR7", LBREG, D_DR+7, 252 253 "TR0", LBREG, D_TR+0, 254 "TR1", LBREG, D_TR+1, 255 "TR2", LBREG, D_TR+2, 256 "TR3", LBREG, D_TR+3, 257 "TR4", LBREG, D_TR+4, 258 "TR5", LBREG, D_TR+5, 259 "TR6", LBREG, D_TR+6, 260 "TR7", LBREG, D_TR+7, 261 262 "AAA", LTYPE0, AAAA, 263 "AAD", LTYPE0, AAAD, 264 "AAM", LTYPE0, AAAM, 265 "AAS", LTYPE0, AAAS, 266 "ADCB", LTYPE3, AADCB, 267 "ADCL", LTYPE3, AADCL, 268 "ADCW", LTYPE3, AADCW, 269 "ADDB", LTYPE3, AADDB, 270 "ADDL", LTYPE3, AADDL, 271 "ADDW", LTYPE3, AADDW, 272 "ADJSP", LTYPE2, AADJSP, 273 "ANDB", LTYPE3, AANDB, 274 "ANDL", LTYPE3, AANDL, 275 "ANDW", LTYPE3, AANDW, 276 "ARPL", LTYPE3, AARPL, 277 "BOUNDL", LTYPE3, ABOUNDL, 278 "BOUNDW", LTYPE3, ABOUNDW, 279 "BSFL", LTYPE3, ABSFL, 280 "BSFW", LTYPE3, ABSFW, 281 "BSRL", LTYPE3, ABSRL, 282 "BSRW", LTYPE3, ABSRW, 283 "BSWAPL", LTYPE1, ABSWAPL, 284 "BTCL", LTYPE3, ABTCL, 285 "BTCW", LTYPE3, ABTCW, 286 "BTL", LTYPE3, ABTL, 287 "BTRL", LTYPE3, ABTRL, 288 "BTRW", LTYPE3, ABTRW, 289 "BTSL", LTYPE3, ABTSL, 290 "BTSW", LTYPE3, ABTSW, 291 "BTW", LTYPE3, ABTW, 292 "BYTE", LTYPE2, ABYTE, 293 "CALL", LTYPEC, ACALL, 294 "CLC", LTYPE0, ACLC, 295 "CLD", LTYPE0, ACLD, 296 "CLI", LTYPE0, ACLI, 297 "CLTS", LTYPE0, ACLTS, 298 "CMC", LTYPE0, ACMC, 299 "CMPB", LTYPE4, ACMPB, 300 "CMPL", LTYPE4, ACMPL, 301 "CMPW", LTYPE4, ACMPW, 302 "CMPSB", LTYPE0, ACMPSB, 303 "CMPSL", LTYPE0, ACMPSL, 304 "CMPSW", LTYPE0, ACMPSW, 305 "CMPXCHG8B", LTYPE1, ACMPXCHG8B, 306 "CMPXCHGB", LTYPE3, ACMPXCHGB, 307 "CMPXCHGL", LTYPE3, ACMPXCHGL, 308 "CMPXCHGW", LTYPE3, ACMPXCHGW, 309 "CPUID", LTYPE0, ACPUID, 310 "DAA", LTYPE0, ADAA, 311 "DAS", LTYPE0, ADAS, 312 "DATA", LTYPED, ADATA, 313 "DECB", LTYPE1, ADECB, 314 "DECL", LTYPE1, ADECL, 315 "DECW", LTYPE1, ADECW, 316 "DIVB", LTYPE2, ADIVB, 317 "DIVL", LTYPE2, ADIVL, 318 "DIVW", LTYPE2, ADIVW, 319 "END", LTYPE0, AEND, 320 "ENTER", LTYPE2, AENTER, 321 "GLOBL", LTYPEG, AGLOBL, 322 "HLT", LTYPE0, AHLT, 323 "IDIVB", LTYPE2, AIDIVB, 324 "IDIVL", LTYPE2, AIDIVL, 325 "IDIVW", LTYPE2, AIDIVW, 326 "IMULB", LTYPE2, AIMULB, 327 "IMULL", LTYPEI, AIMULL, 328 "IMULW", LTYPEI, AIMULW, 329 "INB", LTYPE0, AINB, 330 "INL", LTYPE0, AINL, 331 "INW", LTYPE0, AINW, 332 "INCB", LTYPE1, AINCB, 333 "INCL", LTYPE1, AINCL, 334 "INCW", LTYPE1, AINCW, 335 "INSB", LTYPE0, AINSB, 336 "INSL", LTYPE0, AINSL, 337 "INSW", LTYPE0, AINSW, 338 "INT", LTYPE2, AINT, 339 "INTO", LTYPE0, AINTO, 340 "IRETL", LTYPE0, AIRETL, 341 "IRETW", LTYPE0, AIRETW, 342 343 "JOS", LTYPER, AJOS, 344 "JO", LTYPER, AJOS, /* alternate */ 345 "JOC", LTYPER, AJOC, 346 "JNO", LTYPER, AJOC, /* alternate */ 347 "JCS", LTYPER, AJCS, 348 "JB", LTYPER, AJCS, /* alternate */ 349 "JC", LTYPER, AJCS, /* alternate */ 350 "JNAE", LTYPER, AJCS, /* alternate */ 351 "JLO", LTYPER, AJCS, /* alternate */ 352 "JCC", LTYPER, AJCC, 353 "JAE", LTYPER, AJCC, /* alternate */ 354 "JNB", LTYPER, AJCC, /* alternate */ 355 "JNC", LTYPER, AJCC, /* alternate */ 356 "JHS", LTYPER, AJCC, /* alternate */ 357 "JEQ", LTYPER, AJEQ, 358 "JE", LTYPER, AJEQ, /* alternate */ 359 "JZ", LTYPER, AJEQ, /* alternate */ 360 "JNE", LTYPER, AJNE, 361 "JNZ", LTYPER, AJNE, /* alternate */ 362 "JLS", LTYPER, AJLS, 363 "JBE", LTYPER, AJLS, /* alternate */ 364 "JNA", LTYPER, AJLS, /* alternate */ 365 "JHI", LTYPER, AJHI, 366 "JA", LTYPER, AJHI, /* alternate */ 367 "JNBE", LTYPER, AJHI, /* alternate */ 368 "JMI", LTYPER, AJMI, 369 "JS", LTYPER, AJMI, /* alternate */ 370 "JPL", LTYPER, AJPL, 371 "JNS", LTYPER, AJPL, /* alternate */ 372 "JPS", LTYPER, AJPS, 373 "JP", LTYPER, AJPS, /* alternate */ 374 "JPE", LTYPER, AJPS, /* alternate */ 375 "JPC", LTYPER, AJPC, 376 "JNP", LTYPER, AJPC, /* alternate */ 377 "JPO", LTYPER, AJPC, /* alternate */ 378 "JLT", LTYPER, AJLT, 379 "JL", LTYPER, AJLT, /* alternate */ 380 "JNGE", LTYPER, AJLT, /* alternate */ 381 "JGE", LTYPER, AJGE, 382 "JNL", LTYPER, AJGE, /* alternate */ 383 "JLE", LTYPER, AJLE, 384 "JNG", LTYPER, AJLE, /* alternate */ 385 "JGT", LTYPER, AJGT, 386 "JG", LTYPER, AJGT, /* alternate */ 387 "JNLE", LTYPER, AJGT, /* alternate */ 388 389 "JCXZL", LTYPER, AJCXZL, 390 "JCXZW", LTYPER, AJCXZW, 391 "JMP", LTYPEC, AJMP, 392 "LAHF", LTYPE0, ALAHF, 393 "LARL", LTYPE3, ALARL, 394 "LARW", LTYPE3, ALARW, 395 "LEAL", LTYPE3, ALEAL, 396 "LEAW", LTYPE3, ALEAW, 397 "LEAVEL", LTYPE0, ALEAVEL, 398 "LEAVEW", LTYPE0, ALEAVEW, 399 "LOCK", LTYPE0, ALOCK, 400 "LODSB", LTYPE0, ALODSB, 401 "LODSL", LTYPE0, ALODSL, 402 "LODSW", LTYPE0, ALODSW, 403 "LONG", LTYPE2, ALONG, 404 "LOOP", LTYPER, ALOOP, 405 "LOOPEQ", LTYPER, ALOOPEQ, 406 "LOOPNE", LTYPER, ALOOPNE, 407 "LSLL", LTYPE3, ALSLL, 408 "LSLW", LTYPE3, ALSLW, 409 "MOVB", LTYPE3, AMOVB, 410 "MOVL", LTYPEM, AMOVL, 411 "MOVW", LTYPEM, AMOVW, 412 "MOVQ", LTYPEM, AMOVQ, 413 "MOVBLSX", LTYPE3, AMOVBLSX, 414 "MOVBLZX", LTYPE3, AMOVBLZX, 415 "MOVBWSX", LTYPE3, AMOVBWSX, 416 "MOVBWZX", LTYPE3, AMOVBWZX, 417 "MOVWLSX", LTYPE3, AMOVWLSX, 418 "MOVWLZX", LTYPE3, AMOVWLZX, 419 "MOVSB", LTYPE0, AMOVSB, 420 "MOVSL", LTYPE0, AMOVSL, 421 "MOVSW", LTYPE0, AMOVSW, 422 "MULB", LTYPE2, AMULB, 423 "MULL", LTYPE2, AMULL, 424 "MULW", LTYPE2, AMULW, 425 "NEGB", LTYPE1, ANEGB, 426 "NEGL", LTYPE1, ANEGL, 427 "NEGW", LTYPE1, ANEGW, 428 "NOP", LTYPEN, ANOP, 429 "NOTB", LTYPE1, ANOTB, 430 "NOTL", LTYPE1, ANOTL, 431 "NOTW", LTYPE1, ANOTW, 432 "ORB", LTYPE3, AORB, 433 "ORL", LTYPE3, AORL, 434 "ORW", LTYPE3, AORW, 435 "OUTB", LTYPE0, AOUTB, 436 "OUTL", LTYPE0, AOUTL, 437 "OUTW", LTYPE0, AOUTW, 438 "OUTSB", LTYPE0, AOUTSB, 439 "OUTSL", LTYPE0, AOUTSL, 440 "OUTSW", LTYPE0, AOUTSW, 441 "PAUSE", LTYPEN, APAUSE, 442 "PINSRD", LTYPEX, APINSRD, 443 "POPAL", LTYPE0, APOPAL, 444 "POPAW", LTYPE0, APOPAW, 445 "POPFL", LTYPE0, APOPFL, 446 "POPFW", LTYPE0, APOPFW, 447 "POPL", LTYPE1, APOPL, 448 "POPW", LTYPE1, APOPW, 449 "PUSHAL", LTYPE0, APUSHAL, 450 "PUSHAW", LTYPE0, APUSHAW, 451 "PUSHFL", LTYPE0, APUSHFL, 452 "PUSHFW", LTYPE0, APUSHFW, 453 "PUSHL", LTYPE2, APUSHL, 454 "PUSHW", LTYPE2, APUSHW, 455 "RCLB", LTYPE3, ARCLB, 456 "RCLL", LTYPE3, ARCLL, 457 "RCLW", LTYPE3, ARCLW, 458 "RCRB", LTYPE3, ARCRB, 459 "RCRL", LTYPE3, ARCRL, 460 "RCRW", LTYPE3, ARCRW, 461 "RDTSC", LTYPE0, ARDTSC, 462 "REP", LTYPE0, AREP, 463 "REPN", LTYPE0, AREPN, 464 "RET", LTYPE0, ARET, 465 "ROLB", LTYPE3, AROLB, 466 "ROLL", LTYPE3, AROLL, 467 "ROLW", LTYPE3, AROLW, 468 "RORB", LTYPE3, ARORB, 469 "RORL", LTYPE3, ARORL, 470 "RORW", LTYPE3, ARORW, 471 "SAHF", LTYPE0, ASAHF, 472 "SALB", LTYPE3, ASALB, 473 "SALL", LTYPE3, ASALL, 474 "SALW", LTYPE3, ASALW, 475 "SARB", LTYPE3, ASARB, 476 "SARL", LTYPE3, ASARL, 477 "SARW", LTYPE3, ASARW, 478 "SBBB", LTYPE3, ASBBB, 479 "SBBL", LTYPE3, ASBBL, 480 "SBBW", LTYPE3, ASBBW, 481 "SCASB", LTYPE0, ASCASB, 482 "SCASL", LTYPE0, ASCASL, 483 "SCASW", LTYPE0, ASCASW, 484 "SETCC", LTYPE1, ASETCC, 485 "SETCS", LTYPE1, ASETCS, 486 "SETEQ", LTYPE1, ASETEQ, 487 "SETGE", LTYPE1, ASETGE, 488 "SETGT", LTYPE1, ASETGT, 489 "SETHI", LTYPE1, ASETHI, 490 "SETLE", LTYPE1, ASETLE, 491 "SETLS", LTYPE1, ASETLS, 492 "SETLT", LTYPE1, ASETLT, 493 "SETMI", LTYPE1, ASETMI, 494 "SETNE", LTYPE1, ASETNE, 495 "SETOC", LTYPE1, ASETOC, 496 "SETOS", LTYPE1, ASETOS, 497 "SETPC", LTYPE1, ASETPC, 498 "SETPL", LTYPE1, ASETPL, 499 "SETPS", LTYPE1, ASETPS, 500 "CDQ", LTYPE0, ACDQ, 501 "CWD", LTYPE0, ACWD, 502 "SHLB", LTYPE3, ASHLB, 503 "SHLL", LTYPES, ASHLL, 504 "SHLW", LTYPES, ASHLW, 505 "SHRB", LTYPE3, ASHRB, 506 "SHRL", LTYPES, ASHRL, 507 "SHRW", LTYPES, ASHRW, 508 "STC", LTYPE0, ASTC, 509 "STD", LTYPE0, ASTD, 510 "STI", LTYPE0, ASTI, 511 "STOSB", LTYPE0, ASTOSB, 512 "STOSL", LTYPE0, ASTOSL, 513 "STOSW", LTYPE0, ASTOSW, 514 "SUBB", LTYPE3, ASUBB, 515 "SUBL", LTYPE3, ASUBL, 516 "SUBW", LTYPE3, ASUBW, 517 "SYSCALL", LTYPE0, ASYSCALL, 518 "TESTB", LTYPE3, ATESTB, 519 "TESTL", LTYPE3, ATESTL, 520 "TESTW", LTYPE3, ATESTW, 521 "TEXT", LTYPET, ATEXT, 522 "VERR", LTYPE2, AVERR, 523 "VERW", LTYPE2, AVERW, 524 "WAIT", LTYPE0, AWAIT, 525 "WORD", LTYPE2, AWORD, 526 "XADDB", LTYPE3, AXADDB, 527 "XADDL", LTYPE3, AXADDL, 528 "XADDW", LTYPE3, AXADDW, 529 "XCHGB", LTYPE3, AXCHGB, 530 "XCHGL", LTYPE3, AXCHGL, 531 "XCHGW", LTYPE3, AXCHGW, 532 "XLAT", LTYPE2, AXLAT, 533 "XORB", LTYPE3, AXORB, 534 "XORL", LTYPE3, AXORL, 535 "XORW", LTYPE3, AXORW, 536 537 "CMOVLCC", LTYPE3, ACMOVLCC, 538 "CMOVLCS", LTYPE3, ACMOVLCS, 539 "CMOVLEQ", LTYPE3, ACMOVLEQ, 540 "CMOVLGE", LTYPE3, ACMOVLGE, 541 "CMOVLGT", LTYPE3, ACMOVLGT, 542 "CMOVLHI", LTYPE3, ACMOVLHI, 543 "CMOVLLE", LTYPE3, ACMOVLLE, 544 "CMOVLLS", LTYPE3, ACMOVLLS, 545 "CMOVLLT", LTYPE3, ACMOVLLT, 546 "CMOVLMI", LTYPE3, ACMOVLMI, 547 "CMOVLNE", LTYPE3, ACMOVLNE, 548 "CMOVLOC", LTYPE3, ACMOVLOC, 549 "CMOVLOS", LTYPE3, ACMOVLOS, 550 "CMOVLPC", LTYPE3, ACMOVLPC, 551 "CMOVLPL", LTYPE3, ACMOVLPL, 552 "CMOVLPS", LTYPE3, ACMOVLPS, 553 "CMOVWCC", LTYPE3, ACMOVWCC, 554 "CMOVWCS", LTYPE3, ACMOVWCS, 555 "CMOVWEQ", LTYPE3, ACMOVWEQ, 556 "CMOVWGE", LTYPE3, ACMOVWGE, 557 "CMOVWGT", LTYPE3, ACMOVWGT, 558 "CMOVWHI", LTYPE3, ACMOVWHI, 559 "CMOVWLE", LTYPE3, ACMOVWLE, 560 "CMOVWLS", LTYPE3, ACMOVWLS, 561 "CMOVWLT", LTYPE3, ACMOVWLT, 562 "CMOVWMI", LTYPE3, ACMOVWMI, 563 "CMOVWNE", LTYPE3, ACMOVWNE, 564 "CMOVWOC", LTYPE3, ACMOVWOC, 565 "CMOVWOS", LTYPE3, ACMOVWOS, 566 "CMOVWPC", LTYPE3, ACMOVWPC, 567 "CMOVWPL", LTYPE3, ACMOVWPL, 568 "CMOVWPS", LTYPE3, ACMOVWPS, 569 570 "FMOVB", LTYPE3, AFMOVB, 571 "FMOVBP", LTYPE3, AFMOVBP, 572 "FMOVD", LTYPE3, AFMOVD, 573 "FMOVDP", LTYPE3, AFMOVDP, 574 "FMOVF", LTYPE3, AFMOVF, 575 "FMOVFP", LTYPE3, AFMOVFP, 576 "FMOVL", LTYPE3, AFMOVL, 577 "FMOVLP", LTYPE3, AFMOVLP, 578 "FMOVV", LTYPE3, AFMOVV, 579 "FMOVVP", LTYPE3, AFMOVVP, 580 "FMOVW", LTYPE3, AFMOVW, 581 "FMOVWP", LTYPE3, AFMOVWP, 582 "FMOVX", LTYPE3, AFMOVX, 583 "FMOVXP", LTYPE3, AFMOVXP, 584 "FCMOVCC", LTYPE3, AFCMOVCC, 585 "FCMOVCS", LTYPE3, AFCMOVCS, 586 "FCMOVEQ", LTYPE3, AFCMOVEQ, 587 "FCMOVHI", LTYPE3, AFCMOVHI, 588 "FCMOVLS", LTYPE3, AFCMOVLS, 589 "FCMOVNE", LTYPE3, AFCMOVNE, 590 "FCMOVNU", LTYPE3, AFCMOVNU, 591 "FCMOVUN", LTYPE3, AFCMOVUN, 592 "FCOMB", LTYPE3, AFCOMB, 593 "FCOMBP", LTYPE3, AFCOMBP, 594 "FCOMD", LTYPE3, AFCOMD, 595 "FCOMDP", LTYPE3, AFCOMDP, 596 "FCOMDPP", LTYPE3, AFCOMDPP, 597 "FCOMF", LTYPE3, AFCOMF, 598 "FCOMFP", LTYPE3, AFCOMFP, 599 "FCOMI", LTYPE3, AFCOMI, 600 "FCOMIP", LTYPE3, AFCOMIP, 601 "FCOML", LTYPE3, AFCOML, 602 "FCOMLP", LTYPE3, AFCOMLP, 603 "FCOMW", LTYPE3, AFCOMW, 604 "FCOMWP", LTYPE3, AFCOMWP, 605 "FUCOM", LTYPE3, AFUCOM, 606 "FUCOMI", LTYPE3, AFUCOMI, 607 "FUCOMIP", LTYPE3, AFUCOMIP, 608 "FUCOMP", LTYPE3, AFUCOMP, 609 "FUCOMPP", LTYPE3, AFUCOMPP, 610 "FADDW", LTYPE3, AFADDW, 611 "FADDL", LTYPE3, AFADDL, 612 "FADDF", LTYPE3, AFADDF, 613 "FADDD", LTYPE3, AFADDD, 614 "FADDDP", LTYPE3, AFADDDP, 615 "FSUBDP", LTYPE3, AFSUBDP, 616 "FSUBW", LTYPE3, AFSUBW, 617 "FSUBL", LTYPE3, AFSUBL, 618 "FSUBF", LTYPE3, AFSUBF, 619 "FSUBD", LTYPE3, AFSUBD, 620 "FSUBRDP", LTYPE3, AFSUBRDP, 621 "FSUBRW", LTYPE3, AFSUBRW, 622 "FSUBRL", LTYPE3, AFSUBRL, 623 "FSUBRF", LTYPE3, AFSUBRF, 624 "FSUBRD", LTYPE3, AFSUBRD, 625 "FMULDP", LTYPE3, AFMULDP, 626 "FMULW", LTYPE3, AFMULW, 627 "FMULL", LTYPE3, AFMULL, 628 "FMULF", LTYPE3, AFMULF, 629 "FMULD", LTYPE3, AFMULD, 630 "FDIVDP", LTYPE3, AFDIVDP, 631 "FDIVW", LTYPE3, AFDIVW, 632 "FDIVL", LTYPE3, AFDIVL, 633 "FDIVF", LTYPE3, AFDIVF, 634 "FDIVD", LTYPE3, AFDIVD, 635 "FDIVRDP", LTYPE3, AFDIVRDP, 636 "FDIVRW", LTYPE3, AFDIVRW, 637 "FDIVRL", LTYPE3, AFDIVRL, 638 "FDIVRF", LTYPE3, AFDIVRF, 639 "FDIVRD", LTYPE3, AFDIVRD, 640 "FXCHD", LTYPE3, AFXCHD, 641 "FFREE", LTYPE1, AFFREE, 642 "FLDCW", LTYPE2, AFLDCW, 643 "FLDENV", LTYPE1, AFLDENV, 644 "FRSTOR", LTYPE2, AFRSTOR, 645 "FSAVE", LTYPE1, AFSAVE, 646 "FSTCW", LTYPE1, AFSTCW, 647 "FSTENV", LTYPE1, AFSTENV, 648 "FSTSW", LTYPE1, AFSTSW, 649 "F2XM1", LTYPE0, AF2XM1, 650 "FABS", LTYPE0, AFABS, 651 "FCHS", LTYPE0, AFCHS, 652 "FCLEX", LTYPE0, AFCLEX, 653 "FCOS", LTYPE0, AFCOS, 654 "FDECSTP", LTYPE0, AFDECSTP, 655 "FINCSTP", LTYPE0, AFINCSTP, 656 "FINIT", LTYPE0, AFINIT, 657 "FLD1", LTYPE0, AFLD1, 658 "FLDL2E", LTYPE0, AFLDL2E, 659 "FLDL2T", LTYPE0, AFLDL2T, 660 "FLDLG2", LTYPE0, AFLDLG2, 661 "FLDLN2", LTYPE0, AFLDLN2, 662 "FLDPI", LTYPE0, AFLDPI, 663 "FLDZ", LTYPE0, AFLDZ, 664 "FNOP", LTYPE0, AFNOP, 665 "FPATAN", LTYPE0, AFPATAN, 666 "FPREM", LTYPE0, AFPREM, 667 "FPREM1", LTYPE0, AFPREM1, 668 "FPTAN", LTYPE0, AFPTAN, 669 "FRNDINT", LTYPE0, AFRNDINT, 670 "FSCALE", LTYPE0, AFSCALE, 671 "FSIN", LTYPE0, AFSIN, 672 "FSINCOS", LTYPE0, AFSINCOS, 673 "FSQRT", LTYPE0, AFSQRT, 674 "FTST", LTYPE0, AFTST, 675 "FXAM", LTYPE0, AFXAM, 676 "FXTRACT", LTYPE0, AFXTRACT, 677 "FYL2X", LTYPE0, AFYL2X, 678 "FYL2XP1", LTYPE0, AFYL2XP1, 679 "LFENCE", LTYPE0, ALFENCE, 680 "MFENCE", LTYPE0, AMFENCE, 681 "SFENCE", LTYPE0, ASFENCE, 682 "EMMS", LTYPE0, AEMMS, 683 "PREFETCHT0", LTYPE2, APREFETCHT0, 684 "PREFETCHT1", LTYPE2, APREFETCHT1, 685 "PREFETCHT2", LTYPE2, APREFETCHT2, 686 "PREFETCHNTA", LTYPE2, APREFETCHNTA, 687 "UNDEF", LTYPE0, AUNDEF, 688 689 "ADDPD", LTYPE3, AADDPD, 690 "ADDPS", LTYPE3, AADDPS, 691 "ADDSD", LTYPE3, AADDSD, 692 "ADDSS", LTYPE3, AADDSS, 693 "AESENC", LTYPE3, AAESENC, 694 "ANDNPD", LTYPE3, AANDNPD, 695 "ANDNPS", LTYPE3, AANDNPS, 696 "ANDPD", LTYPE3, AANDPD, 697 "ANDPS", LTYPE3, AANDPS, 698 "CMPPD", LTYPEXC,ACMPPD, 699 "CMPPS", LTYPEXC,ACMPPS, 700 "CMPSD", LTYPEXC,ACMPSD, 701 "CMPSS", LTYPEXC,ACMPSS, 702 "COMISD", LTYPE3, ACOMISD, 703 "COMISS", LTYPE3, ACOMISS, 704 "CVTPL2PD", LTYPE3, ACVTPL2PD, 705 "CVTPL2PS", LTYPE3, ACVTPL2PS, 706 "CVTPD2PL", LTYPE3, ACVTPD2PL, 707 "CVTPD2PS", LTYPE3, ACVTPD2PS, 708 "CVTPS2PL", LTYPE3, ACVTPS2PL, 709 "CVTPS2PD", LTYPE3, ACVTPS2PD, 710 "CVTSD2SL", LTYPE3, ACVTSD2SL, 711 "CVTSD2SS", LTYPE3, ACVTSD2SS, 712 "CVTSL2SD", LTYPE3, ACVTSL2SD, 713 "CVTSL2SS", LTYPE3, ACVTSL2SS, 714 "CVTSS2SD", LTYPE3, ACVTSS2SD, 715 "CVTSS2SL", LTYPE3, ACVTSS2SL, 716 "CVTTPD2PL", LTYPE3, ACVTTPD2PL, 717 "CVTTPS2PL", LTYPE3, ACVTTPS2PL, 718 "CVTTSD2SL", LTYPE3, ACVTTSD2SL, 719 "CVTTSS2SL", LTYPE3, ACVTTSS2SL, 720 "DIVPD", LTYPE3, ADIVPD, 721 "DIVPS", LTYPE3, ADIVPS, 722 "DIVSD", LTYPE3, ADIVSD, 723 "DIVSS", LTYPE3, ADIVSS, 724 "MASKMOVOU", LTYPE3, AMASKMOVOU, 725 "MASKMOVDQU", LTYPE3, AMASKMOVOU, /* syn */ 726 "MAXPD", LTYPE3, AMAXPD, 727 "MAXPS", LTYPE3, AMAXPS, 728 "MAXSD", LTYPE3, AMAXSD, 729 "MAXSS", LTYPE3, AMAXSS, 730 "MINPD", LTYPE3, AMINPD, 731 "MINPS", LTYPE3, AMINPS, 732 "MINSD", LTYPE3, AMINSD, 733 "MINSS", LTYPE3, AMINSS, 734 "MOVAPD", LTYPE3, AMOVAPD, 735 "MOVAPS", LTYPE3, AMOVAPS, 736 "MOVO", LTYPE3, AMOVO, 737 "MOVOA", LTYPE3, AMOVO, /* syn */ 738 "MOVOU", LTYPE3, AMOVOU, 739 "MOVHLPS", LTYPE3, AMOVHLPS, 740 "MOVHPD", LTYPE3, AMOVHPD, 741 "MOVHPS", LTYPE3, AMOVHPS, 742 "MOVLHPS", LTYPE3, AMOVLHPS, 743 "MOVLPD", LTYPE3, AMOVLPD, 744 "MOVLPS", LTYPE3, AMOVLPS, 745 "MOVMSKPD", LTYPE3, AMOVMSKPD, 746 "MOVMSKPS", LTYPE3, AMOVMSKPS, 747 "MOVNTO", LTYPE3, AMOVNTO, 748 "MOVNTDQ", LTYPE3, AMOVNTO, /* syn */ 749 "MOVNTPD", LTYPE3, AMOVNTPD, 750 "MOVNTPS", LTYPE3, AMOVNTPS, 751 "MOVSD", LTYPE3, AMOVSD, 752 "MOVSS", LTYPE3, AMOVSS, 753 "MOVUPD", LTYPE3, AMOVUPD, 754 "MOVUPS", LTYPE3, AMOVUPS, 755 "MULPD", LTYPE3, AMULPD, 756 "MULPS", LTYPE3, AMULPS, 757 "MULSD", LTYPE3, AMULSD, 758 "MULSS", LTYPE3, AMULSS, 759 "ORPD", LTYPE3, AORPD, 760 "ORPS", LTYPE3, AORPS, 761 "PADDQ", LTYPE3, APADDQ, 762 "PAND", LTYPE3, APAND, 763 "PCMPEQB", LTYPE3, APCMPEQB, 764 "PMAXSW", LTYPE3, APMAXSW, 765 "PMAXUB", LTYPE3, APMAXUB, 766 "PMINSW", LTYPE3, APMINSW, 767 "PMINUB", LTYPE3, APMINUB, 768 "PMOVMSKB", LTYPE3, APMOVMSKB, 769 "PSADBW", LTYPE3, APSADBW, 770 "PSHUFB", LTYPE3, APSHUFB, 771 "PSUBB", LTYPE3, APSUBB, 772 "PSUBL", LTYPE3, APSUBL, 773 "PSUBQ", LTYPE3, APSUBQ, 774 "PSUBSB", LTYPE3, APSUBSB, 775 "PSUBSW", LTYPE3, APSUBSW, 776 "PSUBUSB", LTYPE3, APSUBUSB, 777 "PSUBUSW", LTYPE3, APSUBUSW, 778 "PSUBW", LTYPE3, APSUBW, 779 "PUNPCKHQDQ", LTYPE3, APUNPCKHQDQ, 780 "PUNPCKLQDQ", LTYPE3, APUNPCKLQDQ, 781 "RCPPS", LTYPE3, ARCPPS, 782 "RCPSS", LTYPE3, ARCPSS, 783 "RSQRTPS", LTYPE3, ARSQRTPS, 784 "RSQRTSS", LTYPE3, ARSQRTSS, 785 "SQRTPD", LTYPE3, ASQRTPD, 786 "SQRTPS", LTYPE3, ASQRTPS, 787 "SQRTSD", LTYPE3, ASQRTSD, 788 "SQRTSS", LTYPE3, ASQRTSS, 789 "SUBPD", LTYPE3, ASUBPD, 790 "SUBPS", LTYPE3, ASUBPS, 791 "SUBSD", LTYPE3, ASUBSD, 792 "SUBSS", LTYPE3, ASUBSS, 793 "UCOMISD", LTYPE3, AUCOMISD, 794 "UCOMISS", LTYPE3, AUCOMISS, 795 "UNPCKHPD", LTYPE3, AUNPCKHPD, 796 "UNPCKHPS", LTYPE3, AUNPCKHPS, 797 "UNPCKLPD", LTYPE3, AUNPCKLPD, 798 "UNPCKLPS", LTYPE3, AUNPCKLPS, 799 "XORPD", LTYPE3, AXORPD, 800 "XORPS", LTYPE3, AXORPS, 801 "USEFIELD", LTYPEN, AUSEFIELD, 802 "PCDATA", LTYPEPC, APCDATA, 803 "FUNCDATA", LTYPEF, AFUNCDATA, 804 0 805 }; 806 807 void 808 cinit(void) 809 { 810 Sym *s; 811 int i; 812 813 nullgen.sym = S; 814 nullgen.offset = 0; 815 if(FPCHIP) 816 nullgen.dval = 0; 817 for(i=0; i<sizeof(nullgen.sval); i++) 818 nullgen.sval[i] = 0; 819 nullgen.type = D_NONE; 820 nullgen.index = D_NONE; 821 nullgen.scale = 0; 822 823 nerrors = 0; 824 iostack = I; 825 iofree = I; 826 peekc = IGN; 827 nhunk = 0; 828 for(i=0; i<NHASH; i++) 829 hash[i] = S; 830 for(i=0; itab[i].name; i++) { 831 s = slookup(itab[i].name); 832 if(s->type != LNAME) 833 yyerror("double initialization %s", itab[i].name); 834 s->type = itab[i].type; 835 s->value = itab[i].value; 836 } 837 838 pathname = allocn(pathname, 0, 100); 839 if(getwd(pathname, 99) == 0) { 840 pathname = allocn(pathname, 100, 900); 841 if(getwd(pathname, 999) == 0) 842 strcpy(pathname, "/???"); 843 } 844 } 845 846 void 847 checkscale(int scale) 848 { 849 850 switch(scale) { 851 case 1: 852 case 2: 853 case 4: 854 case 8: 855 return; 856 } 857 yyerror("scale must be 1248: %d", scale); 858 } 859 860 void 861 syminit(Sym *s) 862 { 863 864 s->type = LNAME; 865 s->value = 0; 866 } 867 868 void 869 cclean(void) 870 { 871 Gen2 g2; 872 873 g2.from = nullgen; 874 g2.to = nullgen; 875 outcode(AEND, &g2); 876 Bflush(&obuf); 877 } 878 879 void 880 zname(char *n, int t, int s) 881 { 882 883 BPUTLE2(&obuf, ANAME); /* as(2) */ 884 BPUTC(&obuf, t); /* type */ 885 BPUTC(&obuf, s); /* sym */ 886 while(*n) { 887 BPUTC(&obuf, *n); 888 n++; 889 } 890 BPUTC(&obuf, 0); 891 } 892 893 void 894 zaddr(Gen *a, int s) 895 { 896 int32 l; 897 int i, t; 898 char *n; 899 Ieee e; 900 901 t = 0; 902 if(a->index != D_NONE || a->scale != 0) 903 t |= T_INDEX; 904 if(a->offset != 0) 905 t |= T_OFFSET; 906 if(s != 0) 907 t |= T_SYM; 908 909 switch(a->type) { 910 default: 911 t |= T_TYPE; 912 break; 913 case D_FCONST: 914 t |= T_FCONST; 915 break; 916 case D_CONST2: 917 t |= T_OFFSET|T_OFFSET2; 918 break; 919 case D_SCONST: 920 t |= T_SCONST; 921 break; 922 case D_NONE: 923 break; 924 } 925 BPUTC(&obuf, t); 926 927 if(t & T_INDEX) { /* implies index, scale */ 928 BPUTC(&obuf, a->index); 929 BPUTC(&obuf, a->scale); 930 } 931 if(t & T_OFFSET) { /* implies offset */ 932 l = a->offset; 933 BPUTLE4(&obuf, l); 934 } 935 if(t & T_OFFSET2) { 936 l = a->offset2; 937 BPUTLE4(&obuf, l); 938 } 939 if(t & T_SYM) /* implies sym */ 940 BPUTC(&obuf, s); 941 if(t & T_FCONST) { 942 ieeedtod(&e, a->dval); 943 BPUTLE4(&obuf, e.l); 944 BPUTLE4(&obuf, e.h); 945 return; 946 } 947 if(t & T_SCONST) { 948 n = a->sval; 949 for(i=0; i<NSNAME; i++) { 950 BPUTC(&obuf, *n); 951 n++; 952 } 953 return; 954 } 955 if(t & T_TYPE) 956 BPUTC(&obuf, a->type); 957 } 958 959 void 960 outcode(int a, Gen2 *g2) 961 { 962 int sf, st, t; 963 Sym *s; 964 965 if(pass == 1) 966 goto out; 967 968 jackpot: 969 sf = 0; 970 s = g2->from.sym; 971 while(s != S) { 972 sf = s->sym; 973 if(sf < 0 || sf >= NSYM) 974 sf = 0; 975 t = g2->from.type; 976 if(t == D_ADDR) 977 t = g2->from.index; 978 if(h[sf].type == t) 979 if(h[sf].sym == s) 980 break; 981 zname(s->name, t, sym); 982 s->sym = sym; 983 h[sym].sym = s; 984 h[sym].type = t; 985 sf = sym; 986 sym++; 987 if(sym >= NSYM) 988 sym = 1; 989 break; 990 } 991 st = 0; 992 s = g2->to.sym; 993 while(s != S) { 994 st = s->sym; 995 if(st < 0 || st >= NSYM) 996 st = 0; 997 t = g2->to.type; 998 if(t == D_ADDR) 999 t = g2->to.index; 1000 if(h[st].type == t) 1001 if(h[st].sym == s) 1002 break; 1003 zname(s->name, t, sym); 1004 s->sym = sym; 1005 h[sym].sym = s; 1006 h[sym].type = t; 1007 st = sym; 1008 sym++; 1009 if(sym >= NSYM) 1010 sym = 1; 1011 if(st == sf) 1012 goto jackpot; 1013 break; 1014 } 1015 BPUTLE2(&obuf, a); 1016 BPUTLE4(&obuf, stmtline); 1017 zaddr(&g2->from, sf); 1018 zaddr(&g2->to, st); 1019 1020 out: 1021 if(a != AGLOBL && a != ADATA) 1022 pc++; 1023 } 1024 1025 void 1026 outhist(void) 1027 { 1028 Gen g; 1029 Hist *h; 1030 char *p, *q, *op, c; 1031 int n; 1032 char *tofree; 1033 static int first = 1; 1034 static char *goroot, *goroot_final; 1035 1036 if(first) { 1037 // Decide whether we need to rewrite paths from $GOROOT to $GOROOT_FINAL. 1038 first = 0; 1039 goroot = getenv("GOROOT"); 1040 goroot_final = getenv("GOROOT_FINAL"); 1041 if(goroot == nil) 1042 goroot = ""; 1043 if(goroot_final == nil) 1044 goroot_final = goroot; 1045 if(strcmp(goroot, goroot_final) == 0) { 1046 goroot = nil; 1047 goroot_final = nil; 1048 } 1049 } 1050 1051 tofree = nil; 1052 1053 g = nullgen; 1054 c = pathchar(); 1055 for(h = hist; h != H; h = h->link) { 1056 p = h->name; 1057 if(p != nil && goroot != nil) { 1058 n = strlen(goroot); 1059 if(strncmp(p, goroot, strlen(goroot)) == 0 && p[n] == '/') { 1060 tofree = smprint("%s%s", goroot_final, p+n); 1061 p = tofree; 1062 } 1063 } 1064 op = 0; 1065 if(systemtype(Windows) && p && p[1] == ':'){ 1066 c = p[2]; 1067 } else if(p && p[0] != c && h->offset == 0 && pathname){ 1068 if(systemtype(Windows) && pathname[1] == ':') { 1069 op = p; 1070 p = pathname; 1071 c = p[2]; 1072 } else if(pathname[0] == c){ 1073 op = p; 1074 p = pathname; 1075 } 1076 } 1077 while(p) { 1078 q = strchr(p, c); 1079 if(q) { 1080 n = q-p; 1081 if(n == 0){ 1082 n = 1; /* leading "/" */ 1083 *p = '/'; /* don't emit "\" on windows */ 1084 } 1085 q++; 1086 } else { 1087 n = strlen(p); 1088 q = 0; 1089 } 1090 if(n) { 1091 BPUTLE2(&obuf, ANAME); 1092 BPUTC(&obuf, D_FILE); /* type */ 1093 BPUTC(&obuf, 1); /* sym */ 1094 BPUTC(&obuf, '<'); 1095 Bwrite(&obuf, p, n); 1096 BPUTC(&obuf, 0); 1097 } 1098 p = q; 1099 if(p == 0 && op) { 1100 p = op; 1101 op = 0; 1102 } 1103 } 1104 g.offset = h->offset; 1105 1106 BPUTLE2(&obuf, AHISTORY); 1107 BPUTLE4(&obuf, h->line); 1108 zaddr(&nullgen, 0); 1109 zaddr(&g, 0); 1110 1111 if(tofree) { 1112 free(tofree); 1113 tofree = nil; 1114 } 1115 } 1116 } 1117 1118 #include "../cc/lexbody" 1119 #include "../cc/macbody"