NAME=a8
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
a8 c745f400000000~type
EOF
EXPECT=<<EOF
type: mov
EOF
RUN

NAME=aos reject huge count
FILE=-
CMDS=<<EOF
aos 268435456
EOF
EXPECT=
EXPECT_ERR=<<EOF
ERROR: Invalid opcode count
EOF
RUN

NAME=anal.mask
FILE=-
ARGS=-a arm -b 64
CMDS=<<EOF
wx 7f2303d5
e anal.mask=false
ao~mask
e anal.mask=true
ao~mask
?e --
wx fc6fbaa9
e anal.mask=false
ao~mask
e anal.mask=true
ao~mask
?e --
wx fd430191
e anal.mask=false
ao~mask
e anal.mask=true
ao~mask
EOF
EXPECT=<<EOF
mask: ffffffff
mask: ffffffff
--
mask: ffffffff
mask: 8000407a
--
mask: ffffffff
mask: 0000807f
EOF
RUN

NAME=ao mask and bytes are limited to the bytes in the block
FILE=malloc://16
CMDS=<<EOF
e asm.arch=bpf
e asm.bits=64
wx b700000001000000
b 1
ao 1~mask,bytes
b 8
ao 1~mask,bytes
EOF
EXPECT=<<EOF
mask: ff
bytes: b7
mask: ffffffffffffffff
bytes: b700000001000000
EOF
RUN

NAME=ao mask and bytes ignore a size hint larger than the block
FILE=malloc://16
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 90909090
ahs 64
b 1
ao 1~mask,bytes
b 8
aoj~{[0].bytes}
EOF
EXPECT=<<EOF
mask: ff
bytes: 90
9090909000000000
EOF
RUN

NAME=ao bytes of a later opcode stop at the end of the block
FILE=malloc://32
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 90909090
ahs 64 @ 3
b 4
ao 4~bytes
b 32
aoj 4~{[3].bytes}
EOF
EXPECT=<<EOF
bytes: 90
bytes: 90
bytes: 90
bytes: 90
9000000000000000000000000000000000000000000000000000000000
EOF
RUN

NAME=aob
FILE=-
CMDS=<<EOF
-a arm
-b 64
wx fc6fbaa9
aob
aob fd430191
EOF
EXPECT=<<EOF
x3311111 42222233 40444444 1xx0x1x3  : stp x28, x27, [sp, -0x60]!
22211111 33333322 03333333 100x00x0  : add x29, sp, 0x50
EOF
RUN

NAME=aob json
FILE=-
CMDS=<<EOF
-a arm
-b 64
wx fc6fbaa9
aobj
aobj fd430191
EOF
EXPECT=<<EOF
{"opstr":"stp x28, x27, [sp, -0x60]!","size":4,"bytes":[[-1,3,3,1,1,1,1,1],[4,2,2,2,2,2,3,3],[4,0,4,4,4,4,4,4],[1,-1,-1,0,-1,1,-1,3]],"flipstr":"x3311111 42222233 40444444 1xx0x1x3 ","args":[[22,28],[1,2,3,4,0,31,26],[10,11,12,13,14],[5,6,8,9,24],[15,16,17,18,19,20,21,23]],"vals":[122,31,27,114,0]}
{"opstr":"add x29, sp, 0x50","size":4,"bytes":[[2,2,2,1,1,1,1,1],[3,3,3,3,3,3,2,2],[0,3,3,3,3,3,3,3],[1,0,0,-1,0,0,-1,0]],"flipstr":"22211111 33333322 03333333 100x00x0 ","args":[[23,24,26,27,29,30],[1,2,3,4,0,31],[5,6,7,8,9],[10,11,12,13,14,15,16,17,18,19,20,21,22]],"vals":[2049,31,59,1]}
EOF
RUN

NAME=aobV more than 4 bytes
FILE=-
CMDS=<<EOF
-a wasm
wx 418080808000
aobV~:0
EOF
EXPECT=<<EOF
 01000001 10000000 10000000 10000000 | 10000000 00000000
EOF
RUN

