1 /* $OpenBSD: table.c,v 1.2 2007/12/19 20:19:54 otto Exp $ */ 2 3 /* 4 * Copyright (c) 2007 Michael Shalayeff 5 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "pass2.h" 32 33 #define TLL TLONGLONG|TULONGLONG 34 #define ANYSIGNED TINT|TLONG|TSHORT|TCHAR 35 #define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR 36 #define ANYFIXED ANYSIGNED|ANYUSIGNED 37 #define TUWORD TUNSIGNED|TULONG 38 #define TSWORD TINT|TLONG 39 #define TWORD TUWORD|TSWORD 40 #define THWORD TUSHORT|TSHORT 41 #define TBYTE TUCHAR|TCHAR 42 43 #define SHINT SAREG /* char, short and int */ 44 #define ININT INAREG 45 #define SHLL SBREG /* shape for long long */ 46 #define INLL INBREG 47 #define SHFL SCREG /* shape for float */ 48 #define INFL INCREG 49 #define SHDBL SDREG /* shape for double */ 50 #define INDBL INDREG 51 52 struct optab table[] = { 53 /* First entry must be an empty entry */ 54 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, 55 56 /* PCONVs are usually not necessary */ 57 { PCONV, INAREG, 58 SAREG, TWORD|TPOINT, 59 SAREG, TWORD|TPOINT, 60 0, RLEFT, 61 "", }, 62 /* 63 * A bunch conversions of integral<->integral types 64 * There are lots of them, first in table conversions to itself 65 * and then conversions from each type to the others. 66 */ 67 68 /* itself to itself, including pointers */ 69 70 /* convert int,short,char <-> int,short,char. */ 71 { SCONV, ININT, 72 SHINT, TBYTE, 73 SHINT, TBYTE, 74 0, RLEFT, 75 "", }, 76 77 { SCONV, ININT, 78 SHINT, THWORD, 79 SHINT, THWORD, 80 0, RLEFT, 81 "", }, 82 83 { SCONV, ININT, 84 SHINT, TWORD, 85 SHINT, TWORD, 86 0, RLEFT, 87 "", }, 88 89 /* convert pointers to int. */ 90 { SCONV, ININT, 91 SHINT, TWORD|TPOINT, 92 SANY, TWORD, 93 0, RLEFT, 94 "", }, 95 96 /* convert (u)longlong to (u)longlong. */ 97 { SCONV, INLL, 98 SHLL, TLL, 99 SHLL, TLL, 100 0, RLEFT, 101 "", }, 102 103 /* convert pointers to pointers. */ 104 { SCONV, ININT, 105 SHINT, TPOINT, 106 SANY, TPOINT, 107 0, RLEFT, 108 "", }, 109 110 /* convert double <-> ldouble. nothing to do here (or support quads later) */ 111 { SCONV, INDBL, 112 SHDBL, TDOUBLE|TLDOUBLE, 113 SHDBL, TDOUBLE|TLDOUBLE, 114 0, RLEFT, 115 "", }, 116 117 /* convert float -> double */ 118 { SCONV, INFL, 119 SHFL, TFLOAT, 120 SHDBL, TDOUBLE|TLDOUBLE, 121 0, 0, 122 "\tfcnvff,sgl,dbl AL,AR\n", }, 123 124 /* convert double -> float */ 125 { SCONV, INDBL, 126 SHDBL, TDOUBLE|TLDOUBLE, 127 SHFL, TFLOAT, 128 0, 0, 129 "\tfcnvff,dbl,sgl\tAL,AR\n", }, 130 131 /* convert int,short,char to (u)long long */ 132 { SCONV, INLL, 133 SHINT, ANYSIGNED, 134 SANY, TLL, 135 NBREG, RESC1, 136 "\tcopy\tAL,A1\n" 137 "\textrs\tAL,0,1,U1\n", }, 138 139 /* convert unsigned int,short,char to (u)long long */ 140 { SCONV, INLL, 141 SHINT, TWORD, 142 SANY, TLL, 143 NBREG, RESC1, 144 "\tcopy\tAL,A1\n" 145 "\tcopy\t%r0,U1\n", }, 146 147 /* convert int,short,char (in memory) to float */ 148 { SCONV, INFL, 149 SOREG, ANYSIGNED, 150 SHFL, TFLOAT, 151 NCREG, RESC1, 152 "\tfldws\tAL,A1\n" 153 "\tfcnvxf,sgl,sgl\tA1,A1\n", }, 154 155 /* convert int,short,char (in memory) to double */ 156 { SCONV, INDBL, 157 SOREG, TSWORD, 158 SHDBL, TDOUBLE|TLDOUBLE, 159 NDREG, RESC1, 160 "\tfldws\tAL,A1\n" 161 "\tfcnvxf,sgl,dbl\tA1,A1\n", }, 162 163 /* convert (u)long (in memory) to double */ 164 { SCONV, INDBL, 165 SOREG, TLL, 166 SHDBL, TDOUBLE|TLDOUBLE, 167 NDREG, RESC1, 168 "\tfldds\tAL,A1\n" 169 "\tfcnvxf,dbl,dbl\tA1,A1\n", }, 170 171 /* convert int,short,char (in register) to float */ 172 { SCONV, INFL, 173 SHINT, TSWORD, 174 SHFL, TFLOAT, 175 NCREG, RESC1, 176 "\tstw,ma\tAL,4(%sp)\n" 177 "\tfldws,ma\t-4(%sp),A1\n" 178 "\tfcnvxf,sgl,sgl\tA1,A1\n", }, 179 180 /* convert int,short,char (in register) to double */ 181 { SCONV, INDBL, 182 SHINT, TSWORD, 183 SHDBL, TDOUBLE|TLDOUBLE, 184 NDREG, RESC1, 185 "\tstw,ma\tAL,4(%sp)\n" 186 "\tfldws,mb\t-4(%sp),AR\n" 187 "\tfcnvxf,sgl,dbl\tA1,A1\n", }, 188 189 /* convert (u)long (in register) to double */ 190 { SCONV, INDBL, 191 SHLL, TLL, 192 SHDBL, TDOUBLE|TLDOUBLE, 193 NDREG, RESC1, 194 "\tldo\t8(%sp),%sp\n" 195 "\tstw\tAL,-8(%sp)\n" 196 "\tstw\tUL,-4(%sp)\n" 197 "\tfldds,mb\t-8(%sp),A1\n" 198 "\tfcnvxf,dbl,dbl\tA1,A1\n", }, 199 200 /* convert char to (unsigned) short/int. */ 201 { SCONV, ININT, 202 SAREG, TCHAR, 203 SAREG, THWORD|TWORD, 204 NASL|NAREG, RESC1, 205 "\textrs\tAL,31,8,A1\n", }, 206 207 /* convert unsigned char to (unsigned) short/int. */ 208 { SCONV, ININT, 209 SAREG, TUCHAR, 210 SAREG, THWORD|TWORD, 211 NASL|NAREG, RESC1, 212 "\textru\tAL,31,8,A1\n", }, 213 214 /* convert char to (unsigned) long long. */ 215 { SCONV, INLL, 216 SAREG, TCHAR, 217 SBREG, TLL, 218 NBSL|NBREG, RESC1, 219 "\textrs\tAL,31,8,A1\n\textrs\tA1,0,1,U1", }, 220 221 /* convert unsigned char to (unsigned) long long. */ 222 { SCONV, INLL, 223 SAREG, TUCHAR, 224 SBREG, TLL, 225 NBSL|NBREG, RESC1, 226 "\textru\tAL,31,8,A1\n\tcopy\t%r0,U1", }, 227 228 /* convert short to (unsigned) int. */ 229 { SCONV, ININT, 230 SAREG, TSHORT, 231 SAREG, TWORD, 232 NASL|NAREG, RESC1, 233 "\textrs\tAL,31,16,A1\n", }, 234 235 /* convert unsigned short to (unsigned) int. */ 236 { SCONV, ININT, 237 SAREG, TUSHORT, 238 SAREG, THWORD, 239 NASL|NAREG, RESC1, 240 "\textru\tAL,31,16,A1\n", }, 241 242 /* convert short to (unsigned) long long. */ 243 { SCONV, INLL, 244 SAREG, TSHORT, 245 SBREG, TLL, 246 NBSL|NBREG, RESC1, 247 "\textrs\tAL,31,16,A1\n\textrs\tA1,0,1,U1", }, 248 249 /* convert unsigned short to (unsigned) long long. */ 250 { SCONV, INLL, 251 SAREG, TUSHORT, 252 SBREG, TLL, 253 NBSL|NBREG, RESC1, 254 "\textru\tAL,31,16,A1\n\tcopy\t%r0,U1", }, 255 256 /* convert int,short,char (in memory) to int,short,char */ 257 { SCONV, ININT, 258 SOREG, TBYTE, 259 SHINT, TBYTE|TPOINT, 260 NAREG|NASL, RESC1, 261 "\tldb\tAL,A1\n", }, 262 263 { SCONV, ININT, 264 SOREG, THWORD, 265 SHINT, THWORD|TPOINT, 266 NAREG|NASL, RESC1, 267 "\tldh\tAL,A1\n", }, 268 269 { SCONV, ININT, 270 SOREG, TWORD, 271 SHINT, TWORD|TPOINT, 272 NAREG|NASL, RESC1, 273 "\tldw\tAL,A1\n", }, 274 275 /* convert (u)long long (in register) to int,short,char */ 276 { SCONV, ININT, 277 SHLL, TLL, 278 SHINT, ANYFIXED, 279 NAREG|NASL, RESC1, 280 "\tcopy\tAL,A1\n", }, 281 282 /* convert (u)long (in memory) to int,short,char */ 283 { SCONV, ININT, 284 SOREG, TLL, 285 SHINT, ANYFIXED, 286 NAREG|NASL, RESC1, 287 "\tldw\tAL,A1\n", }, 288 289 /* convert float (in register) to (u)int */ 290 { SCONV, ININT, 291 SHFL, TFLOAT, 292 SHINT, TWORD, 293 NAREG, RESC1, 294 "\tfcnvfxt,sgl,sgl\tAL,AL\n" 295 "\tfstws,ma\tAL,4(%sp)\n" 296 "\tldw,mb\t-4(%sp),A1\n", }, 297 298 /* convert double (in register) to (u)int */ 299 { SCONV, ININT, 300 SHDBL, TDOUBLE|TLDOUBLE, 301 SHINT, TWORD, 302 NCREG|NCSL|NAREG, RESC2, 303 "\tfcnvfxt,dbl,sgl\tAL,A1\n" 304 "\tfstws,ma\tA1,4(%sp)\n" 305 "\tldw,mb\t-4(%sp),A2\n", }, 306 307 /* convert float (in register) to (u)long */ 308 { SCONV, INLL, 309 SHFL, TFLOAT, 310 SHLL, TLL, 311 NDREG|NDSL|NBREG, RESC2, 312 "\tfcnvfxt,sgl,dbl\tAL,A1\n" 313 "\tfstds,ma\tA1,8(%sp)\n" 314 "\tldw\t-8(%sp),A2\n" 315 "\tldw\t-4(%sp),U2\n" 316 "\tldo\t-8(%sp),%sp)\n", }, 317 318 /* convert double (in register) to (u)long */ 319 { SCONV, INLL, 320 SHDBL, TDOUBLE|TLDOUBLE, 321 SHLL, TLL, 322 NBREG, RESC1, 323 "\tfcnvfxt,dbl,dbl\tAL,AL\n" 324 "\tfstds,ma\tAL,8(%sp)\n" 325 "\tldw\t-8(%sp),A1\n" 326 "\tldw\t-4(%sp),U1\n" 327 "\tldo\t-8(%sp),%sp)\n", }, 328 329 /* 330 * Subroutine calls. 331 */ 332 333 { CALL, FOREFF, 334 SAREG, TANY, 335 SANY, TANY, 336 0, 0, 337 "ZP\tblr\t%r0, %rp\n" 338 "\tbv,n\t%r0(AL)\n" 339 "\tnop\nZC", }, 340 341 { UCALL, FOREFF, 342 SAREG, TANY, 343 SANY, TANY, 344 0, 0, 345 "ZP\tblr\t%r0, %rp\n" 346 "\tbv,n\t%r0(AL)\n" 347 "\tnop\nZC", }, 348 349 { CALL, ININT, 350 SAREG, TANY, 351 SHINT, ANYFIXED|TPOINT, 352 NAREG|NASL, RESC1, 353 "ZP\tblr\t%r0, %rp\n" 354 "\tbv,n\t%r0(AL)\n" 355 "\tnop\nZC", }, 356 357 { UCALL, ININT, 358 SAREG, TANY, 359 SHINT, ANYFIXED|TPOINT, 360 NAREG|NASL, RESC1, 361 "ZP\tblr\t%r0, %rp\n" 362 "\tbv,n\t%r0(AL)\n" 363 "\tnop\nZC", }, 364 365 { CALL, INLL, 366 SAREG, TANY, 367 SHLL, TLL, 368 NBREG|NBSL, RESC1, 369 "ZP\tblr\t%r0, %rp\n" 370 "\tbv,n\t%r0(AL)\n" 371 "\tnop\nZC", }, 372 373 { UCALL, INLL, 374 SAREG, TANY, 375 SHLL, TLL, 376 NBREG|NBSL, RESC1, 377 "ZP\tblr\t%r0, %rp\n" 378 "\tbv,n\t%r0(AL)\n" 379 "\tnop\nZC", }, 380 381 { CALL, INFL, 382 SAREG, TANY, 383 SHFL, TFLOAT, 384 NCREG|NCSL, RESC1, 385 "ZP\tblr\t%r0, %rp\n" 386 "\tbv,n\t%r0(AL)\n" 387 "\tnop\nZC", }, 388 389 { UCALL, INFL, 390 SAREG, TANY, 391 SHFL, TFLOAT, 392 NCREG|NCSL, RESC1, 393 "ZP\tblr\t%r0, %rp\n" 394 "\tbv,n\t%r0(AL)\n" 395 "\tnop\nZC", }, 396 397 { CALL, INDBL, 398 SAREG, TANY, 399 SHDBL, TDOUBLE|TLDOUBLE, 400 NDREG|NDSL, RESC1, 401 "ZP\tblr\t%r0, %rp\n" 402 "\tbv,n\t%r0(AL)\n" 403 "\tnop\nZC", }, 404 405 { UCALL, INDBL, 406 SAREG, TANY, 407 SHDBL, TDOUBLE|TLDOUBLE, 408 NDREG|NDSL, RESC1, 409 "ZP\tblr\t%r0, %rp\n" 410 "\tbv,n\t%r0(AL)\n" 411 "\tnop\nZC", }, 412 413 /* 414 * The next rules handle all binop-style operators. 415 */ 416 /* TODO fix char/short overflows */ 417 418 { PLUS, INLL, 419 SHLL, TLL, 420 SPICON, TANY, 421 NBREG|NBSL, RESC1, 422 "\taddi\tAL,AR,A1\n" 423 "\taddc\tUL,%r0,U1\n", }, 424 425 { PLUS, INLL, 426 SHLL, TLL, 427 SHLL, TLL, 428 NBREG|NBSL|NBSR, RESC1, 429 "\tadd\tAL,AR,A1\n" 430 "\taddc\tUL,UR,U1\n", }, 431 432 { PLUS, INFL, 433 SHFL, TFLOAT, 434 SHFL, TFLOAT, 435 NCREG|NCSL|NCSR, RESC1, 436 "\tfadd,sgl\tAL,AR,A1\n", }, 437 438 { PLUS, INDBL, 439 SHDBL, TDOUBLE|TLDOUBLE, 440 SHDBL, TDOUBLE|TLDOUBLE, 441 NDREG|NDSL|NDSR, RESC1, 442 "\tfadd,dbl\tAL,AR,A1\n", }, 443 444 { PLUS, ININT, 445 SHINT, ANYFIXED|TPOINT, 446 SONE, TANY, 447 NAREG|NASL, RESC1, 448 "\tldo\t1(AL),A1\n", }, 449 450 { PLUS, ININT, 451 SHINT, ANYFIXED|TPOINT, 452 SPCON, TANY, 453 NAREG|NASL, RESC1, 454 "\tldo\tCR(AL),A1\n", }, 455 456 { MINUS, INLL, 457 SHLL, TLL, 458 SPICON, TANY, 459 NBREG|NBSL|NBSR, RESC1, 460 "\tsubi\tAL,AR,A1\n" 461 "\tsubb\tUL,%r0,U1\n", }, 462 463 { PLUS, ININT, 464 SHINT, TANY|TPOINT, 465 SPNAME, TANY, 466 NAREG|NASL, RESC1, 467 "\tldo\tAR(AL),A1\n", }, 468 469 { MINUS, INLL, 470 SHLL, TLL, 471 SHLL, TLL, 472 NBREG|NBSL|NBSR, RESC1, 473 "\tsub\tAL,AR,A1\n" 474 "\tsubb\tUL,UR,U1\n", }, 475 476 { MINUS, INFL, 477 SHFL, TFLOAT, 478 SHFL, TFLOAT, 479 NCREG|NCSL|NCSR, RESC1, 480 "\tfsub,sgl\tAL,AR,A1\n", }, 481 482 { MINUS, INDBL, 483 SHDBL, TDOUBLE|TLDOUBLE, 484 SHDBL, TDOUBLE|TLDOUBLE, 485 NDREG|NDSL|NDSR, RESC1, 486 "\tfsub,dbl\tAL,AR,A1\n", }, 487 488 { MINUS, ININT, 489 SHINT, ANYFIXED|TPOINT, 490 SONE, TANY, 491 NAREG|NASL, RESC1, 492 "\tldo\t-1(AL),A1\n", }, 493 494 { MINUS, ININT, 495 SHINT, ANYFIXED|TPOINT, 496 SPCON, TANY, 497 NAREG|NASL, RESC1, 498 "\tldo\t-CR(AL),A1\n", }, 499 500 /* Simple reg->reg ops */ 501 { OPSIMP, ININT, 502 SAREG, TWORD|TPOINT, 503 SAREG, TWORD|TPOINT, 504 NAREG|NASL, RESC1, 505 "\tO\tAL,AR,A1\n", }, 506 507 { OPSIMP, INLL, 508 SHLL, TLL, 509 SHLL, TLL, 510 NBREG|NBSL|NBSR, RESC1, 511 "\tO\tAL,AR,A1\n" 512 "\tO\tUL,UR,U1\n", }, 513 514 /* 515 * The next rules handle all shift operators. 516 */ 517 { LS, ININT, 518 SHINT, ANYFIXED, 519 SCON, ANYFIXED, 520 NAREG|NASL, RESC1, 521 "\tzdep\tAL,31-AR,32-AR,A1\n", }, 522 523 { LS, ININT, 524 SHINT, ANYFIXED, 525 SHINT, ANYFIXED, 526 NAREG|NASR, RESC1, 527 "\tsubi\t31,AR,A1\n" 528 "\tmtsar\tA1\n" 529 "\tzvdep\tAL,32,A1\n", }, 530 531 { RS, INLL, 532 SHLL, TLONGLONG, 533 SCON, ANYFIXED, 534 NBREG|NBSL, RESC1, 535 "\tshd\tUL,AL,31-AR,A1\n" 536 "\textrs\tUL,31-AR,32,U1\n", }, 537 538 { RS, INLL, 539 SHLL, TULONGLONG, 540 SCON, ANYFIXED, 541 NBREG|NBSL, RESC1, 542 "\tshd\tUL,AL,AR,A1\n" 543 "\textru\tUL,31-AR,32,U1\n", }, 544 545 { RS, ININT, 546 SHINT, ANYSIGNED, 547 SCON, ANYFIXED, 548 NAREG|NASL, RESC1, 549 "\textrs\tAL,31-AR,32,A1\n", }, 550 551 { RS, ININT, 552 SHINT, ANYUSIGNED, 553 SCON, ANYFIXED, 554 NAREG|NASL, RESC1, 555 "\textru\tAL,31-AR,32,A1\n", }, 556 557 /* TODO the following should be split into mtsar and actual shift parts */ 558 { RS, ININT, 559 SHINT, ANYSIGNED, 560 SHINT, ANYFIXED, 561 NAREG|NASR, RESC1, 562 "\tsubi\t31,AR,A1\n" 563 "\tmtsar\tA1\n" 564 "\tvextrs\tAL,32,A1\n", }, 565 566 { RS, ININT, 567 SHINT, ANYUSIGNED, 568 SHINT, ANYFIXED, 569 NAREG|NASR, RESC1, 570 "\tsubi\t31,AR,A1\n" 571 "\tmtsar\tA1\n" 572 "\tvextru\tAL,32,A1\n", }, 573 574 /* 575 * The next rules takes care of assignments. "=". 576 */ 577 578 { ASSIGN, FOREFF|INAREG, 579 SAREG, TWORD|TPOINT, 580 SPCON, TANY, 581 0, RDEST, 582 "\tldi\tAR,AL\n", }, 583 584 { ASSIGN, FOREFF|INAREG, 585 SOREG, TBYTE, 586 SHINT, TBYTE, 587 0, RDEST, 588 "\tstb\tAR,AL\n", }, 589 590 { ASSIGN, FOREFF|INAREG, 591 SOREG, THWORD, 592 SHINT, THWORD, 593 0, RDEST, 594 "\tsth\tAR,AL\n", }, 595 596 { ASSIGN, FOREFF|INAREG, 597 SOREG, TWORD|TPOINT, 598 SHINT, TWORD|TPOINT, 599 0, RDEST, 600 "\tstw\tAR,AL\n", }, 601 602 { ASSIGN, FOREFF|INLL, 603 SOREG, TLL, 604 SHLL, TLL, 605 0, RDEST, 606 "\tstw\tAR,AL\n" 607 "\tstw\tUR,UL\n", }, 608 609 { ASSIGN, FOREFF|INAREG, 610 SHINT, TBYTE, 611 SOREG, TBYTE, 612 0, RDEST, 613 "\tldb\tAR,AL\n", }, 614 615 { ASSIGN, FOREFF|INAREG, 616 SHINT, THWORD, 617 SOREG, THWORD, 618 0, RDEST, 619 "\tldh\tAR,AL\n", }, 620 621 { ASSIGN, FOREFF|INAREG, 622 SHINT, TWORD|TPOINT, 623 SOREG, TWORD|TPOINT, 624 0, RDEST, 625 "\tldw\tAR,AL\n", }, 626 627 { ASSIGN, FOREFF|INLL, 628 SHLL, TLL, 629 SOREG, TLL, 630 0, RDEST, 631 "\tldw\tAR,AL\n" 632 "\tldw\tUR,UL\n", }, 633 634 { ASSIGN, FOREFF|ININT, 635 SHINT, TWORD|TPOINT, 636 SHINT, TWORD|TPOINT, 637 0, RDEST, 638 "\tcopy\tAR,AL\n", }, 639 640 { ASSIGN, FOREFF|ININT, 641 SHINT, ANYFIXED, 642 SHINT, ANYFIXED, 643 0, RDEST, 644 "\tcopy\tAR,AL\n", }, 645 646 { ASSIGN, FOREFF|ININT, 647 SFLD, TANY, 648 SPIMM, TANY, 649 0, RDEST, 650 "\tdepi\tAR,31-H,S,AL\n", }, 651 652 { ASSIGN, FOREFF|ININT, 653 SFLD, TANY, 654 SHINT, TANY, 655 0, RDEST, 656 "\tdep\tAR,31-H,S,AL\n", }, 657 658 { ASSIGN, FOREFF|INLL, 659 SHLL, TLL, 660 SHLL, TLL, 661 0, RDEST, 662 "\tcopy\tAR,AL\n" 663 "\tcopy\tUR,UL\n", }, 664 665 { ASSIGN, FOREFF|INFL, 666 SHFL, TFLOAT, 667 SHFL, TFLOAT, 668 0, RDEST, 669 "\tfcpy,sgl\tAR,AL\n", }, 670 671 { ASSIGN, FOREFF|INDBL, 672 SHDBL, TDOUBLE|TLDOUBLE, 673 SHDBL, TDOUBLE|TLDOUBLE, 674 0, RDEST, 675 "\tfcpy,dbl\tAR,AL\n", }, 676 677 { ASSIGN, FOREFF|INFL, 678 SHFL, TFLOAT, 679 SOREG, TFLOAT, 680 0, RDEST, 681 "\tfldws\tAR,AL\n", }, 682 683 { ASSIGN, FOREFF|INDBL, 684 SHDBL, TDOUBLE|TLDOUBLE, 685 SOREG, TDOUBLE|TLDOUBLE, 686 0, RDEST, 687 "\tfldds\tAR,AL\n", }, 688 689 { ASSIGN, FOREFF|INFL, 690 SOREG, TFLOAT, 691 SHFL, TFLOAT, 692 0, RDEST, 693 "\tfstws\tAR,AL\n", }, 694 695 { ASSIGN, FOREFF|INDBL, 696 SOREG, TDOUBLE|TLDOUBLE, 697 SHDBL, TDOUBLE|TLDOUBLE, 698 0, RDEST, 699 "\tfstds\tAR,AL\n", }, 700 701 /* 702 * DIV/MOD/MUL 703 */ 704 { DIV, INFL, 705 SHFL, TFLOAT, 706 SHFL, TFLOAT, 707 NCREG|NCSL|NCSR, RESC1, 708 "\tfdiv,sgl\tAL,AR,A1\n", }, 709 710 { DIV, INDBL, 711 SHDBL, TDOUBLE|TLDOUBLE, 712 SHDBL, TDOUBLE|TLDOUBLE, 713 NDREG|NDSL|NDSR, RESC1, 714 "\tfdiv,dbl\tAL,AR,A1\n", }, 715 716 { MUL, INFL, 717 SHFL, TFLOAT, 718 SHFL, TFLOAT, 719 NCREG|NCSL|NCSR, RESC1, 720 "\tfmul,sgl\tAL,AR,A1\n", }, 721 722 { MUL, INDBL, 723 SHDBL, TDOUBLE|TLDOUBLE, 724 SHDBL, TDOUBLE|TLDOUBLE, 725 NDREG|NDSL|NDSR, RESC1, 726 "\tfmul,dbl\tAL,AR,A1\n", }, 727 728 /* 729 * Indirection operators. 730 */ 731 { UMUL, INLL, 732 SANY, TANY, 733 SOREG, TLL, 734 NBREG, RESC1, 735 "\tldw\tAL,A1\n" 736 "\tldw\tUL,U1\n", }, 737 738 { UMUL, ININT, 739 SANY, TPOINT|TWORD, 740 SOREG, TPOINT|TWORD, 741 NAREG|NASL, RESC1, 742 "\tldw\tAL,A1\n", }, 743 744 { UMUL, ININT, 745 SANY, TANY, 746 SOREG, THWORD, 747 NAREG|NASL, RESC1, 748 "\tldh\tAL,A1\n", }, 749 750 { UMUL, ININT, 751 SANY, TANY, 752 SOREG, TBYTE, 753 NAREG|NASL, RESC1, 754 "\tldb\tAL,A1\n", }, 755 756 { UMUL, INDBL, 757 SANY, TANY, 758 SOREG, TDOUBLE|TLDOUBLE, 759 NDREG|NDSL, RESC1, 760 "\tfldds\tAL,A1\n", }, 761 762 { UMUL, INFL, 763 SANY, TANY, 764 SOREG, TFLOAT, 765 NCREG|NCSL, RESC1, 766 "\tfldws\tAL,A1\n", }, 767 768 /* 769 * Logical/branching operators 770 */ 771 { OPLOG, FORCC, 772 SHLL, TLL, 773 SHLL, TLL, 774 0, 0, 775 "ZD", }, 776 777 { OPLOG, FORCC, 778 SHINT, ANYFIXED|TPOINT, 779 SPIMM, ANYFIXED|TPOINT, 780 0, 0, 781 "\tcomib,O\tAR,AL,LC\n\tnop\n", }, 782 783 { OPLOG, FORCC, 784 SHINT, ANYFIXED|TPOINT, 785 SHINT, ANYFIXED|TPOINT, 786 0, 0, 787 "\tcomb,O\tAR,AL,LC\n\tnop\n", }, 788 789 { OPLOG, FORCC, 790 SHFL, TFLOAT, 791 SHFL, TFLOAT, 792 0, RESCC, 793 "\tfcmp,sgl,!O\tAR,AL\n" 794 "\tftest\n" 795 "\tb\tLC\n" 796 "\tnop", }, 797 798 { OPLOG, FORCC, 799 SHDBL, TDOUBLE|TLDOUBLE, 800 SHDBL, TDOUBLE|TLDOUBLE, 801 0, RESCC, 802 "\tfcmp,dbl,!O\tAR,AL\n" 803 "\tftest\n" 804 "\tb\tLC\n" 805 "\tnop", }, 806 807 /* 808 * Jumps. 809 */ 810 { GOTO, FOREFF, 811 SCON, TANY, 812 SANY, TANY, 813 0, RNOP, 814 "\tb\tLL\n\tnop\n", }, 815 816 #ifdef GCC_COMPAT 817 { GOTO, FOREFF, 818 SAREG, TANY, 819 SANY, TANY, 820 0, RNOP, 821 "\tbv\t%r0(AL)\n\tnop\n", }, 822 #endif 823 824 825 /* 826 * Convert LTYPE to reg. 827 */ 828 829 { OPLTYPE, INAREG, 830 SAREG, TANY, 831 SNAME, TANY, 832 0, RDEST, 833 "\taddil\tUR,%r27\n", }, 834 835 { OPLTYPE, INAREG, 836 SAREG, TANY, 837 SCON, TPOINT, 838 0, RDEST, 839 "\taddil\tUR,%r27\n", }, 840 841 { OPLTYPE, INLL, 842 SANY, TANY, 843 SOREG, TLL, 844 NBREG|NBSL, RESC1, 845 "\tldw\tAL,A1\n" 846 "\tldw\tUL,U1\n", }, 847 848 { OPLTYPE, INAREG, 849 SANY, TANY, 850 SOREG, TWORD|TPOINT, 851 NAREG|NASL, RESC1, 852 "\tldw\tAL,A1\n", }, 853 854 { OPLTYPE, INAREG, 855 SANY, TANY, 856 SAREG, TWORD|TPOINT, 857 NAREG|NASL, RESC1, 858 "\tcopy\tAL,A1\n", }, 859 860 { OPLTYPE, INAREG, 861 SANY, TANY, 862 SPCNHI, ANYFIXED, 863 NAREG, RESC1, 864 "\tldil\tUR,A1\n", }, 865 866 { OPLTYPE, INAREG, 867 SANY, TANY, 868 SPCON, ANYFIXED, 869 NAREG, RESC1, 870 "\tldi\tAR,A1\n", }, 871 872 { OPLTYPE, INLL, 873 SANY, TANY, 874 SPCON, TLL, 875 NBREG, RESC1, 876 "\tldi\tAR,A1\n" 877 "\tcopy\t%r0,U1\n", }, 878 879 { OPLTYPE, ININT, 880 SANY, TANY, 881 SCON, TWORD, 882 NAREG, RESC1, 883 "\tldil\tUR,A1\n" 884 "\tldo\tAR(A1),A1\n", }, 885 886 { OPLTYPE, INLL, 887 SHLL, TLL, 888 SPCNHW, TLL, 889 NBREG, RESC1, 890 "\tldil\tUR>>32,U1\n" 891 "\tldo\tAR>>32(U1),U1\n" 892 "\tcopy\t%r0,A1\n", }, 893 894 { OPLTYPE, INLL, 895 SHLL, TLL, 896 SPCNLW, TLL, 897 NBREG, RESC1, 898 "\tcopy\t%r0,U1\n" 899 "\tldil\tUR,A1\n" 900 "\tldo\tAR(A1),A1\n", }, 901 902 { OPLTYPE, INLL, 903 SHLL, TLL, 904 SCON, TLL, 905 NBREG, RESC1, 906 "\tldil\tUR,A1\n" 907 "\tldo\tAR(A1),A1\n" 908 "\tldil\tUR>>32,U1\n" 909 "\tldo\tAR>>32(U1),U1\n", }, 910 911 { OPLTYPE, INCREG, 912 SANY, TFLOAT, 913 SHFL, TFLOAT, 914 NCREG, RESC1, 915 "\tfldws\tAL,A1\n", }, 916 917 { OPLTYPE, INDREG, 918 SANY, TDOUBLE|TLDOUBLE, 919 SHDBL, TDOUBLE|TLDOUBLE, 920 NDREG, RESC1, 921 "\tfldds\tAL,A1\n", }, 922 923 /* 924 * Negate a word. 925 */ 926 { UMINUS, INLL, 927 SHLL, TLL, 928 SHLL, TLL, 929 NBREG|NBSL, RESC1, 930 "\tsub\t%r0,AL,A1\n" 931 "\tsubb\t%r0,UL,A1\n", }, 932 933 { UMINUS, ININT, 934 SHINT, TWORD, 935 SHINT, TWORD, 936 NAREG|NASL, RESC1, 937 "\tsub\t%r0,AL,A1\n", }, 938 939 { UMINUS, INFL, 940 SHFL, TFLOAT, 941 SHFL, TFLOAT, 942 NCREG|NCSL, RESC1, 943 "\tfsub,sgl\t%fr0,AL,A1\n", }, 944 945 { UMINUS, INDBL, 946 SHDBL, TDOUBLE|TLDOUBLE, 947 SHDBL, TDOUBLE|TLDOUBLE, 948 NDREG|NDSL, RESC1, 949 "\tfsub,dbl\t%fr0,AL,A1\n", }, 950 951 { COMPL, INLL, 952 SHLL, TLL, 953 SANY, TANY, 954 NBREG|NBSL, RESC1, 955 "\tuaddcm\t%r0,AL,A1\n" 956 "\tuaddcm\t%r0,UL,U1\n", }, 957 958 { COMPL, ININT, 959 SHINT, ANYFIXED, 960 SANY, TANY, 961 NAREG|NASL, RESC1, 962 "\tuaddcm\t%r0,AL,A1\n", }, 963 964 /* 965 * Arguments to functions. 966 */ 967 968 { STARG, FOREFF, 969 SAREG|SOREG|SNAME|SCON, TANY, 970 SANY, TSTRUCT, 971 NAREG | RNULL, 0, 972 "ZS", }, 973 974 /* 975 * struct field ops 976 */ 977 { FLD, ININT, 978 SHINT, TANY, 979 SFLD, ANYSIGNED, 980 NAREG|NASL, RESC1, 981 "\textrs\tAL,31-H,S,A1\n", }, 982 983 { FLD, ININT, 984 SHINT, TANY, 985 SFLD, ANYUSIGNED, 986 NAREG|NASL, RESC1, 987 "\textru\tAL,31-H,S,A1\n", }, 988 989 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 990 991 { UMUL, DF( UMUL ), }, 992 993 { ASSIGN, DF(ASSIGN), }, 994 995 { STASG, DF(STASG), }, 996 997 { FLD, DF(FLD), }, 998 999 { OPLEAF, DF(NAME), }, 1000 1001 /* { INIT, DF(INIT), }, */ 1002 1003 { OPUNARY, DF(UMINUS), }, 1004 1005 { OPANY, DF(BITYPE), }, 1006 1007 { FREE, FREE, 1008 FREE, FREE, 1009 FREE, FREE, 1010 FREE, FREE, 1011 "HELP; I'm in trouble\n" }, 1012 }; 1013 1014 int tablesize = sizeof(table)/sizeof(table[0]); 1015