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