⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ops.tab

📁 OTP是开放电信平台的简称
💻 TAB
📖 第 1 页 / 共 3 页
字号:
# ``The contents of this file are subject to the Erlang Public License,# Version 1.1, (the "License"); you may not use this file except in# compliance with the License. You should have received a copy of the# Erlang Public License along with this software. If not, it can be# retrieved via the world wide web at http://www.erlang.org/.# # Software distributed under the License is distributed on an "AS IS"# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See# the License for the specific language governing rights and limitations# under the License.# # The Initial Developer of the Original Code is Ericsson Utvecklings AB.# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings# AB. All Rights Reserved.''# #     $Id$### The instructions that follows are only known by the loader and the emulator.# They can be changed without recompiling old Beam files.## Instructions starting with a "i_" prefix are instructions produced by# instruction transformations; thus, they never occur in BEAM files.## Special instruction used to generate an error message when# trying to load a module compiled by the V1 compiler (R5 & R6).# (Specially treated in beam_load.c.)too_old_compiler/0too_old_compiler## Obsolete instructions follow.#is_list p S => too_old_compileris_nonempty_list p R => too_old_compileris_nil p R => too_old_compileris_tuple p S => too_old_compilertest_arity p S Arity => too_old_compileris_integer p R => too_old_compileris_float p R => too_old_compileris_atom p R => too_old_compileris_eq_exact p S1 S2 => too_old_compiler## All the other instructions.#label Li_func_info I a a Iint_code_endi_module_info_0i_module_info_1i_trace_breakpointi_mtrace_breakpointi_debug_breakpointi_count_breakpointi_return_to_tracei_yieldi_global_consi_global_tuplei_global_copyreturn%macro: allocate Allocate -pack%macro: allocate_zero AllocateZero -pack%macro: allocate_heap AllocateHeap -pack%macro: allocate_heap_zero AllocateHeapZero -pack%macro: test_heap TestHeap -packallocate t tallocate_heap I I Ideallocate Iinit yallocate_zero t tallocate_heap_zero I I Itest_heap I Iinit2 y yinit3 y y yinit Y1=y | init Y2=y | init Y3=y => init3 Y1 Y2 Y3init Y1=y | init Y2=y => init2 Y1 Y2%macro: init2 Init2 -pack%macro: init3 Init3 -pack## Warning: The put_string instruction is specially treated in the loader.# Don't change the instruction format unless you change the loader too.#put_string I I d# Selecting valuesselect_val S=wo Fail=f Size=u Rest=* => const_select_val(S, Fail, Size, Rest)select_val S=s Fail=f Size=u Rest=* | use_jump_tab(Size, Rest) => \  gen_jump_tab(S, Fail, Size, Rest)is_integer Fail=f S | select_val S=s Fail=f Size=u Rest=* | use_jump_tab(Size, Rest) => \  gen_jump_tab(S, Fail, Size, Rest)select_val S=s Fail=f Size=u Rest=* | mixed_types(Size, Rest) => \  gen_split_values(S, Fail, Size, Rest)is_integer Fail=f S | select_val S=s Fail=f Size=u Rest=* | \  fixed_size_values(Size, Rest) => gen_select_val(S, Fail, Size, Rest)is_atom Fail=f S | select_val S=s Fail=f Size=u Rest=* | \  fixed_size_values(Size, Rest) => gen_select_val(S, Fail, Size, Rest)select_val S=s Fail=f Size=u Rest=* | fixed_size_values(Size, Rest) => \  gen_select_val(S, Fail, Size, Rest)select_val S=s Fail=f Size=u Rest=* | all_values_are_big(Size, Rest) => \  gen_select_big(S, Fail, Size, Rest)select_tuple_arity S=s Fail=f Size=u Rest=* => \  gen_select_tuple_arity(S, Fail, Size, Rest)i_select_val s f Ii_select_tuple_arity s f Ii_select_big s fi_select_float s f Ii_jump_on_val_zero s f Ii_jump_on_val s f I I%macro: get_list GetList -packget_list x x xget_list x x yget_list x x rget_list x y xget_list x y yget_list x y rget_list x r xget_list x r yget_list y x xget_list y x yget_list y x rget_list y y xget_list y y yget_list y y rget_list y r xget_list y r yget_list r x xget_list r x yget_list r x rget_list r y xget_list r y yget_list r y rget_list r r xget_list r r y# Old-style catch.catch y fcatch_end y# Try/catch.try Y F => catch Y Ftry_case Y => try_end Ytry_end ytry_case_end Big=w => i_put_big Big x | case_end xtry_case_end Float=o => i_put_float Float x | case_end xtry_case_end s# Destructive set tuple elementset_tuple_element Float=o Tuple Pos => \   i_put_float Float x | set_tuple_element x Tuple Posset_tuple_element Big=w Tuple Pos => i_put_big Big x | set_tuple_element x Tuple Posset_tuple_element s d P# Get tuple element%macro: i_get_tuple_element GetTupleElement -packi_get_tuple_element x P xi_get_tuple_element r P xi_get_tuple_element y P xi_get_tuple_element x P ri_get_tuple_element y P r%coldi_get_tuple_element r P ri_get_tuple_element x P yi_get_tuple_element r P yi_get_tuple_element y P y%hot%macro: is_number IsNumber -fail_action%coldis_number f ris_number f xis_number f y%coldis_number Fail=f owi =>is_number Fail=f na => jump Fail%macro: is_constant IsConstant -fail_action%coldis_constant f xis_constant f yis_constant f r%hotis_constant Fail=f owia =>is_constant Fail=f n => jump Failjump fcase_end Big=w => i_put_big Big x | case_end xcase_end Float=o => i_put_float Float x | case_end xbadmatch Big=w => i_put_big Big x | badmatch xbadmatch Float=o => i_put_float Float x | badmatch xcase_end sbadmatch sif_endraise s s# Internal now, but could be useful to make known to the compiler.badarg jsystem_limit jmove R R =>move Float=o Dst=d => i_put_float Float Dstmove Big=w Dst=d => i_put_big Big Dstmove X1=x Y1=y | move X2=x Y2=y => move2 X1 Y1 X2 Y2move Y1=y X1=x | move Y2=y X2=x => move2 Y1 X1 Y2 X2%macro: move2 Move2 -packmove2 x y x ymove2 y x y x%macro:move Move -pack -gen_destmove x xmove x ymove x rmove y xmove y rmove r xmove r ymove c xmove c rmove n xmove n r%coldmove s d%hoti_put_float o di_put_big w d# Receive operations.loop_rec Fail Src | smp_mark_target_label(Fail) => i_loop_rec Fail Srclabel L | wait_timeout Fail Src | smp_already_locked(L) => label L | i_wait_timeout_locked Fail Srcwait_timeout Fail Src => i_wait_timeout Fail Srci_wait_timeout Fail Src=aiow => gen_literal_timeout(Fail, Src)i_wait_timeout_locked Fail Src=aiow => gen_literal_timeout_locked(Fail, Src)label L | wait Fail | smp_already_locked(L) => label L | wait_locked Failwait Fail | smp() => wait_unlocked Faillabel L | timeout | smp_already_locked(L) => label L | timeout_lockedremove_messagetimeouttimeout_lockedi_loop_rec f rloop_rec_end fwait fwait_locked fwait_unlocked fi_wait_timeout f Ii_wait_timeout f si_wait_timeout_locked f Ii_wait_timeout_locked f si_wait_errori_wait_error_locked## Fetch operations (used for arithmetic instructions).#i_fetch S1=w S2=w => i_fetch r r  | i_fetch_big1 S1 | i_fetch_big2 S2i_fetch S1=w S2   => i_fetch r S2 | i_fetch_big1 S1i_fetch S1 S2=w   => i_fetch S1 r | i_fetch_big2 S2i_fetch S1=o S2=o => i_fetch r r  | i_fetch_float1 S1 | i_fetch_float2 S2i_fetch S1=o S2   => i_fetch r S2 | i_fetch_float1 S1i_fetch S1 S2=o   => i_fetch S1 r | i_fetch_float2 S2send## Comparisions.#is_eq_exact Lbl=f R=rxy C=c => i_is_eq_const Lbl R Cis_eq Lbl=f R=rxy C=a => i_is_eq_const Lbl R Cis_eq Lbl=f R=rxy C=n => i_is_eq_const Lbl R Cis_ge Lbl S1 S2 => i_fetch S1 S2 | i_is_ge Lblis_lt Lbl S1 S2 => i_fetch S1 S2 | i_is_lt Lblis_eq Lbl S1 S2 => i_fetch S1 S2 | i_is_eq Lblis_ne Lbl S1 S2 => i_fetch S1 S2 | i_is_ne Lblis_eq_exact Lbl=f S1 S2 => i_fetch S1 S2 | i_is_eq_exact Lblis_ne_exact Lbl S1 S2 => i_fetch S1 S2 | i_is_ne_exact Lbli_is_lt fi_is_ge fi_is_eq fi_is_ne fi_is_eq_exact fi_is_ne_exact f%macro: i_is_eq_const Equal -fail_actioni_is_eq_const f r ci_is_eq_const f x ci_is_eq_const f y c## Putting things.#put_tuple u==0 Dst => i_put_tuple_only u Dstput_tuple Arity Dst | put V=o => i_put_tuple_only Arity Dst | i_put_float V x | put xput_tuple Arity Dst | put V=w => i_put_tuple_only Arity Dst | i_put_big V x | put xput_tuple Arity Dst | put V => i_put_tuple Arity V Dsti_put_tuple_only A d%macro: i_put_tuple PutTuple -packi_put_tuple A x xi_put_tuple A y xi_put_tuple A r xi_put_tuple A n xi_put_tuple A c xi_put_tuple A x yi_put_tuple A x ri_put_tuple A y ri_put_tuple A n ri_put_tuple A c r%coldi_put_tuple A r yi_put_tuple A r ri_put_tuple A y yi_put_tuple A c y%hotput_list S1=w S2=w Dst => i_put_big S1 x | i_put_big S2 Dst | put_list x Dst Dstput_list S1=w S2 Dst => i_put_big S1 x | put_list x S2 Dstput_list S1 S2=w Dst => i_put_big S2 x | put_list S1 x Dstput_list S1=o S2=o Dst => i_put_float S1 x | i_put_float S2 Dst | put_list x Dst Dstput_list S1=o S2 Dst => i_put_float S1 x | put_list x S2 Dstput_list S1 S2=o Dst => i_put_float S2 x | put_list S1 x Dst%macro:put_list PutList -pack -gen_destput_list x n xput_list y n xput_list x x xput_list y x xput_list c x xput_list c n xput_list c x rput_list x x rput_list y r rput_list c n rput_list y y xput_list x y xput_list r x xput_list r y xput_list r x rput_list y y rput_list c y xput_list y r xput_list r n xput_list c r x%coldput_list x n rput_list x r rput_list r n rput_list s s d%hotput S=o => i_put_float S x | put xput S=w => i_put_big S x | put x%macro: put Putput xput rput yput cput n%macro: i_fetch FetchArgs -pack

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -