NAME=micromips on gnu
FILE=-
CMDS=<<EOF
rasm2 -a mips.gnu -b32 -d 22fdd018
rasm2 -a mips.gnu -b32 -c micro -d 22fdd018
EOF
EXPECT=<<EOF
0x18d0fd22
lw t1, 6352(v0)
EOF
RUN

NAME=micromips on cs
FILE=-
CMDS=<<EOF
rasm2 -a mips -b32 -d 22fdd018
?e --
rasm2 -a mips -b32 -c micro -d 22fdd018
?e --
rasm2 -a mips.gnu -b32 -d 22fdd018
?e --
rasm2 -a mips.gnu -b32 -c micro -d 22fdd018
EOF
EXPECT=<<EOF
invalid
--
lw t1, 0x18d0(v0)
--
0x18d0fd22
--
lw t1, 6352(v0)
EOF
RUN

NAME=micromips code block CAPSTONE
FILE=-
CMDS=<<EOF
rasm2 -a mips -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
EOF
EXPECT=<<EOF
0x00000000   2                     4fe5  invalid
0x00000002   4                 22fdd018  lw t1, 0x18d0(v0)
0x00000006   2                     40e4  invalid
0x00000008   2                     0007  addu16 a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 0x250e
0x0000000e   2                     41a4  invalid
0x00000010   4                 9860cc06  lwl a0, 0x6cc(t8)
0x00000014   2                     3084  movep a1, a2, zero, v1
0x00000016   2                     7090  invalid
EOF
RUN

NAME=micromips code block and endian test GNU
FILE=-
CMDS=<<EOF
rasm2 -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e --
rasm2 -e -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
EOF
EXPECT=<<EOF
0x00000000   2                     4fe5  0xe54f
0x00000002   4                 22fdd018  lw t1, 6352(v0)
0x00000006   2                     40e4  0xe440
0x00000008   2                     0007  addu a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 9486
0x0000000e   2                     41a4  0xa441
0x00000010   4                 9860cc06  lwl a0, 1740(t8)
0x00000014   2                     3084  movep a1,a2, zero, v1
0x00000016   2                     7090  invalid
--
0x00000000   2                     4fe5  addiu sp, sp, -56
0x00000002   4                 22fdd018  swm s0-s6,ra, 24(sp)
0x00000006   4                 40e40007  beqzc a0, 0x00000019
0x0000000a   2                     ae92  bnez a1, 0x00000031
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b 0x00000021
0x00000014   4                 30847090  addiu a0, a0, 28816
EOF
RUN

NAME=both
REQUIRE=cs5
FILE=-
CMDS=<<EOF
rasm2 -a mips -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu
rasm2 -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e cs
rasm2 -e -a mips -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu
rasm2 -e -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e cs 32bit
rasm2 -e -a mips -b32 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu 32bit
rasm2 -e -a mips.gnu -b32 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
EOF
EXPECT=<<EOF
0x00000000   2                     4fe5  invalid
0x00000002   4                 22fdd018  lw t1, 0x18d0(v0)
0x00000006   2                     40e4  invalid
0x00000008   2                     0007  addu16 a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 0x250e
0x0000000e   2                     41a4  invalid
0x00000010   4                 9860cc06  lwl a0, 0x6cc(t8)
0x00000014   2                     3084  movep a1, a2, zero, v1
0x00000016   2                     7090  invalid
gnu
0x00000000   2                     4fe5  0xe54f
0x00000002   4                 22fdd018  lw t1, 6352(v0)
0x00000006   2                     40e4  0xe440
0x00000008   2                     0007  addu a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 9486
0x0000000e   2                     41a4  0xa441
0x00000010   4                 9860cc06  lwl a0, 1740(t8)
0x00000014   2                     3084  movep a1,a2, zero, v1
0x00000016   2                     7090  invalid
cs
0x00000000   2                     4fe5  addiusp -0x38
0x00000002   4                 22fdd018  swm32 s0, s1, s2, s3, s4, s5, s6, ra, 0x18(sp)
0x00000006   4                 40e40007  beqzc a0, 0xe
0x0000000a   2                     ae92  bnez16 a1, 0x24
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b16 0xc
0x00000014   4                 30847090  addiu a0, a0, 0x7090
gnu
0x00000000   2                     4fe5  addiu sp, sp, -56
0x00000002   4                 22fdd018  swm s0-s6,ra, 24(sp)
0x00000006   4                 40e40007  beqzc a0, 0x00000019
0x0000000a   2                     ae92  bnez a1, 0x00000031
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b 0x00000021
0x00000014   4                 30847090  addiu a0, a0, 28816
cs 32bit
0x00000000   2                     4fe5  addiusp -0x38
0x00000002   4                 22fdd018  swm32 s0, s1, s2, s3, s4, s5, s6, ra, 0x18(sp)
0x00000006   4                 40e40007  beqzc a0, 0xe
0x0000000a   2                     ae92  bnez16 a1, 0x24
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b16 0xc
0x00000014   4                 30847090  addiu a0, a0, 0x7090
gnu 32bit
0x00000000   2                     4fe5  addiu sp, sp, -56
0x00000002   4                 22fdd018  swm s0-s6,ra, 24(sp)
0x00000006   4                 40e40007  beqzc a0, 0x00000019
0x0000000a   2                     ae92  bnez a1, 0x00000031
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b 0x00000021
0x00000014   4                 30847090  addiu a0, a0, 28816
EOF
RUN

