1 2 /*---------------------------------------------------------------*/ 3 /*--- begin Tilegx disassembler tilegx-disasm.h ---*/ 4 /*---------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright Tilera Corp. 2010-2013 11 12 This program is free software; you can redistribute it and/or 13 modify it under the terms of the GNU General Public License as 14 published by the Free Software Foundation; either version 2 of the 15 License, or (at your option) any later version. 16 17 This program is distributed in the hope that it will be useful, but 18 WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 General Public License for more details. 21 22 You should have received a copy of the GNU General Public License 23 along with this program; if not, write to the Free Software 24 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 25 02110-1301, USA. 26 27 The GNU General Public License is contained in the file COPYING. 28 */ 29 30 /* Contributed by Zhi-Gang Liu <zliu at tilera dot com> */ 31 32 #ifndef __TILEGX_DISASM_H 33 #define __TILEGX_DISASM_H 34 35 #include "libvex_basictypes.h" 36 37 typedef ULong tilegx_bundle_bits; 38 39 /* These are the bits that determine if a bundle is in the X encoding. */ 40 #define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62) 41 42 enum 43 { 44 /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ 45 TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3, 46 47 /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ 48 TILEGX_NUM_PIPELINE_ENCODINGS = 5, 49 50 /* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */ 51 TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3, 52 53 /* Instructions take this many bytes. */ 54 TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES, 55 56 /* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */ 57 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, 58 59 /* Bundles should be aligned modulo this number of bytes. */ 60 TILEGX_BUNDLE_ALIGNMENT_IN_BYTES = 61 (1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), 62 63 /* Number of registers (some are magic, such as network I/O). */ 64 TILEGX_NUM_REGISTERS = 64, 65 }; 66 67 /* Make a few "tile_" variables to simplify common code between 68 architectures. */ 69 70 typedef tilegx_bundle_bits tile_bundle_bits; 71 #define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES 72 #define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES 73 #define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ 74 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES 75 76 /* 64-bit pattern for a { bpt ; nop } bundle. */ 77 #define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL 78 79 static __inline UInt 80 get_BFEnd_X0(tilegx_bundle_bits num) 81 { 82 const UInt n = (UInt)num; 83 return (((n >> 12)) & 0x3f); 84 } 85 86 static __inline UInt 87 get_BFOpcodeExtension_X0(tilegx_bundle_bits num) 88 { 89 const UInt n = (UInt)num; 90 return (((n >> 24)) & 0xf); 91 } 92 93 static __inline UInt 94 get_BFStart_X0(tilegx_bundle_bits num) 95 { 96 const UInt n = (UInt)num; 97 return (((n >> 18)) & 0x3f); 98 } 99 100 static __inline UInt 101 get_BrOff_X1(tilegx_bundle_bits n) 102 { 103 return (((UInt)(n >> 31)) & 0x0000003f) | 104 (((UInt)(n >> 37)) & 0x0001ffc0); 105 } 106 107 static __inline UInt 108 get_BrType_X1(tilegx_bundle_bits n) 109 { 110 return (((UInt)(n >> 54)) & 0x1f); 111 } 112 113 static __inline UInt 114 get_Dest_Imm8_X1(tilegx_bundle_bits n) 115 { 116 return (((UInt)(n >> 31)) & 0x0000003f) | 117 (((UInt)(n >> 43)) & 0x000000c0); 118 } 119 120 static __inline UInt 121 get_Dest_X0(tilegx_bundle_bits num) 122 { 123 const UInt n = (UInt)num; 124 return (((n >> 0)) & 0x3f); 125 } 126 127 static __inline UInt 128 get_Dest_X1(tilegx_bundle_bits n) 129 { 130 return (((UInt)(n >> 31)) & 0x3f); 131 } 132 133 static __inline UInt 134 get_Dest_Y0(tilegx_bundle_bits num) 135 { 136 const UInt n = (UInt)num; 137 return (((n >> 0)) & 0x3f); 138 } 139 140 static __inline UInt 141 get_Dest_Y1(tilegx_bundle_bits n) 142 { 143 return (((UInt)(n >> 31)) & 0x3f); 144 } 145 146 static __inline UInt 147 get_Imm16_X0(tilegx_bundle_bits num) 148 { 149 const UInt n = (UInt)num; 150 return (((n >> 12)) & 0xffff); 151 } 152 153 static __inline UInt 154 get_Imm16_X1(tilegx_bundle_bits n) 155 { 156 return (((UInt)(n >> 43)) & 0xffff); 157 } 158 159 static __inline UInt 160 get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num) 161 { 162 const UInt n = (UInt)num; 163 return (((n >> 20)) & 0xff); 164 } 165 166 static __inline UInt 167 get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n) 168 { 169 return (((UInt)(n >> 51)) & 0xff); 170 } 171 172 static __inline UInt 173 get_Imm8_X0(tilegx_bundle_bits num) 174 { 175 const UInt n = (UInt)num; 176 return (((n >> 12)) & 0xff); 177 } 178 179 static __inline UInt 180 get_Imm8_X1(tilegx_bundle_bits n) 181 { 182 return (((UInt)(n >> 43)) & 0xff); 183 } 184 185 static __inline UInt 186 get_Imm8_Y0(tilegx_bundle_bits num) 187 { 188 const UInt n = (UInt)num; 189 return (((n >> 12)) & 0xff); 190 } 191 192 static __inline UInt 193 get_Imm8_Y1(tilegx_bundle_bits n) 194 { 195 return (((UInt)(n >> 43)) & 0xff); 196 } 197 198 static __inline UInt 199 get_JumpOff_X1(tilegx_bundle_bits n) 200 { 201 return (((UInt)(n >> 31)) & 0x7ffffff); 202 } 203 204 static __inline UInt 205 get_JumpOpcodeExtension_X1(tilegx_bundle_bits n) 206 { 207 return (((UInt)(n >> 58)) & 0x1); 208 } 209 210 static __inline UInt 211 get_MF_Imm14_X1(tilegx_bundle_bits n) 212 { 213 return (((UInt)(n >> 37)) & 0x3fff); 214 } 215 216 static __inline UInt 217 get_MT_Imm14_X1(tilegx_bundle_bits n) 218 { 219 return (((UInt)(n >> 31)) & 0x0000003f) | 220 (((UInt)(n >> 37)) & 0x00003fc0); 221 } 222 223 static __inline UInt 224 get_Mode(tilegx_bundle_bits n) 225 { 226 return (((UInt)(n >> 62)) & 0x3); 227 } 228 229 static __inline UInt 230 get_Opcode_X0(tilegx_bundle_bits num) 231 { 232 const UInt n = (UInt)num; 233 return (((n >> 28)) & 0x7); 234 } 235 236 static __inline UInt 237 get_Opcode_X1(tilegx_bundle_bits n) 238 { 239 return (((UInt)(n >> 59)) & 0x7); 240 } 241 242 static __inline UInt 243 get_Opcode_Y0(tilegx_bundle_bits num) 244 { 245 const UInt n = (UInt)num; 246 return (((n >> 27)) & 0xf); 247 } 248 249 static __inline UInt 250 get_Opcode_Y1(tilegx_bundle_bits n) 251 { 252 return (((UInt)(n >> 58)) & 0xf); 253 } 254 255 static __inline UInt 256 get_Opcode_Y2(tilegx_bundle_bits n) 257 { 258 return (((n >> 26)) & 0x00000001) | 259 (((UInt)(n >> 56)) & 0x00000002); 260 } 261 262 static __inline UInt 263 get_RRROpcodeExtension_X0(tilegx_bundle_bits num) 264 { 265 const UInt n = (UInt)num; 266 return (((n >> 18)) & 0x3ff); 267 } 268 269 static __inline UInt 270 get_RRROpcodeExtension_X1(tilegx_bundle_bits n) 271 { 272 return (((UInt)(n >> 49)) & 0x3ff); 273 } 274 275 static __inline UInt 276 get_RRROpcodeExtension_Y0(tilegx_bundle_bits num) 277 { 278 const UInt n = (UInt)num; 279 return (((n >> 18)) & 0x3); 280 } 281 282 static __inline UInt 283 get_RRROpcodeExtension_Y1(tilegx_bundle_bits n) 284 { 285 return (((UInt)(n >> 49)) & 0x3); 286 } 287 288 static __inline UInt 289 get_ShAmt_X0(tilegx_bundle_bits num) 290 { 291 const UInt n = (UInt)num; 292 return (((n >> 12)) & 0x3f); 293 } 294 295 static __inline UInt 296 get_ShAmt_X1(tilegx_bundle_bits n) 297 { 298 return (((UInt)(n >> 43)) & 0x3f); 299 } 300 301 static __inline UInt 302 get_ShAmt_Y0(tilegx_bundle_bits num) 303 { 304 const UInt n = (UInt)num; 305 return (((n >> 12)) & 0x3f); 306 } 307 308 static __inline UInt 309 get_ShAmt_Y1(tilegx_bundle_bits n) 310 { 311 return (((UInt)(n >> 43)) & 0x3f); 312 } 313 314 static __inline UInt 315 get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num) 316 { 317 const UInt n = (UInt)num; 318 return (((n >> 18)) & 0x3ff); 319 } 320 321 static __inline UInt 322 get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n) 323 { 324 return (((UInt)(n >> 49)) & 0x3ff); 325 } 326 327 static __inline UInt 328 get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num) 329 { 330 const UInt n = (UInt)num; 331 return (((n >> 18)) & 0x3); 332 } 333 334 static __inline UInt 335 get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n) 336 { 337 return (((UInt)(n >> 49)) & 0x3); 338 } 339 340 static __inline UInt 341 get_SrcA_X0(tilegx_bundle_bits num) 342 { 343 const UInt n = (UInt)num; 344 return (((n >> 6)) & 0x3f); 345 } 346 347 static __inline UInt 348 get_SrcA_X1(tilegx_bundle_bits n) 349 { 350 return (((UInt)(n >> 37)) & 0x3f); 351 } 352 353 static __inline UInt 354 get_SrcA_Y0(tilegx_bundle_bits num) 355 { 356 const UInt n = (UInt)num; 357 return (((n >> 6)) & 0x3f); 358 } 359 360 static __inline UInt 361 get_SrcA_Y1(tilegx_bundle_bits n) 362 { 363 return (((UInt)(n >> 37)) & 0x3f); 364 } 365 366 static __inline UInt 367 get_SrcA_Y2(tilegx_bundle_bits num) 368 { 369 const UInt n = (UInt)num; 370 return (((n >> 20)) & 0x3f); 371 } 372 373 static __inline UInt 374 get_SrcBDest_Y2(tilegx_bundle_bits n) 375 { 376 return (((UInt)(n >> 51)) & 0x3f); 377 } 378 379 static __inline UInt 380 get_SrcB_X0(tilegx_bundle_bits num) 381 { 382 const UInt n = (UInt)num; 383 return (((n >> 12)) & 0x3f); 384 } 385 386 static __inline UInt 387 get_SrcB_X1(tilegx_bundle_bits n) 388 { 389 return (((UInt)(n >> 43)) & 0x3f); 390 } 391 392 static __inline UInt 393 get_SrcB_Y0(tilegx_bundle_bits num) 394 { 395 const UInt n = (UInt)num; 396 return (((n >> 12)) & 0x3f); 397 } 398 399 static __inline UInt 400 get_SrcB_Y1(tilegx_bundle_bits n) 401 { 402 return (((UInt)(n >> 43)) & 0x3f); 403 } 404 405 static __inline UInt 406 get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num) 407 { 408 const UInt n = (UInt)num; 409 return (((n >> 12)) & 0x3f); 410 } 411 412 static __inline UInt 413 get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n) 414 { 415 return (((UInt)(n >> 43)) & 0x3f); 416 } 417 418 static __inline UInt 419 get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num) 420 { 421 const UInt n = (UInt)num; 422 return (((n >> 12)) & 0x3f); 423 } 424 425 static __inline UInt 426 get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n) 427 { 428 return (((UInt)(n >> 43)) & 0x3f); 429 } 430 431 432 static __inline int 433 sign_extend(int n, int num_bits) 434 { 435 int shift = (int)(sizeof(int) * 8 - num_bits); 436 return (n << shift) >> shift; 437 } 438 439 440 441 static __inline tilegx_bundle_bits 442 create_BFEnd_X0(int num) 443 { 444 const UInt n = (UInt)num; 445 return ((n & 0x3f) << 12); 446 } 447 448 static __inline tilegx_bundle_bits 449 create_BFOpcodeExtension_X0(int num) 450 { 451 const UInt n = (UInt)num; 452 return ((n & 0xf) << 24); 453 } 454 455 static __inline tilegx_bundle_bits 456 create_BFStart_X0(int num) 457 { 458 const UInt n = (UInt)num; 459 return ((n & 0x3f) << 18); 460 } 461 462 static __inline tilegx_bundle_bits 463 create_BrOff_X1(int num) 464 { 465 const UInt n = (UInt)num; 466 return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | 467 (((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37); 468 } 469 470 static __inline tilegx_bundle_bits 471 create_BrType_X1(int num) 472 { 473 const UInt n = (UInt)num; 474 return (((tilegx_bundle_bits)(n & 0x1f)) << 54); 475 } 476 477 static __inline tilegx_bundle_bits 478 create_Dest_Imm8_X1(int num) 479 { 480 const UInt n = (UInt)num; 481 return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | 482 (((tilegx_bundle_bits)(n & 0x000000c0)) << 43); 483 } 484 485 static __inline tilegx_bundle_bits 486 create_Dest_X0(int num) 487 { 488 const UInt n = (UInt)num; 489 return ((n & 0x3f) << 0); 490 } 491 492 static __inline tilegx_bundle_bits 493 create_Dest_X1(int num) 494 { 495 const UInt n = (UInt)num; 496 return (((tilegx_bundle_bits)(n & 0x3f)) << 31); 497 } 498 499 static __inline tilegx_bundle_bits 500 create_Dest_Y0(int num) 501 { 502 const UInt n = (UInt)num; 503 return ((n & 0x3f) << 0); 504 } 505 506 static __inline tilegx_bundle_bits 507 create_Dest_Y1(int num) 508 { 509 const UInt n = (UInt)num; 510 return (((tilegx_bundle_bits)(n & 0x3f)) << 31); 511 } 512 513 static __inline tilegx_bundle_bits 514 create_Imm16_X0(int num) 515 { 516 const UInt n = (UInt)num; 517 return ((n & 0xffff) << 12); 518 } 519 520 static __inline tilegx_bundle_bits 521 create_Imm16_X1(int num) 522 { 523 const UInt n = (UInt)num; 524 return (((tilegx_bundle_bits)(n & 0xffff)) << 43); 525 } 526 527 static __inline tilegx_bundle_bits 528 create_Imm8OpcodeExtension_X0(int num) 529 { 530 const UInt n = (UInt)num; 531 return ((n & 0xff) << 20); 532 } 533 534 static __inline tilegx_bundle_bits 535 create_Imm8OpcodeExtension_X1(int num) 536 { 537 const UInt n = (UInt)num; 538 return (((tilegx_bundle_bits)(n & 0xff)) << 51); 539 } 540 541 static __inline tilegx_bundle_bits 542 create_Imm8_X0(int num) 543 { 544 const UInt n = (UInt)num; 545 return ((n & 0xff) << 12); 546 } 547 548 static __inline tilegx_bundle_bits 549 create_Imm8_X1(int num) 550 { 551 const UInt n = (UInt)num; 552 return (((tilegx_bundle_bits)(n & 0xff)) << 43); 553 } 554 555 static __inline tilegx_bundle_bits 556 create_Imm8_Y0(int num) 557 { 558 const UInt n = (UInt)num; 559 return ((n & 0xff) << 12); 560 } 561 562 static __inline tilegx_bundle_bits 563 create_Imm8_Y1(int num) 564 { 565 const UInt n = (UInt)num; 566 return (((tilegx_bundle_bits)(n & 0xff)) << 43); 567 } 568 569 static __inline tilegx_bundle_bits 570 create_JumpOff_X1(int num) 571 { 572 const UInt n = (UInt)num; 573 return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31); 574 } 575 576 static __inline tilegx_bundle_bits 577 create_JumpOpcodeExtension_X1(int num) 578 { 579 const UInt n = (UInt)num; 580 return (((tilegx_bundle_bits)(n & 0x1)) << 58); 581 } 582 583 static __inline tilegx_bundle_bits 584 create_MF_Imm14_X1(int num) 585 { 586 const UInt n = (UInt)num; 587 return (((tilegx_bundle_bits)(n & 0x3fff)) << 37); 588 } 589 590 static __inline tilegx_bundle_bits 591 create_MT_Imm14_X1(int num) 592 { 593 const UInt n = (UInt)num; 594 return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | 595 (((tilegx_bundle_bits)(n & 0x00003fc0)) << 37); 596 } 597 598 static __inline tilegx_bundle_bits 599 create_Mode(int num) 600 { 601 const UInt n = (UInt)num; 602 return (((tilegx_bundle_bits)(n & 0x3)) << 62); 603 } 604 605 static __inline tilegx_bundle_bits 606 create_Opcode_X0(int num) 607 { 608 const UInt n = (UInt)num; 609 return ((n & 0x7) << 28); 610 } 611 612 static __inline tilegx_bundle_bits 613 create_Opcode_X1(int num) 614 { 615 const UInt n = (UInt)num; 616 return (((tilegx_bundle_bits)(n & 0x7)) << 59); 617 } 618 619 static __inline tilegx_bundle_bits 620 create_Opcode_Y0(int num) 621 { 622 const UInt n = (UInt)num; 623 return ((n & 0xf) << 27); 624 } 625 626 static __inline tilegx_bundle_bits 627 create_Opcode_Y1(int num) 628 { 629 const UInt n = (UInt)num; 630 return (((tilegx_bundle_bits)(n & 0xf)) << 58); 631 } 632 633 static __inline tilegx_bundle_bits 634 create_Opcode_Y2(int num) 635 { 636 const UInt n = (UInt)num; 637 return ((n & 0x00000001) << 26) | 638 (((tilegx_bundle_bits)(n & 0x00000002)) << 56); 639 } 640 641 static __inline tilegx_bundle_bits 642 create_RRROpcodeExtension_X0(int num) 643 { 644 const UInt n = (UInt)num; 645 return ((n & 0x3ff) << 18); 646 } 647 648 static __inline tilegx_bundle_bits 649 create_RRROpcodeExtension_X1(int num) 650 { 651 const UInt n = (UInt)num; 652 return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); 653 } 654 655 static __inline tilegx_bundle_bits 656 create_RRROpcodeExtension_Y0(int num) 657 { 658 const UInt n = (UInt)num; 659 return ((n & 0x3) << 18); 660 } 661 662 static __inline tilegx_bundle_bits 663 create_RRROpcodeExtension_Y1(int num) 664 { 665 const UInt n = (UInt)num; 666 return (((tilegx_bundle_bits)(n & 0x3)) << 49); 667 } 668 669 static __inline tilegx_bundle_bits 670 create_ShAmt_X0(int num) 671 { 672 const UInt n = (UInt)num; 673 return ((n & 0x3f) << 12); 674 } 675 676 static __inline tilegx_bundle_bits 677 create_ShAmt_X1(int num) 678 { 679 const UInt n = (UInt)num; 680 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 681 } 682 683 static __inline tilegx_bundle_bits 684 create_ShAmt_Y0(int num) 685 { 686 const UInt n = (UInt)num; 687 return ((n & 0x3f) << 12); 688 } 689 690 static __inline tilegx_bundle_bits 691 create_ShAmt_Y1(int num) 692 { 693 const UInt n = (UInt)num; 694 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 695 } 696 697 static __inline tilegx_bundle_bits 698 create_ShiftOpcodeExtension_X0(int num) 699 { 700 const UInt n = (UInt)num; 701 return ((n & 0x3ff) << 18); 702 } 703 704 static __inline tilegx_bundle_bits 705 create_ShiftOpcodeExtension_X1(int num) 706 { 707 const UInt n = (UInt)num; 708 return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); 709 } 710 711 static __inline tilegx_bundle_bits 712 create_ShiftOpcodeExtension_Y0(int num) 713 { 714 const UInt n = (UInt)num; 715 return ((n & 0x3) << 18); 716 } 717 718 static __inline tilegx_bundle_bits 719 create_ShiftOpcodeExtension_Y1(int num) 720 { 721 const UInt n = (UInt)num; 722 return (((tilegx_bundle_bits)(n & 0x3)) << 49); 723 } 724 725 static __inline tilegx_bundle_bits 726 create_SrcA_X0(int num) 727 { 728 const UInt n = (UInt)num; 729 return ((n & 0x3f) << 6); 730 } 731 732 static __inline tilegx_bundle_bits 733 create_SrcA_X1(int num) 734 { 735 const UInt n = (UInt)num; 736 return (((tilegx_bundle_bits)(n & 0x3f)) << 37); 737 } 738 739 static __inline tilegx_bundle_bits 740 create_SrcA_Y0(int num) 741 { 742 const UInt n = (UInt)num; 743 return ((n & 0x3f) << 6); 744 } 745 746 static __inline tilegx_bundle_bits 747 create_SrcA_Y1(int num) 748 { 749 const UInt n = (UInt)num; 750 return (((tilegx_bundle_bits)(n & 0x3f)) << 37); 751 } 752 753 static __inline tilegx_bundle_bits 754 create_SrcA_Y2(int num) 755 { 756 const UInt n = (UInt)num; 757 return ((n & 0x3f) << 20); 758 } 759 760 static __inline tilegx_bundle_bits 761 create_SrcBDest_Y2(int num) 762 { 763 const UInt n = (UInt)num; 764 return (((tilegx_bundle_bits)(n & 0x3f)) << 51); 765 } 766 767 static __inline tilegx_bundle_bits 768 create_SrcB_X0(int num) 769 { 770 const UInt n = (UInt)num; 771 return ((n & 0x3f) << 12); 772 } 773 774 static __inline tilegx_bundle_bits 775 create_SrcB_X1(int num) 776 { 777 const UInt n = (UInt)num; 778 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 779 } 780 781 static __inline tilegx_bundle_bits 782 create_SrcB_Y0(int num) 783 { 784 const UInt n = (UInt)num; 785 return ((n & 0x3f) << 12); 786 } 787 788 static __inline tilegx_bundle_bits 789 create_SrcB_Y1(int num) 790 { 791 const UInt n = (UInt)num; 792 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 793 } 794 795 static __inline tilegx_bundle_bits 796 create_UnaryOpcodeExtension_X0(int num) 797 { 798 const UInt n = (UInt)num; 799 return ((n & 0x3f) << 12); 800 } 801 802 static __inline tilegx_bundle_bits 803 create_UnaryOpcodeExtension_X1(int num) 804 { 805 const UInt n = (UInt)num; 806 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 807 } 808 809 static __inline tilegx_bundle_bits 810 create_UnaryOpcodeExtension_Y0(int num) 811 { 812 const UInt n = (UInt)num; 813 return ((n & 0x3f) << 12); 814 } 815 816 static __inline tilegx_bundle_bits 817 create_UnaryOpcodeExtension_Y1(int num) 818 { 819 const UInt n = (UInt)num; 820 return (((tilegx_bundle_bits)(n & 0x3f)) << 43); 821 } 822 823 enum 824 { 825 TILEGX_MAX_OPERANDS = 4 /* bfexts */ 826 }; 827 828 typedef enum 829 { 830 TILEGX_OPC_BPT, 831 TILEGX_OPC_INFO, 832 TILEGX_OPC_INFOL, 833 TILEGX_OPC_LD4S_TLS, 834 TILEGX_OPC_LD_TLS, 835 TILEGX_OPC_MOVE, 836 TILEGX_OPC_MOVEI, 837 TILEGX_OPC_MOVELI, 838 TILEGX_OPC_PREFETCH, 839 TILEGX_OPC_PREFETCH_ADD_L1, 840 TILEGX_OPC_PREFETCH_ADD_L1_FAULT, 841 TILEGX_OPC_PREFETCH_ADD_L2, 842 TILEGX_OPC_PREFETCH_ADD_L2_FAULT, 843 TILEGX_OPC_PREFETCH_ADD_L3, 844 TILEGX_OPC_PREFETCH_ADD_L3_FAULT, 845 TILEGX_OPC_PREFETCH_L1, 846 TILEGX_OPC_PREFETCH_L1_FAULT, 847 TILEGX_OPC_PREFETCH_L2, 848 TILEGX_OPC_PREFETCH_L2_FAULT, 849 TILEGX_OPC_PREFETCH_L3, 850 TILEGX_OPC_PREFETCH_L3_FAULT, 851 TILEGX_OPC_RAISE, 852 TILEGX_OPC_ADD, 853 TILEGX_OPC_ADDI, 854 TILEGX_OPC_ADDLI, 855 TILEGX_OPC_ADDX, 856 TILEGX_OPC_ADDXI, 857 TILEGX_OPC_ADDXLI, 858 TILEGX_OPC_ADDXSC, 859 TILEGX_OPC_AND, 860 TILEGX_OPC_ANDI, 861 TILEGX_OPC_BEQZ, 862 TILEGX_OPC_BEQZT, 863 TILEGX_OPC_BFEXTS, 864 TILEGX_OPC_BFEXTU, 865 TILEGX_OPC_BFINS, 866 TILEGX_OPC_BGEZ, 867 TILEGX_OPC_BGEZT, 868 TILEGX_OPC_BGTZ, 869 TILEGX_OPC_BGTZT, 870 TILEGX_OPC_BLBC, 871 TILEGX_OPC_BLBCT, 872 TILEGX_OPC_BLBS, 873 TILEGX_OPC_BLBST, 874 TILEGX_OPC_BLEZ, 875 TILEGX_OPC_BLEZT, 876 TILEGX_OPC_BLTZ, 877 TILEGX_OPC_BLTZT, 878 TILEGX_OPC_BNEZ, 879 TILEGX_OPC_BNEZT, 880 TILEGX_OPC_CLZ, 881 TILEGX_OPC_CMOVEQZ, 882 TILEGX_OPC_CMOVNEZ, 883 TILEGX_OPC_CMPEQ, 884 TILEGX_OPC_CMPEQI, 885 TILEGX_OPC_CMPEXCH, 886 TILEGX_OPC_CMPEXCH4, 887 TILEGX_OPC_CMPLES, 888 TILEGX_OPC_CMPLEU, 889 TILEGX_OPC_CMPLTS, 890 TILEGX_OPC_CMPLTSI, 891 TILEGX_OPC_CMPLTU, 892 TILEGX_OPC_CMPLTUI, 893 TILEGX_OPC_CMPNE, 894 TILEGX_OPC_CMUL, 895 TILEGX_OPC_CMULA, 896 TILEGX_OPC_CMULAF, 897 TILEGX_OPC_CMULF, 898 TILEGX_OPC_CMULFR, 899 TILEGX_OPC_CMULH, 900 TILEGX_OPC_CMULHR, 901 TILEGX_OPC_CRC32_32, 902 TILEGX_OPC_CRC32_8, 903 TILEGX_OPC_CTZ, 904 TILEGX_OPC_DBLALIGN, 905 TILEGX_OPC_DBLALIGN2, 906 TILEGX_OPC_DBLALIGN4, 907 TILEGX_OPC_DBLALIGN6, 908 TILEGX_OPC_DRAIN, 909 TILEGX_OPC_DTLBPR, 910 TILEGX_OPC_EXCH, 911 TILEGX_OPC_EXCH4, 912 TILEGX_OPC_FDOUBLE_ADD_FLAGS, 913 TILEGX_OPC_FDOUBLE_ADDSUB, 914 TILEGX_OPC_FDOUBLE_MUL_FLAGS, 915 TILEGX_OPC_FDOUBLE_PACK1, 916 TILEGX_OPC_FDOUBLE_PACK2, 917 TILEGX_OPC_FDOUBLE_SUB_FLAGS, 918 TILEGX_OPC_FDOUBLE_UNPACK_MAX, 919 TILEGX_OPC_FDOUBLE_UNPACK_MIN, 920 TILEGX_OPC_FETCHADD, 921 TILEGX_OPC_FETCHADD4, 922 TILEGX_OPC_FETCHADDGEZ, 923 TILEGX_OPC_FETCHADDGEZ4, 924 TILEGX_OPC_FETCHAND, 925 TILEGX_OPC_FETCHAND4, 926 TILEGX_OPC_FETCHOR, 927 TILEGX_OPC_FETCHOR4, 928 TILEGX_OPC_FINV, 929 TILEGX_OPC_FLUSH, 930 TILEGX_OPC_FLUSHWB, 931 TILEGX_OPC_FNOP, 932 TILEGX_OPC_FSINGLE_ADD1, 933 TILEGX_OPC_FSINGLE_ADDSUB2, 934 TILEGX_OPC_FSINGLE_MUL1, 935 TILEGX_OPC_FSINGLE_MUL2, 936 TILEGX_OPC_FSINGLE_PACK1, 937 TILEGX_OPC_FSINGLE_PACK2, 938 TILEGX_OPC_FSINGLE_SUB1, 939 TILEGX_OPC_ICOH, 940 TILEGX_OPC_ILL, 941 TILEGX_OPC_INV, 942 TILEGX_OPC_IRET, 943 TILEGX_OPC_J, 944 TILEGX_OPC_JAL, 945 TILEGX_OPC_JALR, 946 TILEGX_OPC_JALRP, 947 TILEGX_OPC_JR, 948 TILEGX_OPC_JRP, 949 TILEGX_OPC_LD, 950 TILEGX_OPC_LD1S, 951 TILEGX_OPC_LD1S_ADD, 952 TILEGX_OPC_LD1U, 953 TILEGX_OPC_LD1U_ADD, 954 TILEGX_OPC_LD2S, 955 TILEGX_OPC_LD2S_ADD, 956 TILEGX_OPC_LD2U, 957 TILEGX_OPC_LD2U_ADD, 958 TILEGX_OPC_LD4S, 959 TILEGX_OPC_LD4S_ADD, 960 TILEGX_OPC_LD4U, 961 TILEGX_OPC_LD4U_ADD, 962 TILEGX_OPC_LD_ADD, 963 TILEGX_OPC_LDNA, 964 TILEGX_OPC_LDNA_ADD, 965 TILEGX_OPC_LDNT, 966 TILEGX_OPC_LDNT1S, 967 TILEGX_OPC_LDNT1S_ADD, 968 TILEGX_OPC_LDNT1U, 969 TILEGX_OPC_LDNT1U_ADD, 970 TILEGX_OPC_LDNT2S, 971 TILEGX_OPC_LDNT2S_ADD, 972 TILEGX_OPC_LDNT2U, 973 TILEGX_OPC_LDNT2U_ADD, 974 TILEGX_OPC_LDNT4S, 975 TILEGX_OPC_LDNT4S_ADD, 976 TILEGX_OPC_LDNT4U, 977 TILEGX_OPC_LDNT4U_ADD, 978 TILEGX_OPC_LDNT_ADD, 979 TILEGX_OPC_LNK, 980 TILEGX_OPC_MF, 981 TILEGX_OPC_MFSPR, 982 TILEGX_OPC_MM, 983 TILEGX_OPC_MNZ, 984 TILEGX_OPC_MTSPR, 985 TILEGX_OPC_MUL_HS_HS, 986 TILEGX_OPC_MUL_HS_HU, 987 TILEGX_OPC_MUL_HS_LS, 988 TILEGX_OPC_MUL_HS_LU, 989 TILEGX_OPC_MUL_HU_HU, 990 TILEGX_OPC_MUL_HU_LS, 991 TILEGX_OPC_MUL_HU_LU, 992 TILEGX_OPC_MUL_LS_LS, 993 TILEGX_OPC_MUL_LS_LU, 994 TILEGX_OPC_MUL_LU_LU, 995 TILEGX_OPC_MULA_HS_HS, 996 TILEGX_OPC_MULA_HS_HU, 997 TILEGX_OPC_MULA_HS_LS, 998 TILEGX_OPC_MULA_HS_LU, 999 TILEGX_OPC_MULA_HU_HU, 1000 TILEGX_OPC_MULA_HU_LS, 1001 TILEGX_OPC_MULA_HU_LU, 1002 TILEGX_OPC_MULA_LS_LS, 1003 TILEGX_OPC_MULA_LS_LU, 1004 TILEGX_OPC_MULA_LU_LU, 1005 TILEGX_OPC_MULAX, 1006 TILEGX_OPC_MULX, 1007 TILEGX_OPC_MZ, 1008 TILEGX_OPC_NAP, 1009 TILEGX_OPC_NOP, 1010 TILEGX_OPC_NOR, 1011 TILEGX_OPC_OR, 1012 TILEGX_OPC_ORI, 1013 TILEGX_OPC_PCNT, 1014 TILEGX_OPC_REVBITS, 1015 TILEGX_OPC_REVBYTES, 1016 TILEGX_OPC_ROTL, 1017 TILEGX_OPC_ROTLI, 1018 TILEGX_OPC_SHL, 1019 TILEGX_OPC_SHL16INSLI, 1020 TILEGX_OPC_SHL1ADD, 1021 TILEGX_OPC_SHL1ADDX, 1022 TILEGX_OPC_SHL2ADD, 1023 TILEGX_OPC_SHL2ADDX, 1024 TILEGX_OPC_SHL3ADD, 1025 TILEGX_OPC_SHL3ADDX, 1026 TILEGX_OPC_SHLI, 1027 TILEGX_OPC_SHLX, 1028 TILEGX_OPC_SHLXI, 1029 TILEGX_OPC_SHRS, 1030 TILEGX_OPC_SHRSI, 1031 TILEGX_OPC_SHRU, 1032 TILEGX_OPC_SHRUI, 1033 TILEGX_OPC_SHRUX, 1034 TILEGX_OPC_SHRUXI, 1035 TILEGX_OPC_SHUFFLEBYTES, 1036 TILEGX_OPC_ST, 1037 TILEGX_OPC_ST1, 1038 TILEGX_OPC_ST1_ADD, 1039 TILEGX_OPC_ST2, 1040 TILEGX_OPC_ST2_ADD, 1041 TILEGX_OPC_ST4, 1042 TILEGX_OPC_ST4_ADD, 1043 TILEGX_OPC_ST_ADD, 1044 TILEGX_OPC_STNT, 1045 TILEGX_OPC_STNT1, 1046 TILEGX_OPC_STNT1_ADD, 1047 TILEGX_OPC_STNT2, 1048 TILEGX_OPC_STNT2_ADD, 1049 TILEGX_OPC_STNT4, 1050 TILEGX_OPC_STNT4_ADD, 1051 TILEGX_OPC_STNT_ADD, 1052 TILEGX_OPC_SUB, 1053 TILEGX_OPC_SUBX, 1054 TILEGX_OPC_SUBXSC, 1055 TILEGX_OPC_SWINT0, 1056 TILEGX_OPC_SWINT1, 1057 TILEGX_OPC_SWINT2, 1058 TILEGX_OPC_SWINT3, 1059 TILEGX_OPC_TBLIDXB0, 1060 TILEGX_OPC_TBLIDXB1, 1061 TILEGX_OPC_TBLIDXB2, 1062 TILEGX_OPC_TBLIDXB3, 1063 TILEGX_OPC_V1ADD, 1064 TILEGX_OPC_V1ADDI, 1065 TILEGX_OPC_V1ADDUC, 1066 TILEGX_OPC_V1ADIFFU, 1067 TILEGX_OPC_V1AVGU, 1068 TILEGX_OPC_V1CMPEQ, 1069 TILEGX_OPC_V1CMPEQI, 1070 TILEGX_OPC_V1CMPLES, 1071 TILEGX_OPC_V1CMPLEU, 1072 TILEGX_OPC_V1CMPLTS, 1073 TILEGX_OPC_V1CMPLTSI, 1074 TILEGX_OPC_V1CMPLTU, 1075 TILEGX_OPC_V1CMPLTUI, 1076 TILEGX_OPC_V1CMPNE, 1077 TILEGX_OPC_V1DDOTPU, 1078 TILEGX_OPC_V1DDOTPUA, 1079 TILEGX_OPC_V1DDOTPUS, 1080 TILEGX_OPC_V1DDOTPUSA, 1081 TILEGX_OPC_V1DOTP, 1082 TILEGX_OPC_V1DOTPA, 1083 TILEGX_OPC_V1DOTPU, 1084 TILEGX_OPC_V1DOTPUA, 1085 TILEGX_OPC_V1DOTPUS, 1086 TILEGX_OPC_V1DOTPUSA, 1087 TILEGX_OPC_V1INT_H, 1088 TILEGX_OPC_V1INT_L, 1089 TILEGX_OPC_V1MAXU, 1090 TILEGX_OPC_V1MAXUI, 1091 TILEGX_OPC_V1MINU, 1092 TILEGX_OPC_V1MINUI, 1093 TILEGX_OPC_V1MNZ, 1094 TILEGX_OPC_V1MULTU, 1095 TILEGX_OPC_V1MULU, 1096 TILEGX_OPC_V1MULUS, 1097 TILEGX_OPC_V1MZ, 1098 TILEGX_OPC_V1SADAU, 1099 TILEGX_OPC_V1SADU, 1100 TILEGX_OPC_V1SHL, 1101 TILEGX_OPC_V1SHLI, 1102 TILEGX_OPC_V1SHRS, 1103 TILEGX_OPC_V1SHRSI, 1104 TILEGX_OPC_V1SHRU, 1105 TILEGX_OPC_V1SHRUI, 1106 TILEGX_OPC_V1SUB, 1107 TILEGX_OPC_V1SUBUC, 1108 TILEGX_OPC_V2ADD, 1109 TILEGX_OPC_V2ADDI, 1110 TILEGX_OPC_V2ADDSC, 1111 TILEGX_OPC_V2ADIFFS, 1112 TILEGX_OPC_V2AVGS, 1113 TILEGX_OPC_V2CMPEQ, 1114 TILEGX_OPC_V2CMPEQI, 1115 TILEGX_OPC_V2CMPLES, 1116 TILEGX_OPC_V2CMPLEU, 1117 TILEGX_OPC_V2CMPLTS, 1118 TILEGX_OPC_V2CMPLTSI, 1119 TILEGX_OPC_V2CMPLTU, 1120 TILEGX_OPC_V2CMPLTUI, 1121 TILEGX_OPC_V2CMPNE, 1122 TILEGX_OPC_V2DOTP, 1123 TILEGX_OPC_V2DOTPA, 1124 TILEGX_OPC_V2INT_H, 1125 TILEGX_OPC_V2INT_L, 1126 TILEGX_OPC_V2MAXS, 1127 TILEGX_OPC_V2MAXSI, 1128 TILEGX_OPC_V2MINS, 1129 TILEGX_OPC_V2MINSI, 1130 TILEGX_OPC_V2MNZ, 1131 TILEGX_OPC_V2MULFSC, 1132 TILEGX_OPC_V2MULS, 1133 TILEGX_OPC_V2MULTS, 1134 TILEGX_OPC_V2MZ, 1135 TILEGX_OPC_V2PACKH, 1136 TILEGX_OPC_V2PACKL, 1137 TILEGX_OPC_V2PACKUC, 1138 TILEGX_OPC_V2SADAS, 1139 TILEGX_OPC_V2SADAU, 1140 TILEGX_OPC_V2SADS, 1141 TILEGX_OPC_V2SADU, 1142 TILEGX_OPC_V2SHL, 1143 TILEGX_OPC_V2SHLI, 1144 TILEGX_OPC_V2SHLSC, 1145 TILEGX_OPC_V2SHRS, 1146 TILEGX_OPC_V2SHRSI, 1147 TILEGX_OPC_V2SHRU, 1148 TILEGX_OPC_V2SHRUI, 1149 TILEGX_OPC_V2SUB, 1150 TILEGX_OPC_V2SUBSC, 1151 TILEGX_OPC_V4ADD, 1152 TILEGX_OPC_V4ADDSC, 1153 TILEGX_OPC_V4INT_H, 1154 TILEGX_OPC_V4INT_L, 1155 TILEGX_OPC_V4PACKSC, 1156 TILEGX_OPC_V4SHL, 1157 TILEGX_OPC_V4SHLSC, 1158 TILEGX_OPC_V4SHRS, 1159 TILEGX_OPC_V4SHRU, 1160 TILEGX_OPC_V4SUB, 1161 TILEGX_OPC_V4SUBSC, 1162 TILEGX_OPC_WH64, 1163 TILEGX_OPC_XOR, 1164 TILEGX_OPC_XORI, 1165 TILEGX_OPC_NONE 1166 } tilegx_mnemonic; 1167 1168 1169 1170 typedef enum 1171 { 1172 TILEGX_PIPELINE_X0, 1173 TILEGX_PIPELINE_X1, 1174 TILEGX_PIPELINE_Y0, 1175 TILEGX_PIPELINE_Y1, 1176 TILEGX_PIPELINE_Y2, 1177 } tilegx_pipeline; 1178 1179 #define tilegx_is_x_pipeline(p) ((Int)(p) <= (Int)TILEGX_PIPELINE_X1) 1180 1181 typedef enum 1182 { 1183 TILEGX_OP_TYPE_REGISTER, 1184 TILEGX_OP_TYPE_IMMEDIATE, 1185 TILEGX_OP_TYPE_ADDRESS, 1186 TILEGX_OP_TYPE_SPR 1187 } tilegx_operand_type; 1188 1189 struct tilegx_operand 1190 { 1191 /* Is this operand a register, immediate or address? */ 1192 tilegx_operand_type type; 1193 1194 /* The default relocation type for this operand. */ 1195 Int default_reloc : 16; 1196 1197 /* How many bits is this value? (used for range checking) */ 1198 UInt num_bits : 5; 1199 1200 /* Is the value signed? (used for range checking) */ 1201 UInt is_signed : 1; 1202 1203 /* Is this operand a source register? */ 1204 UInt is_src_reg : 1; 1205 1206 /* Is this operand written? (i.e. is it a destination register) */ 1207 UInt is_dest_reg : 1; 1208 1209 /* Is this operand PC-relative? */ 1210 UInt is_pc_relative : 1; 1211 1212 /* By how many bits do we right shift the value before inserting? */ 1213 UInt rightshift : 2; 1214 1215 /* Return the bits for this operand to be ORed into an existing bundle. */ 1216 tilegx_bundle_bits (*insert) (int op); 1217 1218 /* Extract this operand and return it. */ 1219 UInt (*extract) (tilegx_bundle_bits bundle); 1220 }; 1221 1222 1223 extern const struct tilegx_operand tilegx_operands[]; 1224 1225 /* One finite-state machine per pipe for rapid instruction decoding. */ 1226 extern const unsigned short * const 1227 tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS]; 1228 1229 1230 struct tilegx_opcode 1231 { 1232 /* The opcode mnemonic, e.g. "add" */ 1233 const char *name; 1234 1235 /* The enum value for this mnemonic. */ 1236 tilegx_mnemonic mnemonic; 1237 1238 /* A bit mask of which of the five pipes this instruction 1239 is compatible with: 1240 X0 0x01 1241 X1 0x02 1242 Y0 0x04 1243 Y1 0x08 1244 Y2 0x10 */ 1245 unsigned char pipes; 1246 1247 /* How many operands are there? */ 1248 unsigned char num_operands; 1249 1250 /* Which register does this write implicitly, or TREG_ZERO if none? */ 1251 unsigned char implicitly_written_register; 1252 1253 /* Can this be bundled with other instructions (almost always true). */ 1254 unsigned char can_bundle; 1255 1256 /* The description of the operands. Each of these is an 1257 * index into the tilegx_operands[] table. */ 1258 unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS]; 1259 1260 /* A mask of which bits have predefined values for each pipeline. 1261 * This is useful for disassembly. */ 1262 tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS]; 1263 1264 /* For each bit set in fixed_bit_masks, what the value is for this 1265 * instruction. */ 1266 tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS]; 1267 }; 1268 1269 extern const struct tilegx_opcode tilegx_opcodes[]; 1270 1271 /* Used for non-textual disassembly into structs. */ 1272 struct tilegx_decoded_instruction 1273 { 1274 const struct tilegx_opcode *opcode; 1275 const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS]; 1276 Long operand_values[TILEGX_MAX_OPERANDS]; 1277 }; 1278 1279 1280 /* Disassemble a bundle into a struct for machine processing. */ 1281 extern Int parse_insn_tilegx ( tilegx_bundle_bits bits, 1282 ULong pc, 1283 struct tilegx_decoded_instruction 1284 decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE] ); 1285 1286 extern Int decode_and_display ( tilegx_bundle_bits *p, Int count, ULong pc ); 1287 1288 extern tilegx_bundle_bits 1289 encode_insn_tilegx ( struct tilegx_decoded_instruction decoded ); 1290 1291 1292 extern tilegx_bundle_bits 1293 mkTileGxInsn ( Int opc, Int argc, ... ); 1294 1295 /* Given a set of bundle bits and a specific pipe, returns which 1296 * instruction the bundle contains in that pipe. 1297 */ 1298 extern const struct tilegx_opcode * 1299 find_opcode ( tilegx_bundle_bits bits, tilegx_pipeline pipe ); 1300 1301 1302 #endif /* __TILEGX_DISASM_H */ 1303 1304 /*---------------------------------------------------------------*/ 1305 /*--- end tilegx-disasm.h ---*/ 1306 /*---------------------------------------------------------------*/ 1307