NAME=aob instruction longer than 8 bytes
FILE=-
CMDS=<<EOF
-a x86
-b 64
wx 48b81122334455667788
aob
aobm
aobj
EOF
EXPECT=<<EOF
00000001 00000111 22222222 22222222 | 22222222 22222222 22222222 22222222 22222222 22222222  : movabs rax, 0x8877665544332211
fef80000000000000000
{"opstr":"movabs rax, 0x8877665544332211","size":10,"bytes":[[0,0,0,0,0,0,0,1],[0,0,0,0,0,1,1,1],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2]],"flipstr":"00000001 00000111 22222222 22222222 | 22222222 22222222 22222222 22222222 22222222 22222222 ","args":[[1,2,3,4,5,6,7,11,12,13,14,15],[0,10,9,8],[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79]],"vals":[1234605616436508552,0,1175]}
EOF
RUN

NAME=aom-6502.cs
FILE=-
CMDS=<<EOF
e asm.arch=6502.cs
e asm.bits=8
aom
aoml~?
EOF
EXPECT=<<EOF
brk
96
EOF
RUN

NAME=aom-arm
FILE=-
CMDS=<<EOF
e asm.arch=arm
e asm.bits=64
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
invalid
1288
471
471
EOF
RUN

NAME=aom-evm for capstone
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=evm
e asm.bits=32
aom
aoml~?
EOF
EXPECT=<<EOF
stop
134
EOF
RUN

