diff options
author | Björn Gustavsson <[email protected]> | 2010-04-22 15:18:13 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-05-11 08:53:27 +0200 |
commit | d60f055697cfe8e7f94be4d291d49bb00a66bc52 (patch) | |
tree | 0db2f8a0ae0737e3f58460b2b1fccdae525b6c9b /lib | |
parent | ea0f50dfbc8ec99820b81f99be81ada727bb3cf8 (diff) | |
download | otp-d60f055697cfe8e7f94be4d291d49bb00a66bc52.tar.gz otp-d60f055697cfe8e7f94be4d291d49bb00a66bc52.tar.bz2 otp-d60f055697cfe8e7f94be4d291d49bb00a66bc52.zip |
Introduce the new recv_mark/1 and recv_mark/1 instructions
Make the recv_mark/1 and recv_mark/1 instructions known to the
compiler and run-time system. For the moment, make the loader ignore
any occurrences of those instructions in BEAM files.
Also update hipe_beam_to_icode to ignore those instructions.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compiler/src/beam_disasm.erl | 8 | ||||
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 5 | ||||
-rw-r--r-- | lib/compiler/src/genop.tab | 5 | ||||
-rw-r--r-- | lib/hipe/icode/hipe_beam_to_icode.erl | 5 |
4 files changed, 23 insertions, 0 deletions
diff --git a/lib/compiler/src/beam_disasm.erl b/lib/compiler/src/beam_disasm.erl index c956f2f000..a66bd2a23a 100644 --- a/lib/compiler/src/beam_disasm.erl +++ b/lib/compiler/src/beam_disasm.erl @@ -1096,6 +1096,14 @@ resolve_inst({on_load,[]},_,_,_) -> on_load; %% +%% R14A. +%% +resolve_inst({recv_mark,[Lbl]},_,_,_) -> + {recv_mark,Lbl}; +resolve_inst({recv_set,[Lbl]},_,_,_) -> + {recv_set,Lbl}; + +%% %% Catches instructions that are not yet handled. %% resolve_inst(X,_,_,_) -> ?exit({resolve_inst,X}). diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index 1fd61831e0..34065cfdce 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -416,6 +416,11 @@ valfun_1({put,Src}, Vst) -> valfun_1({put_string,Sz,_,Dst}, Vst0) when is_integer(Sz) -> Vst = eat_heap(2*Sz, Vst0), set_type_reg(cons, Dst, Vst); +%% Instructions for optimization of selective receives. +valfun_1({recv_mark,{f,Fail}}, Vst) when is_integer(Fail) -> + Vst; +valfun_1({recv_set,{f,Fail}}, Vst) when is_integer(Fail) -> + Vst; %% Misc. valfun_1({'%live',Live}, Vst) -> verify_live(Live, Vst), diff --git a/lib/compiler/src/genop.tab b/lib/compiler/src/genop.tab index 47e6e72402..b57508ea8e 100644 --- a/lib/compiler/src/genop.tab +++ b/lib/compiler/src/genop.tab @@ -274,3 +274,8 @@ BEAM_FORMAT_NUMBER=0 # R13B03 149: on_load/0 + +# R14A + +150: recv_mark/1 +151: recv_set/1 diff --git a/lib/hipe/icode/hipe_beam_to_icode.erl b/lib/hipe/icode/hipe_beam_to_icode.erl index 3923e98673..f24cf90ae2 100644 --- a/lib/hipe/icode/hipe_beam_to_icode.erl +++ b/lib/hipe/icode/hipe_beam_to_icode.erl @@ -431,6 +431,11 @@ trans_fun([{wait_timeout,{_,Lbl},Reg}|Instructions], Env) -> SuspTmout = hipe_icode:mk_if(suspend_msg_timeout,[], map_label(Lbl),hipe_icode:label_name(DoneLbl)), Movs ++ [SetTmout, SuspTmout, DoneLbl | trans_fun(Instructions,Env1)]; +%%--- mark_recv/1 & mark_set/1 --- +trans_fun([{mark_recv,{f,_}}|Instructions], Env) -> + trans_fun(Instructions,Env); +trans_fun([{mark_set,{f,_}}|Instructions], Env) -> + trans_fun(Instructions,Env); %%-------------------------------------------------------------------- %%--- Translation of arithmetics {bif,ArithOp, ...} --- %%-------------------------------------------------------------------- |