NAME=hbc disasm basic instructions (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
pd 3
EOF
EXPECT=<<EOF
            ;-- entry0:
            ;-- global_0x000000b0:
            0x100000b0      73000100       load_const_string r0, 0xa2  ; yes.js:1:1 ; str.print_123__
                                                                       ; 0x100000a2 ; "print(123);"
            0x100000b4      5e000000       direct_eval r0, r0, 0       ; yes.js:1:5
            0x100000b8      5c00           ret r0
EOF
RUN

NAME=hbc disasm basic instructions (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
pd 3 @ 0xb0
EOF
EXPECT=<<EOF
            0x000000b0      73000100       load_const_string r0, 0xa2  ; str.print_123__
                                                                       ; 0x100000a2
            0x000000b4      5e000000       direct_eval r0, r0, 0
            0x000000b8      5c00           ret r0
EOF
RUN

NAME=hbc file info arch
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
i~arch
EOF
EXPECT=<<EOF
arch     hbc
EOF
RUN

NAME=hbc file info type
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
i~type
EOF
EXPECT=<<EOF
type     Hermes bytecode
bintype  hermes
EOF
RUN

NAME=hbc file info cpu version
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
i~cpu
EOF
EXPECT=<<EOF
cpu      v96
EOF
RUN

NAME=hbc symbols list (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
is~FUNC
EOF
EXPECT=<<EOF
0   0x000000b0 0x100000b0 NONE FUNC 10       global_0x000000b0
EOF
RUN

NAME=hbc symbols list (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
is~FUNC
EOF
EXPECT=<<EOF
0   0x000000b0 0x000000b0 NONE FUNC 10       global_0x000000b0
EOF
RUN

NAME=hbc function signature metadata
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
isj~{[0].arg_count}
isj~{[0].cc_arg_count}
isj~{[0].ret_count}
EOF
EXPECT=<<EOF
0
1
1
EOF
RUN

NAME=hbc register profile has no fake ABI roles
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
drpj~{alias_info}
EOF
EXPECT=<<EOF
[{"role":0,"role_str":"PC","reg":"pc"}]
EOF
RUN

NAME=hbc LoadParam ESIL uses a frame slot instead of a fake register
FILE=bins/hbc/index.android.bundle
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
aoj 1 @ 0x1003e3f7~{[0].esil}
EOF
EXPECT=<<EOF
1,HBC_LOAD_PARAM,r8,=
EOF
RUN

NAME=hbc equality branch ESIL materializes the zero comparison
FILE=bins/hbc/index.android.bundle
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
aoj 1 @ 0x1003e5fc~{[0].esil}
EOF
EXPECT=<<EOF
r1,r3,==,$z,!,?{,0x1003e637,pc,=,}
EOF
RUN

NAME=hbc SwitchImm analysis exposes jump table metadata
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
af @ 0x1004d09a
agfj @ 0x1004d09a~{[0].blocks[0].switchop}
EOF
EXPECT=<<EOF
{"addr":268751010,"defval":268751197,"maxval":27,"minval":0,"daddr":268751204,"dsize":4,"amount":28,"cases":[{"addr":268751204,"value":0,"jump":268751078},{"addr":268751208,"value":1,"jump":268751028},{"addr":268751212,"value":2,"jump":268751078},{"addr":268751224,"value":5,"jump":268751172},{"addr":268751248,"value":11,"jump":268751050},{"addr":268751256,"value":13,"jump":268751124},{"addr":268751264,"value":15,"jump":268751078},{"addr":268751268,"value":16,"jump":268751148},{"addr":268751280,"value":19,"jump":268751100},{"addr":268751308,"value":26,"jump":268751172},{"addr":268751312,"value":27,"jump":268751172}]}
EOF
RUN

NAME=hbc exception handlers are exposed through bin metadata
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
iw*~try.0
EOF
EXPECT=<<EOF
f try.0.1003e6dc.from=0x1003e703
f try.0.1003e6dc.to=0x1003e713
f try.0.1003e6dc.catch=0x1003e715
EOF
RUN

NAME=hbc entry point (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
ie~program
EOF
EXPECT=<<EOF
0x000000b0 0x100000b0 ---------- ---------- program
EOF
RUN

NAME=hbc entry point (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
ie~program
EOF
EXPECT=<<EOF
0x000000b0 0x000000b0 ---------- ---------- program
EOF
RUN

NAME=hbc disasm ret instruction (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
s 0x100000b8
pd 1
EOF
EXPECT=<<EOF
            0x100000b8      5c00           ret r0
EOF
RUN

NAME=hbc disasm ret instruction (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
s 0xb8
pd 1
EOF
EXPECT=<<EOF
            0x000000b8      5c00           ret r0
EOF
RUN

NAME=hbc disasm load_const_string (va)
ARGS=-e asm.sub.varmin=16
FILE=bins/hbc/bespoke_eval.hbc
CMDS=<<EOF
s 0x100000b0
pd 1
EOF
EXPECT=<<EOF
            ;-- entry0:
            ;-- global_0x000000b0:
            0x100000b0      73000100       load_const_string r0, 0xa2  ; yes.js:1:1 ; str.print_123__
                                                                       ; 0x100000a2 ; "print(123);"
EOF
RUN

NAME=hbc disasm load_const_string (no va)
ARGS=-e asm.sub.varmin=16 -e io.va=false
FILE=bins/hbc/bespoke_eval.hbc
CMDS=<<EOF
s 0xb0
pd 1
EOF
EXPECT=<<EOF
            0x000000b0      73000100       load_const_string r0, 0xa2  ; str.print_123__
                                                                       ; 0x100000a2
EOF
RUN

NAME=hbc disasm direct_eval (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
s 0x100000b4
pd 1
EOF
EXPECT=<<EOF
            0x100000b4      5e000000       direct_eval r0, r0, 0       ; yes.js:1:5
EOF
RUN

NAME=hbc disasm direct_eval (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
s 0xb4
pd 1
EOF
EXPECT=<<EOF
            0x000000b4      5e000000       direct_eval r0, r0, 0
EOF
RUN

NAME=hbc structured operands
FILE=bins/hbc/bespoke_eval.hbc
CMDS=<<EOF
aoj 3 @ entry0~{0.opex}
aoj 3 @ entry0~{1.opex}
aoj 3 @ entry0~{2.opex}
EOF
EXPECT=<<EOF
{"operands":[{"type":"reg","value":"r0"},{"type":"imm","value":1,"kind":"string_id","address":268435618,"byte_length":11}]}
{"operands":[{"type":"reg","value":"r0"},{"type":"reg","value":"r0"},{"type":"imm","value":0}]}
{"operands":[{"type":"reg","value":"r0"}]}
EOF
RUN

NAME=hbc structured empty string length
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
aoj 1 @ 0x1003e45b~{0.opex}
EOF
EXPECT=<<EOF
{"operands":[{"type":"reg","value":"r9"},{"type":"imm","value":2976,"kind":"string_id","address":268560336,"byte_length":0}]}
EOF
RUN

NAME=hbc structured function operand
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
aoj 1 @ 0x1003a3bb~{0.opex}
EOF
EXPECT=<<EOF
{"operands":[{"type":"reg","value":"r1"},{"type":"reg","value":"r3"},{"type":"imm","value":1,"kind":"function_id","address":268690421}]}
EOF
RUN

NAME=hbc implicit call frame operands
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
aoj 1 @ 0x100895ac~{0.opex}
EOF
EXPECT=<<EOF
{"operands":[{"type":"reg","value":"r1"},{"type":"reg","value":"r5"},{"type":"imm","value":5},{"type":"reg","value":"r10","implicit":true,"kind":"call_this"},{"type":"reg","value":"r9","implicit":true,"kind":"call_arg","index":0},{"type":"reg","value":"r8","implicit":true,"kind":"call_arg","index":1},{"type":"reg","value":"r7","implicit":true,"kind":"call_arg","index":2},{"type":"reg","value":"r6","implicit":true,"kind":"call_arg","index":3}]}
EOF
RUN

NAME=hbc sections (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
iS~hermes
EOF
EXPECT=<<EOF
0   0x00000000  0x124 0x10000000  0x124 -r-x 0x0   ---- hermes_bytecode
EOF
RUN

NAME=hbc sections (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
iS~hermes
EOF
EXPECT=<<EOF
0   0x00000000  0x124 0x00000000  0x124 -r-x 0x0   ---- hermes_bytecode
EOF
RUN

NAME=hbc seek and disasm (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
s entry0
pd 2
EOF
EXPECT=<<EOF
            ;-- entry0:
            ;-- global_0x000000b0:
            0x100000b0      73000100       load_const_string r0, 0xa2  ; yes.js:1:1 ; str.print_123__
                                                                       ; 0x100000a2 ; "print(123);"
            0x100000b4      5e000000       direct_eval r0, r0, 0       ; yes.js:1:5
EOF
RUN

NAME=hbc print hex bytes (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
s 0x100000b0
-e hex.header=true
px 10
EOF
EXPECT=<<EOF
- offset -  B0B1 B2B3 B4B5 B6B7 B8B9 BABB BCBD BEBF  0123456789ABCDEF
0x100000b0  7300 0100 5e00 0000 5c00                 s...^...\.
EOF
RUN

NAME=hbc print hex bytes (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
s 0xb0
-e hex.header=true
px 10
EOF
EXPECT=<<EOF
- offset -  B0B1 B2B3 B4B5 B6B7 B8B9 BABB BCBD BEBF  0123456789ABCDEF
0x000000b0  7300 0100 5e00 0000 5c00                 s...^...\.
EOF
RUN

NAME=hbc unreachable padding (va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
s 0x100000ba
pd 2
EOF
EXPECT=<<EOF
            0x100000ba      00             unreachable
            0x100000bb      00             unreachable
EOF
RUN

NAME=hbc unreachable padding (no va)
FILE=bins/hbc/bespoke_eval.hbc
ARGS=-e asm.sub.varmin=16 -e io.va=false
CMDS=<<EOF
s 0xba
pd 2
EOF
EXPECT=<<EOF
            0x000000ba      00             unreachable
            0x000000bb      00             unreachable
EOF
RUN

NAME=hbc large file symbols count
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
is~FUNC~?
EOF
EXPECT=<<EOF
5388
EOF
RUN

NAME=hbc imports js require
FILE=bins/hbc/index.android.bundle
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
ii~js.__r
ii~?
EOF
EXPECT=<<EOF
3048 0x00000000 NONE FUNC react-native js.__r
58
EOF
RUN

NAME=hbc imports native module
FILE=bins/hbc/index.android.bundle
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
ii~native.NativeModules
EOF
EXPECT=<<EOF
3894 0x00000000 NONE FUNC react-native native.NativeModules
EOF
RUN

NAME=hbc exports module symbol
FILE=bins/hbc/index.android.bundle
ARGS=-e asm.sub.varmin=16
CMDS=<<EOF
iE~hbc.export.module.RN$AppRegistry
iE~?
EOF
EXPECT=<<EOF
3630 0x00071961 0x10071961 GLOBAL OBJ  1        hbc.export.module.RN$AppRegistry
451
EOF
RUN

NAME=hbc get_global_object instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e510
pd 1
EOF
EXPECT=<<EOF
            ;-- clear_0x0003e510:
            0x1003e510      3000           get_global_object r0
EOF
RUN

NAME=hbc get_global_object instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e510
pd 1
EOF
EXPECT=<<EOF
            0x0003e510      3000           get_global_object r0
EOF
RUN

NAME=hbc try_get_by_id instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e512
ao~mnemonic
EOF
EXPECT=<<EOF
mnemonic: try_get_by_id
EOF
RUN

NAME=hbc try_get_by_id instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e512
ao~mnemonic
EOF
EXPECT=<<EOF
mnemonic: try_get_by_id
EOF
RUN

NAME=hbc get_by_id_short instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e518
ao~mnemonic
EOF
EXPECT=<<EOF
mnemonic: get_by_id_short
EOF
RUN

NAME=hbc get_by_id_short instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e518
ao~mnemonic
EOF
EXPECT=<<EOF
mnemonic: get_by_id_short
EOF
RUN

NAME=hbc create_this instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e51d
pd 1
EOF
EXPECT=<<EOF
            0x1003e51d      6a010100       create_this r1, r1, r0
EOF
RUN

NAME=hbc create_this instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e51d
pd 1
EOF
EXPECT=<<EOF
            0x0003e51d      6a010100       create_this r1, r1, r0
EOF
RUN

NAME=hbc mov instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e521
pd 1
EOF
EXPECT=<<EOF
            0x1003e521      080201         mov r2, r1
EOF
RUN

NAME=hbc mov instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e521
pd 1
EOF
EXPECT=<<EOF
            0x0003e521      080201         mov r2, r1
EOF
RUN

NAME=hbc construct instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e524
pd 1
EOF
EXPECT=<<EOF
            0x1003e524      50000001       construct r0, r0, 1
EOF
RUN

NAME=hbc construct instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e524
pd 1
EOF
EXPECT=<<EOF
            0x0003e524      50000001       construct r0, r0, 1
EOF
RUN

NAME=hbc select_object instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e528
pd 1
EOF
EXPECT=<<EOF
            0x1003e528      6b000100       select_object r0, r1, r0
EOF
RUN

NAME=hbc select_object instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e528
pd 1
EOF
EXPECT=<<EOF
            0x0003e528      6b000100       select_object r0, r1, r0
EOF
RUN

NAME=hbc get_environment instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e52c
pd 1
EOF
EXPECT=<<EOF
            0x1003e52c      290100         get_environment r1, 0
EOF
RUN

NAME=hbc get_environment instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e52c
pd 1
EOF
EXPECT=<<EOF
            0x0003e52c      290100         get_environment r1, 0
EOF
RUN

NAME=hbc store_to_environment instruction (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e52f
pd 1
EOF
EXPECT=<<EOF
            0x1003e52f      2a010100       store_to_environment r1, 1, r0
EOF
RUN

NAME=hbc store_to_environment instruction (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e52f
pd 1
EOF
EXPECT=<<EOF
            0x0003e52f      2a010100       store_to_environment r1, 1, r0
EOF
RUN

NAME=hbc complete function disasm (va)
FILE=bins/hbc/index.android.bundle
CMDS=<<EOF
s 0x1003e510
pd 3~get_global
pd 1 @ 0x1003e51d~create_this
pd 1 @ 0x1003e533~ret
EOF
EXPECT=<<EOF
            0x1003e510      3000           get_global_object r0
            0x1003e51d      6a010100       create_this r1, r1, r0
            0x1003e533      5c00           ret r0
EOF
RUN

NAME=hbc complete function disasm (no va)
FILE=bins/hbc/index.android.bundle
ARGS=-e io.va=false
CMDS=<<EOF
s 0x3e510
pd 3~get_global
pd 1 @ 0x3e51d~create_this
pd 1 @ 0x3e533~ret
EOF
EXPECT=<<EOF
            0x0003e510      3000           get_global_object r0
            0x0003e51d      6a010100       create_this r1, r1, r0
            0x0003e533      5c00           ret r0
EOF
RUN

NAME=hbc pa ret
FILE=--
CMDS=<<EOF
-a hbc
pa ret r0
EOF
EXPECT=<<EOF
5c00
EOF
RUN

NAME=hbc pa get_global_object
FILE=--
CMDS=<<EOF
-a hbc
pa get_global_object r0
EOF
EXPECT=<<EOF
3000
EOF
RUN

NAME=hbc pa mov two regs
FILE=--
CMDS=<<EOF
-a hbc
pa mov r2, r1
EOF
EXPECT=<<EOF
080201
EOF
RUN

NAME=hbc pa construct three operands
FILE=--
CMDS=<<EOF
-a hbc
pa construct r0, r0, 1
EOF
EXPECT=<<EOF
50000001
EOF
RUN

NAME=hbc pa select_object three regs
FILE=--
CMDS=<<EOF
-a hbc
pa select_object r0, r1, r0
EOF
EXPECT=<<EOF
6b000100
EOF
RUN

NAME=hbc pa store_to_environment
FILE=--
CMDS=<<EOF
-a hbc
pa store_to_environment r1, 1, r0
EOF
EXPECT=<<EOF
2a010100
EOF
RUN

NAME=hbc pa rejects extra operand
FILE=--
CMDS=<<EOF
-a hbc
"pa ret r0, r1"
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pa rejects multiple extra operands
FILE=--
CMDS=<<EOF
-a hbc
"pa ret r0, r1, r2"
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pa rejects extra operand on zero-arg instr
FILE=--
CMDS=<<EOF
-a hbc
"pa get_global_object r0, r1"
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pa rejects missing operand
FILE=--
CMDS=<<EOF
-a hbc
pa ret
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pa rejects truncated mov
FILE=--
CMDS=<<EOF
-a hbc
pa mov r2
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pa rejects unknown mnemonic
FILE=--
CMDS=<<EOF
-a hbc
pa bogus_op r0
EOF
EXPECT=<<EOF
EOF
RUN

NAME=hbc pad ret
FILE=--
CMDS=<<EOF
-a hbc
pad 5c00
EOF
EXPECT=<<EOF
ret r0
EOF
RUN

NAME=hbc pad get_global_object
FILE=--
CMDS=<<EOF
-a hbc
pad 3000
EOF
EXPECT=<<EOF
get_global_object r0
EOF
RUN

NAME=hbc pad mov
FILE=--
CMDS=<<EOF
-a hbc
pad 080201
EOF
EXPECT=<<EOF
mov r2, r1
EOF
RUN

NAME=hbc pad respects asm.cpu v99
FILE=--
CMDS=<<EOF
-a hbc
e asm.cpu=v99
pad 010203040506
EOF
EXPECT=<<EOF
new_object_with_buffer r2, 1027, 1541
EOF
RUN

NAME=hbc pa respects asm.cpu v99
FILE=--
CMDS=<<EOF
-a hbc
e asm.cpu=v99
pa new_object_with_buffer r2, 1027, 1541
EOF
EXPECT=<<EOF
010203040506
EOF
RUN

NAME=hbc pad construct
FILE=--
CMDS=<<EOF
-a hbc
pad 50000001
EOF
EXPECT=<<EOF
construct r0, r0, 1
EOF
RUN

NAME=hbc pad select_object
FILE=--
CMDS=<<EOF
-a hbc
pad 6b000100
EOF
EXPECT=<<EOF
select_object r0, r1, r0
EOF
RUN

NAME=hbc pad store_to_environment
FILE=--
CMDS=<<EOF
-a hbc
pad 2a010100
EOF
EXPECT=<<EOF
store_to_environment r1, 1, r0
EOF
RUN

NAME=hbc pa+pad roundtrip ret
FILE=--
CMDS=<<EOF
-a hbc
pad `pa ret r0`
EOF
EXPECT=<<EOF
ret r0
EOF
RUN

NAME=hbc pa+pad roundtrip mov
FILE=--
CMDS=<<EOF
-a hbc
pad `pa mov r2, r1`
EOF
EXPECT=<<EOF
mov r2, r1
EOF
RUN

NAME=hbc pa+pad roundtrip construct
FILE=--
CMDS=<<EOF
-a hbc
pad `pa construct r0, r0, 1`
EOF
EXPECT=<<EOF
construct r0, r0, 1
EOF
RUN

NAME=hbc pi ret after wx
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx 5c00
pi 1
EOF
EXPECT=<<EOF
ret r0
EOF
RUN

NAME=hbc pi mov after wx
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx 080201
pi 1
EOF
EXPECT=<<EOF
mov r2, r1
EOF
RUN

NAME=hbc pi construct after wx
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx 50000001
pi 1
EOF
EXPECT=<<EOF
construct r0, r0, 1
EOF
RUN

NAME=hbc pa+wx+pi roundtrip ret
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx `pa ret r0`
pi 1
EOF
EXPECT=<<EOF
ret r0
EOF
RUN

NAME=hbc pa+wx+pi roundtrip mov
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx `pa mov r2, r1`
pi 1
EOF
EXPECT=<<EOF
mov r2, r1
EOF
RUN

NAME=hbc pa+wx+pi roundtrip store_to_environment
FILE=malloc://16
CMDS=<<EOF
-a hbc
wx `pa store_to_environment r1, 1, r0`
pi 1
EOF
EXPECT=<<EOF
store_to_environment r1, 1, r0
EOF
RUN