NAME=both (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
rasm2 -a mips -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu
rasm2 -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e cs
rasm2 -e -a mips -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu
rasm2 -e -a mips.gnu -b16 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e cs 32bit
rasm2 -e -a mips -b32 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
?e gnu 32bit
rasm2 -e -a mips.gnu -b32 -c micro -D 4fe522fdd01840e40007ae920e2541a49860cc0630847090
EOF
EXPECT=<<EOF
0x00000000   2                     4fe5  invalid
0x00000002   4                 22fdd018  lw t1, 0x18d0(v0)
0x00000006   2                     40e4  invalid
0x00000008   2                     0007  addu16 a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 0x250e
0x0000000e   2                     41a4  invalid
0x00000010   4                 9860cc06  lwl a0, 0x6cc(t8)
0x00000014   2                     3084  movep a1, a2, zero, v1
0x00000016   2                     7090  invalid
gnu
0x00000000   2                     4fe5  0xe54f
0x00000002   4                 22fdd018  lw t1, 6352(v0)
0x00000006   2                     40e4  0xe440
0x00000008   2                     0007  addu a2, s0, s0
0x0000000a   4                 ae920e25  slti s5, t6, 9486
0x0000000e   2                     41a4  0xa441
0x00000010   4                 9860cc06  lwl a0, 1740(t8)
0x00000014   2                     3084  movep a1,a2, zero, v1
0x00000016   2                     7090  invalid
cs
0x00000000   2                     4fe5  addiusp -0x38
0x00000002   4                 22fdd018  swm32 s0, s1, s2, s3, s4, s5, s6, ra, 0x18(sp)
0x00000006   4                 40e40007  beqzc a0, 0x18
0x0000000a   2                     ae92  bnez16 a1, 0x2e
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b16 0x1e
0x00000014   4                 30847090  addiu a0, a0, 0x7090
gnu
0x00000000   2                     4fe5  addiu sp, sp, -56
0x00000002   4                 22fdd018  swm s0-s6,ra, 24(sp)
0x00000006   4                 40e40007  beqzc a0, 0x00000019
0x0000000a   2                     ae92  bnez a1, 0x00000031
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b 0x00000021
0x00000014   4                 30847090  addiu a0, a0, 28816
cs 32bit
0x00000000   2                     4fe5  addiusp -0x38
0x00000002   4                 22fdd018  swm32 s0, s1, s2, s3, s4, s5, s6, ra, 0x18(sp)
0x00000006   4                 40e40007  beqzc a0, 0x18
0x0000000a   2                     ae92  bnez16 a1, 0x2e
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b16 0x1e
0x00000014   4                 30847090  addiu a0, a0, 0x7090
gnu 32bit
0x00000000   2                     4fe5  addiu sp, sp, -56
0x00000002   4                 22fdd018  swm s0-s6,ra, 24(sp)
0x00000006   4                 40e40007  beqzc a0, 0x00000019
0x0000000a   2                     ae92  bnez a1, 0x00000031
0x0000000c   2                     0e25  move s1, a1
0x0000000e   4                 41a49860  lui a0, 0x9860
0x00000012   2                     cc06  b 0x00000021
0x00000014   4                 30847090  addiu a0, a0, 28816
EOF
RUN

NAME=micromips align
FILE=-
CMDS=<<EOF
-a mips
-e asm.cpu=micro
-e cfg.bigendian=true
-b 16
wx 41bc0002339c821f033ce1504fedff3c801cfb9d0010cbe96e8d45d9308000054be9470a
pd 10
EOF
EXPECT=<<EOF
            0x00000000      41bc0002       lui gp, 2
            0x00000004      339c821f       addiu gp, gp, -0x7de1
            0x00000008      033ce150       addu gp, gp, t9
            0x0000000c      4fed           addiusp -0x28
            0x0000000e      ff3c801c       lw t9, -0x7fe4(gp)
            0x00000012      fb9d0010       sw gp, 0x10(sp)
            0x00000016      cbe9           sw ra, 0x24(sp)
            0x00000018      6e8d           addiur1sp a1, 0x18
            0x0000001a      45d9           jalr t9
            0x0000001c      30800005       addiu a0, zero, 5
EOF
RUN

NAME=micromips align
FILE=-
CMDS=<<EOF
-a mips.gnu
-e asm.cpu=micro
-e cfg.bigendian=true
-b 16
wx 41bc0002339c821f033ce1504fedff3c801cfb9d0010cbe96e8d45d9308000054be9470a
pd 10
EOF
EXPECT=<<EOF
            0x00000000      41bc0002       lui gp, 0x2
            0x00000004      339c821f       addiu gp, gp, -32225
            0x00000008      033ce150       addu gp, gp, t9
            0x0000000c      4fed           addiu sp, sp, -40
            0x0000000e      ff3c801c       lw t9, -32740(gp)
            0x00000012      fb9d0010       sw gp, 16(sp)
            0x00000016      cbe9           sw ra, 36(sp)
            0x00000018      6e8d           addiu a1, sp, 24
            0x0000001a      45d9           jalr t9
            0x0000001c      30800005       li a0, 5
EOF
RUN

NAME=micromips align
FILE=bins/elf/micromips.elf
CMDS=<<EOF
pd 10
pd 10
EOF
EXPECT=<<EOF
            ;-- section..text:
            ;-- main:
            ;-- entry0:
            ;-- _ftext:
            0x004000d0      41bc0002       lui gp, 2                   ; [04] -r-x section size 512 named .text
            0x004000d4      339c821f       addiu gp, gp, -0x7de1
            0x004000d8      033ce150       addu gp, gp, t9
            0x004000dc      4fed           addiusp -0x28
            0x004000de      ff3c801c       lw t9, -0x7fe4(gp)          ; [0x41030c:4]=0x400221
            0x004000e2      fb9d0010       sw gp, 0x10(sp)
            0x004000e6      cbe9           sw ra, 0x24(sp)
            0x004000e8      6e8d           addiur1sp a1, 0x18
            0x004000ea      45d9           jalr t9
            0x004000ec      30800005       addiu a0, zero, 5
            ;-- section..text:
            ;-- main:
            ;-- entry0:
            ;-- _ftext:
            0x004000d0      41bc0002       lui gp, 2                   ; [04] -r-x section size 512 named .text
            0x004000d4      339c821f       addiu gp, gp, -0x7de1
            0x004000d8      033ce150       addu gp, gp, t9
            0x004000dc      4fed           addiusp -0x28
            0x004000de      ff3c801c       lw t9, -0x7fe4(gp)          ; [0x41030c:4]=0x400221
            0x004000e2      fb9d0010       sw gp, 0x10(sp)
            0x004000e6      cbe9           sw ra, 0x24(sp)
            0x004000e8      6e8d           addiur1sp a1, 0x18
            0x004000ea      45d9           jalr t9
            0x004000ec      30800005       addiu a0, zero, 5
EOF
RUN

NAME=twobytes
FILE=--
CMDS=<<EOF
!!rasm2 -a mips -b16 -e -c micro -d '4fe5'
!!rasm2 -a mips.gnu -b16 -e -c micro -d '4fe5'
EOF
EXPECT=<<EOF
addiusp -0x38
addiu sp, sp, -56
EOF
RUN

NAME=micromips GNU and Capstone analysis boundaries in both byte orders
FILE=malloc://26
ARGS=-a mips.gnu -b 32 -e asm.cpu=micro -e cfg.bigendian=true
CMDS=<<EOF
wx 41bc0002339c821f033ce1504fedff3c801cfb9d0010cbe96e8d
af
afbj
af-
e cfg.bigendian=false
wx bc4102009c331f823c0350e1ed4f3cff1c809dfb1000e9cb8d6e
af
afbj
af-
e asm.arch=mips
e asm.cpu=micro
e cfg.bigendian=true
wx 41bc0002339c821f033ce1504fedff3c801cfb9d0010cbe96e8d
af
afbj
af-
e cfg.bigendian=false
wx bc4102009c331f823c0350e1ed4f3cff1c809dfb1000e9cb8d6e
af
afbj
EOF
EXPECT=<<EOF
[{"addr":0,"size":26,"opaddr":0,"inputs":0,"outputs":0,"ninstr":8,"instrs":[0,4,8,12,14,18,22,24],"traced":0}]
[{"addr":0,"size":26,"opaddr":0,"inputs":0,"outputs":0,"ninstr":8,"instrs":[0,4,8,12,14,18,22,24],"traced":0}]
[{"addr":0,"size":26,"opaddr":0,"inputs":0,"outputs":0,"ninstr":8,"instrs":[0,4,8,12,14,18,22,24],"traced":0}]
[{"addr":0,"size":26,"opaddr":0,"inputs":0,"outputs":0,"ninstr":8,"instrs":[0,4,8,12,14,18,22,24],"traced":0}]
EOF
RUN

NAME=micromips GNU pdf keeps every instruction after analysis
FILE=bins/elf/micromips.elf
ARGS=-a mips.gnu -e asm.lines=false -e asm.comments=false -e asm.sub.var=false
CMDS=<<EOF
aaa
e asm.dwarf=false
pdf @ sym.main~0x0040
pdf @ sym.nthFibonacciTerm~0x0040
EOF
EXPECT=<<EOF
0x004000d0      41bc0002       lui gp, 0x2
0x004000d4      339c821f       addiu gp, gp, -32225
0x004000d8      033ce150       addu gp, gp, t9
0x004000dc      4fed           addiu sp, sp, -40
0x004000de      ff3c801c       lw t9, -32740(gp)
0x004000e2      fb9d0010       sw gp, 16(sp)
0x004000e6      cbe9           sw ra, 36(sp)
0x004000e8      6e8d           addiu a1, sp, 24
0x004000ea      45d9           jalr t9
0x004000ec      30800005       li a0, 5
0x004000f0      4be9           lw ra, 36(sp)
0x004000f2      470a           jraddiusp 40
0x00400220      41bc0002       lui gp, 0x2
0x00400224      339c80cf       addiu gp, gp, -32561
0x00400228      033ce150       addu gp, gp, t9
0x0040022c      4fe5           addiu sp, sp, -56
0x0040022e      fb9d0010       sw gp, 16(sp)
0x00400232      22fdd018       swm s0-s6,ra, 24(sp)
0x00400236      8e85           beqz a1, 0x00400243
0x00400238      0e00           move s0, zero
0x0040023a      40440006       bgez a0, 0x0040024b
0x0040023e      ed7f           li v0, -1
0x00400240      e950           sw v0, 0(a1)
0x00400242      0c50           move v0, s0
0x00400244      22fd5018       lwm s0-s6,ra, 24(sp)
0x00400248      470e           jraddiusp 56
0x0040024a      8e2c           beqz a0, 0x004002a5
0x0040024c      0e25           move s1, a1
0x0040024e      0e44           move s2, a0
0x00400250      32a00002       li s5, 2
0x00400254      0e80           move s4, zero
0x00400256      ec01           li s0, 1
0x00400258      32600001       li s3, 1
0x0040025c      32c00001       li s6, 1
0x00400260      e850           sw zero, 0(a1)
0x00400262      02551350       slt v0, s5, s2
0x00400266      ad08           bnez v0, 0x00400279
0x00400268      ff3c8018       lw t9, -32744(gp)
0x0040026c      ed01           li v0, 1
0x0040026e      9414ffe8       beqz s4, 0x00400243
0x00400272      e910           sw v0, 0(s1)
0x00400274      cfe6           b 0x00400243
0x00400276      0e13           move s0, s3
0x00400278      86cc           movep a0,a1, s3, s0
0x0040027a      45d9           jalr t9
0x0040027c      00000000       nop
0x00400280      b6c20004       bne v0, s6, 0x0040028d
0x00400284      4b84           lw gp, 16(sp)
0x00400286      ec7f           li s0, -1
0x00400288      cfdc           b 0x00400243
0x0040028a      e810           sw zero, 0(s1)
0x0040028c      b4140007       bnez s4, 0x0040029f
0x00400290      02131150       addu v0, s3, s0
0x00400294      0e62           move s3, v0
0x00400296      32800001       li s4, 1
0x0040029a      cfe3           b 0x00400263
0x0040029c      4ea2           addiu s5, s5, 1
0x0040029e      0e02           move s0, v0
0x004002a0      cffc           b 0x0040029b
0x004002a2      0e80           move s4, zero
0x004002a4      ed01           li v0, 1
0x004002a6      0e00           move s0, zero
0x004002a8      cfcc           b 0x00400243
0x004002aa      e950           sw v0, 0(a1)
EOF
RUN

NAME=micromips Capstone pdf keeps every instruction in main after analysis
FILE=bins/elf/micromips.elf
ARGS=-a mips -e asm.lines=false -e asm.comments=false -e asm.sub.var=false
CMDS=<<EOF
aaa
e asm.dwarf=false
pdf @ sym.main~0x0040
EOF
EXPECT=<<EOF
0x004000d0      41bc0002       lui gp, 2
0x004000d4      339c821f       addiu gp, gp, -0x7de1
0x004000d8      033ce150       addu gp, gp, t9
0x004000dc      4fed           addiusp -0x28
0x004000de      ff3c801c       lw t9, -0x7fe4(gp)
0x004000e2      fb9d0010       sw gp, 0x10(sp)
0x004000e6      cbe9           sw ra, 0x24(sp)
0x004000e8      6e8d           addiur1sp a1, 0x18
0x004000ea      45d9           jalr t9
0x004000ec      30800005       addiu a0, zero, 5
0x004000f0      4be9           lw ra, 0x24(sp)
0x004000f2      470a           jraddiusp 0x28
EOF
RUN

NAME=micromips rejects truncated instructions and keeps alignment checks
FILE=-
ARGS=-a mips.gnu -b 32 -e asm.cpu=micro -e cfg.bigendian=true
CMDS=<<EOF
pad 4fe5
pad ff3c
pad ff
pad ff3c801c
e cfg.bigendian=false
pad e54f
pad 3cff
pad ff
pad 3cff1c80
e cfg.bigendian=true
wx 4fe5ff3c801c
pd 2
pd 1 @ 1
e asm.cpu=mips32
pd 1 @ 2
e asm.arch=mips
e asm.cpu=micro
e cfg.bigendian=true
pd 2
pd 1 @ 1
e asm.cpu=mips32
pd 1 @ 2
EOF
EXPECT=<<EOF
addiu sp, sp, -56
invalid
invalid
lw t9, -32740(gp)
addiu sp, sp, -56
invalid
invalid
lw t9, -32740(gp)
            0x00000000      4fe5           addiu sp, sp, -56
            0x00000002      ff3c801c       lw t9, -32740(gp)
            0x00000001      e5             unaligned
            0x00000002      ff3c           unaligned
            0x00000000      4fe5           addiusp -0x38
            0x00000002      ff3c801c       lw t9, -0x7fe4(gp)
            0x00000001      e5             unaligned
            0x00000002      ff3c           unaligned
EOF
RUN

NAME=micromips truncated slti cannot invent its immediate in either backend
FILE=-
ARGS=-a mips.gnu -b 32 -e asm.cpu=micro
CMDS=<<EOF
b 2
wx 7090
aoj~{0.type}
aoj~{0.size}
pad 70900000
pad 70900100
e asm.arch=mips
e asm.cpu=micro
aoj~{0.type}
aoj~{0.size}
pad 70900000
pad 70900100
EOF
EXPECT=<<EOF
ill
2
slti v1, s0, 0
slti v1, s0, 1
ill
2
slti v1, s0, 0
slti v1, s0, 1
EOF
RUN

NAME=mips GNU and Capstone distinguish code and data alignment
FILE=-
ARGS=-a mips.gnu -b 32
CMDS=<<EOF
e asm.cpu=mips32
aiaj
e asm.cpu=micro
aiaj
e asm.arch=mips
e asm.cpu=mips32
aiaj
e asm.cpu=micro
aiaj
EOF
EXPECT=<<EOF
{"minopsz":4,"maxopsz":4,"invopsz":4,"dtalign":4,"codealign":4}
{"minopsz":2,"maxopsz":4,"invopsz":2,"dtalign":4,"codealign":2}
{"minopsz":4,"maxopsz":4,"invopsz":4,"dtalign":4,"codealign":4}
{"minopsz":2,"maxopsz":4,"invopsz":2,"dtalign":4,"codealign":2}
EOF
RUN
