1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27/* 28 * Copyright 2009 Jason King. All rights reserved. 29 * Use is subject to license terms. 30 */ 31 32#include "libdisasm.h" 33#include "libdisasm_impl.h" 34#include "dis_sparc.h" 35#include "dis_sparc_fmt.h" 36 37#define INVALID \ 38{ \ 39 .in_type = INST_NONE, \ 40 .in_arch = 0, \ 41 .in_data = { \ 42 .in_tbl = NULL \ 43 } \ 44} 45 46#define INVALIDA(_arch) \ 47{ \ 48 .in_type = INST_NONE, \ 49 .in_arch = _arch, \ 50 .in_data = { \ 51 .in_tbl = NULL \ 52 } \ 53} 54 55#define INST(_name, _arch, _flags) \ 56{ \ 57 .in_type = INST_DEF, \ 58 .in_arch = _arch, \ 59 .in_data = { \ 60 .in_def = { \ 61 .in_name = _name, \ 62 .in_flags = _flags \ 63 } \ 64 } \ 65} 66 67#define TABLE(_name, _arch) \ 68{ \ 69 .in_type = INST_TBL, \ 70 .in_arch = _arch, \ 71 .in_data = { \ 72 .in_tbl = &_name \ 73 } \ 74} 75 76#define OVERLAY(_idx, _inst) \ 77{ \ 78 .ov_idx = _idx, \ 79 .ov_inst = _inst \ 80} 81 82#define OVERLAY_END { .ov_idx = -1, .ov_inst = INVALID } 83 84#define V8 DIS_SPARC_V8 85#define V9 DIS_SPARC_V9 86#define V9S DIS_SPARC_V9_SGI 87#define V9O DIS_SPARC_V9_OPL 88#define VALL V8|V9|V9S|V9O 89 90/* branches */ 91static const inst_t BPcc_table_def[16] = { 92 INST("bn", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 93 INST("be", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 94 INST("ble", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 95 INST("bl", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 96 97 INST("bleu", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 98 INST("bcs", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 99 INST("bneg", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 100 INST("bvs", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 101 102 INST("ba", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 103 INST("bne", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 104 INST("bg", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 105 INST("bge", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 106 107 INST("bgu", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 108 INST("bcc", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 109 INST("bpos", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)), 110 INST("bvc", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)) 111}; 112 113 114static const table_t BPcc_table = { 115 .tbl_field = 28, 116 .tbl_len = 4, 117 .tbl_ovp = NULL, 118 .tbl_fmt = fmt_branch, 119 .tbl_inp = BPcc_table_def 120}; 121 122static const inst_t Bicc_table_def[16] = { 123 INST("bn", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 124 INST("be", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 125 INST("ble", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 126 INST("bl", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 127 128 INST("bleu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 129 /* docs say it's 'bcs' but disassembler calles it synonym 'blu' */ 130 INST("blu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 131 INST("bneg", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 132 INST("bvs", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 133 134 INST("ba", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 135 INST("bne", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 136 INST("bg", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 137 INST("bge", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 138 139 INST("bgu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 140 /* 141 * while the docs say it's officially 'bcc', existing disassembler 142 * uses the synonym bgeu 143 */ 144 INST("bgeu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 145 INST("bpos", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 146 INST("bvc", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)) 147}; 148 149static const table_t Bicc_table = { 150 .tbl_field = 28, 151 .tbl_len = 4, 152 .tbl_ovp = NULL, 153 .tbl_fmt = fmt_branch, 154 .tbl_inp = Bicc_table_def 155}; 156 157static const inst_t BPr_table_def[16] = { 158 INVALID, 159 INST("brz", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 160 INST("brlez", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 161 INST("brlz", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 162 163 INVALID, 164 INST("brnz", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 165 INST("brgz", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 166 INST("brgez", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)), 167 168 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 169}; 170 171static const table_t BPr_table = { 172 .tbl_field = 28, 173 .tbl_len = 4, 174 .tbl_ovp = NULL, 175 .tbl_fmt = fmt_branch, 176 .tbl_inp = BPr_table_def 177}; 178 179static const inst_t FBPfcc_table_def[16] = { 180 INST("fbn", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 181 INST("fbne", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 182 INST("fblg", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 183 INST("fbul", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 184 185 INST("fbl", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 186 INST("fbug", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 187 INST("fbg", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 188 INST("fbu", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 189 190 INST("fba", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 191 INST("fbe", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 192 INST("fbue", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 193 INST("fbge", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 194 195 INST("fbuge", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 196 INST("fble", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 197 INST("fbule", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)), 198 INST("fbo", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)) 199}; 200 201static const table_t FBPfcc_table = { 202 .tbl_field = 28, 203 .tbl_len = 4, 204 .tbl_ovp = NULL, 205 .tbl_fmt = fmt_branch, 206 .tbl_inp = FBPfcc_table_def 207}; 208 209static const inst_t FBfcc_table_def[16] = { 210 INST("fbn", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 211 INST("fbne", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 212 INST("fblg", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 213 INST("fbul", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 214 215 INST("fbl", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 216 INST("fbug", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 217 INST("fbg", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 218 INST("fbu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 219 220 INST("fba", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 221 INST("fbe", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 222 INST("fbue", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 223 INST("fbge", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 224 225 INST("fbuge", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 226 INST("fble", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 227 INST("fbule", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 228 INST("fbo", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)) 229}; 230 231static const table_t FBfcc_table = { 232 .tbl_field = 28, 233 .tbl_len = 4, 234 .tbl_ovp = NULL, 235 .tbl_fmt = fmt_branch, 236 .tbl_inp = FBfcc_table_def 237}; 238 239static const inst_t CBccc_table_def[16] = { 240 INST("cbn", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 241 INST("cb123", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 242 INST("cb12", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 243 INST("cb13", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 244 INST("cb1", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 245 INST("cb23", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 246 INST("cb2", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 247 INST("cb3", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 248 INST("cba", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 249 INST("cb0", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 250 INST("cb03", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 251 INST("cb02", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 252 INST("cb023", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 253 INST("cb01", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 254 INST("cb013", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)), 255 INST("cb012", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)) 256}; 257 258static const table_t CBccc_table = { 259 .tbl_field = 28, 260 .tbl_len = 4, 261 .tbl_ovp = NULL, 262 .tbl_fmt = fmt_branch, 263 .tbl_inp = CBccc_table_def 264}; 265 266static const inst_t branch_table_def[8] = { 267 INST("unimp", VALL, 0), 268 TABLE(BPcc_table, V9|V9S), 269 TABLE(Bicc_table, VALL), 270 TABLE(BPr_table, V9|V9S), 271 272 INST("sethi", VALL, 0), 273 TABLE(FBPfcc_table, V9|V9S), 274 TABLE(FBfcc_table, VALL), 275 TABLE(CBccc_table, V8) 276}; 277 278static const overlay_t branch_ov_table[] = { 279 OVERLAY(0x00, INST("illtrap", V9|V9S, 0)), 280 OVERLAY_END 281}; 282 283static const table_t branch_table = { 284 .tbl_field = 24, 285 .tbl_len = 3, 286 .tbl_ovp = branch_ov_table, 287 .tbl_fmt = fmt_sethi, 288 .tbl_inp = branch_table_def 289}; 290 291/* load/stores */ 292static const inst_t ls_table_def[64] = { 293 /* 0x00 */ 294 INST("ld", VALL, 0), 295 INST("ldub", VALL, 0), 296 INST("lduh", VALL, 0), 297 INST("ldd", VALL, 0), 298 299 INST("st", VALL, FLG_STORE), 300 INST("stb", VALL, FLG_STORE), 301 INST("sth", VALL, FLG_STORE), 302 INST("std", VALL, FLG_STORE), 303 304 /* 0x08 */ 305 INST("ldsw", V9|V9S, 0), 306 INST("ldsb", VALL, 0), 307 INST("ldsh", VALL, 0), 308 INST("ldx", V9|V9S, 0), 309 310 INVALID, 311 INST("ldstub", VALL, 0), 312 INST("stx", V9|V9S, FLG_STORE), 313 INST("swap", VALL, 0), 314 315 /* 0x10 */ 316 INST("lda", VALL, FLG_ASI), 317 INST("lduba", VALL, FLG_ASI), 318 INST("lduha", VALL, FLG_ASI), 319 INST("ldda", VALL, FLG_ASI), 320 321 INST("sta", VALL, FLG_STORE|FLG_ASI), 322 INST("stba", VALL, FLG_STORE|FLG_ASI), 323 INST("stha", VALL, FLG_STORE|FLG_ASI), 324 INST("stda", VALL, FLG_STORE|FLG_ASI), 325 326 /* 0x18 */ 327 INST("ldswa", V9|V9S, FLG_ASI), 328 INST("ldsba", VALL, FLG_ASI), 329 INST("ldsha", VALL, FLG_ASI), 330 INST("ldxa", V9|V9S, FLG_ASI), 331 332 INVALID, 333 INST("ldstuba", VALL, FLG_ASI), 334 INST("stxa", V9|V9S, FLG_STORE|FLG_ASI), 335 INST("swapa", VALL, FLG_ASI), 336 337 /* 0x20 */ 338 INST("ld", VALL, FLG_RD(REG_FP)), 339 /* ldx on v9 */ 340 INST("ld", VALL, FLG_RD(REG_FSR)), 341 INST("ldq", V9|V9S, FLG_RD(REG_FPQ)), 342 INST("ldd", VALL, FLG_RD(REG_FPD)), 343 344 INST("st", VALL, FLG_STORE|FLG_RD(REG_FP)), 345 /* stx on v9 */ 346 INST("st", VALL, FLG_STORE|FLG_RD(REG_FSR)), 347 INST("stq", VALL, FLG_STORE|FLG_RD(REG_FPQ)), 348 INST("std", VALL, FLG_STORE|FLG_RD(REG_FPD)), 349 350 /* 0x28 */ 351 INVALID, 352 INVALID, 353 INVALID, 354 INVALID, 355 356 INVALID, 357 INST("prefetch", V9|V9S, 0), 358 INVALID, 359 INVALID, 360 361 /* 0x30 */ 362 INST("ld", V8, FLG_RD(REG_CP)), 363 INST("ld", V8, FLG_RD(REG_CSR)), 364 INST("ldqa", V9|V9S, FLG_ASI|FLG_RD(REG_FPQ)), 365 INST("ldd", V8, FLG_RD(REG_CP)), 366 367 INST("st", V8, FLG_STORE|FLG_RD(REG_CP)), 368 INST("st", V8, FLG_STORE|FLG_RD(REG_CSR)), 369 INST("std", V8, FLG_STORE|FLG_RD(REG_CQ)), 370 INST("std", V8, FLG_STORE|FLG_RD(REG_CP)), 371 372 /* 0x38 */ 373 INVALID, 374 INVALID, 375 INVALID, 376 INVALID, 377 378 INST("casa", V9|V9S, 0), 379 INST("prefetcha", V9|V9S, FLG_STORE|FLG_ASI), 380 INST("casxa", V9|V9S, 0), 381 INVALID 382}; 383 384static const overlay_t ld_ov_table[] = { 385 OVERLAY(0x10, INST("lduwa", V9|V9S, FLG_ASI|FLG_RD(REG_INT))), 386 OVERLAY(0x14, INST("stwa", V9|V9S, 387 FLG_STORE|FLG_ASI|FLG_RD(REG_INT))), 388 OVERLAY(0x30, INST("lda", V9|V9S, FLG_ASI|FLG_RD(REG_FP))), 389 OVERLAY(0x33, INST("ldda", V9|V9S, FLG_ASI|FLG_RD(REG_FPD))), 390 391 OVERLAY(0x34, INST("sta", V9|V9S, FLG_STORE|FLG_ASI|FLG_RD(REG_FP))), 392 OVERLAY(0x36, INST("stqa", V9|V9S, 393 FLG_STORE|FLG_ASI|FLG_RD(REG_FPQ))), 394 OVERLAY(0x37, INST("stda", V9|V9S, 395 FLG_STORE|FLG_ASI|FLG_RD(REG_FPD))), 396 397 OVERLAY_END 398}; 399 400static const table_t ls_table = { 401 .tbl_field = 24, 402 .tbl_len = 6, 403 .tbl_ovp = ld_ov_table, 404 .tbl_fmt = fmt_ls, 405 .tbl_inp = ls_table_def 406}; 407 408 409/* ALU operations */ 410static const inst_t Tcc_table_def[16] = { 411 INST("tn", VALL, 0), 412 INST("te", VALL, 0), 413 INST("tle", VALL, 0), 414 INST("tl", VALL, 0), 415 416 INST("tleu", VALL, 0), 417 INST("tcs", VALL, 0), 418 INST("tneg", VALL, 0), 419 INST("tvs", VALL, 0), 420 421 INST("ta", VALL, 0), 422 INST("tne", VALL, 0), 423 INST("tg", VALL, 0), 424 INST("tge", VALL, 0), 425 426 INST("tgu", VALL, 0), 427 INST("tcc", VALL, 0), 428 INST("tpos", VALL, 0), 429 INST("tvc", VALL, 0) 430}; 431 432static const table_t Tcc_table = { 433 .tbl_field = 28, 434 .tbl_len = 4, 435 .tbl_ovp = NULL, 436 .tbl_fmt = fmt_trap, 437 .tbl_inp = Tcc_table_def 438}; 439 440static const inst_t rwin_table_def[32] = { 441 /* 0x00 */ 442 INST("saved", V9|V9S, 0), 443 INST("restored", V9|V9S, 0), 444 INST("allclean", V9|V9S, 0), 445 INST("otherw", V9|V9S, 0), 446 447 INST("normalw", V9|V9S, 0), 448 INST("invalw", V9|V9S, 0), 449 INVALID, 450 INVALID, 451 452 /* 0x08 */ 453 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 454 455 /* 0x10 */ 456 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 457 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 458}; 459 460static const table_t rwin_table = { 461 .tbl_field = 29, 462 .tbl_len = 5, 463 .tbl_ovp = NULL, 464 .tbl_fmt = fmt_regwin, 465 .tbl_inp = rwin_table_def 466}; 467 468static const inst_t tr_table_def[32] = { 469 /* 0x00 */ 470 INST("done", V9|V9S, 0), 471 INST("retry", V9|V9S, 0), 472 INVALID, 473 INVALID, 474 475 INVALID, 476 INVALID, 477 INVALID, 478 INVALID, 479 480 /* 0x08 */ 481 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 482 INST("jpriv", V9, FLG_DISP(DISP19)), 483 484 /* 0x10 */ 485 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 486 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 487}; 488 489static const table_t tr_table = { 490 .tbl_field = 29, 491 .tbl_len = 5, 492 .tbl_ovp = NULL, 493 .tbl_fmt = fmt_trap_ret, 494 .tbl_inp = tr_table_def 495}; 496 497static const inst_t movicc_table_def[16] = { 498 INST("movn", V9|V9S, 0), 499 INST("move", V9|V9S, 0), 500 INST("movle", V9|V9S, 0), 501 INST("movl", V9|V9S, 0), 502 503 INST("movleu", V9|V9S, 0), 504 INST("movcs", V9|V9S, 0), 505 INST("movneg", V9|V9S, 0), 506 INST("movvs", V9|V9S, 0), 507 508 INST("mova", V9|V9S, 0), 509 INST("movne", V9|V9S, 0), 510 INST("movg", V9|V9S, 0), 511 INST("movge", V9|V9S, 0), 512 513 INST("movgu", V9|V9S, 0), 514 INST("movcc", V9|V9S, 0), 515 INST("movpos", V9|V9S, 0), 516 INST("movvc", V9|V9S, 0) 517}; 518 519static const inst_t movfcc_table_def[16] = { 520 INST("movn", V9|V9S, 0), 521 INST("movne", V9|V9S, 0), 522 INST("movlg", V9|V9S, 0), 523 INST("movul", V9|V9S, 0), 524 525 INST("movl", V9|V9S, 0), 526 INST("movug", V9|V9S, 0), 527 INST("movg", V9|V9S, 0), 528 INST("movu", V9|V9S, 0), 529 530 INST("mova", V9|V9S, 0), 531 INST("move", V9|V9S, 0), 532 INST("movue", V9|V9S, 0), 533 INST("movge", V9|V9S, 0), 534 535 INST("movuge", V9|V9S, 0), 536 INST("movle", V9|V9S, 0), 537 INST("movule", V9|V9S, 0), 538 INST("movo", V9|V9S, 0) 539}; 540 541static const table_t movfcc_table = { 542 .tbl_field = 17, 543 .tbl_len = 4, 544 .tbl_ovp = NULL, 545 .tbl_fmt = fmt_movcc, 546 .tbl_inp = movfcc_table_def 547}; 548 549static const table_t movicc_table = { 550 .tbl_field = 17, 551 .tbl_len = 4, 552 .tbl_ovp = NULL, 553 .tbl_fmt = fmt_movcc, 554 .tbl_inp = movicc_table_def 555}; 556 557static const inst_t movcc_table_def[2] = { 558 TABLE(movfcc_table, V9|V9S), 559 TABLE(movicc_table, V9|V9S) 560}; 561 562static const table_t movcc_table = { 563 .tbl_field = 18, 564 .tbl_len = 1, 565 .tbl_ovp = NULL, 566 .tbl_fmt = NULL, 567 .tbl_inp = movcc_table_def 568}; 569 570static const inst_t movr_table_def[8] = { 571 INVALID, 572 /* aka movrz */ 573 INST("movre", V9|V9S, 0), 574 INST("movrlez", V9|V9S, 0), 575 INST("movrlz", V9|V9S, 0), 576 577 INVALID, 578 /* aka movrnz */ 579 INST("movrne", V9|V9S, 0), 580 INST("movrgz", V9|V9S, 0), 581 INST("movrgez", V9|V9S, 0) 582}; 583 584static const table_t movr_table = { 585 .tbl_field = 12, 586 .tbl_len = 3, 587 .tbl_ovp = NULL, 588 .tbl_fmt = fmt_movr, 589 .tbl_inp = movr_table_def 590}; 591 592static const inst_t FPop1_table_def[512] = { 593 /* 0x000 */ 594 INVALID, 595 INST("fmovs", VALL, 596 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 597 INST("fmovd", V9|V9S, 598 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 599 INST("fmovq", V9|V9S, 600 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 601 602 INVALID, 603 INST("fnegs", VALL, 604 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 605 INST("fnegd", V9|V9S, 606 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 607 INST("fnegq", V9|V9S, 608 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 609 610 /* 0x008 */ 611 INVALID, 612 INST("fabss", VALL, 613 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 614 INST("fabsd", V9|V9S, 615 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 616 INST("fabsq", V9|V9S, 617 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 618 619 INVALID, INVALID, INVALID, INVALID, 620 621 /* 0x010 */ 622 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 623 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 624 625 /* 0x020 */ 626 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 627 628 /* 0x028 */ 629 INVALID, 630 INST("fsqrts", VALL, 631 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 632 INST("fsqrtd", VALL, 633 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 634 INST("fsqrtq", VALL, 635 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 636 637 INVALID, INVALID, INVALID, INVALID, 638 639 /* 0x30 */ 640 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 641 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 642 643 /* 0x40 */ 644 INVALID, 645 INST("fadds", VALL, 646 FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 647 INST("faddd", VALL, 648 FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 649 INST("faddq", VALL, 650 FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 651 652 INVALID, 653 INST("fsubs", VALL, 654 FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 655 INST("fsubd", VALL, 656 FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 657 INST("fsubq", VALL, 658 FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 659 660 /* 0x048 */ 661 INVALID, 662 INST("fmuls", VALL, 663 FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 664 INST("fmuld", VALL, 665 FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 666 INST("fmulq", VALL, 667 FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 668 669 INVALID, 670 INST("fdivs", VALL, 671 FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 672 INST("fdivd", VALL, 673 FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 674 INST("fdivq", VALL, 675 FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 676 677 /* 0x050 */ 678 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 679 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 680 681 /* 0x060 */ 682 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 683 684 /* 0x068 */ 685 INVALID, 686 INST("fsmuld", VALL, 687 FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)), 688 INVALID, 689 INVALID, 690 691 INVALID, 692 INVALID, 693 INST("fdmulq", VALL, 694 FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)), 695 INVALID, 696 697 /* 0x070 */ 698 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 699 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 700 701 /* 0x080 */ 702 INVALID, 703 INST("fstox", V9|V9S, 704 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)), 705 INST("fdtox", V9|V9S, 706 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 707 INST("fqtox", V9|V9S, 708 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPD)), 709 710 INST("fxtos", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM| 711 FLG_P3(REG_FP)), 712 INVALID, 713 INVALID, 714 INVALID, 715 716 /* 0x088 */ 717 INST("fxtod", V9|V9S, 718 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 719 INVALID, 720 INVALID, 721 INVALID, 722 723 INST("fxtoq", V9|V9S, 724 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)), 725 INVALID, 726 INVALID, 727 INVALID, 728 729 /* 0x090 */ 730 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 731 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 732 733 /* 0x0a0 */ 734 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 735 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 736 737 /* 0x0b0 */ 738 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 739 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 740 741 /* 0x0c0 */ 742 INVALID, INVALID, INVALID, INVALID, 743 744 INST("fitos", VALL, 745 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 746 INVALID, 747 INST("fdtos", VALL, 748 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FP)), 749 INST("fqtos", VALL, 750 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FP)), 751 752 /* 0x0c8 */ 753 INST("fitod", VALL, 754 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)), 755 INST("fstod", VALL, 756 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)), 757 INVALID, 758 INST("fqtod", VALL, 759 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPD)), 760 761 INST("fitoq", VALL, 762 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPQ)), 763 INST("fstoq", VALL, 764 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPQ)), 765 INST("fdtoq", VALL, 766 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)), 767 INVALID, 768 769 /* 0x0d0 */ 770 INVALID, 771 INST("fstoi", VALL, 772 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 773 INST("fdtoi", VALL, 774 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FP)), 775 INST("fqtoi", VALL, 776 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FP)), 777 INVALID, INVALID, INVALID, INVALID, 778 779 /* 0x0d8 */ 780 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 781 782 /* 0x0e0 */ 783 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 784 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 785 786 /* 0x0f0 */ 787 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 788 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 789 790 /* 0x100 */ 791 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 792 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 793 794 /* 0x110 */ 795 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 796 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 797 798 /* 0x120 */ 799 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 800 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 801 802 /* 0x130 */ 803 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 804 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 805 806 /* 0x140 */ 807 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 808 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 809 810 /* 0x150 */ 811 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 812 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 813 814 /* 0x160 */ 815 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 816 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 817 818 /* 0x170 */ 819 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 820 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 821 822 /* 0x180 */ 823 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 824 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 825 826 /* 0x190 */ 827 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 828 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 829 830 /* 0x1a0 */ 831 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 832 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 833 834 /* 0x1b0 */ 835 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 836 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 837 838 /* 0x1c0 */ 839 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 840 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 841 842 /* 0x1d0 */ 843 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 844 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 845 846 /* 0x1e0 */ 847 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 848 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 849 850 /* 0x1f0 */ 851 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 852 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 853}; 854 855static const table_t FPop1_table = { 856 .tbl_field = 13, 857 .tbl_len = 9, 858 .tbl_ovp = NULL, 859 .tbl_fmt = fmt_fpop1, 860 .tbl_inp = FPop1_table_def 861}; 862 863static const inst_t FPop2_table_def[512] = { 864 /* 0x000 */ 865 INVALID, 866 INST("fmovs", V9|V9S, 867 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 868 INST("fmovd", V9|V9S, 869 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 870 INST("fmovq", V9|V9S, 871 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 872 873 INVALID, INVALID, INVALID, INVALID, 874 875 /* 0x008 */ 876 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 877 878 /* 0x010 */ 879 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 880 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 881 882 /* 0x020 */ 883 INVALID, INVALID, INVALID, INVALID, 884 885 INST("fmovrsz", V9|V9S, 886 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)), 887 INST("fmovrdz", V9|V9S, 888 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 889 INST("fmovrqz", V9|V9S, 890 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 891 INVALID, 892 893 /* 0x028 */ 894 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 895 896 /* 0x030 */ 897 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 898 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 899 900 /* 0x040 */ 901 INVALID, 902 INST("fmovs", V9|V9S, 903 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 904 INST("fmovd", V9|V9S, 905 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 906 INST("fmovq", V9|V9S, 907 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 908 909 INST("fmovrslez", V9|V9S, 910 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)), 911 INST("fmovrdlez", V9|V9S, 912 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 913 INST("fmovrqlez", V9|V9S, 914 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 915 INVALID, 916 917 /* 0x048 */ 918 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 919 920 /* 0x050 */ 921 INVALID, 922 INST("fcmps", VALL, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_NONE) 923 |FLG_NOIMM), 924 INST("fcmpd", VALL, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_NONE) 925 |FLG_NOIMM), 926 INST("fcmpq", VALL, FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_P3(REG_NONE) 927 |FLG_NOIMM), 928 929 INVALID, 930 INST("fcmpes", VALL, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_NONE) 931 |FLG_NOIMM), 932 INST("fcmped", VALL, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_NONE) 933 |FLG_NOIMM), 934 INST("fcmpeq", VALL, FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_P3(REG_NONE) 935 |FLG_NOIMM), 936 937 /* 0x058 */ 938 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 939 940 /* 0x060 */ 941 INVALID, INVALID, INVALID, INVALID, 942 943 INVALID, 944 INST("fmovrslz", V9|V9S, 945 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)), 946 INST("fmovrdlz", V9|V9S, 947 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 948 INST("fmovrqlz", V9|V9S, 949 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 950 951 /* 0x068 */ 952 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 953 954 /* 0x070 */ 955 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 956 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 957 958 /* 0x080 */ 959 INVALID, 960 INST("fmovs", V9|V9S, 961 FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)), 962 INST("fmovd", V9|V9S, 963 FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)), 964 INST("fmovq", V9|V9S, 965 FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)), 966 967 INVALID, INVALID, INVALID, INVALID, 968 969 /* 0x088 */ 970 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 971 972 /* 0x090 */ 973 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 974 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 975 976 /* 0x0a0 */ 977 INVALID, INVALID, INVALID, INVALID, 978 979 INVALID, 980 INST("fmovrsnz", V9|V9S, 981 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)), 982 INST("fmovrdnz", V9|V9S, 983 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 984 INST("fmovrqnz", V9|V9S, 985 FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 986 987 /* 0x0a8 */ 988 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 989 990 /* 0x0b0 */ 991 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 992 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 993 994 /* 0x0c0 */ 995 INVALID, 996 INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)| 997 FLG_NOIMM|FLG_P3(REG_FP)), 998 INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)| 999 FLG_NOIMM|FLG_P3(REG_FPD)), 1000 INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)| 1001 FLG_NOIMM|FLG_P3(REG_FPQ)), 1002 1003 INVALID, 1004 INST("fmovrsgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1005 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1006 INST("fmovrdgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1007 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1008 INST("fmovrqgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1009 FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 1010 1011 /* 0x0c8 */ 1012 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1013 1014 /* 0x0d0 */ 1015 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1016 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1017 1018 /* 0x0e0 */ 1019 INVALID, INVALID, INVALID, INVALID, 1020 1021 INVALID, 1022 INST("fmovrsgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1023 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1024 INST("fmovrdgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1025 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1026 INST("fmovrqgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM| 1027 FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)), 1028 1029 /* 0x0e8 */ 1030 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1031 1032 /* 0x0f0 */ 1033 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1034 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1035 1036 /* 0x100 */ 1037 INVALID, 1038 INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)| 1039 FLG_NOIMM|FLG_P3(REG_FP)), 1040 INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)| 1041 FLG_NOIMM|FLG_P3(REG_FPD)), 1042 INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)| 1043 FLG_NOIMM|FLG_P3(REG_FPQ)), 1044 1045 INVALID, INVALID, INVALID, INVALID, 1046 1047 /* 0x108 */ 1048 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1049 1050 /* 0x110 */ 1051 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1052 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1053 1054 /* 0x120 */ 1055 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1056 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1057 1058 /* 0x130 */ 1059 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1060 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1061 1062 /* 0x140 */ 1063 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1064 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1065 1066 /* 0x150 */ 1067 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1068 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1069 1070 /* 0x160 */ 1071 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1072 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1073 1074 /* 0x170 */ 1075 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1076 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1077 1078 /* 0x180 */ 1079 INVALID, 1080 INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)| 1081 FLG_NOIMM|FLG_P3(REG_FP)), 1082 INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)| 1083 FLG_NOIMM|FLG_P3(REG_FPD)), 1084 INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)| 1085 FLG_NOIMM|FLG_P3(REG_FPQ)), 1086 1087 INVALID, INVALID, INVALID, INVALID, 1088 1089 /* 0x188 */ 1090 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1091 1092 /* 0x190 */ 1093 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1094 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1095 1096 /* 0x1a0 */ 1097 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1098 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1099 1100 /* 0x1b0 */ 1101 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1102 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1103 1104 /* 0x1c0 */ 1105 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1106 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1107 1108 /* 0x1d0 */ 1109 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1110 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1111 1112 /* 0x1e0 */ 1113 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1114 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1115 1116 /* 0x1f0 */ 1117 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1118 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 1119}; 1120 1121static const table_t FPop2_table = { 1122 .tbl_field = 13, 1123 .tbl_len = 9, 1124 .tbl_ovp = NULL, 1125 .tbl_fmt = fmt_fpop2, 1126 .tbl_inp = FPop2_table_def 1127}; 1128 1129static const inst_t vis_table_def[512] = { 1130 /* 0x000 */ 1131 INST("edge8cc", V9S, FLG_NOIMM), 1132 INST("edge8n", V9S, FLG_NOIMM), 1133 INST("edge8lcc", V9S, FLG_NOIMM), 1134 INST("edge8ln", V9S, FLG_NOIMM), 1135 1136 INST("edge16cc", V9S, FLG_NOIMM), 1137 INST("edge16n", V9S, FLG_NOIMM), 1138 INST("edge16lcc", V9S, FLG_NOIMM), 1139 INST("edge16ln", V9S, FLG_NOIMM), 1140 1141 /* 0x008 */ 1142 INST("edge32cc", V9S, FLG_NOIMM), 1143 INST("edge32n", V9S, FLG_NOIMM), 1144 INST("edge32lcc", V9S, FLG_NOIMM), 1145 INST("edge32ln", V9S, FLG_NOIMM), 1146 1147 INVALID, INVALID, INVALID, INVALID, 1148 1149 /* 0x010 */ 1150 INST("array8", V9S, FLG_NOIMM), 1151 INST("addxc", V9, 0), 1152 INST("array16", V9S, FLG_NOIMM), 1153 INST("addxccc", V9, 0), 1154 1155 INST("array32", V9S, FLG_NOIMM), 1156 INST("random", V9, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)| 1157 FLG_RD(REG_FPD)|FLG_NOIMM), 1158 INST("umulxhi", V9, FLG_P1(REG_INT)|FLG_NOIMM| 1159 FLG_P2(REG_INT)|FLG_P3(REG_INT)), 1160 INST("lzd", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1161 FLG_P2(REG_INT)|FLG_RD(REG_INT)), 1162 1163 /* 0x018 */ 1164 INST("alignaddr", V9S, FLG_NOIMM), 1165 INST("bmask", V9S, FLG_P1(REG_INT)|FLG_P2(REG_INT)|FLG_RD(REG_INT)), 1166 INST("alignaddrl", V9S, FLG_NOIMM), 1167 INST("cmask8", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1168 FLG_P2(REG_INT)|FLG_P3(REG_NONE)), 1169 INVALID, 1170 INST("cmask16", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1171 FLG_P2(REG_INT)|FLG_P3(REG_NONE)), 1172 INVALID, 1173 INST("cmask32", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1174 FLG_P2(REG_INT)|FLG_P3(REG_NONE)), 1175 1176 /* 0x020 */ 1177 INST("fcmple16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1178 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1179 INST("fsll16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1180 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1181 INST("fcmpne16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1182 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1183 INST("fsrl16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1184 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1185 1186 INST("fcmple32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1187 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1188 INST("fsll32", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1189 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1190 INST("fcmpne32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1191 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1192 INST("fsrl32", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1193 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1194 1195 /* 0x028 */ 1196 INST("fcmpgt16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1197 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1198 INST("fslas16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1199 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1200 INST("fcmpeq16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1201 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1202 INST("fsra16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1203 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1204 1205 INST("fcmpgt32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1206 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1207 INST("fslas32", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1208 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1209 INST("fcmpeq32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1210 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1211 INST("fsra32", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1212 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1213 1214 /* 0x030 */ 1215 INVALID, 1216 INST("fmul8x16", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1217 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1218 INVALID, 1219 INST("fmul8x16au", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1220 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1221 1222 INVALID, 1223 INST("fmul8x16al", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1224 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1225 INST("fmul8sux16", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1226 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1227 INST("fmul8ulx16", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1228 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1229 1230 /* 0x038 */ 1231 INST("fmuld8sux16", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1232 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1233 INST("fmuld8ulx16", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1234 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1235 INST("fpack32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1236 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1237 INST("fpack16", V9S, FLG_P1(REG_NONE)|FLG_NOIMM| 1238 FLG_P2(REG_FPD)|FLG_P3(REG_FP)), 1239 1240 INVALID, 1241 INST("fpackfix", V9S, FLG_P1(REG_NONE)|FLG_NOIMM| 1242 FLG_P2(REG_FPD)|FLG_P3(REG_FP)), 1243 INST("pdist", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1244 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1245 INST("pdistn", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1246 FLG_P2(REG_FPD)|FLG_P3(REG_INT)), 1247 1248 /* 0x040 */ 1249 INST("fmean16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1250 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1251 INVALID, 1252 INST("fpadd64", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1253 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1254 INVALID, 1255 INST("fchksm16", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1256 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1257 INVALID, 1258 INST("fpsub64", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1259 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1260 INVALID, 1261 1262 /* 0x048 */ 1263 INST("faligndata", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1264 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1265 INVALID, 1266 INVALID, 1267 INST("fpmerge", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1268 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1269 1270 INST("bshuffle", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1271 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1272 INST("fexpand", V9S, FLG_P1(REG_NONE)|FLG_NOIMM| 1273 FLG_P2(REG_FP)|FLG_P3(REG_FPD)), 1274 INVALID, 1275 INVALID, 1276 1277 /* 0x050 */ 1278 INST("fpadd16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1279 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1280 INST("fpadd16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1281 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1282 INST("fpadd32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1283 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1284 INST("fpadd32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1285 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1286 1287 INST("fpsub16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1288 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1289 INST("fpsub16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1290 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1291 INST("fpsub32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1292 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1293 INST("fpsub32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1294 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1295 1296 /* 0x058 */ 1297 INST("fpadds16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1298 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1299 INST("fpadds16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1300 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1301 INST("fpadds32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1302 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1303 INST("fpadds32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1304 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1305 INST("fpsubs16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1306 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1307 INST("fpsubs16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1308 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1309 INST("fpsubs32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1310 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1311 INST("fpsubs32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1312 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1313 1314 /* 0x060 */ 1315 INST("fzero", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)| 1316 FLG_P3(REG_FPD)), 1317 INST("fzeros", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)| 1318 FLG_P3(REG_FP)), 1319 INST("fnor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1320 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1321 INST("fnors", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1322 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1323 1324 INST("fandnot2", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1325 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1326 INST("fandnot2s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1327 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1328 INST("fnot2", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)| 1329 FLG_P3(REG_FPD)), 1330 INST("fnot2s", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)| 1331 FLG_P3(REG_FP)), 1332 1333 /* 0x068 */ 1334 INST("fandnot1", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1335 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1336 INST("fandnot1s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1337 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1338 INST("fnot1", V9S, FLG_P1(REG_FPD)|FLG_P2(REG_NONE)| 1339 FLG_P3(REG_FPD)), 1340 INST("fnot1s", V9S, FLG_P1(REG_FP)|FLG_P2(REG_NONE)| 1341 FLG_P3(REG_FP)), 1342 1343 INST("fxor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1344 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1345 INST("fxors", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1346 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1347 INST("fnand", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1348 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1349 INST("fnands", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1350 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1351 1352 /* 0x070 */ 1353 INST("fand", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1354 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1355 INST("fands", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1356 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1357 INST("fxnor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1358 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1359 INST("fxnors", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1360 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1361 1362 INST("fsrc1", V9S, FLG_P1(REG_FPD)|FLG_P2(REG_NONE)| 1363 FLG_P3(REG_FPD)), 1364 INST("fsrc1s", V9S, FLG_P1(REG_FP)|FLG_P2(REG_NONE)| 1365 FLG_P3(REG_FP)), 1366 INST("fornot2", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1367 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1368 INST("fornot2s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1369 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1370 1371 /* 0x078 */ 1372 INST("fsrc2", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)| 1373 FLG_P3(REG_FPD)), 1374 INST("fsrc2s", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)| 1375 FLG_P3(REG_FP)), 1376 INST("fornot1", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1377 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1378 INST("fornot1s", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1379 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1380 1381 INST("for", V9S, FLG_P1(REG_FPD)|FLG_NOIMM| 1382 FLG_P2(REG_FPD)|FLG_P3(REG_FPD)), 1383 INST("fors", V9S, FLG_P1(REG_FP)|FLG_NOIMM| 1384 FLG_P2(REG_FP)|FLG_P3(REG_FP)), 1385 INST("fone", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)| 1386 FLG_P3(REG_FPD)), 1387 INST("fones", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)| 1388 FLG_P3(REG_FP)), 1389 1390 /* 0x080 */ 1391 INST("shutdown", V9S, 0), 1392 INST("siam", V9S, 0), 1393 INVALID, 1394 INVALID, 1395 1396 INVALID, INVALID, INVALID, INVALID, 1397 1398 /* 0x088 */ 1399 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1400 1401 /* 0x090 */ 1402 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1403 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1404 1405 /* 0x0a0 */ 1406 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1407 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1408 1409 /* 0x0b0 */ 1410 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1411 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1412 1413 /* 0x0c0 */ 1414 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1415 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1416 1417 /* 0x0d0 */ 1418 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1419 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1420 1421 /* 0x0e0 */ 1422 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1423 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1424 1425 /* 0x0f0 */ 1426 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1427 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1428 1429 /* 0x100 */ 1430 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1431 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1432 1433 /* 0x110 */ 1434 INST("movdtox", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1435 FLG_P2(REG_FPD)|FLG_RD(REG_INT)), 1436 INST("movstouw", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1437 FLG_P2(REG_FP)|FLG_RD(REG_INT)), 1438 INVALID, 1439 INST("movstosw", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1440 FLG_P2(REG_FP)|FLG_RD(REG_INT)), 1441 INVALID, 1442 INST("xmulx", V9, FLG_P1(REG_INT)|FLG_NOIMM| 1443 FLG_P2(REG_INT)|FLG_P3(REG_INT)), 1444 INST("xmulxhi", V9, FLG_P1(REG_INT)|FLG_NOIMM| 1445 FLG_P2(REG_INT)|FLG_P3(REG_INT)), 1446 INVALID, 1447 INST("movxtod", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1448 FLG_P2(REG_INT)|FLG_RD(REG_FPD)), 1449 INST("movwtos", V9, FLG_P1(REG_NONE)|FLG_NOIMM| 1450 FLG_P2(REG_INT)|FLG_RD(REG_FP)), 1451 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1452 1453 /* 0x120 */ 1454 INST("fucmple8", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1455 FLG_P2(REG_FPD)|FLG_RD(REG_INT)), 1456 INVALID, 1457 INST("fucmpne8", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1458 FLG_P2(REG_FPD)|FLG_RD(REG_INT)), 1459 INVALID, INVALID, INVALID, INVALID, INVALID, 1460 INST("fucmpgt8", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1461 FLG_P2(REG_FPD)|FLG_RD(REG_INT)), 1462 INVALID, 1463 INST("fucmpeq8", V9, FLG_P1(REG_FPD)|FLG_NOIMM| 1464 FLG_P2(REG_FPD)|FLG_RD(REG_INT)), 1465 INVALID, INVALID, INVALID, INVALID, INVALID, 1466 1467 /* 0x130 */ 1468 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1469 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1470 1471 /* 0x140 */ 1472 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1473 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1474 1475 /* 0x150 */ 1476 INVALID, 1477 INST("flcmps", V9, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_FCC) 1478 |FLG_NOIMM), 1479 INST("flcmpd", V9, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_FCC) 1480 |FLG_NOIMM), 1481 INVALID, INVALID, INVALID, INVALID, INVALID, 1482 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1483 1484 /* 0x160 */ 1485 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1486 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1487 1488 /* 0x170 */ 1489 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1490 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1491 1492 /* 0x180 */ 1493 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1494 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1495 1496 /* 0x190 */ 1497 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1498 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1499 1500 /* 0x1a0 */ 1501 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1502 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1503 1504 /* 0x1b0 */ 1505 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1506 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1507 1508 /* 0x1c0 */ 1509 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1510 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1511 1512 /* 0x1d0 */ 1513 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1514 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1515 1516 /* 0x1e0 */ 1517 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1518 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1519 1520 /* 0x1f0 */ 1521 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, 1522 INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID 1523}; 1524 1525static const table_t vis_table = { 1526 .tbl_field = 13, 1527 .tbl_len = 9, 1528 .tbl_ovp = NULL, 1529 .tbl_fmt = fmt_vis, 1530 .tbl_inp = vis_table_def 1531}; 1532 1533static const inst_t fused_table_def[16] = { 1534 /* 0x0 */ 1535 INVALID, 1536 INST("fmadds", V9, FLG_P1(REG_FP)), 1537 INST("fmaddd", V9, FLG_P1(REG_FPD)), 1538 INVALID, 1539 1540 /* 0x4 */ 1541 INVALID, 1542 INST("fmsubs", V9, FLG_P1(REG_FP)), 1543 INST("fmsubd", V9, FLG_P1(REG_FPD)), 1544 INVALID, 1545 1546 /* 0x8 */ 1547 INVALID, 1548 INST("fnmsubs", V9, FLG_P1(REG_FP)), 1549 INST("fnmsubd", V9, FLG_P1(REG_FPD)), 1550 INVALID, 1551 1552 /* 0xc */ 1553 INVALID, 1554 INST("fnmadds", V9, FLG_P1(REG_FP)), 1555 INST("fnmaddd", V9, FLG_P1(REG_FPD)), 1556 INVALID 1557}; 1558 1559static const table_t fused_table = { 1560 .tbl_field = 8, 1561 .tbl_len = 4, 1562 .tbl_ovp = NULL, 1563 .tbl_fmt = fmt_fused, 1564 .tbl_inp = fused_table_def 1565}; 1566 1567static const inst_t alu_table_def[64] = { 1568 /* 0x00 */ 1569 INST("add", VALL, 0), 1570 INST("and", VALL, 0), 1571 INST("or", VALL, 0), 1572 INST("xor", VALL, 0), 1573 1574 INST("sub", VALL, 0), 1575 INST("andn", VALL, 0), 1576 INST("orn", VALL, 0), 1577 INST("xnor", VALL, 0), 1578 1579 /* 0x08 */ 1580 INST("addx", VALL, 0), 1581 INST("mulx", V9|V9S, 0), 1582 INST("umul", VALL, 0), 1583 INST("smul", VALL, 0), 1584 1585 INST("subx", VALL, 0), 1586 INST("udivx", V9|V9S, 0), 1587 INST("udiv", VALL, 0), 1588 INST("sdiv", VALL, 0), 1589 1590 /* 0x10 */ 1591 INST("addcc", VALL, 0), 1592 INST("andcc", VALL, 0), 1593 INST("orcc", VALL, 0), 1594 INST("xorcc", VALL, 0), 1595 1596 INST("subcc", VALL, 0), 1597 INST("andncc", VALL, 0), 1598 INST("orncc", VALL, 0), 1599 INST("xnorcc", VALL, 0), 1600 1601 /* 0x18 */ 1602 INST("addxcc", VALL, 0), 1603 INVALID, 1604 INST("umulcc", VALL, 0), 1605 INST("smulcc", VALL, 0), 1606 1607 INST("subxcc", VALL, 0), 1608 INVALID, 1609 INST("udivcc", VALL, 0), 1610 INST("sdivcc", VALL, 0), 1611 1612 /* 0x20 */ 1613 INST("taddcc", VALL, 0), 1614 INST("tsubcc", VALL, 0), 1615 INST("taddcctv", VALL, 0), 1616 INST("tsubcctv", VALL, 0), 1617 1618 INST("mulscc", VALL, 0), 1619 INST("sll", VALL, 0), 1620 INST("srl", VALL, 0), 1621 INST("sra", VALL, 0), 1622 1623 /* 0x28 */ 1624 INST("rd", VALL, 0), 1625 INST("rd", V8, 0), 1626 INST("rd", V8, 0), 1627 INST("rd", V8, 0), 1628 1629 TABLE(movcc_table, V9|V9S), 1630 INST("sdivx", V9|V9S, 0), 1631 INST("popc", V9|V9S, 1632 FLG_P1(REG_NONE)|FLG_P2(REG_INT)|FLG_P3(REG_INT)), 1633 TABLE(movr_table, V9|V9S), 1634 1635 /* 0x30 */ 1636 INST("wr", VALL, 0), 1637 INST("wr", V8, 0), 1638 INST("wr", V8, 0), 1639 INST("wr", V8, 0), 1640 1641 TABLE(FPop1_table, VALL), 1642 TABLE(FPop2_table, VALL), 1643 INST("cpop1", V8, 0), 1644 INST("cpop2", V8, 0), /* impdep2 */ 1645 1646 /* 0x38 */ 1647 INST("jmpl", VALL, 0), 1648 INST("rett", VALL, 0), 1649 TABLE(Tcc_table, VALL), 1650 INST("flush", VALL, 0), 1651 1652 INST("save", VALL, 0), 1653 INST("restore", VALL, 0), 1654 TABLE(tr_table, V9|V9S), 1655 INVALID 1656}; 1657 1658 1659static const overlay_t alu_ov_table[] = { 1660 OVERLAY(0x08, INST("addc", V9|V9S, 0)), 1661 OVERLAY(0x0c, INST("subc", V9|V9S, 0)), 1662 OVERLAY(0x18, INST("addccc", V9|V9S, 0)), 1663 OVERLAY(0x1c, INST("subccc", V9|V9S, 0)), 1664 1665 OVERLAY(0x29, INST("rdhpr", V9|V9S, 0)), 1666 OVERLAY(0x2a, INST("rdpr", V9|V9S, 0)), 1667 OVERLAY(0x2b, INST("flushw", V9|V9S, 0)), 1668 OVERLAY(0x31, TABLE(rwin_table, V9|V9S)), 1669 1670 OVERLAY(0x32, INST("wrpr", V9|V9S, 0)), 1671 OVERLAY(0x33, INST("wrhpr", V9|V9S, 0)), 1672 OVERLAY(0x36, TABLE(vis_table, V9S)), 1673 OVERLAY(0x37, TABLE(fused_table, VALL)), 1674 OVERLAY(0x39, INST("return", VALL, 0)), 1675 1676 OVERLAY_END 1677}; 1678 1679static const table_t alu_table = { 1680 .tbl_field = 24, 1681 .tbl_len = 6, 1682 .tbl_ovp = alu_ov_table, 1683 .tbl_fmt = fmt_alu, 1684 .tbl_inp = alu_table_def 1685}; 1686 1687static const inst_t initial_table_def[4] = { 1688 TABLE(branch_table, VALL), 1689 INST("call", VALL, 0), 1690 TABLE(alu_table, VALL), 1691 TABLE(ls_table, VALL) 1692}; 1693 1694/* NOTE: this must not be made static */ 1695const table_t initial_table = { 1696 .tbl_field = 31, 1697 .tbl_len = 2, 1698 .tbl_ovp = NULL, 1699 .tbl_fmt = fmt_call, 1700 .tbl_inp = initial_table_def 1701}; 1702