1*53899Smckusick /*-
2*53899Smckusick  * Copyright (c) 1992 The Regents of the University of California.
3*53899Smckusick  * All rights reserved.
4*53899Smckusick  *
5*53899Smckusick  * This code is derived from software contributed to Berkeley by
6*53899Smckusick  * Ralph Campbell.
7*53899Smckusick  *
8*53899Smckusick  * %sccs.include.redist.c%
9*53899Smckusick  *
10*53899Smckusick  *	@(#)mips_opcode.h	7.1 (Berkeley) 06/04/92
11*53899Smckusick  */
12*53899Smckusick 
13*53899Smckusick /*
14*53899Smckusick  * Define the instruction formats and opcode values for the
15*53899Smckusick  * MIPS instruction set.
16*53899Smckusick  */
17*53899Smckusick 
18*53899Smckusick /*
19*53899Smckusick  * Define the instruction formats.
20*53899Smckusick  */
21*53899Smckusick typedef union {
22*53899Smckusick 	unsigned word;
23*53899Smckusick 
24*53899Smckusick #if BYTE_ORDER == LITTLE_ENDIAN
25*53899Smckusick 	struct {
26*53899Smckusick 		unsigned imm: 16;
27*53899Smckusick 		unsigned rt: 5;
28*53899Smckusick 		unsigned rs: 5;
29*53899Smckusick 		unsigned op: 6;
30*53899Smckusick 	} IType;
31*53899Smckusick 
32*53899Smckusick 	struct {
33*53899Smckusick 		unsigned target: 26;
34*53899Smckusick 		unsigned op: 6;
35*53899Smckusick 	} JType;
36*53899Smckusick 
37*53899Smckusick 	struct {
38*53899Smckusick 		unsigned func: 6;
39*53899Smckusick 		unsigned shamt: 5;
40*53899Smckusick 		unsigned rd: 5;
41*53899Smckusick 		unsigned rt: 5;
42*53899Smckusick 		unsigned rs: 5;
43*53899Smckusick 		unsigned op: 6;
44*53899Smckusick 	} RType;
45*53899Smckusick 
46*53899Smckusick 	struct {
47*53899Smckusick 		unsigned func: 6;
48*53899Smckusick 		unsigned fd: 5;
49*53899Smckusick 		unsigned fs: 5;
50*53899Smckusick 		unsigned ft: 5;
51*53899Smckusick 		unsigned fmt: 4;
52*53899Smckusick 		unsigned : 1;		/* always '1' */
53*53899Smckusick 		unsigned op: 6;		/* always '0x11' */
54*53899Smckusick 	} FRType;
55*53899Smckusick #endif
56*53899Smckusick #if BYTE_ORDER == BIG_ENDIAN
57*53899Smckusick 	struct {
58*53899Smckusick 		unsigned op: 6;
59*53899Smckusick 		unsigned rs: 5;
60*53899Smckusick 		unsigned rt: 5;
61*53899Smckusick 		unsigned imm: 16;
62*53899Smckusick 	} IType;
63*53899Smckusick 
64*53899Smckusick 	struct {
65*53899Smckusick 		unsigned op: 6;
66*53899Smckusick 		unsigned target: 26;
67*53899Smckusick 	} JType;
68*53899Smckusick 
69*53899Smckusick 	struct {
70*53899Smckusick 		unsigned op: 6;
71*53899Smckusick 		unsigned rs: 5;
72*53899Smckusick 		unsigned rt: 5;
73*53899Smckusick 		unsigned rd: 5;
74*53899Smckusick 		unsigned shamt: 5;
75*53899Smckusick 		unsigned func: 6;
76*53899Smckusick 	} RType;
77*53899Smckusick 
78*53899Smckusick 	struct {
79*53899Smckusick 		unsigned op: 6;		/* always '0x11' */
80*53899Smckusick 		unsigned : 1;		/* always '1' */
81*53899Smckusick 		unsigned fmt: 4;
82*53899Smckusick 		unsigned ft: 5;
83*53899Smckusick 		unsigned fs: 5;
84*53899Smckusick 		unsigned fd: 5;
85*53899Smckusick 		unsigned func: 6;
86*53899Smckusick 	} FRType;
87*53899Smckusick #endif
88*53899Smckusick } InstFmt;
89*53899Smckusick 
90*53899Smckusick /*
91*53899Smckusick  * Values for the 'op' field.
92*53899Smckusick  */
93*53899Smckusick #define OP_SPECIAL	000
94*53899Smckusick #define OP_BCOND	001
95*53899Smckusick #define OP_J		002
96*53899Smckusick #define	OP_JAL		003
97*53899Smckusick #define OP_BEQ		004
98*53899Smckusick #define OP_BNE		005
99*53899Smckusick #define OP_BLEZ		006
100*53899Smckusick #define OP_BGTZ		007
101*53899Smckusick 
102*53899Smckusick #define OP_ADDI		010
103*53899Smckusick #define OP_ADDIU	011
104*53899Smckusick #define OP_SLTI		012
105*53899Smckusick #define OP_SLTIU	013
106*53899Smckusick #define OP_ANDI		014
107*53899Smckusick #define OP_ORI		015
108*53899Smckusick #define OP_XORI		016
109*53899Smckusick #define OP_LUI		017
110*53899Smckusick 
111*53899Smckusick #define OP_COP0		020
112*53899Smckusick #define OP_COP1		021
113*53899Smckusick #define OP_COP2		022
114*53899Smckusick #define OP_COP3		023
115*53899Smckusick 
116*53899Smckusick #define OP_LB		040
117*53899Smckusick #define OP_LH		041
118*53899Smckusick #define OP_LWL		042
119*53899Smckusick #define OP_LW		043
120*53899Smckusick #define OP_LBU		044
121*53899Smckusick #define OP_LHU		045
122*53899Smckusick #define OP_LWR		046
123*53899Smckusick 
124*53899Smckusick #define OP_SB		050
125*53899Smckusick #define OP_SH		051
126*53899Smckusick #define OP_SWL		052
127*53899Smckusick #define OP_SW		053
128*53899Smckusick #define OP_SWR		056
129*53899Smckusick 
130*53899Smckusick #define OP_LWC0		060
131*53899Smckusick #define OP_LWC1		061
132*53899Smckusick #define OP_LWC2		062
133*53899Smckusick #define OP_LWC3		063
134*53899Smckusick 
135*53899Smckusick #define OP_SWC0		070
136*53899Smckusick #define OP_SWC1		071
137*53899Smckusick #define OP_SWC2		072
138*53899Smckusick #define OP_SWC3		073
139*53899Smckusick 
140*53899Smckusick /*
141*53899Smckusick  * Values for the 'func' field when 'op' == OP_SPECIAL.
142*53899Smckusick  */
143*53899Smckusick #define OP_SLL		000
144*53899Smckusick #define OP_SRL		002
145*53899Smckusick #define OP_SRA		003
146*53899Smckusick #define OP_SLLV		004
147*53899Smckusick #define OP_SRLV		006
148*53899Smckusick #define OP_SRAV		007
149*53899Smckusick 
150*53899Smckusick #define OP_JR		010
151*53899Smckusick #define OP_JALR		011
152*53899Smckusick #define OP_SYSCALL	014
153*53899Smckusick #define OP_BREAK	015
154*53899Smckusick 
155*53899Smckusick #define OP_MFHI		020
156*53899Smckusick #define OP_MTHI		021
157*53899Smckusick #define OP_MFLO		022
158*53899Smckusick #define OP_MTLO		023
159*53899Smckusick 
160*53899Smckusick #define OP_MULT		030
161*53899Smckusick #define OP_MULTU	031
162*53899Smckusick #define OP_DIV		032
163*53899Smckusick #define OP_DIVU		033
164*53899Smckusick 
165*53899Smckusick #define OP_ADD		040
166*53899Smckusick #define OP_ADDU		041
167*53899Smckusick #define OP_SUB		042
168*53899Smckusick #define OP_SUBU		043
169*53899Smckusick #define OP_AND		044
170*53899Smckusick #define OP_OR		045
171*53899Smckusick #define OP_XOR		046
172*53899Smckusick #define OP_NOR		047
173*53899Smckusick 
174*53899Smckusick #define OP_SLT		052
175*53899Smckusick #define OP_SLTU		053
176*53899Smckusick 
177*53899Smckusick /*
178*53899Smckusick  * Values for the 'func' field when 'op' == OP_BCOND.
179*53899Smckusick  */
180*53899Smckusick #define OP_BLTZ		000
181*53899Smckusick #define OP_BGEZ		001
182*53899Smckusick #define OP_BLTZAL	020
183*53899Smckusick #define OP_BGEZAL	021
184*53899Smckusick 
185*53899Smckusick /*
186*53899Smckusick  * Values for the 'rs' field when 'op' == OP_COPz.
187*53899Smckusick  */
188*53899Smckusick #define OP_MF		000
189*53899Smckusick #define OP_MT		004
190*53899Smckusick #define OP_BCx		010
191*53899Smckusick #define OP_BCy		014
192*53899Smckusick #define OP_CF		002
193*53899Smckusick #define OP_CT		006
194*53899Smckusick 
195*53899Smckusick /*
196*53899Smckusick  * Values for the 'rt' field when 'op' == OP_COPz.
197*53899Smckusick  */
198*53899Smckusick #define COPz_BC_TF_MASK	0x01
199*53899Smckusick #define COPz_BC_TRUE	0x01
200*53899Smckusick #define COPz_BC_FALSE	0x00
201