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 }