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