1 #ifndef lint 2 static char sccsid[] = "@(#)table.c 1.21 (Berkeley) 02/29/88"; 3 #endif 4 5 # include "pass2.h" 6 /* special shapes (SSOREG,SZERO etc.) shouldn't be or-ed */ 7 # define AWD SNAME|SOREG|SCON|STARNM|STARREG 8 /* tbl */ 9 # define ANYSIGNED TPOINT|TINT|TSHORT|TCHAR 10 # define ANYUSIGNED TUNSIGNED|TUSHORT|TUCHAR 11 # define ANYFIXED ANYSIGNED|ANYUSIGNED 12 # define TWORD TINT|TUNSIGNED|TPOINT 13 /* tbl */ 14 15 struct optab table[] = { 16 17 #ifdef REG_CHAR 18 PCONV, INAREG|INTAREG, 19 SAREG|AWD, TCHAR|TSHORT, 20 SANY, TPOINT, 21 NAREG|NASL, RESC1, 22 " cvtZLl AL,A1\n", 23 24 PCONV, INAREG|INTAREG, 25 SAREG|AWD, TUCHAR|TUSHORT, 26 SANY, TPOINT, 27 NAREG|NASL, RESC1, 28 " movzZLl AL,A1\n", 29 #endif 30 31 /* the following entry is to fix a problem with 32 the manner that the first pass handles the 33 type of a shift expression */ 34 PCONV, INAREG|INTAREG, 35 SAREG|AWD, TINT|TUNSIGNED, 36 SANY, TPOINT, 37 NAREG|NASL, RLEFT, 38 "", 39 40 /* take care of redundant conversions introduced by reclaim() */ 41 SCONV, INAREG|INTAREG, 42 STAREG, TWORD, 43 SANY, TWORD, 44 0, RLEFT, 45 "", 46 47 SCONV, INAREG|INTAREG, 48 SAREG|AWD, ANYFIXED, 49 SANY, ANYFIXED, 50 NAREG|NASL, RESC1, 51 " ZU\n", 52 53 SCONV, FORCC, 54 SAREG|AWD, ANYFIXED, 55 SANY, ANYFIXED, 56 NAREG|NASL, RESCC, 57 " ZV\n", 58 59 SCONV, INAREG|INTAREG|FORCC, 60 SAREG|AWD, TDOUBLE, 61 SANY, TFLOAT, 62 NAREG|NASL, RESC1|RESCC, 63 " ldd AL\n cvdf\n stf TA1\n", 64 65 SCONV, INAREG|INTAREG|FORCC, 66 SAREG|AWD, TFLOAT, 67 SANY, TDOUBLE, 68 NAREG|NASL, RESC1|RESCC, 69 " ldfd AL\n std A1\n", 70 71 SCONV, INAREG|INTAREG|FORCC, 72 SAREG|AWD, TINT, 73 SANY, TFLOAT|TDOUBLE, 74 NAREG|NASL, RESC1|RESCC, 75 " cvlZR AL\n stZR TA1\n", 76 77 /* the hard stuff */ 78 /* XXX how about TUCHAR|TUSHORT to TFLOAT|TDOUBLE? */ 79 SCONV, INAREG|INTAREG|FORCC, 80 SAREG|AWD, TUNSIGNED, 81 SANY, TFLOAT|TDOUBLE, 82 NAREG|NASL, RESC1|RESCC, 83 " ZY\n", 84 85 SCONV, INAREG|INTAREG|FORCC, 86 SAREG|AWD, TFLOAT|TDOUBLE, 87 SANY, ANYUSIGNED, 88 NAREG|NASL, RESC1|RESCC, 89 " ZW\n", 90 91 /* XXX need to trim significance here? */ 92 SCONV, INAREG|INTAREG|FORCC, 93 SAREG|AWD, TFLOAT|TDOUBLE, 94 SANY, ANYSIGNED, 95 NAREG|NASL, RESC1|RESCC, 96 " ldZL AL\n cvZLl A1\n", 97 98 INIT, FOREFF, 99 SCON, TANY, 100 SANY, TWORD, 101 0, RNOP, 102 " .long CL\n", 103 104 INIT, FOREFF, 105 SCON, TANY, 106 SANY, TSHORT|TUSHORT, 107 0, RNOP, 108 " .word CL\n", 109 110 INIT, FOREFF, 111 SCON, TANY, 112 SANY, TCHAR|TUCHAR, 113 0, RNOP, 114 " .byte CL\n", 115 116 #ifdef FORT 117 /* for the use of fortran only */ 118 119 GOTO, FOREFF, 120 SCON, TANY, 121 SANY, TANY, 122 0, RNOP, 123 " jbr CL\n", 124 #endif 125 126 GOTO, FOREFF, 127 AWD, TANY, 128 SANY, TANY, 129 0, RNOP, 130 " jmp *AL\n", 131 132 GOTO, FOREFF, 133 SAREG, TANY, 134 SANY, TANY, 135 0, RNOP, 136 " jmp (AL)\n", 137 138 STARG, FORARG, 139 SCON|SOREG, TANY, 140 SANY, TANY, 141 NTEMP+2*NAREG, RESC3, 142 "ZS", 143 144 STASG, FORARG, 145 SNAME|SOREG, TANY, 146 SCON|SAREG, TANY, 147 0, RNULL, 148 " ZT\nZS", 149 150 STASG, FOREFF, 151 SNAME|SOREG, TANY, 152 SCON|SAREG, TANY, 153 0, RNOP, 154 "ZS", 155 156 STASG, INAREG, 157 SNAME|SOREG, TANY, 158 SCON, TANY, 159 NAREG, RESC1, 160 "ZS movl AR,A1\n", 161 162 STASG, INAREG, 163 SNAME|SOREG, TANY, 164 SAREG, TANY, 165 0, RRIGHT, 166 " pushl AR\nZS movl (sp)+,AR\n", 167 168 OPLOG, FORCC, 169 SAREG|AWD, TWORD, 170 SAREG|AWD, TWORD, 171 0, RESCC, 172 " cmpl AL,AR\nZP", 173 174 /* more grot: constants in unsigned char/short comparisons sign-extend */ 175 /* optim2() ensures that SCCON/SSCON iff high bit is not set */ 176 OPLOG, FORCC, 177 SAREG|AWD, TUCHAR, 178 SCCON, TANY, 179 0, RESCC, 180 " cmpZL AL,AR\nZP", 181 182 OPLOG, FORCC, 183 AWD, TUCHAR, 184 SCON, TANY, 185 NAREG, RESCC, 186 " movzZLl AL,A1\n cmpl A1,AR\nZP", 187 188 OPLOG, FORCC, 189 SAREG|AWD, TUSHORT, 190 SSCON, TANY, 191 0, RESCC, 192 " cmpZL AL,AR\nZP", 193 194 OPLOG, FORCC, 195 AWD, TUSHORT, 196 SCON, TANY, 197 NAREG, RESCC, 198 " movzZLl AL,A1\n cmpl A1,AR\nZP", 199 200 /* optim2() handles degenerate comparisons with constants */ 201 OPLOG, FORCC, 202 SAREG|AWD, TCHAR|TSHORT, 203 SCON, TANY, 204 0, RESCC, 205 " cmpZL AL,AR\nZP", 206 207 OPLOG, FORCC, 208 SAREG|AWD, TSHORT, 209 SAREG|AWD, TSHORT, 210 0, RESCC, 211 " cmpw AL,AR\nZP", 212 213 OPLOG, FORCC, 214 SAREG|AWD, TUSHORT, 215 SAREG|AWD, TUSHORT, 216 0, RESCC, 217 " cmpw AL,AR\nZP", 218 219 OPLOG, FORCC, 220 SAREG|AWD, TCHAR, 221 SAREG|AWD, TCHAR, 222 0, RESCC, 223 " cmpb AL,AR\nZP", 224 225 OPLOG, FORCC, 226 SAREG|AWD, TUCHAR, 227 SAREG|AWD, TUCHAR, 228 0, RESCC, 229 " cmpb AL,AR\nZP", 230 231 OPLOG, FORCC, 232 SAREG|AWD, TFLOAT, 233 SAREG|AWD, TFLOAT, 234 0, RESCC, 235 " cmpZL2 AL,AR\nZP", 236 237 OPLOG, FORCC, 238 SZERO, TDOUBLE, 239 SAREG|AWD, TDOUBLE, 240 0, RESCC, 241 " cmpf2 AL,AR\nZP", 242 243 OPLOG, FORCC, 244 SAREG|AWD, TDOUBLE, 245 SAREG|AWD, TDOUBLE, 246 0, RESCC, 247 " cmpZL2 AL,AR\nZP", 248 249 #ifdef FORT 250 /* some implicit conversions made explicit to help f77 out (sigh) */ 251 OPLOG, FORCC, 252 SAREG|AWD, TFLOAT, 253 SAREG|AWD, TDOUBLE, 254 0, RESCC, 255 " ldfd AL\n cmpd AR\nZP", 256 257 /* ought to flip this comparison, save an instruction */ 258 OPLOG, FORCC, 259 SAREG|AWD, TDOUBLE, 260 SAREG|AWD, TFLOAT, 261 NAREG|NEVEN|NASR, RESCC, 262 " ldfd AR\n std A1\n cmpd2 AL,A1\nZP", 263 #endif 264 265 CCODES, INAREG|INTAREG, 266 SANY, TANY, 267 SANY, TANY, 268 NAREG, RESC1, 269 " movl $1,A1\nZN", 270 271 UNARY CALL, INAREG|INTAREG, 272 SCON, TANY, 273 SANY, TANY, 274 NAREG|NASL, RESC1, /* should be register 0 */ 275 " ZC,CL\n", 276 277 UNARY CALL, INAREG|INTAREG, 278 SAREG, TANY, 279 SANY, TANY, 280 NAREG|NASL, RESC1, /* should be 0 */ 281 " ZC,(AL)\n", 282 283 UNARY CALL, INAREG|INTAREG, 284 SNAME, TANY, 285 SANY, TANY, 286 NAREG|NASL, RESC1, /* really reg 0 */ 287 " ZC,*AL\n", 288 289 UNARY CALL, INAREG|INTAREG, 290 SSOREG, TANY, 291 SANY, TANY, 292 NAREG|NASL, RESC1, /* really reg 0 */ 293 " ZC,*AL\n", 294 295 FORTCALL, INAREG|INTAREG, 296 SCON, TANY, 297 SAREG|AWD, TFLOAT, 298 NAREG|NASL|NASR, RESC1, 299 " ldf AR\n CLf\n stf TA1\n", 300 301 ASG OPSHFT, INAREG|FOREFF|FORCC, 302 SAREG|AWD, TWORD, 303 SAREG|SCON, ANYFIXED, 304 0, RLEFT|RESCC, 305 " ZH AR,AL,AL\n", 306 307 ASG OPSHFT, INAREG|FOREFF|FORCC, 308 SAREG|AWD, TWORD, 309 AWD, TCHAR|TUCHAR, 310 0, RLEFT|RESCC, 311 " ZH AR,AL,AL\n", 312 313 ASG OPSHFT, INAREG|FOREFF|FORCC, 314 SAREG|AWD, TWORD, 315 AWD, ANYFIXED, 316 NAREG, RLEFT|RESCC, 317 " ZB AR,A1\n ZH A1,AL,AL\n", 318 319 OPSHFT, INAREG|INTAREG|FORCC, 320 SAREG|AWD, TWORD, 321 SAREG|SCON, ANYFIXED, 322 NAREG|NASL|NASR, RESC1|RESCC, 323 " ZH AR,AL,A1\n", 324 325 OPSHFT, INAREG|INTAREG|FORCC, 326 SAREG|AWD, TWORD, 327 AWD, TCHAR|TUCHAR, 328 NAREG|NASL|NASR, RESC1|RESCC, 329 " ZH AR,AL,A1\n", 330 331 OPSHFT, INAREG|INTAREG|FORCC, 332 SAREG|AWD, TWORD, 333 AWD, ANYFIXED, 334 NAREG|NASR, RESC1|RESCC, 335 " ZB AR,A1\n ZH A1,AL,A1\n", 336 337 INCR, FOREFF, 338 SAREG|AWD, TANY, 339 SCON|SNAME, TANY, 340 0, RLEFT, 341 " ZE\n", 342 343 DECR, FOREFF, 344 SAREG|AWD, TANY, 345 SCON|SNAME, TANY, 346 0, RLEFT, 347 " ZE\n", 348 349 INCR, INAREG|INTAREG, 350 SAREG|AWD, TANY, 351 SCON|SNAME, TANY, 352 NAREG, RESC1, 353 " ZD\n", 354 355 DECR, INAREG|INTAREG, 356 SAREG|AWD, TANY, 357 SCON|SNAME, TANY, 358 NAREG, RESC1, 359 " ZD\n", 360 361 ASSIGN, INAREG|FOREFF, 362 SAREG|AWD, ANYFIXED, 363 SAREG|AWD, ANYFIXED, 364 0, RLEFT, 365 " ZU\n", 366 367 ASSIGN, FORCC, 368 SAREG|AWD, ANYFIXED, 369 SAREG|AWD, ANYFIXED, 370 0, RESCC, 371 " ZV\n", 372 373 ASSIGN, INAREG|FOREFF|FORCC, 374 SIREG, TDOUBLE, 375 SZERO, TANY, 376 0, RLEFT|RESCC, 377 " cvld $0\n std AL\n", 378 379 ASSIGN, INAREG|FOREFF|FORCC, 380 SAREG|SNAME|SOREG, TDOUBLE, 381 SZERO, TANY, 382 0, RLEFT|RESCC, 383 " clrl UL\n clrl AL\n", 384 385 ASSIGN, INAREG|FOREFF|FORCC, 386 SAREG|AWD, TDOUBLE, 387 SIREG, TDOUBLE, 388 0, RLEFT|RRIGHT|RESCC, 389 " ldd AR\n std AL\n", 390 391 ASSIGN, INAREG|FOREFF|FORCC, 392 SIREG, TDOUBLE, 393 SAREG|AWD, TDOUBLE, 394 0, RLEFT|RRIGHT|RESCC, 395 " ldd AR\n std AL\n", 396 397 ASSIGN, INAREG|FOREFF|FORCC, 398 SAREG|SNAME|SOREG, TDOUBLE, 399 SAREG|SNAME|SOREG, TDOUBLE, 400 0, RLEFT|RRIGHT|RESCC, 401 " movl UR,UL\n movl AR,AL\n", 402 403 ASSIGN, INAREG|FOREFF|FORCC, 404 SAREG|AWD, TDOUBLE, 405 STARNM, TDOUBLE, 406 0, RLEFT|RRIGHT|RESCC, 407 " ldd AR\n std AL\n", 408 409 ASSIGN, INAREG|FOREFF|FORCC, 410 STARNM, TDOUBLE, 411 SAREG|AWD, TDOUBLE, 412 0, RLEFT|RRIGHT|RESCC, 413 " ldd AR\n std AL\n", 414 415 ASSIGN, INAREG|FOREFF|FORCC, 416 SAREG|AWD, TFLOAT, 417 SZERO, TANY, 418 0, RLEFT|RESCC, 419 " clrl TAL\n", 420 421 ASSIGN, INAREG|FOREFF|FORCC, 422 SAREG|AWD, TFLOAT, 423 SAREG|AWD, TFLOAT, 424 0, RLEFT|RRIGHT|RESCC, 425 " movl AR,TAL\n", 426 427 ASSIGN, INAREG|FOREFF|FORCC, 428 SAREG|AWD, TFLOAT, 429 SAREG|AWD, TDOUBLE, 430 0, RLEFT|RESCC, 431 " ldd AR\n cvdf\n stf AL\n", 432 433 ASSIGN, INAREG|FOREFF|FORCC, 434 SAREG|AWD, TDOUBLE, 435 SAREG|AWD, TFLOAT, 436 0, RLEFT|RESCC, 437 " ldfd AR\n std AL\n", 438 439 ASSIGN, INAREG|FOREFF|FORCC, 440 SAREG|AWD, TFLOAT|TDOUBLE, 441 SAREG|AWD, TINT, 442 0, RLEFT|RESCC, 443 " cvlZL AR\n stZL AL\n", 444 445 /* XXX need to trim significance here? */ 446 ASSIGN, INAREG|FOREFF|FORCC, 447 SAREG|AWD, TINT, 448 SAREG|AWD, TFLOAT|TDOUBLE, 449 0, RLEFT|RESCC, 450 " ldZR AR\n cvZRl AL\n", 451 452 /* unfortunately assignments are exempt from type balancing */ 453 ASSIGN, INAREG|FOREFF|FORCC, 454 SAREG|AWD, TCHAR|TUCHAR|TSHORT|TUSHORT, 455 SAREG|AWD, TFLOAT|TDOUBLE, 456 NAREG|NASL, RLEFT|RESCC, 457 " ldZR AR\n cvZRl A1\n cvtlZL A1,AL\n", 458 459 ASSIGN, INAREG|FOREFF|FORCC, 460 SAREG|AWD, TFLOAT|TDOUBLE, 461 SAREG|AWD, TCHAR|TSHORT, 462 NAREG|NASL, RLEFT|RESCC, 463 " cvtZRl AR,A1\n cvlZL A1\n stZL AL\n", 464 465 ASSIGN, INAREG|FOREFF|FORCC, 466 SAREG|AWD, TFLOAT|TDOUBLE, 467 SAREG|AWD, TUCHAR|TUSHORT, 468 NAREG|NASL, RLEFT|RESCC, 469 " movzZRl AR,A1\n cvlZL A1\n stZL AL\n", 470 471 ASSIGN, INAREG|FOREFF|FORCC, 472 SAREG|AWD, TUNSIGNED, 473 SAREG|AWD, TFLOAT|TDOUBLE, 474 0, RLEFT, 475 " ZW\n", 476 477 ASSIGN, INAREG|FOREFF|FORCC, 478 SAREG|AWD, TFLOAT|TDOUBLE, 479 SAREG|AWD, TUNSIGNED, 480 0, RLEFT, 481 " ZY\n", 482 483 ASSIGN, INAREG|FOREFF, 484 SFLD, TANY, 485 SZERO, TANY, 486 0, RRIGHT, 487 " andl2 N,AL\n", 488 489 ASSIGN, FOREFF, 490 SFLD, TANY, 491 SCON, TANY, 492 0, RNOP, 493 " andl2 N,AL\n orl2 ZF,AL\n", 494 495 ASSIGN, INAREG, 496 SFLD, TANY, 497 SCON, TANY, 498 NAREG, RESC1, 499 " andl2 N,AL\n orl2 ZF,AL\n ZI\n", 500 501 ASSIGN, FOREFF, 502 SFLD, TANY, 503 SAREG|AWD, TWORD, 504 NAREG|NASR, RNOP, 505 " shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\ 506 orl2 A1,AL\n", 507 508 ASSIGN, INAREG, 509 SFLD, TANY, 510 SAREG|AWD, TWORD, 511 NAREG, RESC1, 512 " shll $H,AR,A1\n andl2 M,A1\n andl2 N,AL\n\ 513 orl2 A1,AL\n ZI\n", 514 515 /* dummy UNARY MUL entry to get U* to possibly match OPLTYPE */ 516 UNARY MUL, FOREFF, 517 SCC, TANY, 518 SCC, TANY, 519 0, RNULL, 520 " help help help\n", 521 522 REG, INTEMP, 523 SANY, TANY, 524 SAREG, TDOUBLE, 525 2*NTEMP, RESC1, 526 " movl UR,U1\n movl AR,A1\n", 527 528 REG, INTEMP, 529 SANY, TANY, 530 SAREG, TANY, 531 NTEMP, RESC1, 532 " movl AR,A1\n", 533 534 REG, FORARG, 535 SANY, TANY, 536 SAREG, TFLOAT, 537 0, RNULL, 538 " pushl $0\n pushl AR\n", 539 540 REG, FORARG, 541 SANY, TANY, 542 SAREG, TDOUBLE, 543 0, RNULL, 544 " pushl UR\n pushl AR\n", 545 546 OREG, INTEMP, 547 SANY, TANY, 548 SOREG, TDOUBLE, 549 2*NTEMP, RESC1, 550 " movl UR,U1\n movl AR,A1\n", 551 552 OREG, INTEMP, 553 SANY, TANY, 554 SOREG, TANY, 555 NTEMP, RESC1, 556 " movl AR,A1\n", 557 558 OPLEAF, FOREFF, 559 SANY, TANY, 560 SAREG|AWD, TANY, 561 0, RLEFT, 562 "", 563 564 OPLTYPE, INAREG|INTAREG, 565 SANY, TANY, 566 SZERO, TDOUBLE, 567 NAREG|NASR, RESC1, 568 " clrl U1\n clrl A1\n", 569 570 OPLTYPE, INAREG|INTAREG, 571 SANY, TANY, 572 SIREG, TDOUBLE, 573 NAREG|NASR, RESC1, 574 " ldd AR\n std A1\n", 575 576 OPLTYPE, INAREG|INTAREG, 577 SANY, TANY, 578 SAREG|SNAME|SOREG|SCON, TDOUBLE, 579 NAREG, RESC1, 580 " movl AR,A1\n movl UR,U1\n", 581 582 OPLTYPE, INAREG|INTAREG, 583 SANY, TANY, 584 STARNM, TDOUBLE, 585 NAREG|NASR, RESC1, 586 " ldd AR\n std A1\n", 587 588 OPLTYPE, INAREG|INTAREG, 589 SANY, TANY, 590 SZERO, TANY, 591 NAREG|NASR, RESC1, 592 " clrl TA1\n", 593 594 OPLTYPE, INAREG|INTAREG, 595 SANY, TANY, 596 SAREG|AWD, TFLOAT, 597 NAREG|NASR, RESC1, 598 " movl AR,TA1\n", 599 600 OPLTYPE, INAREG|INTAREG, 601 SANY, TANY, 602 SANY, ANYFIXED, 603 NAREG|NASR, RESC1, 604 " ZU\n", 605 606 OPLTYPE, FORCC, 607 SANY, TANY, 608 SAREG|AWD, TFLOAT, 609 0, RESCC, 610 " ldf AR\n tstf\n", 611 612 OPLTYPE, FORCC, 613 SANY, TANY, 614 SAREG|AWD, TDOUBLE, 615 0, RESCC, 616 " ldd AR\n tstd\n", 617 618 OPLTYPE, FORCC, 619 SANY, TANY, 620 SANY, ANYFIXED, 621 0, RESCC, 622 " tstZR AR\n", 623 624 OPLTYPE, FORARG, 625 SANY, TANY, 626 SANY, TWORD, 627 0, RNULL, 628 " pushl AR\n", 629 630 OPLTYPE, FORARG, 631 SANY, TANY, 632 SANY, TCHAR|TSHORT, 633 0, RNULL, 634 " pushZR AR\n", 635 636 OPLTYPE, FORARG, 637 SANY, TANY, 638 SANY, TUCHAR|TUSHORT, 639 0, RNULL, 640 " movzZRl AR,-(sp)\n", 641 642 OPLTYPE, FORARG, 643 SANY, TANY, 644 SZERO, TFLOAT|TDOUBLE, 645 0, RNULL, 646 " pushl $0\n pushl $0\n", 647 648 OPLTYPE, FORARG, 649 SANY, TANY, 650 SIREG, TDOUBLE, 651 0, RNULL, 652 " ldd AR\n pushd\n", 653 654 OPLTYPE, FORARG, 655 SANY, TANY, 656 SAREG|SNAME|SOREG, TDOUBLE, 657 0, RNULL, 658 " pushl UR\n pushl AR\n", 659 660 OPLTYPE, FORARG, 661 SANY, TANY, 662 STARNM, TDOUBLE, 663 0, RNULL, 664 " ldd AR\n pushd\n", 665 666 OPLTYPE, FORARG, 667 SANY, TANY, 668 SAREG|AWD, TFLOAT, 669 0, RNULL, 670 " pushl $0\n pushl AR\n", 671 672 UNARY MINUS, INAREG|INTAREG|FORCC, 673 SAREG|AWD, ANYSIGNED|TUNSIGNED, 674 SANY, TANY, 675 NAREG|NASL, RESC1|RESCC, 676 " mnegZL AL,A1\n", 677 678 UNARY MINUS, INAREG|INTAREG|FORCC, 679 SAREG|AWD, TFLOAT|TDOUBLE, 680 SANY, TANY, 681 NAREG|NASL, RESC1|RESCC, 682 " lnZL AL\n stZL TA1\n", 683 684 COMPL, INAREG|INTAREG|FORCC, 685 SAREG|AWD, ANYSIGNED|TUNSIGNED, 686 SANY, TANY, 687 NAREG|NASL, RESC1|RESCC, 688 " mcomZL AL,A1\n", 689 690 COMPL, INAREG|INTAREG|FORCC, 691 SAREG|AWD, ANYFIXED, 692 SANY, TANY, 693 NAREG|NASL, RESC1|RESCC, 694 " movzZLl AL,A1\n mcoml A1,A1\n", 695 696 AND, FORCC, 697 SAREG|AWD, TWORD, 698 SAREG|AWD, TWORD, 699 0, RESCC, 700 " bitl AR,AL\n", 701 702 AND, FORCC, 703 SAREG|AWD, TSHORT|TUSHORT, 704 SSCON, TWORD, 705 0, RESCC, 706 " bitw AR,AL\n", 707 708 AND, FORCC, 709 SAREG|AWD, TSHORT|TUSHORT, 710 SAREG|AWD, TSHORT|TUSHORT, 711 0, RESCC, 712 " bitw AR,AL\n", 713 714 AND, FORCC, 715 SAREG|AWD, TCHAR|TUCHAR, 716 SCCON, TWORD, 717 0, RESCC, 718 " bitb AR,AL\n", 719 720 AND, FORCC, 721 SAREG|AWD, TCHAR|TUCHAR, 722 SAREG|AWD, TCHAR|TUCHAR, 723 0, RESCC, 724 " bitb AR,AL\n", 725 726 /* General cases for DIV and ASG DIV are handled below with OPMUL */ 727 /* Some special cases are handled in optim2() */ 728 729 DIV, INAREG|FOREFF|FORCC, 730 SAREG|AWD, TUNSIGNED|TULONG, 731 SCON, ANYUSIGNED, 732 NAREG|NEVEN, RESC1|RESCC, 733 " movl AL,U1\n clrl A1\n ediv AR,A1,A1,U1\n", 734 735 ASG DIV, INAREG|FOREFF|FORCC, 736 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 737 SMCON, ANYUSIGNED, 738 0, RLEFT|RESCC, 739 " ZJ\n", 740 741 ASG DIV, INAREG|FOREFF|FORCC, 742 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 743 SCON, ANYUSIGNED, 744 NAREG|NEVEN, RLEFT|RESCC, 745 " movl AL,U1\n clrl A1\n ediv AR,A1,AL,U1\n", 746 747 MOD, INAREG|INTAREG, 748 SAREG|AWD, TINT|TLONG, 749 SAREG|AWD, TINT|TLONG, 750 NAREG|NEVEN, RESC1, 751 " ZM ediv AR,A1,U1,A1\n", 752 753 MOD, INAREG|FOREFF, 754 SAREG|AWD, TUNSIGNED|TULONG, 755 SMCON, ANYUSIGNED, 756 NAREG|NASL, RLEFT|RESC1, 757 " ZJ\n", 758 759 MOD, INAREG|FOREFF, 760 SAREG|AWD, TUNSIGNED|TULONG, 761 SCON, ANYUSIGNED, 762 NAREG|NEVEN, RESC1, 763 " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n", 764 765 /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */ 766 /* beware -- the ediv remainder operand must be a register */ 767 ASG MOD, INAREG|FOREFF, 768 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 769 SAREG|AWD, TINT|TLONG, 770 NAREG|NEVEN, RLEFT|RESCC, 771 " ZM ediv AR,A1,U1,A1\n movl A1,AL\n", 772 773 ASG MOD, INAREG|FOREFF, 774 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 775 SMCON, ANYUSIGNED, 776 0, RLEFT, 777 " ZJ\n", 778 779 ASG MOD, INAREG|FOREFF, 780 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 781 SCON, ANYUSIGNED, 782 NAREG|NEVEN, RLEFT, 783 " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n movl A1,AL\n", 784 785 /* XXX is this supposed to help on overflow? */ 786 ASG MUL, INAREG|FOREFF|FORCC, 787 SAREG|AWD, TUNSIGNED, 788 SAREG|AWD, TUNSIGNED|TINT, 789 NAREG|NEVEN, RLEFT|RESCC, 790 " emul AR,AL,$0,A1\n movl U1,AL\n", 791 792 ASG MUL, INAREG|FOREFF|FORCC, 793 SAREG|AWD, TUNSIGNED|TINT, 794 SAREG|AWD, TUNSIGNED, 795 NAREG|NEVEN, RLEFT|RESCC, 796 " emul AR,AL,$0,A1\n movl U1,AL\n", 797 798 ASG OPMUL, INAREG|FOREFF|FORCC, 799 SAREG|AWD, TWORD, 800 SAREG|AWD, TWORD, 801 0, RLEFT|RESCC, 802 " OL2 AR,AL\n", 803 804 MUL, INAREG|INTAREG|FORCC, 805 STAREG, TUNSIGNED, 806 SAREG|AWD, TUNSIGNED, 807 NAREG|NEVEN, RLEFT|RESCC, 808 " emul AR,AL,$0,A1\n movl U1,AL\n", 809 810 OPMUL, INAREG|INTAREG|FORCC, 811 STAREG, TWORD, 812 SAREG|AWD, TWORD, 813 0, RLEFT|RESCC, 814 " OL2 AR,AL\n", 815 816 MUL, INAREG|INTAREG|FORCC, 817 SAREG|AWD, TUNSIGNED, 818 SAREG|AWD, TUNSIGNED, 819 NAREG|NEVEN, RESC1|RESCC, 820 " emul AR,AL,$0,A1\n movl U1,A1\n", 821 822 OPMUL, INAREG|INTAREG|FORCC, 823 SAREG|AWD, TWORD, 824 SAREG|AWD, TWORD, 825 NAREG|NASL|NASR, RESC1|RESCC, 826 " OL3 AR,AL,A1\n", 827 828 #ifdef REG_CHAR 829 ASG PLUS, INAREG|FOREFF|FORCC, 830 SAREG, TWORD, 831 SONE, TINT, 832 0, RLEFT|RESCC, 833 " incZL AL\n", 834 835 ASG PLUS, INAREG|FOREFF|FORCC, 836 AWD, ANYFIXED, 837 SONE, TINT, 838 0, RLEFT|RESCC, 839 " incZL AL\n", 840 841 ASG MINUS, INAREG|FOREFF|FORCC, 842 SAREG, TWORD, 843 SONE, TINT, 844 0, RLEFT|RESCC, 845 " decZL AL\n", 846 847 ASG MINUS, INAREG|FOREFF|FORCC, 848 AWD, ANYFIXED, 849 SONE, TINT, 850 0, RLEFT|RESCC, 851 " decZL AL\n", 852 #else 853 ASG PLUS, INAREG|FOREFF|FORCC, 854 SAREG|AWD, ANYFIXED, 855 SONE, TANY, 856 0, RLEFT|RESCC, 857 " incZL AL\n", 858 859 ASG MINUS, INAREG|FOREFF|FORCC, 860 SAREG|AWD, ANYFIXED, 861 SONE, TANY, 862 0, RLEFT|RESCC, 863 " decZL AL\n", 864 #endif 865 866 PLUS, INAREG|INTAREG|FORCC, 867 STAREG, TWORD, 868 SONE, TWORD, 869 0, RLEFT|RESCC, 870 " incZL AL\n", 871 872 MINUS, INAREG|INTAREG|FORCC, 873 STAREG, TWORD, 874 SONE, TWORD, 875 0, RLEFT|RESCC, 876 " decZL AL\n", 877 878 ASG OPSIMP, INAREG|FOREFF|FORCC, 879 SAREG|AWD, TWORD, 880 SAREG|AWD, TWORD, 881 0, RLEFT|RESCC, 882 " OL2 AR,AL\n", 883 884 ASG OPSIMP, INAREG|FOREFF|FORCC, 885 SAREG, TWORD, 886 SAREG, TSHORT|TUSHORT|TCHAR|TUCHAR, 887 0, RLEFT|RESCC, 888 " OL2 AR,AL\n", 889 890 ASG OPSIMP, INAREG|FOREFF|FORCC, 891 AWD, TSHORT|TUSHORT, 892 SAREG|AWD, TSHORT|TUSHORT, 893 0, RLEFT|RESCC, 894 " OW2 AR,AL\n", 895 896 ASG OPSIMP, INAREG|FOREFF|FORCC, 897 AWD, TSHORT|TUSHORT, 898 SSCON, TWORD, 899 0, RLEFT|RESCC, 900 " OW2 AR,AL\n", 901 902 ASG OPSIMP, INAREG|FOREFF|FORCC, 903 AWD, TCHAR|TUCHAR, 904 SAREG|AWD, TCHAR|TUCHAR, 905 0, RLEFT|RESCC, 906 " OB2 AR,AL\n", 907 908 ASG OPSIMP, INAREG|FOREFF|FORCC, 909 AWD, TCHAR|TUCHAR, 910 SCCON, TWORD, 911 0, RLEFT|RESCC, 912 " OB2 AR,AL\n", 913 914 OPSIMP, INAREG|INTAREG|FORCC, 915 STAREG, ANYFIXED, 916 SAREG|AWD, TWORD, 917 0, RLEFT|RESCC, 918 " OL2 AR,AL\n", 919 920 OPSIMP, INAREG|INTAREG|FORCC, 921 SAREG|AWD, TWORD, 922 SAREG|AWD, TWORD, 923 NAREG|NASL|NASR, RESC1|RESCC, 924 " OL3 AR,AL,A1\n", 925 926 ASG OPSIMP, INAREG|FOREFF, 927 SAREG|AWD, TFLOAT|TDOUBLE, 928 SZERO, TANY, 929 0, RLEFT, 930 "", 931 932 ASG MUL, INAREG|FOREFF|FORCC, 933 SIREG, TDOUBLE, 934 SZERO, TANY, 935 0, RLEFT|RESCC, 936 " cvld $0\n std AL\n", 937 938 ASG MUL, INAREG|FOREFF|FORCC, 939 SAREG|SNAME|SOREG, TDOUBLE, 940 SZERO, TANY, 941 0, RLEFT|RESCC, 942 " clrl UL\n clrl AL\n", 943 944 ASG MUL, INAREG|FOREFF|FORCC, 945 SAREG|AWD, TFLOAT, 946 SZERO, TANY, 947 0, RLEFT|RESCC, 948 " clrl TAL\n", 949 950 ASG OPFLOAT, INAREG|FOREFF|FORCC, 951 SAREG|AWD, TFLOAT, 952 SAREG|AWD, TFLOAT, 953 0, RLEFT|RESCC, 954 " ldf AL\n OF AR\n stf TAL\n", 955 956 ASG OPFLOAT, INAREG|FOREFF|FORCC, 957 SAREG|AWD, TDOUBLE, 958 SAREG|AWD, TDOUBLE, 959 0, RLEFT|RESCC, 960 " ldd AL\n OD AR\n std AL\n", 961 962 ASG PLUS, INAREG|FOREFF|FORCC, 963 SAREG|AWD, TDOUBLE, 964 SAREG|AWD, TFLOAT, 965 NAREG|NASL, RLEFT|RESCC, 966 " ldfd AR\n OD AL\n std AL\n", 967 968 ASG MUL, INAREG|FOREFF|FORCC, 969 SAREG|AWD, TDOUBLE, 970 SAREG|AWD, TFLOAT, 971 NAREG|NASL, RLEFT|RESCC, 972 " ldfd AR\n OD AL\n std AL\n", 973 974 ASG OPFLOAT, INAREG|FOREFF|FORCC, 975 SAREG|AWD, TDOUBLE, 976 SAREG|AWD, TFLOAT, 977 NAREG|NASL, RLEFT|RESCC, 978 " ldfd AR\n std A1\n ldd AL\n OD A1\n std AL\n", 979 980 ASG OPFLOAT, INAREG|FOREFF|FORCC, 981 SAREG|AWD, TFLOAT, 982 SAREG|AWD, TDOUBLE, 983 0, RLEFT|RESCC, 984 " ldfd AL\n OD AR\n cvdf\n stf TAL\n", 985 986 ASG OPFLOAT, INAREG|FOREFF, 987 SAREG|AWD, ANYFIXED, 988 SAREG|AWD, TFLOAT|TDOUBLE, 989 NAREG, RLEFT|RESCC, /* usable() knows we may need a reg pair */ 990 " ZG\n", 991 992 OPSIMP, INAREG|INTAREG, 993 SAREG, TFLOAT|TDOUBLE, 994 SZERO, TANY, 995 0, RLEFT, 996 #if defined(FORT) || defined(SPRECC) 997 "T", 998 #else 999 "", 1000 #endif 1001 1002 OPSIMP, INAREG|INTAREG|FORCC, 1003 AWD, TFLOAT, 1004 SZERO, TANY, 1005 NAREG, RESC1|RESCC, 1006 " movl AL,A1\n", 1007 1008 OPSIMP, INAREG|INTAREG|FORCC, 1009 SIREG, TDOUBLE, 1010 SZERO, TANY, 1011 NAREG, RESC1|RESCC, 1012 " ldd AL\n std A1\n", 1013 1014 OPSIMP, INAREG|INTAREG|FORCC, 1015 SAREG|SNAME|SOREG, TDOUBLE, 1016 SZERO, TANY, 1017 NAREG, RESC1|RESCC, 1018 " movl UL,U1\n movl AL,A1\n", 1019 1020 MUL, INAREG|INTAREG|FORCC, 1021 SIREG, TDOUBLE, 1022 SZERO, TANY, 1023 NAREG|NASR, RESC1|RESCC, 1024 " cvld $0\n std A1\n", 1025 1026 MUL, INAREG|INTAREG|FORCC, 1027 SAREG|SNAME|SOREG, TDOUBLE, 1028 SZERO, TANY, 1029 NAREG|NASR, RESC1|RESCC, 1030 " clrl U1\n clrl A1\n", 1031 1032 MUL, INAREG|INTAREG|FORCC, 1033 SAREG|AWD, TFLOAT, 1034 SZERO, TANY, 1035 NAREG|NASR, RESC1|RESCC, 1036 " clrl TA1\n", 1037 1038 OPFLOAT, INAREG|INTAREG|FORCC, 1039 SAREG|AWD, TFLOAT, 1040 SAREG|AWD, TFLOAT, 1041 NAREG|NASL|NASR, RESC1|RESCC, 1042 " ldf AL\n OF AR\n stf TA1\n", 1043 1044 OPFLOAT, INAREG|INTAREG|FORCC, 1045 SZERO, TANY, 1046 SAREG|AWD, TDOUBLE, 1047 NAREG, RESC1|RESCC, 1048 "\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n", 1049 1050 OPFLOAT, INAREG|INTAREG|FORCC, 1051 SAREG|AWD, TDOUBLE, 1052 SAREG|AWD, TDOUBLE, 1053 NAREG|NASL|NASR, RESC1|RESCC, 1054 " ldd AL\n OD AR\n std A1\n", 1055 1056 /* Default actions for hard trees ... */ 1057 1058 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 1059 1060 UNARY MUL, DF( UNARY MUL ), 1061 1062 INCR, DF(INCR), 1063 1064 DECR, DF(INCR), 1065 1066 ASSIGN, DF(ASSIGN), 1067 1068 STASG, DF(STASG), 1069 1070 FLD, DF(FLD), 1071 1072 OPLEAF, DF(NAME), 1073 1074 OPLOG, FORCC, 1075 SANY, TANY, 1076 SANY, TANY, 1077 REWRITE, BITYPE, 1078 "", 1079 1080 OPLOG, DF(NOT), 1081 1082 COMOP, DF(COMOP), 1083 1084 INIT, DF(INIT), 1085 1086 OPUNARY, DF(UNARY MINUS), 1087 1088 1089 ASG OPANY, DF(ASG PLUS), 1090 1091 OPANY, DF(BITYPE), 1092 1093 FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" }; 1094