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