xref: /openbmc/linux/arch/mips/include/uapi/asm/inst.h (revision 85dfaf0831d292aa19fa3f230a73f3081d7d7067)
190e8cacdSRalf Baechle /*
290e8cacdSRalf Baechle  * Format of an instruction in memory.
390e8cacdSRalf Baechle  *
490e8cacdSRalf Baechle  * This file is subject to the terms and conditions of the GNU General Public
590e8cacdSRalf Baechle  * License.  See the file "COPYING" in the main directory of this archive
690e8cacdSRalf Baechle  * for more details.
790e8cacdSRalf Baechle  *
890e8cacdSRalf Baechle  * Copyright (C) 1996, 2000 by Ralf Baechle
990e8cacdSRalf Baechle  * Copyright (C) 2006 by Thiemo Seufer
1090e8cacdSRalf Baechle  */
1190e8cacdSRalf Baechle #ifndef _UAPI_ASM_INST_H
1290e8cacdSRalf Baechle #define _UAPI_ASM_INST_H
1390e8cacdSRalf Baechle 
1490e8cacdSRalf Baechle /*
1590e8cacdSRalf Baechle  * Major opcodes; before MIPS IV cop1x was called cop3.
1690e8cacdSRalf Baechle  */
1790e8cacdSRalf Baechle enum major_op {
1890e8cacdSRalf Baechle 	spec_op, bcond_op, j_op, jal_op,
1990e8cacdSRalf Baechle 	beq_op, bne_op, blez_op, bgtz_op,
2090e8cacdSRalf Baechle 	addi_op, addiu_op, slti_op, sltiu_op,
2190e8cacdSRalf Baechle 	andi_op, ori_op, xori_op, lui_op,
2290e8cacdSRalf Baechle 	cop0_op, cop1_op, cop2_op, cop1x_op,
2390e8cacdSRalf Baechle 	beql_op, bnel_op, blezl_op, bgtzl_op,
2490e8cacdSRalf Baechle 	daddi_op, daddiu_op, ldl_op, ldr_op,
2590e8cacdSRalf Baechle 	spec2_op, jalx_op, mdmx_op, spec3_op,
2690e8cacdSRalf Baechle 	lb_op, lh_op, lwl_op, lw_op,
2790e8cacdSRalf Baechle 	lbu_op, lhu_op, lwr_op, lwu_op,
2890e8cacdSRalf Baechle 	sb_op, sh_op, swl_op, sw_op,
2990e8cacdSRalf Baechle 	sdl_op, sdr_op, swr_op, cache_op,
3090e8cacdSRalf Baechle 	ll_op, lwc1_op, lwc2_op, pref_op,
3190e8cacdSRalf Baechle 	lld_op, ldc1_op, ldc2_op, ld_op,
3290e8cacdSRalf Baechle 	sc_op, swc1_op, swc2_op, major_3b_op,
3390e8cacdSRalf Baechle 	scd_op, sdc1_op, sdc2_op, sd_op
3490e8cacdSRalf Baechle };
3590e8cacdSRalf Baechle 
3690e8cacdSRalf Baechle /*
3790e8cacdSRalf Baechle  * func field of spec opcode.
3890e8cacdSRalf Baechle  */
3990e8cacdSRalf Baechle enum spec_op {
4090e8cacdSRalf Baechle 	sll_op, movc_op, srl_op, sra_op,
4190e8cacdSRalf Baechle 	sllv_op, pmon_op, srlv_op, srav_op,
4290e8cacdSRalf Baechle 	jr_op, jalr_op, movz_op, movn_op,
4390e8cacdSRalf Baechle 	syscall_op, break_op, spim_op, sync_op,
4490e8cacdSRalf Baechle 	mfhi_op, mthi_op, mflo_op, mtlo_op,
4590e8cacdSRalf Baechle 	dsllv_op, spec2_unused_op, dsrlv_op, dsrav_op,
4690e8cacdSRalf Baechle 	mult_op, multu_op, div_op, divu_op,
4790e8cacdSRalf Baechle 	dmult_op, dmultu_op, ddiv_op, ddivu_op,
4890e8cacdSRalf Baechle 	add_op, addu_op, sub_op, subu_op,
4990e8cacdSRalf Baechle 	and_op, or_op, xor_op, nor_op,
5090e8cacdSRalf Baechle 	spec3_unused_op, spec4_unused_op, slt_op, sltu_op,
5190e8cacdSRalf Baechle 	dadd_op, daddu_op, dsub_op, dsubu_op,
5290e8cacdSRalf Baechle 	tge_op, tgeu_op, tlt_op, tltu_op,
5390e8cacdSRalf Baechle 	teq_op, spec5_unused_op, tne_op, spec6_unused_op,
5490e8cacdSRalf Baechle 	dsll_op, spec7_unused_op, dsrl_op, dsra_op,
5590e8cacdSRalf Baechle 	dsll32_op, spec8_unused_op, dsrl32_op, dsra32_op
5690e8cacdSRalf Baechle };
5790e8cacdSRalf Baechle 
5890e8cacdSRalf Baechle /*
5990e8cacdSRalf Baechle  * func field of spec2 opcode.
6090e8cacdSRalf Baechle  */
6190e8cacdSRalf Baechle enum spec2_op {
6290e8cacdSRalf Baechle 	madd_op, maddu_op, mul_op, spec2_3_unused_op,
6390e8cacdSRalf Baechle 	msub_op, msubu_op, /* more unused ops */
6490e8cacdSRalf Baechle 	clz_op = 0x20, clo_op,
6590e8cacdSRalf Baechle 	dclz_op = 0x24, dclo_op,
6690e8cacdSRalf Baechle 	sdbpp_op = 0x3f
6790e8cacdSRalf Baechle };
6890e8cacdSRalf Baechle 
6990e8cacdSRalf Baechle /*
7090e8cacdSRalf Baechle  * func field of spec3 opcode.
7190e8cacdSRalf Baechle  */
7290e8cacdSRalf Baechle enum spec3_op {
7390e8cacdSRalf Baechle 	ext_op, dextm_op, dextu_op, dext_op,
7490e8cacdSRalf Baechle 	ins_op, dinsm_op, dinsu_op, dins_op,
7590e8cacdSRalf Baechle 	lx_op = 0x0a,
7690e8cacdSRalf Baechle 	bshfl_op = 0x20,
7790e8cacdSRalf Baechle 	dbshfl_op = 0x24,
7890e8cacdSRalf Baechle 	rdhwr_op = 0x3b
7990e8cacdSRalf Baechle };
8090e8cacdSRalf Baechle 
8190e8cacdSRalf Baechle /*
8290e8cacdSRalf Baechle  * rt field of bcond opcodes.
8390e8cacdSRalf Baechle  */
8490e8cacdSRalf Baechle enum rt_op {
8590e8cacdSRalf Baechle 	bltz_op, bgez_op, bltzl_op, bgezl_op,
8690e8cacdSRalf Baechle 	spimi_op, unused_rt_op_0x05, unused_rt_op_0x06, unused_rt_op_0x07,
8790e8cacdSRalf Baechle 	tgei_op, tgeiu_op, tlti_op, tltiu_op,
8890e8cacdSRalf Baechle 	teqi_op, unused_0x0d_rt_op, tnei_op, unused_0x0f_rt_op,
8990e8cacdSRalf Baechle 	bltzal_op, bgezal_op, bltzall_op, bgezall_op,
9090e8cacdSRalf Baechle 	rt_op_0x14, rt_op_0x15, rt_op_0x16, rt_op_0x17,
9190e8cacdSRalf Baechle 	rt_op_0x18, rt_op_0x19, rt_op_0x1a, rt_op_0x1b,
9290e8cacdSRalf Baechle 	bposge32_op, rt_op_0x1d, rt_op_0x1e, rt_op_0x1f
9390e8cacdSRalf Baechle };
9490e8cacdSRalf Baechle 
9590e8cacdSRalf Baechle /*
9690e8cacdSRalf Baechle  * rs field of cop opcodes.
9790e8cacdSRalf Baechle  */
9890e8cacdSRalf Baechle enum cop_op {
9990e8cacdSRalf Baechle 	mfc_op        = 0x00, dmfc_op       = 0x01,
10090e8cacdSRalf Baechle 	cfc_op        = 0x02, mtc_op        = 0x04,
10190e8cacdSRalf Baechle 	dmtc_op       = 0x05, ctc_op        = 0x06,
10290e8cacdSRalf Baechle 	bc_op         = 0x08, cop_op        = 0x10,
10390e8cacdSRalf Baechle 	copm_op       = 0x18
10490e8cacdSRalf Baechle };
10590e8cacdSRalf Baechle 
10690e8cacdSRalf Baechle /*
10790e8cacdSRalf Baechle  * rt field of cop.bc_op opcodes
10890e8cacdSRalf Baechle  */
10990e8cacdSRalf Baechle enum bcop_op {
11090e8cacdSRalf Baechle 	bcf_op, bct_op, bcfl_op, bctl_op
11190e8cacdSRalf Baechle };
11290e8cacdSRalf Baechle 
11390e8cacdSRalf Baechle /*
11490e8cacdSRalf Baechle  * func field of cop0 coi opcodes.
11590e8cacdSRalf Baechle  */
11690e8cacdSRalf Baechle enum cop0_coi_func {
11790e8cacdSRalf Baechle 	tlbr_op       = 0x01, tlbwi_op      = 0x02,
11890e8cacdSRalf Baechle 	tlbwr_op      = 0x06, tlbp_op       = 0x08,
11990e8cacdSRalf Baechle 	rfe_op        = 0x10, eret_op       = 0x18
12090e8cacdSRalf Baechle };
12190e8cacdSRalf Baechle 
12290e8cacdSRalf Baechle /*
12390e8cacdSRalf Baechle  * func field of cop0 com opcodes.
12490e8cacdSRalf Baechle  */
12590e8cacdSRalf Baechle enum cop0_com_func {
12690e8cacdSRalf Baechle 	tlbr1_op      = 0x01, tlbw_op       = 0x02,
12790e8cacdSRalf Baechle 	tlbp1_op      = 0x08, dctr_op       = 0x09,
12890e8cacdSRalf Baechle 	dctw_op       = 0x0a
12990e8cacdSRalf Baechle };
13090e8cacdSRalf Baechle 
13190e8cacdSRalf Baechle /*
13290e8cacdSRalf Baechle  * fmt field of cop1 opcodes.
13390e8cacdSRalf Baechle  */
13490e8cacdSRalf Baechle enum cop1_fmt {
13590e8cacdSRalf Baechle 	s_fmt, d_fmt, e_fmt, q_fmt,
13690e8cacdSRalf Baechle 	w_fmt, l_fmt
13790e8cacdSRalf Baechle };
13890e8cacdSRalf Baechle 
13990e8cacdSRalf Baechle /*
14090e8cacdSRalf Baechle  * func field of cop1 instructions using d, s or w format.
14190e8cacdSRalf Baechle  */
14290e8cacdSRalf Baechle enum cop1_sdw_func {
14390e8cacdSRalf Baechle 	fadd_op      =  0x00, fsub_op      =  0x01,
14490e8cacdSRalf Baechle 	fmul_op      =  0x02, fdiv_op      =  0x03,
14590e8cacdSRalf Baechle 	fsqrt_op     =  0x04, fabs_op      =  0x05,
14690e8cacdSRalf Baechle 	fmov_op      =  0x06, fneg_op      =  0x07,
14790e8cacdSRalf Baechle 	froundl_op   =  0x08, ftruncl_op   =  0x09,
14890e8cacdSRalf Baechle 	fceill_op    =  0x0a, ffloorl_op   =  0x0b,
14990e8cacdSRalf Baechle 	fround_op    =  0x0c, ftrunc_op    =  0x0d,
15090e8cacdSRalf Baechle 	fceil_op     =  0x0e, ffloor_op    =  0x0f,
15190e8cacdSRalf Baechle 	fmovc_op     =  0x11, fmovz_op     =  0x12,
15290e8cacdSRalf Baechle 	fmovn_op     =  0x13, frecip_op    =  0x15,
15390e8cacdSRalf Baechle 	frsqrt_op    =  0x16, fcvts_op     =  0x20,
15490e8cacdSRalf Baechle 	fcvtd_op     =  0x21, fcvte_op     =  0x22,
15590e8cacdSRalf Baechle 	fcvtw_op     =  0x24, fcvtl_op     =  0x25,
15690e8cacdSRalf Baechle 	fcmp_op      =  0x30
15790e8cacdSRalf Baechle };
15890e8cacdSRalf Baechle 
15990e8cacdSRalf Baechle /*
16090e8cacdSRalf Baechle  * func field of cop1x opcodes (MIPS IV).
16190e8cacdSRalf Baechle  */
16290e8cacdSRalf Baechle enum cop1x_func {
16390e8cacdSRalf Baechle 	lwxc1_op     =  0x00, ldxc1_op     =  0x01,
16490e8cacdSRalf Baechle 	pfetch_op    =  0x07, swxc1_op     =  0x08,
16590e8cacdSRalf Baechle 	sdxc1_op     =  0x09, madd_s_op    =  0x20,
16690e8cacdSRalf Baechle 	madd_d_op    =  0x21, madd_e_op    =  0x22,
16790e8cacdSRalf Baechle 	msub_s_op    =  0x28, msub_d_op    =  0x29,
16890e8cacdSRalf Baechle 	msub_e_op    =  0x2a, nmadd_s_op   =  0x30,
16990e8cacdSRalf Baechle 	nmadd_d_op   =  0x31, nmadd_e_op   =  0x32,
17090e8cacdSRalf Baechle 	nmsub_s_op   =  0x38, nmsub_d_op   =  0x39,
17190e8cacdSRalf Baechle 	nmsub_e_op   =  0x3a
17290e8cacdSRalf Baechle };
17390e8cacdSRalf Baechle 
17490e8cacdSRalf Baechle /*
17590e8cacdSRalf Baechle  * func field for mad opcodes (MIPS IV).
17690e8cacdSRalf Baechle  */
17790e8cacdSRalf Baechle enum mad_func {
17890e8cacdSRalf Baechle 	madd_fp_op      = 0x08, msub_fp_op      = 0x0a,
17990e8cacdSRalf Baechle 	nmadd_fp_op     = 0x0c, nmsub_fp_op     = 0x0e
18090e8cacdSRalf Baechle };
18190e8cacdSRalf Baechle 
18290e8cacdSRalf Baechle /*
18390e8cacdSRalf Baechle  * func field for special3 lx opcodes (Cavium Octeon).
18490e8cacdSRalf Baechle  */
18590e8cacdSRalf Baechle enum lx_func {
18690e8cacdSRalf Baechle 	lwx_op	= 0x00,
18790e8cacdSRalf Baechle 	lhx_op	= 0x04,
18890e8cacdSRalf Baechle 	lbux_op	= 0x06,
18990e8cacdSRalf Baechle 	ldx_op	= 0x08,
19090e8cacdSRalf Baechle 	lwux_op	= 0x10,
19190e8cacdSRalf Baechle 	lhux_op	= 0x14,
19290e8cacdSRalf Baechle 	lbx_op	= 0x16,
19390e8cacdSRalf Baechle };
19490e8cacdSRalf Baechle 
19590e8cacdSRalf Baechle /*
19690e8cacdSRalf Baechle  * Damn ...  bitfields depend from byteorder :-(
19790e8cacdSRalf Baechle  */
19890e8cacdSRalf Baechle #ifdef __MIPSEB__
199*85dfaf08SRalf Baechle #define BITFIELD_FIELD(field, more)					\
200*85dfaf08SRalf Baechle 	field;								\
201*85dfaf08SRalf Baechle 	more
20290e8cacdSRalf Baechle 
20390e8cacdSRalf Baechle #elif defined(__MIPSEL__)
20490e8cacdSRalf Baechle 
205*85dfaf08SRalf Baechle #define BITFIELD_FIELD(field, more)					\
206*85dfaf08SRalf Baechle 	more								\
207*85dfaf08SRalf Baechle 	field;
20890e8cacdSRalf Baechle 
20990e8cacdSRalf Baechle #else /* !defined (__MIPSEB__) && !defined (__MIPSEL__) */
21090e8cacdSRalf Baechle #error "MIPS but neither __MIPSEL__ nor __MIPSEB__?"
21190e8cacdSRalf Baechle #endif
21290e8cacdSRalf Baechle 
213*85dfaf08SRalf Baechle struct j_format {
214*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,	/* Jump format */
215*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int target : 26,
216*85dfaf08SRalf Baechle 	;))
217*85dfaf08SRalf Baechle };
218*85dfaf08SRalf Baechle 
219*85dfaf08SRalf Baechle struct i_format {			/* signed immediate format */
220*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
221*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rs : 5,
222*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rt : 5,
223*85dfaf08SRalf Baechle 	BITFIELD_FIELD(signed int simmediate : 16,
224*85dfaf08SRalf Baechle 	;))))
225*85dfaf08SRalf Baechle };
226*85dfaf08SRalf Baechle 
227*85dfaf08SRalf Baechle struct u_format {			/* unsigned immediate format */
228*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
229*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rs : 5,
230*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rt : 5,
231*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int uimmediate : 16,
232*85dfaf08SRalf Baechle 	;))))
233*85dfaf08SRalf Baechle };
234*85dfaf08SRalf Baechle 
235*85dfaf08SRalf Baechle struct c_format {			/* Cache (>= R6000) format */
236*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
237*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rs : 5,
238*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int c_op : 3,
239*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int cache : 2,
240*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int simmediate : 16,
241*85dfaf08SRalf Baechle 	;)))))
242*85dfaf08SRalf Baechle };
243*85dfaf08SRalf Baechle 
244*85dfaf08SRalf Baechle struct r_format {			/* Register format */
245*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
246*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rs : 5,
247*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rt : 5,
248*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rd : 5,
249*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int re : 5,
250*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int func : 6,
251*85dfaf08SRalf Baechle 	;))))))
252*85dfaf08SRalf Baechle };
253*85dfaf08SRalf Baechle 
254*85dfaf08SRalf Baechle struct p_format {		/* Performance counter format (R10000) */
255*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
256*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rs : 5,
257*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rt : 5,
258*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rd : 5,
259*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int re : 5,
260*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int func : 6,
261*85dfaf08SRalf Baechle 	;))))))
262*85dfaf08SRalf Baechle };
263*85dfaf08SRalf Baechle 
264*85dfaf08SRalf Baechle struct f_format { 			/* FPU register format */
265*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
266*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int : 1,
267*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int fmt : 4,
268*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rt : 5,
269*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int rd : 5,
270*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int re : 5,
271*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int func : 6,
272*85dfaf08SRalf Baechle 	;)))))))
273*85dfaf08SRalf Baechle };
274*85dfaf08SRalf Baechle 
275*85dfaf08SRalf Baechle struct ma_format {		/* FPU multiply and add format (MIPS IV) */
276*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
277*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int fr : 5,
278*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int ft : 5,
279*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int fs : 5,
280*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int fd : 5,
281*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int func : 4,
282*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int fmt : 2,
283*85dfaf08SRalf Baechle 	;)))))))
284*85dfaf08SRalf Baechle };
285*85dfaf08SRalf Baechle 
286*85dfaf08SRalf Baechle struct b_format {			/* BREAK and SYSCALL */
287*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int opcode : 6,
288*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int code : 20,
289*85dfaf08SRalf Baechle 	BITFIELD_FIELD(unsigned int func : 6,
290*85dfaf08SRalf Baechle 	;)))
291*85dfaf08SRalf Baechle };
292*85dfaf08SRalf Baechle 
29390e8cacdSRalf Baechle union mips_instruction {
29490e8cacdSRalf Baechle 	unsigned int word;
29590e8cacdSRalf Baechle 	unsigned short halfword[2];
29690e8cacdSRalf Baechle 	unsigned char byte[4];
29790e8cacdSRalf Baechle 	struct j_format j_format;
29890e8cacdSRalf Baechle 	struct i_format i_format;
29990e8cacdSRalf Baechle 	struct u_format u_format;
30090e8cacdSRalf Baechle 	struct c_format c_format;
30190e8cacdSRalf Baechle 	struct r_format r_format;
30290e8cacdSRalf Baechle 	struct p_format p_format;
30390e8cacdSRalf Baechle 	struct f_format f_format;
30490e8cacdSRalf Baechle 	struct ma_format ma_format;
30590e8cacdSRalf Baechle 	struct b_format b_format;
30690e8cacdSRalf Baechle };
30790e8cacdSRalf Baechle 
30890e8cacdSRalf Baechle #endif /* _UAPI_ASM_INST_H */
309