xref: /csrg-svn/sys/sparc/include/instr.h (revision 63320)
155121Storek /*
2*63320Sbostic  * Copyright (c) 1992, 1993
3*63320Sbostic  *	The Regents of the University of California.  All rights reserved.
455121Storek  *
555121Storek  * This software was developed by the Computer Systems Engineering group
655121Storek  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
755121Storek  * contributed to Berkeley.
855121Storek  *
955501Sbostic  * All advertising materials mentioning features or use of this software
1055501Sbostic  * must display the following acknowledgement:
1155501Sbostic  *	This product includes software developed by the University of
1259209Storek  *	California, Lawrence Berkeley Laboratory.
1355501Sbostic  *
1455121Storek  * %sccs.include.redist.c%
1555121Storek  *
16*63320Sbostic  *	@(#)instr.h	8.1 (Berkeley) 06/11/93
1755121Storek  *
1859209Storek  * from: $Header: instr.h,v 1.6 92/11/26 02:04:37 torek Exp $
1955121Storek  */
2055121Storek 
2155121Storek /* see also Appendix F of the SPARC version 8 document */
2255121Storek enum IOP { IOP_OP2, IOP_CALL, IOP_reg, IOP_mem };
2355121Storek enum IOP2 { IOP2_UNIMP, IOP2_err1, IOP2_Bicc, IOP2_err3,
2455121Storek 	IOP2_SETHI, IOP2_err5, IOP2_FBfcc, IOP2_CBccc };
2555121Storek enum IOP3_reg {
2655121Storek 	IOP3_ADD, IOP3_AND, IOP3_OR, IOP3_XOR,
2755121Storek 	IOP3_SUB, IOP3_ANDN, IOP3_ORN, IOP3_XNOR,
2855121Storek 	IOP3_ADDX, IOP3_rerr09, IOP3_UMUL, IOP3_SMUL,
2955121Storek 	IOP3_SUBX, IOP3_rerr0d, IOP3_UDIV, IOP3_SDIV,
3055121Storek 	IOP3_ADDcc, IOP3_ANDcc, IOP3_ORcc, IOP3_XORcc,
3155121Storek 	IOP3_SUBcc, IOP3_ANDNcc, IOP3_ORNcc, IOP3_XNORcc,
3255121Storek 	IOP3_ADDXcc, IOP3_rerr19, IOP3_UMULcc, IOP3_SMULcc,
3355121Storek 	IOP3_SUBXcc, IOP3_rerr1d, IOP3_UDIVcc, IOP3_SDIVcc,
3455121Storek 	IOP3_TADDcc, IOP3_TSUBcc, IOP3_TADDccTV, IOP3_TSUBccTV,
3555121Storek 	IOP3_MULScc, IOP3_SLL, IOP3_SRL, IOP3_SRA,
3655121Storek 	IOP3_RDASR_RDY_STBAR, IOP3_RDPSR, IOP3_RDWIM, IOP3_RDTGBR,
3755121Storek 	IOP3_rerr2c, IOP3_rerr2d, IOP3_rerr2e, IOP3_rerr2f,
3855121Storek 	IOP3_WRASR_WRY, IOP3_WRPSR, IOP3_WRWIM, IOP3_WRTBR,
3955121Storek 	IOP3_FPop1, IOP3_FPop2, IOP3_CPop1, IOP3_CPop2,
4055121Storek 	IOP3_JMPL, IOP3_RETT, IOP3_Ticc, IOP3_FLUSH,
4155121Storek 	IOP3_SAVE, IOP3_RESTORE, IOP3_rerr3e, IOP3_rerr3f
4255121Storek };
4355121Storek enum IOP3_mem {
4455121Storek 	IOP3_LD, IOP3_LDUB, IOP3_LDUH, IOP3_LDD,
4555121Storek 	IOP3_ST, IOP3_STB, IOP3_STH, IOP3_STD,
4655121Storek 	IOP3_merr08, IOP3_LDSB, IOP3_LDSH, IOP3_merr0b,
4755121Storek 	IOP3_merr0c, IOP3_LDSTUB, IOP3_merr0f, IOP3_SWAP,
4855121Storek 	IOP3_LDA, IOP3_LDUBA, IOP3_LDUHA, IOP3_LDDA,
4955121Storek 	IOP3_STA, IOP3_STBA, IOP3_STHA, IOP3_STDA,
5055121Storek 	IOP3_merr18, IOP3_LDSBA, IOP3_LDSHA, IOP3_merr1b,
5155121Storek 	IOP3_merr1c, IOP3_LDSTUBA, IOP3_merr1f, IOP3_SWAPA,
5255121Storek 	IOP3_LDF, IOP3_LDFSR, IOP3_merr22, IOP3_LDDF,
5355121Storek 	IOP3_STF, IOP3_STFSR, IOP3_STDFQ, IOP3_STDF,
5455121Storek 	IOP3_merr28, IOP3_merr29, IOP3_merr2a, IOP3_merr2b,
5555121Storek 	IOP3_merr2c, IOP3_merr2d, IOP3_merr2e, IOP3_merr2f,
5655121Storek 	IOP3_LFC, IOP3_LDCSR, IOP3_merr32, IOP3_LDDC,
5755121Storek 	IOP3_STC, IOP3_STCSR, IOP3_STDCQ, IOP3_STDC,
5855121Storek 	IOP3_merr38, IOP3_merr39, IOP3_merr3a, IOP3_merr3b,
5955121Storek 	IOP3_merr3c, IOP3_merr3d, IOP3_merr3e, IOP3_merr3f
6055121Storek };
6155121Storek 
6255121Storek /*
6355121Storek  * Integer condition codes.
6455121Storek  */
6555121Storek #define	Icc_N	0x0		/* never */
6655121Storek #define	Icc_E	0x1		/* equal (equiv. zero) */
6755121Storek #define	Icc_LE	0x2		/* less or equal */
6855121Storek #define	Icc_L	0x3		/* less */
6955121Storek #define	Icc_LEU	0x4		/* less or equal unsigned */
7055121Storek #define	Icc_CS	0x5		/* carry set (equiv. less unsigned) */
7155121Storek #define	Icc_NEG	0x6		/* negative */
7255121Storek #define	Icc_VS	0x7		/* overflow set */
7355121Storek #define	Icc_A	0x8		/* always */
7455121Storek #define	Icc_NE	0x9		/* not equal (equiv. not zero) */
7555121Storek #define	Icc_G	0xa		/* greater */
7655121Storek #define	Icc_GE	0xb		/* greater or equal */
7755121Storek #define	Icc_GU	0xc		/* greater unsigned */
7855121Storek #define	Icc_CC	0xd		/* carry clear (equiv. gtr or eq unsigned) */
7955121Storek #define	Icc_POS	0xe		/* positive */
8055121Storek #define	Icc_VC	0xf		/* overflow clear */
8155121Storek 
8255121Storek /*
8355121Storek  * Integer registers.
8455121Storek  */
8555121Storek #define	I_G0	0
8655121Storek #define	I_G1	1
8755121Storek #define	I_G2	2
8855121Storek #define	I_G3	3
8955121Storek #define	I_G4	4
9055121Storek #define	I_G5	5
9155121Storek #define	I_G6	6
9255121Storek #define	I_G7	7
9355121Storek #define	I_O0	8
9455121Storek #define	I_O1	9
9555121Storek #define	I_O2	10
9655121Storek #define	I_O3	11
9755121Storek #define	I_O4	12
9855121Storek #define	I_O5	13
9955121Storek #define	I_O6	14
10055121Storek #define	I_O7	15
10155121Storek #define	I_L0	16
10255121Storek #define	I_L1	17
10355121Storek #define	I_L2	18
10455121Storek #define	I_L3	19
10555121Storek #define	I_L4	20
10655121Storek #define	I_L5	21
10755121Storek #define	I_L6	22
10855121Storek #define	I_L7	23
10955121Storek #define	I_I0	24
11055121Storek #define	I_I1	25
11155121Storek #define	I_I2	26
11255121Storek #define	I_I3	27
11355121Storek #define	I_I4	28
11455121Storek #define	I_I5	29
11555121Storek #define	I_I6	30
11655121Storek #define	I_I7	31
11755121Storek 
11855121Storek /*
11955121Storek  * An instruction.
12055121Storek  */
12155121Storek union instr {
12255121Storek 	int	i_int;			/* as a whole */
12355121Storek 
12455121Storek 	/*
12555121Storek 	 * The first level of decoding is to use the top 2 bits.
12655121Storek 	 * This gives us one of three `formats', which usually give
12755121Storek 	 * a second level of decoding.
12855121Storek 	 */
12955121Storek 	struct {
13055121Storek 		u_int	i_op:2;		/* first-level decode */
13155121Storek 		u_int	:30;
13255121Storek 	} i_any;
13355121Storek 
13455121Storek 	/*
13555121Storek 	 * Format 1 instructions: CALL (undifferentiated).
13655121Storek 	 */
13755121Storek 	struct {
13855121Storek 		u_int	:2;		/* 01 */
13955121Storek 		int	i_disp:30;	/* displacement */
14055121Storek 	} i_call;
14155121Storek 
14255121Storek 	/*
14355121Storek 	 * Format 2 instructions (SETHI, UNIMP, and branches, plus illegal
14455121Storek 	 * unused codes).
14555121Storek 	 */
14655121Storek 	struct {
14755121Storek 		u_int	:2;		/* 00 */
14855121Storek 		u_int	:5;
14955121Storek 		u_int	i_op2:3;	/* second-level decode */
15055121Storek 		u_int	:22;
15155121Storek 	} i_op2;
15255121Storek 
15355121Storek 	/* UNIMP, SETHI */
15455121Storek 	struct {
15555121Storek 		u_int	:2;		/* 00 */
15655121Storek 		u_int	i_rd:5;		/* destination register */
15755121Storek 		u_int	i_op2:3;	/* opcode: UNIMP or SETHI */
15855121Storek 		u_int	i_imm:22;	/* immediate value */
15955121Storek 	} i_imm22;
16055121Storek 
16155121Storek 	/* branches: Bicc, FBfcc, CBccc */
16255121Storek 	struct {
16355121Storek 		u_int	:2;		/* 00 */
16455121Storek 		u_int	i_annul:1;	/* annul bit */
16555121Storek 		u_int	i_cond:4;	/* condition codes */
16655121Storek 		u_int	i_op2:3;	/* opcode: {Bi,FBf,CBc}cc */
16755121Storek 		int	i_disp:22;	/* branch displacement */
16855121Storek 	} i_branch;
16955121Storek 
17055121Storek 	/*
17155121Storek 	 * Format 3 instructions (memory reference; arithmetic, logical,
17255121Storek 	 * shift, and other miscellaneous operations).  The second-level
17355121Storek 	 * decode almost always makes use of an `rd' and `rs1', however
17455121Storek 	 * (see also IOP3_reg and IOP3_mem).
17555121Storek 	 *
17655121Storek 	 * Beyond that, the low 14 bits may be broken up in one of three
17755121Storek 	 * different ways, if at all:
17855121Storek 	 *	1 bit of imm=0 + 8 bits of asi + 5 bits of rs2 [reg & mem]
17955121Storek 	 *	1 bit of imm=1 + 13 bits of signed immediate [reg & mem]
18055121Storek 	 *	9 bits of copressor `opf' opcode + 5 bits of rs2 [reg only]
18155121Storek 	 */
18255121Storek 	struct {
18355121Storek 		u_int	:2;		/* 10 or 11 */
18455121Storek 		u_int	i_rd:5;		/* destination register */
18555121Storek 		u_int	i_op3:6;	/* second-level decode */
18655121Storek 		u_int	i_rs1:5;	/* source register 1 */
18755121Storek 		u_int	i_low14:14;	/* varies */
18855121Storek 	} i_op3;
18955121Storek 
19055121Storek 	/*
19155121Storek 	 * Memory forms.  These set i_op=3 and use simm13 or asi layout.
19255121Storek 	 * Memory references without an ASI should use 0, but the actual
19355121Storek 	 * ASI field is simply ignored.
19455121Storek 	 */
19555121Storek 	struct {
19655121Storek 		u_int	:2;		/* 11 only */
19755121Storek 		u_int	i_rd:5;		/* destination register */
19855121Storek 		u_int	i_op3:6;	/* second-level decode (see IOP3_mem) */
19955121Storek 		u_int	i_i:1;		/* immediate vs asi */
20055121Storek 		u_int	i_low13:13;	/* depend on i bit */
20155121Storek 	} i_loadstore;
20255121Storek 
20355121Storek 	/*
20455121Storek 	 * Memory and register forms.
20555121Storek 	 * These come in quite a variety and we do not
20655121Storek 	 * attempt to break them down much.
20755121Storek 	 */
20855121Storek 	struct {
20955121Storek 		u_int	:2;		/* 10 or 11 */
21055121Storek 		u_int	i_rd:5;		/* destination register */
21155121Storek 		u_int	i_op3:6;	/* second-level decode */
21255121Storek 		u_int	i_rs1:5;	/* source register 1 */
21355121Storek 		u_int	i_i:1;		/* immediate bit (1) */
21455121Storek 		int	i_simm13:13;	/* signed immediate */
21555121Storek 	} i_simm13;
21655121Storek 	struct {
21755121Storek 		u_int	:2;		/* 10 or 11 */
21855121Storek 		u_int	i_rd:5;		/* destination register */
21955121Storek 		u_int	i_op3:6;	/* second-level decode */
22055121Storek 		u_int	i_rs1:5;	/* source register 1 */
22155121Storek 		u_int	i_asi:8;	/* asi */
22255121Storek 		u_int	i_rs2:5;	/* source register 2 */
22355121Storek 	} i_asi;
22455121Storek 	struct {
22555121Storek 		u_int	:2;		/* 10 only (register, no memory) */
22655121Storek 		u_int	i_rd:5;		/* destination register */
22755121Storek 		u_int	i_op3:6;	/* second-level decode (see IOP3_reg) */
22855121Storek 		u_int	i_rs1:5;	/* source register 1 */
22955121Storek 		u_int	i_opf:9;	/* coprocessor 3rd-level decode */
23055121Storek 		u_int	i_rs2:5;	/* source register 2 */
23155121Storek 	} i_opf;
23255121Storek 
23355121Storek };
23455121Storek 
23555121Storek /*
23655121Storek  * Internal macros for building instructions.  These correspond 1-to-1 to
23755121Storek  * the names above.  Note that x << y | z == (x << y) | z.
23855121Storek  */
23955121Storek #define	_I_ANY(op, b)	((op) << 30 | (b))
24055121Storek 
24155121Storek #define	_I_OP2(high, op2, low) \
24255121Storek 		_I_ANY(IOP_OP2, (high) << 25 | (op2) << 22 | (low))
24355121Storek #define	_I_IMM22(rd, op2, imm) \
24455121Storek 		_I_ANY(IOP_OP2, (rd) << 25 | (op2) << 22 | (imm))
24555121Storek #define	_I_BRANCH(a, c, op2, disp) \
24655121Storek 		_I_ANY(IOP_OP2, (a) << 29 | (c) << 25 | (op2) << 22 | (disp))
24755121Storek #define	_I_FBFCC(a, cond, disp) \
24855121Storek 		_I_BRANCH(a, cond, IOP2_FBfcc, disp)
24955121Storek #define	_I_CBCCC(a, cond, disp) \
25055121Storek 		_I_BRANCH(a, cond, IOP2_CBccc, disp)
25155121Storek 
25255121Storek #define	_I_SIMM(simm)		(1 << 13 | ((simm) & 0x1fff))
25355121Storek 
25455121Storek #define	_I_OP3_GEN(form, rd, op3, rs1, low14) \
25555121Storek 		_I_ANY(form, (rd) << 25 | (op3) << 19 | (rs1) << 14 | (low14))
25655121Storek #define	_I_OP3_LS_RAR(rd, op3, rs1, asi, rs2) \
25755121Storek 		_I_OP3_GEN(IOP_mem, rd, op3, rs1, (asi) << 5 | (rs2))
25855121Storek #define	_I_OP3_LS_RI(rd, op3, rs1, simm13) \
25955121Storek 		_I_OP3_GEN(IOP_mem, rd, op3, rs1, _I_SIMM(simm13))
26055121Storek #define	_I_OP3_LS_RR(rd, op3, rs1, rs2) \
26155121Storek 		_I_OP3_GEN(IOP_mem, rd, op3, rs1, rs2)
26255121Storek #define	_I_OP3_R_RAR(rd, op3, rs1, asi, rs2) \
26355121Storek 		_I_OP3_GEN(IOP_reg, rd, op3, rs1, (asi) << 5 | (rs2))
26455121Storek #define	_I_OP3_R_RI(rd, op3, rs1, simm13) \
26555121Storek 		_I_OP3_GEN(IOP_reg, rd, op3, rs1, _I_SIMM(simm13))
26655121Storek #define	_I_OP3_R_RR(rd, op3, rs1, rs2) \
26755121Storek 		_I_OP3_GEN(IOP_reg, rd, op3, rs1, rs2)
26855121Storek 
26955121Storek #define	I_CALL(d)		_I_ANY(IOP_CALL, d)
27055121Storek #define	I_UNIMP(v)		_I_IMM22(0, IOP2_UNIMP, v)
27155121Storek #define	I_BN(a, d)		_I_BRANCH(a, Icc_N, IOP2_Bicc, d)
27255121Storek #define	I_BE(a, d)		_I_BRANCH(a, Icc_E, IOP2_Bicc, d)
27355121Storek #define	I_BZ(a, d)		_I_BRANCH(a, Icc_E, IOP2_Bicc, d)
27455121Storek #define	I_BLE(a, d)		_I_BRANCH(a, Icc_LE, IOP2_Bicc, d)
27555121Storek #define	I_BL(a, d)		_I_BRANCH(a, Icc_L, IOP2_Bicc, d)
27655121Storek #define	I_BLEU(a, d)		_I_BRANCH(a, Icc_LEU, IOP2_Bicc, d)
27755121Storek #define	I_BCS(a, d)		_I_BRANCH(a, Icc_CS, IOP2_Bicc, d)
27855121Storek #define	I_BLU(a, d)		_I_BRANCH(a, Icc_CS, IOP2_Bicc, d)
27955121Storek #define	I_BNEG(a, d)		_I_BRANCH(a, Icc_NEG, IOP2_Bicc, d)
28055121Storek #define	I_BVS(a, d)		_I_BRANCH(a, Icc_VS, IOP2_Bicc, d)
28155121Storek #define	I_BA(a, d)		_I_BRANCH(a, Icc_A, IOP2_Bicc, d)
28255121Storek #define	I_B(a, d)		_I_BRANCH(a, Icc_A, IOP2_Bicc, d)
28355121Storek #define	I_BNE(a, d)		_I_BRANCH(a, Icc_NE, IOP2_Bicc, d)
28455121Storek #define	I_BNZ(a, d)		_I_BRANCH(a, Icc_NE, IOP2_Bicc, d)
28555121Storek #define	I_BG(a, d)		_I_BRANCH(a, Icc_G, IOP2_Bicc, d)
28655121Storek #define	I_BGE(a, d)		_I_BRANCH(a, Icc_GE, IOP2_Bicc, d)
28755121Storek #define	I_BGU(a, d)		_I_BRANCH(a, Icc_GU, IOP2_Bicc, d)
28855121Storek #define	I_BCC(a, d)		_I_BRANCH(a, Icc_CC, IOP2_Bicc, d)
28955121Storek #define	I_BGEU(a, d)		_I_BRANCH(a, Icc_CC, IOP2_Bicc, d)
29055121Storek #define	I_BPOS(a, d)		_I_BRANCH(a, Icc_POS, IOP2_Bicc, d)
29155121Storek #define	I_BVC(a, d)		_I_BRANCH(a, Icc_VC, IOP2_Bicc, d)
29255121Storek #define	I_SETHI(r, v)		_I_IMM22(r, 4, v)
29355121Storek 
29455121Storek #define	I_ORri(rd, rs1, imm)	_I_OP3_R_RI(rd, IOP3_OR, rs1, imm)
29555121Storek #define	I_ORrr(rd, rs1, rs2)	_I_OP3_R_RR(rd, IOP3_OR, rs1, rs2)
29655121Storek 
29755121Storek #define	I_MOVi(rd, imm)		_I_OP3_R_RI(rd, IOP3_OR, I_G0, imm)
29855121Storek #define	I_MOVr(rd, rs)		_I_OP3_R_RR(rd, IOP3_OR, I_G0, rs)
29955121Storek 
30055121Storek #define	I_RDPSR(rd)		_I_OP3_R_RR(rd, IOP3_RDPSR, 0, 0)
30155121Storek 
30255121Storek #define	I_JMPLri(rd, rs1, imm)	_I_OP3_R_RI(rd, IOP3_JMPL, rs1, imm)
30355121Storek #define	I_JMPLrr(rd, rs1, rs2)	_I_OP3_R_RR(rd, IOP3_JMPL, rs1, rs2)
30455121Storek 
30555121Storek /*
30655121Storek  * (Since these are sparse, we skip the enumerations for now.)
30755121Storek  * FPop values.  All appear in both FPop1 and FPop2 spaces, but arithmetic
30855121Storek  * ops should happen only with FPop1 and comparison only with FPop2.
30955121Storek  * The type sits in the low two bits; those bits are given as zero here.
31055121Storek  */
31155121Storek #define	FMOV	0x00
31255121Storek #define	FNEG	0x04
31355121Storek #define	FABS	0x08
31455121Storek #define	FSQRT	0x28
31555121Storek #define	FADD	0x40
31655121Storek #define	FSUB	0x44
31755121Storek #define	FMUL	0x48
31855121Storek #define	FDIV	0x4c
31955121Storek #define	FCMP	0x50
32055121Storek #define	FCMPE	0x54
32155121Storek #define	FSMULD	0x68
32255121Storek #define	FDMULX	0x6c
32355121Storek #define	FTOS	0xc4
32455121Storek #define	FTOD	0xc8
32555121Storek #define	FTOX	0xcc
32655121Storek #define	FTOI	0xd0
32755121Storek 
32855121Storek /*
32955121Storek  * FPU data types.
33055121Storek  */
33155121Storek #define	FTYPE_INT	0	/* data = 32-bit signed integer */
33255121Storek #define	FTYPE_SNG	1	/* data = 32-bit float */
33355121Storek #define	FTYPE_DBL	2	/* data = 64-bit double */
33455121Storek #define	FTYPE_EXT	3	/* data = 128-bit extended (quad-prec) */
335