1/* Id: table.c,v 1.3 2014/06/03 20:19:50 ragge Exp */ 2/* $NetBSD: table.c,v 1.1.1.3 2014/07/24 19:19:10 plunky Exp $ */ 3/* 4 * Copyright (c) 2006 Anders Magnusson (ragge@ludd.luth.se). 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 31# include "pass2.h" 32 33# define ANYSIGNED TINT|TLONG|TSHORT|TCHAR 34# define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR 35# define ANYFIXED ANYSIGNED|ANYUSIGNED 36# define ANYREG (INAREG|INBREG|INCREG) 37# define TUWORD TUNSIGNED|TULONG 38# define TSWORD TINT|TLONG 39# define TWORD TUWORD|TSWORD 40 41struct optab table[] = { 42/* First entry must be an empty entry */ 43{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, 44 45/* 46 * All ASSIGN entries. 47 */ 48/* reg->reg */ 49{ ASSIGN, FOREFF|INAREG|INBREG, 50 SAREG|SBREG, TWORD|TPOINT, 51 SAREG|SBREG, TWORD|TPOINT, 52 0, RDEST, 53 " mov AR,AL\n", }, 54/* reg->mem */ 55{ ASSIGN, FOREFF|INAREG|INBREG, 56 SNAME|SOREG, TWORD|TPOINT, 57 SAREG|SBREG, TWORD|TPOINT, 58 0, RDEST, 59 " sta AR,AL\n", }, 60/* mem->reg */ 61{ ASSIGN, FOREFF|INAREG|INBREG, 62 SAREG|SBREG, TWORD|TPOINT, 63 SNAME|SOREG, TWORD|TPOINT, 64 0, RDEST, 65 " lda AL,AR\n", }, 66 67/* 68 * LEAF type movements. 69 */ 70/* 0 -> reg */ 71{ OPLTYPE, INAREG|INBREG, 72 SANY, TANY, 73 SZERO, TWORD, 74 NAREG, RESC1, 75 " subo A1,A1\n", }, 76 77/* 1 -> reg */ 78{ OPLTYPE, INAREG|INBREG, 79 SANY, TANY, 80 SONE, TWORD, 81 NAREG|NBREG, RESC1, 82 " subzl A1,A1 # 1\n", }, 83 84/* constant -> reg */ 85{ OPLTYPE, INAREG|INBREG, 86 SANY, TANY, 87 SCON, TWORD|TPOINT, 88 NAREG|NBREG, RESC1, 89 " lda A1,AR\n", }, 90 91/* mem -> reg */ 92{ OPLTYPE, INAREG, 93 SANY, TANY, 94 SNAME|SOREG, TWORD, 95 NAREG, RESC1, 96 " lda A1,AR\n", }, 97 98/* reg -> A-reg */ 99{ OPLTYPE, INAREG, 100 SANY, TANY, 101 SAREG|SBREG, TWORD, 102 NAREG, RESC1, 103 " mov AR,A1\n", }, 104 105/* reg -> B-reg */ 106{ OPLTYPE, INBREG, 107 SANY, TANY, 108 SAREG|SBREG, TWORD, 109 NBREG, RESC1, 110 " mov AR,A1\n", }, 111 112{ OPLTYPE, INBREG, 113 SANY, TANY, 114 SNAME|SOREG, TPOINT, 115 NBREG, RESC1, 116 " lda A1,AR\n", }, 117 118{ OPLTYPE, INBREG, 119 SANY, TANY, 120 SLDFPSP, TANY, 121 NBREG, RESC1, 122 " lda A1,AR\n", }, 123 124/* 125 * Simple ops. 126 */ 127{ PLUS, INBREG|INAREG, 128 SAREG|SBREG, TWORD|TPOINT, 129 SONE, TANY, 130 0, RLEFT, 131 " inc AL,AL\n", }, 132 133{ OPSIMP, INBREG|INAREG|FOREFF, 134 SAREG|SBREG, TWORD|TPOINT, 135 SAREG|SBREG, TWORD|TPOINT, 136 0, RLEFT, 137 " O AR,AL\n", }, 138 139/* 140 * Indirections 141 */ 142{ UMUL, INAREG, 143 SANY, TPOINT|TWORD, 144 SOREG, TPOINT|TWORD, 145 NAREG|NASL, RESC1, 146 " lda A1,AL #\n", }, 147 148{ UMUL, INAREG, 149 SANY, TPOINT|TWORD, 150 SOREG, TCHAR|TUCHAR, 151 NAREG|NASL, RESC1, 152 " lda A1,AL #\n", }, 153 154{ UMUL, INBREG, 155 SANY, TPOINT|TWORD, 156 SOREG, TPOINT|TWORD, 157 NBREG|NBSL, RESC1, 158 " lda A1,AL # #\n", }, 159 160#if 0 161 162/* PCONVs are usually not necessary */ 163{ PCONV, INAREG, 164 SAREG, TWORD|TPOINT, 165 SAREG, TWORD|TPOINT, 166 0, RLEFT, 167 "", }, 168 169/* 170 * A bunch conversions of integral<->integral types 171 * There are lots of them, first in table conversions to itself 172 * and then conversions from each type to the others. 173 */ 174 175/* itself to itself, including pointers */ 176 177/* convert (u)char to (u)char. */ 178{ SCONV, INCH, 179 SHCH, TCHAR|TUCHAR, 180 SHCH, TCHAR|TUCHAR, 181 0, RLEFT, 182 "", }, 183 184/* convert pointers to int. */ 185{ SCONV, ININT, 186 SHINT, TPOINT|TWORD, 187 SANY, TWORD, 188 0, RLEFT, 189 "", }, 190 191/* convert (u)longlong to (u)longlong. */ 192{ SCONV, INLL, 193 SHLL, TLL, 194 SHLL, TLL, 195 0, RLEFT, 196 "", }, 197 198/* convert double <-> float. nothing to do here */ 199{ SCONV, INFL, 200 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 201 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 202 0, RLEFT, 203 "", }, 204 205/* convert pointers to pointers. */ 206{ SCONV, ININT, 207 SHINT, TPOINT, 208 SANY, TPOINT, 209 0, RLEFT, 210 "", }, 211 212/* char to something */ 213 214/* convert char to (unsigned) short. */ 215{ SCONV, ININT, 216 SBREG|SOREG|SNAME, TCHAR, 217 SAREG, TSHORT|TUSHORT, 218 NASL|NAREG, RESC1, 219 " movsbw AL,A1\n", }, 220 221/* convert unsigned char to (u)short. */ 222{ SCONV, ININT, 223 SHCH|SOREG|SNAME, TUCHAR, 224 SAREG, TSHORT|TUSHORT, 225 NASL|NAREG, RESC1, 226 " movzbw AL,A1\n", }, 227 228/* convert signed char to int (or pointer). */ 229{ SCONV, ININT, 230 SHCH|SOREG|SNAME, TCHAR, 231 SAREG, TWORD|TPOINT, 232 NASL|NAREG, RESC1, 233 " movsbl AL,A1\n", }, 234 235/* convert unsigned char to (u)int. */ 236{ SCONV, ININT, 237 SHCH|SOREG|SNAME, TUCHAR, 238 SAREG, TWORD, 239 NASL|NAREG, RESC1, 240 " movzbl AL,A1\n", }, 241 242/* convert char to (u)long long */ 243{ SCONV, INLL, 244 SHCH|SOREG|SNAME, TCHAR, 245 SANY, TLL, 246 NSPECIAL|NAREG|NASL, RESC1, 247 " movsbl AL,%eax\n cltd\n", }, 248 249/* convert unsigned char to (u)long long */ 250{ SCONV, INLL, 251 SHCH|SOREG|SNAME, TUCHAR, 252 SANY, TLL, 253 NCREG|NCSL, RESC1, 254 " movzbl AL,A1\n xorl U1,U1\n", }, 255 256/* convert char (in register) to double XXX - use NTEMP */ 257{ SCONV, INFL, 258 SHCH|SOREG|SNAME, TCHAR, 259 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 260 NAREG|NASL|NDREG, RESC2, 261 " movsbl AL,A1\n pushl A1\n" 262 " fildl (%esp)\n addl $4,%esp\n", }, 263 264/* convert (u)char (in register) to double XXX - use NTEMP */ 265{ SCONV, INFL, 266 SHCH|SOREG|SNAME, TUCHAR, 267 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 268 NAREG|NASL|NDREG, RESC2, 269 " movzbl AL,A1\n pushl A1\n" 270 " fildl (%esp)\n addl $4,%esp\n", }, 271 272/* short to something */ 273 274/* convert short (in memory) to char */ 275{ SCONV, INCH, 276 SNAME|SOREG, TSHORT|TUSHORT, 277 SHCH, TCHAR|TUCHAR, 278 NBREG|NBSL, RESC1, 279 " movb AL,A1\n", }, 280 281/* convert short (in reg) to char. */ 282{ SCONV, INCH, 283 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 284 SHCH, TCHAR|TUCHAR, 285 NSPECIAL|NBREG|NBSL, RESC1, 286 "ZM", }, 287 288/* convert short to (u)int. */ 289{ SCONV, ININT, 290 SAREG|SOREG|SNAME, TSHORT, 291 SAREG, TWORD, 292 NASL|NAREG, RESC1, 293 " movswl AL,A1\n", }, 294 295/* convert unsigned short to (u)int. */ 296{ SCONV, ININT, 297 SAREG|SOREG|SNAME, TUSHORT, 298 SAREG, TWORD, 299 NASL|NAREG, RESC1, 300 " movzwl AL,A1\n", }, 301 302/* convert short to (u)long long */ 303{ SCONV, INLL, 304 SAREG|SOREG|SNAME, TSHORT, 305 SHLL, TLL, 306 NSPECIAL|NCREG|NCSL, RESC1, 307 " movswl AL,%eax\n cltd\n", }, 308 309/* convert unsigned short to (u)long long */ 310{ SCONV, INLL, 311 SAREG|SOREG|SNAME, TUSHORT, 312 SHLL, TLL, 313 NCREG|NCSL, RESC1, 314 " movzwl AL,A1\n xorl U1,U1\n", }, 315 316/* convert short (in memory) to float/double */ 317{ SCONV, INFL, 318 SOREG|SNAME, TSHORT, 319 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 320 NDREG, RESC1, 321 " fild AL\n", }, 322 323/* convert short (in register) to float/double */ 324{ SCONV, INFL, 325 SAREG, TSHORT, 326 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 327 NTEMP|NDREG, RESC1, 328 " pushw AL\n fild (%esp)\n addl $2,%esp\n", }, 329 330/* convert unsigned short to double XXX - use NTEMP */ 331{ SCONV, INFL, 332 SAREG|SOREG|SNAME, TUSHORT, 333 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 334 NAREG|NASL|NDREG|NTEMP, RESC2, 335 " movzwl AL,A1\n pushl A1\n" 336 " fildl (%esp)\n addl $4,%esp\n", }, 337 338/* int to something */ 339 340/* convert int to char. This is done when register is loaded */ 341{ SCONV, INCH, 342 SAREG, TWORD, 343 SANY, TCHAR|TUCHAR, 344 NSPECIAL|NBREG|NBSL, RESC1, 345 "ZM", }, 346 347/* convert int to short. Nothing to do */ 348{ SCONV, INAREG, 349 SAREG, TWORD, 350 SANY, TSHORT|TUSHORT, 351 0, RLEFT, 352 "", }, 353 354/* convert int to long long */ 355{ SCONV, INLL, 356 SAREG, TWORD|TPOINT, 357 SCREG, TLONGLONG, 358 NSPECIAL|NCREG|NCSL, RESC1, 359 " cltd\n", }, 360 361/* convert int to unsigned long long */ 362{ SCONV, INLL, 363 SAREG|SOREG|SNAME, TWORD|TPOINT, 364 SHLL, TULONGLONG, 365 NCSL|NCREG, RESC1, 366 " movl AL,A1\n xorl U1,U1\n", }, 367 368/* convert int (in memory) to double */ 369{ SCONV, INFL, 370 SOREG|SNAME, TWORD, 371 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 372 NDREG, RESC1, 373 " fildl AL\n", }, 374 375/* convert int (in register) to double */ 376{ SCONV, INFL, 377 SAREG, TWORD, 378 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 379 NTEMP|NDREG, RESC1, 380 " pushl AL\n fildl (%esp)\n addl $4,%esp\n", }, 381 382/* long long to something */ 383 384/* convert (u)long long to (u)char (mem->reg) */ 385{ SCONV, INCH, 386 SOREG|SNAME, TLL, 387 SANY, TCHAR|TUCHAR, 388 NAREG|NASL, RESC1, 389 " movb AL,A1\n", }, 390 391/* convert (u)long long to (u)char (reg->reg, hopefully nothing) */ 392{ SCONV, INCH, 393 SHLL, TLL, 394 SANY, TCHAR|TUCHAR, 395 NAREG|NASL, RESC1, 396 "ZS", }, 397 398/* convert (u)long long to (u)short (mem->reg) */ 399{ SCONV, INAREG, 400 SOREG|SNAME, TLL, 401 SAREG, TSHORT|TUSHORT, 402 NAREG|NASL, RESC1, 403 " movw AL,A1\n", }, 404 405/* convert (u)long long to (u)short (reg->reg, hopefully nothing) */ 406{ SCONV, INAREG, 407 SHLL|SOREG|SNAME, TLL, 408 SAREG, TSHORT|TUSHORT, 409 NAREG|NASL, RESC1, 410 "ZS", }, 411 412/* convert long long to int (mem->reg) */ 413{ SCONV, INAREG, 414 SOREG|SNAME, TLL, 415 SAREG, TWORD|TPOINT, 416 NAREG|NASL, RESC1, 417 " movl AL,A1\n", }, 418 419/* convert long long to int (reg->reg, hopefully nothing) */ 420{ SCONV, INAREG, 421 SHLL|SOREG|SNAME, TLL, 422 SAREG, TWORD|TPOINT, 423 NAREG|NASL, RESC1, 424 "ZS", }, 425 426/* convert long long (in memory) to floating */ 427{ SCONV, INFL, 428 SOREG|SNAME, TLONGLONG, 429 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 430 NDREG, RESC1, 431 " fildq AL\n", }, 432 433/* convert long long (in register) to floating */ 434{ SCONV, INFL, 435 SHLL, TLONGLONG, 436 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 437 NTEMP|NDREG, RESC1, 438 " pushl UL\n pushl AL\n" 439 " fildq (%esp)\n addl $8,%esp\n", }, 440 441/* convert unsigned long long to floating */ 442{ SCONV, INFL, 443 SCREG, TULONGLONG, 444 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 445 NDREG, RESC1, 446 "ZJ", }, 447 448/* float to something */ 449 450#if 0 /* go via int by adding an extra sconv in clocal() */ 451/* convert float/double to (u) char. XXX should use NTEMP here */ 452{ SCONV, INCH, 453 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 454 SHCH, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 455 NBREG, RESC1, 456 " subl $4,%esp\n fistpl (%esp)\n popl A1\n", }, 457 458/* convert float/double to (u) int/short/char. XXX should use NTEMP here */ 459{ SCONV, INCH, 460 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 461 SHCH, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 462 NCREG, RESC1, 463 " subl $4,%esp\n fistpl (%esp)\n popl A1\n", }, 464#endif 465 466/* convert float/double to (u)int. XXX should use NTEMP here */ 467{ SCONV, INAREG, 468 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 469 SAREG, TWORD, 470 NAREG, RESC1, 471 " subl $4,%esp\n fistpl (%esp)\n popl A1\n", }, 472 473/* convert float/double (in register) to (unsigned) long long */ 474/* XXX - unsigned is not handled correct */ 475{ SCONV, INLL, 476 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 477 SHLL, TLONGLONG|TULONGLONG, 478 NCREG, RESC1, 479 " subl $8,%esp\n fistpq (%esp)\n" 480 " popl A1\n popl U1\n", }, 481 482/* slut sconv */ 483#endif 484 485/* 486 * Subroutine calls. 487 */ 488 489{ CALL, FOREFF, 490 SCON, TANY, 491 SANY, TANY, 492 0, 0, 493 " jsr CL\nZC", }, 494 495{ UCALL, FOREFF, 496 SCON, TANY, 497 SANY, TANY, 498 0, 0, 499 " jsr CL\n", }, 500 501{ CALL, INAREG|FOREFF, 502 SCON, TANY, 503 SANY, TANY, 504 NAREG|NASL, RESC1, 505 " jsr CL\nZC", }, 506 507{ UCALL, INAREG|FOREFF, 508 SCON, TANY, 509 SANY, TANY, 510 NAREG|NASL, RESC1, 511 " jsr CL\n", }, 512 513#if 0 514{ CALL, INAREG, 515 SCON, TANY, 516 SAREG, TWORD|TPOINT, 517 NAREG|NASL, RESC1, /* should be 0 */ 518 " call CL\nZC", }, 519 520{ UCALL, INAREG, 521 SCON, TANY, 522 SAREG, TWORD|TPOINT, 523 NAREG|NASL, RESC1, /* should be 0 */ 524 " call CL\n", }, 525 526{ CALL, INBREG, 527 SCON, TANY, 528 SBREG, TCHAR|TUCHAR, 529 NBREG, RESC1, /* should be 0 */ 530 " call CL\nZC", }, 531 532{ UCALL, INBREG, 533 SCON, TANY, 534 SBREG, TCHAR|TUCHAR, 535 NBREG, RESC1, /* should be 0 */ 536 " call CL\n", }, 537 538{ CALL, INCREG, 539 SCON, TANY, 540 SCREG, TANY, 541 NCREG|NCSL, RESC1, /* should be 0 */ 542 " call CL\nZC", }, 543 544{ UCALL, INCREG, 545 SCON, TANY, 546 SCREG, TANY, 547 NCREG|NCSL, RESC1, /* should be 0 */ 548 " call CL\n", }, 549 550{ CALL, INDREG, 551 SCON, TANY, 552 SDREG, TANY, 553 NDREG|NDSL, RESC1, /* should be 0 */ 554 " call CL\nZC", }, 555 556{ UCALL, INDREG, 557 SCON, TANY, 558 SDREG, TANY, 559 NDREG|NDSL, RESC1, /* should be 0 */ 560 " call CL\nZC", }, 561 562{ CALL, FOREFF, 563 SAREG, TANY, 564 SANY, TANY, 565 0, 0, 566 " call *AL\nZC", }, 567 568{ UCALL, FOREFF, 569 SAREG, TANY, 570 SANY, TANY, 571 0, 0, 572 " call *AL\nZC", }, 573 574{ CALL, INAREG, 575 SAREG, TANY, 576 SANY, TANY, 577 NAREG|NASL, RESC1, /* should be 0 */ 578 " call *AL\nZC", }, 579 580{ UCALL, INAREG, 581 SAREG, TANY, 582 SANY, TANY, 583 NAREG|NASL, RESC1, /* should be 0 */ 584 " call *AL\nZC", }, 585 586{ CALL, INBREG, 587 SAREG, TANY, 588 SANY, TANY, 589 NBREG|NBSL, RESC1, /* should be 0 */ 590 " call *AL\nZC", }, 591 592{ UCALL, INBREG, 593 SAREG, TANY, 594 SANY, TANY, 595 NBREG|NBSL, RESC1, /* should be 0 */ 596 " call *AL\nZC", }, 597 598{ CALL, INCREG, 599 SAREG, TANY, 600 SANY, TANY, 601 NCREG|NCSL, RESC1, /* should be 0 */ 602 " call *AL\nZC", }, 603 604{ UCALL, INCREG, 605 SAREG, TANY, 606 SANY, TANY, 607 NCREG|NCSL, RESC1, /* should be 0 */ 608 " call *AL\nZC", }, 609 610{ CALL, INDREG, 611 SAREG, TANY, 612 SANY, TANY, 613 NDREG|NDSL, RESC1, /* should be 0 */ 614 " call *AL\nZC", }, 615 616{ UCALL, INDREG, 617 SAREG, TANY, 618 SANY, TANY, 619 NDREG|NDSL, RESC1, /* should be 0 */ 620 " call *AL\nZC", }, 621 622/* struct return */ 623{ USTCALL, FOREFF, 624 SCON, TANY, 625 SANY, TANY, 626 NAREG|NASL, 0, 627 "ZP call CL\nZC", }, 628 629{ USTCALL, INAREG, 630 SCON, TANY, 631 SANY, TANY, 632 NAREG|NASL, RESC1, /* should be 0 */ 633 "ZP call CL\nZC", }, 634 635{ USTCALL, INAREG, 636 SNAME|SAREG, TANY, 637 SANY, TANY, 638 NAREG|NASL, RESC1, /* should be 0 */ 639 "ZP call *AL\nZC", }, 640 641{ STCALL, FOREFF, 642 SCON, TANY, 643 SANY, TANY, 644 NAREG|NASL, 0, 645 "ZP call CL\nZC", }, 646 647{ STCALL, INAREG, 648 SCON, TANY, 649 SANY, TANY, 650 NAREG|NASL, RESC1, /* should be 0 */ 651 "ZP call CL\nZC", }, 652 653{ STCALL, INAREG, 654 SNAME|SAREG, TANY, 655 SANY, TANY, 656 NAREG|NASL, RESC1, /* should be 0 */ 657 "ZP call *AL\nZC", }, 658 659/* 660 * The next rules handle all binop-style operators. 661 */ 662/* Special treatment for long long */ 663{ PLUS, INLL|FOREFF, 664 SHLL, TLL, 665 SHLL|SNAME|SOREG, TLL, 666 0, RLEFT, 667 " addl AR,AL\n adcl UR,UL\n", }, 668 669/* Special treatment for long long XXX - fix commutative check */ 670{ PLUS, INLL|FOREFF, 671 SHLL|SNAME|SOREG, TLL, 672 SHLL, TLL, 673 0, RRIGHT, 674 " addl AL,AR\n adcl UL,UR\n", }, 675 676{ PLUS, INFL, 677 SHFL, TDOUBLE, 678 SNAME|SOREG, TDOUBLE, 679 0, RLEFT, 680 " faddl AR\n", }, 681 682{ PLUS, INFL|FOREFF, 683 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 684 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 685 0, RLEFT, 686 " faddp\n", }, 687 688{ PLUS, INAREG, 689 SAREG|SNAME|SOREG, TWORD|TPOINT, 690 SONE, TANY, 691 0, RLEFT, 692 " incl AL\n", }, 693 694{ PLUS, INAREG, 695 SAREG, TWORD|TPOINT, 696 SCON, TANY, 697 NAREG|NASL, RESC1, 698 " leal CR(AL),A1\n", }, 699 700{ PLUS, INCH, 701 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 702 SONE, TANY, 703 0, RLEFT, 704 " incb AL\n", }, 705 706{ PLUS, INAREG, 707 SAREG, TWORD, 708 SAREG, TWORD, 709 NAREG|NASL|NASR, RESC1, 710 " leal (AL,AR),A1\n", }, 711 712 713/* address as register offset, negative */ 714{ MINUS, INAREG, 715 SAREG, TWORD|TPOINT, 716 SPCON, TANY, 717 NAREG|NASL, RESC1, 718 " leal -CR(AL),A1\n", }, 719 720{ MINUS, INLL|FOREFF, 721 SHLL, TLL, 722 SHLL|SNAME|SOREG, TLL, 723 0, RLEFT, 724 " subl AR,AL\n sbbl UR,UL\n", }, 725 726{ MINUS, INFL, 727 SHFL, TDOUBLE, 728 SNAME|SOREG, TDOUBLE, 729 0, RLEFT, 730 " fsubl AR\n", }, 731 732{ MINUS, INFL|FOREFF, 733 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 734 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 735 0, RLEFT, 736 " fsubZAp\n", }, 737 738/* Simple r/m->reg ops */ 739{ OPSIMP, INAREG|FOREFF, 740 SAREG, TWORD|TPOINT, 741 SAREG|SNAME|SOREG, TWORD|TPOINT, 742 0, RLEFT, 743 " Ol AR,AL\n", }, 744 745{ OPSIMP, INAREG|FOREFF, 746 SHINT, TSHORT|TUSHORT, 747 SHINT|SNAME|SOREG, TSHORT|TUSHORT, 748 0, RLEFT, 749 " Ow AR,AL\n", }, 750 751{ OPSIMP, INCH|FOREFF, 752 SHCH, TCHAR|TUCHAR, 753 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 754 0, RLEFT, 755 " Ob AR,AL\n", }, 756 757{ OPSIMP, INAREG|FOREFF, 758 SAREG, TWORD|TPOINT, 759 SCON, TWORD|TPOINT, 760 0, RLEFT, 761 " Ol AR,AL\n", }, 762 763{ OPSIMP, INAREG|FOREFF, 764 SHINT|SNAME|SOREG, TSHORT|TUSHORT, 765 SCON, TANY, 766 0, RLEFT, 767 " Ow AR,AL\n", }, 768 769{ OPSIMP, INCH|FOREFF, 770 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 771 SCON, TANY, 772 0, RLEFT, 773 " Ob AR,AL\n", }, 774 775{ OPSIMP, INLL|FOREFF, 776 SHLL, TLL, 777 SHLL|SNAME|SOREG, TLL, 778 0, RLEFT, 779 " Ol AR,AL\n Ol UR,UL\n", }, 780 781 782/* 783 * The next rules handle all shift operators. 784 */ 785/* (u)longlong left shift is emulated */ 786{ LS, INCREG, 787 SCREG|SNAME|SOREG|SCON, TLL, 788 SAREG|SNAME|SOREG|SCON, TINT, /* will be int */ 789 NSPECIAL|NCREG|NCSL|NCSR, RESC1, 790 "ZO", }, 791 792{ LS, INAREG|FOREFF, 793 SAREG|SNAME|SOREG, TWORD, 794 SHCH, TCHAR|TUCHAR, 795 NSPECIAL, RLEFT, 796 " sall AR,AL\n", }, 797 798{ LS, INAREG|FOREFF, 799 SAREG, TWORD, 800 SCON, TANY, 801 0, RLEFT, 802 " sall AR,AL\n", }, 803 804{ LS, INAREG|FOREFF, 805 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 806 SHCH, TCHAR|TUCHAR, 807 NSPECIAL, RLEFT, 808 " shlw AR,AL\n", }, 809 810{ LS, INAREG|FOREFF, 811 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 812 SCON, TANY, 813 0, RLEFT, 814 " shlw AR,AL\n", }, 815 816{ LS, INCH|FOREFF, 817 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 818 SHCH, TCHAR|TUCHAR, 819 NSPECIAL, RLEFT, 820 " salb AR,AL\n", }, 821 822{ LS, INCH|FOREFF, 823 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 824 SCON, TANY, 825 0, RLEFT, 826 " salb AR,AL\n", }, 827 828/* (u)longlong right shift is emulated */ 829{ RS, INCREG, 830 SCREG|SNAME|SOREG|SCON, TLL, 831 SAREG|SNAME|SOREG|SCON, TINT, /* will be int */ 832 NSPECIAL|NCREG|NCSL|NCSR, RESC1, 833 "ZO", }, 834 835{ RS, INAREG|FOREFF, 836 SAREG|SNAME|SOREG, TSWORD, 837 SHCH, TCHAR|TUCHAR, 838 NSPECIAL, RLEFT, 839 " sarl AR,AL\n", }, 840 841{ RS, INAREG|FOREFF, 842 SAREG|SNAME|SOREG, TSWORD, 843 SCON, TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT, 844 0, RLEFT, 845 " sarl AR,AL\n", }, 846 847{ RS, INAREG|FOREFF, 848 SAREG|SNAME|SOREG, TUWORD, 849 SHCH, TCHAR|TUCHAR, 850 NSPECIAL, RLEFT, 851 " shrl AR,AL\n", }, 852 853{ RS, INAREG|FOREFF, 854 SAREG|SNAME|SOREG, TUWORD, 855 SCON, TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT, 856 0, RLEFT, 857 " shrl AR,AL\n", }, 858 859{ RS, INAREG|FOREFF, 860 SAREG|SNAME|SOREG, TSHORT, 861 SHCH, TCHAR|TUCHAR, 862 NSPECIAL, RLEFT, 863 " sarw AR,AL\n", }, 864 865{ RS, INAREG|FOREFF, 866 SAREG|SNAME|SOREG, TSHORT, 867 SCON, TANY, 868 0, RLEFT, 869 " sarw AR,AL\n", }, 870 871{ RS, INAREG|FOREFF, 872 SAREG|SNAME|SOREG, TUSHORT, 873 SHCH, TCHAR|TUCHAR, 874 NSPECIAL, RLEFT, 875 " shrw AR,AL\n", }, 876 877{ RS, INAREG|FOREFF, 878 SAREG|SNAME|SOREG, TUSHORT, 879 SCON, TANY, 880 0, RLEFT, 881 " shrw AR,AL\n", }, 882 883{ RS, INCH|FOREFF, 884 SHCH|SNAME|SOREG, TCHAR, 885 SHCH, TCHAR|TUCHAR, 886 NSPECIAL, RLEFT, 887 " sarb AR,AL\n", }, 888 889{ RS, INCH|FOREFF, 890 SHCH|SNAME|SOREG, TCHAR, 891 SCON, TANY, 892 0, RLEFT, 893 " sarb AR,AL\n", }, 894 895{ RS, INCH|FOREFF, 896 SHCH|SNAME|SOREG, TUCHAR, 897 SHCH, TCHAR|TUCHAR, 898 NSPECIAL, RLEFT, 899 " shrb AR,AL\n", }, 900 901{ RS, INCH|FOREFF, 902 SHCH|SNAME|SOREG, TUCHAR, 903 SCON, TANY, 904 0, RLEFT, 905 " shrb AR,AL\n", }, 906 907/* 908 * The next rules takes care of assignments. "=". 909 */ 910{ ASSIGN, FOREFF, 911 SHLL|SNAME|SOREG, TLL, 912 SCON, TANY, 913 0, 0, 914 " movl AR,AL\n movl UR,UL\n", }, 915 916{ ASSIGN, FOREFF|INLL, 917 SHLL, TLL, 918 SCON, TANY, 919 0, RDEST, 920 " movl AR,AL\n movl UR,UL\n", }, 921 922{ ASSIGN, FOREFF, 923 SAREG|SNAME|SOREG, TWORD|TPOINT, 924 SCON, TANY, 925 0, 0, 926 " movl AR,AL\n", }, 927 928{ ASSIGN, FOREFF|INAREG, 929 SAREG, TWORD|TPOINT, 930 SCON, TANY, 931 0, RDEST, 932 " movl AR,AL\n", }, 933 934{ ASSIGN, FOREFF, 935 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 936 SCON, TANY, 937 0, 0, 938 " movw AR,AL\n", }, 939 940{ ASSIGN, FOREFF|INAREG, 941 SAREG, TSHORT|TUSHORT, 942 SCON, TANY, 943 0, RDEST, 944 " movw AR,AL\n", }, 945 946{ ASSIGN, FOREFF, 947 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 948 SCON, TANY, 949 0, 0, 950 " movb AR,AL\n", }, 951 952{ ASSIGN, FOREFF|INCH, 953 SHCH, TCHAR|TUCHAR, 954 SCON, TANY, 955 0, RDEST, 956 " movb AR,AL\n", }, 957 958{ ASSIGN, FOREFF|INLL, 959 SHLL|SNAME|SOREG, TLL, 960 SHLL, TLL, 961 0, RDEST, 962 " movl AR,AL\n movl UR,UL\n", }, 963 964{ ASSIGN, FOREFF|INAREG, 965 SAREG|SNAME|SOREG, TWORD|TPOINT, 966 SAREG, TWORD|TPOINT, 967 0, RDEST, 968 " movl AR,AL\n", }, 969 970{ ASSIGN, FOREFF|INAREG, 971 SAREG, TWORD|TPOINT, 972 SAREG|SNAME|SOREG, TWORD|TPOINT, 973 0, RDEST, 974 " movl AR,AL\n", }, 975 976{ ASSIGN, FOREFF|INAREG, 977 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 978 SAREG, TSHORT|TUSHORT, 979 0, RDEST, 980 " movw AR,AL\n", }, 981 982{ ASSIGN, FOREFF|INCH, 983 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 984 SHCH, TCHAR|TUCHAR|TWORD, 985 0, RDEST, 986 " movb AR,AL\n", }, 987 988{ ASSIGN, FOREFF|INAREG, 989 SFLD, TANY, 990 SAREG, TANY, 991 NAREG, RDEST, 992 "ZE", }, 993 994{ ASSIGN, FOREFF, 995 SFLD, TANY, 996 SAREG|SNAME|SOREG|SCON, TANY, 997 NAREG, 0, 998 "ZE", }, 999 1000{ ASSIGN, INDREG|FOREFF, 1001 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1002 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1003 0, RDEST, 1004 "", }, /* This will always be in the correct register */ 1005 1006/* order of table entries is very important here! */ 1007{ ASSIGN, INFL, 1008 SNAME|SOREG, TLDOUBLE, 1009 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1010 0, RDEST, 1011 " fstt AL\n", }, 1012 1013{ ASSIGN, FOREFF, 1014 SNAME|SOREG, TLDOUBLE, 1015 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1016 0, 0, 1017 " fstpt AL\n", }, 1018 1019{ ASSIGN, INFL, 1020 SNAME|SOREG, TDOUBLE, 1021 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1022 0, RDEST, 1023 " fstl AL\n", }, 1024 1025{ ASSIGN, FOREFF, 1026 SNAME|SOREG, TDOUBLE, 1027 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1028 0, 0, 1029 " fstpl AL\n", }, 1030 1031{ ASSIGN, INFL, 1032 SNAME|SOREG, TFLOAT, 1033 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1034 0, RDEST, 1035 " fsts AL\n", }, 1036 1037{ ASSIGN, FOREFF, 1038 SNAME|SOREG, TFLOAT, 1039 SHFL, TFLOAT|TDOUBLE|TLDOUBLE, 1040 0, 0, 1041 " fstps AL\n", }, 1042/* end very important order */ 1043 1044{ ASSIGN, INFL|FOREFF, 1045 SHFL, TLDOUBLE, 1046 SHFL|SOREG|SNAME, TLDOUBLE, 1047 0, RDEST, 1048 " fldt AR\n", }, 1049 1050{ ASSIGN, INFL|FOREFF, 1051 SHFL, TDOUBLE, 1052 SHFL|SOREG|SNAME, TDOUBLE, 1053 0, RDEST, 1054 " fldl AR\n", }, 1055 1056{ ASSIGN, INFL|FOREFF, 1057 SHFL, TFLOAT, 1058 SHFL|SOREG|SNAME, TFLOAT, 1059 0, RDEST, 1060 " flds AR\n", }, 1061 1062/* Do not generate memcpy if return from funcall */ 1063#if 0 1064{ STASG, INAREG|FOREFF, 1065 SOREG|SNAME|SAREG, TPTRTO|TSTRUCT, 1066 SFUNCALL, TPTRTO|TSTRUCT, 1067 0, RRIGHT, 1068 "", }, 1069#endif 1070 1071{ STASG, INAREG|FOREFF, 1072 SOREG|SNAME, TANY, 1073 SAREG|SOREG|SNAME, TPTRTO|TANY, 1074 NSPECIAL, RRIGHT, 1075 "ZQ", }, 1076 1077/* 1078 * DIV/MOD/MUL 1079 */ 1080/* long long div is emulated */ 1081{ DIV, INCREG, 1082 SCREG|SNAME|SOREG|SCON, TLL, 1083 SCREG|SNAME|SOREG|SCON, TLL, 1084 NSPECIAL|NCREG|NCSL|NCSR, RESC1, 1085 "ZO", }, 1086 1087{ DIV, INAREG, 1088 SAREG, TSWORD, 1089 SAREG|SNAME|SOREG, TWORD, 1090 NSPECIAL, RDEST, 1091 " cltd\n idivl AR\n", }, 1092 1093{ DIV, INAREG, 1094 SAREG, TUWORD|TPOINT, 1095 SAREG|SNAME|SOREG, TUWORD|TPOINT, 1096 NSPECIAL, RDEST, 1097 " xorl %edx,%edx\n divl AR\n", }, 1098 1099{ DIV, INAREG, 1100 SAREG, TUSHORT, 1101 SAREG|SNAME|SOREG, TUSHORT, 1102 NSPECIAL, RDEST, 1103 " xorl %edx,%edx\n divw AR\n", }, 1104 1105{ DIV, INCH, 1106 SHCH, TUCHAR, 1107 SHCH|SNAME|SOREG, TUCHAR, 1108 NSPECIAL, RDEST, 1109 " xorb %ah,%ah\n divb AR\n", }, 1110 1111{ DIV, INFL, 1112 SHFL, TDOUBLE, 1113 SNAME|SOREG, TDOUBLE, 1114 0, RLEFT, 1115 " fdivl AR\n", }, 1116 1117{ DIV, INFL, 1118 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1119 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1120 0, RLEFT, 1121 " fdivZAp\n", }, 1122 1123/* (u)longlong mod is emulated */ 1124{ MOD, INCREG, 1125 SCREG|SNAME|SOREG|SCON, TLL, 1126 SCREG|SNAME|SOREG|SCON, TLL, 1127 NSPECIAL|NCREG|NCSL|NCSR, RESC1, 1128 "ZO", }, 1129 1130{ MOD, INAREG, 1131 SAREG, TSWORD, 1132 SAREG|SNAME|SOREG, TSWORD, 1133 NAREG|NSPECIAL, RESC1, 1134 " cltd\n idivl AR\n", }, 1135 1136{ MOD, INAREG, 1137 SAREG, TUWORD|TPOINT, 1138 SAREG|SNAME|SOREG, TUWORD|TPOINT, 1139 NAREG|NSPECIAL, RESC1, 1140 " xorl %edx,%edx\n divl AR\n", }, 1141 1142{ MOD, INAREG, 1143 SAREG, TUSHORT, 1144 SAREG|SNAME|SOREG, TUSHORT, 1145 NAREG|NSPECIAL, RESC1, 1146 " xorl %edx,%edx\n divw AR\n", }, 1147 1148{ MOD, INCH, 1149 SHCH, TUCHAR, 1150 SHCH|SNAME|SOREG, TUCHAR, 1151 NBREG|NSPECIAL, RESC1, 1152 " xorb %ah,%ah\n divb AR\n", }, 1153 1154/* (u)longlong mul is emulated */ 1155{ MUL, INCREG, 1156 SCREG|SNAME|SOREG|SCON, TLL, 1157 SCREG|SNAME|SOREG|SCON, TLL, 1158 NSPECIAL|NCREG|NCSL|NCSR, RESC1, 1159 "ZO", }, 1160 1161{ MUL, INAREG, 1162 SAREG, TWORD|TPOINT, 1163 SAREG|SNAME|SOREG|SCON, TWORD|TPOINT, 1164 0, RLEFT, 1165 " imull AR,AL\n", }, 1166 1167{ MUL, INAREG, 1168 SAREG, TSHORT|TUSHORT, 1169 SAREG|SNAME|SOREG, TSHORT|TUSHORT, 1170 0, RLEFT, 1171 " imulw AR,AL\n", }, 1172 1173{ MUL, INCH, 1174 SHCH, TCHAR|TUCHAR, 1175 SHCH|SNAME|SOREG, TCHAR|TUCHAR, 1176 NSPECIAL, RDEST, 1177 " imulb AR\n", }, 1178 1179{ MUL, INFL, 1180 SHFL, TDOUBLE, 1181 SNAME|SOREG, TDOUBLE, 1182 0, RLEFT, 1183 " fmull AR\n", }, 1184 1185{ MUL, INFL, 1186 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1187 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1188 0, RLEFT, 1189 " fmulp\n", }, 1190 1191/* 1192 * Indirection operators. 1193 */ 1194{ UMUL, INLL, 1195 SANY, TANY, 1196 SOREG, TLL, 1197 NCREG|NCSL, RESC1, 1198 " movl UL,U1\n movl AL,A1\n", }, 1199 1200{ UMUL, INAREG, 1201 SANY, TPOINT|TWORD, 1202 SOREG, TPOINT|TWORD, 1203 NAREG|NASL, RESC1, 1204 " movl AL,A1\n", }, 1205 1206{ UMUL, INCH, 1207 SANY, TANY, 1208 SOREG, TCHAR|TUCHAR, 1209 NBREG|NBSL, RESC1, 1210 " movb AL,A1\n", }, 1211 1212{ UMUL, INAREG, 1213 SANY, TANY, 1214 SOREG, TSHORT|TUSHORT, 1215 NAREG|NASL, RESC1, 1216 " movw AL,A1\n", }, 1217 1218{ UMUL, INFL, 1219 SANY, TANY, 1220 SOREG, TLDOUBLE, 1221 NDREG|NDSL, RESC1, 1222 " fldt AL\n", }, 1223 1224{ UMUL, INFL, 1225 SANY, TANY, 1226 SOREG, TDOUBLE, 1227 NDREG|NDSL, RESC1, 1228 " fldl AL\n", }, 1229 1230{ UMUL, INFL, 1231 SANY, TANY, 1232 SOREG, TFLOAT, 1233 NDREG|NDSL, RESC1, 1234 " flds AL\n", }, 1235 1236/* 1237 * Logical/branching operators 1238 */ 1239 1240/* Comparisions, take care of everything */ 1241{ OPLOG, FORCC, 1242 SHLL|SOREG|SNAME, TLL, 1243 SHLL, TLL, 1244 0, 0, 1245 "ZD", }, 1246 1247{ OPLOG, FORCC, 1248 SAREG|SOREG|SNAME, TWORD|TPOINT, 1249 SCON|SAREG, TWORD|TPOINT, 1250 0, RESCC, 1251 " cmpl AR,AL\n", }, 1252 1253{ OPLOG, FORCC, 1254 SCON|SAREG, TWORD|TPOINT, 1255 SAREG|SOREG|SNAME, TWORD|TPOINT, 1256 0, RESCC, 1257 " cmpl AR,AL\n", }, 1258 1259{ OPLOG, FORCC, 1260 SAREG|SOREG|SNAME, TSHORT|TUSHORT, 1261 SCON|SAREG, TANY, 1262 0, RESCC, 1263 " cmpw AR,AL\n", }, 1264 1265{ OPLOG, FORCC, 1266 SBREG|SOREG|SNAME, TCHAR|TUCHAR, 1267 SCON|SBREG, TANY, 1268 0, RESCC, 1269 " cmpb AR,AL\n", }, 1270 1271{ OPLOG, FORCC, 1272 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 1273 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 1274 NSPECIAL, 0, 1275 "ZG", }, 1276 1277{ OPLOG, FORCC, 1278 SOREG|SNAME, TDOUBLE|TFLOAT, 1279 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 1280 NSPECIAL, 0, 1281 "ZG", }, 1282 1283#if 0 1284/* Ppro and later only */ 1285{ OPLOG, FORCC, 1286 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 1287 SDREG, TLDOUBLE|TDOUBLE|TFLOAT, 1288 0, RESCC, 1289 "ZA fucomip %st,%st(1)\n", }, 1290#endif 1291 1292{ OPLOG, FORCC, 1293 SANY, TANY, 1294 SANY, TANY, 1295 REWRITE, 0, 1296 "diediedie!", }, 1297 1298/* AND/OR/ER/NOT */ 1299{ AND, INAREG|FOREFF, 1300 SAREG|SOREG|SNAME, TWORD, 1301 SCON|SAREG, TWORD, 1302 0, RLEFT, 1303 " andl AR,AL\n", }, 1304 1305{ AND, INCREG|FOREFF, 1306 SCREG, TLL, 1307 SCREG|SOREG|SNAME, TLL, 1308 0, RLEFT, 1309 " andl AR,AL\n andl UR,UL\n", }, 1310 1311{ AND, INAREG|FOREFF, 1312 SAREG, TWORD, 1313 SAREG|SOREG|SNAME, TWORD, 1314 0, RLEFT, 1315 " andl AR,AL\n", }, 1316 1317{ AND, INAREG|FOREFF, 1318 SAREG|SOREG|SNAME, TSHORT|TUSHORT, 1319 SCON|SAREG, TSHORT|TUSHORT, 1320 0, RLEFT, 1321 " andw AR,AL\n", }, 1322 1323{ AND, INAREG|FOREFF, 1324 SAREG, TSHORT|TUSHORT, 1325 SAREG|SOREG|SNAME, TSHORT|TUSHORT, 1326 0, RLEFT, 1327 " andw AR,AL\n", }, 1328 1329{ AND, INBREG|FOREFF, 1330 SBREG|SOREG|SNAME, TCHAR|TUCHAR, 1331 SCON|SBREG, TCHAR|TUCHAR, 1332 0, RLEFT, 1333 " andb AR,AL\n", }, 1334 1335{ AND, INBREG|FOREFF, 1336 SBREG, TCHAR|TUCHAR, 1337 SBREG|SOREG|SNAME, TCHAR|TUCHAR, 1338 0, RLEFT, 1339 " andb AR,AL\n", }, 1340/* AND/OR/ER/NOT */ 1341 1342/* 1343 * Jumps. 1344 */ 1345{ GOTO, FOREFF, 1346 SCON, TANY, 1347 SANY, TANY, 1348 0, RNOP, 1349 " jmp LL\n", }, 1350 1351#ifdef GCC_COMPAT 1352{ GOTO, FOREFF, 1353 SAREG, TANY, 1354 SANY, TANY, 1355 0, RNOP, 1356 " jmp *AL\n", }, 1357#endif 1358 1359/* 1360 * Convert LTYPE to reg. 1361 */ 1362{ OPLTYPE, INLL, 1363 SANY, TANY, 1364 SCREG|SCON|SOREG|SNAME, TLL, 1365 NCREG, RESC1, 1366 " movl UL,U1\n movl AL,A1\n", }, 1367 1368{ OPLTYPE, INAREG, 1369 SANY, TANY, 1370 SAREG|SCON|SOREG|SNAME, TWORD|TPOINT, 1371 NAREG|NASL, RESC1, 1372 " movl AL,A1\n", }, 1373 1374{ OPLTYPE, INBREG, 1375 SANY, TANY, 1376 SBREG|SOREG|SNAME|SCON, TCHAR|TUCHAR, 1377 NBREG, RESC1, 1378 " movb AL,A1\n", }, 1379 1380{ OPLTYPE, INAREG, 1381 SANY, TANY, 1382 SAREG|SOREG|SNAME|SCON, TSHORT|TUSHORT, 1383 NAREG, RESC1, 1384 " movw AL,A1\n", }, 1385 1386{ OPLTYPE, INDREG, 1387 SANY, TLDOUBLE, 1388 SOREG|SNAME, TLDOUBLE, 1389 NDREG, RESC1, 1390 " fldt AL\n", }, 1391 1392{ OPLTYPE, INDREG, 1393 SANY, TDOUBLE, 1394 SOREG|SNAME, TDOUBLE, 1395 NDREG, RESC1, 1396 " fldl AL\n", }, 1397 1398{ OPLTYPE, INDREG, 1399 SANY, TFLOAT, 1400 SOREG|SNAME, TFLOAT, 1401 NDREG, RESC1, 1402 " flds AL\n", }, 1403 1404/* Only used in ?: constructs. The stack already contains correct value */ 1405{ OPLTYPE, INDREG, 1406 SANY, TFLOAT|TDOUBLE|TLDOUBLE, 1407 SDREG, TFLOAT|TDOUBLE|TLDOUBLE, 1408 NDREG, RESC1, 1409 "", }, 1410 1411/* 1412 * Negate a word. 1413 */ 1414 1415{ UMINUS, INCREG|FOREFF, 1416 SCREG, TLL, 1417 SCREG, TLL, 1418 0, RLEFT, 1419 " negl AL\n adcl $0,UL\n negl UL\n", }, 1420 1421{ UMINUS, INAREG|FOREFF, 1422 SAREG, TWORD|TPOINT, 1423 SAREG, TWORD|TPOINT, 1424 0, RLEFT, 1425 " negl AL\n", }, 1426 1427{ UMINUS, INAREG|FOREFF, 1428 SAREG, TSHORT|TUSHORT, 1429 SAREG, TSHORT|TUSHORT, 1430 0, RLEFT, 1431 " negw AL\n", }, 1432 1433{ UMINUS, INBREG|FOREFF, 1434 SBREG, TCHAR|TUCHAR, 1435 SBREG, TCHAR|TUCHAR, 1436 0, RLEFT, 1437 " negb AL\n", }, 1438 1439{ UMINUS, INFL|FOREFF, 1440 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1441 SHFL, TLDOUBLE|TDOUBLE|TFLOAT, 1442 0, RLEFT, 1443 " fchs\n", }, 1444 1445{ COMPL, INCREG, 1446 SCREG, TLL, 1447 SANY, TANY, 1448 0, RLEFT, 1449 " notl AL\n notl UL\n", }, 1450 1451{ COMPL, INAREG, 1452 SAREG, TWORD, 1453 SANY, TANY, 1454 0, RLEFT, 1455 " notl AL\n", }, 1456 1457{ COMPL, INAREG, 1458 SAREG, TSHORT|TUSHORT, 1459 SANY, TANY, 1460 0, RLEFT, 1461 " notw AL\n", }, 1462 1463{ COMPL, INBREG, 1464 SBREG, TCHAR|TUCHAR, 1465 SANY, TANY, 1466 0, RLEFT, 1467 " notb AL\n", }, 1468 1469/* 1470 * Arguments to functions. 1471 */ 1472{ FUNARG, FOREFF, 1473 SCON|SCREG|SNAME|SOREG, TLL, 1474 SANY, TLL, 1475 0, RNULL, 1476 " pushl UL\n pushl AL\n", }, 1477#endif 1478 1479{ FUNARG, FOREFF, 1480 SAREG|SBREG, TCHAR|TUCHAR|TWORD|TPOINT, 1481 SANY, TCHAR|TUCHAR|TWORD|TPOINT, 1482 0, RNULL, 1483 " sta AL,@sp\n", }, 1484 1485#if 0 1486{ FUNARG, FOREFF, 1487 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1488 SANY, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1489 0, RNULL, 1490 " pushl AL\n", }, 1491 1492{ FUNARG, FOREFF, 1493 SAREG|SNAME|SOREG, TSHORT, 1494 SANY, TSHORT, 1495 NAREG, 0, 1496 " movswl AL,ZN\n pushl ZN\n", }, 1497 1498{ FUNARG, FOREFF, 1499 SAREG|SNAME|SOREG, TUSHORT, 1500 SANY, TUSHORT, 1501 NAREG, 0, 1502 " movzwl AL,ZN\n pushl ZN\n", }, 1503 1504{ FUNARG, FOREFF, 1505 SHCH|SNAME|SOREG, TCHAR, 1506 SANY, TCHAR, 1507 NAREG, 0, 1508 " movsbl AL,A1\n pushl A1\n", }, 1509 1510{ FUNARG, FOREFF, 1511 SHCH|SNAME|SOREG, TUCHAR, 1512 SANY, TUCHAR, 1513 NAREG, 0, 1514 " movzbl AL,A1\n pushl A1\n", }, 1515 1516{ FUNARG, FOREFF, 1517 SNAME|SOREG, TDOUBLE, 1518 SANY, TDOUBLE, 1519 0, 0, 1520 " pushl UL\n pushl AL\n", }, 1521 1522{ FUNARG, FOREFF, 1523 SDREG, TDOUBLE, 1524 SANY, TDOUBLE, 1525 0, 0, 1526 " subl $8,%esp\n fstpl (%esp)\n", }, 1527 1528{ FUNARG, FOREFF, 1529 SNAME|SOREG, TFLOAT, 1530 SANY, TFLOAT, 1531 0, 0, 1532 " pushl AL\n", }, 1533 1534{ FUNARG, FOREFF, 1535 SDREG, TFLOAT, 1536 SANY, TFLOAT, 1537 0, 0, 1538 " subl $4,%esp\n fstps (%esp)\n", }, 1539 1540{ FUNARG, FOREFF, 1541 SDREG, TLDOUBLE, 1542 SANY, TLDOUBLE, 1543 0, 0, 1544 " subl $12,%esp\n fstpt (%esp)\n", }, 1545 1546{ STARG, FOREFF, 1547 SAREG|SOREG|SNAME|SCON, TANY, 1548 SANY, TSTRUCT, 1549 NSPECIAL|NAREG, 0, 1550 "ZF", }, 1551 1552#endif 1553 1554# define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 1555 1556{ UMUL, DF( UMUL ), }, 1557 1558{ ASSIGN, DF(ASSIGN), }, 1559 1560{ STASG, DF(STASG), }, 1561 1562{ FLD, DF(FLD), }, 1563 1564{ OPLEAF, DF(NAME), }, 1565 1566{ OPUNARY, DF(UMINUS), }, 1567 1568{ OPANY, DF(BITYPE), }, 1569 1570{ FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" }, 1571}; 1572 1573int tablesize = sizeof(table)/sizeof(table[0]); 1574