1 /* Id: table.c,v 1.29 2011/06/05 08:54:42 plunky Exp */ 2 /* $NetBSD: table.c,v 1.1.1.3 2011/09/01 12:46:50 plunky Exp $ */ 3 4 /* 5 * Copyright (c) 2008 David Crawshaw <david@zentus.com> 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #include "pass2.h" 21 22 #define TS64 TLONG|TLONGLONG 23 #define TU64 TULONG|TULONGLONG|TPOINT 24 #define T64 TS64|TU64 25 26 struct optab table[] = { 27 28 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, /* empty */ 29 30 { PCONV, INAREG, 31 SAREG, T64|TINT, 32 SAREG, T64, 33 0, RLEFT, 34 " ! convert between word and pointer\n", }, 35 36 /* Conversions. */ 37 38 { SCONV, INAREG, 39 SAREG, T64|TUNSIGNED, 40 SAREG, TINT, 41 NAREG|NASL, RESC1, 42 " sra AL,0,A1 \t\t! (u)int64/32 -> (u)int32\n", }, 43 44 { SCONV, INAREG, 45 SAREG, T64|TINT|TUNSIGNED, 46 SAREG, TSHORT, 47 NAREG|NASL, RESC1, 48 " sll AL,16,A1 \t\t! (u)int64/32 -> int16\n" 49 " sra AL,16,A1\n" 50 " sra AL, 0,A1\n", }, 51 52 { SCONV, INAREG, 53 SAREG, T64|TINT|TUNSIGNED, 54 SAREG, TUSHORT, 55 NAREG|NASL, RESC1, 56 " sll AL,16,A1 \t\t! (u)int64/32 -> uint16\n" 57 " srl AL,16,A1\n", }, 58 59 { SCONV, INAREG, 60 SAREG, T64|TINT|TUNSIGNED|TSHORT|TUSHORT, 61 SAREG, TCHAR, 62 NAREG|NASL, RESC1, 63 " sll AL,24,A1 \t\t! (u)int64/32/16 -> int8\n" 64 " sra AL,24,A1\n" 65 " sra AL, 0,A1\n", }, 66 67 { SCONV, INAREG, 68 SAREG, T64|TINT|TUNSIGNED|TSHORT|TUSHORT, 69 SAREG, TUCHAR, 70 NAREG|NASL, RESC1, 71 " and AL,0xff,A1 \t\t! (u)int64/32/16 -> uint8\n", }, 72 73 { SCONV, INAREG, 74 SAREG, T64|TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, /* TCHAR|TUCHAR added to handle char -> long (among others) */ 75 SAREG, T64, 76 0, RLEFT, 77 " \t\t! (u)int64...8 -> (u)int64\n", }, 78 79 { SCONV, INAREG, 80 SAREG, TSHORT|TUSHORT|TCHAR|TUCHAR, 81 SAREG, TINT, 82 0, RLEFT, 83 " \t\t! (u)int16/8 -> int32\n", }, 84 85 { SCONV, INAREG, 86 SAREG, T64|TINT|TSHORT|TCHAR, 87 SAREG, TUNSIGNED, 88 0, RLEFT, 89 " srl AL, 0,A1 \t\t! int32/16/8 -> uint32\n", }, 90 91 { SCONV, INAREG, 92 SAREG, TUSHORT|TUCHAR, 93 SAREG, TUNSIGNED, 94 0, RLEFT, 95 " \t\t! uint16/8 -> uint32\n", }, 96 97 { SCONV, INBREG, 98 SBREG, TINT|TUNSIGNED, 99 SBREG, TFLOAT, 100 NBREG|NASL, RESC1, 101 " fitos AL,A1 \t\t! (u)int32 -> float\n", }, 102 103 { SCONV, INBREG, 104 SBREG, T64, 105 SBREG, TFLOAT, 106 NBREG|NASL, RESC1, 107 " fxtos AL,A1 \t\t! (u)int64 -> float\n", }, 108 109 { SCONV, INCREG, 110 SCREG, TINT|TUNSIGNED, 111 SCREG, TDOUBLE, 112 NCREG|NASL, RESC1, 113 " fitod AL,A1 \t\t! (u)int32 -> double\n", }, 114 115 { SCONV, INCREG, 116 SCREG, T64, 117 SCREG, TDOUBLE, 118 NCREG|NASL, RESC1, 119 " fxtod AL,A1 \t\t! (u)int64 -> double\n", }, 120 121 122 /* Floating-point conversions must be stored and loaded. */ 123 124 { SCONV, INAREG, 125 SOREG, TFLOAT, 126 SAREG, TINT, 127 NAREG|(2*NBREG), RESC1, 128 " ld [AL],A2 \t\t! float -> int32\n" 129 " nop\n" 130 " fmovs A2,A3\n" 131 " fstoi A2,A2\n" 132 " st A2,[AL]\n" 133 " nop\n" 134 " ld [AL],A1\n" 135 " nop\n" 136 " st A3,[AL]\n" 137 " nop\n", }, 138 139 { SCONV, INAREG, 140 SOREG, TDOUBLE, 141 SAREG, TINT, 142 NAREG|(2*NCREG), RESC1, 143 " ld [AL],A2 \t\t! double -> int32\n" 144 " nop\n" 145 " fmovd A2,A3\n" 146 " fdtoi A2,A2\n" 147 " std A2,[AL]\n" 148 " nop\n" 149 " ldd [AL],A1\n" 150 " nop\n" 151 " std A3,[AL]\n" 152 " nop\n", }, 153 154 { SCONV, INBREG, 155 SOREG, T64|TUNSIGNED, 156 SBREG, TFLOAT, 157 NBREG, RESC1, 158 " ld [AL],A1 \t\t! int64 -> float\n" 159 " fxtos A1,A1\n", }, 160 161 { SCONV, INBREG, 162 SOREG, TINT|TSHORT|TCHAR, 163 SBREG, TFLOAT, 164 NBREG, RESC1, 165 " ld [AL],A1 \t\t! int32/16/8 -> float\n" 166 " fitos A1,A1\n", }, // XXX need 'lds', 'ldh', etc 167 168 { SCONV, INCREG, 169 SOREG, T64|TUNSIGNED, 170 SCREG, TDOUBLE, 171 NCREG, RESC1, 172 " ldd [AL],A1 \t\t! (u)int64 -> double\n" 173 " fxtod A1,A1\n", }, 174 175 { SCONV, INCREG, 176 SOREG, TINT|TSHORT|TCHAR, 177 SCREG, TDOUBLE, 178 NCREG, RESC1, 179 " ld [AL],A1 \t\t! int32/16/8 -> double\n" 180 " fitod A1,A1\n", }, // XXX need 'lds' 'ldh' 'ld', etc. 181 182 { SCONV, INBREG, 183 SCREG, TDOUBLE, 184 SBREG, TFLOAT, 185 NBREG, RESC1, 186 " fdtos AL,A1 \t\t! double -> float\n",}, 187 188 { SCONV, INCREG, 189 SBREG, TFLOAT, 190 SCREG, TDOUBLE, 191 NCREG, RESC1, 192 " fstod AL,A1 \t\t! float -> double\n",}, 193 194 { SCONV, INAREG, 195 SBREG, TFLOAT, 196 SAREG, TINT, 197 NAREG|NBREG, RESC1, 198 " fstoi AL,A2 \t\t! float -> int\n" 199 " st A2,[%fp+2047]\n" 200 " nop\n" 201 " ld [%fp+2047],A1\n" 202 " nop\n",}, 203 204 { SCONV, INAREG, 205 SCREG, TDOUBLE, 206 SAREG, TINT, 207 NAREG|NCREG, RESC1, 208 " fdtoi AL,A2 \t\t! double -> int\n" 209 " st A2,[%fp+2047]\n" 210 " nop\n" 211 " ld [%fp+2047],A1\n" 212 " nop\n",}, 213 214 215 /* Multiplication and division */ 216 217 { MUL, INAREG, 218 SAREG, TANY, 219 SAREG, TANY, 220 NAREG|NASR|NASL, RESC1, 221 " mulx AL,AR,A1 ! multiply\n", }, 222 223 { MUL, INBREG, 224 SBREG, TFLOAT, 225 SBREG, TFLOAT, 226 NBREG|NBSR|NBSL, RESC1, 227 " fmuls AL,AR,A1 ! multiply float\n", }, 228 229 { MUL, INCREG, 230 SCREG, TDOUBLE, 231 SCREG, TDOUBLE, 232 NCREG|NCSR|NCSL, RESC1, 233 " fmuld AL,AR,A1 ! multiply double\n", }, 234 235 { DIV, INAREG, 236 SAREG, TUNSIGNED|TUSHORT|TUCHAR|TU64, 237 SAREG, TUNSIGNED|TUSHORT|TUCHAR|TU64, 238 NAREG|NASR|NASL, RESC1, 239 " udivx AL,AR,A1 ! unsigned division\n", }, 240 241 { DIV, INAREG, 242 SAREG, TINT|TSHORT|TCHAR|TS64, 243 SAREG, TINT|TSHORT|TCHAR|TS64, 244 NAREG|NASR|NASL, RESC1, 245 " sdivx AL,AR,A1 ! signed division\n", }, 246 247 { DIV, INBREG, 248 SBREG, TFLOAT, 249 SBREG, TFLOAT, 250 NBREG|NBSR|NBSL, RESC1, 251 " fdivs AL,AR,A1 ! divide float\n", }, 252 253 { DIV, INCREG, 254 SCREG, TDOUBLE, 255 SCREG, TDOUBLE, 256 NCREG|NCSR|NCSL, RESC1, 257 " fdivd AL,AR,A1 ! divide double\n", }, 258 259 { MOD, INAREG, 260 SAREG, TUNSIGNED|TUSHORT|TUCHAR|TU64, 261 SAREG, TUNSIGNED|TUSHORT|TUCHAR|TU64, 262 NAREG, RESC1, 263 " udivx AL,AR,A1 ! unsigned modulo\n" 264 " mulx A1,AR,A1\n" 265 " sub AL,A1,A1\n", }, 266 267 { MOD, INAREG, 268 SAREG, TINT|TSHORT|TCHAR|TS64, 269 SAREG, TINT|TSHORT|TCHAR|TS64, 270 NAREG, RESC1, 271 " sdivx AL,AR,A1 ! signed modulo\n" 272 " mulx A1,AR,A1\n" 273 " sub AL,A1,A1\n", }, 274 275 { PLUS, INAREG, 276 SAREG, TANY, 277 SAREG, TANY, 278 NAREG|NASL, RESC1, 279 " add AL,AR,A1\n", }, 280 281 { PLUS, INBREG, 282 SBREG, TFLOAT, 283 SBREG, TFLOAT, 284 NBREG|NBSL, RESC1, 285 " fadds AL,AR,A1\n", }, 286 287 { PLUS, INCREG, 288 SCREG, TDOUBLE, 289 SCREG, TDOUBLE, 290 NCREG|NCSL, RESC1, 291 " faddd AL,AR,A1\n", }, 292 293 { PLUS, INAREG, 294 SAREG, TANY, 295 SCON, TANY, 296 (3*NAREG), RESC1, 297 "ZA", }, 298 299 { MINUS, INAREG, 300 SAREG, TANY, 301 SAREG, TANY, 302 NAREG|NASL, RESC1, 303 " sub AL,AR,A1\n", }, 304 305 { MINUS, INBREG, 306 SBREG, TANY, 307 SBREG, TANY, 308 NBREG|NBSL|NBSR, RESC1, 309 " fsubs AL,AR,A1\n", }, 310 311 { MINUS, INCREG, 312 SCREG, TANY, 313 SCREG, TANY, 314 NCREG|NCSL|NBSR, RESC1, 315 " fsubd AL,AR,A1\n", }, 316 317 { MINUS, INAREG, 318 SAREG, TANY, 319 SCON, TANY, 320 (3*NAREG), RESC1, 321 "ZB", }, 322 323 { UMINUS, INAREG, 324 SAREG, TANY, 325 SANY, TANY, 326 NAREG|NASL, RESC1, 327 " sub %g0,AL,A1\n", }, 328 329 { UMINUS, INBREG, 330 SBREG, TANY, 331 SANY, TANY, 332 NBREG|NBSL, RESC1, 333 " fsubs %g0,AL,A1\n", }, 334 335 { UMINUS, INCREG, 336 SCREG, TANY, 337 SANY, TANY, 338 NCREG|NCSL, RESC1, 339 " fsubd %g0,AL,A1\n", }, 340 341 /* Shifts */ 342 343 { RS, INAREG, 344 SAREG, TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 345 SAREG|SCON, TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 346 NAREG|NASL, RESC1, 347 " srl AL,AR,A1 ! shift right\n", }, 348 349 { RS, INAREG, 350 SAREG, T64, 351 SAREG|SCON, T64|TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 352 NAREG|NASL, RESC1, 353 " srlx AL,AR,A1 ! shift right\n", }, 354 355 { LS, INAREG, 356 SAREG, TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 357 SAREG|SCON, TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 358 NAREG|NASL, RESC1, 359 " sll AL,AR,A1 ! shift left\n", }, 360 361 { LS, INAREG, 362 SAREG, T64, 363 SAREG|SCON, TINT|TUNSIGNED|TSHORT|TUSHORT|TCHAR|TUCHAR, 364 NAREG|NASL, RESC1, 365 " sllx AL,AR,A1 ! shift left\n", }, 366 367 { COMPL, INAREG, 368 SAREG, TANY, 369 SANY, TANY, 370 NAREG|NASL, RESC1, 371 " not AL,A1 ! complement\n", }, 372 373 /* Assignments */ 374 375 { ASSIGN, FOREFF|INAREG, /* FIXME: Remove [,] here and add them in adrput instead. */ 376 SAREG|SOREG, TINT|TUNSIGNED, 377 SAREG, TINT|TUNSIGNED, 378 0, RDEST, 379 " stw AR,[AL] ! store (u)int32\n" 380 " nop\n", }, 381 382 { ASSIGN, FOREFF|INAREG, 383 SOREG, TSHORT|TUSHORT, 384 SAREG, TSHORT|TUSHORT, 385 0, RDEST, 386 " sth AR,[AL] ! store (u)int16\n" 387 " nop\n", }, 388 389 { ASSIGN, FOREFF|INAREG, 390 SOREG, TCHAR|TUCHAR, 391 SAREG, TCHAR|TUCHAR, 392 0, RDEST, 393 " stb AR,[AL] ! store (u)int8\n" 394 " nop\n", }, 395 396 { ASSIGN, FOREFF|INAREG, 397 SOREG, T64, 398 SAREG, T64, 399 0, RDEST, 400 " stx AR,[AL] ! store (u)int64\n" 401 " nop\n", }, 402 403 { ASSIGN, FOREFF|INBREG, 404 SOREG, TFLOAT, 405 SBREG, TFLOAT, 406 0, RDEST, 407 " st AR,[AL] ! store float\n" 408 " nop\n", }, 409 410 { ASSIGN, FOREFF|INBREG, 411 SOREG, TINT, 412 SBREG, TINT, 413 0, RDEST, 414 " st AR,[AL] ! store int from fp address\n" 415 " nop\n", }, 416 417 { ASSIGN, FOREFF|INCREG, 418 SOREG, TDOUBLE, 419 SCREG, TDOUBLE, 420 0, RDEST, 421 " std AR,[AL] ! store double\n" 422 " nop\n", }, 423 424 { ASSIGN, FOREFF|INCREG, 425 SOREG, TINT, 426 SCREG, TINT, 427 0, RDEST, 428 " st AR,[AL] ! store int from fp address\n" 429 " nop\n", }, 430 431 432 { ASSIGN, FOREFF|INAREG, 433 SNAME, TINT|TUNSIGNED, 434 SAREG, TINT|TUNSIGNED, 435 NAREG, RDEST, 436 " sethi %h44(AL),A1 \t! store (u)int32 into sname\n" 437 " or A1,%m44(AL),A1\n" 438 " sllx A1,12,A1\n" 439 " stw AR,[A1+%l44(AL)]\n" 440 " nop\n", }, 441 442 { ASSIGN, FOREFF|INAREG, 443 SNAME, TSHORT|TUSHORT, 444 SAREG, TSHORT|TUSHORT, 445 NAREG, RDEST, 446 " sethi %h44(AL),A1 \t! store (u)int16 into sname\n" 447 " or A1,%m44(AL),A1\n" 448 " sllx A1,12,A1\n" 449 " sth AR,[A1+%l44(AL)]\n" 450 " nop\n", }, 451 452 { ASSIGN, FOREFF|INAREG, 453 SNAME, TCHAR|TUCHAR, 454 SAREG, TCHAR|TUCHAR, 455 NAREG, RDEST, 456 " sethi %h44(AL),A1 \t! store (u)int8 into sname\n" 457 " or A1,%m44(AL),A1\n" 458 " sllx A1,12,A1\n" 459 " stb AR,[A1+%l44(AL)]\n" 460 " nop\n", }, 461 462 { ASSIGN, FOREFF|INAREG, 463 SNAME, T64, 464 SAREG, T64, 465 NAREG, RDEST, 466 " sethi %h44(AL),A1 \t! store (u)int64 into sname\n" 467 " or A1,%m44(AL),A1\n" 468 " sllx A1,12,A1\n" 469 " stx AR,[A1+%l44(AL)]\n" 470 " nop\n", }, 471 472 { ASSIGN, FOREFF|INBREG, 473 SNAME, TFLOAT|TINT, 474 SBREG, TFLOAT|TINT, 475 NAREG, RDEST, 476 " sethi %h44(AL),A1 \t! store float into sname\n" 477 " or A1,%m44(AL),A1\n" 478 " sllx A1,12,A1\n" 479 " st AR,[A1+%l44(AL)]\n" 480 " nop\n", }, 481 482 { ASSIGN, FOREFF|INCREG, 483 SNAME, TDOUBLE, 484 SCREG, TDOUBLE, 485 NAREG, RDEST, 486 " sethi %h44(AL),A1 \t! store double into sname\n" 487 " or A1,%m44(AL),A1\n" 488 " sllx A1,12,A1\n" 489 " std AR,[A1+%l44(AL)]\n" 490 " nop\n", }, 491 492 { ASSIGN, FOREFF|INCREG, 493 SNAME, TINT, 494 SCREG, TINT, 495 NAREG, RDEST, 496 " sethi %h44(AL),A1 \t! store int into sname\n" 497 " or A1,%m44(AL),A1\n" 498 " sllx A1,12,A1\n" 499 " st AR,[A1+%l44(AL)]\n" 500 " nop\n", }, 501 502 { ASSIGN, FOREFF|INAREG, 503 SAREG, TANY, 504 SAREG, TANY, 505 0, RDEST, 506 " mov AR,AL ! register move\n", }, 507 508 { ASSIGN, FOREFF|INBREG, 509 SBREG, TANY, 510 SBREG, TANY, 511 0, RDEST, 512 " fmovs AR,AL ! move float\n", }, 513 514 { ASSIGN, FOREFF|INCREG, 515 SCREG, TANY, 516 SCREG, TANY, 517 0, RDEST, 518 " fmovd AR,AL ! move double\n", }, 519 520 /* Structure assignment. */ 521 522 { STASG, INAREG|FOREFF, 523 SOREG|SNAME, TANY, 524 SAREG, TPTRTO|TANY, 525 NSPECIAL, RDEST, 526 "ZQ", }, 527 528 /* Comparisons. */ 529 530 { EQ, FORCC, 531 SAREG, TANY, 532 SAREG, TANY, 533 0, RESCC, 534 " cmp AL,AR ! eq\n" 535 " be LC\n" 536 " nop\n", }, 537 538 { NE, FORCC, 539 SAREG, TANY, 540 SAREG, TANY, 541 0, RESCC, 542 " cmp AL,AR ! ne\n" 543 " bne LC\n" 544 " nop\n", }, 545 546 { OPLOG, FORCC, 547 SAREG, TANY, 548 SZERO, TANY, 549 0, RESCC, 550 " O AL,LC\n" 551 " nop\n", }, 552 553 { OPLOG, FORCC, 554 SAREG, TANY, 555 SAREG, TANY, 556 NAREG|NASL, RESCC, 557 " sub AL,AR,A1 ! oplog\n" 558 " O A1,LC\n" 559 " nop\n", }, 560 561 { OPLOG, FORCC, 562 SAREG, TANY, 563 SCCON, TANY, 564 NAREG|NASL, RESCC, 565 " sub AL,AR,A1 ! oplog sccon\n" 566 " O A1,LC\n" 567 " nop\n", }, 568 569 { OPLOG, FORCC, 570 SBREG, TFLOAT, 571 SBREG, TFLOAT, 572 NBREG, RESCC, 573 " fcmps AL,AR ! oplog float\n" 574 " ZF LC\n", }, 575 576 { OPLOG, FORCC, 577 SOREG, TFLOAT, 578 SBREG, TFLOAT, 579 NBREG, RESCC, 580 " ld [AL], A1 ! oplog float oreg\n" 581 " nop\n" 582 " fcmps A1,AR\n" 583 " ZF LC\n", }, 584 585 { OPLOG, FORCC, 586 SCREG, TDOUBLE, 587 SCREG, TDOUBLE, 588 NCREG, RESCC, 589 " fcmpd AL,AR ! oplog double\n" 590 " ZF LC\n", }, 591 592 { OPLOG, FORCC, 593 SOREG, TDOUBLE, 594 SCREG, TDOUBLE, 595 NCREG, RESCC, 596 " ldd [AL], A1 ! oplog double oreg\n" 597 " nop\n" 598 " fcmpd A1,AR\n" 599 " ZF LC\n", }, 600 601 602 /* Load constants to register. */ 603 604 { OPLTYPE, INAREG, 605 SCON, TANY, 606 SNAME, T64, 607 NAREG, RESC1, 608 " sethi %h44(AL),A1\t ! load const (u)int64 to reg\n" 609 " or A1,%m44(AL),A1\n" 610 " sllx A1,12,A1\n" 611 " ldx [A1+%l44(AL)],A1\n" 612 " nop\n", }, 613 { OPLTYPE, INAREG, 614 SCON, TANY, 615 SNAME, TINT, 616 NAREG, RESC1, 617 " sethi %h44(AL),A1\t ! load const int32 to reg\n" 618 " or A1,%m44(AL),A1\n" 619 " sllx A1,12,A1\n" 620 " ldsw [A1+%l44(AL)],A1\n" 621 " nop\n", }, 622 623 { OPLTYPE, INAREG, 624 SCON, TANY, 625 SNAME, TUNSIGNED, 626 NAREG, RESC1, 627 " sethi %h44(AL),A1\t! load const uint32 to reg\n" 628 " or A1,%m44(AL),A1\n" 629 " sllx A1,12,A1\n" 630 " lduw [A1+%l44(AL)],A1\n" 631 " nop\n", }, 632 { OPLTYPE, INAREG, 633 SCON, TANY, 634 SNAME, TSHORT, 635 NAREG, RESC1, 636 " sethi %h44(AL),A1\t! load const int16 to reg\n" 637 " or A1,%m44(AL),A1\n" 638 " sllx A1,12,A1\n" 639 " ldsh [A1+%l44(AL)],A1\n" 640 " nop\n", }, 641 { OPLTYPE, INAREG, 642 SCON, TANY, 643 SNAME, TUSHORT, 644 NAREG, RESC1, 645 " sethi %h44(AL),A1\t ! load const uint16 to reg\n" 646 " or A1,%m44(AL),A1\n" 647 " sllx A1,12,A1\n" 648 " lduh [A1+%l44(AL)],A1\n" 649 " nop\n", }, 650 { OPLTYPE, INAREG, 651 SCON, TANY, 652 SNAME, TCHAR, 653 NAREG, RESC1, 654 " sethi %h44(AL),A1\t\t! load const int8 to reg\n" 655 " or A1,%m44(AL),A1\n" 656 " sllx A1,12,A1\n" 657 " ldsb [A1+%l44(AL)],A1\n" 658 " nop\n", }, 659 { OPLTYPE, INAREG, 660 SCON, TANY, 661 SNAME, TUCHAR, 662 NAREG, RESC1, 663 " sethi %h44(AL),A1\t! load const uint8 to reg\n" 664 " or A1,%m44(AL),A1\n" 665 " sllx A1,12,A1\n" 666 " ldub [A1+%l44(AL)],A1\n" 667 " nop\n", }, 668 669 { OPLTYPE, INBREG, 670 SBREG, TANY, 671 SNAME, TANY, 672 NAREG|NBREG, RESC2, 673 " sethi %h44(AL),A1\t\t! load const to fp reg\n" 674 " or A1,%m44(AL),A1\n" 675 " sllx A1,12,A1\n" 676 " ld [A1+%l44(AL)],A2\n" 677 " nop\n", }, 678 679 { OPLTYPE, INCREG, 680 SCREG, TANY, 681 SNAME, TANY, 682 NAREG|NCREG, RESC2, 683 " sethi %h44(AL),A1\t\t! load const to fp reg\n" 684 " or A1,%m44(AL),A1\n" 685 " sllx A1,12,A1\n" 686 " ldd [A1+%l44(AL)],A2\n" 687 " nop\n", }, 688 689 { OPLTYPE, INAREG, 690 SANY, TANY, 691 SCON, TANY, 692 (2*NAREG), RESC1, 693 "ZC" }, 694 695 /* Convert LTYPE to reg. */ 696 697 { OPLTYPE, INAREG, 698 SAREG, TANY, 699 SOREG, TCHAR, 700 NAREG, RESC1, 701 " ldsb [AL],A1 ! load int8 to reg\n" 702 " nop\n", }, 703 704 { OPLTYPE, INAREG, 705 SAREG, TANY, 706 SOREG, TUCHAR, 707 NAREG, RESC1, 708 " ldub [AL],A1 ! load uint8 to reg\n" 709 " nop\n", }, 710 711 { OPLTYPE, INAREG, 712 SAREG, TANY, 713 SOREG, TSHORT, 714 NAREG, RESC1, 715 " ldsh [AL],A1 ! load int16 to reg\n" 716 " nop\n", }, 717 718 { OPLTYPE, INAREG, 719 SAREG, TANY, 720 SOREG, TUSHORT, 721 NAREG, RESC1, 722 " lduh [AL],A1 ! load uint16 to reg\n" 723 " nop\n", }, 724 725 { OPLTYPE, INAREG, 726 SAREG, TANY, 727 SOREG, TINT, 728 NAREG, RESC1, 729 " ldsw [AL],A1 ! load int32 to reg\n" 730 " nop\n", }, 731 732 { OPLTYPE, INAREG, 733 SAREG, TANY, 734 SOREG, TUNSIGNED, 735 NAREG, RESC1, 736 " lduw [AL],A1 ! load uint32 to reg\n" 737 " nop\n", }, 738 739 { OPLTYPE, INAREG, 740 SAREG, TANY, 741 SOREG, T64, 742 NAREG, RESC1, 743 " ldx [AL],A1 ! load (u)int64 to reg\n" 744 " nop\n", }, 745 746 { OPLTYPE, INAREG, 747 SANY, TANY, 748 SZERO, TANY, 749 NAREG, RESC1, 750 " mov \%g0,A1\t ! load 0 to reg\n", }, 751 752 { OPLTYPE, INBREG, 753 SBREG, TFLOAT, 754 SOREG, TFLOAT, 755 NBREG, RESC1, 756 " ld [AL],A1 ! load float to reg\n" 757 " nop\n", }, 758 759 { OPLTYPE, INCREG, 760 SCREG, TDOUBLE, 761 SOREG, TDOUBLE, 762 NCREG, RESC1, 763 " ldd [AL],A1 ! load double to reg\n" 764 " nop\n", }, 765 766 /* Jumps. */ 767 768 { GOTO, FOREFF, 769 SCON, TANY, 770 SANY, TANY, 771 0, RNOP, 772 " call LL ! goto LL\n" 773 " nop\n", }, 774 775 { UCALL, FOREFF, 776 SCON, TANY, 777 SANY, TANY, 778 0, 0, 779 " call CL ! void CL()\n" 780 " nop\n", }, 781 782 { UCALL, INAREG, 783 SCON, TANY, 784 SAREG, TANY, 785 NAREG, RESC1, 786 " call CL ! = CL()\n" 787 " nop\n", }, 788 789 { CALL, FOREFF, 790 SCON, TANY, 791 SANY, TANY, 792 0, 0, 793 " call CL ! void CL(constant)\n" 794 " nop\n", }, 795 796 { CALL, INAREG, 797 SCON, TANY, 798 SAREG, TANY, 799 NAREG, RESC1, 800 " call CL ! = CL(constant)\n" 801 " nop\n", }, 802 803 { CALL, INBREG, 804 SCON, TANY, 805 SBREG, TFLOAT, 806 NBREG, RESC1, 807 " call CL ! = CL(constant)\n" 808 " nop\n", }, 809 810 { CALL, INCREG, 811 SCON, TANY, 812 SCREG, TDOUBLE, 813 NCREG, RESC1, 814 " call CL ! = CL(constant)\n" 815 " nop\n", }, 816 817 { CALL, INAREG, 818 SAREG, TANY, 819 SAREG, TANY, 820 NAREG, RESC1, 821 " call AL ! = AL(args)\n" 822 " nop\n", }, 823 824 { CALL, FOREFF, 825 SAREG, TANY, 826 SANY, TANY, 827 0, 0, 828 " call AL ! void AL(args)\n" 829 " nop\n", }, 830 831 { UCALL, FOREFF, 832 SAREG, TANY, 833 SANY, TANY, 834 0, 0, 835 " call AL ! (*AL)()\n" 836 " nop\n", }, 837 838 { UCALL, INAREG, 839 SAREG, TANY, 840 SAREG, TANY, 841 NAREG, RESC1, 842 " call AL ! = (*AL)()\n" 843 " nop\n", }, 844 845 { CALL, INAREG, 846 SAREG, TANY, 847 SAREG, TANY, 848 NAREG, RESC1, 849 " call AL ! = (*AL)(args)\n" 850 " nop\n", }, 851 852 /* Function arguments. */ 853 854 { FUNARG, FOREFF, 855 SAREG, T64, 856 SANY, TANY, 857 0, 0, 858 " stx AL,[%sp+AR] \t! save func arg to stack\n" 859 " nop\n", }, 860 861 { FUNARG, FOREFF, 862 SAREG, TINT|TUNSIGNED, 863 SANY, TANY, 864 0, 0, 865 " stw AL,[%sp+AR] \t! save func arg to stack\n" 866 " nop\n", }, 867 868 { FUNARG, FOREFF, 869 SAREG, TSHORT|TUSHORT, 870 SANY, TANY, 871 0, 0, 872 " sth AL,[%sp+AR] \t! save func arg to stack\n" 873 " nop\n", }, 874 875 { FUNARG, FOREFF, 876 SAREG, TCHAR|TUCHAR, 877 SANY, TANY, 878 0, 0, 879 " stb AL,[%sp+AR] \t! save func arg to stack\n" 880 " nop\n", }, 881 882 { FUNARG, FOREFF, 883 SBREG, TFLOAT, 884 SANY, TANY, 885 0, 0, 886 " st AL,[%sp+AR] \t! save func arg to stack\n" 887 " nop\n", }, 888 889 { FUNARG, FOREFF, 890 SCREG, TDOUBLE, 891 SANY, TANY, 892 0, 0, 893 " std AL,[%sp+AR] \t! save func arg to stack\n" 894 " nop\n", }, 895 896 897 /* Indirection. */ 898 899 { OPSIMP, INAREG, 900 SAREG, TANY, 901 SAREG, TANY, 902 NAREG|NASR|NASL, RESC1, 903 " O AL,AR,A1\n", }, 904 905 { UMUL, INAREG, 906 SAREG, T64, 907 SOREG, T64, 908 NAREG, RESC1, 909 " ldx [AL],A1 ! (u)int64 load\n" 910 " nop\n", }, 911 { UMUL, INAREG, 912 SAREG, TINT, 913 SOREG, TINT, 914 NAREG, RESC1, 915 " ldsw [AL],A1 ! int32 load\n" 916 " nop\n", }, 917 { UMUL, INAREG, 918 SAREG, TUNSIGNED, 919 SOREG, TUNSIGNED, 920 NAREG, RESC1, 921 " lduw [AL],A1 ! uint32 load\n" 922 " nop\n", }, 923 { UMUL, INAREG, 924 SAREG, TCHAR, 925 SOREG, TCHAR, 926 NAREG, RESC1, 927 " ldsb [AL],A1 ! int8 load\n" 928 " nop\n", }, 929 { UMUL, INAREG, 930 SAREG, TUCHAR, 931 SOREG, TUCHAR, 932 NAREG, RESC1, 933 " ldub [AL],A1 ! uint8 load\n" 934 " nop\n", }, 935 { UMUL, INAREG, 936 SAREG, TSHORT, 937 SOREG, TSHORT, 938 NAREG, RESC1, 939 " ldsh [AL],A1 ! int16 load\n" 940 " nop\n", }, 941 { UMUL, INAREG, 942 SAREG, TUSHORT, 943 SOREG, TUSHORT, 944 NAREG, RESC1, 945 " lduh [AL],A1 ! uint16 load\n" 946 " nop\n", }, 947 948 { UMUL, INBREG, 949 SAREG, TFLOAT, 950 SOREG, TFLOAT, 951 NBREG, RESC1, 952 " ld [AL],A1 ! load float\n" 953 " nop\n", }, 954 955 { UMUL, INCREG, 956 SAREG, TDOUBLE, 957 SOREG, TDOUBLE, 958 NCREG, RESC1, 959 " ldd [AL],A1 ! load double\n" 960 " nop\n", }, 961 962 { FREE,FREE,FREE,FREE,FREE,FREE,FREE,FREE, "ERR: printing free op\n" }, 963 964 }; 965 966 int tablesize = sizeof(table)/sizeof(table[0]); 967