# This is the authoritative list of MoarVM instructions.
#
# Changes to this file need to be followed by a call to
# tools/update_ops.raku to update various auto-generated files.
#
# IMPORTANT NOTE: MoarVM is meant to be able to read bytecode files
# from some number of versions back. This means that new ops should,
# in general, always be added *at the end* of this file (but before
# spesh ops), so they get new numbers. Similarly, do not remove an
# op; rename it DEPRECATED_n (where n is unique for each one).
# Otherwise the numbering of those after it will be broken. The
# alternative is writing a bunch of very boring mapping code and
# rendering old bytecode impossible to simply run from the mmap'd file.
#
# The exception to this rule is the spesh ops, which must come at the
# very end of the file, and since they are never emitted into bytecode
# files (the specializer inserts them) can be renumbered any time.
#
# Each entry specifies an opname, an optional annotation used by the
# bytecode validator as well as the op arguments:
#
#   [opname]  [annotation?]  [args...]
#
# A basic annotation is a single char prefixed by '.', eg '.r'
# for return ops.
#
# Using a ':' marks the beginning of an op sequence that is followed
# by several '.' annoted ops, eg ':j' for a jumplist that is followed
# by '.j' annotated goto ops.
#
# A number of adverbs may follow an operation:
# * :pure means that the op has no side-effects and so can safely be
#   thrown away if the result is unused
# * :logged means type or value logging for specialization happens at this
#   op
# * :deoptonepoint means that we may deoptimize (fall back to slow-path code)
#   after this instruction, but just locally within the current frame
# * :predeoptonepoint means that we may deoptimize (fall back to slow-path
#   code) before this instruction, but just locally within the current frame
# * :deoptallpoint means that we may globally deoptimize (this goes only on an
#   invoke or dispatch; the callsite address will be rewritten)
# * :maycausedeopt means that the execution of this instruction might lead to a
#   (local or global) deoptimization; used by the optimizer to make sure it
#   does not delete instructions whose results are needed the other side of a
#   deopt
# * :noinline means it is never safe to inline this op
# * :invokish means the op may invoke (used by the JIT)
# * :throwish means the op may throw (used by the JIT)
# * :useshll means that the op uses per-HLL config
# * :specializable means that the op is possible to optimize through type
#   specialization (a frame that has no such ops will only ever get a certain
#   specialization)
# * :cache means that it uses the inline caching mechanism

