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