1 #ifndef lint 2 static char sccsid[] = "@(#)table.c 1.24 (Berkeley) 07/14/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|NASR, 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|NASR, 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|NASR, 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|RESCC, 475 " ZW\n", 476 477 ASSIGN, INAREG|FOREFF|FORCC, 478 SAREG|AWD, TFLOAT|TDOUBLE, 479 SAREG|AWD, TUNSIGNED, 480 0, RLEFT|RESCC, 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, TWORD|TFLOAT, 549 NTEMP, RESC1, 550 " movl AR,A1\n", 551 552 OREG, INTEMP, 553 SANY, TANY, 554 SIREG, TDOUBLE, 555 2*NTEMP, RESC1, 556 " ldd UR\n std A1\n", 557 558 OREG, INTEMP, 559 SANY, TANY, 560 SOREG, TDOUBLE, 561 2*NTEMP, RESC1, 562 " movl UR,U1\n movl AR,A1\n", 563 564 OREG, INTEMP, 565 SANY, TANY, 566 SOREG, TANY, 567 NTEMP, RESC1, 568 " movZR AR,A1\n", 569 570 OPLEAF, FOREFF, 571 SANY, TANY, 572 SAREG|AWD, TANY, 573 0, RLEFT, 574 "", 575 576 OPLTYPE, INAREG|INTAREG, 577 SANY, TANY, 578 SZERO, TDOUBLE, 579 NAREG|NASR, RESC1, 580 " clrl U1\n clrl A1\n", 581 582 OPLTYPE, INAREG|INTAREG, 583 SANY, TANY, 584 SIREG, TDOUBLE, 585 NAREG|NASR, RESC1, 586 " ldd AR\n std A1\n", 587 588 OPLTYPE, INAREG|INTAREG, 589 SANY, TANY, 590 SAREG|SNAME|SOREG|SCON, TDOUBLE, 591 NAREG, RESC1, 592 " movl AR,A1\n movl UR,U1\n", 593 594 OPLTYPE, INAREG|INTAREG, 595 SANY, TANY, 596 STARNM, TDOUBLE, 597 NAREG|NASR, RESC1, 598 " ldd AR\n std A1\n", 599 600 OPLTYPE, INAREG|INTAREG, 601 SANY, TANY, 602 SZERO, TANY, 603 NAREG|NASR, RESC1, 604 " clrl TA1\n", 605 606 OPLTYPE, INAREG|INTAREG, 607 SANY, TANY, 608 SAREG|AWD, TFLOAT, 609 NAREG|NASR, RESC1, 610 " movl AR,TA1\n", 611 612 OPLTYPE, INAREG|INTAREG, 613 SANY, TANY, 614 SANY, ANYFIXED, 615 NAREG|NASR, RESC1, 616 " ZU\n", 617 618 OPLTYPE, FORCC, 619 SANY, TANY, 620 SAREG|AWD, TFLOAT, 621 0, RESCC, 622 " ldf AR\n tstf\n", 623 624 OPLTYPE, FORCC, 625 SANY, TANY, 626 SAREG|AWD, TDOUBLE, 627 0, RESCC, 628 " ldd AR\n tstd\n", 629 630 OPLTYPE, FORCC, 631 SANY, TANY, 632 SANY, ANYFIXED, 633 0, RESCC, 634 " tstZR AR\n", 635 636 OPLTYPE, FORARG, 637 SANY, TANY, 638 SANY, TWORD, 639 0, RNULL, 640 " pushl AR\n", 641 642 OPLTYPE, FORARG, 643 SANY, TANY, 644 SANY, TCHAR|TSHORT, 645 0, RNULL, 646 " pushZR AR\n", 647 648 OPLTYPE, FORARG, 649 SANY, TANY, 650 SANY, TUCHAR|TUSHORT, 651 0, RNULL, 652 " movzZRl AR,-(sp)\n", 653 654 OPLTYPE, FORARG, 655 SANY, TANY, 656 SZERO, TFLOAT|TDOUBLE, 657 0, RNULL, 658 " pushl $0\n pushl $0\n", 659 660 OPLTYPE, FORARG, 661 SANY, TANY, 662 SIREG, TDOUBLE, 663 0, RNULL, 664 " ldd AR\n pushd\n", 665 666 OPLTYPE, FORARG, 667 SANY, TANY, 668 SAREG|SNAME|SOREG, TDOUBLE, 669 0, RNULL, 670 " pushl UR\n pushl AR\n", 671 672 OPLTYPE, FORARG, 673 SANY, TANY, 674 STARNM, TDOUBLE, 675 0, RNULL, 676 " ldd AR\n pushd\n", 677 678 OPLTYPE, FORARG, 679 SANY, TANY, 680 SAREG|AWD, TFLOAT, 681 0, RNULL, 682 " pushl $0\n pushl AR\n", 683 684 UNARY MINUS, INAREG|INTAREG|FORCC, 685 SAREG|AWD, ANYSIGNED|TUNSIGNED, 686 SANY, TANY, 687 NAREG|NASL, RESC1|RESCC, 688 " mnegZL AL,A1\n", 689 690 UNARY MINUS, INAREG|INTAREG|FORCC, 691 SAREG|AWD, TFLOAT|TDOUBLE, 692 SANY, TANY, 693 NAREG|NASL, RESC1|RESCC, 694 " lnZL AL\n stZL TA1\n", 695 696 COMPL, INAREG|INTAREG|FORCC, 697 SAREG|AWD, ANYSIGNED|TUNSIGNED, 698 SANY, TANY, 699 NAREG|NASL, RESC1|RESCC, 700 " mcomZL AL,A1\n", 701 702 COMPL, INAREG|INTAREG|FORCC, 703 SAREG|AWD, ANYFIXED, 704 SANY, TANY, 705 NAREG|NASL, RESC1|RESCC, 706 " movzZLl AL,A1\n mcoml A1,A1\n", 707 708 AND, FORCC, 709 SAREG|AWD, TWORD, 710 SAREG|AWD, TWORD, 711 0, RESCC, 712 " bitl AR,AL\n", 713 714 AND, FORCC, 715 SAREG|AWD, TSHORT|TUSHORT, 716 SSCON, TWORD, 717 0, RESCC, 718 " bitw AR,AL\n", 719 720 AND, FORCC, 721 SAREG|AWD, TSHORT|TUSHORT, 722 SAREG|AWD, TSHORT|TUSHORT, 723 0, RESCC, 724 " bitw AR,AL\n", 725 726 AND, FORCC, 727 SAREG|AWD, TCHAR|TUCHAR, 728 SCCON, TWORD, 729 0, RESCC, 730 " bitb AR,AL\n", 731 732 AND, FORCC, 733 SAREG|AWD, TCHAR|TUCHAR, 734 SAREG|AWD, TCHAR|TUCHAR, 735 0, RESCC, 736 " bitb AR,AL\n", 737 738 /* General cases for DIV and ASG DIV are handled below with OPMUL */ 739 /* Some special cases are handled in optim2() */ 740 741 DIV, INAREG|FOREFF|FORCC, 742 SAREG|AWD, TUNSIGNED|TULONG, 743 SCON, ANYUSIGNED, 744 NAREG|NEVEN, RESC1|RESCC, 745 " movl AL,U1\n clrl A1\n ediv AR,A1,A1,U1\n", 746 747 ASG DIV, INAREG|FOREFF|FORCC, 748 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 749 SMCON, ANYUSIGNED, 750 0, RLEFT|RESCC, 751 " ZJ\n", 752 753 ASG DIV, INAREG|FOREFF|FORCC, 754 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 755 SCON, ANYUSIGNED, 756 NAREG|NEVEN, RLEFT|RESCC, 757 " movl AL,U1\n clrl A1\n ediv AR,A1,AL,U1\n", 758 759 MOD, INAREG|INTAREG, 760 SAREG|AWD, TINT|TLONG, 761 SAREG|AWD, TINT|TLONG, 762 NAREG|NEVEN, RESC1, 763 " ZM ediv AR,A1,U1,A1\n", 764 765 MOD, INAREG|FOREFF, 766 SAREG|AWD, TUNSIGNED|TULONG, 767 SMCON, ANYUSIGNED, 768 NAREG|NASL, RLEFT|RESC1, 769 " ZJ\n", 770 771 MOD, INAREG|FOREFF, 772 SAREG|AWD, TUNSIGNED|TULONG, 773 SCON, ANYUSIGNED, 774 NAREG|NEVEN, RESC1, 775 " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n", 776 777 /* should only see UNSIGNED lhs here if converted from UCHAR/USHORT lhs */ 778 /* beware -- the ediv remainder operand must be a register */ 779 ASG MOD, INAREG|FOREFF|FORCC, 780 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 781 SAREG|AWD, TINT|TLONG, 782 NAREG|NEVEN, RLEFT|RESCC, 783 " ZM ediv AR,A1,U1,A1\n movl A1,AL\n", 784 785 ASG MOD, INAREG|FOREFF, 786 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 787 SMCON, ANYUSIGNED, 788 0, RLEFT, 789 " ZJ\n", 790 791 ASG MOD, INAREG|FOREFF, 792 SAREG|AWD, TINT|TLONG|TUNSIGNED|TULONG, 793 SCON, ANYUSIGNED, 794 NAREG|NEVEN, RLEFT, 795 " movl AL,U1\n clrl A1\n ediv AR,A1,U1,A1\n movl A1,AL\n", 796 797 /* XXX is this supposed to help on overflow? */ 798 ASG MUL, INAREG|FOREFF|FORCC, 799 SAREG|AWD, TUNSIGNED, 800 SAREG|AWD, TUNSIGNED|TINT, 801 NAREG|NEVEN, RLEFT|RESCC, 802 " emul AR,AL,$0,A1\n movl U1,AL\n", 803 804 ASG MUL, INAREG|FOREFF|FORCC, 805 SAREG|AWD, TUNSIGNED|TINT, 806 SAREG|AWD, TUNSIGNED, 807 NAREG|NEVEN, RLEFT|RESCC, 808 " emul AR,AL,$0,A1\n movl U1,AL\n", 809 810 ASG OPMUL, INAREG|FOREFF|FORCC, 811 SAREG|AWD, TWORD, 812 SAREG|AWD, TWORD, 813 0, RLEFT|RESCC, 814 " OL2 AR,AL\n", 815 816 MUL, INAREG|INTAREG|FORCC, 817 STAREG, TUNSIGNED, 818 SAREG|AWD, TUNSIGNED, 819 NAREG|NEVEN, RLEFT|RESCC, 820 " emul AR,AL,$0,A1\n movl U1,AL\n", 821 822 OPMUL, INAREG|INTAREG|FORCC, 823 STAREG, TWORD, 824 SAREG|AWD, TWORD, 825 0, RLEFT|RESCC, 826 " OL2 AR,AL\n", 827 828 MUL, INAREG|INTAREG|FORCC, 829 SAREG|AWD, TUNSIGNED, 830 SAREG|AWD, TUNSIGNED, 831 NAREG|NEVEN, RESC1|RESCC, 832 " emul AR,AL,$0,A1\n movl U1,A1\n", 833 834 OPMUL, INAREG|INTAREG|FORCC, 835 SAREG|AWD, TWORD, 836 SAREG|AWD, TWORD, 837 NAREG|NASL|NASR, RESC1|RESCC, 838 " OL3 AR,AL,A1\n", 839 840 #ifdef REG_CHAR 841 ASG PLUS, INAREG|FOREFF|FORCC, 842 SAREG, TWORD, 843 SONE, TINT, 844 0, RLEFT|RESCC, 845 " incZL AL\n", 846 847 ASG PLUS, INAREG|FOREFF|FORCC, 848 AWD, ANYFIXED, 849 SONE, TINT, 850 0, RLEFT|RESCC, 851 " incZL AL\n", 852 853 ASG MINUS, INAREG|FOREFF|FORCC, 854 SAREG, TWORD, 855 SONE, TINT, 856 0, RLEFT|RESCC, 857 " decZL AL\n", 858 859 ASG MINUS, INAREG|FOREFF|FORCC, 860 AWD, ANYFIXED, 861 SONE, TINT, 862 0, RLEFT|RESCC, 863 " decZL AL\n", 864 #else 865 ASG PLUS, INAREG|FOREFF|FORCC, 866 SAREG|AWD, ANYFIXED, 867 SONE, TANY, 868 0, RLEFT|RESCC, 869 " incZL AL\n", 870 871 ASG MINUS, INAREG|FOREFF|FORCC, 872 SAREG|AWD, ANYFIXED, 873 SONE, TANY, 874 0, RLEFT|RESCC, 875 " decZL AL\n", 876 #endif 877 878 PLUS, INAREG|INTAREG|FORCC, 879 STAREG, TWORD, 880 SONE, TWORD, 881 0, RLEFT|RESCC, 882 " incZL AL\n", 883 884 MINUS, INAREG|INTAREG|FORCC, 885 STAREG, TWORD, 886 SONE, TWORD, 887 0, RLEFT|RESCC, 888 " decZL AL\n", 889 890 ASG OPSIMP, INAREG|FOREFF|FORCC, 891 SAREG|AWD, TWORD, 892 SAREG|AWD, TWORD, 893 0, RLEFT|RESCC, 894 " OL2 AR,AL\n", 895 896 ASG OPSIMP, INAREG|FOREFF|FORCC, 897 SAREG, TWORD, 898 SAREG, TSHORT|TUSHORT|TCHAR|TUCHAR, 899 0, RLEFT|RESCC, 900 " OL2 AR,AL\n", 901 902 ASG OPSIMP, INAREG|FOREFF|FORCC, 903 AWD, TSHORT|TUSHORT, 904 SAREG|AWD, TSHORT|TUSHORT, 905 0, RLEFT|RESCC, 906 " OW2 AR,AL\n", 907 908 ASG OPSIMP, INAREG|FOREFF|FORCC, 909 AWD, TSHORT|TUSHORT, 910 SSCON, TWORD, 911 0, RLEFT|RESCC, 912 " OW2 AR,AL\n", 913 914 ASG OPSIMP, INAREG|FOREFF|FORCC, 915 AWD, TCHAR|TUCHAR, 916 SAREG|AWD, TCHAR|TUCHAR, 917 0, RLEFT|RESCC, 918 " OB2 AR,AL\n", 919 920 ASG OPSIMP, INAREG|FOREFF|FORCC, 921 AWD, TCHAR|TUCHAR, 922 SCCON, TWORD, 923 0, RLEFT|RESCC, 924 " OB2 AR,AL\n", 925 926 OPSIMP, INAREG|INTAREG|FORCC, 927 STAREG, ANYFIXED, 928 SAREG|AWD, TWORD, 929 0, RLEFT|RESCC, 930 " OL2 AR,AL\n", 931 932 OPSIMP, INAREG|INTAREG|FORCC, 933 SAREG|AWD, TWORD, 934 SAREG|AWD, TWORD, 935 NAREG|NASL|NASR, RESC1|RESCC, 936 " OL3 AR,AL,A1\n", 937 938 ASG OPSIMP, INAREG|FOREFF, 939 SAREG|AWD, TFLOAT|TDOUBLE, 940 SZERO, TANY, 941 0, RLEFT, 942 "", 943 944 ASG MUL, INAREG|FOREFF|FORCC, 945 SIREG, TDOUBLE, 946 SZERO, TANY, 947 0, RLEFT|RESCC, 948 " cvld $0\n std AL\n", 949 950 ASG MUL, INAREG|FOREFF|FORCC, 951 SAREG|SNAME|SOREG, TDOUBLE, 952 SZERO, TANY, 953 0, RLEFT|RESCC, 954 " clrl UL\n clrl AL\n", 955 956 ASG MUL, INAREG|FOREFF|FORCC, 957 SAREG|AWD, TFLOAT, 958 SZERO, TANY, 959 0, RLEFT|RESCC, 960 " clrl TAL\n", 961 962 ASG OPFLOAT, INAREG|FOREFF|FORCC, 963 SAREG|AWD, TFLOAT, 964 SAREG|AWD, TFLOAT, 965 0, RLEFT|RESCC, 966 " ldf AL\n OF AR\n stf TAL\n", 967 968 ASG OPFLOAT, INAREG|FOREFF|FORCC, 969 SAREG|AWD, TDOUBLE, 970 SAREG|AWD, TDOUBLE, 971 0, RLEFT|RESCC, 972 " ldd AL\n OD AR\n std AL\n", 973 974 ASG PLUS, INAREG|FOREFF|FORCC, 975 SAREG|AWD, TDOUBLE, 976 SAREG|AWD, TFLOAT, 977 NAREG|NASL, RLEFT|RESCC, 978 " ldfd AR\n OD AL\n std AL\n", 979 980 ASG MUL, INAREG|FOREFF|FORCC, 981 SAREG|AWD, TDOUBLE, 982 SAREG|AWD, TFLOAT, 983 NAREG|NASL, RLEFT|RESCC, 984 " ldfd AR\n OD AL\n std AL\n", 985 986 ASG OPFLOAT, INAREG|FOREFF|FORCC, 987 SAREG|AWD, TDOUBLE, 988 SAREG|AWD, TFLOAT, 989 NAREG|NASL, RLEFT|RESCC, 990 " ldfd AR\n std A1\n ldd AL\n OD A1\n std AL\n", 991 992 ASG OPFLOAT, INAREG|FOREFF|FORCC, 993 SAREG|AWD, TFLOAT, 994 SAREG|AWD, TDOUBLE, 995 0, RLEFT|RESCC, 996 " ldfd AL\n OD AR\n cvdf\n stf TAL\n", 997 998 ASG OPFLOAT, INAREG|FOREFF|FORCC, 999 SAREG|AWD, ANYFIXED, 1000 SAREG|AWD, TFLOAT|TDOUBLE, 1001 NAREG, RLEFT|RESCC, /* usable() knows we may need a reg pair */ 1002 " ZG\n", 1003 1004 OPSIMP, INAREG|INTAREG, 1005 SAREG, TFLOAT|TDOUBLE, 1006 SZERO, TANY, 1007 0, RLEFT, 1008 #if defined(FORT) || defined(SPRECC) 1009 "T", 1010 #else 1011 "", 1012 #endif 1013 1014 OPSIMP, INAREG|INTAREG|FORCC, 1015 AWD, TFLOAT, 1016 SZERO, TANY, 1017 NAREG, RESC1|RESCC, 1018 " movl AL,A1\n", 1019 1020 OPSIMP, INAREG|INTAREG|FORCC, 1021 SIREG, TDOUBLE, 1022 SZERO, TANY, 1023 NAREG, RESC1|RESCC, 1024 " ldd AL\n std A1\n", 1025 1026 OPSIMP, INAREG|INTAREG|FORCC, 1027 SAREG|SNAME|SOREG, TDOUBLE, 1028 SZERO, TANY, 1029 NAREG, RESC1|RESCC, 1030 " movl UL,U1\n movl AL,A1\n", 1031 1032 MUL, INAREG|INTAREG|FORCC, 1033 SIREG, TDOUBLE, 1034 SZERO, TANY, 1035 NAREG|NASR, RESC1|RESCC, 1036 " cvld $0\n std A1\n", 1037 1038 MUL, INAREG|INTAREG|FORCC, 1039 SAREG|SNAME|SOREG, TDOUBLE, 1040 SZERO, TANY, 1041 NAREG|NASR, RESC1|RESCC, 1042 " clrl U1\n clrl A1\n", 1043 1044 MUL, INAREG|INTAREG|FORCC, 1045 SAREG|AWD, TFLOAT, 1046 SZERO, TANY, 1047 NAREG|NASR, RESC1|RESCC, 1048 " clrl TA1\n", 1049 1050 OPFLOAT, INAREG|INTAREG|FORCC, 1051 SAREG|AWD, TFLOAT, 1052 SAREG|AWD, TFLOAT, 1053 NAREG|NASL|NASR, RESC1|RESCC, 1054 " ldf AL\n OF AR\n stf TA1\n", 1055 1056 OPFLOAT, INAREG|INTAREG|FORCC, 1057 SZERO, TANY, 1058 SAREG|AWD, TDOUBLE, 1059 NAREG, RESC1|RESCC, 1060 "\tclrl\tA1\n\tclrl\tU1\n\tldd\tA1\n\tOD\tAR\n\tstd\tA1\n", 1061 1062 OPFLOAT, INAREG|INTAREG|FORCC, 1063 SAREG|AWD, TDOUBLE, 1064 SAREG|AWD, TDOUBLE, 1065 NAREG|NASL|NASR, RESC1|RESCC, 1066 " ldd AL\n OD AR\n std A1\n", 1067 1068 /* Default actions for hard trees ... */ 1069 1070 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 1071 1072 UNARY MUL, DF( UNARY MUL ), 1073 1074 INCR, DF(INCR), 1075 1076 DECR, DF(INCR), 1077 1078 ASSIGN, DF(ASSIGN), 1079 1080 STASG, DF(STASG), 1081 1082 FLD, DF(FLD), 1083 1084 OPLEAF, DF(NAME), 1085 1086 OPLOG, FORCC, 1087 SANY, TANY, 1088 SANY, TANY, 1089 REWRITE, BITYPE, 1090 "", 1091 1092 OPLOG, DF(NOT), 1093 1094 COMOP, DF(COMOP), 1095 1096 INIT, DF(INIT), 1097 1098 OPUNARY, DF(UNARY MINUS), 1099 1100 1101 ASG OPANY, DF(ASG PLUS), 1102 1103 OPANY, DF(BITYPE), 1104 1105 FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" }; 1106