no_op               :confprog
const_i8            w(int8) int8 :pure
const_i16           w(int16) int16 :pure
const_i32           w(int32) int32 :pure
const_i64           w(int64) int64 :pure :confprog
const_n32           w(num32) num32 :pure
const_n64           w(num64) num64 :pure :confprog
const_s             w(str) str :pure :confprog
set                 w(`1) r(`1) :pure :confprog
extend_u8           w(uint64) r(uint8) :pure
extend_u16          w(uint64) r(uint16) :pure
extend_u32          w(uint64) r(uint32) :pure
extend_i8           w(int64) r(int8) :pure
extend_i16          w(int64) r(int16) :pure
extend_i32          w(int64) r(int32) :pure
trunc_u8            w(uint8) r(uint64) :pure
trunc_u16           w(uint16) r(uint64) :pure
trunc_u32           w(uint32) r(uint64) :pure
trunc_i8            w(int8) r(int64) :pure
trunc_i16           w(int16) r(int64) :pure
trunc_i32           w(int32) r(int64) :pure
extend_n32          w(num64) r(num32) :pure
trunc_n32           w(num32) r(num64) :pure
goto             .j ins :confprog
if_i                r(int64) ins :confprog
unless_i            r(int64) ins :confprog
if_n                r(num64) ins
unless_n            r(num64) ins
if_s                r(str) ins
unless_s            r(str) ins
if_s0               r(str) ins
unless_s0           r(str) ins
eq_u                w(int64) r(uint64) r(uint64) :pure :confprog
ne_u                w(int64) r(uint64) r(uint64) :pure :confprog
jumplist         :j int64 r(int64)
getlex              w(`1) rl(`1) :pure :deoptonepoint :logged
bindlex             wl(`1) r(`1)
getlex_ni           w(int64) str :pure :noinline
getlex_nn           w(num64) str :pure :noinline
getlex_ns           w(str) str :pure :noinline
getlex_no           w(obj) str :pure :deoptonepoint :logged :noinline
bindlex_ni          str r(int64) :noinline
bindlex_nn          str r(num64) :noinline
bindlex_ns          str r(str) :noinline
bindlex_no          str r(obj) :noinline
getlex_ng           w(obj) r(str) :pure :noinline :useshll
bindlex_ng          r(str) r(obj) :noinline :useshll
getdynlex           w(obj) r(str) :pure :noinline :useshll
binddynlex          r(str) r(obj) :noinline
setlexvalue         r(obj) str r(obj) int16
lexprimspec         w(int64) r(obj) r(str) :pure
return_i         .r r(int64) :useshll
return_n         .r r(num64) :useshll
return_s         .r r(str) :useshll
return_o         .r r(obj)
return           .r
eq_i                w(int64) r(int64) r(int64) :pure :confprog
ne_i                w(int64) r(int64) r(int64) :pure :confprog
lt_i                w(int64) r(int64) r(int64) :pure :confprog
le_i                w(int64) r(int64) r(int64) :pure :confprog
gt_i                w(int64) r(int64) r(int64) :pure :confprog
ge_i                w(int64) r(int64) r(int64) :pure :confprog
cmp_i               w(int64) r(int64) r(int64) :pure :confprog
add_i               w(int64) r(int64) r(int64) :pure :confprog
sub_i               w(int64) r(int64) r(int64) :pure :confprog
mul_i               w(int64) r(int64) r(int64) :pure :confprog
div_i               w(int64) r(int64) r(int64) :pure :confprog
div_u               w(uint64) r(uint64) r(uint64) :pure :confprog
mod_i               w(int64) r(int64) r(int64) :pure :confprog
mod_u               w(uint64) r(uint64) r(uint64) :pure :confprog
neg_i               w(int64) r(int64) :pure :confprog
abs_i               w(int64) r(int64) :pure :confprog
inc_i               w(int64)
inc_u               w(uint64)
dec_i               w(int64)
dec_u               w(uint64)
band_i              w(int64) r(int64) r(int64) :pure :confprog
bor_i               w(int64) r(int64) r(int64) :pure :confprog
bxor_i              w(int64) r(int64) r(int64) :pure :confprog
bnot_i              w(int64) r(int64) :pure :confprog
blshift_i           w(int64) r(int64) r(int64) :pure :confprog
brshift_i           w(int64) r(int64) r(int64) :pure :confprog
pow_i               w(int64) r(int64) r(int64) :pure
not_i               w(int64) r(int64) :pure :confprog
gcd_i               w(int64) r(int64) r(int64) :pure
lcm_i               w(int64) r(int64) r(int64) :pure
eq_n                w(int64) r(num64) r(num64) :pure :confprog
ne_n                w(int64) r(num64) r(num64) :pure :confprog
lt_n                w(int64) r(num64) r(num64) :pure :confprog
le_n                w(int64) r(num64) r(num64) :pure :confprog
gt_n                w(int64) r(num64) r(num64) :pure :confprog
ge_n                w(int64) r(num64) r(num64) :pure :confprog
cmp_n               w(int64) r(num64) r(num64) :pure :confprog
add_n               w(num64) r(num64) r(num64) :pure :confprog
sub_n               w(num64) r(num64) r(num64) :pure :confprog
mul_n               w(num64) r(num64) r(num64) :pure :confprog
div_n               w(num64) r(num64) r(num64) :pure :confprog
mod_n               w(num64) r(num64) r(num64) :pure :confprog
neg_n               w(num64) r(num64) :pure :confprog
abs_n               w(num64) r(num64) :pure :confprog
pow_n               w(num64) r(num64) r(num64) :pure
ceil_n              w(num64) r(num64) :pure :confprog
floor_n             w(num64) r(num64) :pure :confprog
sin_n               w(num64) r(num64) :pure
asin_n              w(num64) r(num64) :pure
cos_n               w(num64) r(num64) :pure
acos_n              w(num64) r(num64) :pure
tan_n               w(num64) r(num64) :pure
atan_n              w(num64) r(num64) :pure
atan2_n             w(num64) r(num64) r(num64) :pure
le_u                w(int64) r(uint64) r(uint64) :pure :confprog
lt_u                w(int64) r(uint64) r(uint64) :pure :confprog
sinh_n              w(num64) r(num64) :pure
cosh_n              w(num64) r(num64) :pure
tanh_n              w(num64) r(num64) :pure
ge_u                w(int64) r(uint64) r(uint64) :pure :confprog
sqrt_n              w(num64) r(num64) :pure
log_n               w(num64) r(num64) :pure :confprog
exp_n               w(num64) r(num64) :pure
coerce_in           w(num64) r(int64) :pure :confprog
coerce_ni           w(int64) r(num64) :pure :confprog
coerce_is           w(str) r(int64) :pure :confprog
coerce_ns           w(str) r(num64) :pure :confprog
coerce_si           w(int64) r(str) :pure :confprog
coerce_sn           w(num64) r(str) :pure :confprog
gt_u                w(int64) r(uint64) r(uint64) :pure :confprog
cmp_u               w(int64) r(uint64) r(uint64) :pure :confprog
DEPRECATED_99    +a callsite :predeoptonepoint
DEPRECATED_100   *a int16 r(int64)
DEPRECATED_101   *a int16 r(num64)
DEPRECATED_102   *a int16 r(str)
DEPRECATED_103   *a int16 r(obj)
DEPRECATED_104   *a int16 int64
DEPRECATED_105   *a int16 num64
DEPRECATED_106   *a int16 str
DEPRECATED_70    -a r(obj)
DEPRECATED_71    -a w(int64) r(obj)
DEPRECATED_72    -a w(num64) r(obj)
DEPRECATED_73    -a w(str) r(obj)
DEPRECATED_74    -a w(obj) r(obj)
checkarity          int16 int16
param_rp_i       .p w(int64) int16 :pure :noinline
param_rp_n       .p w(num64) int16 :pure :noinline
param_rp_s       .p w(str) int16 :pure :noinline
param_rp_o       .p w(obj) int16 :pure :noinline :useshll
param_op_i       .p w(int64) int16 ins :pure :noinline
param_op_n       .p w(num64) int16 ins :pure :noinline
param_op_s       .p w(str) int16 ins :pure :noinline
param_op_o       .p w(obj) int16 ins :pure :noinline :useshll
param_rn_i          w(int64) str :noinline
param_rn_n          w(num64) str :noinline
param_rn_s          w(str) str :noinline
param_rn_o          w(obj) str :noinline :useshll
param_on_i          w(int64) str ins :noinline
param_on_n          w(num64) str ins :noinline
param_on_s          w(str) str ins :noinline
param_on_o          w(obj) str ins :noinline :useshll
param_sp         .p w(obj) int16 :pure :noinline :useshll
param_sn            w(obj) :noinline :useshll
getcode             w(obj) coderef :pure
caller              w(obj) r(int64) :pure :noinline
capturelex          r(obj) :noinline
takeclosure         w(obj) r(obj) :noinline
exception           w(obj)
bindexmessage       r(obj) r(str)
bindexpayload       r(obj) r(obj)
bindexcategory      r(obj) r(int64)
getexmessage        w(str) r(obj) :pure
getexpayload        w(obj) r(obj) :pure
getexcategory       w(int64) r(obj) :pure
throwdyn            w(obj) r(obj) :throwish
throwlex            w(obj) r(obj) :throwish
throwlexotic        w(obj) r(obj) :throwish
throwcatdyn         w(obj) int64 :throwish
throwcatlex         w(obj) int64 :throwish
throwcatlexotic     w(obj) int64 :throwish
die                 w(obj) r(str) :throwish
rethrow             r(obj) :throwish
resume              r(obj) :throwish
takehandlerresult   w(obj)
DEPRECATED_33       w(obj) ins
DEPRECATED_34       w(obj) r(obj)
backtracestrings    w(obj) r(obj) :pure
usecapture          w(obj) :noinline
savecapture         w(obj) :noinline
captureposelems     w(int64) r(obj) :pure
captureposarg       w(obj) r(obj) r(int64) :pure :useshll
captureposarg_i     w(int64) r(obj) r(int64) :pure
captureposarg_n     w(num64) r(obj) r(int64) :pure
captureposarg_s     w(str) r(obj) r(int64) :pure
captureposprimspec  w(int64) r(obj) r(int64) :pure
captureexistsnamed  w(int64) r(obj) r(str) :pure
capturehasnameds    w(int64) r(obj) :pure :useshll
DEPRECATED_69       w(obj) r(obj) r(obj)
DEPRECATED_60       w(obj) r(obj) r(obj) r(obj)
DEPRECATED_61       w(obj) r(obj) r(obj)
null_s              w(str) :pure :confprog
isnull_s            w(int64) r(str) :pure :confprog
eq_s                w(int64) r(str) r(str) :pure :confprog
ne_s                w(int64) r(str) r(str) :pure :confprog
gt_s                w(int64) r(str) r(str) :pure :confprog
ge_s                w(int64) r(str) r(str) :pure :confprog
lt_s                w(int64) r(str) r(str) :pure :confprog
le_s                w(int64) r(str) r(str) :pure :confprog
cmp_s               w(int64) r(str) r(str) :pure :confprog
eqat_s              w(int64) r(str) r(str) r(int64) :pure :confprog
eqatic_s            w(int64) r(str) r(str) r(int64) :pure :confprog
haveat_s            w(int64) r(str) r(int64) r(int64) r(str) r(int64) :pure :confprog
concat_s            w(str) r(str) r(str) :pure :confprog
repeat_s            w(str) r(str) r(int64) :pure :confprog
substr_s            w(str) r(str) r(int64) r(int64) :pure :confprog
index_s             w(int64) r(str) r(str) r(int64) :pure :confprog
DEPRECATED_40       w(int64) r(str) :pure
codes_s             w(int64) r(str) :pure :confprog
getcp_s             w(int64) r(str) r(int64) :pure :confprog
indexcp_s           w(int64) r(str) r(int64) :pure :confprog
uc                  w(str) r(str) :pure :confprog
lc                  w(str) r(str) :pure :confprog
tc                  w(str) r(str) :pure :confprog
split               w(obj) r(str) r(str) :pure
join                w(str) r(str) r(obj) :pure
getcpbyname         w(int64) r(str) :pure
indexat             r(str) r(int64) str ins
indexnat            r(str) r(int64) str ins
unipropcode         w(int64) r(str) :pure
unipvalcode         w(int64) r(int64) r(str) :pure
hasuniprop          w(int64) r(str) r(int64) r(int64) r(int64) :pure
hasunipropc         w(int64) r(str) r(int64) int16 int16 :pure
chars               w(int64) r(str) :pure :confprog
chr                 w(str) r(int64) :pure :confprog
ordfirst            w(int64) r(str) :pure :confprog
ordat               w(int64) r(str) r(int64) :pure :confprog
rindexfrom          w(int64) r(str) r(str) r(int64) :pure :confprog
escape              w(str) r(str) :pure
flip                w(str) r(str) :pure
setbuffersize_fh    r(obj) r(int64)
iscclass            w(int64) r(int64) r(str) r(int64) :pure
findcclass          w(int64) r(int64) r(str) r(int64) r(int64) :pure
findnotcclass       w(int64) r(int64) r(str) r(int64) r(int64) :pure
nfafromstatelist    w(obj) r(obj) r(obj)
nfarunproto         w(obj) r(obj) r(str) r(int64)
nfarunalt           r(obj) r(str) r(int64) r(obj) r(obj) r(obj)
radix               w(obj) r(int64) r(str) r(int64) r(int64) :pure :useshll
encode              w(obj) r(str) r(str) r(obj)
decode              w(str) r(obj) r(str)
istrue_s            w(int64) r(str) :pure
isfalse_s           w(int64) r(str) :pure
null                w(obj) :pure
isnull              w(int64) r(obj) :pure :specializable :confprog
ifnonnull           r(obj) ins :specializable
DEPRECATED_75       w(obj) r(obj) str
DEPRECATED_76       w(obj) r(obj) r(str)
DEPRECATED_77       w(int64) r(obj) str
DEPRECATED_78       w(int64) r(obj) r(str)
create              w(obj) r(obj) :pure :specializable
clone               w(obj) r(obj) :pure :specializable
isconcrete          w(int64) r(obj) :pure :specializable :confprog
rebless             w(obj) r(obj) r(obj) :deoptonepoint
istype              w(int64) r(obj) r(obj) :pure :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable :confprog
objprimspec         w(int64) r(obj) :pure :specializable :confprog
gethow              w(obj) r(obj) :pure
getwhat             w(obj) r(obj) :pure
getwho              w(obj) r(obj) :pure
setwho              w(obj) r(obj) r(obj)
reprname            w(str) r(obj) :pure :specializable :confprog
getwhere            w(int64) r(obj) :pure
eqaddr              w(int64) r(obj) r(obj) :pure :confprog
bindattr_i          r(obj) r(obj) str r(int64) int16 :specializable
bindattr_n          r(obj) r(obj) str r(num64) int16 :specializable
bindattr_s          r(obj) r(obj) str r(str) int16 :specializable
bindattr_o          r(obj) r(obj) str r(obj) int16 :specializable
bindattrs_i         r(obj) r(obj) r(str) r(int64) :specializable
bindattrs_n         r(obj) r(obj) r(str) r(num64) :specializable
bindattrs_s         r(obj) r(obj) r(str) r(str) :specializable
bindattrs_o         r(obj) r(obj) r(str) r(obj) :specializable
getattr_i           w(int64) r(obj) r(obj) str int16 :specializable
getattr_n           w(num64) r(obj) r(obj) str int16 :specializable
getattr_s           w(str) r(obj) r(obj) str int16 :specializable
getattr_o           w(obj) r(obj) r(obj) str int16 :deoptonepoint :logged :specializable :confprog
getattrs_i          w(int64) r(obj) r(obj) r(str) :specializable
getattrs_n          w(num64) r(obj) r(obj) r(str) :specializable
getattrs_s          w(str) r(obj) r(obj) r(str) :specializable
getattrs_o          w(obj) r(obj) r(obj) r(str) :deoptonepoint :logged :specializable
attrinited          w(int64) r(obj) r(obj) r(str) :specializable
box_i               w(obj) r(int64) r(obj) :pure :specializable
box_n               w(obj) r(num64) r(obj) :pure :specializable
box_s               w(obj) r(str) r(obj) :pure :specializable
unbox_i             w(int64) r(obj) :pure :specializable :confprog
unbox_n             w(num64) r(obj) :pure :specializable
unbox_s             w(str) r(obj) :pure :specializable :confprog
atpos_i             w(int64) r(obj) r(int64) :specializable :confprog
atpos_n             w(num64) r(obj) r(int64) :specializable
atpos_s             w(str) r(obj) r(int64) :specializable :confprog
atpos_o             w(obj) r(obj) r(int64) :specializable
bindpos_i           r(obj) r(int64) r(int64) :specializable
bindpos_n           r(obj) r(int64) r(num64) :specializable
bindpos_s           r(obj) r(int64) r(str) :specializable
bindpos_o           r(obj) r(int64) r(obj) :specializable
push_i              r(obj) r(int64) :specializable
push_n              r(obj) r(num64) :specializable
push_s              r(obj) r(str) :specializable
push_o              r(obj) r(obj) :specializable
pop_i               w(int64) r(obj) :specializable
pop_n               w(num64) r(obj) :specializable
pop_s               w(str) r(obj) :specializable
pop_o               w(obj) r(obj) :specializable
shift_i             w(int64) r(obj) :specializable
shift_n             w(num64) r(obj) :specializable
shift_s             w(str) r(obj) :specializable
shift_o             w(obj) r(obj) :specializable
unshift_i           r(obj) r(int64) :specializable
unshift_n           r(obj) r(num64) :specializable
unshift_s           r(obj) r(str) :specializable
unshift_o           r(obj) r(obj) :specializable
splice              r(obj) r(obj) r(int64) r(int64) :specializable
setelemspos         r(obj) r(int64) :specializable
existspos           w(int64) r(obj) r(int64) :pure :specializable :confprog
atkey_i             w(int64) r(obj) r(str) :specializable
atkey_n             w(num64) r(obj) r(str) :specializable
atkey_s             w(str) r(obj) r(str) :specializable
atkey_o             w(obj) r(obj) r(str) :specializable
bindkey_i           r(obj) r(str) r(int64) :specializable
bindkey_n           r(obj) r(str) r(num64) :specializable
bindkey_s           r(obj) r(str) r(str) :specializable
bindkey_o           r(obj) r(str) r(obj) :specializable
existskey           w(int64) r(obj) r(str) :pure :specializable :confprog
deletekey           r(obj) r(str) :specializable
elems               w(int64) r(obj) :pure :specializable :confprog
knowhow             w(obj) :pure
knowhowattr         w(obj) :pure
newtype             w(obj) r(obj) r(str)
composetype         w(obj) r(obj) r(obj)
DEPRECATED_83       r(obj) r(obj)
DEPRECATED_84       r(obj) r(int64)
settypecache        r(obj) r(obj)
settypecheckmode    r(obj) r(int64)
setboolspec         r(obj) r(int64) r(obj)
DEPRECATED_64       w(int64) r(obj)
DEPRECATED_65       w(int64) r(obj)
bootint             w(obj) :pure
bootnum             w(obj) :pure
bootstr             w(obj) :pure
bootarray           w(obj) :pure
bootintarray        w(obj) :pure
bootnumarray        w(obj) :pure
bootstrarray        w(obj) :pure
boothash            w(obj) :pure
isint               w(int64) r(obj) :pure :specializable :confprog
isnum               w(int64) r(obj) :pure :specializable :confprog
isstr               w(int64) r(obj) :pure :specializable :confprog
islist              w(int64) r(obj) :pure :specializable :confprog
ishash              w(int64) r(obj) :pure :specializable :confprog
sethllconfig        r(str) r(obj)
hllboxtype_i        w(obj) :pure
hllboxtype_n        w(obj) :pure
hllboxtype_s        w(obj) :pure
hlllist             w(obj) :pure
hllhash             w(obj) :pure
getcomp             w(obj) r(str) :pure
bindcomp            w(obj) r(str) r(obj)
getcurhllsym        w(obj) r(str) :pure :useshll
bindcurhllsym       w(obj) r(str) r(obj) :useshll
gethllsym           w(obj) r(str) r(str) :pure
bindhllsym          r(str) r(str) r(obj)
settypehll          r(obj) r(str)
settypehllrole      r(obj) r(int64)
DEPRECATED_95       w(obj) r(obj) :pure :invokish :useshll :maycausedeopt :specializable
DEPRECATED_96       w(obj) r(obj) r(str) :pure :invokish :maycausedeopt :specializable
usecompileehllconfig :useshll
usecompilerhllconfig :useshll
iter                w(obj) r(obj) :pure :useshll :specializable
iterkey_s           w(str) r(obj) :pure :specializable
iterval             w(obj) r(obj) :pure :specializable
getcodename         w(str) r(obj) :pure
iscoderef           w(int64) r(obj) :pure
getcodeobj          w(obj) r(obj) :pure
setcodeobj          r(obj) r(obj)
setcodename         r(obj) r(str)
forceouterctx       r(obj) r(obj)
DEPRECATED_97       r(obj) r(obj) r(str) r(obj)
DEPRECATED_98       w(int64) r(obj) :pure :specializable
freshcoderef        w(obj) r(obj)
markcodestatic      r(obj)
markcodestub        r(obj)
getstaticcode       w(obj) r(obj) :pure
getcodecuid         w(str) r(obj) :pure
DEPRECATED_90       r(obj)
DEPRECATED_91       w(obj)
assign              r(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
assignunchecked     r(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
iscont              w(int64) r(obj) :pure :specializable :confprog
decont              w(obj) r(obj) :pure :invokish :deoptonepoint :logged :maycausedeopt :specializable :deoptallpoint
setcontspec         r(obj) r(str) r(obj)
sha1                w(str) r(str) :pure
createsc            w(obj) r(str)
scsetobj            r(obj) r(int64) r(obj)
scsetcode           r(obj) r(int64) r(obj)
scgetobj            w(obj) r(obj) r(int64)
scgethandle         w(str) r(obj)
scgetobjidx         w(int64) r(obj) r(obj)
scsetdesc           r(obj) r(str)
scobjcount          w(int64) r(obj)
setobjsc            r(obj) r(obj)
getobjsc            w(obj) r(obj)
serialize           w(str) r(obj) r(obj)
deserialize         r(str) r(obj) r(obj) r(obj) r(obj)
wval                w(obj) int16 int16 :pure
wval_wide           w(obj) int16 int64 :pure
scwbdisable         w(int64)
scwbenable          w(int64)
pushcompsc          r(obj)
popcompsc           w(obj)
scgetdesc           w(str) r(obj)
loadbytecode        w(str) r(str) :invokish :maycausedeopt :noinline :deoptonepoint :deoptallpoint
newmixintype        w(obj) r(obj) r(str)
installconfprog     r(obj) r(obj) r(obj)
iscompunit          w(int64) r(obj) :pure
compunitmainline    w(obj) r(obj)
compunitcodes       w(obj) r(obj)
ctx                 w(obj) :pure :noinline
ctxouter            w(obj) r(obj) :pure
ctxcaller           w(obj) r(obj) :pure
ctxlexpad           w(obj) r(obj) :pure
curcode             w(obj) :pure
callercode          w(obj) :pure
add_I               w(obj) r(obj) r(obj) r(obj) :pure
sub_I               w(obj) r(obj) r(obj) r(obj) :pure
mul_I               w(obj) r(obj) r(obj) r(obj) :pure
div_I               w(obj) r(obj) r(obj) r(obj) :pure
mod_I               w(obj) r(obj) r(obj) r(obj) :pure
neg_I               w(obj) r(obj) r(obj) :pure
abs_I               w(obj) r(obj) r(obj) :pure
cmp_I               w(int64) r(obj) r(obj) :pure
eq_I                w(int64) r(obj) r(obj) :pure
ne_I                w(int64) r(obj) r(obj) :pure
lt_I                w(int64) r(obj) r(obj) :pure
le_I                w(int64) r(obj) r(obj) :pure
gt_I                w(int64) r(obj) r(obj) :pure
ge_I                w(int64) r(obj) r(obj) :pure
bor_I               w(obj) r(obj) r(obj) r(obj) :pure
bxor_I              w(obj) r(obj) r(obj) r(obj) :pure
band_I              w(obj) r(obj) r(obj) r(obj) :pure
bnot_I              w(obj) r(obj) r(obj) :pure
blshift_I           w(obj) r(obj) r(int64) r(obj) :pure
brshift_I           w(obj) r(obj) r(int64) r(obj) :pure
pow_I               w(obj) r(obj) r(obj) r(obj) r(obj) :pure
gcd_I               w(obj) r(obj) r(obj) r(obj) :pure
lcm_I               w(obj) r(obj) r(obj) r(obj) :pure
expmod_I            w(obj) r(obj) r(obj) r(obj) r(obj) :pure
isprime_I           w(int64) r(obj) :pure
rand_I              w(obj) r(obj) r(obj)
coerce_In           w(num64) r(obj) :pure
coerce_Is           w(str) r(obj) :pure
coerce_nI           w(obj) r(num64) r(obj) :pure
coerce_sI           w(obj) r(str) r(obj) :pure
isbig_I             w(int64) r(obj) :pure
bool_I              w(int64) r(obj) :pure
base_I              w(str) r(obj) r(int64) :pure
radix_I             w(obj) r(int64) r(str) r(int64) r(int64) r(obj) :pure :useshll
div_In              w(num64) r(obj) r(obj) :pure
copy_f              r(str) r(str)
append_f            r(str) r(str)
rename_f            r(str) r(str)
delete_f            r(str)
chmod_f             r(str) r(int64)
exists_f            w(int64) r(str)
mkdir               r(str) r(int64)
rmdir               r(str)
open_dir            w(obj) r(str)
read_dir            w(str) r(obj)
close_dir           r(obj)
open_fh             w(obj) r(str) r(str)
close_fh            r(obj)
dispatch_u       .d w(uint64) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
getattrsref_u       w(obj) r(obj) r(obj) r(str) :pure :useshll
DEPRECATED_28       r(str) r(str) r(str)
atposnd_u           w(uint64) r(obj) r(obj) :pure :specializable
seek_fh             r(obj) r(int64) r(int64)
lock_fh             w(int64) r(obj) r(int64)
unlock_fh           r(obj)
sync_fh             r(obj)
trunc_fh            r(obj) r(int64)
eof_fh              w(int64) r(obj)
getstdin            w(obj) :pure
getstdout           w(obj) :pure
getstderr           w(obj) :pure
connect_sk          r(obj) r(str) r(int64) r(uint16)
socket              w(obj) r(int64)
bind_sk             r(obj) r(str) r(int64) r(uint16) r(int64)
coerce_su           w(uint64) r(str) :pure :confprog
accept_sk           w(obj) r(obj)
decodetocodes       r(obj) r(str) r(int64) r(obj)
encodefromcodes     r(obj) r(str) r(obj)
multidimref_u       w(obj) r(obj) r(obj) :pure :useshll
print               r(str)
say                 r(str) :confprog
return_u         .r r(uint64) :useshll
tell_fh             w(int64) r(obj)
stat                w(int64) r(str) r(int64)
DEPRECATED_79       w(obj) r(obj) str
DEPRECATED_80       w(obj) r(obj) r(str)
chdir               r(str)
srand               r(int64)
rand_i              w(int64) :confprog
rand_n              w(num64) :confprog
DEPRECATED_46       w(int64)
sleep               r(num64)
newthread           w(obj) r(obj) r(int64)
threadjoin          r(obj)
DEPRECATED_47       w(num64)
exit                r(int64) :confprog
DEPRECATED_30       w(int64) r(str) r(str) r(obj) r(obj) r(obj) r(obj) r(int64)
cwd                 w(str) :pure :confprog
clargs              w(obj) :pure :useshll :confprog
getenvhash          w(obj) :pure :useshll :confprog
loadlib             r(str) r(str)
freelib             r(str)
findsym             w(obj) r(str) r(str)
dropsym             r(obj)
loadext             r(str) r(str)
backendconfig       w(obj) :pure :confprog
getlexouter         w(obj) r(str) :pure :noinline :useshll
getlexrel           w(obj) r(obj) r(str) :pure :useshll
getlexreldyn        w(obj) r(obj) r(str) :pure :useshll
getlexrelcaller     w(obj) r(obj) r(str) :pure :useshll
getlexcaller        w(obj) r(str) :pure :noinline :useshll
bitand_s            w(str) r(str) r(str) :pure
bitor_s             w(str) r(str) r(str) :pure
bitxor_s            w(str) r(str) r(str) :pure
isnanorinf          w(int64) r(num64) :pure
inf                 w(num64) :pure
neginf              w(num64) :pure
nan                 w(num64) :pure
getpid              w(int64) :pure :confprog
DEPRECATED_29       w(int64) r(obj) r(str) r(obj) r(obj) r(obj) r(obj) r(int64)
filereadable        w(int64) r(str)
filewritable        w(int64) r(str)
fileexecutable      w(int64) r(str)
atpos2d_u           w(uint64) r(obj) r(int64) r(int64) :pure :specializable
capturenamedshash   w(obj) r(obj) :pure :useshll
read_fhb            r(obj) r(obj) r(int64)
write_fhb           r(obj) r(obj)
replace             w(str) r(str) r(int64) r(int64) r(str)
newexception        w(obj)
permit              r(obj) r(int64) r(int64)
backtrace           w(obj) r(obj)
symlink             r(str) r(str)
link                r(str) r(str)
gethostname         w(str)
exreturnafterunwind r(obj)
vmeventsubscribe    r(obj) r(obj)
continuationreset   w(obj) r(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
# this op isn't actually invokish, but it requires the cur_op to be set before doing its work
continuationcontrol w(obj) r(int64) r(obj) r(obj) :invokish :maycausedeopt
continuationinvoke  w(obj) r(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
randscale_n         w(num64) r(num64)
uniisblock          w(int64) r(str) r(int64) r(str) :pure
assertparamcheck    r(int64) :noinline :invokish :maycausedeopt :cache :deoptallpoint
hintfor             w(int64) r(obj) r(str)
paramnamesused      :noinline
getuniname          w(str) r(int64) :pure
getuniprop_int      w(int64) r(int64) r(int64) :pure
getuniprop_bool     w(int64) r(int64) r(int64) :pure
getuniprop_str      w(str) r(int64) r(int64) :pure
matchuniprop        w(int64) r(int64) r(int64) r(int64) :pure
nativecallbuild     w(int64) r(obj) r(str) r(str) r(str) r(obj) r(obj)
nativecallinvoke    w(obj) r(obj) r(obj) r(obj) :deoptallpoint :maycausedeopt
nativecallrefresh   r(obj)
threadrun           r(obj)
threadid            w(int64) r(obj) :pure
threadyield
currentthread       w(obj) :pure
lock                r(obj)
unlock              r(obj)
semacquire          r(obj)
semtryacquire       w(int64) r(obj)
semrelease          r(obj)
getlockcondvar      w(obj) r(obj) r(obj)
condwait            r(obj)
condsignalone       r(obj)
condsignalall       r(obj)
queuepoll           w(obj) r(obj)
DEPRECATED_82       r(obj) r(obj) r(str) r(str)
ctxouterskipthunks  w(obj) r(obj) :noinline
ctxcallerskipthunks w(obj) r(obj) :noinline
timer               w(obj) r(obj) r(obj) r(int64) r(int64) r(obj)
cancel              r(obj)
signal              w(obj) r(obj) r(obj) r(obj) r(obj) r(int64) r(obj)
watchfile           w(obj) r(obj) r(obj) r(str) r(obj)
asyncconnect        w(obj) r(obj) r(obj) r(str) r(int64) r(obj)
asynclisten         w(obj) r(obj) r(obj) r(str) r(int64) r(int64) r(obj)
bindposnd_u         r(obj) r(obj) r(uint64) :specializable
asyncwritebytes     w(obj) r(obj) r(obj) r(obj) r(obj) r(obj)
bindpos3d_u         r(obj) r(int64) r(int64) r(int64) r(uint64) :specializable
asyncreadbytes      w(obj) r(obj) r(obj) r(obj) r(obj) r(obj)
getlexstatic_o      w(obj) r(str) :pure :noinline :specializable :cache
getlexperinvtype_o  w(obj) r(str) :pure :logged :specializable
execname            w(str)
const_i64_16        w(int64) int16 :pure :confprog
const_i64_32        w(int64) int32 :pure :confprog
isnonnull           w(int64) r(obj) :pure :specializable
param_rn2_i         w(int64) str str :noinline
param_rn2_n         w(num64) str str :noinline
param_rn2_s         w(str) str str :noinline
param_rn2_o         w(obj) str str :noinline :useshll
param_on2_i         w(int64) str str ins :noinline
param_on2_n         w(num64) str str ins :noinline
param_on2_s         w(str) str str ins :noinline
param_on2_o         w(obj) str str ins :noinline :useshll
osrpoint            :osrpoint
nativecallcast      w(obj) r(obj) r(obj) r(obj)
spawnprocasync      w(obj) r(obj) r(str) r(obj) r(str) r(obj) r(obj)
killprocasync       r(obj) r(int64)
startprofile        r(obj)
endprofile          w(obj)
objectid            w(int64) r(obj) :pure
settypefinalize     r(obj) r(int64)
force_gc
nativecallglobal    w(obj) r(str) r(str) r(obj) r(obj)
DEPRECATED_32       w(int64) r(obj)
setparameterizer    r(obj) r(obj)
parameterizetype    w(obj) r(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
typeparameterized   w(obj) r(obj)
typeparameters      w(obj) r(obj)
typeparameterat     w(obj) r(obj) r(int64)
readlink            w(str) r(str)
lstat               w(int64) r(str) r(int64)
iscont_i            w(int64) r(obj) :pure :specializable :confprog
iscont_n            w(int64) r(obj) :pure :specializable :confprog
iscont_s            w(int64) r(obj) :pure :specializable :confprog
assign_i            r(obj) r(int64) :invokish :maycausedeopt :specializable :deoptallpoint
assign_n            r(obj) r(num64) :invokish :maycausedeopt :specializable :deoptallpoint
assign_s            r(obj) r(str) :invokish :maycausedeopt :specializable :deoptallpoint
decont_i            w(int64) r(obj) :pure :invokish :maycausedeopt :specializable :deoptallpoint
decont_n            w(num64) r(obj) :pure :invokish :maycausedeopt :specializable :deoptallpoint
decont_s            w(str) r(obj) :pure :invokish :maycausedeopt :specializable :deoptallpoint
getrusage           r(obj) :pure
threadlockcount     w(int64) r(obj) :pure
bindcomplete        :noinline :invokish :maycausedeopt :cache :deoptallpoint
getlexref_i         w(obj) rl(int64) :pure :noinline :useshll
getlexref_n         w(obj) rl(num64) :pure :noinline :useshll
getlexref_s         w(obj) rl(str) :pure :noinline :useshll
getlexref_ni        w(obj) str :pure :noinline :useshll
getlexref_nn        w(obj) str :pure :noinline :useshll
getlexref_ns        w(obj) str :pure :noinline :useshll
atposref_i          w(obj) r(obj) r(int64) :pure :useshll
atposref_n          w(obj) r(obj) r(int64) :pure :useshll
atposref_s          w(obj) r(obj) r(int64) :pure :useshll
getattrref_i        w(obj) r(obj) r(obj) str int16 :pure :useshll
getattrref_n        w(obj) r(obj) r(obj) str int16 :pure :useshll
getattrref_s        w(obj) r(obj) r(obj) str int16 :pure :useshll
getattrsref_i       w(obj) r(obj) r(obj) r(str) :pure :useshll
getattrsref_n       w(obj) r(obj) r(obj) r(str) :pure :useshll
getattrsref_s       w(obj) r(obj) r(obj) r(str) :pure :useshll
nativecallsizeof    w(int64) r(obj)
encodenorm          r(str) r(str) r(int64) r(obj)
normalizecodes      r(obj) r(int64) r(obj)
strfromcodes        w(str) r(obj)
strtocodes          r(str) r(int64) r(obj)
getcodelocation     w(obj) r(obj) :pure :confprog
eqatim_s            w(int64) r(str) r(str) r(int64) :pure
ordbaseat           w(int64) r(str) r(int64) :pure
neverrepossess      r(obj)
scdisclaim          r(obj)
setthreadname       r(str)
atpos2d_i           w(int64) r(obj) r(int64) r(int64) :pure :specializable
atpos2d_n           w(num64) r(obj) r(int64) r(int64) :pure :specializable
atpos2d_s           w(str) r(obj) r(int64) r(int64) :pure :specializable
atpos2d_o           w(obj) r(obj) r(int64) r(int64) :pure :specializable
atpos3d_i           w(int64) r(obj) r(int64) r(int64) r(int64) :pure :specializable
atpos3d_n           w(num64) r(obj) r(int64) r(int64) r(int64) :pure :specializable
atpos3d_s           w(str) r(obj) r(int64) r(int64) r(int64) :pure :specializable
atpos3d_o           w(obj) r(obj) r(int64) r(int64) r(int64) :pure :specializable
atposnd_i           w(int64) r(obj) r(obj) :pure :specializable
atposnd_n           w(num64) r(obj) r(obj) :pure :specializable
atposnd_s           w(str) r(obj) r(obj) :pure :specializable
atposnd_o           w(obj) r(obj) r(obj) :pure :specializable
bindpos2d_i         r(obj) r(int64) r(int64) r(int64) :specializable
bindpos2d_n         r(obj) r(int64) r(int64) r(num64) :specializable
bindpos2d_s         r(obj) r(int64) r(int64) r(str) :specializable
bindpos2d_o         r(obj) r(int64) r(int64) r(obj) :specializable
bindpos3d_i         r(obj) r(int64) r(int64) r(int64) r(int64) :specializable
bindpos3d_n         r(obj) r(int64) r(int64) r(int64) r(num64) :specializable
bindpos3d_s         r(obj) r(int64) r(int64) r(int64) r(str) :specializable
bindpos3d_o         r(obj) r(int64) r(int64) r(int64) r(obj) :specializable
bindposnd_i         r(obj) r(obj) r(int64) :specializable
bindposnd_n         r(obj) r(obj) r(num64) :specializable
bindposnd_s         r(obj) r(obj) r(str) :specializable
bindposnd_o         r(obj) r(obj) r(obj) :specializable
dimensions          w(obj) r(obj) :specializable
setdimensions       r(obj) r(obj) :specializable
numdimensions       w(int64) r(obj) :pure :specializable
ctxcode             w(obj) r(obj)
isrwcont            w(int64) r(obj) :pure :specializable
fc                  w(str) r(str) :pure
getlexref_nu        w(obj) str :pure :noinline :useshll
atpos3d_u           w(uint64) r(obj) r(int64) r(int64) r(int64) :pure :specializable
encoderep           w(obj) r(str) r(str) r(str) r(obj)
istty_fh            w(int64) r(obj) :pure
multidimref_i       w(obj) r(obj) r(obj) :pure :useshll
multidimref_n       w(obj) r(obj) r(obj) :pure :useshll
multidimref_s       w(obj) r(obj) r(obj) :pure :useshll
fileno_fh           w(int64) r(obj) :pure
asyncudp            w(obj) r(obj) r(obj) r(str) r(int64) r(int64) r(obj)
bindpos2d_u         r(obj) r(int64) r(int64) r(uint64) :specializable
asyncwritebytesto   w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) r(str) r(int64)
objprimbits         w(int64) r(obj) :specializable
objprimunsigned     w(int64) r(obj) :specializable
ctxnt               w(obj) :pure :noinline
chown_f             r(str) r(uint64) r(uint64)
bindattr_u          r(obj) r(obj) str r(uint64) int16 :specializable
bindattrs_u         r(obj) r(obj) r(str) r(uint64) :specializable
getlexref_i32       w(obj) rl(int32) :pure :noinline :useshll
getlexref_i16       w(obj) rl(int16) :pure :noinline :useshll
getlexref_i8        w(obj) rl(int8) :pure :noinline :useshll
getlexref_n32       w(obj) rl(num32) :pure :noinline :useshll
box_u               w(obj) r(uint64) r(obj) :pure :specializable
unbox_u             w(uint64) r(obj) :pure :specializable
coerce_iu           w(uint64) r(int64) :pure
coerce_ui           w(int64) r(uint64) :pure
coerce_nu           w(uint64) r(num64) :pure
coerce_un           w(num64) r(uint64) :pure
decont_u            w(uint64) r(obj) :pure :invokish :maycausedeopt :specializable :deoptallpoint
bnot_u              w(uint64) r(uint64) :pure :confprog
getattr_u           w(uint64) r(obj) r(obj) str int16 :specializable
getattrs_u          w(uint64) r(obj) r(obj) r(str) :specializable
getattrref_u        w(obj) r(obj) r(obj) str int16 :pure :useshll
getlexref_u         w(obj) rl(uint64) :pure :noinline :useshll
getlexref_u32       w(obj) rl(uint32) :pure :noinline :useshll
getlexref_u16       w(obj) rl(uint16) :pure :noinline :useshll
getlexref_u8        w(obj) rl(uint8) :pure :noinline :useshll
param_rp_u          w(uint64) int16 :pure :noinline
param_op_u          w(uint64) int16 ins :pure :noinline
param_rn_u          w(uint64) str :noinline
param_on_u          w(uint64) str ins :noinline
param_rn2_u         w(uint64) str str :noinline
param_on2_u         w(uint64) str str ins :noinline
stat_time           w(num64) r(str) r(int64)
lstat_time          w(num64) r(str) r(int64)
setdebugtypename    r(obj) r(str)
loadbytecodebuffer  r(obj) :invokish :maycausedeopt :noinline :deoptonepoint :deoptallpoint
loadbytecodefh      r(obj) r(str) :invokish :maycausedeopt :noinline :deoptonepoint :deoptallpoint
throwpayloadlex     w(obj) int64 r(obj) :throwish
throwpayloadlexcaller w(obj) int64 r(obj) :throwish
lastexpayload       w(obj)
cancelnotify        r(obj) r(obj) r(obj)
decoderconfigure    r(obj) r(str) r(obj)
decodersetlineseps  r(obj) r(obj)
decoderaddbytes     r(obj) r(obj)
decodertakechars    w(str) r(obj) r(int64)
decodertakeallchars w(str) r(obj)
decodertakeavailablechars w(str) r(obj)
decodertakeline     w(str) r(obj) r(int64) r(int64)
decoderbytesavailable w(int64) r(obj) :pure
decodertakebytes    w(obj) r(obj) r(obj) r(int64)
decoderempty        w(int64) r(obj) :pure
indexingoptimized   w(str) r(str) :pure
captureinnerlex     r(obj) :noinline
unicmp_s            w(int64) r(str) r(str) r(int64) r(int64) r(int64) :pure
DEPRECATED_92       r(obj) r(obj)
strfromname         w(str) r(str) :pure
indexic_s           w(int64) r(str) r(str) r(int64) :pure
getport_sk          w(int64) r(obj)
cpucores            w(int64) :pure
eqaticim_s          w(int64) r(str) r(str) r(int64) :pure
indexicim_s         w(int64) r(str) r(str) r(int64) :pure
decodertakecharseof w(str) r(obj) r(int64)
indexim_s           w(int64) r(str) r(str) r(int64) :pure
cas_o               w(obj) r(obj) r(obj) r(obj) :invokish :maycausedeopt :specializable :deoptallpoint
cas_i               w(int64) r(obj) r(int64) r(int64) :specializable
atomicinc_i         w(int64) r(obj) :specializable
atomicdec_i         w(int64) r(obj) :specializable
atomicadd_i         w(int64) r(obj) r(int64) :specializable
# Following two are *not* :pure (even though just loads); their memory barrier
# counts as a side-effect that should be retained.
atomicload_o        w(obj) r(obj) :specializable
atomicload_i        w(int64) r(obj) :specializable
atomicstore_o       r(obj) r(obj) :invokish :maycausedeopt :specializable :deoptallpoint
atomicstore_i       r(obj) r(int64) :specializable
barrierfull
coveragecontrol     r(int64)
DEPRECATED_111     -a r(obj) r(obj) :specializable :deoptallpoint :maycausedeopt
DEPRECATED_112     -a w(int64) r(obj) r(obj) :specializable :deoptallpoint :maycausedeopt
DEPRECATED_113     -a w(num64) r(obj) r(obj) :specializable :deoptallpoint :maycausedeopt
DEPRECATED_114     -a w(str) r(obj) r(obj) :specializable :deoptallpoint :maycausedeopt
DEPRECATED_115     -a w(obj) r(obj) r(obj) :specializable :deoptallpoint :maycausedeopt
DEPRECATED_107      w(int64) r(int16)
DEPRECATED_108      w(num64) r(int16)
DEPRECATED_109      w(str) r(int16)
DEPRECATED_110      w(obj) r(int16)
coerce_II           w(obj) r(obj) r(obj) :pure
encoderepconf       w(obj) r(str) r(str) r(str) r(obj) r(int64)
encodeconf          w(obj) r(str) r(str) r(obj) r(int64)
decodeconf          w(str) r(obj) r(str) r(int64)
decoderepconf       w(str) r(obj) r(str) r(str) r(int64)
getppid             w(int64)
getsignals          w(obj) :useshll
slice               w(obj) r(obj) r(int64) r(int64)
DEPRECATED_38       r(str) r(str) r(obj)
DEPRECATED_39    -a w(obj) str
DEPRECATED_81       r(obj) r(obj)
DEPRECATED_41       r(obj)
DEPRECATED_42       r(obj)
DEPRECATED_43       r(obj)
DEPRECATED_44       w(obj) r(obj) r(obj) str
atomicbindattr_o    r(obj) r(obj) r(str) r(obj) :specializable
casattr_o           w(obj) r(obj) r(obj) r(str) r(obj) r(obj) :specializable
atkey_u             w(uint64) r(obj) r(str) :specializable
coerce_us           w(str) r(uint64) :pure
DEPRECATED_45       r(obj) r(obj)
hllbool             w(obj) r(int64) :pure :useshll
hllboolfor          w(obj) r(int64) r(str) :pure :useshll
decodelocaltime     w(obj) r(int64)
fork                w(int64)
buffertocu          w(obj) r(obj) :invokish :maycausedeopt :deoptallpoint
writeint            r(obj) r(int64) r(int64)  r(uint64)
writeuint           r(obj) r(int64) r(uint64) r(uint64)
writenum            r(obj) r(uint64) r(num64)  r(uint64)
serializetobuf      w(obj) r(obj) r(obj) r(obj)
readint             w(int64) r(obj) r(uint64) r(uint64)
readuint            w(uint64) r(obj) r(uint64) r(uint64)
readnum             w(num64) r(obj) r(uint64) r(uint64)
DEPRECATED_68       w(int64) r(obj)
uname               w(obj) :pure
freemem             w(int64) :pure
totalmem            w(int64) :pure
DEPRECATED_93       r(obj) r(obj)
DEPRECATED_94       w(obj) :noinline
time                w(uint64) :pure :confprog
dispatch_v       .d str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
dispatch_i       .d w(int64) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
dispatch_n       .d w(num64) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
dispatch_s       .d w(str) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable
dispatch_o       .d w(obj) str callsite :cache :deoptallpoint :predeoptonepoint :maycausedeopt :specializable :postlogged :deoptonepoint
gettypehllrole      w(int64) r(obj) :pure
bindpos_u           r(obj) r(int64) r(uint64) :specializable
atpos_u             w(uint64) r(obj) r(int64) :specializable :confprog
atposref_u          w(obj) r(obj) r(int64) :pure :useshll
iscont_u            w(int64) r(obj) :pure :specializable :confprog
assign_u            r(obj) r(uint64) :invokish :maycausedeopt :specializable :deoptallpoint
captureposarg_u     w(uint64) r(obj) r(int64) :pure

# Spesh ops. Naming convention: start with sp_. Must all be marked .s, which
# is how the validator knows to exclude them.

# Type guard operations. Trigger de-optimization if the guard is violated.
#   guard = guard on type only; index is spesh slot with type
#   guardconc = guard on type + concrete; index is spesh slot with type
#   guardtype = guard on type + type object; index is spesh slot with type
sp_guard         .s w(obj) r(obj) sslot uint32 :maycausedeopt
sp_guardconc     .s w(obj) r(obj) sslot uint32 :maycausedeopt
sp_guardtype     .s w(obj) r(obj) sslot uint32 :maycausedeopt

# HLL guard operation. The uint64 is a pointer to a MVMHLLConfig.
sp_guardhll      .s w(obj) r(obj) uint64 uint32 :maycausedeopt

# Code guard operations. Trigger de-optimization if the guard is violated.
#   guardsf = guard on being an MVMCode with specified static frame inside
#   guardsfouter = as with guardsf but also ensures its ->outer is equal to
#   the currently executing frame
sp_guardsf       .s r(obj) sslot uint32 :maycausedeopt
sp_guardsfouter  .s r(obj) sslot uint32 :maycausedeopt

# Literal object match and non-match guards.
sp_guardobj      .s w(obj) r(obj) sslot uint32 :maycausedeopt
sp_guardnotobj   .s w(obj) r(obj) sslot uint32 :maycausedeopt

# Guards that check concrete or type object, without caring for type.
sp_guardjustconc .s w(obj) r(obj) uint32 :maycausedeopt
sp_guardjusttype .s w(obj) r(obj) uint32 :maycausedeopt

# Guards that the result of any custom operation was nonzero (e.g.  eq_s)
sp_guardnonzero  .s w(int64) r(int64) uint32 :maycausedeopt

# Specialized form of rebless that will always do a deopt one out of the
# current code as well as a deopt all.
sp_rebless       .s w(obj) r(obj) r(obj) uint32 :noinline :maycausedeopt

# These are variants of the normal interpreted ops that do not log. Used for
# the case where we can't JIT-compile, but don't want to keep on logging. Also,
# the separated _o and _ins forms for getlex allow us to avoid a check of if
# this is an object register.
sp_decont        .s w(obj) r(obj) :pure :invokish :maycausedeopt
sp_getlex_o      .s w(obj) rl(obj) :pure
sp_getlex_ins    .s w(`1) rl(`1) :pure
sp_getlex_no     .s w(obj) str :pure :noinline

# Specialized forms of bindlex, avoiding the need to check for register type
# (`_in` has no write batter, `_os` has the barrier).
sp_bindlex_in    .s wl(`1) r(`1)
sp_bindlex_os    .s wl(`1) r(`1)

# Specialized form of getlexstatic_o for when we had not yet resolved it by
# specialization time (implies a rarely taken path); we precalculate the
# inline cache slot, which means we don't have to worry about the bytecode
# positions changing (and makes it more comfortable to JIT).
sp_getlexstatic_o .s w(obj) r(str) sslot uint32 :pure

# These ops exist in spesh form because they refer to an inline cache entry.
sp_assertparamcheck .s r(int64) sslot uint32 :noinline :invokish :maycausedeopt
sp_bindcomplete     .s sslot uint32 :invokish :maycausedeopt
sp_istype           .s w(int64) r(obj) r(obj) sslot uint32 :pure :invokish :maycausedeopt

# Specialized form of dispatch_* for when we don't manage to rewrite it into
# anything more optimal. These precalculate the inline cache slot.
sp_dispatch_v    .s str callsite sslot uint32 :maycausedeopt :invokish
sp_dispatch_i    .s w(int64) str callsite sslot uint32 :maycausedeopt :invokish
sp_dispatch_u    .s w(uint64) str callsite sslot uint32 :maycausedeopt :invokish
sp_dispatch_n    .s w(num64) str callsite sslot uint32 :maycausedeopt :invokish
sp_dispatch_s    .s w(str) str callsite sslot uint32 :maycausedeopt :invokish
sp_dispatch_o    .s w(obj) str callsite sslot uint32 :maycausedeopt :invokish

# Following are for fast, unchecked grabbing of args from the arg buffer.
sp_getarg_o      .s w(obj) int16 :pure
sp_getarg_i      .s w(int64) int16 :pure
sp_getarg_u      .s w(uint64) int16 :pure
sp_getarg_n      .s w(num64) int16 :pure
sp_getarg_s      .s w(str) int16 :pure

# Error generation if a named param is unused (name goes in spesh slot).
sp_paramnamesused  .s sslot

# Look up a spesh slot.
sp_getspeshslot  .s w(obj) sslot :pure

# Create an object with the first int16's number of bytes size and then
# set its STable to the STable in the spesh slot.
sp_fastcreate    .s w(obj) int16 sslot :pure

# Retrieve or store a value by pointer offset. Offset is from the start
# of the object's memory.
sp_get_o         .s w(obj) r(obj) int16 :pure
sp_get_i64       .s w(int64) r(obj) int16 :pure
sp_get_i32       .s w(int64) r(obj) int16 :pure
sp_get_i16       .s w(int64) r(obj) int16 :pure
sp_get_i8        .s w(int64) r(obj) int16 :pure
sp_get_u64       .s w(uint64) r(obj) int16 :pure
sp_get_u32       .s w(uint64) r(obj) int16 :pure
sp_get_u16       .s w(uint64) r(obj) int16 :pure
sp_get_u8        .s w(uint64) r(obj) int16 :pure
sp_get_n         .s w(num64) r(obj) int16 :pure
sp_get_s         .s w(str) r(obj) int16 :pure
sp_bind_o        .s r(obj) int16 r(obj)
sp_bind_i64      .s r(obj) int16 r(int64)
sp_bind_i32      .s r(obj) int16 r(int64)
sp_bind_i16      .s r(obj) int16 r(int64)
sp_bind_i8       .s r(obj) int16 r(int64)
sp_bind_u64      .s r(obj) int16 r(uint64)
sp_bind_u32      .s r(obj) int16 r(uint64)
sp_bind_u16      .s r(obj) int16 r(uint64)
sp_bind_u8       .s r(obj) int16 r(uint64)
sp_bind_n        .s r(obj) int16 r(num64)
sp_bind_s        .s r(obj) int16 r(str)
sp_bind_s_nowb   .s r(obj) int16 r(str)

# Same as above, but for p6opaques, handling the NULL sentinel and the
# real_data thing for mixins. The vt variant vivifies a NULL with a
# type object; the vc does it with a clone. Offset is into the body
# (e.g. the real_data of the P6opaque).
sp_p6oget_o      .s w(obj) r(obj) int16 :pure
sp_p6ogetvt_o    .s w(obj) r(obj) int16 sslot
sp_p6ogetvc_o    .s w(obj) r(obj) int16 sslot
sp_p6oget_i      .s w(int64) r(obj) int16 :pure
sp_p6oget_u      .s w(uint64) r(obj) int16 :pure
sp_p6oget_n      .s w(num64) r(obj) int16 :pure
sp_p6oget_s      .s w(str) r(obj) int16 :pure
sp_p6oget_bi     .s w(int64) r(obj) int16 :pure
sp_p6obind_o     .s r(obj) int16 r(obj)
sp_p6obind_i     .s r(obj) int16 r(int64)
sp_p6obind_u     .s r(obj) int16 r(uint64)
sp_p6obind_n     .s r(obj) int16 r(num64)
sp_p6obind_s     .s r(obj) int16 r(str)
sp_p6oget_i32    .s w(int64) r(obj) int16 :pure
sp_p6oget_u32    .s w(uint64) r(obj) int16 :pure
sp_p6obind_i32   .s r(obj) int16 r(int64) :pure
sp_p6obind_u32   .s r(obj) int16 r(uint64) :pure

# Simple vivifying forms of attribute access; used when we know we don't
# have any kind of mixin type. Offset is from start of the object's memory.
sp_getvt_o       .s w(obj) r(obj) int16 sslot
sp_getvc_o       .s w(obj) r(obj) int16 sslot

# Lowered int and bigint box ops. These combine a fastcreate and a writing of
# the value as appropriate. The first two read operands have the same meaning
# as in sp_fastcreate, the third is the offset in the object to box to, and
# the final operand is the integer to box. The _ic variants include an extra
# argument which is the type index in the integer cache; they do a lookup in
# the integer cache before performing a box operation.
sp_fastbox_i     .s w(obj) int16 sslot int16 r(int64) :pure
sp_fastbox_u     .s w(obj) int16 sslot int16 r(uint64) :pure
sp_fastbox_bi    .s w(obj) int16 sslot int16 r(int64) :pure
sp_fastbox_i_ic  .s w(obj) int16 sslot int16 r(int64) int16 :pure
sp_fastbox_u_ic  .s w(obj) int16 sslot int16 r(uint64) int16 :pure
sp_fastbox_bi_ic .s w(obj) int16 sslot int16 r(int64) int16 :pure

# Follow a pointer at an offset to an object and get/store a value there.
sp_deref_get_i64      .s w(int64) r(obj) int16 :pure
sp_deref_get_n        .s w(num64) r(obj) int16 :pure
sp_deref_bind_i64     .s r(obj) r(int64) int16
sp_deref_bind_n       .s r(obj) r(num64) int16

# These read/bind a lexical via. a code ref held in a register. Used for closure
# inlining. The outers count must be at least 1 (e.g. these must never be used
# for lexicals that are in the current scope).
sp_getlexvia_o        .s w(obj) int16 int16 r(obj) :pure
sp_getlexvia_ins      .s w(`1) int16 int16 r(obj) :pure
sp_bindlexvia_os      .s int16 int16 r(obj) r(obj) :pure
sp_bindlexvia_in      .s int16 int16 r(obj) r(obj) :pure

sp_getstringfrom      .s w(str) sslot int32 :pure
sp_getwvalfrom        .s w(obj) sslot int64 :pure

# Enter the JIT
sp_jit_enter     .s w(obj)

# boolification of numeric values
sp_istrue_n           .s w(int64) r(num64) :pure

# we boolify iter objects all the time, but we have no op for it. until now!
sp_boolify_iter       .s w(int64) r(obj) :pure
sp_boolify_iter_arr   .s w(int64) r(obj) :pure
sp_boolify_iter_hash  .s w(int64) r(obj) :pure

# Unguarded atomic ops (when we know it's a concrete target that certainly
# has the operation).
sp_cas_o              .s w(obj) r(obj) r(obj) r(obj) :invokish :maycausedeopt
sp_atomicload_o       .s w(obj) r(obj)
sp_atomicstore_o      .s r(obj) r(obj) :invokish :maycausedeopt

# Lowered big integer operations, where inputs and output type are consistent.
# They start with the same operands as a fastcreate, which will be used if the
# result can not be served from the cache. The second index is the offset of
# the bigint structure within the body of the object. The third index is the
# index into the box type cache, for objects that are in range.
sp_add_I         .s w(obj) int16 sslot r(obj) r(obj) int16 int16 :pure
sp_sub_I         .s w(obj) int16 sslot r(obj) r(obj) int16 int16 :pure
sp_mul_I         .s w(obj) int16 sslot r(obj) r(obj) int16 int16 :pure

sp_bool_I        .s w(int64) r(obj) int16 :pure

# Run bytecode. This is what a dispatch op with a bytecode terminal
# specializes as. The r(obj) register is the bytecode handle. The
# uint64 is a pointer to the MVMCallsite (they never move and we know
# they are interned). The int16 is the spesh candidate if one was
# preselected, or -1 if none wsa.
sp_runbytecode_v .s r(obj) uint64 int16 :maycausedeopt :invokish
sp_runbytecode_i .s w(int64) r(obj) uint64 int16 :maycausedeopt :invokish
sp_runbytecode_u .s w(uint64) r(obj) uint64 int16 :maycausedeopt :invokish
sp_runbytecode_n .s w(num64) r(obj) uint64 int16 :maycausedeopt :invokish
sp_runbytecode_s .s w(str) r(obj) uint64 int16 :maycausedeopt :invokish
sp_runbytecode_o .s w(obj) r(obj) uint64 int16 :maycausedeopt :invokish

# Run a C function. The r(obj) register is the MVMCFunction to invoke. The
# uint64 is a pointer to the MVMCallsite (they never move and we know
# they are interned).
sp_runcfunc_v    .s r(obj) uint64
sp_runcfunc_i    .s w(int64) r(obj) uint64
sp_runcfunc_u    .s w(uint64) r(obj) uint64
sp_runcfunc_n    .s w(num64) r(obj) uint64
sp_runcfunc_s    .s w(str) r(obj) uint64
sp_runcfunc_o    .s w(obj) r(obj) uint64

# Run a native function. The r(obj) register is the native function to invoke.
# The uint64 is a pointer to the MVMCallsite (they never move and we know they
# are interned). The first of the var args is actually required and is the
# result type. Specifying this argument here would require special handling in
# several places though.
sp_runnativecall_v .s          r(obj) uint64 :maycausedeopt :invokish
sp_runnativecall_i .s w(int64) r(obj) uint64 :maycausedeopt :invokish
sp_runnativecall_u .s w(uint64) r(obj) uint64 :maycausedeopt :invokish
sp_runnativecall_n .s w(num64) r(obj) uint64 :maycausedeopt :invokish
sp_runnativecall_s .s w(str)   r(obj) uint64 :maycausedeopt :invokish
sp_runnativecall_o .s w(obj)   r(obj) uint64 :maycausedeopt :invokish

# An instruction produced when translating dispatch programs that set up
# one or more resumption initialization states. One is produce for each
# of the resumable dispatches set up, and they are stacked up immediately
# prior to the sp_runbytecode instruction. The arguments are:
# * A register used to hold the dispatch state if there is a resumption,
#   which should be nulled out (this is the only runtime effect of this
#   instruction, all other arguments contribute to static metadata
#   attached to the spesh candidate)
# * The index of the spesh resume init record
# * The number of vararg registers that follow
# * Varargs pointing to registers for every non-constant value that is used
#   in the resume initialization state (which keeps the registers alive)
sp_resumption    .s w(obj) uint16 uint16

# Profiler recording ops. Naming convention: start with prof_. Must all be
# marked .s, which is how the validator knows to exclude them. (For that
# purpose, we treat them as a kind of spesh op).

# Entry of various forms. The inline one passes along the static frame of the
# inlinee.
prof_enter       .s
prof_enterspesh  .s
prof_enterinline .s sslot
prof_enternative .s r(obj)

# Normal exit (exception throw and unwind is handled separately). Will always
# be what we last entered, so no need for separate versions like above.
prof_exit        .s

# Recording of allocated types (may not give full picture of allocations, but
# is at least enough to get a picture).
prof_allocated   .s r(obj)

# Recording of allocations that are scalar replaced.
prof_replaced    .s sslot

# Cross-thread write analysis logging instruction.
ctw_check        .s r(obj) int16

coverage_log     .s str int32 int32 int64

breakpoint       .s int32 int32 :throwish :invokish
