1/* $NetBSD$ */ 2 3/*- 4 * Copyright (c) 2000-2003 Marcel Moolenaar 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/cdefs.h> 30/* __FBSDID("$FreeBSD: src/sys/ia64/disasm/disasm_decode.c,v 1.3 2005/01/06 22:18:22 imp Exp $"); */ 31 32#include <sys/param.h> 33#include <sys/systm.h> 34 35#include <ia64/disasm/disasm_int.h> 36#include <ia64/disasm/disasm.h> 37 38/* 39 * Template names. 40 */ 41static const char *asm_templname[] = { 42 "MII", "MII;", "MI;I", "MI;I;", "MLX", "MLX;", 0, 0, 43 "MMI", "MMI;", "M;MI", "M;MI;", "MFI", "MFI;", "MMF", "MMF;", 44 "MIB", "MIB;", "MBB", "MBB;", 0, 0, "BBB", "BBB;", 45 "MMB", "MMB;", 0, 0, "MFB", "MFB;", 0, 0 46}; 47 48/* 49 * Decode A-unit instructions. 50 */ 51static int 52asm_decodeA(uint64_t bits, struct asm_bundle *b, int slot) 53{ 54 enum asm_fmt fmt; 55 enum asm_op op; 56 57 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 58 switch((int)OPCODE(bits)) { 59 case 0x8: 60 switch (FIELD(bits, 34, 2)) { /* x2a */ 61 case 0x0: 62 if (FIELD(bits, 33, 1) == 0) { /* ve */ 63 switch (FIELD(bits, 29, 4)) { /* x4 */ 64 case 0x0: 65 if (FIELD(bits, 27, 2) <= 1) /* x2b */ 66 op = ASM_OP_ADD, 67 fmt = ASM_FMT_A1; 68 break; 69 case 0x1: 70 if (FIELD(bits, 27, 2) <= 1) /* x2b */ 71 op = ASM_OP_SUB, 72 fmt = ASM_FMT_A1; 73 break; 74 case 0x2: 75 if (FIELD(bits, 27, 2) == 0) /* x2b */ 76 op = ASM_OP_ADDP4, 77 fmt = ASM_FMT_A1; 78 break; 79 case 0x3: 80 switch (FIELD(bits, 27, 2)) { /* x2b */ 81 case 0x0: 82 op = ASM_OP_AND, 83 fmt = ASM_FMT_A1; 84 break; 85 case 0x1: 86 op = ASM_OP_ANDCM, 87 fmt = ASM_FMT_A1; 88 break; 89 case 0x2: 90 op = ASM_OP_OR, 91 fmt = ASM_FMT_A1; 92 break; 93 case 0x3: 94 op = ASM_OP_XOR, 95 fmt = ASM_FMT_A1; 96 break; 97 } 98 break; 99 case 0xB: 100 switch (FIELD(bits, 27, 2)) { /* x2b */ 101 case 0x0: 102 op = ASM_OP_AND, 103 fmt = ASM_FMT_A3; 104 break; 105 case 0x1: 106 op = ASM_OP_ANDCM, 107 fmt = ASM_FMT_A3; 108 break; 109 case 0x2: 110 op = ASM_OP_OR, 111 fmt = ASM_FMT_A3; 112 break; 113 case 0x3: 114 op = ASM_OP_XOR, 115 fmt = ASM_FMT_A3; 116 break; 117 } 118 break; 119 case 0x4: 120 op = ASM_OP_SHLADD, fmt = ASM_FMT_A2; 121 break; 122 case 0x6: 123 op = ASM_OP_SHLADDP4, fmt = ASM_FMT_A2; 124 break; 125 case 0x9: 126 if (FIELD(bits, 27, 2) == 1) /* x2b */ 127 op = ASM_OP_SUB, 128 fmt = ASM_FMT_A3; 129 break; 130 } 131 } 132 break; 133 case 0x1: 134 switch (FIELD(bits, 29, 8)) { /* za + x2a + zb + x4 */ 135 case 0x20: 136 switch (FIELD(bits, 27, 2)) { /* x2b */ 137 case 0x0: 138 op = ASM_OP_PADD1_, fmt = ASM_FMT_A9; 139 break; 140 case 0x1: 141 op = ASM_OP_PADD1_SSS, 142 fmt = ASM_FMT_A9; 143 break; 144 case 0x2: 145 op = ASM_OP_PADD1_UUU, 146 fmt = ASM_FMT_A9; 147 break; 148 case 0x3: 149 op = ASM_OP_PADD1_UUS, 150 fmt = ASM_FMT_A9; 151 break; 152 } 153 break; 154 case 0x21: 155 switch (FIELD(bits, 27, 2)) { /* x2b */ 156 case 0x0: 157 op = ASM_OP_PSUB1_, fmt = ASM_FMT_A9; 158 break; 159 case 0x1: 160 op = ASM_OP_PSUB1_SSS, 161 fmt = ASM_FMT_A9; 162 break; 163 case 0x2: 164 op = ASM_OP_PSUB1_UUU, 165 fmt = ASM_FMT_A9; 166 break; 167 case 0x3: 168 op = ASM_OP_PSUB1_UUS, 169 fmt = ASM_FMT_A9; 170 break; 171 } 172 break; 173 case 0x22: 174 switch (FIELD(bits, 27, 2)) { /* x2b */ 175 case 0x2: 176 op = ASM_OP_PAVG1_, fmt = ASM_FMT_A9; 177 break; 178 case 0x3: 179 op = ASM_OP_PAVG1_RAZ, 180 fmt = ASM_FMT_A9; 181 break; 182 } 183 break; 184 case 0x23: 185 if (FIELD(bits, 27, 2) == 2) /* x2b */ 186 op = ASM_OP_PAVGSUB1, fmt = ASM_FMT_A9; 187 break; 188 case 0x29: 189 switch (FIELD(bits, 27, 2)) { /* x2b */ 190 case 0x0: 191 op = ASM_OP_PCMP1_EQ, fmt = ASM_FMT_A9; 192 break; 193 case 0x1: 194 op = ASM_OP_PCMP1_GT, fmt = ASM_FMT_A9; 195 break; 196 } 197 break; 198 case 0x30: 199 switch (FIELD(bits, 27, 2)) { /* x2b */ 200 case 0x0: 201 op = ASM_OP_PADD2_, fmt = ASM_FMT_A9; 202 break; 203 case 0x1: 204 op = ASM_OP_PADD2_SSS, 205 fmt = ASM_FMT_A9; 206 break; 207 case 0x2: 208 op = ASM_OP_PADD2_UUU, 209 fmt = ASM_FMT_A9; 210 break; 211 case 0x3: 212 op = ASM_OP_PADD2_UUS, 213 fmt = ASM_FMT_A9; 214 break; 215 } 216 break; 217 case 0x31: 218 switch (FIELD(bits, 27, 2)) { /* x2b */ 219 case 0x0: 220 op = ASM_OP_PSUB2_, fmt = ASM_FMT_A9; 221 break; 222 case 0x1: 223 op = ASM_OP_PSUB2_SSS, 224 fmt = ASM_FMT_A9; 225 break; 226 case 0x2: 227 op = ASM_OP_PSUB2_UUU, 228 fmt = ASM_FMT_A9; 229 break; 230 case 0x3: 231 op = ASM_OP_PSUB2_UUS, 232 fmt = ASM_FMT_A9; 233 break; 234 } 235 break; 236 case 0x32: 237 switch (FIELD(bits, 27, 2)) { /* x2b */ 238 case 0x2: 239 op = ASM_OP_PAVG2_, fmt = ASM_FMT_A9; 240 break; 241 case 0x3: 242 op = ASM_OP_PAVG2_RAZ, 243 fmt = ASM_FMT_A9; 244 break; 245 } 246 break; 247 case 0x33: 248 if (FIELD(bits, 27, 2) == 2) /* x2b */ 249 op = ASM_OP_PAVGSUB2, fmt = ASM_FMT_A9; 250 break; 251 case 0x34: 252 op = ASM_OP_PSHLADD2, fmt = ASM_FMT_A10; 253 break; 254 case 0x36: 255 op = ASM_OP_PSHRADD2, fmt = ASM_FMT_A10; 256 break; 257 case 0x39: 258 switch (FIELD(bits, 27, 2)) { /* x2b */ 259 case 0x0: 260 op = ASM_OP_PCMP2_EQ, fmt = ASM_FMT_A9; 261 break; 262 case 0x1: 263 op = ASM_OP_PCMP2_GT, fmt = ASM_FMT_A9; 264 break; 265 } 266 break; 267 case 0xA0: 268 if (FIELD(bits, 27, 2) == 0) /* x2b */ 269 op = ASM_OP_PADD4, fmt = ASM_FMT_A9; 270 break; 271 case 0xA1: 272 if (FIELD(bits, 27, 2) == 0) /* x2b */ 273 op = ASM_OP_PSUB4, fmt = ASM_FMT_A9; 274 break; 275 case 0xA9: 276 switch (FIELD(bits, 27, 2)) { /* x2b */ 277 case 0x0: 278 op = ASM_OP_PCMP4_EQ, fmt = ASM_FMT_A9; 279 break; 280 case 0x1: 281 op = ASM_OP_PCMP4_GT, fmt = ASM_FMT_A9; 282 break; 283 } 284 break; 285 } 286 break; 287 case 0x2: 288 if (FIELD(bits, 33, 1) == 0) /* ve */ 289 op = ASM_OP_ADDS, fmt = ASM_FMT_A4; 290 break; 291 case 0x3: 292 if (FIELD(bits, 33, 1) == 0) /* ve */ 293 op = ASM_OP_ADDP4, fmt = ASM_FMT_A4; 294 break; 295 } 296 break; 297 case 0x9: 298 op = ASM_OP_ADDL, fmt = ASM_FMT_A5; 299 break; 300 case 0xC: case 0xD: case 0xE: 301 if (FIELD(bits, 12, 1) == 0) { /* c */ 302 switch (FIELD(bits, 33, 8)) { /* maj + tb + x2 + ta */ 303 case 0xC0: 304 op = ASM_OP_CMP_LT, fmt = ASM_FMT_A6; 305 break; 306 case 0xC1: 307 op = ASM_OP_CMP_EQ_AND, fmt = ASM_FMT_A6; 308 break; 309 case 0xC2: 310 op = ASM_OP_CMP4_LT, fmt = ASM_FMT_A6; 311 break; 312 case 0xC3: 313 op = ASM_OP_CMP4_EQ_AND, fmt = ASM_FMT_A6; 314 break; 315 case 0xC4: case 0xCC: 316 op = ASM_OP_CMP_LT, fmt = ASM_FMT_A8; 317 break; 318 case 0xC5: case 0xCD: 319 op = ASM_OP_CMP_EQ_AND, fmt = ASM_FMT_A8; 320 break; 321 case 0xC6: case 0xCE: 322 op = ASM_OP_CMP4_LT, fmt = ASM_FMT_A8; 323 break; 324 case 0xC7: case 0xCF: 325 op = ASM_OP_CMP4_EQ_AND, fmt = ASM_FMT_A8; 326 break; 327 case 0xC8: 328 op = ASM_OP_CMP_GT_AND, fmt = ASM_FMT_A7; 329 break; 330 case 0xC9: 331 op = ASM_OP_CMP_GE_AND, fmt = ASM_FMT_A7; 332 break; 333 case 0xCA: 334 op = ASM_OP_CMP4_GT_AND, fmt = ASM_FMT_A7; 335 break; 336 case 0xCB: 337 op = ASM_OP_CMP4_GE_AND, fmt = ASM_FMT_A7; 338 break; 339 case 0xD0: 340 op = ASM_OP_CMP_LTU, fmt = ASM_FMT_A6; 341 break; 342 case 0xD1: 343 op = ASM_OP_CMP_EQ_OR, fmt = ASM_FMT_A6; 344 break; 345 case 0xD2: 346 op = ASM_OP_CMP4_LTU, fmt = ASM_FMT_A6; 347 break; 348 case 0xD3: 349 op = ASM_OP_CMP4_EQ_OR, fmt = ASM_FMT_A6; 350 break; 351 case 0xD4: case 0xDC: 352 op = ASM_OP_CMP_LTU, fmt = ASM_FMT_A8; 353 break; 354 case 0xD5: case 0xDD: 355 op = ASM_OP_CMP_EQ_OR, fmt = ASM_FMT_A8; 356 break; 357 case 0xD6: case 0xDE: 358 op = ASM_OP_CMP4_LTU, fmt = ASM_FMT_A8; 359 break; 360 case 0xD7: case 0xDF: 361 op = ASM_OP_CMP4_EQ_OR, fmt = ASM_FMT_A8; 362 break; 363 case 0xD8: 364 op = ASM_OP_CMP_GT_OR, fmt = ASM_FMT_A7; 365 break; 366 case 0xD9: 367 op = ASM_OP_CMP_GE_OR, fmt = ASM_FMT_A7; 368 break; 369 case 0xDA: 370 op = ASM_OP_CMP4_GT_OR, fmt = ASM_FMT_A7; 371 break; 372 case 0xDB: 373 op = ASM_OP_CMP4_GE_OR, fmt = ASM_FMT_A7; 374 break; 375 case 0xE0: 376 op = ASM_OP_CMP_EQ, fmt = ASM_FMT_A6; 377 break; 378 case 0xE1: 379 op = ASM_OP_CMP_EQ_OR_ANDCM, fmt = ASM_FMT_A6; 380 break; 381 case 0xE2: 382 op = ASM_OP_CMP4_EQ, fmt = ASM_FMT_A6; 383 break; 384 case 0xE3: 385 op = ASM_OP_CMP4_EQ_OR_ANDCM, fmt = ASM_FMT_A6; 386 break; 387 case 0xE4: case 0xEC: 388 op = ASM_OP_CMP_EQ, fmt = ASM_FMT_A8; 389 break; 390 case 0xE5: case 0xED: 391 op = ASM_OP_CMP_EQ_OR_ANDCM, fmt = ASM_FMT_A8; 392 break; 393 case 0xE6: case 0xEE: 394 op = ASM_OP_CMP4_EQ, fmt = ASM_FMT_A8; 395 break; 396 case 0xE7: case 0xEF: 397 op = ASM_OP_CMP4_EQ_OR_ANDCM, fmt = ASM_FMT_A8; 398 break; 399 case 0xE8: 400 op = ASM_OP_CMP_GT_OR_ANDCM, fmt = ASM_FMT_A7; 401 break; 402 case 0xE9: 403 op = ASM_OP_CMP_GE_OR_ANDCM, fmt = ASM_FMT_A7; 404 break; 405 case 0xEA: 406 op = ASM_OP_CMP4_GT_OR_ANDCM, fmt = ASM_FMT_A7; 407 break; 408 case 0xEB: 409 op = ASM_OP_CMP4_GE_OR_ANDCM, fmt = ASM_FMT_A7; 410 break; 411 } 412 } else { 413 switch (FIELD(bits, 33, 8)) { /* maj + tb + x2 + ta */ 414 case 0xC0: 415 op = ASM_OP_CMP_LT_UNC, fmt = ASM_FMT_A6; 416 break; 417 case 0xC1: 418 op = ASM_OP_CMP_NE_AND, fmt = ASM_FMT_A6; 419 break; 420 case 0xC2: 421 op = ASM_OP_CMP4_LT_UNC, fmt = ASM_FMT_A6; 422 break; 423 case 0xC3: 424 op = ASM_OP_CMP4_NE_AND, fmt = ASM_FMT_A6; 425 break; 426 case 0xC4: case 0xCC: 427 op = ASM_OP_CMP_LT_UNC, fmt = ASM_FMT_A8; 428 break; 429 case 0xC5: case 0xCD: 430 op = ASM_OP_CMP_NE_AND, fmt = ASM_FMT_A8; 431 break; 432 case 0xC6: case 0xCE: 433 op = ASM_OP_CMP4_LT_UNC, fmt = ASM_FMT_A8; 434 break; 435 case 0xC7: case 0xCF: 436 op = ASM_OP_CMP4_NE_AND, fmt = ASM_FMT_A8; 437 break; 438 case 0xC8: 439 op = ASM_OP_CMP_LE_AND, fmt = ASM_FMT_A7; 440 break; 441 case 0xC9: 442 op = ASM_OP_CMP_LT_AND, fmt = ASM_FMT_A7; 443 break; 444 case 0xCA: 445 op = ASM_OP_CMP4_LE_AND, fmt = ASM_FMT_A7; 446 break; 447 case 0xCB: 448 op = ASM_OP_CMP4_LT_AND, fmt = ASM_FMT_A7; 449 break; 450 case 0xD0: 451 op = ASM_OP_CMP_LTU_UNC, fmt = ASM_FMT_A6; 452 break; 453 case 0xD1: 454 op = ASM_OP_CMP_NE_OR, fmt = ASM_FMT_A6; 455 break; 456 case 0xD2: 457 op = ASM_OP_CMP4_LTU_UNC, fmt = ASM_FMT_A6; 458 break; 459 case 0xD3: 460 op = ASM_OP_CMP4_NE_OR, fmt = ASM_FMT_A6; 461 break; 462 case 0xD4: case 0xDC: 463 op = ASM_OP_CMP_LTU_UNC, fmt = ASM_FMT_A8; 464 break; 465 case 0xD5: case 0xDD: 466 op = ASM_OP_CMP_NE_OR, fmt = ASM_FMT_A8; 467 break; 468 case 0xD6: case 0xDE: 469 op = ASM_OP_CMP4_LTU_UNC, fmt = ASM_FMT_A8; 470 break; 471 case 0xD7: case 0xDF: 472 op = ASM_OP_CMP4_NE_OR, fmt = ASM_FMT_A8; 473 break; 474 case 0xD8: 475 op = ASM_OP_CMP_LE_OR, fmt = ASM_FMT_A7; 476 break; 477 case 0xD9: 478 op = ASM_OP_CMP_LT_OR, fmt = ASM_FMT_A7; 479 break; 480 case 0xDA: 481 op = ASM_OP_CMP4_LE_OR, fmt = ASM_FMT_A7; 482 break; 483 case 0xDB: 484 op = ASM_OP_CMP4_LT_OR, fmt = ASM_FMT_A7; 485 break; 486 case 0xE0: 487 op = ASM_OP_CMP_EQ_UNC, fmt = ASM_FMT_A6; 488 break; 489 case 0xE1: 490 op = ASM_OP_CMP_NE_OR_ANDCM, fmt = ASM_FMT_A6; 491 break; 492 case 0xE2: 493 op = ASM_OP_CMP4_EQ_UNC, fmt = ASM_FMT_A6; 494 break; 495 case 0xE3: 496 op = ASM_OP_CMP4_NE_OR_ANDCM, fmt = ASM_FMT_A6; 497 break; 498 case 0xE4: case 0xEC: 499 op = ASM_OP_CMP_EQ_UNC, fmt = ASM_FMT_A8; 500 break; 501 case 0xE5: case 0xED: 502 op = ASM_OP_CMP_NE_OR_ANDCM, fmt = ASM_FMT_A8; 503 break; 504 case 0xE6: case 0xEE: 505 op = ASM_OP_CMP4_EQ_UNC, fmt = ASM_FMT_A8; 506 break; 507 case 0xE7: case 0xEF: 508 op = ASM_OP_CMP4_NE_OR_ANDCM, fmt = ASM_FMT_A8; 509 break; 510 case 0xE8: 511 op = ASM_OP_CMP_LE_OR_ANDCM, fmt = ASM_FMT_A7; 512 break; 513 case 0xE9: 514 op = ASM_OP_CMP_LT_OR_ANDCM, fmt = ASM_FMT_A7; 515 break; 516 case 0xEA: 517 op = ASM_OP_CMP4_LE_OR_ANDCM, fmt = ASM_FMT_A7; 518 break; 519 case 0xEB: 520 op = ASM_OP_CMP4_LT_OR_ANDCM, fmt = ASM_FMT_A7; 521 break; 522 } 523 } 524 break; 525 } 526 527 if (op != ASM_OP_NONE) 528 return (asm_extract(op, fmt, bits, b, slot)); 529 return (0); 530} 531 532/* 533 * Decode B-unit instructions. 534 */ 535static int 536asm_decodeB(uint64_t ip, struct asm_bundle *b, int slot) 537{ 538 uint64_t bits; 539 enum asm_fmt fmt; 540 enum asm_op op; 541 542 bits = SLOT(ip, slot); 543 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 544 545 switch((int)OPCODE(bits)) { 546 case 0x0: 547 switch (FIELD(bits, 27, 6)) { /* x6 */ 548 case 0x0: 549 op = ASM_OP_BREAK_B, fmt = ASM_FMT_B9; 550 break; 551 case 0x2: 552 op = ASM_OP_COVER, fmt = ASM_FMT_B8; 553 break; 554 case 0x4: 555 op = ASM_OP_CLRRRB_, fmt = ASM_FMT_B8; 556 break; 557 case 0x5: 558 op = ASM_OP_CLRRRB_PR, fmt = ASM_FMT_B8; 559 break; 560 case 0x8: 561 op = ASM_OP_RFI, fmt = ASM_FMT_B8; 562 break; 563 case 0xC: 564 op = ASM_OP_BSW_0, fmt = ASM_FMT_B8; 565 break; 566 case 0xD: 567 op = ASM_OP_BSW_1, fmt = ASM_FMT_B8; 568 break; 569 case 0x10: 570 op = ASM_OP_EPC, fmt = ASM_FMT_B8; 571 break; 572 case 0x20: 573 switch (FIELD(bits, 6, 3)) { /* btype */ 574 case 0x0: 575 op = ASM_OP_BR_COND, fmt = ASM_FMT_B4; 576 break; 577 case 0x1: 578 op = ASM_OP_BR_IA, fmt = ASM_FMT_B4; 579 break; 580 } 581 break; 582 case 0x21: 583 if (FIELD(bits, 6, 3) == 4) /* btype */ 584 op = ASM_OP_BR_RET, fmt = ASM_FMT_B4; 585 break; 586 } 587 break; 588 case 0x1: 589 op = ASM_OP_BR_CALL, fmt = ASM_FMT_B5; 590 break; 591 case 0x2: 592 switch (FIELD(bits, 27, 6)) { /* x6 */ 593 case 0x0: 594 op = ASM_OP_NOP_B, fmt = ASM_FMT_B9; 595 break; 596 case 0x10: 597 op = ASM_OP_BRP_, fmt = ASM_FMT_B7; 598 break; 599 case 0x11: 600 op = ASM_OP_BRP_RET, fmt = ASM_FMT_B7; 601 break; 602 } 603 break; 604 case 0x4: 605 switch (FIELD(bits, 6, 3)) { /* btype */ 606 case 0x0: 607 op = ASM_OP_BR_COND, fmt = ASM_FMT_B1; 608 break; 609 case 0x2: 610 op = ASM_OP_BR_WEXIT, fmt = ASM_FMT_B1; 611 break; 612 case 0x3: 613 op = ASM_OP_BR_WTOP, fmt = ASM_FMT_B1; 614 break; 615 case 0x5: 616 op = ASM_OP_BR_CLOOP, fmt = ASM_FMT_B2; 617 break; 618 case 0x6: 619 op = ASM_OP_BR_CEXIT, fmt = ASM_FMT_B2; 620 break; 621 case 0x7: 622 op = ASM_OP_BR_CTOP, fmt = ASM_FMT_B2; 623 break; 624 } 625 break; 626 case 0x5: 627 op = ASM_OP_BR_CALL, fmt = ASM_FMT_B3; 628 break; 629 case 0x7: 630 op = ASM_OP_BRP_, fmt = ASM_FMT_B6; 631 break; 632 } 633 634 if (op != ASM_OP_NONE) 635 return (asm_extract(op, fmt, bits, b, slot)); 636 return (0); 637} 638 639/* 640 * Decode F-unit instructions. 641 */ 642static int 643asm_decodeF(uint64_t ip, struct asm_bundle *b, int slot) 644{ 645 uint64_t bits; 646 enum asm_fmt fmt; 647 enum asm_op op; 648 649 bits = SLOT(ip, slot); 650 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 651 652 switch((int)OPCODE(bits)) { 653 case 0x0: 654 if (FIELD(bits, 33, 1) == 0) { /* x */ 655 switch (FIELD(bits, 27, 6)) { /* x6 */ 656 case 0x0: 657 op = ASM_OP_BREAK_F, fmt = ASM_FMT_F15; 658 break; 659 case 0x1: 660 op = ASM_OP_NOP_F, fmt = ASM_FMT_F15; 661 break; 662 case 0x4: 663 op = ASM_OP_FSETC, fmt = ASM_FMT_F12; 664 break; 665 case 0x5: 666 op = ASM_OP_FCLRF, fmt = ASM_FMT_F13; 667 break; 668 case 0x8: 669 op = ASM_OP_FCHKF, fmt = ASM_FMT_F14; 670 break; 671 case 0x10: 672 op = ASM_OP_FMERGE_S, fmt = ASM_FMT_F9; 673 break; 674 case 0x11: 675 op = ASM_OP_FMERGE_NS, fmt = ASM_FMT_F9; 676 break; 677 case 0x12: 678 op = ASM_OP_FMERGE_SE, fmt = ASM_FMT_F9; 679 break; 680 case 0x14: 681 op = ASM_OP_FMIN, fmt = ASM_FMT_F8; 682 break; 683 case 0x15: 684 op = ASM_OP_FMAX, fmt = ASM_FMT_F8; 685 break; 686 case 0x16: 687 op = ASM_OP_FAMIN, fmt = ASM_FMT_F8; 688 break; 689 case 0x17: 690 op = ASM_OP_FAMAX, fmt = ASM_FMT_F8; 691 break; 692 case 0x18: 693 op = ASM_OP_FCVT_FX, fmt = ASM_FMT_F10; 694 break; 695 case 0x19: 696 op = ASM_OP_FCVT_FXU, fmt = ASM_FMT_F10; 697 break; 698 case 0x1A: 699 op = ASM_OP_FCVT_FX_TRUNC, fmt = ASM_FMT_F10; 700 break; 701 case 0x1B: 702 op = ASM_OP_FCVT_FXU_TRUNC, fmt = ASM_FMT_F10; 703 break; 704 case 0x1C: 705 op = ASM_OP_FCVT_XF, fmt = ASM_FMT_F11; 706 break; 707 case 0x28: 708 op = ASM_OP_FPACK, fmt = ASM_FMT_F9; 709 break; 710 case 0x2C: 711 op = ASM_OP_FAND, fmt = ASM_FMT_F9; 712 break; 713 case 0x2D: 714 op = ASM_OP_FANDCM, fmt = ASM_FMT_F9; 715 break; 716 case 0x2E: 717 op = ASM_OP_FOR, fmt = ASM_FMT_F9; 718 break; 719 case 0x2F: 720 op = ASM_OP_FXOR, fmt = ASM_FMT_F9; 721 break; 722 case 0x34: 723 op = ASM_OP_FSWAP_, fmt = ASM_FMT_F9; 724 break; 725 case 0x35: 726 op = ASM_OP_FSWAP_NL, fmt = ASM_FMT_F9; 727 break; 728 case 0x36: 729 op = ASM_OP_FSWAP_NR, fmt = ASM_FMT_F9; 730 break; 731 case 0x39: 732 op = ASM_OP_FMIX_LR, fmt = ASM_FMT_F9; 733 break; 734 case 0x3A: 735 op = ASM_OP_FMIX_R, fmt = ASM_FMT_F9; 736 break; 737 case 0x3B: 738 op = ASM_OP_FMIX_L, fmt = ASM_FMT_F9; 739 break; 740 case 0x3C: 741 op = ASM_OP_FSXT_R, fmt = ASM_FMT_F9; 742 break; 743 case 0x3D: 744 op = ASM_OP_FSXT_L, fmt = ASM_FMT_F9; 745 break; 746 } 747 } else { 748 if (FIELD(bits, 36, 1) == 0) /* q */ 749 op = ASM_OP_FRCPA, fmt = ASM_FMT_F6; 750 else 751 op = ASM_OP_FRSQRTA, fmt = ASM_FMT_F7; 752 } 753 break; 754 case 0x1: 755 if (FIELD(bits, 33, 1) == 0) { /* x */ 756 switch (FIELD(bits, 27, 6)) { /* x6 */ 757 case 0x10: 758 op = ASM_OP_FPMERGE_S, fmt = ASM_FMT_F9; 759 break; 760 case 0x11: 761 op = ASM_OP_FPMERGE_NS, fmt = ASM_FMT_F9; 762 break; 763 case 0x12: 764 op = ASM_OP_FPMERGE_SE, fmt = ASM_FMT_F9; 765 break; 766 case 0x14: 767 op = ASM_OP_FPMIN, fmt = ASM_FMT_F8; 768 break; 769 case 0x15: 770 op = ASM_OP_FPMAX, fmt = ASM_FMT_F8; 771 break; 772 case 0x16: 773 op = ASM_OP_FPAMIN, fmt = ASM_FMT_F8; 774 break; 775 case 0x17: 776 op = ASM_OP_FPAMAX, fmt = ASM_FMT_F8; 777 break; 778 case 0x18: 779 op = ASM_OP_FPCVT_FX, fmt = ASM_FMT_F10; 780 break; 781 case 0x19: 782 op = ASM_OP_FPCVT_FXU, fmt = ASM_FMT_F10; 783 break; 784 case 0x1A: 785 op = ASM_OP_FPCVT_FX_TRUNC, fmt = ASM_FMT_F10; 786 break; 787 case 0x1B: 788 op = ASM_OP_FPCVT_FXU_TRUNC, fmt = ASM_FMT_F10; 789 break; 790 case 0x30: 791 op = ASM_OP_FPCMP_EQ, fmt = ASM_FMT_F8; 792 break; 793 case 0x31: 794 op = ASM_OP_FPCMP_LT, fmt = ASM_FMT_F8; 795 break; 796 case 0x32: 797 op = ASM_OP_FPCMP_LE, fmt = ASM_FMT_F8; 798 break; 799 case 0x33: 800 op = ASM_OP_FPCMP_UNORD, fmt = ASM_FMT_F8; 801 break; 802 case 0x34: 803 op = ASM_OP_FPCMP_NEQ, fmt = ASM_FMT_F8; 804 break; 805 case 0x35: 806 op = ASM_OP_FPCMP_NLT, fmt = ASM_FMT_F8; 807 break; 808 case 0x36: 809 op = ASM_OP_FPCMP_NLE, fmt = ASM_FMT_F8; 810 break; 811 case 0x37: 812 op = ASM_OP_FPCMP_ORD, fmt = ASM_FMT_F8; 813 break; 814 } 815 } else { 816 if (FIELD(bits, 36, 1) == 0) /* q */ 817 op = ASM_OP_FPRCPA, fmt = ASM_FMT_F6; 818 else 819 op = ASM_OP_FPRSQRTA, fmt = ASM_FMT_F7; 820 } 821 break; 822 case 0x4: 823 op = ASM_OP_FCMP, fmt = ASM_FMT_F4; 824 break; 825 case 0x5: 826 op = ASM_OP_FCLASS_M, fmt = ASM_FMT_F5; 827 break; 828 case 0x8: 829 if (FIELD(bits, 36, 1) == 0) /* x */ 830 op = ASM_OP_FMA_, fmt = ASM_FMT_F1; 831 else 832 op = ASM_OP_FMA_S, fmt = ASM_FMT_F1; 833 break; 834 case 0x9: 835 if (FIELD(bits, 36, 1) == 0) /* x */ 836 op = ASM_OP_FMA_D, fmt = ASM_FMT_F1; 837 else 838 op = ASM_OP_FPMA, fmt = ASM_FMT_F1; 839 break; 840 case 0xA: 841 if (FIELD(bits, 36, 1) == 0) /* x */ 842 op = ASM_OP_FMS_, fmt = ASM_FMT_F1; 843 else 844 op = ASM_OP_FMS_S, fmt = ASM_FMT_F1; 845 break; 846 case 0xB: 847 if (FIELD(bits, 36, 1) == 0) /* x */ 848 op = ASM_OP_FMS_D, fmt = ASM_FMT_F1; 849 else 850 op = ASM_OP_FPMS, fmt = ASM_FMT_F1; 851 break; 852 case 0xC: 853 if (FIELD(bits, 36, 1) == 0) /* x */ 854 op = ASM_OP_FNMA_, fmt = ASM_FMT_F1; 855 else 856 op = ASM_OP_FNMA_S, fmt = ASM_FMT_F1; 857 break; 858 case 0xD: 859 if (FIELD(bits, 36, 1) == 0) /* x */ 860 op = ASM_OP_FNMA_D, fmt = ASM_FMT_F1; 861 else 862 op = ASM_OP_FPNMA, fmt = ASM_FMT_F1; 863 break; 864 case 0xE: 865 if (FIELD(bits, 36, 1) == 1) { /* x */ 866 switch (FIELD(bits, 34, 2)) { /* x2 */ 867 case 0x0: 868 op = ASM_OP_XMA_L, fmt = ASM_FMT_F2; 869 break; 870 case 0x2: 871 op = ASM_OP_XMA_HU, fmt = ASM_FMT_F2; 872 break; 873 case 0x3: 874 op = ASM_OP_XMA_H, fmt = ASM_FMT_F2; 875 break; 876 } 877 } else 878 op = ASM_OP_FSELECT, fmt = ASM_FMT_F3; 879 break; 880 } 881 882 if (op != ASM_OP_NONE) 883 return (asm_extract(op, fmt, bits, b, slot)); 884 return (0); 885} 886 887/* 888 * Decode I-unit instructions. 889 */ 890static int 891asm_decodeI(uint64_t ip, struct asm_bundle *b, int slot) 892{ 893 uint64_t bits; 894 enum asm_fmt fmt; 895 enum asm_op op; 896 897 bits = SLOT(ip, slot); 898 if ((int)OPCODE(bits) >= 8) 899 return (asm_decodeA(bits, b, slot)); 900 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 901 902 switch((int)OPCODE(bits)) { 903 case 0x0: 904 switch (FIELD(bits, 33, 3)) { /* x3 */ 905 case 0x0: 906 switch (FIELD(bits, 27, 6)) { /* x6 */ 907 case 0x0: 908 op = ASM_OP_BREAK_I, fmt = ASM_FMT_I19; 909 break; 910 case 0x1: 911 op = ASM_OP_NOP_I, fmt = ASM_FMT_I19; 912 break; 913 case 0xA: 914 op = ASM_OP_MOV_I, fmt = ASM_FMT_I27; 915 break; 916 case 0x10: 917 op = ASM_OP_ZXT1, fmt = ASM_FMT_I29; 918 break; 919 case 0x11: 920 op = ASM_OP_ZXT2, fmt = ASM_FMT_I29; 921 break; 922 case 0x12: 923 op = ASM_OP_ZXT4, fmt = ASM_FMT_I29; 924 break; 925 case 0x14: 926 op = ASM_OP_SXT1, fmt = ASM_FMT_I29; 927 break; 928 case 0x15: 929 op = ASM_OP_SXT2, fmt = ASM_FMT_I29; 930 break; 931 case 0x16: 932 op = ASM_OP_SXT4, fmt = ASM_FMT_I29; 933 break; 934 case 0x18: 935 op = ASM_OP_CZX1_L, fmt = ASM_FMT_I29; 936 break; 937 case 0x19: 938 op = ASM_OP_CZX2_L, fmt = ASM_FMT_I29; 939 break; 940 case 0x1C: 941 op = ASM_OP_CZX1_R, fmt = ASM_FMT_I29; 942 break; 943 case 0x1D: 944 op = ASM_OP_CZX2_R, fmt = ASM_FMT_I29; 945 break; 946 case 0x2A: 947 op = ASM_OP_MOV_I, fmt = ASM_FMT_I26; 948 break; 949 case 0x30: 950 op = ASM_OP_MOV_IP, fmt = ASM_FMT_I25; 951 break; 952 case 0x31: 953 op = ASM_OP_MOV_, fmt = ASM_FMT_I22; 954 break; 955 case 0x32: 956 op = ASM_OP_MOV_I, fmt = ASM_FMT_I28; 957 break; 958 case 0x33: 959 op = ASM_OP_MOV_PR, fmt = ASM_FMT_I25; 960 break; 961 } 962 break; 963 case 0x1: 964 op = ASM_OP_CHK_S_I, fmt = ASM_FMT_I20; 965 break; 966 case 0x2: 967 op = ASM_OP_MOV_, fmt = ASM_FMT_I24; 968 break; 969 case 0x3: 970 op = ASM_OP_MOV_, fmt = ASM_FMT_I23; 971 break; 972 case 0x7: 973 if (FIELD(bits, 22, 1) == 0) /* x */ 974 op = ASM_OP_MOV_, fmt = ASM_FMT_I21; 975 else 976 op = ASM_OP_MOV_RET, fmt = ASM_FMT_I21; 977 break; 978 } 979 break; 980 case 0x4: 981 op = ASM_OP_DEP_, fmt = ASM_FMT_I15; 982 break; 983 case 0x5: 984 switch (FIELD(bits, 33, 3)) { /* x + x2 */ 985 case 0x0: 986 if (FIELD(bits, 36, 1) == 0) { /* tb */ 987 switch (FIELD(bits, 12, 2)) { /* c + y */ 988 case 0x0: 989 op = ASM_OP_TBIT_Z, fmt = ASM_FMT_I16; 990 break; 991 case 0x1: 992 op = ASM_OP_TBIT_Z_UNC, 993 fmt = ASM_FMT_I16; 994 break; 995 case 0x2: 996 op = ASM_OP_TNAT_Z, fmt = ASM_FMT_I17; 997 break; 998 case 0x3: 999 op = ASM_OP_TNAT_Z_UNC, 1000 fmt = ASM_FMT_I17; 1001 break; 1002 } 1003 } else { 1004 switch (FIELD(bits, 12, 2)) { /* c + y */ 1005 case 0x0: 1006 op = ASM_OP_TBIT_Z_AND, 1007 fmt = ASM_FMT_I16; 1008 break; 1009 case 0x1: 1010 op = ASM_OP_TBIT_NZ_AND, 1011 fmt = ASM_FMT_I16; 1012 break; 1013 case 0x2: 1014 op = ASM_OP_TNAT_Z_AND, 1015 fmt = ASM_FMT_I17; 1016 break; 1017 case 0x3: 1018 op = ASM_OP_TNAT_NZ_AND, 1019 fmt = ASM_FMT_I17; 1020 break; 1021 } 1022 } 1023 break; 1024 case 0x1: 1025 if (FIELD(bits, 36, 1) == 0) { /* tb */ 1026 switch (FIELD(bits, 12, 2)) { /* c + y */ 1027 case 0x0: 1028 op = ASM_OP_TBIT_Z_OR, 1029 fmt = ASM_FMT_I16; 1030 break; 1031 case 0x1: 1032 op = ASM_OP_TBIT_NZ_OR, 1033 fmt = ASM_FMT_I16; 1034 break; 1035 case 0x2: 1036 op = ASM_OP_TNAT_Z_OR, 1037 fmt = ASM_FMT_I17; 1038 break; 1039 case 0x3: 1040 op = ASM_OP_TNAT_NZ_OR, 1041 fmt = ASM_FMT_I17; 1042 break; 1043 } 1044 } else { 1045 switch (FIELD(bits, 12, 2)) { /* c + y */ 1046 case 0x0: 1047 op = ASM_OP_TBIT_Z_OR_ANDCM, 1048 fmt = ASM_FMT_I16; 1049 break; 1050 case 0x1: 1051 op = ASM_OP_TBIT_NZ_OR_ANDCM, 1052 fmt = ASM_FMT_I16; 1053 break; 1054 case 0x2: 1055 op = ASM_OP_TNAT_Z_OR_ANDCM, 1056 fmt = ASM_FMT_I17; 1057 break; 1058 case 0x3: 1059 op = ASM_OP_TNAT_NZ_OR_ANDCM, 1060 fmt = ASM_FMT_I17; 1061 break; 1062 } 1063 } 1064 break; 1065 case 0x2: 1066 op = ASM_OP_EXTR, fmt = ASM_FMT_I11; 1067 break; 1068 case 0x3: 1069 if (FIELD(bits, 26, 1) == 0) /* y */ 1070 op = ASM_OP_DEP_Z, fmt = ASM_FMT_I12; 1071 else 1072 op = ASM_OP_DEP_Z, fmt = ASM_FMT_I13; 1073 break; 1074 case 0x6: 1075 op = ASM_OP_SHRP, fmt = ASM_FMT_I10; 1076 break; 1077 case 0x7: 1078 op = ASM_OP_DEP_, fmt = ASM_FMT_I14; 1079 break; 1080 } 1081 break; 1082 case 0x7: 1083 switch (FIELD(bits, 32, 5)) { /* ve + zb + x2a + za */ 1084 case 0x2: 1085 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1086 case 0x0: 1087 op = ASM_OP_PSHR2_U, fmt = ASM_FMT_I5; 1088 break; 1089 case 0x1: case 0x5: case 0x9: case 0xD: 1090 op = ASM_OP_PMPYSHR2_U, fmt = ASM_FMT_I1; 1091 break; 1092 case 0x2: 1093 op = ASM_OP_PSHR2_, fmt = ASM_FMT_I5; 1094 break; 1095 case 0x3: case 0x7: case 0xB: case 0xF: 1096 op = ASM_OP_PMPYSHR2_, fmt = ASM_FMT_I1; 1097 break; 1098 case 0x4: 1099 op = ASM_OP_PSHL2, fmt = ASM_FMT_I7; 1100 break; 1101 } 1102 break; 1103 case 0x6: 1104 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1105 case 0x1: 1106 op = ASM_OP_PSHR2_U, fmt = ASM_FMT_I6; 1107 break; 1108 case 0x3: 1109 op = ASM_OP_PSHR2_, fmt = ASM_FMT_I6; 1110 break; 1111 case 0x9: 1112 op = ASM_OP_POPCNT, fmt = ASM_FMT_I9; 1113 break; 1114 } 1115 break; 1116 case 0x8: 1117 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1118 case 0x1: 1119 op = ASM_OP_PMIN1_U, fmt = ASM_FMT_I2; 1120 break; 1121 case 0x4: 1122 op = ASM_OP_UNPACK1_H, fmt = ASM_FMT_I2; 1123 break; 1124 case 0x5: 1125 op = ASM_OP_PMAX1_U, fmt = ASM_FMT_I2; 1126 break; 1127 case 0x6: 1128 op = ASM_OP_UNPACK1_L, fmt = ASM_FMT_I2; 1129 break; 1130 case 0x8: 1131 op = ASM_OP_MIX1_R, fmt = ASM_FMT_I2; 1132 break; 1133 case 0xA: 1134 op = ASM_OP_MIX1_L, fmt = ASM_FMT_I2; 1135 break; 1136 case 0xB: 1137 op = ASM_OP_PSAD1, fmt = ASM_FMT_I2; 1138 break; 1139 } 1140 break; 1141 case 0xA: 1142 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1143 case 0x0: 1144 op = ASM_OP_PACK2_USS, fmt = ASM_FMT_I2; 1145 break; 1146 case 0x2: 1147 op = ASM_OP_PACK2_SSS, fmt = ASM_FMT_I2; 1148 break; 1149 case 0x3: 1150 op = ASM_OP_PMIN2, fmt = ASM_FMT_I2; 1151 break; 1152 case 0x4: 1153 op = ASM_OP_UNPACK2_H, fmt = ASM_FMT_I2; 1154 break; 1155 case 0x6: 1156 op = ASM_OP_UNPACK2_L, fmt = ASM_FMT_I2; 1157 break; 1158 case 0x7: 1159 op = ASM_OP_PMAX2, fmt = ASM_FMT_I2; 1160 break; 1161 case 0x8: 1162 op = ASM_OP_MIX2_R, fmt = ASM_FMT_I2; 1163 break; 1164 case 0xA: 1165 op = ASM_OP_MIX2_L, fmt = ASM_FMT_I2; 1166 break; 1167 case 0xD: 1168 op = ASM_OP_PMPY2_R, fmt = ASM_FMT_I2; 1169 break; 1170 case 0xF: 1171 op = ASM_OP_PMPY2_L, fmt = ASM_FMT_I2; 1172 break; 1173 } 1174 break; 1175 case 0xC: 1176 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1177 case 0xA: 1178 op = ASM_OP_MUX1, fmt = ASM_FMT_I3; 1179 break; 1180 } 1181 break; 1182 case 0xE: 1183 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1184 case 0x5: 1185 op = ASM_OP_PSHL2, fmt = ASM_FMT_I8; 1186 break; 1187 case 0xA: 1188 op = ASM_OP_MUX2, fmt = ASM_FMT_I4; 1189 break; 1190 } 1191 break; 1192 case 0x10: 1193 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1194 case 0x0: 1195 op = ASM_OP_PSHR4_U, fmt = ASM_FMT_I5; 1196 break; 1197 case 0x2: 1198 op = ASM_OP_PSHR4_, fmt = ASM_FMT_I5; 1199 break; 1200 case 0x4: 1201 op = ASM_OP_PSHL4, fmt = ASM_FMT_I7; 1202 break; 1203 } 1204 break; 1205 case 0x12: 1206 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1207 case 0x0: 1208 op = ASM_OP_SHR_U, fmt = ASM_FMT_I5; 1209 break; 1210 case 0x2: 1211 op = ASM_OP_SHR_, fmt = ASM_FMT_I5; 1212 break; 1213 case 0x4: 1214 op = ASM_OP_SHL, fmt = ASM_FMT_I7; 1215 break; 1216 } 1217 break; 1218 case 0x14: 1219 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1220 case 0x1: 1221 op = ASM_OP_PSHR4_U, fmt = ASM_FMT_I6; 1222 break; 1223 case 0x3: 1224 op = ASM_OP_PSHR4_, fmt = ASM_FMT_I6; 1225 break; 1226 } 1227 break; 1228 case 0x18: 1229 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1230 case 0x2: 1231 op = ASM_OP_PACK4_SSS, fmt = ASM_FMT_I2; 1232 break; 1233 case 0x4: 1234 op = ASM_OP_UNPACK4_H, fmt = ASM_FMT_I2; 1235 break; 1236 case 0x6: 1237 op = ASM_OP_UNPACK4_L, fmt = ASM_FMT_I2; 1238 break; 1239 case 0x8: 1240 op = ASM_OP_MIX4_R, fmt = ASM_FMT_I2; 1241 break; 1242 case 0xA: 1243 op = ASM_OP_MIX4_L, fmt = ASM_FMT_I2; 1244 break; 1245 } 1246 break; 1247 case 0x1C: 1248 switch (FIELD(bits, 28, 4)) { /* x2b + x2c */ 1249 case 0x5: 1250 op = ASM_OP_PSHL4, fmt = ASM_FMT_I8; 1251 break; 1252 } 1253 break; 1254 } 1255 break; 1256 } 1257 1258 if (op != ASM_OP_NONE) 1259 return (asm_extract(op, fmt, bits, b, slot)); 1260 return (0); 1261} 1262 1263/* 1264 * Decode M-unit instructions. 1265 */ 1266static int 1267asm_decodeM(uint64_t ip, struct asm_bundle *b, int slot) 1268{ 1269 uint64_t bits; 1270 enum asm_fmt fmt; 1271 enum asm_op op; 1272 1273 bits = SLOT(ip, slot); 1274 if ((int)OPCODE(bits) >= 8) 1275 return (asm_decodeA(bits, b, slot)); 1276 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 1277 1278 switch((int)OPCODE(bits)) { 1279 case 0x0: 1280 switch (FIELD(bits, 33, 3)) { /* x3 */ 1281 case 0x0: 1282 switch (FIELD(bits, 27, 6)) { /* x6 (x4 + x2) */ 1283 case 0x0: 1284 op = ASM_OP_BREAK_M, fmt = ASM_FMT_M37; 1285 break; 1286 case 0x1: 1287 op = ASM_OP_NOP_M, fmt = ASM_FMT_M37; 1288 break; 1289 case 0x4: case 0x14: case 0x24: case 0x34: 1290 op = ASM_OP_SUM, fmt = ASM_FMT_M44; 1291 break; 1292 case 0x5: case 0x15: case 0x25: case 0x35: 1293 op = ASM_OP_RUM, fmt = ASM_FMT_M44; 1294 break; 1295 case 0x6: case 0x16: case 0x26: case 0x36: 1296 op = ASM_OP_SSM, fmt = ASM_FMT_M44; 1297 break; 1298 case 0x7: case 0x17: case 0x27: case 0x37: 1299 op = ASM_OP_RSM, fmt = ASM_FMT_M44; 1300 break; 1301 case 0xA: 1302 op = ASM_OP_LOADRS, fmt = ASM_FMT_M25; 1303 break; 1304 case 0xC: 1305 op = ASM_OP_FLUSHRS, fmt = ASM_FMT_M25; 1306 break; 1307 case 0x10: 1308 op = ASM_OP_INVALA_, fmt = ASM_FMT_M24; 1309 break; 1310 case 0x12: 1311 op = ASM_OP_INVALA_E, fmt = ASM_FMT_M26; 1312 break; 1313 case 0x13: 1314 op = ASM_OP_INVALA_E, fmt = ASM_FMT_M27; 1315 break; 1316 case 0x20: 1317 op = ASM_OP_FWB, fmt = ASM_FMT_M24; 1318 break; 1319 case 0x22: 1320 op = ASM_OP_MF_, fmt = ASM_FMT_M24; 1321 break; 1322 case 0x23: 1323 op = ASM_OP_MF_A, fmt = ASM_FMT_M24; 1324 break; 1325 case 0x28: 1326 op = ASM_OP_MOV_M, fmt = ASM_FMT_M30; 1327 break; 1328 case 0x30: 1329 op = ASM_OP_SRLZ_D, fmt = ASM_FMT_M24; 1330 break; 1331 case 0x31: 1332 op = ASM_OP_SRLZ_I, fmt = ASM_FMT_M24; 1333 break; 1334 case 0x33: 1335 op = ASM_OP_SYNC_I, fmt = ASM_FMT_M24; 1336 break; 1337 } 1338 break; 1339 case 0x4: 1340 op = ASM_OP_CHK_A_NC, fmt = ASM_FMT_M22; 1341 break; 1342 case 0x5: 1343 op = ASM_OP_CHK_A_CLR, fmt = ASM_FMT_M22; 1344 break; 1345 case 0x6: 1346 op = ASM_OP_CHK_A_NC, fmt = ASM_FMT_M23; 1347 break; 1348 case 0x7: 1349 op = ASM_OP_CHK_A_CLR, fmt = ASM_FMT_M23; 1350 break; 1351 } 1352 break; 1353 case 0x1: 1354 switch (FIELD(bits, 33, 3)) { /* x3 */ 1355 case 0x0: 1356 switch (FIELD(bits, 27, 6)) { /* x6 (x4 + x2) */ 1357 case 0x0: 1358 op = ASM_OP_MOV_RR, fmt = ASM_FMT_M42; 1359 break; 1360 case 0x1: 1361 op = ASM_OP_MOV_DBR, fmt = ASM_FMT_M42; 1362 break; 1363 case 0x2: 1364 op = ASM_OP_MOV_IBR, fmt = ASM_FMT_M42; 1365 break; 1366 case 0x3: 1367 op = ASM_OP_MOV_PKR, fmt = ASM_FMT_M42; 1368 break; 1369 case 0x4: 1370 op = ASM_OP_MOV_PMC, fmt = ASM_FMT_M42; 1371 break; 1372 case 0x5: 1373 op = ASM_OP_MOV_PMD, fmt = ASM_FMT_M42; 1374 break; 1375 case 0x6: 1376 op = ASM_OP_MOV_MSR, fmt = ASM_FMT_M42; 1377 break; 1378 case 0x9: 1379 op = ASM_OP_PTC_L, fmt = ASM_FMT_M45; 1380 break; 1381 case 0xA: 1382 op = ASM_OP_PTC_G, fmt = ASM_FMT_M45; 1383 break; 1384 case 0xB: 1385 op = ASM_OP_PTC_GA, fmt = ASM_FMT_M45; 1386 break; 1387 case 0xC: 1388 op = ASM_OP_PTR_D, fmt = ASM_FMT_M45; 1389 break; 1390 case 0xD: 1391 op = ASM_OP_PTR_I, fmt = ASM_FMT_M45; 1392 break; 1393 case 0xE: 1394 op = ASM_OP_ITR_D, fmt = ASM_FMT_M42; 1395 break; 1396 case 0xF: 1397 op = ASM_OP_ITR_I, fmt = ASM_FMT_M42; 1398 break; 1399 case 0x10: 1400 op = ASM_OP_MOV_RR, fmt = ASM_FMT_M43; 1401 break; 1402 case 0x11: 1403 op = ASM_OP_MOV_DBR, fmt = ASM_FMT_M43; 1404 break; 1405 case 0x12: 1406 op = ASM_OP_MOV_IBR, fmt = ASM_FMT_M43; 1407 break; 1408 case 0x13: 1409 op = ASM_OP_MOV_PKR, fmt = ASM_FMT_M43; 1410 break; 1411 case 0x14: 1412 op = ASM_OP_MOV_PMC, fmt = ASM_FMT_M43; 1413 break; 1414 case 0x15: 1415 op = ASM_OP_MOV_PMD, fmt = ASM_FMT_M43; 1416 break; 1417 case 0x16: 1418 op = ASM_OP_MOV_MSR, fmt = ASM_FMT_M43; 1419 break; 1420 case 0x17: 1421 op = ASM_OP_MOV_CPUID, fmt = ASM_FMT_M43; 1422 break; 1423 case 0x18: 1424 op = ASM_OP_PROBE_R, fmt = ASM_FMT_M39; 1425 break; 1426 case 0x19: 1427 op = ASM_OP_PROBE_W, fmt = ASM_FMT_M39; 1428 break; 1429 case 0x1A: 1430 op = ASM_OP_THASH, fmt = ASM_FMT_M46; 1431 break; 1432 case 0x1B: 1433 op = ASM_OP_TTAG, fmt = ASM_FMT_M46; 1434 break; 1435 case 0x1E: 1436 op = ASM_OP_TPA, fmt = ASM_FMT_M46; 1437 break; 1438 case 0x1F: 1439 op = ASM_OP_TAK, fmt = ASM_FMT_M46; 1440 break; 1441 case 0x21: 1442 op = ASM_OP_MOV_PSR_UM, fmt = ASM_FMT_M36; 1443 break; 1444 case 0x22: 1445 op = ASM_OP_MOV_M, fmt = ASM_FMT_M31; 1446 break; 1447 case 0x24: 1448 op = ASM_OP_MOV_, fmt = ASM_FMT_M33; 1449 break; 1450 case 0x25: 1451 op = ASM_OP_MOV_PSR, fmt = ASM_FMT_M36; 1452 break; 1453 case 0x29: 1454 op = ASM_OP_MOV_PSR_UM, fmt = ASM_FMT_M35; 1455 break; 1456 case 0x2A: 1457 op = ASM_OP_MOV_M, fmt = ASM_FMT_M29; 1458 break; 1459 case 0x2C: 1460 op = ASM_OP_MOV_, fmt = ASM_FMT_M32; 1461 break; 1462 case 0x2D: 1463 op = ASM_OP_MOV_PSR_L, fmt = ASM_FMT_M35; 1464 break; 1465 case 0x2E: 1466 op = ASM_OP_ITC_D, fmt = ASM_FMT_M41; 1467 break; 1468 case 0x2F: 1469 op = ASM_OP_ITC_I, fmt = ASM_FMT_M41; 1470 break; 1471 case 0x30: 1472 if (FIELD(bits, 36, 1) == 0) /* x */ 1473 op = ASM_OP_FC_, fmt = ASM_FMT_M28; 1474 else 1475 op = ASM_OP_FC_I, fmt = ASM_FMT_M28; 1476 break; 1477 case 0x31: 1478 op = ASM_OP_PROBE_RW_FAULT, fmt = ASM_FMT_M40; 1479 break; 1480 case 0x32: 1481 op = ASM_OP_PROBE_R_FAULT, fmt = ASM_FMT_M40; 1482 break; 1483 case 0x33: 1484 op = ASM_OP_PROBE_W_FAULT, fmt = ASM_FMT_M40; 1485 break; 1486 case 0x34: 1487 op = ASM_OP_PTC_E, fmt = ASM_FMT_M28; 1488 break; 1489 case 0x38: 1490 op = ASM_OP_PROBE_R, fmt = ASM_FMT_M38; 1491 break; 1492 case 0x39: 1493 op = ASM_OP_PROBE_W, fmt = ASM_FMT_M38; 1494 break; 1495 } 1496 break; 1497 case 0x1: 1498 op = ASM_OP_CHK_S_M, fmt = ASM_FMT_M20; 1499 break; 1500 case 0x3: 1501 op = ASM_OP_CHK_S, fmt = ASM_FMT_M21; 1502 break; 1503 case 0x6: 1504 op = ASM_OP_ALLOC, fmt = ASM_FMT_M34; 1505 break; 1506 } 1507 break; 1508 case 0x4: 1509 if (FIELD(bits, 27, 1) == 0) { /* x */ 1510 switch (FIELD(bits, 30, 7)) { /* x6 + m */ 1511 case 0x0: 1512 op = ASM_OP_LD1_, fmt = ASM_FMT_M1; 1513 break; 1514 case 0x1: 1515 op = ASM_OP_LD2_, fmt = ASM_FMT_M1; 1516 break; 1517 case 0x2: 1518 op = ASM_OP_LD4_, fmt = ASM_FMT_M1; 1519 break; 1520 case 0x3: 1521 op = ASM_OP_LD8_, fmt = ASM_FMT_M1; 1522 break; 1523 case 0x4: 1524 op = ASM_OP_LD1_S, fmt = ASM_FMT_M1; 1525 break; 1526 case 0x5: 1527 op = ASM_OP_LD2_S, fmt = ASM_FMT_M1; 1528 break; 1529 case 0x6: 1530 op = ASM_OP_LD4_S, fmt = ASM_FMT_M1; 1531 break; 1532 case 0x7: 1533 op = ASM_OP_LD8_S, fmt = ASM_FMT_M1; 1534 break; 1535 case 0x8: 1536 op = ASM_OP_LD1_A, fmt = ASM_FMT_M1; 1537 break; 1538 case 0x9: 1539 op = ASM_OP_LD2_A, fmt = ASM_FMT_M1; 1540 break; 1541 case 0xA: 1542 op = ASM_OP_LD4_A, fmt = ASM_FMT_M1; 1543 break; 1544 case 0xB: 1545 op = ASM_OP_LD8_A, fmt = ASM_FMT_M1; 1546 break; 1547 case 0xC: 1548 op = ASM_OP_LD1_SA, fmt = ASM_FMT_M1; 1549 break; 1550 case 0xD: 1551 op = ASM_OP_LD2_SA, fmt = ASM_FMT_M1; 1552 break; 1553 case 0xE: 1554 op = ASM_OP_LD4_SA, fmt = ASM_FMT_M1; 1555 break; 1556 case 0xF: 1557 op = ASM_OP_LD8_SA, fmt = ASM_FMT_M1; 1558 break; 1559 case 0x10: 1560 op = ASM_OP_LD1_BIAS, fmt = ASM_FMT_M1; 1561 break; 1562 case 0x11: 1563 op = ASM_OP_LD2_BIAS, fmt = ASM_FMT_M1; 1564 break; 1565 case 0x12: 1566 op = ASM_OP_LD4_BIAS, fmt = ASM_FMT_M1; 1567 break; 1568 case 0x13: 1569 op = ASM_OP_LD8_BIAS, fmt = ASM_FMT_M1; 1570 break; 1571 case 0x14: 1572 op = ASM_OP_LD1_ACQ, fmt = ASM_FMT_M1; 1573 break; 1574 case 0x15: 1575 op = ASM_OP_LD2_ACQ, fmt = ASM_FMT_M1; 1576 break; 1577 case 0x16: 1578 op = ASM_OP_LD4_ACQ, fmt = ASM_FMT_M1; 1579 break; 1580 case 0x17: 1581 op = ASM_OP_LD8_ACQ, fmt = ASM_FMT_M1; 1582 break; 1583 case 0x1B: 1584 op = ASM_OP_LD8_FILL, fmt = ASM_FMT_M1; 1585 break; 1586 case 0x20: 1587 op = ASM_OP_LD1_C_CLR, fmt = ASM_FMT_M1; 1588 break; 1589 case 0x21: 1590 op = ASM_OP_LD2_C_CLR, fmt = ASM_FMT_M1; 1591 break; 1592 case 0x22: 1593 op = ASM_OP_LD4_C_CLR, fmt = ASM_FMT_M1; 1594 break; 1595 case 0x23: 1596 op = ASM_OP_LD8_C_CLR, fmt = ASM_FMT_M1; 1597 break; 1598 case 0x24: 1599 op = ASM_OP_LD1_C_NC, fmt = ASM_FMT_M1; 1600 break; 1601 case 0x25: 1602 op = ASM_OP_LD2_C_NC, fmt = ASM_FMT_M1; 1603 break; 1604 case 0x26: 1605 op = ASM_OP_LD4_C_NC, fmt = ASM_FMT_M1; 1606 break; 1607 case 0x27: 1608 op = ASM_OP_LD8_C_NC, fmt = ASM_FMT_M1; 1609 break; 1610 case 0x28: 1611 op = ASM_OP_LD1_C_CLR_ACQ, fmt = ASM_FMT_M1; 1612 break; 1613 case 0x29: 1614 op = ASM_OP_LD2_C_CLR_ACQ, fmt = ASM_FMT_M1; 1615 break; 1616 case 0x2A: 1617 op = ASM_OP_LD4_C_CLR_ACQ, fmt = ASM_FMT_M1; 1618 break; 1619 case 0x2B: 1620 op = ASM_OP_LD8_C_CLR_ACQ, fmt = ASM_FMT_M1; 1621 break; 1622 case 0x30: 1623 op = ASM_OP_ST1_, fmt = ASM_FMT_M4; 1624 break; 1625 case 0x31: 1626 op = ASM_OP_ST2_, fmt = ASM_FMT_M4; 1627 break; 1628 case 0x32: 1629 op = ASM_OP_ST4_, fmt = ASM_FMT_M4; 1630 break; 1631 case 0x33: 1632 op = ASM_OP_ST8_, fmt = ASM_FMT_M4; 1633 break; 1634 case 0x34: 1635 op = ASM_OP_ST1_REL, fmt = ASM_FMT_M4; 1636 break; 1637 case 0x35: 1638 op = ASM_OP_ST2_REL, fmt = ASM_FMT_M4; 1639 break; 1640 case 0x36: 1641 op = ASM_OP_ST4_REL, fmt = ASM_FMT_M4; 1642 break; 1643 case 0x37: 1644 op = ASM_OP_ST8_REL, fmt = ASM_FMT_M4; 1645 break; 1646 case 0x3B: 1647 op = ASM_OP_ST8_SPILL, fmt = ASM_FMT_M4; 1648 break; 1649 case 0x40: 1650 op = ASM_OP_LD1_, fmt = ASM_FMT_M2; 1651 break; 1652 case 0x41: 1653 op = ASM_OP_LD2_, fmt = ASM_FMT_M2; 1654 break; 1655 case 0x42: 1656 op = ASM_OP_LD4_, fmt = ASM_FMT_M2; 1657 break; 1658 case 0x43: 1659 op = ASM_OP_LD8_, fmt = ASM_FMT_M2; 1660 break; 1661 case 0x44: 1662 op = ASM_OP_LD1_S, fmt = ASM_FMT_M2; 1663 break; 1664 case 0x45: 1665 op = ASM_OP_LD2_S, fmt = ASM_FMT_M2; 1666 break; 1667 case 0x46: 1668 op = ASM_OP_LD4_S, fmt = ASM_FMT_M2; 1669 break; 1670 case 0x47: 1671 op = ASM_OP_LD8_S, fmt = ASM_FMT_M2; 1672 break; 1673 case 0x48: 1674 op = ASM_OP_LD1_A, fmt = ASM_FMT_M2; 1675 break; 1676 case 0x49: 1677 op = ASM_OP_LD2_A, fmt = ASM_FMT_M2; 1678 break; 1679 case 0x4A: 1680 op = ASM_OP_LD4_A, fmt = ASM_FMT_M2; 1681 break; 1682 case 0x4B: 1683 op = ASM_OP_LD8_A, fmt = ASM_FMT_M2; 1684 break; 1685 case 0x4C: 1686 op = ASM_OP_LD1_SA, fmt = ASM_FMT_M2; 1687 break; 1688 case 0x4D: 1689 op = ASM_OP_LD2_SA, fmt = ASM_FMT_M2; 1690 break; 1691 case 0x4E: 1692 op = ASM_OP_LD4_SA, fmt = ASM_FMT_M2; 1693 break; 1694 case 0x4F: 1695 op = ASM_OP_LD8_SA, fmt = ASM_FMT_M2; 1696 break; 1697 case 0x50: 1698 op = ASM_OP_LD1_BIAS, fmt = ASM_FMT_M2; 1699 break; 1700 case 0x51: 1701 op = ASM_OP_LD2_BIAS, fmt = ASM_FMT_M2; 1702 break; 1703 case 0x52: 1704 op = ASM_OP_LD4_BIAS, fmt = ASM_FMT_M2; 1705 break; 1706 case 0x53: 1707 op = ASM_OP_LD8_BIAS, fmt = ASM_FMT_M2; 1708 break; 1709 case 0x54: 1710 op = ASM_OP_LD1_ACQ, fmt = ASM_FMT_M2; 1711 break; 1712 case 0x55: 1713 op = ASM_OP_LD2_ACQ, fmt = ASM_FMT_M2; 1714 break; 1715 case 0x56: 1716 op = ASM_OP_LD4_ACQ, fmt = ASM_FMT_M2; 1717 break; 1718 case 0x57: 1719 op = ASM_OP_LD8_ACQ, fmt = ASM_FMT_M2; 1720 break; 1721 case 0x5B: 1722 op = ASM_OP_LD8_FILL, fmt = ASM_FMT_M2; 1723 break; 1724 case 0x60: 1725 op = ASM_OP_LD1_C_CLR, fmt = ASM_FMT_M2; 1726 break; 1727 case 0x61: 1728 op = ASM_OP_LD2_C_CLR, fmt = ASM_FMT_M2; 1729 break; 1730 case 0x62: 1731 op = ASM_OP_LD4_C_CLR, fmt = ASM_FMT_M2; 1732 break; 1733 case 0x63: 1734 op = ASM_OP_LD8_C_CLR, fmt = ASM_FMT_M2; 1735 break; 1736 case 0x64: 1737 op = ASM_OP_LD1_C_NC, fmt = ASM_FMT_M2; 1738 break; 1739 case 0x65: 1740 op = ASM_OP_LD2_C_NC, fmt = ASM_FMT_M2; 1741 break; 1742 case 0x66: 1743 op = ASM_OP_LD4_C_NC, fmt = ASM_FMT_M2; 1744 break; 1745 case 0x67: 1746 op = ASM_OP_LD8_C_NC, fmt = ASM_FMT_M2; 1747 break; 1748 case 0x68: 1749 op = ASM_OP_LD1_C_CLR_ACQ, fmt = ASM_FMT_M2; 1750 break; 1751 case 0x69: 1752 op = ASM_OP_LD2_C_CLR_ACQ, fmt = ASM_FMT_M2; 1753 break; 1754 case 0x6A: 1755 op = ASM_OP_LD4_C_CLR_ACQ, fmt = ASM_FMT_M2; 1756 break; 1757 case 0x6B: 1758 op = ASM_OP_LD8_C_CLR_ACQ, fmt = ASM_FMT_M2; 1759 break; 1760 } 1761 } else { 1762 switch (FIELD(bits, 30, 7)) { /* x6 + m */ 1763 case 0x0: 1764 op = ASM_OP_CMPXCHG1_ACQ, fmt = ASM_FMT_M16; 1765 break; 1766 case 0x1: 1767 op = ASM_OP_CMPXCHG2_ACQ, fmt = ASM_FMT_M16; 1768 break; 1769 case 0x2: 1770 op = ASM_OP_CMPXCHG4_ACQ, fmt = ASM_FMT_M16; 1771 break; 1772 case 0x3: 1773 op = ASM_OP_CMPXCHG8_ACQ, fmt = ASM_FMT_M16; 1774 break; 1775 case 0x4: 1776 op = ASM_OP_CMPXCHG1_REL, fmt = ASM_FMT_M16; 1777 break; 1778 case 0x5: 1779 op = ASM_OP_CMPXCHG2_REL, fmt = ASM_FMT_M16; 1780 break; 1781 case 0x6: 1782 op = ASM_OP_CMPXCHG4_REL, fmt = ASM_FMT_M16; 1783 break; 1784 case 0x7: 1785 op = ASM_OP_CMPXCHG8_REL, fmt = ASM_FMT_M16; 1786 break; 1787 case 0x8: 1788 op = ASM_OP_XCHG1, fmt = ASM_FMT_M16; 1789 break; 1790 case 0x9: 1791 op = ASM_OP_XCHG2, fmt = ASM_FMT_M16; 1792 break; 1793 case 0xA: 1794 op = ASM_OP_XCHG4, fmt = ASM_FMT_M16; 1795 break; 1796 case 0xB: 1797 op = ASM_OP_XCHG8, fmt = ASM_FMT_M16; 1798 break; 1799 case 0x12: 1800 op = ASM_OP_FETCHADD4_ACQ, fmt = ASM_FMT_M17; 1801 break; 1802 case 0x13: 1803 op = ASM_OP_FETCHADD8_ACQ, fmt = ASM_FMT_M17; 1804 break; 1805 case 0x16: 1806 op = ASM_OP_FETCHADD4_REL, fmt = ASM_FMT_M17; 1807 break; 1808 case 0x17: 1809 op = ASM_OP_FETCHADD8_REL, fmt = ASM_FMT_M17; 1810 break; 1811 case 0x1C: 1812 op = ASM_OP_GETF_SIG, fmt = ASM_FMT_M19; 1813 break; 1814 case 0x1D: 1815 op = ASM_OP_GETF_EXP, fmt = ASM_FMT_M19; 1816 break; 1817 case 0x1E: 1818 op = ASM_OP_GETF_S, fmt = ASM_FMT_M19; 1819 break; 1820 case 0x1F: 1821 op = ASM_OP_GETF_D, fmt = ASM_FMT_M19; 1822 break; 1823 case 0x20: 1824 op = ASM_OP_CMP8XCHG16_ACQ, fmt = ASM_FMT_M16; 1825 break; 1826 case 0x24: 1827 op = ASM_OP_CMP8XCHG16_REL, fmt = ASM_FMT_M16; 1828 break; 1829 case 0x28: 1830 op = ASM_OP_LD16_, fmt = ASM_FMT_M1; 1831 break; 1832 case 0x2C: 1833 op = ASM_OP_LD16_ACQ, fmt = ASM_FMT_M1; 1834 break; 1835 case 0x30: 1836 op = ASM_OP_ST16_, fmt = ASM_FMT_M4; 1837 break; 1838 case 0x34: 1839 op = ASM_OP_ST16_REL, fmt = ASM_FMT_M4; 1840 break; 1841 } 1842 } 1843 break; 1844 case 0x5: 1845 switch (FIELD(bits, 30, 6)) { /* x6 */ 1846 case 0x0: 1847 op = ASM_OP_LD1_, fmt = ASM_FMT_M3; 1848 break; 1849 case 0x1: 1850 op = ASM_OP_LD2_, fmt = ASM_FMT_M3; 1851 break; 1852 case 0x2: 1853 op = ASM_OP_LD4_, fmt = ASM_FMT_M3; 1854 break; 1855 case 0x3: 1856 op = ASM_OP_LD8_, fmt = ASM_FMT_M3; 1857 break; 1858 case 0x4: 1859 op = ASM_OP_LD1_S, fmt = ASM_FMT_M3; 1860 break; 1861 case 0x5: 1862 op = ASM_OP_LD2_S, fmt = ASM_FMT_M3; 1863 break; 1864 case 0x6: 1865 op = ASM_OP_LD4_S, fmt = ASM_FMT_M3; 1866 break; 1867 case 0x7: 1868 op = ASM_OP_LD8_S, fmt = ASM_FMT_M3; 1869 break; 1870 case 0x8: 1871 op = ASM_OP_LD1_A, fmt = ASM_FMT_M3; 1872 break; 1873 case 0x9: 1874 op = ASM_OP_LD2_A, fmt = ASM_FMT_M3; 1875 break; 1876 case 0xA: 1877 op = ASM_OP_LD4_A, fmt = ASM_FMT_M3; 1878 break; 1879 case 0xB: 1880 op = ASM_OP_LD8_A, fmt = ASM_FMT_M3; 1881 break; 1882 case 0xC: 1883 op = ASM_OP_LD1_SA, fmt = ASM_FMT_M3; 1884 break; 1885 case 0xD: 1886 op = ASM_OP_LD2_SA, fmt = ASM_FMT_M3; 1887 break; 1888 case 0xE: 1889 op = ASM_OP_LD4_SA, fmt = ASM_FMT_M3; 1890 break; 1891 case 0xF: 1892 op = ASM_OP_LD8_SA, fmt = ASM_FMT_M3; 1893 break; 1894 case 0x10: 1895 op = ASM_OP_LD1_BIAS, fmt = ASM_FMT_M3; 1896 break; 1897 case 0x11: 1898 op = ASM_OP_LD2_BIAS, fmt = ASM_FMT_M3; 1899 break; 1900 case 0x12: 1901 op = ASM_OP_LD4_BIAS, fmt = ASM_FMT_M3; 1902 break; 1903 case 0x13: 1904 op = ASM_OP_LD8_BIAS, fmt = ASM_FMT_M3; 1905 break; 1906 case 0x14: 1907 op = ASM_OP_LD1_ACQ, fmt = ASM_FMT_M3; 1908 break; 1909 case 0x15: 1910 op = ASM_OP_LD2_ACQ, fmt = ASM_FMT_M3; 1911 break; 1912 case 0x16: 1913 op = ASM_OP_LD4_ACQ, fmt = ASM_FMT_M3; 1914 break; 1915 case 0x17: 1916 op = ASM_OP_LD8_ACQ, fmt = ASM_FMT_M3; 1917 break; 1918 case 0x1B: 1919 op = ASM_OP_LD8_FILL, fmt = ASM_FMT_M3; 1920 break; 1921 case 0x20: 1922 op = ASM_OP_LD1_C_CLR, fmt = ASM_FMT_M3; 1923 break; 1924 case 0x21: 1925 op = ASM_OP_LD2_C_CLR, fmt = ASM_FMT_M3; 1926 break; 1927 case 0x22: 1928 op = ASM_OP_LD4_C_CLR, fmt = ASM_FMT_M3; 1929 break; 1930 case 0x23: 1931 op = ASM_OP_LD8_C_CLR, fmt = ASM_FMT_M3; 1932 break; 1933 case 0x24: 1934 op = ASM_OP_LD1_C_NC, fmt = ASM_FMT_M3; 1935 break; 1936 case 0x25: 1937 op = ASM_OP_LD2_C_NC, fmt = ASM_FMT_M3; 1938 break; 1939 case 0x26: 1940 op = ASM_OP_LD4_C_NC, fmt = ASM_FMT_M3; 1941 break; 1942 case 0x27: 1943 op = ASM_OP_LD8_C_NC, fmt = ASM_FMT_M3; 1944 break; 1945 case 0x28: 1946 op = ASM_OP_LD1_C_CLR_ACQ, fmt = ASM_FMT_M3; 1947 break; 1948 case 0x29: 1949 op = ASM_OP_LD2_C_CLR_ACQ, fmt = ASM_FMT_M3; 1950 break; 1951 case 0x2A: 1952 op = ASM_OP_LD4_C_CLR_ACQ, fmt = ASM_FMT_M3; 1953 break; 1954 case 0x2B: 1955 op = ASM_OP_LD8_C_CLR_ACQ, fmt = ASM_FMT_M3; 1956 break; 1957 case 0x30: 1958 op = ASM_OP_ST1_, fmt = ASM_FMT_M5; 1959 break; 1960 case 0x31: 1961 op = ASM_OP_ST2_, fmt = ASM_FMT_M5; 1962 break; 1963 case 0x32: 1964 op = ASM_OP_ST4_, fmt = ASM_FMT_M5; 1965 break; 1966 case 0x33: 1967 op = ASM_OP_ST8_, fmt = ASM_FMT_M5; 1968 break; 1969 case 0x34: 1970 op = ASM_OP_ST1_REL, fmt = ASM_FMT_M5; 1971 break; 1972 case 0x35: 1973 op = ASM_OP_ST2_REL, fmt = ASM_FMT_M5; 1974 break; 1975 case 0x36: 1976 op = ASM_OP_ST4_REL, fmt = ASM_FMT_M5; 1977 break; 1978 case 0x37: 1979 op = ASM_OP_ST8_REL, fmt = ASM_FMT_M5; 1980 break; 1981 case 0x3B: 1982 op = ASM_OP_ST8_SPILL, fmt = ASM_FMT_M5; 1983 break; 1984 } 1985 break; 1986 case 0x6: 1987 if (FIELD(bits, 27, 1) == 0) { /* x */ 1988 switch (FIELD(bits, 30, 7)) { /* x6 + m */ 1989 case 0x0: 1990 op = ASM_OP_LDFE_, fmt = ASM_FMT_M6; 1991 break; 1992 case 0x1: 1993 op = ASM_OP_LDF8_, fmt = ASM_FMT_M6; 1994 break; 1995 case 0x2: 1996 op = ASM_OP_LDFS_, fmt = ASM_FMT_M6; 1997 break; 1998 case 0x3: 1999 op = ASM_OP_LDFD_, fmt = ASM_FMT_M6; 2000 break; 2001 case 0x4: 2002 op = ASM_OP_LDFE_S, fmt = ASM_FMT_M6; 2003 break; 2004 case 0x5: 2005 op = ASM_OP_LDF8_S, fmt = ASM_FMT_M6; 2006 break; 2007 case 0x6: 2008 op = ASM_OP_LDFS_S, fmt = ASM_FMT_M6; 2009 break; 2010 case 0x7: 2011 op = ASM_OP_LDFD_S, fmt = ASM_FMT_M6; 2012 break; 2013 case 0x8: 2014 op = ASM_OP_LDFE_A, fmt = ASM_FMT_M6; 2015 break; 2016 case 0x9: 2017 op = ASM_OP_LDF8_A, fmt = ASM_FMT_M6; 2018 break; 2019 case 0xA: 2020 op = ASM_OP_LDFS_A, fmt = ASM_FMT_M6; 2021 break; 2022 case 0xB: 2023 op = ASM_OP_LDFD_A, fmt = ASM_FMT_M6; 2024 break; 2025 case 0xC: 2026 op = ASM_OP_LDFE_SA, fmt = ASM_FMT_M6; 2027 break; 2028 case 0xD: 2029 op = ASM_OP_LDF8_SA, fmt = ASM_FMT_M6; 2030 break; 2031 case 0xE: 2032 op = ASM_OP_LDFS_SA, fmt = ASM_FMT_M6; 2033 break; 2034 case 0xF: 2035 op = ASM_OP_LDFD_SA, fmt = ASM_FMT_M6; 2036 break; 2037 case 0x1B: 2038 op = ASM_OP_LDF_FILL, fmt = ASM_FMT_M6; 2039 break; 2040 case 0x20: 2041 op = ASM_OP_LDFE_C_CLR, fmt = ASM_FMT_M6; 2042 break; 2043 case 0x21: 2044 op = ASM_OP_LDF8_C_CLR, fmt = ASM_FMT_M6; 2045 break; 2046 case 0x22: 2047 op = ASM_OP_LDFS_C_CLR, fmt = ASM_FMT_M6; 2048 break; 2049 case 0x23: 2050 op = ASM_OP_LDFD_C_CLR, fmt = ASM_FMT_M6; 2051 break; 2052 case 0x24: 2053 op = ASM_OP_LDFE_C_NC, fmt = ASM_FMT_M6; 2054 break; 2055 case 0x25: 2056 op = ASM_OP_LDF8_C_NC, fmt = ASM_FMT_M6; 2057 break; 2058 case 0x26: 2059 op = ASM_OP_LDFS_C_NC, fmt = ASM_FMT_M6; 2060 break; 2061 case 0x27: 2062 op = ASM_OP_LDFD_C_NC, fmt = ASM_FMT_M6; 2063 break; 2064 case 0x2C: 2065 op = ASM_OP_LFETCH_, fmt = ASM_FMT_M13; 2066 break; 2067 case 0x2D: 2068 op = ASM_OP_LFETCH_EXCL, fmt = ASM_FMT_M13; 2069 break; 2070 case 0x2E: 2071 op = ASM_OP_LFETCH_FAULT, fmt = ASM_FMT_M13; 2072 break; 2073 case 0x2F: 2074 op = ASM_OP_LFETCH_FAULT_EXCL, 2075 fmt = ASM_FMT_M13; 2076 break; 2077 case 0x30: 2078 op = ASM_OP_STFE, fmt = ASM_FMT_M9; 2079 break; 2080 case 0x31: 2081 op = ASM_OP_STF8, fmt = ASM_FMT_M9; 2082 break; 2083 case 0x32: 2084 op = ASM_OP_STFS, fmt = ASM_FMT_M9; 2085 break; 2086 case 0x33: 2087 op = ASM_OP_STFD, fmt = ASM_FMT_M9; 2088 break; 2089 case 0x3B: 2090 op = ASM_OP_STF_SPILL, fmt = ASM_FMT_M9; 2091 break; 2092 case 0x40: 2093 op = ASM_OP_LDFE_, fmt = ASM_FMT_M7; 2094 break; 2095 case 0x41: 2096 op = ASM_OP_LDF8_, fmt = ASM_FMT_M7; 2097 break; 2098 case 0x42: 2099 op = ASM_OP_LDFS_, fmt = ASM_FMT_M7; 2100 break; 2101 case 0x43: 2102 op = ASM_OP_LDFD_, fmt = ASM_FMT_M7; 2103 break; 2104 case 0x44: 2105 op = ASM_OP_LDFE_S, fmt = ASM_FMT_M7; 2106 break; 2107 case 0x45: 2108 op = ASM_OP_LDF8_S, fmt = ASM_FMT_M7; 2109 break; 2110 case 0x46: 2111 op = ASM_OP_LDFS_S, fmt = ASM_FMT_M7; 2112 break; 2113 case 0x47: 2114 op = ASM_OP_LDFD_S, fmt = ASM_FMT_M7; 2115 break; 2116 case 0x48: 2117 op = ASM_OP_LDFE_A, fmt = ASM_FMT_M7; 2118 break; 2119 case 0x49: 2120 op = ASM_OP_LDF8_A, fmt = ASM_FMT_M7; 2121 break; 2122 case 0x4A: 2123 op = ASM_OP_LDFS_A, fmt = ASM_FMT_M7; 2124 break; 2125 case 0x4B: 2126 op = ASM_OP_LDFD_A, fmt = ASM_FMT_M7; 2127 break; 2128 case 0x4C: 2129 op = ASM_OP_LDFE_SA, fmt = ASM_FMT_M7; 2130 break; 2131 case 0x4D: 2132 op = ASM_OP_LDF8_SA, fmt = ASM_FMT_M7; 2133 break; 2134 case 0x4E: 2135 op = ASM_OP_LDFS_SA, fmt = ASM_FMT_M7; 2136 break; 2137 case 0x4F: 2138 op = ASM_OP_LDFD_SA, fmt = ASM_FMT_M7; 2139 break; 2140 case 0x5B: 2141 op = ASM_OP_LDF_FILL, fmt = ASM_FMT_M7; 2142 break; 2143 case 0x60: 2144 op = ASM_OP_LDFE_C_CLR, fmt = ASM_FMT_M7; 2145 break; 2146 case 0x61: 2147 op = ASM_OP_LDF8_C_CLR, fmt = ASM_FMT_M7; 2148 break; 2149 case 0x62: 2150 op = ASM_OP_LDFS_C_CLR, fmt = ASM_FMT_M7; 2151 break; 2152 case 0x63: 2153 op = ASM_OP_LDFD_C_CLR, fmt = ASM_FMT_M7; 2154 break; 2155 case 0x64: 2156 op = ASM_OP_LDFE_C_NC, fmt = ASM_FMT_M7; 2157 break; 2158 case 0x65: 2159 op = ASM_OP_LDF8_C_NC, fmt = ASM_FMT_M7; 2160 break; 2161 case 0x66: 2162 op = ASM_OP_LDFS_C_NC, fmt = ASM_FMT_M7; 2163 break; 2164 case 0x67: 2165 op = ASM_OP_LDFD_C_NC, fmt = ASM_FMT_M7; 2166 break; 2167 case 0x6C: 2168 op = ASM_OP_LFETCH_, fmt = ASM_FMT_M14; 2169 break; 2170 case 0x6D: 2171 op = ASM_OP_LFETCH_EXCL, fmt = ASM_FMT_M14; 2172 break; 2173 case 0x6E: 2174 op = ASM_OP_LFETCH_FAULT, fmt = ASM_FMT_M14; 2175 break; 2176 case 0x6F: 2177 op = ASM_OP_LFETCH_FAULT_EXCL, 2178 fmt = ASM_FMT_M14; 2179 break; 2180 } 2181 } else { 2182 switch (FIELD(bits, 30, 7)) { /* x6 + m */ 2183 case 0x1: 2184 op = ASM_OP_LDFP8_, fmt = ASM_FMT_M11; 2185 break; 2186 case 0x2: 2187 op = ASM_OP_LDFPS_, fmt = ASM_FMT_M11; 2188 break; 2189 case 0x3: 2190 op = ASM_OP_LDFPD_, fmt = ASM_FMT_M11; 2191 break; 2192 case 0x5: 2193 op = ASM_OP_LDFP8_S, fmt = ASM_FMT_M11; 2194 break; 2195 case 0x6: 2196 op = ASM_OP_LDFPS_S, fmt = ASM_FMT_M11; 2197 break; 2198 case 0x7: 2199 op = ASM_OP_LDFPD_S, fmt = ASM_FMT_M11; 2200 break; 2201 case 0x9: 2202 op = ASM_OP_LDFP8_A, fmt = ASM_FMT_M11; 2203 break; 2204 case 0xA: 2205 op = ASM_OP_LDFPS_A, fmt = ASM_FMT_M11; 2206 break; 2207 case 0xB: 2208 op = ASM_OP_LDFPD_A, fmt = ASM_FMT_M11; 2209 break; 2210 case 0xD: 2211 op = ASM_OP_LDFP8_SA, fmt = ASM_FMT_M11; 2212 break; 2213 case 0xE: 2214 op = ASM_OP_LDFPS_SA, fmt = ASM_FMT_M11; 2215 break; 2216 case 0xF: 2217 op = ASM_OP_LDFPD_SA, fmt = ASM_FMT_M11; 2218 break; 2219 case 0x1C: 2220 op = ASM_OP_SETF_SIG, fmt = ASM_FMT_M18; 2221 break; 2222 case 0x1D: 2223 op = ASM_OP_SETF_EXP, fmt = ASM_FMT_M18; 2224 break; 2225 case 0x1E: 2226 op = ASM_OP_SETF_S, fmt = ASM_FMT_M18; 2227 break; 2228 case 0x1F: 2229 op = ASM_OP_SETF_D, fmt = ASM_FMT_M18; 2230 break; 2231 case 0x21: 2232 op = ASM_OP_LDFP8_C_CLR, fmt = ASM_FMT_M11; 2233 break; 2234 case 0x22: 2235 op = ASM_OP_LDFPS_C_CLR, fmt = ASM_FMT_M11; 2236 break; 2237 case 0x23: 2238 op = ASM_OP_LDFPD_C_CLR, fmt = ASM_FMT_M11; 2239 break; 2240 case 0x25: 2241 op = ASM_OP_LDFP8_C_NC, fmt = ASM_FMT_M11; 2242 break; 2243 case 0x26: 2244 op = ASM_OP_LDFPS_C_NC, fmt = ASM_FMT_M11; 2245 break; 2246 case 0x27: 2247 op = ASM_OP_LDFPD_C_NC, fmt = ASM_FMT_M11; 2248 break; 2249 case 0x41: 2250 op = ASM_OP_LDFP8_, fmt = ASM_FMT_M12; 2251 break; 2252 case 0x42: 2253 op = ASM_OP_LDFPS_, fmt = ASM_FMT_M12; 2254 break; 2255 case 0x43: 2256 op = ASM_OP_LDFPD_, fmt = ASM_FMT_M12; 2257 break; 2258 case 0x45: 2259 op = ASM_OP_LDFP8_S, fmt = ASM_FMT_M12; 2260 break; 2261 case 0x46: 2262 op = ASM_OP_LDFPS_S, fmt = ASM_FMT_M12; 2263 break; 2264 case 0x47: 2265 op = ASM_OP_LDFPD_S, fmt = ASM_FMT_M12; 2266 break; 2267 case 0x49: 2268 op = ASM_OP_LDFP8_A, fmt = ASM_FMT_M12; 2269 break; 2270 case 0x4A: 2271 op = ASM_OP_LDFPS_A, fmt = ASM_FMT_M12; 2272 break; 2273 case 0x4B: 2274 op = ASM_OP_LDFPD_A, fmt = ASM_FMT_M12; 2275 break; 2276 case 0x4D: 2277 op = ASM_OP_LDFP8_SA, fmt = ASM_FMT_M12; 2278 break; 2279 case 0x4E: 2280 op = ASM_OP_LDFPS_SA, fmt = ASM_FMT_M12; 2281 break; 2282 case 0x4F: 2283 op = ASM_OP_LDFPD_SA, fmt = ASM_FMT_M12; 2284 break; 2285 case 0x61: 2286 op = ASM_OP_LDFP8_C_CLR, fmt = ASM_FMT_M12; 2287 break; 2288 case 0x62: 2289 op = ASM_OP_LDFPS_C_CLR, fmt = ASM_FMT_M12; 2290 break; 2291 case 0x63: 2292 op = ASM_OP_LDFPD_C_CLR, fmt = ASM_FMT_M12; 2293 break; 2294 case 0x65: 2295 op = ASM_OP_LDFP8_C_NC, fmt = ASM_FMT_M12; 2296 break; 2297 case 0x66: 2298 op = ASM_OP_LDFPS_C_NC, fmt = ASM_FMT_M12; 2299 break; 2300 case 0x67: 2301 op = ASM_OP_LDFPD_C_NC, fmt = ASM_FMT_M12; 2302 break; 2303 } 2304 } 2305 break; 2306 case 0x7: 2307 switch (FIELD(bits, 30, 6)) { /* x6 */ 2308 case 0x0: 2309 op = ASM_OP_LDFE_, fmt = ASM_FMT_M8; 2310 break; 2311 case 0x1: 2312 op = ASM_OP_LDF8_, fmt = ASM_FMT_M8; 2313 break; 2314 case 0x2: 2315 op = ASM_OP_LDFS_, fmt = ASM_FMT_M8; 2316 break; 2317 case 0x3: 2318 op = ASM_OP_LDFD_, fmt = ASM_FMT_M8; 2319 break; 2320 case 0x4: 2321 op = ASM_OP_LDFE_S, fmt = ASM_FMT_M8; 2322 break; 2323 case 0x5: 2324 op = ASM_OP_LDF8_S, fmt = ASM_FMT_M8; 2325 break; 2326 case 0x6: 2327 op = ASM_OP_LDFS_S, fmt = ASM_FMT_M8; 2328 break; 2329 case 0x7: 2330 op = ASM_OP_LDFD_S, fmt = ASM_FMT_M8; 2331 break; 2332 case 0x8: 2333 op = ASM_OP_LDFE_A, fmt = ASM_FMT_M8; 2334 break; 2335 case 0x9: 2336 op = ASM_OP_LDF8_A, fmt = ASM_FMT_M8; 2337 break; 2338 case 0xA: 2339 op = ASM_OP_LDFS_A, fmt = ASM_FMT_M8; 2340 break; 2341 case 0xB: 2342 op = ASM_OP_LDFD_A, fmt = ASM_FMT_M8; 2343 break; 2344 case 0xC: 2345 op = ASM_OP_LDFE_SA, fmt = ASM_FMT_M8; 2346 break; 2347 case 0xD: 2348 op = ASM_OP_LDF8_SA, fmt = ASM_FMT_M8; 2349 break; 2350 case 0xE: 2351 op = ASM_OP_LDFS_SA, fmt = ASM_FMT_M8; 2352 break; 2353 case 0xF: 2354 op = ASM_OP_LDFD_SA, fmt = ASM_FMT_M8; 2355 break; 2356 case 0x1B: 2357 op = ASM_OP_LDF_FILL, fmt = ASM_FMT_M8; 2358 break; 2359 case 0x20: 2360 op = ASM_OP_LDFE_C_CLR, fmt = ASM_FMT_M8; 2361 break; 2362 case 0x21: 2363 op = ASM_OP_LDF8_C_CLR, fmt = ASM_FMT_M8; 2364 break; 2365 case 0x22: 2366 op = ASM_OP_LDFS_C_CLR, fmt = ASM_FMT_M8; 2367 break; 2368 case 0x23: 2369 op = ASM_OP_LDFD_C_CLR, fmt = ASM_FMT_M8; 2370 break; 2371 case 0x24: 2372 op = ASM_OP_LDFE_C_NC, fmt = ASM_FMT_M8; 2373 break; 2374 case 0x25: 2375 op = ASM_OP_LDF8_C_NC, fmt = ASM_FMT_M8; 2376 break; 2377 case 0x26: 2378 op = ASM_OP_LDFS_C_NC, fmt = ASM_FMT_M8; 2379 break; 2380 case 0x27: 2381 op = ASM_OP_LDFD_C_NC, fmt = ASM_FMT_M8; 2382 break; 2383 case 0x2C: 2384 op = ASM_OP_LFETCH_, fmt = ASM_FMT_M15; 2385 break; 2386 case 0x2D: 2387 op = ASM_OP_LFETCH_EXCL, fmt = ASM_FMT_M15; 2388 break; 2389 case 0x2E: 2390 op = ASM_OP_LFETCH_FAULT, fmt = ASM_FMT_M15; 2391 break; 2392 case 0x2F: 2393 op = ASM_OP_LFETCH_FAULT_EXCL, fmt = ASM_FMT_M15; 2394 break; 2395 case 0x30: 2396 op = ASM_OP_STFE, fmt = ASM_FMT_M10; 2397 break; 2398 case 0x31: 2399 op = ASM_OP_STF8, fmt = ASM_FMT_M10; 2400 break; 2401 case 0x32: 2402 op = ASM_OP_STFS, fmt = ASM_FMT_M10; 2403 break; 2404 case 0x33: 2405 op = ASM_OP_STFD, fmt = ASM_FMT_M10; 2406 break; 2407 case 0x3B: 2408 op = ASM_OP_STF_SPILL, fmt = ASM_FMT_M10; 2409 break; 2410 } 2411 break; 2412 } 2413 2414 if (op != ASM_OP_NONE) 2415 return (asm_extract(op, fmt, bits, b, slot)); 2416 return (0); 2417} 2418 2419/* 2420 * Decode X-unit instructions. 2421 */ 2422static int 2423asm_decodeX(uint64_t ip, struct asm_bundle *b, int slot) 2424{ 2425 uint64_t bits; 2426 enum asm_fmt fmt; 2427 enum asm_op op; 2428 2429 KASSERT(slot == 2); 2430 bits = SLOT(ip, slot); 2431 fmt = ASM_FMT_NONE, op = ASM_OP_NONE; 2432 /* Initialize slot 1 (slot - 1) */ 2433 b->b_inst[slot - 1].i_format = ASM_FMT_NONE; 2434 b->b_inst[slot - 1].i_bits = SLOT(ip, slot - 1); 2435 2436 switch((int)OPCODE(bits)) { 2437 case 0x0: 2438 if (FIELD(bits, 33, 3) == 0) { /* x3 */ 2439 switch (FIELD(bits, 27, 6)) { /* x6 */ 2440 case 0x0: 2441 op = ASM_OP_BREAK_X, fmt = ASM_FMT_X1; 2442 break; 2443 case 0x1: 2444 op = ASM_OP_NOP_X, fmt = ASM_FMT_X1; 2445 break; 2446 } 2447 } 2448 break; 2449 case 0x6: 2450 if (FIELD(bits, 20, 1) == 0) 2451 op = ASM_OP_MOVL, fmt = ASM_FMT_X2; 2452 break; 2453 case 0xC: 2454 if (FIELD(bits, 6, 3) == 0) /* btype */ 2455 op = ASM_OP_BRL_COND, fmt = ASM_FMT_X3; 2456 break; 2457 case 0xD: 2458 op = ASM_OP_BRL_CALL, fmt = ASM_FMT_X4; 2459 break; 2460 } 2461 2462 if (op != ASM_OP_NONE) 2463 return (asm_extract(op, fmt, bits, b, slot)); 2464 return (0); 2465} 2466 2467int 2468asm_decode(uint64_t ip, struct asm_bundle *b) 2469{ 2470 const char *tp; 2471 unsigned int slot; 2472 int ok; 2473 2474 memset(b, 0, sizeof(*b)); 2475 2476 b->b_templ = asm_templname[TMPL(ip)]; 2477 if (b->b_templ == 0) 2478 return (0); 2479 2480 slot = 0; 2481 tp = b->b_templ; 2482 2483 ok = 1; 2484 while (ok && *tp != 0) { 2485 switch (*tp++) { 2486 case 'B': 2487 ok = asm_decodeB(ip, b, slot++); 2488 break; 2489 case 'F': 2490 ok = asm_decodeF(ip, b, slot++); 2491 break; 2492 case 'I': 2493 ok = asm_decodeI(ip, b, slot++); 2494 break; 2495 case 'L': 2496 ok = (slot++ == 1) ? 1 : 0; 2497 break; 2498 case 'M': 2499 ok = asm_decodeM(ip, b, slot++); 2500 break; 2501 case 'X': 2502 ok = asm_decodeX(ip, b, slot++); 2503 break; 2504 case ';': 2505 ok = 1; 2506 break; 2507 default: 2508 ok = 0; 2509 break; 2510 } 2511 } 2512 return (ok); 2513} 2514