1 /// Types and constants of MIPS architecture
2 module capstone.mips;
3 
4 import std.variant;
5 import std.exception: enforce;
6 
7 import capstone.internal;
8 import capstone.utils;
9 
10 /** Instruction's operand referring to memory
11 
12 This is associated with the `MipsOpType.mem` operand type
13 */
14 struct MipsOpMem {
15     MipsRegister base;   /// Base register (or `MipsRegister.invalid` if irrelevant)
16     long disp;           /// Displacement value
17 }
18 
19 /// Tagged union of possible operand types
20 alias MipsOpValue = TaggedUnion!(MipsRegister, "reg", long, "imm", MipsOpMem, "mem");
21 
22 /// Instruction's operand
23 struct MipsOp {
24     MipsOpType type;   /// Operand type
25     MipsOpValue value; /// Operand value of type `type`
26     alias value this;  /// Convenient access to value (as in original bindings)
27 
28     package this(cs_mips_op internal){
29         type = internal.type;
30         final switch(internal.type) {
31             case MipsOpType.invalid:
32                 break;
33             case MipsOpType.reg:
34                 value.reg = internal.reg;
35                 break;
36             case MipsOpType.imm:
37                 value.imm = internal.imm;
38                 break;
39             case MipsOpType.mem:
40                 value.mem = internal.mem;
41                 break;
42         }
43     }
44 }
45 
46 /// MIPS-specific information about an instruction
47 struct MipsInstructionDetail {
48     MipsOp[] operands;          /// Operands for this instruction.
49 
50     package this(cs_arch_detail arch_detail){
51 		this(arch_detail.mips);
52 	}
53     package this(cs_mips internal){
54         foreach(op; internal.operands[0..internal.op_count])
55             operands ~= MipsOp(op);
56     }
57 }
58 
59 //=============================================================================
60 // Constants
61 //=============================================================================
62 
63 /// Operand type for instruction's operands
64 enum MipsOpType {
65     invalid = 0,  /// Invalid
66     reg,  		  /// Register operand (`MipsRegister`)
67     imm,    	  /// Immediate operand (`long`)
68     mem,       	  /// Memory operand (`MipsOpMem`)
69 }
70 
71 /// MIPS registers
72 enum MipsRegister {
73     invalid = 0,
74 	// General purpose registers
75     // TODO: Add the aliases MIPS_REG_0 to MIPS_REG_31 ?
76 	zero,
77 	at,
78 	v0,	v1,
79 	a0,	a1,	a2,	a3,
80     t0, t1, t2, t3, t4, t5, t6, t7,
81     s0, s1, s2, s3, s4, s5, s6, s7,
82     t8, t9,
83     k0, k1,
84     gp,
85     sp,
86     fp,
87     ra,
88 
89 	// DSP registers
90 	dspccond,
91 	dspcarry,
92 	dspefi,
93 	dspoutflag,
94 	dspoutflag16_19,
95 	dspoutflag20,
96 	dspoutflag21,
97 	dspoutflag22,
98 	dspoutflag23,
99 	dsppos,
100 	dspscount,
101 
102 	// ACC registers
103 	ac0,
104 	ac1,
105 	ac2,
106 	ac3,
107 
108 	// COP registers
109 	cc0,
110 	cc1,
111 	cc2,
112 	cc3,
113 	cc4,
114 	cc5,
115 	cc6,
116 	cc7,
117 
118 	// FPU registers
119 	f0,
120 	f1,
121 	f2,
122 	f3,
123 	f4,
124 	f5,
125 	f6,
126 	f7,
127 	f8,
128 	f9,
129 	f10,
130 	f11,
131 	f12,
132 	f13,
133 	f14,
134 	f15,
135 	f16,
136 	f17,
137 	f18,
138 	f19,
139 	f20,
140 	f21,
141 	f22,
142 	f23,
143 	f24,
144 	f25,
145 	f26,
146 	f27,
147 	f28,
148 	f29,
149 	f30,
150 	f31,
151 
152 	fcc0,
153 	fcc1,
154 	fcc2,
155 	fcc3,
156 	fcc4,
157 	fcc5,
158 	fcc6,
159 	fcc7,
160 
161 	// AFPR128
162 	w0,
163 	w1,
164 	w2,
165 	w3,
166 	w4,
167 	w5,
168 	w6,
169 	w7,
170 	w8,
171 	w9,
172 	w10,
173 	w11,
174 	w12,
175 	w13,
176 	w14,
177 	w15,
178 	w16,
179 	w17,
180 	w18,
181 	w19,
182 	w20,
183 	w21,
184 	w22,
185 	w23,
186 	w24,
187 	w25,
188 	w26,
189 	w27,
190 	w28,
191 	w29,
192 	w30,
193 	w31,
194 
195 	hi,
196 	lo,
197 
198 	p0,
199 	p1,
200 	p2,
201 
202 	mpl0,
203 	mpl1,
204 	mpl2,
205 
206 	// alias registers
207 	hi0 = ac0,
208 	hi1 = ac1,
209 	hi2 = ac2,
210 	hi3 = ac3,
211 
212 	lo0 = hi0,
213 	lo1 = hi1,
214 	lo2 = hi2,
215     lo3 = hi3
216 }
217 
218 /// MIPS instructions
219 enum MipsInstructionId {
220     invalid = 0,
221 
222 	absq_s,
223 	add,
224 	addiupc,
225 	addqh,
226 	addqh_r,
227 	addq,
228 	addq_s,
229 	addsc,
230 	adds_a,
231 	adds_s,
232 	adds_u,
233 	adduh,
234 	adduh_r,
235 	addu,
236 	addu_s,
237 	addvi,
238 	addv,
239 	addwc,
240 	add_a,
241 	addi,
242 	addiu,
243 	align_,
244 	aluipc,
245 	and,
246 	andi,
247 	append,
248 	asub_s,
249 	asub_u,
250 	aui,
251 	auipc,
252 	aver_s,
253 	aver_u,
254 	ave_s,
255 	ave_u,
256 	baddu,
257 	bal,
258 	balc,
259 	balign,
260 	bc,
261 	bc0f,
262 	bc0fl,
263 	bc0t,
264 	bc0tl,
265 	bc1eqz,
266 	bc1f,
267 	bc1fl,
268 	bc1nez,
269 	bc1t,
270 	bc1tl,
271 	bc2eqz,
272 	bc2f,
273 	bc2fl,
274 	bc2nez,
275 	bc2t,
276 	bc2tl,
277 	bc3f,
278 	bc3fl,
279 	bc3t,
280 	bc3tl,
281 	bclri,
282 	bclr,
283 	beq,
284 	beqc,
285 	beql,
286 	beqzalc,
287 	beqzc,
288 	bgec,
289 	bgeuc,
290 	bgez,
291 	bgezal,
292 	bgezalc,
293 	bgezall,
294 	bgezals,
295 	bgezc,
296 	bgezl,
297 	bgtz,
298 	bgtzalc,
299 	bgtzc,
300 	bgtzl,
301 	binsli,
302 	binsl,
303 	binsri,
304 	binsr,
305 	bitrev,
306 	bitswap,
307 	blez,
308 	blezalc,
309 	blezc,
310 	blezl,
311 	bltc,
312 	bltuc,
313 	bltz,
314 	bltzal,
315 	bltzalc,
316 	bltzall,
317 	bltzals,
318 	bltzc,
319 	bltzl,
320 	bmnzi,
321 	bmnz,
322 	bmzi,
323 	bmz,
324 	bne,
325 	bnec,
326 	bnegi,
327 	bneg,
328 	bnel,
329 	bnezalc,
330 	bnezc,
331 	bnvc,
332 	bnz,
333 	bovc,
334 	bposge32,
335 	break_,
336 	bseli,
337 	bsel,
338 	bseti,
339 	bset,
340 	bz,
341 	beqz,
342 	b,
343 	bnez,
344 	bteqz,
345 	btnez,
346 	cache,
347 	ceil,
348 	ceqi,
349 	ceq,
350 	cfc1,
351 	cfcmsa,
352 	cins,
353 	cins32,
354 	class_,
355 	clei_s,
356 	clei_u,
357 	cle_s,
358 	cle_u,
359 	clo,
360 	clti_s,
361 	clti_u,
362 	clt_s,
363 	clt_u,
364 	clz,
365 	cmpgdu,
366 	cmpgu,
367 	cmpu,
368 	cmp,
369 	copy_s,
370 	copy_u,
371 	ctc1,
372 	ctcmsa,
373 	cvt,
374 	c,
375 	cmpi,
376 	dadd,
377 	daddi,
378 	daddiu,
379 	daddu,
380 	dahi,
381 	dalign,
382 	dati,
383 	daui,
384 	dbitswap,
385 	dclo,
386 	dclz,
387 	ddiv,
388 	ddivu,
389 	deret,
390 	dext,
391 	dextm,
392 	dextu,
393 	di,
394 	dins,
395 	dinsm,
396 	dinsu,
397 	div,
398 	divu,
399 	div_s,
400 	div_u,
401 	dlsa,
402 	dmfc0,
403 	dmfc1,
404 	dmfc2,
405 	dmod,
406 	dmodu,
407 	dmtc0,
408 	dmtc1,
409 	dmtc2,
410 	dmuh,
411 	dmuhu,
412 	dmul,
413 	dmult,
414 	dmultu,
415 	dmulu,
416 	dotp_s,
417 	dotp_u,
418 	dpadd_s,
419 	dpadd_u,
420 	dpaqx_sa,
421 	dpaqx_s,
422 	dpaq_sa,
423 	dpaq_s,
424 	dpau,
425 	dpax,
426 	dpa,
427 	dpop,
428 	dpsqx_sa,
429 	dpsqx_s,
430 	dpsq_sa,
431 	dpsq_s,
432 	dpsub_s,
433 	dpsub_u,
434 	dpsu,
435 	dpsx,
436 	dps,
437 	drotr,
438 	drotr32,
439 	drotrv,
440 	dsbh,
441 	dshd,
442 	dsll,
443 	dsll32,
444 	dsllv,
445 	dsra,
446 	dsra32,
447 	dsrav,
448 	dsrl,
449 	dsrl32,
450 	dsrlv,
451 	dsub,
452 	dsubu,
453 	ehb,
454 	ei,
455 	eret,
456 	ext,
457 	extp,
458 	extpdp,
459 	extpdpv,
460 	extpv,
461 	extrv_rs,
462 	extrv_r,
463 	extrv_s,
464 	extrv,
465 	extr_rs,
466 	extr_r,
467 	extr_s,
468 	extr,
469 	exts,
470 	exts32,
471 	abs,
472 	fadd,
473 	fcaf,
474 	fceq,
475 	fclass,
476 	fcle,
477 	fclt,
478 	fcne,
479 	fcor,
480 	fcueq,
481 	fcule,
482 	fcult,
483 	fcune,
484 	fcun,
485 	fdiv,
486 	fexdo,
487 	fexp2,
488 	fexupl,
489 	fexupr,
490 	ffint_s,
491 	ffint_u,
492 	ffql,
493 	ffqr,
494 	fill,
495 	flog2,
496 	floor,
497 	fmadd,
498 	fmax_a,
499 	fmax,
500 	fmin_a,
501 	fmin,
502 	mov,
503 	fmsub,
504 	fmul,
505 	mul,
506 	neg,
507 	frcp,
508 	frint,
509 	frsqrt,
510 	fsaf,
511 	fseq,
512 	fsle,
513 	fslt,
514 	fsne,
515 	fsor,
516 	fsqrt,
517 	sqrt,
518 	fsub,
519 	sub,
520 	fsueq,
521 	fsule,
522 	fsult,
523 	fsune,
524 	fsun,
525 	ftint_s,
526 	ftint_u,
527 	ftq,
528 	ftrunc_s,
529 	ftrunc_u,
530 	hadd_s,
531 	hadd_u,
532 	hsub_s,
533 	hsub_u,
534 	ilvev,
535 	ilvl,
536 	ilvod,
537 	ilvr,
538 	ins,
539 	insert,
540 	insv,
541 	insve,
542 	j,
543 	jal,
544 	jalr,
545 	jalrs,
546 	jals,
547 	jalx,
548 	jialc,
549 	jic,
550 	jr,
551 	jraddiusp,
552 	jrc,
553 	jalrc,
554 	lb,
555 	lbux,
556 	lbu,
557 	ld,
558 	ldc1,
559 	ldc2,
560 	ldc3,
561 	ldi,
562 	ldl,
563 	ldpc,
564 	ldr,
565 	ldxc1,
566 	lh,
567 	lhx,
568 	lhu,
569 	ll,
570 	lld,
571 	lsa,
572 	luxc1,
573 	lui,
574 	lw,
575 	lwc1,
576 	lwc2,
577 	lwc3,
578 	lwl,
579 	lwpc,
580 	lwr,
581 	lwupc,
582 	lwu,
583 	lwx,
584 	lwxc1,
585 	li,
586 	madd,
587 	maddf,
588 	maddr_q,
589 	maddu,
590 	maddv,
591 	madd_q,
592 	maq_sa,
593 	maq_s,
594 	maxa,
595 	maxi_s,
596 	maxi_u,
597 	max_a,
598 	max,
599 	max_s,
600 	max_u,
601 	mfc0,
602 	mfc1,
603 	mfc2,
604 	mfhc1,
605 	mfhi,
606 	mflo,
607 	mina,
608 	mini_s,
609 	mini_u,
610 	min_a,
611 	min,
612 	min_s,
613 	min_u,
614 	mod,
615 	modsub,
616 	modu,
617 	mod_s,
618 	mod_u,
619 	move,
620 	movf,
621 	movn,
622 	movt,
623 	movz,
624 	msub,
625 	msubf,
626 	msubr_q,
627 	msubu,
628 	msubv,
629 	msub_q,
630 	mtc0,
631 	mtc1,
632 	mtc2,
633 	mthc1,
634 	mthi,
635 	mthlip,
636 	mtlo,
637 	mtm0,
638 	mtm1,
639 	mtm2,
640 	mtp0,
641 	mtp1,
642 	mtp2,
643 	muh,
644 	muhu,
645 	muleq_s,
646 	muleu_s,
647 	mulq_rs,
648 	mulq_s,
649 	mulr_q,
650 	mulsaq_s,
651 	mulsa,
652 	mult,
653 	multu,
654 	mulu,
655 	mulv,
656 	mul_q,
657 	mul_s,
658 	nloc,
659 	nlzc,
660 	nmadd,
661 	nmsub,
662 	nor,
663 	nori,
664 	not,
665 	or,
666 	ori,
667 	packrl,
668 	pause,
669 	pckev,
670 	pckod,
671 	pcnt,
672 	pick,
673 	pop,
674 	precequ,
675 	preceq,
676 	preceu,
677 	precrqu_s,
678 	precrq,
679 	precrq_rs,
680 	precr,
681 	precr_sra,
682 	precr_sra_r,
683 	pref,
684 	prepend,
685 	raddu,
686 	rddsp,
687 	rdhwr,
688 	replv,
689 	repl,
690 	rint,
691 	rotr,
692 	rotrv,
693 	round,
694 	sat_s,
695 	sat_u,
696 	sb,
697 	sc,
698 	scd,
699 	sd,
700 	sdbbp,
701 	sdc1,
702 	sdc2,
703 	sdc3,
704 	sdl,
705 	sdr,
706 	sdxc1,
707 	seb,
708 	seh,
709 	seleqz,
710 	selnez,
711 	sel,
712 	seq,
713 	seqi,
714 	sh,
715 	shf,
716 	shilo,
717 	shilov,
718 	shllv,
719 	shllv_s,
720 	shll,
721 	shll_s,
722 	shrav,
723 	shrav_r,
724 	shra,
725 	shra_r,
726 	shrlv,
727 	shrl,
728 	sldi,
729 	sld,
730 	sll,
731 	slli,
732 	sllv,
733 	slt,
734 	slti,
735 	sltiu,
736 	sltu,
737 	sne,
738 	snei,
739 	splati,
740 	splat,
741 	sra,
742 	srai,
743 	srari,
744 	srar,
745 	srav,
746 	srl,
747 	srli,
748 	srlri,
749 	srlr,
750 	srlv,
751 	ssnop,
752 	st,
753 	subqh,
754 	subqh_r,
755 	subq,
756 	subq_s,
757 	subsus_u,
758 	subsuu_s,
759 	subs_s,
760 	subs_u,
761 	subuh,
762 	subuh_r,
763 	subu,
764 	subu_s,
765 	subvi,
766 	subv,
767 	suxc1,
768 	sw,
769 	swc1,
770 	swc2,
771 	swc3,
772 	swl,
773 	swr,
774 	swxc1,
775 	sync,
776 	syscall,
777 	teq,
778 	teqi,
779 	tge,
780 	tgei,
781 	tgeiu,
782 	tgeu,
783 	tlbp,
784 	tlbr,
785 	tlbwi,
786 	tlbwr,
787 	tlt,
788 	tlti,
789 	tltiu,
790 	tltu,
791 	tne,
792 	tnei,
793 	trunc,
794 	v3mulu,
795 	vmm0,
796 	vmulu,
797 	vshf,
798 	wait,
799 	wrdsp,
800 	wsbh,
801 	xor,
802 	xori,
803 
804 	// some alias instructions
805 	nop,
806 	negu,
807 
808 	// special instructions
809 	jalr_hb,	// jump and link with Hazard Barrier
810     jr_hb,      // jump register with Hazard Barrier
811 }
812 
813 /// Group of Mips instructions
814 enum MipsInstructionGroup {
815     invalid = 0,
816 
817 	// Generic groups
818 	// All jump instructions (conditional+direct+indirect jumps)
819 	jump,
820 
821 	// Architecture-specific groups
822 	bitcount = 128,
823 	dsp,
824 	dspr2,
825 	fpidx,
826 	msa,
827 	mips32r2,
828 	mips64,
829 	mips64r2,
830 	seinreg,
831 	stdenc,
832 	swap,
833 	micromips,
834 	mips16mode,
835 	fp64bit,
836 	nonansfpmath,
837 	notfp64bit,
838 	notinmicromips,
839 	notnacl,
840 	notmips32r6,
841 	notmips64r6,
842 	cnmips,
843 	mips32,
844 	mips32r6,
845 	mips64r6,
846 	mips2,
847 	mips3,
848 	mips3_32,
849 	mips3_32r2,
850 	mips4_32,
851 	mips4_32r2,
852 	mips5_32r2,
853 	gp32bit,
854     gp64bit
855 }