aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/regalloc/hipe_temp_map.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hipe/regalloc/hipe_temp_map.erl')
-rw-r--r--lib/hipe/regalloc/hipe_temp_map.erl125
1 files changed, 125 insertions, 0 deletions
diff --git a/lib/hipe/regalloc/hipe_temp_map.erl b/lib/hipe/regalloc/hipe_temp_map.erl
new file mode 100644
index 0000000000..85678edd54
--- /dev/null
+++ b/lib/hipe/regalloc/hipe_temp_map.erl
@@ -0,0 +1,125 @@
+%% -*- erlang-indent-level: 2 -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%%
+%% 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 online 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.
+%%
+%% %CopyrightEnd%
+%%
+%% ===========================================================================
+%% Copyright (c) 2001 by Erik Johansson. All Rights Reserved
+%% Time-stamp: <2008-04-20 14:54:00 richard>
+%% ===========================================================================
+%% Module : hipe_temp_map
+%% Purpose :
+%% Notes :
+%% History : * 2001-07-24 Erik Johansson ([email protected]): Created.
+%% ===========================================================================
+%% Exports :
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-module(hipe_temp_map).
+
+-export([cols2tuple/2, is_spilled/2, to_substlist/1]).
+
+-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 1
+%%----------------------------------------------------------------------------
+
+-spec cols2tuple(hipe_map(), atom()) -> hipe_temp_map().
+
+cols2tuple(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 sparse, make up some placeholders...
+ Val =
+ case Target:is_precoloured(N) of
+ %% If it is precoloured, we know what to map it to.
+ true -> {reg, N};
+ false -> unknown
+ end,
+ cols2tuple(N+1, SourceMapping, [Val|Vs], Target).
+
+%%
+%% True if temp Temp is spilled.
+%%
+-spec is_spilled(non_neg_integer(), hipe_temp_map()) -> boolean().
+
+is_spilled(Temp, Map) ->
+ case element(Temp+1, Map) of
+ {reg, _R} -> false;
+ {fp_reg, _R}-> false;
+ {spill, _N} -> true;
+ unknown -> false
+ 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
+%% end.
+%%
+%% %% True if temp Temp is allocated to a fp_reg.
+%% in_fp_reg(Temp, Map) ->
+%% case element(Temp+1, Map) of
+%% {fp_reg, _R} -> true;
+%% {reg, _R} -> false;
+%% {spill, _N} -> false;
+%% unknown -> false
+%% end.
+%%
+%% %% Returns the inf temp Temp is mapped to.
+%% find(Temp, Map) -> element(Temp+1, Map).
+
+
+%%
+%% Converts a temp_map tuple back to a (sorted) key-list.
+%%
+-spec to_substlist(hipe_temp_map()) -> hipe_map().
+
+to_substlist(Map) ->
+ T = tuple_to_list(Map),
+ mapping(T, 0).
+
+mapping([R|Rs], Temp) ->
+ [{Temp, R}| mapping(Rs, Temp+1)];
+mapping([], _) ->
+ [].