2001-11-06 20:13:44 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1994 David S. Miller, davem@nadzieja.rutgers.edu
|
|
|
|
* Copyright (c) 1995 Paul Kranenburg
|
|
|
|
* Copyright (c) 2001 Thomas Moestl <tmm@FreeBSD.org>
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by David Miller.
|
|
|
|
* 4. The name of the author may not be used to endorse or promote products
|
|
|
|
* derived from this software without specific prior written permission
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* from: NetBSD: db_disasm.c,v 1.9 2000/08/16 11:29:42 pk Exp
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MACHINE_INSTR_H_
|
|
|
|
#define _MACHINE_INSTR_H_
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for all instruction formats
|
|
|
|
*/
|
|
|
|
#define IF_OP_SHIFT 30
|
|
|
|
#define IF_OP_BITS 2
|
|
|
|
#define IF_IMM_SHIFT 0 /* Immediate/Displacement */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for format 2
|
|
|
|
*/
|
|
|
|
#define IF_F2_RD_SHIFT 25
|
|
|
|
#define IF_F2_RD_BITS 5
|
|
|
|
#define IF_F2_A_SHIFT 29
|
|
|
|
#define IF_F2_A_BITS 1
|
|
|
|
#define IF_F2_COND_SHIFT 25
|
|
|
|
#define IF_F2_COND_BITS 4
|
|
|
|
#define IF_F2_RCOND_SHIFT 25
|
|
|
|
#define IF_F2_RCOND_BITS 3
|
|
|
|
#define IF_F2_OP2_SHIFT 22
|
|
|
|
#define IF_F2_OP2_BITS 3
|
|
|
|
#define IF_F2_CC1_SHIFT 21
|
|
|
|
#define IF_F2_CC1_BITS 1
|
|
|
|
#define IF_F2_CC0_SHIFT 20
|
|
|
|
#define IF_F2_CC0_BITS 1
|
2002-03-11 03:03:35 +00:00
|
|
|
#define IF_F2_CC_SHIFT 20 /* CC0 and CC1 combined. */
|
|
|
|
#define IF_F2_CC_BITS 2
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IF_F2_D16HI_SHIFT 20
|
|
|
|
#define IF_F2_D16HI_BITS 2
|
|
|
|
#define IF_F2_P_SHIFT 19
|
|
|
|
#define IF_F2_P_BITS 1
|
|
|
|
#define IF_F2_RS1_SHIFT 14
|
|
|
|
#define IF_F2_RS1_BITS 5
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for format 3
|
|
|
|
*/
|
|
|
|
#define IF_F3_OP3_SHIFT 19
|
|
|
|
#define IF_F3_OP3_BITS 6
|
|
|
|
#define IF_F3_RD_SHIFT IF_F2_RD_SHIFT
|
|
|
|
#define IF_F3_RD_BITS IF_F2_RD_BITS
|
|
|
|
#define IF_F3_FCN_SHIFT 25
|
|
|
|
#define IF_F3_FCN_BITS 5
|
|
|
|
#define IF_F3_CC1_SHIFT 26
|
|
|
|
#define IF_F3_CC1_BITS 1
|
|
|
|
#define IF_F3_CC0_SHIFT 25
|
|
|
|
#define IF_F3_CC0_BITS 1
|
2002-03-11 03:03:35 +00:00
|
|
|
#define IF_F3_CC_SHIFT 25 /* CC0 and CC1 combined. */
|
|
|
|
#define IF_F3_CC_BITS 2
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IF_F3_RS1_SHIFT IF_F2_RS1_SHIFT
|
|
|
|
#define IF_F3_RS1_BITS IF_F2_RS1_BITS
|
|
|
|
#define IF_F3_I_SHIFT 13
|
|
|
|
#define IF_F3_I_BITS 1
|
|
|
|
#define IF_F3_X_SHIFT 12
|
|
|
|
#define IF_F3_X_BITS 1
|
|
|
|
#define IF_F3_RCOND_SHIFT 10
|
|
|
|
#define IF_F3_RCOND_BITS 3
|
|
|
|
#define IF_F3_IMM_ASI_SHIFT 5
|
|
|
|
#define IF_F3_IMM_ASI_BITS 8
|
|
|
|
#define IF_F3_OPF_SHIFT 5
|
|
|
|
#define IF_F3_OPF_BITS 9
|
|
|
|
#define IF_F3_CMASK_SHIFT 4
|
|
|
|
#define IF_F3_CMASK_BITS 3
|
|
|
|
#define IF_F3_RS2_SHIFT 0
|
|
|
|
#define IF_F3_RS2_BITS 5
|
|
|
|
#define IF_F3_SHCNT32_SHIFT 0
|
|
|
|
#define IF_F3_SHCNT32_BITS 5
|
|
|
|
#define IF_F3_SHCNT64_SHIFT 0
|
|
|
|
#define IF_F3_SHCNT64_BITS 6
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for format 4
|
|
|
|
*/
|
|
|
|
#define IF_F4_OP3_SHIFT IF_F3_OP3_SHIFT
|
|
|
|
#define IF_F4_OP3_BITS IF_F3_OP3_BITS
|
|
|
|
#define IF_F4_RD_SHIFT IF_F2_RD_SHIFT
|
|
|
|
#define IF_F4_RD_BITS IF_F2_RD_BITS
|
|
|
|
#define IF_F4_RS1_SHIFT IF_F2_RS1_SHIFT
|
|
|
|
#define IF_F4_RS1_BITS IF_F2_RS1_BITS
|
|
|
|
#define IF_F4_TCOND_SHIFT IF_F2_COND_SHIFT /* cond for Tcc */
|
|
|
|
#define IF_F4_TCOND_BITS IF_F2_COND_BITS
|
|
|
|
#define IF_F4_CC2_SHIFT 18
|
|
|
|
#define IF_F4_CC2_BITS 1
|
|
|
|
#define IF_F4_COND_SHIFT 14
|
|
|
|
#define IF_F4_COND_BITS 4
|
|
|
|
#define IF_F4_I_SHIFT IF_F3_I_SHIFT
|
|
|
|
#define IF_F4_I_BITS IF_F3_I_BITS
|
|
|
|
#define IF_F4_OPF_CC_SHIFT 11
|
|
|
|
#define IF_F4_OPF_CC_BITS 3
|
|
|
|
#define IF_F4_CC1_SHIFT 12
|
|
|
|
#define IF_F4_CC1_BITS 1
|
|
|
|
#define IF_F4_CC0_SHIFT 11
|
|
|
|
#define IF_F4_CC0_BITS 1
|
|
|
|
#define IF_F4_RCOND_SHIFT IF_F3_RCOND_SHIFT
|
|
|
|
#define IF_F4_RCOND_BITS IF_F3_RCOND_BITS
|
|
|
|
#define IF_F4_OPF_LOW_SHIFT 5
|
|
|
|
#define IF_F4_RS2_SHIFT IF_F3_RS2_SHIFT
|
|
|
|
#define IF_F4_RS2_BITS IF_F3_RS2_BITS
|
|
|
|
#define IF_F4_SW_TRAP_SHIFT 0
|
|
|
|
#define IF_F4_SW_TRAP_BITS 7
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Macros to decode instructions
|
|
|
|
*/
|
|
|
|
/* Extract a field */
|
2001-12-29 08:55:56 +00:00
|
|
|
#define IF_MASK(s, w) (((1 << (w)) - 1) << (s))
|
|
|
|
#define IF_EXTRACT(x, s, w) (((x) & IF_MASK((s), (w))) >> (s))
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IF_DECODE(x, f) \
|
|
|
|
IF_EXTRACT((x), IF_ ## f ## _SHIFT, IF_ ## f ## _BITS)
|
|
|
|
|
|
|
|
/* Sign-extend a field of width W */
|
|
|
|
#define IF_SEXT(x, w) \
|
2002-05-13 04:26:38 +00:00
|
|
|
(((x) & (1L << ((w) - 1))) != 0 ? \
|
|
|
|
(-1L - ((x) ^ ((1L << (w)) - 1))) : (x))
|
2001-11-06 20:13:44 +00:00
|
|
|
|
|
|
|
#if 0
|
|
|
|
/*
|
|
|
|
* The following C variant is from db_disassemble.c, and surely faster, but it
|
|
|
|
* relies on behaviour that is undefined by the C standard (>> in conjunction
|
|
|
|
* with signed negative arguments).
|
|
|
|
*/
|
|
|
|
#define IF_SEXT(v, w) ((((long long)(v)) << (64 - w)) >> (64 - w))
|
|
|
|
/* Assembler version of the above */
|
|
|
|
#define IF_SEXT(v, w) \
|
|
|
|
{ u_long t; ( __asm __volatile("sllx %1, %2, %0; srax %0, %2, %0" :
|
|
|
|
"=r" (t) : "r" (v) : "i" (64 - w)); t)}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* All instruction formats */
|
|
|
|
#define IF_OP(i) IF_DECODE(i, OP)
|
|
|
|
|
|
|
|
/* Instruction format 2 */
|
|
|
|
#define IF_F2_RD(i) IF_DECODE((i), F2_RD)
|
|
|
|
#define IF_F2_A(i) IF_DECODE((i), F2_A)
|
|
|
|
#define IF_F2_COND(i) IF_DECODE((i), F2_COND)
|
|
|
|
#define IF_F2_RCOND(i) IF_DECODE((i), F2_RCOND)
|
|
|
|
#define IF_F2_OP2(i) IF_DECODE((i), F2_OP2)
|
|
|
|
#define IF_F2_CC1(i) IF_DECODE((i), F2_CC1)
|
|
|
|
#define IF_F2_CC0(i) IF_DECODE((i), F2_CC0)
|
2002-03-11 03:03:35 +00:00
|
|
|
#define IF_F2_CC(i) IF_DECODE((i), F2_CC)
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IF_F2_D16HI(i) IF_DECODE((i), F2_D16HI)
|
|
|
|
#define IF_F2_P(i) IF_DECODE((i), F2_P)
|
|
|
|
#define IF_F2_RS1(i) IF_DECODE((i), F2_RS1)
|
|
|
|
|
|
|
|
/* Instruction format 3 */
|
|
|
|
#define IF_F3_OP3(i) IF_DECODE((i), F3_OP3)
|
|
|
|
#define IF_F3_RD(i) IF_F2_RD((i))
|
|
|
|
#define IF_F3_FCN(i) IF_DECODE((i), F3_FCN)
|
|
|
|
#define IF_F3_CC1(i) IF_DECODE((i), F3_CC1)
|
|
|
|
#define IF_F3_CC0(i) IF_DECODE((i), F3_CC0)
|
2002-03-11 03:03:35 +00:00
|
|
|
#define IF_F3_CC(i) IF_DECODE((i), F3_CC)
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IF_F3_RS1(i) IF_F2_RS1((i))
|
|
|
|
#define IF_F3_I(i) IF_DECODE((i), F3_I)
|
|
|
|
#define IF_F3_X(i) IF_DECODE((i), F3_X)
|
|
|
|
#define IF_F3_RCOND(i) IF_DECODE((i), F3_RCOND)
|
|
|
|
#define IF_F3_IMM_ASI(i) IF_DECODE((i), F3_IMM_ASI)
|
|
|
|
#define IF_F3_OPF(i) IF_DECODE((i), F3_OPF)
|
|
|
|
#define IF_F3_CMASK(i) IF_DECODE((i), F3_CMASK)
|
|
|
|
#define IF_F3_RS2(i) IF_DECODE((i), F3_RS2)
|
|
|
|
#define IF_F3_SHCNT32(i) IF_DECODE((i), F3_SHCNT32)
|
|
|
|
#define IF_F3_SHCNT64(i) IF_DECODE((i), F3_SHCNT64)
|
|
|
|
|
|
|
|
/* Instruction format 4 */
|
|
|
|
#define IF_F4_OP3(i) IF_F3_OP3((i))
|
|
|
|
#define IF_F4_RD(i) IF_F3_RD((i))
|
|
|
|
#define IF_F4_TCOND(i) IF_DECODE((i), F4_TCOND)
|
|
|
|
#define IF_F4_RS1(i) IF_F3_RS1((i))
|
|
|
|
#define IF_F4_CC2(i) IF_DECODE((i), F4_CC2)
|
|
|
|
#define IF_F4_COND(i) IF_DECODE((i), F4_COND)
|
|
|
|
#define IF_F4_I(i) IF_F3_I((i))
|
|
|
|
#define IF_F4_OPF_CC(i) IF_DECODE((i), F4_OPF_CC)
|
|
|
|
#define IF_F4_RCOND(i) IF_F3_RCOND((i))
|
|
|
|
#define IF_F4_OPF_LOW(i, w) IF_EXTRACT((i), IF_F4_OPF_LOW_SHIFT, (w))
|
|
|
|
#define IF_F4_RS2(i) IF_F3_RS2((i))
|
|
|
|
#define IF_F4_SW_TRAP(i) IF_DECODE((i), F4_SW_TRAP)
|
|
|
|
|
|
|
|
/* Extract an immediate from an instruction, with an without sign extension */
|
|
|
|
#define IF_IMM(i, w) IF_EXTRACT((i), IF_IMM_SHIFT, (w))
|
|
|
|
#define IF_SIMM(i, w) ({ u_long b = (w), x = IF_IMM((i), b); IF_SEXT((x), b); })
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Macros to encode instructions
|
|
|
|
*/
|
|
|
|
#define IF_INSERT(x, s, w) (((x) & ((1 << (w)) - 1)) << (s))
|
|
|
|
#define IF_ENCODE(x, f) \
|
|
|
|
IF_INSERT((x), IF_ ## f ## _SHIFT, IF_ ## f ## _BITS)
|
|
|
|
|
|
|
|
/* All instruction formats */
|
|
|
|
#define EIF_OP(x) IF_ENCODE((x), OP)
|
|
|
|
|
|
|
|
/* Instruction format 2 */
|
|
|
|
#define EIF_F2_RD(x) IF_ENCODE((x), F2_RD)
|
|
|
|
#define EIF_F2_A(x) IF_ENCODE((x), F2_A)
|
|
|
|
#define EIF_F2_COND(x) IF_ENCODE((x), F2_COND)
|
|
|
|
#define EIF_F2_RCOND(x) IF_ENCODE((x), F2_RCOND)
|
|
|
|
#define EIF_F2_OP2(x) IF_ENCODE((x), F2_OP2)
|
|
|
|
#define EIF_F2_CC1(x) IF_ENCODE((x), F2_CC1)
|
|
|
|
#define EIF_F2_CC0(x) IF_ENCODE((x), F2_CC0)
|
|
|
|
#define EIF_F2_D16HI(x) IF_ENCODE((x), F2_D16HI)
|
|
|
|
#define EIF_F2_P(x) IF_ENCODE((x), F2_P)
|
|
|
|
#define EIF_F2_RS1(x) IF_ENCODE((x), F2_RS1)
|
|
|
|
|
|
|
|
/* Instruction format 3 */
|
|
|
|
#define EIF_F3_OP3(x) IF_ENCODE((x), F3_OP3)
|
|
|
|
#define EIF_F3_RD(x) EIF_F2_RD((x))
|
|
|
|
#define EIF_F3_FCN(x) IF_ENCODE((x), F3_FCN)
|
|
|
|
#define EIF_F3_CC1(x) IF_ENCODE((x), F3_CC1)
|
|
|
|
#define EIF_F3_CC0(x) IF_ENCODE((x), F3_CC0)
|
|
|
|
#define EIF_F3_RS1(x) EIF_F2_RS1((x))
|
|
|
|
#define EIF_F3_I(x) IF_ENCODE((x), F3_I)
|
|
|
|
#define EIF_F3_X(x) IF_ENCODE((x), F3_X)
|
|
|
|
#define EIF_F3_RCOND(x) IF_ENCODE((x), F3_RCOND)
|
|
|
|
#define EIF_F3_IMM_ASI(x) IF_ENCODE((x), F3_IMM_ASI)
|
|
|
|
#define EIF_F3_OPF(x) IF_ENCODE((x), F3_OPF)
|
|
|
|
#define EIF_F3_CMASK(x) IF_ENCODE((x), F3_CMASK)
|
|
|
|
#define EIF_F3_RS2(x) IF_ENCODE((x), F3_RS2)
|
|
|
|
#define EIF_F3_SHCNT32(x) IF_ENCODE((x), F3_SHCNT32)
|
|
|
|
#define EIF_F3_SHCNT64(x) IF_ENCODE((x), F3_SHCNT64)
|
|
|
|
|
|
|
|
/* Instruction format 4 */
|
|
|
|
#define EIF_F4_OP3(x) EIF_F3_OP3((x))
|
|
|
|
#define EIF_F4_RD(x) EIF_F2_RD((x))
|
|
|
|
#define EIF_F4_TCOND(x) IF_ENCODE((x), F4_TCOND)
|
|
|
|
#define EIF_F4_RS1(x) EIF_F2_RS1((x))
|
|
|
|
#define EIF_F4_CC2(x) IF_ENCODE((x), F4_CC2)
|
|
|
|
#define EIF_F4_COND(x) IF_ENCODE((x), F4_COND)
|
|
|
|
#define EIF_F4_I(x) EIF_F3_I((x))
|
|
|
|
#define EIF_F4_OPF_CC(x) IF_ENCODE((x), F4_OPF_CC)
|
|
|
|
#define EIF_F4_RCOND(x) EIF_F3_RCOND((x))
|
|
|
|
#define EIF_F4_OPF_LOW(i, w) IF_INSERT((x), IF_F4_OPF_CC_SHIFT, (w))
|
|
|
|
#define EIF_F4_RS2(x) EIF_F3_RS2((x))
|
|
|
|
#define EIF_F4_SW_TRAP(x) IF_ENCODE((x), F4_SW_TRAP)
|
|
|
|
|
|
|
|
/* Immediates */
|
|
|
|
#define EIF_IMM(x, w) IF_INSERT((x), IF_IMM_SHIFT, (w))
|
|
|
|
#define EIF_SIMM(x, w) IF_EIMM((x), (w))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* OP field values (specifying the instruction format)
|
|
|
|
*/
|
|
|
|
#define IOP_FORM2 0x00 /* Format 2: sethi, branches */
|
|
|
|
#define IOP_CALL 0x01 /* Format 1: call */
|
|
|
|
#define IOP_MISC 0x02 /* Format 3 or 4: arith & misc */
|
|
|
|
#define IOP_LDST 0x03 /* Format 4: loads and stores */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* OP2/OP3 values (specifying the actual instruction)
|
|
|
|
*/
|
|
|
|
/* OP2 values for format 2 (OP = 0) */
|
|
|
|
#define INS0_ILLTRAP 0x00
|
|
|
|
#define INS0_BPcc 0x01
|
|
|
|
#define INS0_Bicc 0x02
|
|
|
|
#define INS0_BPr 0x03
|
|
|
|
#define INS0_SETHI 0x04 /* with rd = 0 and imm22 = 0, nop */
|
|
|
|
#define INS0_FBPfcc 0x05
|
|
|
|
#define INS0_FBfcc 0x06
|
|
|
|
/* undefined 0x07 */
|
|
|
|
|
|
|
|
/* OP3 values for Format 3 and 4 (OP = 2) */
|
|
|
|
#define INS2_ADD 0x00
|
|
|
|
#define INS2_AND 0x01
|
|
|
|
#define INS2_OR 0x02
|
|
|
|
#define INS2_XOR 0x03
|
|
|
|
#define INS2_SUB 0x04
|
|
|
|
#define INS2_ANDN 0x05
|
|
|
|
#define INS2_ORN 0x06
|
|
|
|
#define INS2_XNOR 0x07
|
|
|
|
#define INS2_ADDC 0x08
|
|
|
|
#define INS2_MULX 0x09
|
|
|
|
#define INS2_UMUL 0x0a
|
|
|
|
#define INS2_SMUL 0x0b
|
|
|
|
#define INS2_SUBC 0x0c
|
|
|
|
#define INS2_UDIVX 0x0d
|
|
|
|
#define INS2_UDIV 0x0e
|
|
|
|
#define INS2_SDIV 0x0f
|
|
|
|
#define INS2_ADDcc 0x10
|
|
|
|
#define INS2_ANDcc 0x11
|
|
|
|
#define INS2_ORcc 0x12
|
|
|
|
#define INS2_XORcc 0x13
|
|
|
|
#define INS2_SUBcc 0x14
|
|
|
|
#define INS2_ANDNcc 0x15
|
|
|
|
#define INS2_ORNcc 0x16
|
|
|
|
#define INS2_XNORcc 0x17
|
|
|
|
#define INS2_ADDCcc 0x18
|
|
|
|
/* undefined 0x19 */
|
|
|
|
#define INS2_UMULcc 0x1a
|
|
|
|
#define INS2_SMULcc 0x1b
|
|
|
|
#define INS2_SUBCcc 0x1c
|
|
|
|
/* undefined 0x1d */
|
|
|
|
#define INS2_UDIVcc 0x1e
|
|
|
|
#define INS2_SDIVcc 0x1f
|
|
|
|
#define INS2_TADDcc 0x20
|
|
|
|
#define INS2_TSUBcc 0x21
|
|
|
|
#define INS2_TADDccTV 0x22
|
|
|
|
#define INS2_TSUBccTV 0x23
|
|
|
|
#define INS2_MULScc 0x24
|
|
|
|
#define INS2_SSL 0x25 /* SLLX when IF_X(i) == 1 */
|
|
|
|
#define INS2_SRL 0x26 /* SRLX when IF_X(i) == 1 */
|
|
|
|
#define INS2_SRA 0x27 /* SRAX when IF_X(i) == 1 */
|
|
|
|
#define INS2_RD 0x28 /* and MEMBAR, STBAR */
|
|
|
|
/* undefined 0x29 */
|
|
|
|
#define INS2_RDPR 0x2a
|
|
|
|
#define INS2_FLUSHW 0x2b
|
|
|
|
#define INS2_MOVcc 0x2c
|
|
|
|
#define INS2_SDIVX 0x2d
|
|
|
|
#define INS2_POPC 0x2e /* undefined if IF_RS1(i) != 0 */
|
|
|
|
#define INS2_MOVr 0x2f
|
|
|
|
#define INS2_WR 0x30 /* and SIR */
|
|
|
|
#define INS2_SV_RSTR 0x31 /* saved, restored */
|
|
|
|
#define INS2_WRPR 0x32
|
|
|
|
/* undefined 0x33 */
|
|
|
|
#define INS2_FPop1 0x34 /* further encoded in opf field */
|
|
|
|
#define INS2_FPop2 0x35 /* further encoded in opf field */
|
|
|
|
#define INS2_IMPLDEP1 0x36
|
|
|
|
#define INS2_IMPLDEP2 0x37
|
|
|
|
#define INS2_JMPL 0x38
|
|
|
|
#define INS2_RETURN 0x39
|
|
|
|
#define INS2_Tcc 0x3a
|
|
|
|
#define INS2_FLUSH 0x3b
|
|
|
|
#define INS2_SAVE 0x3c
|
|
|
|
#define INS2_RESTORE 0x3d
|
|
|
|
#define INS2_DONE_RETR 0x3e /* done, retry */
|
|
|
|
/* undefined 0x3f */
|
|
|
|
|
|
|
|
/* OP3 values for format 3 (OP = 3) */
|
|
|
|
#define INS3_LDUW 0x00
|
|
|
|
#define INS3_LDUB 0x01
|
|
|
|
#define INS3_LDUH 0x02
|
|
|
|
#define INS3_LDD 0x03
|
|
|
|
#define INS3_STW 0x04
|
|
|
|
#define INS3_STB 0x05
|
|
|
|
#define INS3_STH 0x06
|
|
|
|
#define INS3_STD 0x07
|
|
|
|
#define INS3_LDSW 0x08
|
|
|
|
#define INS3_LDSB 0x09
|
|
|
|
#define INS3_LDSH 0x0a
|
|
|
|
#define INS3_LDX 0x0b
|
|
|
|
/* undefined 0x0c */
|
|
|
|
#define INS3_LDSTUB 0x0d
|
|
|
|
#define INS3_STX 0x0e
|
|
|
|
#define INS3_SWAP 0x0f
|
|
|
|
#define INS3_LDUWA 0x10
|
|
|
|
#define INS3_LDUBA 0x11
|
|
|
|
#define INS3_LDUHA 0x12
|
|
|
|
#define INS3_LDDA 0x13
|
|
|
|
#define INS3_STWA 0x14
|
|
|
|
#define INS3_STBA 0x15
|
|
|
|
#define INS3_STHA 0x16
|
|
|
|
#define INS3_STDA 0x17
|
|
|
|
#define INS3_LDSWA 0x18
|
|
|
|
#define INS3_LDSBA 0x19
|
|
|
|
#define INS3_LDSHA 0x1a
|
|
|
|
#define INS3_LDXA 0x1b
|
|
|
|
/* undefined 0x1c */
|
|
|
|
#define INS3_LDSTUBA 0x1d
|
|
|
|
#define INS3_STXA 0x1e
|
|
|
|
#define INS3_SWAPA 0x1f
|
|
|
|
#define INS3_LDF 0x20
|
|
|
|
#define INS3_LDFSR 0x21 /* and LDXFSR */
|
|
|
|
#define INS3_LDQF 0x22
|
|
|
|
#define INS3_LDDF 0x23
|
|
|
|
#define INS3_STF 0x24
|
|
|
|
#define INS3_STFSR 0x25 /* and STXFSR */
|
|
|
|
#define INS3_STQF 0x26
|
|
|
|
#define INS3_STDF 0x27
|
|
|
|
/* undefined 0x28 - 0x2c */
|
|
|
|
#define INS3_PREFETCH 0x2d
|
|
|
|
/* undefined 0x2e - 0x2f */
|
|
|
|
#define INS3_LDFA 0x30
|
|
|
|
/* undefined 0x31 */
|
|
|
|
#define INS3_LDQFA 0x32
|
|
|
|
#define INS3_LDDFA 0x33
|
|
|
|
#define INS3_STFA 0x34
|
|
|
|
/* undefined 0x35 */
|
|
|
|
#define INS3_STQFA 0x36
|
|
|
|
#define INS3_STDFA 0x37
|
|
|
|
/* undefined 0x38 - 0x3b */
|
|
|
|
#define INS3_CASA 0x39
|
|
|
|
#define INS3_PREFETCHA 0x3a
|
|
|
|
#define INS3_CASXA 0x3b
|
|
|
|
|
|
|
|
/*
|
|
|
|
* OPF values (floating point instructions, IMPLDEP)
|
|
|
|
*/
|
2001-12-29 08:55:56 +00:00
|
|
|
/*
|
|
|
|
* These values are or'ed to the FPop values to get the instructions.
|
|
|
|
* They describe the operand type(s).
|
|
|
|
*/
|
|
|
|
#define INSFP_i 0x000 /* 32-bit int */
|
|
|
|
#define INSFP_s 0x001 /* 32-bit single */
|
|
|
|
#define INSFP_d 0x002 /* 64-bit double */
|
|
|
|
#define INSFP_q 0x003 /* 128-bit quad */
|
|
|
|
/* FPop1. The comments give the types for which this instruction is defined. */
|
|
|
|
#define INSFP1_FMOV 0x000 /* s, d, q */
|
|
|
|
#define INSFP1_FNEG 0x004 /* s, d, q */
|
|
|
|
#define INSFP1_FABS 0x008 /* s, d, q */
|
|
|
|
#define INSFP1_FSQRT 0x028 /* s, d, q */
|
|
|
|
#define INSFP1_FADD 0x040 /* s, d, q */
|
|
|
|
#define INSFP1_FSUB 0x044 /* s, d, q */
|
|
|
|
#define INSFP1_FMUL 0x048 /* s, d, q */
|
|
|
|
#define INSFP1_FDIV 0x04c /* s, d, q */
|
|
|
|
#define INSFP1_FsMULd 0x068 /* s */
|
|
|
|
#define INSFP1_FdMULq 0x06c /* d */
|
|
|
|
#define INSFP1_FTOx 0x080 /* s, d, q */
|
|
|
|
#define INSFP1_FxTOs 0x084 /* special: i only */
|
|
|
|
#define INSFP1_FxTOd 0x088 /* special: i only */
|
|
|
|
#define INSFP1_FxTOq 0x08c /* special: i only */
|
|
|
|
#define INSFP1_FTOs 0x0c4 /* i, d, q */
|
|
|
|
#define INSFP1_FTOd 0x0c8 /* i, s, q */
|
|
|
|
#define INSFP1_FTOq 0x0cc /* i, s, d */
|
|
|
|
#define INSFP1_FTOi 0x0d0 /* i, s, d */
|
2001-11-06 20:13:44 +00:00
|
|
|
|
|
|
|
/* FPop2 */
|
|
|
|
#define INSFP2_FMOV_CCMUL 0x40
|
2001-12-29 08:55:56 +00:00
|
|
|
#define INSFP2_FMOV_CCOFFS 0x00
|
|
|
|
/* Use the IFCC_* constants for cc. Operand types: s, d, q */
|
|
|
|
#define INSFP2_FMOV_CC(cc) ((cc) * INSFP2_FMOV_CCMUL + INSFP2_FMOV_CCOFFS)
|
2001-11-06 20:13:44 +00:00
|
|
|
#define INSFP2_FMOV_RCMUL 0x20
|
2001-12-29 08:55:56 +00:00
|
|
|
#define INSFP2_FMOV_RCOFFS 0x04
|
|
|
|
/* Use the IRCOND_* constants for rc. Operand types: s, d, q */
|
|
|
|
#define INSFP2_FMOV_RC(rc) ((rc) * INSFP2_FMOV_RCMUL + INSFP2_FMOV_RCOFFS)
|
|
|
|
#define INSFP2_FCMP 0x050 /* s, d, q */
|
|
|
|
#define INSFP2_FCMPE 0x054 /* s, d, q */
|
2001-11-06 20:13:44 +00:00
|
|
|
|
2002-05-11 21:20:05 +00:00
|
|
|
/* Decode 5-bit register field into 6-bit number (for doubles and quads). */
|
|
|
|
#define INSFPdq_RN(rn) (((rn) & ~1) | (((rn) & 1) << 5))
|
|
|
|
|
2001-11-06 20:13:44 +00:00
|
|
|
/* IMPLDEP1 for Sun UltraSparc */
|
|
|
|
#define IIDP1_EDGE8 0x00
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE8N 0x01 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_EDGE8L 0x02
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE8LN 0x03 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_EDGE16 0x04
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE16N 0x05 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_EDGE16L 0x06
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE16LN 0x07 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_EDGE32 0x08
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE32N 0x09 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_EDGE32L 0x0a
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_EDGE32LN 0x0b /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_ARRAY8 0x10
|
|
|
|
#define IIDP1_ARRAY16 0x12
|
|
|
|
#define IIDP1_ARRAY32 0x14
|
|
|
|
#define IIDP1_ALIGNADDRESS 0x18
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_BMASK 0x19 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_ALIGNADDRESS_L 0x1a
|
|
|
|
#define IIDP1_FCMPLE16 0x20
|
|
|
|
#define IIDP1_FCMPNE16 0x22
|
|
|
|
#define IIDP1_FCMPLE32 0x24
|
|
|
|
#define IIDP1_FCMPNE32 0x26
|
|
|
|
#define IIDP1_FCMPGT16 0x28
|
|
|
|
#define IIDP1_FCMPEQ16 0x2a
|
|
|
|
#define IIDP1_FCMPGT32 0x2c
|
|
|
|
#define IIDP1_FCMPEQ32 0x2e
|
|
|
|
#define IIDP1_FMUL8x16 0x31
|
|
|
|
#define IIDP1_FMUL8x16AU 0x33
|
|
|
|
#define IIDP1_FMUL8X16AL 0x35
|
|
|
|
#define IIDP1_FMUL8SUx16 0x36
|
|
|
|
#define IIDP1_FMUL8ULx16 0x37
|
|
|
|
#define IIDP1_FMULD8SUx16 0x38
|
|
|
|
#define IIDP1_FMULD8ULx16 0x39
|
|
|
|
#define IIDP1_FPACK32 0x3a
|
|
|
|
#define IIDP1_FPACK16 0x3b
|
|
|
|
#define IIDP1_FPACKFIX 0x3d
|
|
|
|
#define IIDP1_PDIST 0x3e
|
|
|
|
#define IIDP1_FALIGNDATA 0x48
|
|
|
|
#define IIDP1_FPMERGE 0x4b
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_BSHUFFLE 0x4c /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IIDP1_FEXPAND 0x4d
|
|
|
|
#define IIDP1_FPADD16 0x50
|
|
|
|
#define IIDP1_FPADD16S 0x51
|
|
|
|
#define IIDP1_FPADD32 0x52
|
|
|
|
#define IIDP1_FPADD32S 0x53
|
|
|
|
#define IIDP1_SUB16 0x54
|
|
|
|
#define IIDP1_SUB16S 0x55
|
|
|
|
#define IIDP1_SUB32 0x56
|
|
|
|
#define IIDP1_SUB32S 0x57
|
|
|
|
#define IIDP1_FZERO 0x60
|
|
|
|
#define IIDP1_FZEROS 0x61
|
|
|
|
#define IIDP1_FNOR 0x62
|
|
|
|
#define IIDP1_FNORS 0x63
|
|
|
|
#define IIDP1_FANDNOT2 0x64
|
|
|
|
#define IIDP1_FANDNOT2S 0x65
|
|
|
|
#define IIDP1_NOT2 0x66
|
|
|
|
#define IIDP1_NOT2S 0x67
|
|
|
|
#define IIDP1_FANDNOT1 0x68
|
|
|
|
#define IIDP1_FANDNOT1S 0x69
|
|
|
|
#define IIDP1_FNOT1 0x6a
|
|
|
|
#define IIDP1_FNOT1S 0x6b
|
|
|
|
#define IIDP1_FXOR 0x6c
|
|
|
|
#define IIDP1_FXORS 0x6d
|
|
|
|
#define IIDP1_FNAND 0x6e
|
|
|
|
#define IIDP1_FNANDS 0x6f
|
|
|
|
#define IIDP1_FAND 0x70
|
|
|
|
#define IIDP1_FANDS 0x71
|
|
|
|
#define IIDP1_FXNOR 0x72
|
|
|
|
#define IIDP1_FXNORS 0x73
|
|
|
|
#define IIDP1_FSRC1 0x74
|
|
|
|
#define IIDP1_FSRC1S 0x75
|
|
|
|
#define IIDP1_FORNOT2 0x76
|
|
|
|
#define IIDP1_FORNOT2S 0x77
|
|
|
|
#define IIDP1_FSRC2 0x78
|
|
|
|
#define IIDP1_FSRC2S 0x79
|
|
|
|
#define IIDP1_FORNOT1 0x7a
|
|
|
|
#define IIDP1_FORNOT1S 0x7b
|
|
|
|
#define IIDP1_FOR 0x7c
|
|
|
|
#define IIDP1_FORS 0x7d
|
|
|
|
#define IIDP1_FONE 0x7e
|
|
|
|
#define IIDP1_FONES 0x7f
|
|
|
|
#define IIDP1_SHUTDOWN 0x80
|
2002-07-16 17:44:01 +00:00
|
|
|
#define IIDP1_SIAM 0x81 /* US-III */
|
2001-11-06 20:13:44 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Instruction modifiers
|
|
|
|
*/
|
|
|
|
/* cond values for integer ccr's */
|
|
|
|
#define IICOND_N 0x00
|
|
|
|
#define IICOND_E 0x01
|
|
|
|
#define IICOND_LE 0x02
|
|
|
|
#define IICOND_L 0x03
|
|
|
|
#define IICOND_LEU 0x04
|
|
|
|
#define IICOND_CS 0x05
|
|
|
|
#define IICOND_NEG 0x06
|
|
|
|
#define IICOND_VS 0x07
|
|
|
|
#define IICOND_A 0x08
|
|
|
|
#define IICOND_NE 0x09
|
|
|
|
#define IICOND_G 0x0a
|
|
|
|
#define IICOND_GE 0x0b
|
|
|
|
#define IICOND_GU 0x0c
|
|
|
|
#define IICOND_CC 0x0d
|
|
|
|
#define IICOND_POS 0x0e
|
|
|
|
#define IICOND_VC 0x0f
|
|
|
|
|
|
|
|
/* cond values for fp ccr's */
|
|
|
|
#define IFCOND_N 0x00
|
|
|
|
#define IFCOND_NE 0x01
|
|
|
|
#define IFCOND_LG 0x02
|
|
|
|
#define IFCOND_UL 0x03
|
|
|
|
#define IFCOND_L 0x04
|
|
|
|
#define IFCOND_UG 0x05
|
|
|
|
#define IFCOND_G 0x06
|
|
|
|
#define IFCOND_U 0x07
|
|
|
|
#define IFCOND_A 0x08
|
|
|
|
#define IFCOND_E 0x09
|
|
|
|
#define IFCOND_UE 0x0a
|
|
|
|
#define IFCOND_GE 0x0b
|
|
|
|
#define IFCOND_UGE 0x0c
|
|
|
|
#define IFCOND_LE 0x0d
|
|
|
|
#define IFCOND_ULE 0x0e
|
|
|
|
#define IFCOND_O 0x0f
|
|
|
|
|
|
|
|
/* rcond values for BPr, MOVr, FMOVr */
|
2001-12-29 08:55:56 +00:00
|
|
|
#define IRCOND_Z 0x01
|
2001-11-06 20:13:44 +00:00
|
|
|
#define IRCOND_LEZ 0x02
|
|
|
|
#define IRCOND_LZ 0x03
|
|
|
|
#define IRCOND_NZ 0x05
|
|
|
|
#define IRCOND_GZ 0x06
|
|
|
|
#define IRCOND_GEZ 0x07
|
|
|
|
|
|
|
|
/* cc values for MOVcc and FMOVcc */
|
|
|
|
#define IFCC_ICC 0x04
|
|
|
|
#define IFCC_XCC 0x06
|
|
|
|
/* if true, the lower 2 bits are the fcc number */
|
2001-12-29 08:55:56 +00:00
|
|
|
#define IFCC_FCC(c) ((c) & 3)
|
|
|
|
#define IFCC_GET_FCC(c) ((c) & 3)
|
|
|
|
#define IFCC_ISFCC(c) (((c) & 4) == 0)
|
2001-11-06 20:13:44 +00:00
|
|
|
|
|
|
|
/* cc values for BPc and Tcc */
|
|
|
|
#define IBCC_ICC 0x00
|
|
|
|
#define IBCC_XCC 0x02
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Integer registers
|
|
|
|
*/
|
|
|
|
#define IREG_G0 0x00
|
|
|
|
#define IREG_O0 0x08
|
|
|
|
#define IREG_L0 0x10
|
|
|
|
#define IREQ_I0 0x18
|
|
|
|
|
|
|
|
#endif /* !_MACHINE_INSTR_H_ */
|