hipe_temp_map.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 164 行

ERL
164
字号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Copyright (c) 2001 by Erik Johansson.  All Rights Reserved %% Time-stamp: <02/05/28 15:46:26 happi>%% ====================================================================%%  Filename : 	hipe_temp_map.erl%%  Module   :	hipe_temp_map%%  Purpose  :  %%  Notes    : %%  History  :	* 2001-07-24 Erik Johansson (happi@csd.uu.se): %%               Created.%%  CVS      :%%              $Author: kostis $%%              $Date: 2007/05/12 09:31:03 $%%              $Revision: 1.10 $%% ====================================================================%%  Exports  :%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-module(hipe_temp_map).-export([cols2tuple/2, is_spilled/2, %% sorted_cols2tuple/2,	 in_reg/2, in_fp_reg/2, find/2, to_substlist/1]).%%-define(DO_ASSERT,true).-include("../main/hipe.hrl").%%%% Convert a list of [{R0, C1}, {R1, C2}, ...} to a temp_map%% (Currently implemented as a tuple) tuple {C1, C2, ...}.%%%% The indices (Ri) must be unique but do not have to be sorted and %% they can be sparse.%% Note that the first allowed index is 0 -- this will be mapped to %% element 1cols2tuple(Map, Target) ->  ?ASSERT(check_list(Map)),  SortedMap = lists:keysort(1, Map),   cols2tuple(0, SortedMap, [], Target). %% sorted_cols2tuple(Map, Target) ->%%   ?ASSERT(check_list(Map)),%%   ?ASSERT(Map =:= lists:keysort(1, Map)),%%   cols2tuple(0, Map, [], Target). %% Build a dense mapping cols2tuple(_, [], Vs, _) ->  %% Done reverse the list and convert to tuple.  list_to_tuple(lists:reverse(Vs));cols2tuple(N, [{R, C}|Ms], Vs, Target) when N =:= R ->  %% N makes sure the mapping is dense. N is he next key.  cols2tuple(N+1, Ms, [C|Vs], Target);cols2tuple(N, SourceMapping, Vs, Target) ->  %% The source was sparce, make up some placeholders...  Val = 	          case Target:is_precoloured(N) of      %% If it is precoloured, we know what to map it to.      true -> 	case Target of	  hipe_sparc_specific_fp -> {fp_reg, N};	  _ -> {reg, N}	end;      false -> unknown    end,  cols2tuple(N+1, SourceMapping, [Val|Vs], Target).-ifdef(DO_ASSERT).%% True if temp Temp is spilled.is_spilled(Temp, Map) ->  case catch element(Temp+1, Map) of    {reg, _R} -> false;    {fp_reg, _R}-> false;    {spill, _N} -> true;    unknown -> false;    Error -> ?EXIT({bad_temp_map, Temp, Map, Error}) end.%% True if temp Temp is allocated to a reg.in_reg(Temp, Map) ->  case catch element(Temp+1, Map) of    {reg, _R} -> true;    {fp_reg, _R} -> false;    {spill, _N} -> false;    unknown -> false;    _ -> ?EXIT({bad_temp_map, Temp, Map})  end.       %% True if temp Temp is allocated to a fp_reg.in_fp_reg(Temp, Map) ->  case catch element(Temp+1, Map) of    {fp_reg, _R} -> true;    {reg, _R} -> false;    {spill, _N} -> false;    unknown -> false;    _ -> ?EXIT({bad_temp_map, Temp, Map})  end.%% Returns the inf temp Temp is mapped to.find(Temp, Map) ->  case catch element(Temp+1, Map) of    {'EXIT',_} ->      ?EXIT({bad_temp_map, Temp, Map});    Val -> Val  end.-else. %% No assert%% True if temp Temp is spilled.is_spilled(Temp, Map) ->  case element(Temp+1, Map) of    {reg, _R} -> false;    {fp_reg, _R}-> false;    {spill, _N} -> true;    unknown -> false;    _ -> ?EXIT({bad_temp_map, Temp, Map})  end.    %% True if temp Temp is allocated to a reg.in_reg(Temp, Map) ->  case element(Temp+1, Map) of    {reg, _R} -> true;    {fp_reg, _R}-> false;    {spill, _N} -> false;    unknown -> false;    _ -> ?EXIT({bad_temp_map, Temp, Map})  end.       %% True if temp Temp is allocated to a fp_reg.in_fp_reg(Temp, Map) ->  case catch element(Temp+1, Map) of    {fp_reg, _R} -> true;    {reg, _R} -> false;    {spill, _N} -> false;    unknown -> false;    _ -> ?EXIT({bad_temp_map, Temp, Map})  end.%% Returns the inf temp Temp is mapped to.find(Temp, Map) -> element(Temp+1, Map).-endif.%% Converts a temp_map tuple back to a (sorted) key-list.to_substlist(Map) ->  T = tuple_to_list(Map),  mapping(T,0).mapping([R|Rs], Temp) ->  [{Temp, R}| mapping(Rs, Temp+1)];mapping([], _ ) -> [].-ifdef(DO_ASSERT).check_list([{I,_}|Rest]) ->  is_integer(I) andalso (I >= 0) andalso    no_dups(I,Rest) andalso check_list(Rest);check_list([])       -> true;check_list(_)        -> false.no_dups(I,[{I,_}|_]) -> false;no_dups(I,[_|Rest]) ->  no_dups(I,Rest);no_dups(_,[]) ->        true.-endif.

⌨️ 快捷键说明

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