File: hipe_temp_map.erl

package info (click to toggle)
erlang 1%3A11.b.2-4
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 54,332 kB
  • ctags: 138,013
  • sloc: erlang: 566,932; ansic: 185,450; makefile: 14,148; java: 7,835; sh: 7,307; lisp: 5,249; pascal: 3,225; perl: 2,290; asm: 1,325; cpp: 306; tcl: 245; csh: 29; python: 21; sed: 9
file content (164 lines) | stat: -rw-r--r-- 4,517 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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: 2004/01/23 21:34:53 $
%%              $Revision: 1.9 $
%% ====================================================================
%%  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 1

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 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.