# 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 :invokish :throwish :deoptallpoint getlex_nn w(num64) str :pure :noinline :invokish :throwish :deoptallpoint getlex_ns w(str) str :pure :noinline :invokish :throwish :deoptallpoint getlex_no w(obj) str :pure :deoptonepoint :logged :noinline :invokish :throwish :deoptallpoint 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 :invokish :throwish :deoptallpoint 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 DEPRECATED_27 w(str) r(str) r(str) 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 :invokish :throwish :deoptallpoint getlexrel w(obj) r(obj) r(str) :pure :useshll getlexreldyn w(obj) r(obj) r(str) :pure :useshll :invokish :throwish :deoptallpoint 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 :invokish :throwish :deoptallpoint 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 DEPRECATED_25 r(obj) r(obj) 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 :invokish :throwish # 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_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_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_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_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_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_p6obind_i32 .s r(obj) int16 r(int64) :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_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_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