~ubuntu-branches/debian/squeeze/erlang/squeeze

« back to all changes in this revision

Viewing changes to lib/hipe/regalloc/hipe_ppc_specific.erl

  • Committer: Bazaar Package Importer
  • Author(s): Erlang Packagers, Sergei Golovan
  • Date: 2006-12-03 17:07:44 UTC
  • mfrom: (2.1.11 feisty)
  • Revision ID: james.westby@ubuntu.com-20061203170744-rghjwupacqlzs6kv
Tags: 1:11.b.2-4
[ Sergei Golovan ]
Fixed erlang-base and erlang-base-hipe prerm scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
%%% -*- erlang-indent-level: 2 -*-
 
2
%%% $Id$
 
3
 
 
4
-module(hipe_ppc_specific).
 
5
 
 
6
%% for hipe_coalescing_regalloc:
 
7
-export([number_of_temporaries/1
 
8
         ,analyze/1
 
9
         ,labels/1
 
10
         ,all_precoloured/0
 
11
         ,bb/2
 
12
         ,liveout/2
 
13
         ,reg_nr/1
 
14
         ,def_use/1
 
15
         ,is_move/1
 
16
         ,is_precoloured/1
 
17
         ,var_range/1
 
18
         ,allocatable/0
 
19
         ,non_alloc/1
 
20
         ,physical_name/1
 
21
         ,reverse_postorder/1
 
22
         ,succ_map/1
 
23
         ,livein/2
 
24
         ,uses/1
 
25
         ,defines/1
 
26
        ]).
 
27
 
 
28
%% for hipe_graph_coloring_regalloc:
 
29
-export([is_fixed/1]).
 
30
 
 
31
%% for hipe_ls_regalloc:
 
32
-export([args/1, is_arg/1, is_global/1, new_spill_index/1]).
 
33
-export([breadthorder/1, postorder/1]).
 
34
 
 
35
%% callbacks for hipe_regalloc_loop
 
36
-export([defun_to_cfg/1,
 
37
         check_and_rewrite/2]).
 
38
 
 
39
defun_to_cfg(Defun) ->
 
40
  hipe_ppc_cfg:init(Defun).
 
41
 
 
42
check_and_rewrite(Defun, Coloring) ->
 
43
  hipe_ppc_ra_postconditions:check_and_rewrite(Defun, Coloring, 'normal').
 
44
 
 
45
reverse_postorder(CFG) ->
 
46
  hipe_ppc_cfg:reverse_postorder(CFG).
 
47
 
 
48
non_alloc(CFG) ->
 
49
  non_alloc(hipe_ppc_registers:nr_args(), hipe_ppc_cfg:params(CFG)).
 
50
 
 
51
%% same as hipe_ppc_frame:fix_formals/2
 
52
non_alloc(0, Rest) -> Rest;
 
53
non_alloc(N, [_|Rest]) -> non_alloc(N-1, Rest);
 
54
non_alloc(_, []) -> [].
 
55
 
 
56
%% Liveness stuff
 
57
 
 
58
analyze(CFG) ->
 
59
  hipe_ppc_liveness_gpr:analyse(CFG).
 
60
 
 
61
livein(Liveness,L) ->
 
62
  [X || X <- hipe_ppc_liveness_gpr:livein(Liveness,L),
 
63
        hipe_ppc:temp_is_allocatable(X)].
 
64
 
 
65
liveout(BB_in_out_liveness,Label) ->
 
66
  [X || X <- hipe_ppc_liveness_gpr:liveout(BB_in_out_liveness,Label),
 
67
        hipe_ppc:temp_is_allocatable(X)].
 
68
 
 
69
%% Registers stuff
 
70
 
 
71
allocatable() ->
 
72
  hipe_ppc_registers:allocatable_gpr().
 
73
 
 
74
all_precoloured() ->
 
75
  hipe_ppc_registers:all_precoloured().
 
76
 
 
77
is_precoloured(Reg) ->
 
78
  hipe_ppc_registers:is_precoloured_gpr(Reg).
 
79
 
 
80
is_fixed(R) ->
 
81
  hipe_ppc_registers:is_fixed(R).
 
82
 
 
83
physical_name(Reg) ->
 
84
  Reg.
 
85
 
 
86
%% CFG stuff
 
87
 
 
88
succ_map(CFG) ->
 
89
  hipe_ppc_cfg:succ_map(CFG).
 
90
 
 
91
labels(CFG) ->
 
92
  hipe_ppc_cfg:labels(CFG).
 
93
 
 
94
var_range(_CFG) ->
 
95
  hipe_gensym:var_range(ppc).
 
96
 
 
97
number_of_temporaries(_CFG) ->
 
98
  Highest_temporary = hipe_gensym:get_var(ppc),
 
99
  %% Since we can have temps from 0 to Max adjust by +1.
 
100
  Highest_temporary + 1.
 
101
 
 
102
bb(CFG,L) ->
 
103
  hipe_ppc_cfg:bb(CFG,L).
 
104
 
 
105
%% PowerPC stuff
 
106
 
 
107
def_use(Instruction) ->
 
108
  {defines(Instruction), uses(Instruction)}.
 
109
 
 
110
uses(I) ->
 
111
  [X || X <- hipe_ppc_defuse:insn_use_gpr(I),
 
112
        hipe_ppc:temp_is_allocatable(X)].
 
113
 
 
114
defines(I) ->
 
115
  [X || X <- hipe_ppc_defuse:insn_def_gpr(I),
 
116
        hipe_ppc:temp_is_allocatable(X)].
 
117
 
 
118
is_move(Instruction) ->
 
119
  case hipe_ppc:is_pseudo_move(Instruction) of
 
120
    true ->
 
121
      Dst = hipe_ppc:pseudo_move_dst(Instruction),
 
122
      case hipe_ppc:temp_is_allocatable(Dst) of
 
123
        false -> false;
 
124
        _ ->
 
125
          Src = hipe_ppc:pseudo_move_src(Instruction),
 
126
          hipe_ppc:temp_is_allocatable(Src)
 
127
      end;
 
128
    false -> false
 
129
  end.
 
130
 
 
131
reg_nr(Reg) ->
 
132
  hipe_ppc:temp_reg(Reg).
 
133
 
 
134
%%% Linear Scan stuff
 
135
 
 
136
new_spill_index(SpillIndex) when is_integer(SpillIndex) ->
 
137
  SpillIndex+1.
 
138
 
 
139
breadthorder(CFG) ->
 
140
  hipe_ppc_cfg:breadthorder(CFG).
 
141
 
 
142
postorder(CFG) ->
 
143
  hipe_ppc_cfg:postorder(CFG).
 
144
 
 
145
is_global(R) ->
 
146
  R =:= hipe_ppc_registers:temp1() orelse
 
147
  R =:= hipe_ppc_registers:temp2() orelse
 
148
  R =:= hipe_ppc_registers:temp3() orelse
 
149
  hipe_ppc_registers:is_fixed(R).
 
150
 
 
151
is_arg(R) ->
 
152
  hipe_ppc_registers:is_arg(R).
 
153
 
 
154
args(CFG) ->
 
155
  hipe_ppc_registers:args(hipe_ppc_cfg:arity(CFG)).