153899Smckusick /*-
2*63306Sbostic  * Copyright (c) 1992, 1993
3*63306Sbostic  *	The Regents of the University of California.  All rights reserved.
453899Smckusick  *
553899Smckusick  * This code is derived from software contributed to Berkeley by
653899Smckusick  * Ralph Campbell.
753899Smckusick  *
853899Smckusick  * %sccs.include.redist.c%
953899Smckusick  *
10*63306Sbostic  *	@(#)mips_opcode.h	8.1 (Berkeley) 06/11/93
1153899Smckusick  */
1253899Smckusick 
1353899Smckusick /*
1453899Smckusick  * Define the instruction formats and opcode values for the
1553899Smckusick  * MIPS instruction set.
1653899Smckusick  */
1753899Smckusick 
1853899Smckusick /*
1953899Smckusick  * Define the instruction formats.
2053899Smckusick  */
2153899Smckusick typedef union {
2253899Smckusick 	unsigned word;
2353899Smckusick 
2453899Smckusick #if BYTE_ORDER == LITTLE_ENDIAN
2553899Smckusick 	struct {
2653899Smckusick 		unsigned imm: 16;
2753899Smckusick 		unsigned rt: 5;
2853899Smckusick 		unsigned rs: 5;
2953899Smckusick 		unsigned op: 6;
3053899Smckusick 	} IType;
3153899Smckusick 
3253899Smckusick 	struct {
3353899Smckusick 		unsigned target: 26;
3453899Smckusick 		unsigned op: 6;
3553899Smckusick 	} JType;
3653899Smckusick 
3753899Smckusick 	struct {
3853899Smckusick 		unsigned func: 6;
3953899Smckusick 		unsigned shamt: 5;
4053899Smckusick 		unsigned rd: 5;
4153899Smckusick 		unsigned rt: 5;
4253899Smckusick 		unsigned rs: 5;
4353899Smckusick 		unsigned op: 6;
4453899Smckusick 	} RType;
4553899Smckusick 
4653899Smckusick 	struct {
4753899Smckusick 		unsigned func: 6;
4853899Smckusick 		unsigned fd: 5;
4953899Smckusick 		unsigned fs: 5;
5053899Smckusick 		unsigned ft: 5;
5153899Smckusick 		unsigned fmt: 4;
5253899Smckusick 		unsigned : 1;		/* always '1' */
5353899Smckusick 		unsigned op: 6;		/* always '0x11' */
5453899Smckusick 	} FRType;
5553899Smckusick #endif
5653899Smckusick #if BYTE_ORDER == BIG_ENDIAN
5753899Smckusick 	struct {
5853899Smckusick 		unsigned op: 6;
5953899Smckusick 		unsigned rs: 5;
6053899Smckusick 		unsigned rt: 5;
6153899Smckusick 		unsigned imm: 16;
6253899Smckusick 	} IType;
6353899Smckusick 
6453899Smckusick 	struct {
6553899Smckusick 		unsigned op: 6;
6653899Smckusick 		unsigned target: 26;
6753899Smckusick 	} JType;
6853899Smckusick 
6953899Smckusick 	struct {
7053899Smckusick 		unsigned op: 6;
7153899Smckusick 		unsigned rs: 5;
7253899Smckusick 		unsigned rt: 5;
7353899Smckusick 		unsigned rd: 5;
7453899Smckusick 		unsigned shamt: 5;
7553899Smckusick 		unsigned func: 6;
7653899Smckusick 	} RType;
7753899Smckusick 
7853899Smckusick 	struct {
7953899Smckusick 		unsigned op: 6;		/* always '0x11' */
8053899Smckusick 		unsigned : 1;		/* always '1' */
8153899Smckusick 		unsigned fmt: 4;
8253899Smckusick 		unsigned ft: 5;
8353899Smckusick 		unsigned fs: 5;
8453899Smckusick 		unsigned fd: 5;
8553899Smckusick 		unsigned func: 6;
8653899Smckusick 	} FRType;
8753899Smckusick #endif
8853899Smckusick } InstFmt;
8953899Smckusick 
9053899Smckusick /*
9153899Smckusick  * Values for the 'op' field.
9253899Smckusick  */
9353899Smckusick #define OP_SPECIAL	000
9453899Smckusick #define OP_BCOND	001
9553899Smckusick #define OP_J		002
9653899Smckusick #define	OP_JAL		003
9753899Smckusick #define OP_BEQ		004
9853899Smckusick #define OP_BNE		005
9953899Smckusick #define OP_BLEZ		006
10053899Smckusick #define OP_BGTZ		007
10153899Smckusick 
10253899Smckusick #define OP_ADDI		010
10353899Smckusick #define OP_ADDIU	011
10453899Smckusick #define OP_SLTI		012
10553899Smckusick #define OP_SLTIU	013
10653899Smckusick #define OP_ANDI		014
10753899Smckusick #define OP_ORI		015
10853899Smckusick #define OP_XORI		016
10953899Smckusick #define OP_LUI		017
11053899Smckusick 
11153899Smckusick #define OP_COP0		020
11253899Smckusick #define OP_COP1		021
11353899Smckusick #define OP_COP2		022
11453899Smckusick #define OP_COP3		023
11553899Smckusick 
11653899Smckusick #define OP_LB		040
11753899Smckusick #define OP_LH		041
11853899Smckusick #define OP_LWL		042
11953899Smckusick #define OP_LW		043
12053899Smckusick #define OP_LBU		044
12153899Smckusick #define OP_LHU		045
12253899Smckusick #define OP_LWR		046
12353899Smckusick 
12453899Smckusick #define OP_SB		050
12553899Smckusick #define OP_SH		051
12653899Smckusick #define OP_SWL		052
12753899Smckusick #define OP_SW		053
12853899Smckusick #define OP_SWR		056
12953899Smckusick 
13053899Smckusick #define OP_LWC0		060
13153899Smckusick #define OP_LWC1		061
13253899Smckusick #define OP_LWC2		062
13353899Smckusick #define OP_LWC3		063
13453899Smckusick 
13553899Smckusick #define OP_SWC0		070
13653899Smckusick #define OP_SWC1		071
13753899Smckusick #define OP_SWC2		072
13853899Smckusick #define OP_SWC3		073
13953899Smckusick 
14053899Smckusick /*
14153899Smckusick  * Values for the 'func' field when 'op' == OP_SPECIAL.
14253899Smckusick  */
14353899Smckusick #define OP_SLL		000
14453899Smckusick #define OP_SRL		002
14553899Smckusick #define OP_SRA		003
14653899Smckusick #define OP_SLLV		004
14753899Smckusick #define OP_SRLV		006
14853899Smckusick #define OP_SRAV		007
14953899Smckusick 
15053899Smckusick #define OP_JR		010
15153899Smckusick #define OP_JALR		011
15253899Smckusick #define OP_SYSCALL	014
15353899Smckusick #define OP_BREAK	015
15453899Smckusick 
15553899Smckusick #define OP_MFHI		020
15653899Smckusick #define OP_MTHI		021
15753899Smckusick #define OP_MFLO		022
15853899Smckusick #define OP_MTLO		023
15953899Smckusick 
16053899Smckusick #define OP_MULT		030
16153899Smckusick #define OP_MULTU	031
16253899Smckusick #define OP_DIV		032
16353899Smckusick #define OP_DIVU		033
16453899Smckusick 
16553899Smckusick #define OP_ADD		040
16653899Smckusick #define OP_ADDU		041
16753899Smckusick #define OP_SUB		042
16853899Smckusick #define OP_SUBU		043
16953899Smckusick #define OP_AND		044
17053899Smckusick #define OP_OR		045
17153899Smckusick #define OP_XOR		046
17253899Smckusick #define OP_NOR		047
17353899Smckusick 
17453899Smckusick #define OP_SLT		052
17553899Smckusick #define OP_SLTU		053
17653899Smckusick 
17753899Smckusick /*
17853899Smckusick  * Values for the 'func' field when 'op' == OP_BCOND.
17953899Smckusick  */
18053899Smckusick #define OP_BLTZ		000
18153899Smckusick #define OP_BGEZ		001
18253899Smckusick #define OP_BLTZAL	020
18353899Smckusick #define OP_BGEZAL	021
18453899Smckusick 
18553899Smckusick /*
18653899Smckusick  * Values for the 'rs' field when 'op' == OP_COPz.
18753899Smckusick  */
18853899Smckusick #define OP_MF		000
18953899Smckusick #define OP_MT		004
19053899Smckusick #define OP_BCx		010
19153899Smckusick #define OP_BCy		014
19253899Smckusick #define OP_CF		002
19353899Smckusick #define OP_CT		006
19453899Smckusick 
19553899Smckusick /*
19653899Smckusick  * Values for the 'rt' field when 'op' == OP_COPz.
19753899Smckusick  */
19853899Smckusick #define COPz_BC_TF_MASK	0x01
19953899Smckusick #define COPz_BC_TRUE	0x01
20053899Smckusick #define COPz_BC_FALSE	0x00
201