1139825Simp/*- 280709Sjake * Copyright (c) 1994 David S. Miller, davem@nadzieja.rutgers.edu 380709Sjake * Copyright (c) 1995 Paul Kranenburg 480709Sjake * All rights reserved. 580709Sjake * 680709Sjake * Redistribution and use in source and binary forms, with or without 780709Sjake * modification, are permitted provided that the following conditions 880709Sjake * are met: 980709Sjake * 1. Redistributions of source code must retain the above copyright 1080709Sjake * notice, this list of conditions and the following disclaimer. 1180709Sjake * 2. Redistributions in binary form must reproduce the above copyright 1280709Sjake * notice, this list of conditions and the following disclaimer in the 1380709Sjake * documentation and/or other materials provided with the distribution. 1480709Sjake * 3. All advertising materials mentioning features or use of this software 1580709Sjake * must display the following acknowledgement: 1680709Sjake * This product includes software developed by David Miller. 1780709Sjake * 4. The name of the author may not be used to endorse or promote products 1880709Sjake * derived from this software without specific prior written permission 1980709Sjake * 2080709Sjake * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2180709Sjake * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2280709Sjake * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2380709Sjake * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2480709Sjake * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2580709Sjake * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2680709Sjake * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2780709Sjake * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2880709Sjake * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2980709Sjake * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3080709Sjake * from: NetBSD: db_disasm.c,v 1.9 2000/08/16 11:29:42 pk Exp 3180709Sjake */ 3280709Sjake 33181640Smarius#include <sys/cdefs.h> 34181640Smarius__FBSDID("$FreeBSD$"); 35181640Smarius 3680709Sjake#include <sys/param.h> 37109375Smdodd#include <sys/systm.h> 3880709Sjake 3980709Sjake#include <ddb/ddb.h> 4080709Sjake#include <ddb/db_access.h> 4180709Sjake#include <ddb/db_sym.h> 4280709Sjake 4380709Sjake#include <machine/db_machdep.h> 4486146Stmm#include <machine/instr.h> 4580709Sjake 4680709Sjake#define SIGN(v) (((v)<0)?"-":"") 4780709Sjake 4880709Sjake/* 4980709Sjake * All Sparc instructions are 32-bits, with the one exception being 5080709Sjake * the set instruction which is actually a macro which expands into 5180709Sjake * two instructions... 5280709Sjake * 5380709Sjake * There are 5 different fields that can be used to identify which 5480709Sjake * operation is encoded into a particular 32-bit insn. There are 3 5580709Sjake * formats for instuctions, which one being used is determined by 5680709Sjake * bits 30-31 of the insn. Here are the bit fields and their names: 5780709Sjake * 5880709Sjake * 1100 0000 0000 0000 0000 0000 0000 0000 op field, determines format 5980709Sjake * 0000 0001 1100 0000 0000 0000 0000 0000 op2 field, format 2 only 6080709Sjake * 0000 0001 1111 1000 0000 0000 0000 0000 op3 field, format 3 only 6180709Sjake * 0000 0000 0000 0000 0010 0000 0000 0000 f3i bit, format 3 only 6280709Sjake * 0000 0000 0000 0000 0001 0000 0000 0000 X bit, format 3 only 6380709Sjake */ 6480709Sjake 6580709Sjake/* FORMAT macros used in sparc_i table to decode each opcode */ 6686146Stmm#define FORMAT1(a) (EIF_OP(a)) 6786146Stmm#define FORMAT2(a,b) (EIF_OP(a) | EIF_F2_OP2(b)) 6886146Stmm/* For formats 3 and 4 */ 6986146Stmm#define FORMAT3(a,b,c) (EIF_OP(a) | EIF_F3_OP3(b) | EIF_F3_I(c)) 7086146Stmm#define FORMAT3F(a,b,c) (EIF_OP(a) | EIF_F3_OP3(b) | EIF_F3_OPF(c)) 7180709Sjake 7280709Sjake/* Helper macros to construct OP3 & OPF */ 7380709Sjake#define OP3_X(x,y) ((((x) & 3) << 4) | ((y) & 0xf)) 7480709Sjake#define OPF_X(x,y) ((((x) & 0x1f) << 4) | ((y) & 0xf)) 7580709Sjake 7680709Sjake/* COND condition codes field... */ 7780709Sjake#define COND2(y,x) (((((y)<<4) & 1)|((x) & 0xf)) << 14) 7880709Sjake 7980709Sjakestruct sparc_insn { 8080709Sjake unsigned int match; 81181640Smarius const char* name; 82181640Smarius const char* format; 8380709Sjake}; 8480709Sjake 85190003Smariusstatic const char *const regs[] = { 8680709Sjake "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", 8780709Sjake "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", 8880709Sjake "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", 8980709Sjake "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7" 9080709Sjake}; 9180709Sjake 92190003Smariusstatic const char *const priv_regs[] = { 9380709Sjake "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl", 9480709Sjake "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin", 9580709Sjake "wstate", "fq", 9680709Sjake "", "", "", "", "", "", "", "", 9780709Sjake "", "", "", "", "", "", "", "ver" 9880709Sjake}; 9980709Sjake 100190003Smariusstatic const char *const state_regs[] = { 10180709Sjake "y", "", "ccr", "asi", "tick", "pc", "fprs", "asr", 10280709Sjake "", "", "", "", "", "", "", "", 103181640Smarius "pcr", "pic", "dcr", "gsr", "set_softint", "clr_softint", "softint", 104181640Smarius "tick_cmpr", "sys_tick", "sys_tick_cmpr", "", "", "", "", "", "", "" 10580709Sjake}; 10680709Sjake 107190003Smariusstatic const char *const ccodes[] = { 10880709Sjake "fcc0", "fcc1", "fcc2", "fcc3", "icc", "", "xcc", "" 10980709Sjake}; 11080709Sjake 111190003Smariusstatic const char *const prefetch[] = { 11280709Sjake "n_reads", "one_read", "n_writes", "one_write", "page" 11380709Sjake}; 11480709Sjake 11580709Sjake 11680709Sjake/* The sparc instruction table has a format field which tells what 11780709Sjake the operand structure for this instruction is. Here are the codes: 11880709Sjake 11980709SjakeModifiers (nust be first): 12080709Sjake a -- opcode has annul bit 12180709Sjake p -- opcode has branch prediction bit 12280709Sjake 12380709SjakeCodes: 12480709Sjake 1 -- source register operand stored in rs1 12580709Sjake 2 -- source register operand stored in rs2 12680709Sjake d -- destination register operand stored in rd 12780709Sjake 3 -- floating source register in rs1 12880709Sjake 4 -- floating source register in rs2 12980709Sjake e -- floating destination register in rd 13080709Sjake i -- 13-bit immediate value stored in simm13 13180709Sjake j -- 11-bit immediate value stored in simm11 13280709Sjake l -- displacement using d16lo and d16hi 13380709Sjake m -- 22-bit fcc displacement value 13480709Sjake n -- 30-bit displacement used in call insns 13580709Sjake o -- %fcc number specified in cc1 and cc0 fields 13680709Sjake p -- address computed by the contents of rs1+rs2 13780709Sjake q -- address computed by the contents of rs1+simm13 13880709Sjake r -- prefetch 13980709Sjake s -- %asi is implicit in the insn, rs1 value not used 14080709Sjake t -- immediate 8-bit asi value 14180709Sjake u -- 19-bit fcc displacement value 14280709Sjake 5 -- hard register, %fsr lower-half 14380709Sjake 6 -- hard register, %fsr all 14480709Sjake 7 -- [reg_addr rs1+rs2] imm_asi 14580709Sjake 8 -- [reg_addr rs1+simm13] %asi 14680709Sjake 9 -- logical or of the cmask and mmask fields (membar insn) 14780709Sjake 0 -- icc or xcc condition codes register 14880709Sjake . -- %fcc, %icc, or %xcc in opf_cc field 14980709Sjake r -- prefection function stored in fcn field 15080709Sjake A -- privileged register encoded in rs1 15180709Sjake B -- state register encoded in rs1 15280709Sjake C -- %hi(value) where value is stored in imm22 field 15380709Sjake D -- 32-bit shift count in shcnt32 15480709Sjake E -- 64-bit shift count in shcnt64 15580709Sjake F -- software trap number stored in sw_trap 15680709Sjake G -- privileged register encoded in rd 15780709Sjake H -- state register encoded in rd 15880709Sjake 15980709SjakeV8 only: 16080709Sjake Y -- write y register 16180709Sjake P -- write psr register 16280709Sjake T -- write tbr register 16380709Sjake W -- write wim register 16480709Sjake*/ 16580709Sjake 16680709Sjake 167181640Smariusstatic const struct sparc_insn sparc_i[] = { 16880709Sjake 16980709Sjake /* 17080709Sjake * Format 1: Call 17180709Sjake */ 17280709Sjake {(FORMAT1(1)), "call", "n"}, 17380709Sjake 17480709Sjake /* 17580709Sjake * Format 0: Sethi & Branches 17680709Sjake */ 17780709Sjake /* Illegal Instruction Trap */ 17880709Sjake {(FORMAT2(0, 0)), "illtrap", "m"}, 17980709Sjake 18080709Sjake /* Note: if imm22 is zero then this is actually a "nop" grrr... */ 18180709Sjake {(FORMAT2(0, 0x4)), "sethi", "Cd"}, 18280709Sjake 18380709Sjake /* Branch on Integer Co`ndition Codes "Bicc" */ 18486146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(8)), "ba", "a,m"}, 18586146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(0)), "bn", "a,m"}, 18686146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(9)), "bne", "a,m"}, 18786146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(1)), "be", "a,m"}, 18886146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(10)), "bg", "a,m"}, 18986146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(2)), "ble", "a,m"}, 19086146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(11)), "bge", "a,m"}, 19186146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(3)), "bl", "a,m"}, 19286146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(12)), "bgu", "a,m"}, 19386146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(4)), "bleu", "a,m"}, 19486146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(13)), "bcc", "a,m"}, 19586146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(5)), "bcs", "a,m"}, 19686146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(14)), "bpos", "a,m"}, 19786146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(6)), "bneg", "a,m"}, 19886146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(15)), "bvc", "a,m"}, 19986146Stmm {(FORMAT2(0, 2) | EIF_F2_COND(7)), "bvs", "a,m"}, 20080709Sjake 20180709Sjake /* Branch on Integer Condition Codes with Prediction "BPcc" */ 20286146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(8)), "ba", "ap,u"}, 20386146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(0)), "bn", "ap,u"}, 20486146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(9)), "bne", "ap,u"}, 20586146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(1)), "be", "ap,u"}, 20686146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(10)), "bg", "ap,u"}, 20786146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(2)), "ble", "ap,u"}, 20886146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(11)), "bge", "ap,u"}, 20986146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(3)), "bl", "ap,u"}, 21086146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(12)), "bgu", "ap,u"}, 21186146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(4)), "bleu", "ap,u"}, 21286146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(13)), "bcc", "ap,u"}, 21386146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(5)), "bcs", "ap,u"}, 21486146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(14)), "bpos", "ap,u"}, 21586146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(6)), "bneg", "ap,u"}, 21686146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(15)), "bvc", "ap,u"}, 21786146Stmm {(FORMAT2(0, 1) | EIF_F2_COND(7)), "bvs", "ap,u"}, 21880709Sjake 21980709Sjake /* Branch on Integer Register with Prediction "BPr" */ 22086146Stmm {(FORMAT2(0, 3) | EIF_F2_RCOND(1)), "brz", "ap,1l"}, 22186146Stmm {(FORMAT2(0, 3) | EIF_F2_A(1) | EIF_F2_P(1) | 22286146Stmm EIF_F2_RCOND(2)), "brlex", "ap,1l"}, 22386146Stmm {(FORMAT2(0, 3) | EIF_F2_RCOND(3)), "brlz", "ap,1l"}, 22486146Stmm {(FORMAT2(0, 3) | EIF_F2_RCOND(5)), "brnz", "ap,1l"}, 22586146Stmm {(FORMAT2(0, 3) | EIF_F2_RCOND(6)), "brgz", "ap,1l"}, 22686146Stmm {(FORMAT2(0, 3) | EIF_F2_RCOND(7)), "brgez", "ap,1l"}, 22780709Sjake 22880709Sjake /* Branch on Floating-Point Condition Codes with Prediction "FBPfcc" */ 22986146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(8)), "fba", "ap,m"}, 23086146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(0)), "fbn", "ap,m"}, 23186146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(7)), "fbu", "ap,m"}, 23286146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(6)), "fbg", "ap,m"}, 23386146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(5)), "fbug", "ap,m"}, 23486146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(4)), "fbl", "ap,m"}, 23586146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(3)), "fbul", "ap,m"}, 23686146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(2)), "fblg", "ap,m"}, 23786146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(1)), "fbne", "ap,m"}, 23886146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(9)), "fbe", "ap,m"}, 23986146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(10)), "fbue", "ap,m"}, 24086146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(11)), "fbge", "ap,m"}, 24186146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(12)), "fbuge", "ap,m"}, 24286146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(13)), "fble", "ap,m"}, 24386146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(14)), "fbule", "ap,m"}, 24486146Stmm {(FORMAT2(0, 5) | EIF_F2_COND(15)), "fbo", "ap,m"}, 24580709Sjake 24680709Sjake /* Branch on Floating-Point Condition Codes "FBfcc" */ 24786146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(8)), "fba", "a,m"}, 24886146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(0)), "fbn", "a,m"}, 24986146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(7)), "fbu", "a,m"}, 25086146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(6)), "fbg", "a,m"}, 25186146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(5)), "fbug", "a,m"}, 25286146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(4)), "fbl", "a,m"}, 25386146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(3)), "fbul", "a,m"}, 25486146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(2)), "fblg", "a,m"}, 25586146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(1)), "fbne", "a,m"}, 25686146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(9)), "fbe", "a,m"}, 25786146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(10)), "fbue", "a,m"}, 25886146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(11)), "fbge", "a,m"}, 25986146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(12)), "fbuge", "a,m"}, 26086146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(13)), "fble", "a,m"}, 26186146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(14)), "fbule", "a,m"}, 26286146Stmm {(FORMAT2(0, 6) | EIF_F2_COND(15)), "fbo", "a,m"}, 26380709Sjake 26480709Sjake 26580709Sjake 26680709Sjake /* 26780709Sjake * Format 3/2: Arithmetic & misc (table 32, appendix E) 26880709Sjake */ 26980709Sjake {FORMAT3(2, OP3_X(0,0), 0), "add", "12d"}, 27080709Sjake {FORMAT3(2, OP3_X(0,0), 1), "add", "1id"}, 27180709Sjake {FORMAT3(2, OP3_X(1,0), 0), "addcc", "12d"}, 27280709Sjake {FORMAT3(2, OP3_X(1,0), 1), "addcc", "1id"}, 27380709Sjake {FORMAT3(2, OP3_X(2,0), 0), "taddcc", "12d"}, 27480709Sjake {FORMAT3(2, OP3_X(2,0), 1), "taddcc", "1id"}, 27586146Stmm {(FORMAT3(2, 0x30, 1) | EIF_F3_RD(0xf)), "sir", "i"}, 27680709Sjake {FORMAT3(2, OP3_X(3,0), 0), "wr", "12H"}, 27780709Sjake {FORMAT3(2, OP3_X(3,0), 1), "wr", "1iH"}, 27880709Sjake 27980709Sjake {FORMAT3(2, OP3_X(0,1), 0), "and", "12d"}, 28080709Sjake {FORMAT3(2, OP3_X(0,1), 1), "and", "1id"}, 28180709Sjake {FORMAT3(2, OP3_X(1,1), 0), "andcc", "12d"}, 28280709Sjake {FORMAT3(2, OP3_X(1,1), 1), "andcc", "1id"}, 28380709Sjake {FORMAT3(2, OP3_X(2,1), 0), "tsubcc", "12d"}, 28480709Sjake {FORMAT3(2, OP3_X(2,1), 1), "tsubcc", "1id"}, 28580709Sjake {FORMAT3(2, OP3_X(3,1), 0), "saved", ""}, 28686146Stmm {FORMAT3(2, OP3_X(3,1), 0) | EIF_F3_FCN(1), "restored", ""}, 28780709Sjake 28880709Sjake {FORMAT3(2, OP3_X(0,2), 0), "or", "12d"}, 28980709Sjake {FORMAT3(2, OP3_X(0,2), 1), "or", "1id"}, 29080709Sjake {FORMAT3(2, OP3_X(1,2), 0), "orcc", "12d"}, 29180709Sjake {FORMAT3(2, OP3_X(1,2), 1), "orcc", "1id"}, 29280709Sjake {FORMAT3(2, OP3_X(2,2), 0), "taddcctv", "12d"}, 29380709Sjake {FORMAT3(2, OP3_X(2,2), 1), "taddcctv", "1id"}, 29480709Sjake {FORMAT3(2, OP3_X(3,2), 0), "wrpr", "12G"}, 29580709Sjake {FORMAT3(2, OP3_X(3,2), 1), "wrpr", "1iG"}, 29680709Sjake 29780709Sjake {FORMAT3(2, OP3_X(0,3), 0), "xor", "12d"}, 29880709Sjake {FORMAT3(2, OP3_X(0,3), 1), "xor", "1id"}, 29980709Sjake {FORMAT3(2, OP3_X(1,3), 0), "xorcc", "12d"}, 30080709Sjake {FORMAT3(2, OP3_X(1,3), 1), "xorcc", "1id"}, 30180709Sjake {FORMAT3(2, OP3_X(2,3), 0), "tsubcctv", "12d"}, 30280709Sjake {FORMAT3(2, OP3_X(2,3), 1), "tsubcctv", "1id"}, 30380709Sjake {FORMAT3(2, OP3_X(3,3), 0), "UNDEFINED", ""}, 30480709Sjake 30580709Sjake {FORMAT3(2, OP3_X(0,4), 0), "sub", "12d"}, 30680709Sjake {FORMAT3(2, OP3_X(0,4), 1), "sub", "1id"}, 30780709Sjake {FORMAT3(2, OP3_X(1,4), 0), "subcc", "12d"}, 30880709Sjake {FORMAT3(2, OP3_X(1,4), 1), "subcc", "1id"}, 30980709Sjake {FORMAT3(2, OP3_X(2,4), 0), "mulscc", "12d"}, 31080709Sjake {FORMAT3(2, OP3_X(2,4), 1), "mulscc", "1id"}, 31180709Sjake {FORMAT3(2, OP3_X(3,4), 1), "FPop1", ""}, /* see below */ 31280709Sjake 31380709Sjake {FORMAT3(2, OP3_X(0,5), 0), "andn", "12d"}, 31480709Sjake {FORMAT3(2, OP3_X(0,5), 1), "andn", "1id"}, 31580709Sjake {FORMAT3(2, OP3_X(1,5), 0), "andncc", "12d"}, 31680709Sjake {FORMAT3(2, OP3_X(1,5), 1), "andncc", "1id"}, 31780709Sjake {FORMAT3(2, OP3_X(2,5), 0), "sll", "12d"}, 31880709Sjake {FORMAT3(2, OP3_X(2,5), 1), "sll", "1Dd"}, 31986146Stmm {FORMAT3(2, OP3_X(2,5), 0) | EIF_F3_X(1), "sllx", "12d"}, 32086146Stmm {FORMAT3(2, OP3_X(2,5), 1) | EIF_F3_X(1), "sllx", "1Ed"}, 32180709Sjake {FORMAT3(2, OP3_X(3,5), 1), "FPop2", ""}, /* see below */ 32280709Sjake 32380709Sjake {FORMAT3(2, OP3_X(0,6), 0), "orn", "12d"}, 32480709Sjake {FORMAT3(2, OP3_X(0,6), 1), "orn", "1id"}, 32580709Sjake {FORMAT3(2, OP3_X(1,6), 0), "orncc", "12d"}, 32680709Sjake {FORMAT3(2, OP3_X(1,6), 1), "orncc", "1id"}, 32780709Sjake {FORMAT3(2, OP3_X(2,6), 0), "srl", "12d"}, 32880709Sjake {FORMAT3(2, OP3_X(2,6), 1), "srl", "1Dd"}, 32986146Stmm {FORMAT3(2, OP3_X(2,6), 0) | EIF_F3_X(1), "srlx", "12d"}, 33086146Stmm {FORMAT3(2, OP3_X(2,6), 1) | EIF_F3_X(1), "srlx", "1Ed"}, 33180709Sjake {FORMAT3(2, OP3_X(3,6), 1), "impdep1", ""}, 33280709Sjake 33380709Sjake {FORMAT3(2, OP3_X(0,7), 0), "xorn", "12d"}, 33480709Sjake {FORMAT3(2, OP3_X(0,7), 1), "xorn", "1id"}, 33580709Sjake {FORMAT3(2, OP3_X(1,7), 0), "xorncc", "12d"}, 33680709Sjake {FORMAT3(2, OP3_X(1,7), 1), "xorncc", "1id"}, 33780709Sjake {FORMAT3(2, OP3_X(2,7), 0), "sra", "12d"}, 33880709Sjake {FORMAT3(2, OP3_X(2,7), 1), "sra", "1Dd"}, 33986146Stmm {FORMAT3(2, OP3_X(2,7), 0) | EIF_F3_X(1), "srax", "12d"}, 34086146Stmm {FORMAT3(2, OP3_X(2,7), 1) | EIF_F3_X(1), "srax", "1Ed"}, 34180709Sjake {FORMAT3(2, OP3_X(3,7), 1), "impdep2", ""}, 34280709Sjake 34380709Sjake {FORMAT3(2, OP3_X(0,8), 0), "addc", "12d"}, 34480709Sjake {FORMAT3(2, OP3_X(0,8), 1), "addc", "1id"}, 34580709Sjake {FORMAT3(2, OP3_X(1,8), 0), "addccc", "12d"}, 34680709Sjake {FORMAT3(2, OP3_X(1,8), 1), "addccc", "1id"}, 34786146Stmm {(FORMAT3(2, 0x28, 1) | EIF_F3_RS1(15)), "membar", "9"}, 34886146Stmm {(FORMAT3(2, 0x28, 0) | EIF_F3_RS1(15)), "stbar", ""}, 34980709Sjake {FORMAT3(2, OP3_X(2,8), 0), "rd", "Bd"}, 35080709Sjake 35180709Sjake {FORMAT3(2, OP3_X(3,8), 0), "jmpl", "pd"}, 35280709Sjake {FORMAT3(2, OP3_X(3,8), 1), "jmpl", "qd"}, 35380709Sjake 35480709Sjake {FORMAT3(2, OP3_X(0,9), 0), "mulx", "12d"}, 35580709Sjake {FORMAT3(2, OP3_X(0,9), 1), "mulx", "1id"}, 35680709Sjake {FORMAT3(2, OP3_X(1,9), 0), "UNDEFINED", ""}, 35780709Sjake {FORMAT3(2, OP3_X(2,9), 0), "UNDEFINED", ""}, 35880709Sjake {FORMAT3(2, OP3_X(3,9), 0), "return", "p"}, 35980709Sjake {FORMAT3(2, OP3_X(3,9), 1), "return", "q"}, 36080709Sjake 36180709Sjake {FORMAT3(2, OP3_X(0,10), 0), "umul", "12d"}, 36280709Sjake {FORMAT3(2, OP3_X(0,10), 1), "umul", "1id"}, 36380709Sjake {FORMAT3(2, OP3_X(1,10), 0), "umulcc", "12d"}, 36480709Sjake {FORMAT3(2, OP3_X(1,10), 1), "umulcc", "1id"}, 36580709Sjake {FORMAT3(2, OP3_X(2,10), 0), "rdpr", "Ad"}, 36680709Sjake /* 36780709Sjake * OP3 = (3,10): TCC: Trap on Integer Condition Codes 36880709Sjake */ 36986146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x8)), "ta", "12F"}, 37086146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x8)), "ta", "0F"}, 37186146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x0)), "tn", "12F"}, 37286146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x0)), "tn", "0F"}, 37386146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x9)), "tne", "12F"}, 37486146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x9)), "tne", "0F"}, 37586146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x1)), "te", "12F"}, 37686146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x1)), "te", "0F"}, 37786146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xa)), "tg", "12F"}, 37886146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xa)), "tg", "0F"}, 37986146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x2)), "tle", "12F"}, 38086146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x2)), "tle", "0F"}, 38186146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xb)), "tge", "12F"}, 38286146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xb)), "tge", "0F"}, 38386146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x3)), "tl", "12F"}, 38486146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x3)), "tl", "0F"}, 38586146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xc)), "tgu", "12F"}, 38686146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xc)), "tgu", "0F"}, 38786146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x4)), "tleu", "12F"}, 38886146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x4)), "tleu", "0F"}, 38986146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xd)), "tcc", "12F"}, 39086146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xd)), "tcc", "0F"}, 39186146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x5)), "tcs", "12F"}, 39286146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x5)), "tcs", "0F"}, 39386146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xe)), "tpos", "12F"}, 39486146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xe)), "tpos", "0F"}, 39586146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x6)), "tneg", "12F"}, 39686146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x6)), "tneg", "0F"}, 39786146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xf)), "tvc", "12F"}, 39886146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xf)), "tvc", "0F"}, 39986146Stmm {(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x7)), "tvs", "12F"}, 40086146Stmm {(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x7)), "tvs", "0F"}, 40180709Sjake 40280709Sjake {FORMAT3(2, OP3_X(0,11), 0), "smul", "12d"}, 40380709Sjake {FORMAT3(2, OP3_X(0,11), 1), "smul", "1id"}, 40480709Sjake {FORMAT3(2, OP3_X(1,11), 0), "smulcc", "12d"}, 40580709Sjake {FORMAT3(2, OP3_X(1,11), 1), "smulcc", "1id"}, 40680709Sjake {FORMAT3(2, OP3_X(2,11), 0), "flushw", ""}, 40780709Sjake {FORMAT3(2, OP3_X(3,11), 0), "flush", "p"}, 40880709Sjake {FORMAT3(2, OP3_X(3,11), 1), "flush", "q"}, 40980709Sjake 41080709Sjake {FORMAT3(2, OP3_X(0,12), 0), "subc", "12d"}, 41180709Sjake {FORMAT3(2, OP3_X(0,12), 1), "subc", "1id"}, 41280709Sjake {FORMAT3(2, OP3_X(1,12), 0), "subccc", "12d"}, 41380709Sjake {FORMAT3(2, OP3_X(1,12), 1), "subccc", "1id"}, 41480709Sjake /* 41580709Sjake * OP3 = (2,12): MOVcc, Move Integer Register on Condition 41680709Sjake */ 41780709Sjake /* For Integer Condition Codes */ 41880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,8)), "mova", "0jd"}, 41980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,8)), "mova", "02d"}, 42080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,0)), "movn", "0jd"}, 42180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,0)), "movn", "02d"}, 42280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,9)), "movne", "0jd"}, 42380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,9)), "movne", "02d"}, 42480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,1)), "move", "0jd"}, 42580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,1)), "move", "02d"}, 42680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,10)), "movg", "0jd"}, 42780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,10)), "movg", "02d"}, 42880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,2)), "movle", "0jd"}, 42980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,2)), "movle", "02d"}, 43080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,11)), "movge", "0jd"}, 43180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,11)), "movge", "02d"}, 43280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,3)), "movl", "0jd"}, 43380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,3)), "movl", "02d"}, 43480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,12)), "movgu", "0jd"}, 43580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,12)), "movgu", "02d"}, 43680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,4)), "movleu", "0jd"}, 43780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,4)), "movleu", "02d"}, 43880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,13)), "movcc", "0jd"}, 43980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,13)), "movcc", "02d"}, 44080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,5)), "movcs", "0jd"}, 44180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,5)), "movcs", "02d"}, 44280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,14)), "movpos", "0jd"}, 44380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,14)), "movpos", "02d"}, 44480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,6)), "movneg", "0jd"}, 44580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,6)), "movneg", "02d"}, 44680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,15)), "movvc", "0jd"}, 44780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,15)), "movvc", "02d"}, 44880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,7)), "movvs", "0jd"}, 44980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,7)), "movvs", "02d"}, 45080709Sjake 45180709Sjake /* For Floating-Point Condition Codes */ 45280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,8)), "mova", "ojd"}, 45380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,8)), "mova", "o2d"}, 45480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,0)), "movn", "ojd"}, 45580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,0)), "movn", "o2d"}, 45680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,7)), "movu", "ojd"}, 45780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,7)), "movu", "o2d"}, 45880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,6)), "movg", "ojd"}, 45980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,6)), "movg", "o2d"}, 46080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,5)), "movug", "ojd"}, 46180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,5)), "movug", "o2d"}, 46280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,4)), "movl", "ojd"}, 46380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,4)), "movl", "o2d"}, 46480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,3)), "movul", "ojd"}, 46580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,3)), "movul", "o2d"}, 46680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,2)), "movlg", "ojd"}, 46780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,2)), "movlg", "o2d"}, 46880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,1)), "movne", "ojd"}, 46980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,1)), "movne", "o2d"}, 47080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,9)), "move", "ojd"}, 47180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,9)), "move", "o2d"}, 47280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,10)), "movue", "ojd"}, 47380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,10)), "movue", "o2d"}, 47480709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,11)), "movge", "ojd"}, 47580709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,11)), "movge", "o2d"}, 47680709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,12)), "movuge", "ojd"}, 47780709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,12)), "movuge", "o2d"}, 47880709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,13)), "movle", "ojd"}, 47980709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,13)), "movle", "o2d"}, 48080709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,14)), "movule", "ojd"}, 48180709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,14)), "movule", "o2d"}, 48280709Sjake {(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,15)), "movo", "ojd"}, 48380709Sjake {(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,15)), "movo", "o2d"}, 48480709Sjake 48580709Sjake {FORMAT3(2, OP3_X(3,12), 0), "save", "12d"}, 48680709Sjake {FORMAT3(2, OP3_X(3,12), 1), "save", "1id"}, 48780709Sjake 48880709Sjake {FORMAT3(2, OP3_X(0,13), 0), "udivx", "12d"}, 48980709Sjake {FORMAT3(2, OP3_X(0,13), 1), "udivx", "1id"}, 49080709Sjake {FORMAT3(2, OP3_X(1,13), 0), "UNDEFINED", ""}, 49180709Sjake {FORMAT3(2, OP3_X(2,13), 0), "sdivx", "12d"}, 49280709Sjake {FORMAT3(2, OP3_X(2,13), 1), "sdivx", "1id"}, 49380709Sjake {FORMAT3(2, OP3_X(3,13), 0), "restore", "12d"}, 49480709Sjake {FORMAT3(2, OP3_X(3,13), 1), "restore", "1id"}, 49580709Sjake 49680709Sjake {FORMAT3(2, OP3_X(0,14), 0), "udiv", "12d"}, 49780709Sjake {FORMAT3(2, OP3_X(0,14), 1), "udiv", "1id"}, 49880709Sjake {FORMAT3(2, OP3_X(1,14), 0), "udivcc", "12d"}, 49980709Sjake {FORMAT3(2, OP3_X(1,14), 1), "udivcc", "1id"}, 50080709Sjake {FORMAT3(2, OP3_X(2,14), 0), "popc", "2d"}, 50180709Sjake {FORMAT3(2, OP3_X(2,14), 1), "popc", "id"}, 50280709Sjake 50380709Sjake {FORMAT3(2, OP3_X(3,14), 0), "done", ""}, 50486146Stmm {FORMAT3(2, OP3_X(3,14) | EIF_F3_FCN(1), 1), "retry", ""}, 50580709Sjake 50680709Sjake {FORMAT3(2, OP3_X(0,15), 0), "sdiv", "12d"}, 50780709Sjake {FORMAT3(2, OP3_X(0,15), 1), "sdiv", "1id"}, 50880709Sjake {FORMAT3(2, OP3_X(1,15), 0), "sdivcc", "12d"}, 50980709Sjake {FORMAT3(2, OP3_X(1,15), 1), "sdivcc", "1id"}, 51080709Sjake /* 51180709Sjake * OP3 = (2,15): MOVr: 51280709Sjake * Move Integer Register on Register Condition 51380709Sjake */ 51486146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(1)), "movrz", "1jd"}, 51586146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(1)), "movrz", "12d"}, 51686146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(2)), "movrlez", "1jd"}, 51786146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(2)), "movrlez", "12d"}, 51886146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(3)), "movrlz", "1jd"}, 51986146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(3)), "movrlz", "12d"}, 52086146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(5)), "movrnz", "1jd"}, 52186146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(5)), "movrnz", "12d"}, 52286146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(6)), "movrgz", "1jd"}, 52386146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(6)), "movrgz", "12d"}, 52486146Stmm {(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(7)), "movrgez", "1jd"}, 52586146Stmm {(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(7)), "movrgez", "12d"}, 52680709Sjake 52780709Sjake {FORMAT3(2, OP3_X(3,15), 0), "UNDEFINED", ""}, 52880709Sjake 52980709Sjake 53080709Sjake /* 53180709Sjake * Format 3/3: Load and store (appendix E, table 33) 53280709Sjake */ 53380709Sjake 53480709Sjake /* Loads */ 53588662Sjake {(FORMAT3(3, OP3_X(0,0), 0)), "lduw", "pd"}, 53688662Sjake {(FORMAT3(3, OP3_X(0,0), 1)), "lduw", "qd"}, 53788662Sjake {(FORMAT3(3, OP3_X(1,0), 0)), "lduwa", "7d"}, 53888662Sjake {(FORMAT3(3, OP3_X(1,0), 1)), "lduwa", "8d"}, 53980709Sjake {(FORMAT3(3, OP3_X(2,0), 0)), "ldf", "pe"}, 54080709Sjake {(FORMAT3(3, OP3_X(2,0), 1)), "ldf", "qe"}, 54180709Sjake {(FORMAT3(3, OP3_X(3,0), 0)), "ldfa", "7e"}, 54280709Sjake {(FORMAT3(3, OP3_X(3,0), 1)), "ldfa", "8e"}, 54380709Sjake 54480709Sjake {(FORMAT3(3, OP3_X(0,1), 0)), "ldub", "pd"}, 54580709Sjake {(FORMAT3(3, OP3_X(0,1), 1)), "ldub", "qd"}, 54680709Sjake {(FORMAT3(3, OP3_X(1,1), 0)), "lduba", "7d"}, 54780709Sjake {(FORMAT3(3, OP3_X(1,1), 1)), "lduba", "8d"}, 54888662Sjake {(FORMAT3(3, OP3_X(2,1), 0) | EIF_F3_RD(0)), "lduw", "p5"}, 54988662Sjake {(FORMAT3(3, OP3_X(2,1), 1) | EIF_F3_RD(0)), "lduw", "q5"}, 55086146Stmm {(FORMAT3(3, OP3_X(2,1), 0) | EIF_F3_RD(1)), "ldx", "p6"}, 55186146Stmm {(FORMAT3(3, OP3_X(2,1), 1) | EIF_F3_RD(1)), "ldx", "q6"}, 55280709Sjake 55380709Sjake {(FORMAT3(3, OP3_X(0,2), 0)), "lduh", "pd"}, 55480709Sjake {(FORMAT3(3, OP3_X(0,2), 1)), "lduh", "qd"}, 55580709Sjake {(FORMAT3(3, OP3_X(1,2), 0)), "lduha", "7d"}, 55680709Sjake {(FORMAT3(3, OP3_X(1,2), 1)), "lduha", "8d"}, 55780709Sjake {(FORMAT3(3, OP3_X(2,2), 0)), "ldq", "pe"}, 55880709Sjake {(FORMAT3(3, OP3_X(2,2), 1)), "ldq", "qe"}, 55980709Sjake {(FORMAT3(3, OP3_X(3,2), 0)), "ldqa", "7e"}, 56080709Sjake {(FORMAT3(3, OP3_X(3,2), 1)), "ldqa", "8e"}, 56180709Sjake 56280709Sjake {(FORMAT3(3, OP3_X(0,3), 0)), "ldd", "pd"}, 56380709Sjake {(FORMAT3(3, OP3_X(0,3), 1)), "ldd", "qd"}, 56480709Sjake {(FORMAT3(3, OP3_X(1,3), 0)), "ldda", "7d"}, 56580709Sjake {(FORMAT3(3, OP3_X(1,3), 1)), "ldda", "8d"}, 56680709Sjake {(FORMAT3(3, OP3_X(2,3), 0)), "ldd", "pe"}, 56780709Sjake {(FORMAT3(3, OP3_X(2,3), 1)), "ldd", "qe"}, 56880709Sjake {(FORMAT3(3, OP3_X(3,3), 0)), "ldda", "7e"}, 56980709Sjake {(FORMAT3(3, OP3_X(3,3), 1)), "ldda", "8e"}, 57080709Sjake 57188662Sjake {(FORMAT3(3, OP3_X(0,4), 0)), "stw", "dp"}, 57288662Sjake {(FORMAT3(3, OP3_X(0,4), 1)), "stw", "dq"}, 57388662Sjake {(FORMAT3(3, OP3_X(1,4), 0)), "stwa", "d7"}, 57488662Sjake {(FORMAT3(3, OP3_X(1,4), 1)), "stwa", "d8"}, 57588662Sjake {(FORMAT3(3, OP3_X(2,4), 0)), "stf", "ep"}, 57688662Sjake {(FORMAT3(3, OP3_X(2,4), 1)), "stf", "eq"}, 57788662Sjake {(FORMAT3(3, OP3_X(3,4), 0)), "stfa", "e7"}, 57888662Sjake {(FORMAT3(3, OP3_X(3,4), 1)), "stfa", "e8"}, 57980709Sjake 58080709Sjake {(FORMAT3(3, OP3_X(0,5), 0)), "stb", "dp"}, 58180709Sjake {(FORMAT3(3, OP3_X(0,5), 1)), "stb", "dq"}, 58280709Sjake {(FORMAT3(3, OP3_X(1,5), 0)), "stba", "d7"}, 58380709Sjake {(FORMAT3(3, OP3_X(1,5), 1)), "stba", "d8"}, 58488662Sjake {(FORMAT3(3, OP3_X(2,5), 0)), "stw", "5p"}, 58588662Sjake {(FORMAT3(3, OP3_X(2,5), 1)), "stw", "5q"}, 58686146Stmm {(FORMAT3(3, OP3_X(2,5), 0) | EIF_F3_RD(1)), "stx", "6p"}, 58786146Stmm {(FORMAT3(3, OP3_X(2,5), 1) | EIF_F3_RD(1)), "stx", "6q"}, 58880709Sjake 58980709Sjake {(FORMAT3(3, OP3_X(0,6), 0)), "sth", "dp"}, 59080709Sjake {(FORMAT3(3, OP3_X(0,6), 1)), "sth", "dq"}, 59180709Sjake {(FORMAT3(3, OP3_X(1,6), 0)), "stha", "d7"}, 59280709Sjake {(FORMAT3(3, OP3_X(1,6), 1)), "stha", "d8"}, 59380709Sjake {(FORMAT3(3, OP3_X(2,6), 0)), "stq", "ep"}, 59480709Sjake {(FORMAT3(3, OP3_X(2,6), 1)), "stq", "eq"}, 59580709Sjake {(FORMAT3(3, OP3_X(3,6), 0)), "stqa", "e7"}, 59680709Sjake {(FORMAT3(3, OP3_X(3,6), 1)), "stqa", "e8"}, 59780709Sjake 59880709Sjake {(FORMAT3(3, OP3_X(0,7), 0)), "std", "dp"}, 59980709Sjake {(FORMAT3(3, OP3_X(0,7), 1)), "std", "dq"}, 60080709Sjake {(FORMAT3(3, OP3_X(1,7), 0)), "stda", "d7"}, 60180709Sjake {(FORMAT3(3, OP3_X(1,7), 1)), "stda", "d8"}, 60280709Sjake {(FORMAT3(3, OP3_X(2,7), 0)), "std", "ep"}, 60380709Sjake {(FORMAT3(3, OP3_X(2,7), 1)), "std", "eq"}, 60480709Sjake {(FORMAT3(3, OP3_X(3,7), 0)), "stda", "e7"}, 60580709Sjake {(FORMAT3(3, OP3_X(3,7), 1)), "stda", "e8"}, 60680709Sjake 60780709Sjake {(FORMAT3(3, OP3_X(0,8), 0)), "ldsw", "pd"}, 60880709Sjake {(FORMAT3(3, OP3_X(0,8), 1)), "ldsw", "qd"}, 60980709Sjake {(FORMAT3(3, OP3_X(1,8), 0)), "ldswa", "7d"}, 61080709Sjake {(FORMAT3(3, OP3_X(1,8), 1)), "ldswa", "8d"}, 61180709Sjake 61280709Sjake {(FORMAT3(3, OP3_X(0,9), 0)), "ldsb", "pd"}, 61380709Sjake {(FORMAT3(3, OP3_X(0,9), 1)), "ldsb", "qd"}, 61480709Sjake {(FORMAT3(3, OP3_X(1,9), 0)), "ldsba", "7d"}, 61580709Sjake {(FORMAT3(3, OP3_X(1,9), 1)), "ldsba", "8d"}, 61680709Sjake 61780709Sjake {(FORMAT3(3, OP3_X(0,10), 0)), "ldsh", "pd"}, 61880709Sjake {(FORMAT3(3, OP3_X(0,10), 1)), "ldsh", "qd"}, 61980709Sjake {(FORMAT3(3, OP3_X(1,10), 0)), "ldsha", "7d"}, 62080709Sjake {(FORMAT3(3, OP3_X(1,10), 1)), "ldsha", "8d"}, 62180709Sjake 62280709Sjake {(FORMAT3(3, OP3_X(0,11), 0)), "ldx", "pd"}, 62380709Sjake {(FORMAT3(3, OP3_X(0,11), 1)), "ldx", "qd"}, 62480709Sjake {(FORMAT3(3, OP3_X(1,11), 0)), "ldxa", "7d"}, 62580709Sjake {(FORMAT3(3, OP3_X(1,11), 1)), "ldxa", "8d"}, 62680709Sjake 62780709Sjake {(FORMAT3(3, OP3_X(3,12), 1)), "casa", "s2d"}, 62880709Sjake {(FORMAT3(3, OP3_X(3,12), 0)), "casa", "t2d"}, 62980709Sjake 63080709Sjake {(FORMAT3(3, OP3_X(0,13), 0)), "ldstub", "7d"}, 63180709Sjake {(FORMAT3(3, OP3_X(0,13), 1)), "ldstub", "8d"}, 63280709Sjake {(FORMAT3(3, OP3_X(1,13), 0)), "ldstuba", "pd"}, 63380709Sjake {(FORMAT3(3, OP3_X(1,13), 1)), "ldstuba", "qd"}, 63480709Sjake {(FORMAT3(3, OP3_X(2,13), 0)), "prefetch", "pr"}, 63580709Sjake {(FORMAT3(3, OP3_X(2,13), 1)), "prefetch", "qr"}, 63680709Sjake {(FORMAT3(3, OP3_X(3,13), 0)), "prefetcha", "7r"}, 63780709Sjake {(FORMAT3(3, OP3_X(3,13), 1)), "prefetcha", "8r"}, 63880709Sjake 63980709Sjake {(FORMAT3(3, OP3_X(0,14), 0)), "stx", "dp"}, 64080709Sjake {(FORMAT3(3, OP3_X(0,14), 1)), "stx", "dq"}, 64188662Sjake {(FORMAT3(3, OP3_X(1,14), 0)), "stxa", "d7"}, 64288662Sjake {(FORMAT3(3, OP3_X(1,14), 1)), "stxa", "d8"}, 64380709Sjake {(FORMAT3(3, OP3_X(3,14), 0)), "casxa", "t2d"}, 64480709Sjake {(FORMAT3(3, OP3_X(3,14), 1)), "casxa", "s2d"}, 64580709Sjake 64680709Sjake /* Swap Register */ 64780709Sjake {(FORMAT3(3, OP3_X(0,15), 0)), "swap", "pd"}, 64880709Sjake {(FORMAT3(3, OP3_X(0,15), 1)), "swap", "qd"}, 64980709Sjake {(FORMAT3(3, OP3_X(1,15), 0)), "swapa", "7d"}, 65080709Sjake {(FORMAT3(3, OP3_X(1,15), 1)), "swapa", "8d"}, 65180709Sjake 65280709Sjake 65380709Sjake /* 65480709Sjake * OP3 = (3,4): FPop1 (table 34) 65580709Sjake */ 65680709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,1))), "fmovs", ".4e"}, 65780709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,2))), "fmovd", ".4e"}, 65880709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,3))), "fmovq", ".4e"}, 65980709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,5))), "fnegs", "4e"}, 66080709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,6))), "fnegd", "4e"}, 66180709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,7))), "fnegq", "4e"}, 66280709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,9))), "fabss", "4e"}, 66380709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,10))), "fabsd", "4e"}, 66480709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(0,11))), "fabsq", "4e"}, 66580709Sjake 66680709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(2,9))), "fsqrts", "4e"}, 66780709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(2,10))), "fsqrtd", "4e"}, 66880709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(2,11))), "fsqrtq", "4e"}, 66980709Sjake 67080709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,1))), "fadds", "34e"}, 67180709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,2))), "faddd", "34e"}, 67280709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,3))), "faddq", "34e"}, 67380709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,5))), "fsubs", "34e"}, 67480709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,6))), "fsubd", "34e"}, 67580709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,7))), "fsubq", "34e"}, 67680709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,9))), "fmuls", "34e"}, 67780709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,10))), "fmuld", "34e"}, 67880709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,11))), "fmulq", "34e"}, 67980709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,13))), "fdivs", "34e"}, 68080709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,14))), "fdivd", "34e"}, 68180709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(4,15))), "fdivq", "34e"}, 68280709Sjake 68380709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(6,9))), "fsmuld", "34e"}, 68480709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(6,14))), "fdmulq", "34e"}, 68580709Sjake 68680709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,1))), "fstox", "4e"}, 68780709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,2))), "fdtox", "4e"}, 68880709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,3))), "fqtox", "4e"}, 68980709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,4))), "fxtos", "4e"}, 69080709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,8))), "fxtod", "4e"}, 69180709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(8,12))), "fxtoq", "4e"}, 69280709Sjake 69380709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,4))), "fitos", "4e"}, 69480709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,6))), "fdtos", "4e"}, 69580709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,7))), "fqtos", "4e"}, 69680709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,8))), "fitod", "4e"}, 69780709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,9))), "fstod", "4e"}, 69880709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,11))), "fqtod", "4e"}, 69980709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,12))), "fitoq", "4e"}, 70080709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,13))), "fstoq", "4e"}, 70180709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(12,14))), "fdtoq", "4e"}, 70280709Sjake 70380709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(13,1))), "fstoi", "4e"}, 70480709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(13,2))), "fdtoi", "4e"}, 70580709Sjake {(FORMAT3F(2, OP3_X(3,4), OPF_X(13,3))), "fqtoi", "4e"}, 70680709Sjake 70780709Sjake 70880709Sjake#ifdef xxx 70980709Sjake /* 71080709Sjake * OP3 =(3,5): FPop2 (table 35) 71180709Sjake */ 71280709Sjake {(FORMAT3F(2, OP3_X(3,5), 81)), "fcmps", "o34"}, 71380709Sjake {(FORMAT3F(2, OP3_X(3,5), 82)), "fcmpd", "o34"}, 71480709Sjake {(FORMAT3F(2, OP3_X(3,5), 83)), "fcmpq", "o34"}, 71580709Sjake {(FORMAT3F(2, OP3_X(3,5), 85)), "fcmpes", "o34"}, 71680709Sjake {(FORMAT3F(2, OP3_X(3,5), 86)), "fcmped", "o34"}, 71780709Sjake {(FORMAT3F(2, OP3_X(3,5), 87)), "fcmpeq", "o34"}, 71880709Sjake 71980709Sjake /* Move Floating-Point Register on Condition "FMOVcc" */ 72080709Sjake /* FIXME should check for single, double, and quad movements */ 72180709Sjake /* Integer Condition Codes */ 72280709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "04e"}, 72380709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "04e"}, 72480709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmovne", "04e"}, 72580709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmove", "04e"}, 72680709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovg", "04e"}, 72780709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovle", "04e"}, 72880709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "04e"}, 72980709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovl", "04e"}, 73080709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovgu", "04e"}, 73180709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovleu", "04e"}, 73280709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovcc", "04e"}, 73380709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovcs", "04e"}, 73480709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovpos", "04e"}, 73580709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovneg", "04e"}, 73680709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovvc", "04e"}, 73780709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovvs", "04e"}, 73880709Sjake 73980709Sjake /* Floating-Point Condition Codes */ 74080709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "o4e"}, 74180709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "o4e"}, 74280709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovu", "o4e"}, 74380709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovg", "o4e"}, 74480709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovug", "o4e"}, 74580709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovk", "o4e"}, 74680709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovul", "o4e"}, 74780709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovlg", "o4e"}, 74880709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmovne", "o4e"}, 74980709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmove", "o4e"}, 75080709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovue", "o4e"}, 75180709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "o4e"}, 75280709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovuge", "o4e"}, 75380709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovle", "o4e"}, 75480709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovule", "o4e"}, 75580709Sjake {(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovo", "o4e"}, 75680709Sjake 75780709Sjake /* Move F-P Register on Integer Register Condition "FMOVr" */ 75880709Sjake /* FIXME: check for short, double, and quad's */ 75986146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(1)), "fmovre", "14e"}, 76086146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(2)), "fmovrlez", "14e"}, 76186146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(3)), "fmovrlz", "14e"}, 76286146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(5)), "fmovrne", "14e"}, 76386146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(6)), "fmovrgz", "14e"}, 76486146Stmm {(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(7)), "fmovrgez", "14e"}, 76580709Sjake#endif 76680709Sjake /* FP logical insns -- UltraSPARC extens */ 76780709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,0))), "fzero", "e"}, 76880709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,1))), "fzeros", "e"}, 76980709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,14))), "fone", "e"}, 77080709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,15))), "fones", "e"}, 77180709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,4))), "fsrc1", "3e"}, 77280709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,5))), "fsrc1s", "3e"}, 77380709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,8))), "fsrc2", "4e"}, 77480709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,9))), "fsrc2s", "4e"}, 77580709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,10))), "fnot1", "3e"}, 77680709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,11))), "fnot1s", "3e"}, 77780709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,6))), "fnot2", "4e"}, 77880709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,7))), "fnot2s", "4e"}, 77980709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,12))), "for", "34e"}, 78080709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,13))), "fors", "34e"}, 78180709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,2))), "fnor", "34e"}, 78280709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,3))), "fnors", "34e"}, 78380709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,0))), "fand", "34e"}, 78480709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,1))), "fands", "34e"}, 78580709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,14))), "fnand", "34e"}, 78680709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,15))), "fnands", "34e"}, 78780709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,12))), "fxor", "34e"}, 78880709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,13))), "fxors", "34e"}, 78980709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,2))), "fxnor", "34e"}, 79080709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,3))), "fxnors", "34e"}, 79180709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,10))), "fornot1", "34e"}, 79280709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,11))), "fornot1s", "34e"}, 79380709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,6))), "fornot2", "34e"}, 79480709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(7,7))), "fornot2s", "34e"}, 79580709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,8))), "fandnot1", "34e"}, 79680709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,9))), "fandnot1s", "34e"}, 79780709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,4))), "fandnot2", "34e"}, 79880709Sjake {(FORMAT3F(2, OP3_X(3,6), OPF_X(6,5))), "fandnot2s", "34e"}, 79980709Sjake 80080709Sjake /* grrrr.... */ 80180709Sjake {0, 0, 0} 80280709Sjake 80380709Sjake}; 80480709Sjake 80580709Sjakedb_addr_t 80693051Stmmdb_disasm(db_addr_t loc, boolean_t altfmt) 80780709Sjake{ 808181640Smarius const struct sparc_insn* i_ptr = (struct sparc_insn *)&sparc_i; 80980709Sjake unsigned int insn, you_lose, bitmask; 81080709Sjake int matchp; 811181640Smarius const char* f_ptr, *cp; 81280709Sjake 81380709Sjake you_lose = 0; 81480709Sjake matchp = 0; 81580709Sjake insn = db_get_value(loc, 4, 0); 81680709Sjake 81780709Sjake if (insn == 0x01000000) { 81880709Sjake db_printf("nop\n"); 81980709Sjake return loc + 4; 82080709Sjake } 82180709Sjake 82280709Sjake while (i_ptr->name) { 82380709Sjake /* calculate YOU_LOSE value */ 82480709Sjake bitmask= (i_ptr->match); 82580709Sjake you_lose = (~bitmask); 82680709Sjake 82780709Sjake if (((bitmask>>30) & 0x3) == 0x1) { 82880709Sjake /* Call */ 82980709Sjake you_lose = ((~0x1)<<30); 83080709Sjake } else if (((bitmask>>30) & 0x3) == 0x0) { 83180709Sjake if (((bitmask>>22) & 0x7) == 0x4) { 83280709Sjake /* Sethi */ 83380709Sjake you_lose &= (FORMAT2(0x3,0x7)); 83480709Sjake } else { 83580709Sjake /* Branches */ 83686146Stmm you_lose &= (FORMAT2(0x3,0x7) | 83786146Stmm EIF_F2_COND(0xf)); 83880709Sjake } 83980709Sjake } else if (((bitmask>>30) & 0x3) == 0x2 && 84080709Sjake ((bitmask>>19) & 0x3f) == 0x34) /* XXX */ { 84180709Sjake /* FPop1 */ 84286146Stmm you_lose &= (FORMAT3(0x3,0x3f,0x1) | 84386146Stmm EIF_F3_OPF(0x1ff)); 84480709Sjake } else if (((bitmask>>30) & 0x3) == 0x2 && 84580709Sjake ((bitmask>>19) & 0x3f) == 0x3a) /* XXX */ { 84680709Sjake /* Tcc */ 84786146Stmm you_lose &= (FORMAT3(0x3,0x3f,0x1) | EIF_F4_TCOND(0xf)); 84880709Sjake } else if (((bitmask>>30) & 0x3) == 0x2 && 84980709Sjake ((bitmask>>21) & 0xf) == 0x9 && 85080709Sjake ((bitmask>>19) & 0x3) != 0) /* XXX */ { 85180709Sjake /* shifts */ 85286146Stmm you_lose &= (FORMAT3(0x3,0x3f,0x1)) | EIF_F3_X(1); 85380709Sjake } else if (((bitmask>>30) & 0x3) == 0x2 && 85480709Sjake ((bitmask>>19) & 0x3f) == 0x2c) /* XXX */ { 85580709Sjake /* cmov */ 85680709Sjake you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf)); 85780709Sjake } else if (((bitmask>>30) & 0x3) == 0x2 && 85880709Sjake ((bitmask>>19) & 0x3f) == 0x35) /* XXX */ { 85980709Sjake /* fmov */ 86080709Sjake you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf)); 86180709Sjake } else { 86280709Sjake you_lose &= (FORMAT3(0x3,0x3f,0x1)); 86380709Sjake } 86480709Sjake 86580709Sjake if (((bitmask & insn) == bitmask) && ((you_lose & insn) == 0)) { 86680709Sjake matchp = 1; 86780709Sjake break; 86880709Sjake } 86980709Sjake i_ptr++; 87080709Sjake }; 87180709Sjake 87280709Sjake if (!matchp) { 87380709Sjake db_printf("undefined\n"); 87480709Sjake return loc + 4; 87580709Sjake } 87680709Sjake 87780709Sjake db_printf("%s", i_ptr->name); 87880709Sjake 87980709Sjake f_ptr = i_ptr->format; 88080709Sjake 88180709Sjake for (cp = f_ptr; *cp; cp++) { 88280709Sjake if (*cp == ',') { 88380709Sjake for (;f_ptr < cp; f_ptr++) 88480709Sjake switch (*f_ptr) { 88580709Sjake case 'a': 88686146Stmm if (insn & EIF_F2_A(1)) 88780709Sjake db_printf(",a"); 88880709Sjake break; 88980709Sjake case 'p': 89086146Stmm if (insn & EIF_F2_P(1)) 89180709Sjake db_printf(",pt"); 89280709Sjake else 89380709Sjake db_printf(",pn"); 89480709Sjake break; 89580709Sjake } 89680709Sjake f_ptr++; 89780709Sjake break; 89880709Sjake } 89980709Sjake } 90080709Sjake db_printf(" \t"); 90180709Sjake 90280709Sjake while (*f_ptr) { 90380709Sjake switch (*f_ptr) { 90480709Sjake int64_t val; 90580709Sjake case '1': 90680709Sjake db_printf("%%%s", regs[((insn >> 14) & 0x1f)]); 90780709Sjake break; 90880709Sjake case '2': 90980709Sjake db_printf("%%%s", regs[(insn & 0x1f)]); 91080709Sjake break; 91180709Sjake case 'd': 91280709Sjake db_printf("%%%s", regs[((insn >> 25) & 0x1f)]); 91380709Sjake break; 91480709Sjake case '3': 91580709Sjake db_printf("%%f%d", ((insn >> 14) & 0x1f)); 91680709Sjake break; 91780709Sjake case '4': 91880709Sjake db_printf("%%f%d", (insn & 0x1f)); 91980709Sjake break; 92080709Sjake case 'e': 92180709Sjake db_printf("%%f%d", ((insn >> 25) & 0x1f)); 92280709Sjake break; 92380709Sjake case 'i': 92480709Sjake /* simm13 -- signed */ 92586146Stmm val = IF_SIMM(insn, 13); 92680709Sjake db_printf("%s0x%x", SIGN(val), (int)abs(val)); 92780709Sjake break; 92880709Sjake case 'j': 92980709Sjake /* simm11 -- signed */ 93086146Stmm val = IF_SIMM(insn, 11); 93180709Sjake db_printf("%s0x%x", SIGN(val), (int)abs(val)); 93280709Sjake break; 93380709Sjake case 'l': 93480709Sjake val = (((insn>>20)&0x3)<<13)|(insn & 0x1fff); 93586146Stmm val = IF_SIMM(val, 16); 93680709Sjake db_printsym((db_addr_t)(loc + (4 * val)), DB_STGY_ANY); 93780709Sjake break; 93880709Sjake case 'm': 93986146Stmm db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 22))), 94080709Sjake DB_STGY_ANY); 94180709Sjake break; 94280709Sjake case 'u': 94386146Stmm db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 19))), 94480709Sjake DB_STGY_ANY); 94580709Sjake break; 94680709Sjake case 'n': 94786146Stmm db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 30))), 94880709Sjake DB_STGY_PROC); 94980709Sjake break; 95080709Sjake case 's': 95180709Sjake db_printf("%%asi"); 95280709Sjake break; 95380709Sjake case 't': 95480709Sjake db_printf("0x%-2.2x", ((insn >> 5) & 0xff)); 95580709Sjake break; 95680709Sjake case 'o': 95780709Sjake db_printf("%%fcc%d", ((insn >> 25) & 0x3)); 95880709Sjake break; 95980709Sjake case 'p': 96080709Sjake case '7': 96180709Sjake db_printf("[%%%s + %%%s]", 96280709Sjake regs[((insn >> 14) & 0x1f)], 96380709Sjake regs[(insn & 0x1f)]); 96480709Sjake if (*f_ptr == '7') 96580709Sjake db_printf(" %d", ((insn >> 5) & 0xff)); 96680709Sjake break; 96780709Sjake case 'q': 96880709Sjake case '8': 96986146Stmm val = IF_SIMM(insn, 13); 97080709Sjake db_printf("[%%%s %c 0x%x]", 97180709Sjake regs[((insn >> 14) & 0x1f)], 97280709Sjake (int)((val<0)?'-':'+'), 97380709Sjake (int)abs(val)); 97480709Sjake if (*f_ptr == '8') 97580709Sjake db_printf(" %%asi"); 97680709Sjake break; 97780709Sjake case '5': 97880709Sjake db_printf("%%fsr"); 97980709Sjake break; 98080709Sjake case '6': 98180709Sjake db_printf("%%fsr"); 98280709Sjake break; 98380709Sjake case '9': 98480709Sjake db_printf("0x%xl", 98580709Sjake ((insn & 0xf) | ((insn >> 4) & 0x7))); 98680709Sjake break; 98780709Sjake case '0': 98880709Sjake db_printf("%%%s", ccodes[((insn >> 11) & 0x3) + 4]); 98980709Sjake break; 99080709Sjake case '.': 99180709Sjake db_printf("%%%s", ccodes[((insn >> 11) & 0x7)]); 99280709Sjake break; 99380709Sjake case 'r': 99480709Sjake db_printf("#%s", prefetch[((insn >> 25) & 0x1f)]); 99580709Sjake break; 99680709Sjake case 'A': 99780709Sjake db_printf("%%%s", priv_regs[((insn >> 14) & 0x1f)]); 99880709Sjake break; 99980709Sjake case 'B': 100080709Sjake db_printf("%%%s", state_regs[((insn >> 14) & 0x1f)]); 100180709Sjake break; 100280709Sjake case 'C': 100380709Sjake db_printf("%%hi(0x%x)", ((insn & 0x3fffff) << 10)); 100480709Sjake break; 100580709Sjake case 'D': 100680709Sjake db_printf("0x%x", (insn & 0x1f)); 100780709Sjake break; 100880709Sjake case 'E': 100980709Sjake db_printf("%d", (insn & 0x3f)); 101080709Sjake break; 101180709Sjake case 'F': 101280709Sjake db_printf("%d", (insn & 0x3f)); 101380709Sjake break; 101480709Sjake case 'G': 101580709Sjake db_printf("%%%s", priv_regs[((insn >> 25) & 0x1f)]); 101680709Sjake break; 101780709Sjake case 'H': 101880709Sjake db_printf("%%%s", state_regs[((insn >> 25) & 0x1f)]); 101980709Sjake break; 102080709Sjake default: 102180709Sjake db_printf("(UNKNOWN)"); 102280709Sjake break; 102380709Sjake } 102480709Sjake if (*(++f_ptr)) 102580709Sjake db_printf(", "); 102680709Sjake }; 102780709Sjake 102880709Sjake db_printf("\n"); 102980709Sjake 103080709Sjake return (loc + 4); 103180709Sjake} 1032