NAME=aom-evm for capstone (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=evm
e asm.bits=32
aom
aoml~?
EOF
EXPECT=<<EOF
stop
146
EOF
RUN

NAME=aom-m680x
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=m680x
aom
aoml~?
EOF
EXPECT=<<EOF
fcb
356
EOF
RUN

NAME=aom-m680x (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=m680x
aom
aoml~?
EOF
EXPECT=<<EOF
fcb
412
EOF
RUN

NAME=aom-m68k
FILE=-
CMDS=<<EOF
e asm.arch=m68k
aom
aoml~?
EOF
EXPECT=<<EOF
ori.b
374
EOF
RUN

NAME=aom-mips
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=mips
e asm.bits=64
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
nop
625
625
625
EOF
RUN

NAME=aom-mips (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=mips
e asm.bits=64
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
nop
1359
1359
1359
EOF
RUN

NAME=aom-ppc
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=ppc
aom
aoml~?
EOF
EXPECT=<<EOF
invalid
1726
EOF
RUN

NAME=aom-ppc (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=ppc
aom
aoml~?
EOF
EXPECT=<<EOF
invalid
1714
EOF
RUN

NAME=aom-riscv
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=riscv.cs
e asm.bits=64
wx 13 # wa nop
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
nop
272
272
272
EOF
RUN

NAME=aom-riscv (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=riscv.cs
e asm.bits=64
wx 13 # wa nop
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
nop
1674
1674
1674
EOF
RUN

NAME=aom-sparc
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=sparc
e cfg.bigendian=true
aom
aoml~?
EOF
EXPECT=<<EOF
unimp
278
EOF
RUN

NAME=aom-sparc (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=sparc
e cfg.bigendian=true
aom
aoml~?
EOF
EXPECT=<<EOF
unimp
289
EOF
RUN

NAME=aom-s390
REQUIRE=cs5
FILE=-
CMDS=<<EOF
e asm.arch=s390
e cfg.bigendian=true
wx 051e
aom
aoml~?
EOF
EXPECT=<<EOF
balr
2345
EOF
RUN

NAME=aom-s390 (cs6)
REQUIRE=cs6
FILE=-
CMDS=<<EOF
e asm.arch=s390
e cfg.bigendian=true
wx 051e
aom
aoml~?
EOF
EXPECT=<<EOF
balr
2499
EOF
RUN

NAME=aom-x86
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
aom
aoml~?
e asm.bits=32
aoml~?
e asm.bits=16
aoml~?
EOF
EXPECT=<<EOF
add
1523
1523
1523
EOF
RUN

NAME=aom-xcore
FILE=-
CMDS=<<EOF
e asm.arch=xcore
aom
aoml~?
EOF
EXPECT=<<EOF
stw
120
EOF
RUN

NAME=aof
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 55
aof rsp
aof rbp
EOF
EXPECT=<<EOF
8,rsp,-=

EOF
RUN

NAME=ao_aoj
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx c745f400000000
ao
aoj~{}
EOF
EXPECT=<<EOF
address: 0x0
opcode: mov dword [rbp - 0xc], 0
esilcost: 12
disasm: mov dword [rbp - 0xc], 0
pseudo: dword [rbp - 0xc] = 0
mnemonic: mov
description: moves data from src to dst
mask: ffffffffffffff
id: 460
bytes: c745f400000000
val: 0x00000000
disp: -12
refptr: 4
size: 7
sign: false
type: mov
cycles: 1
esil: 0,0xc,rbp,-,=[4]
direction: write
family: cpu
stackop: set
stackptr: 8
[
  {
    "opcode": "mov dword [rbp - 0xc], 0",
    "disasm": "mov dword [rbp - 0xc], 0",
    "pseudo": "dword [rbp - 0xc] = 0",
    "description": "moves data from src to dst",
    "mnemonic": "mov",
    "mask": "ffffffffffffff",
    "esil": "0,0xc,rbp,-,=[4]",
    "sign": false,
    "id": 460,
    "opex": {
      "operands": [
        {
          "size": 4,
          "rw": 2,
          "type": "mem",
          "base": "rbp",
          "scale": 1,
          "disp": -12
        },
        {
          "size": 4,
          "rw": 0,
          "type": "imm",
          "value": 0
        }
      ],
      "modrm": true,
      "disp": -12
    },
    "addr": 0,
    "bytes": "c745f400000000",
    "val": 0,
    "disp": 18446744073709551604,
    "size": 7,
    "type": "mov",
    "esilcost": 12,
    "refptr": 4,
    "cycles": 1,
    "failcycles": 0,
    "delay": 0,
    "stack": "set",
    "stackptr": 8,
    "direction": "write",
    "family": "cpu"
  }
]
EOF
RUN

NAME=aojvals-z80
FILE=-
ARGS=-a z80 -b 8
CMDS=<<EOF
wx ceed
aoj~{}
EOF
EXPECT=<<EOF
[
  {
    "opcode": "adc a, 0xed",
    "disasm": "adc a, 0xed",
    "pseudo": "a += 0xed + carry",
    "description": "add with carry register pair",
    "mnemonic": "adc",
    "mask": "ffff",
    "esil": "a,t0,=,237,t1,=,C,t3,=,,t1,t3,+,t0,+,t2,=,0x00ff,t2,&,t4,=,0,f,=,0,N,=,t4,!,Z,=,7,t4,>>,S,=,0x28,0,t4,>>,&,f,|=,4,t0,t1,^,t2,^,>>,1,&,H,=,7,t0,t2,^,t0,t1,^,0xffff,^,&,>>,1,&,P,=,8,t2,>>,1,&,C,=,t2,a,=,",
    "sign": false,
    "id": 0,
    "addr": 0,
    "bytes": "ceed",
    "size": 2,
    "type": "add",
    "esilcost": 0,
    "cycles": 7,
    "failcycles": 0,
    "delay": 0,
    "stackptr": 0,
    "family": "cpu"
  }
]
EOF
RUN

NAME=aojvals-gb
FILE=-
ARGS=-a x86 -b 8
CMDS=<<EOF
# hack because there's no parse plugin for gb
-a gb
wx ceed
aoj~{}
EOF
EXPECT=<<EOF
[
  {
    "opcode": "adc 0xed",
    "disasm": "adc 0xed",
    "pseudo": "adc 0xed",
    "description": "add with carry register pair",
    "srcs": [
      {
        "name": "0xed",
        "type": "imm",
        "absolute": 1,
        "imm": 237
      },
      {
        "name": "C",
        "type": "reg"
      }
    ],
    "dsts": [
      {
        "name": "a",
        "type": "reg"
      }
    ],
    "mnemonic": "adc",
    "mask": "ffff",
    "esil": "237,a,+=,C,NUM,3,$c,H,:=,7,$c,C,:=,a,+=,3,$c,H,|,H,:=,7,$c,C,|,C,:=,a,!,Z,:=,0,N,:=",
    "sign": false,
    "id": 0,
    "addr": 0,
    "bytes": "ceed",
    "size": 2,
    "type": "add",
    "esilcost": 0,
    "cycles": 8,
    "failcycles": 0,
    "delay": 0,
    "stackptr": 0,
    "family": "cpu"
  }
]
EOF
RUN


NAME=araoar
FILE=bins/mach0/mac-ls4
ARGS=-a arm -b 64
CMDS=<<EOF
ar PC=entry0
ar~^pc
ao @ 0x100003ba0~type
ar~^pc
EOF
EXPECT=<<EOF
pc = 0x100003a90
type: jmp
pc = 0x100003a90
EOF
RUN
