1
%%% -*- erlang-indent-level: 2 -*-
4
-module(hipe_arm_specific).
6
%% for hipe_coalescing_regalloc:
7
-export([number_of_temporaries/1
28
%% for hipe_graph_coloring_regalloc:
29
-export([is_fixed/1]).
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]).
35
%% callbacks for hipe_regalloc_loop
36
-export([defun_to_cfg/1,
37
check_and_rewrite/2]).
39
defun_to_cfg(Defun) ->
40
hipe_arm_cfg:init(Defun).
42
check_and_rewrite(Defun, Coloring) ->
43
hipe_arm_ra_postconditions:check_and_rewrite(Defun, Coloring, 'normal').
45
reverse_postorder(CFG) ->
46
hipe_arm_cfg:reverse_postorder(CFG).
49
non_alloc(hipe_arm_registers:nr_args(), hipe_arm_cfg:params(CFG)).
51
%% same as hipe_arm_frame:fix_formals/2
52
non_alloc(0, Rest) -> Rest;
53
non_alloc(N, [_|Rest]) -> non_alloc(N-1, Rest);
54
non_alloc(_, []) -> [].
59
hipe_arm_liveness_gpr:analyse(CFG).
62
[X || X <- hipe_arm_liveness_gpr:livein(Liveness,L),
63
hipe_arm:temp_is_allocatable(X)].
65
liveout(BB_in_out_liveness,Label) ->
66
[X || X <- hipe_arm_liveness_gpr:liveout(BB_in_out_liveness,Label),
67
hipe_arm:temp_is_allocatable(X)].
72
hipe_arm_registers:allocatable_gpr().
75
hipe_arm_registers:all_precoloured().
77
is_precoloured(Reg) ->
78
hipe_arm_registers:is_precoloured_gpr(Reg).
81
hipe_arm_registers:is_fixed(R).
89
hipe_arm_cfg:succ_map(CFG).
92
hipe_arm_cfg:labels(CFG).
95
hipe_gensym:var_range(arm).
97
number_of_temporaries(_CFG) ->
98
Highest_temporary = hipe_gensym:get_var(arm),
99
%% Since we can have temps from 0 to Max adjust by +1.
100
Highest_temporary + 1.
103
hipe_arm_cfg:bb(CFG,L).
107
def_use(Instruction) ->
108
{defines(Instruction), uses(Instruction)}.
111
[X || X <- hipe_arm_defuse:insn_use_gpr(I),
112
hipe_arm:temp_is_allocatable(X)].
115
[X || X <- hipe_arm_defuse:insn_def_gpr(I),
116
hipe_arm:temp_is_allocatable(X)].
118
is_move(Instruction) ->
119
case hipe_arm:is_pseudo_move(Instruction) of
121
Dst = hipe_arm:pseudo_move_dst(Instruction),
122
case hipe_arm:temp_is_allocatable(Dst) of
125
Src = hipe_arm:pseudo_move_src(Instruction),
126
hipe_arm:temp_is_allocatable(Src)
132
hipe_arm:temp_reg(Reg).
134
%%% Linear Scan stuff
136
new_spill_index(SpillIndex) when is_integer(SpillIndex) ->
140
hipe_arm_cfg:breadthorder(CFG).
143
hipe_arm_cfg:postorder(CFG).
146
R =:= hipe_arm_registers:temp1() orelse
147
R =:= hipe_arm_registers:temp2() orelse
148
R =:= hipe_arm_registers:temp3() orelse
149
hipe_arm_registers:is_fixed(R).
152
hipe_arm_registers:is_arg(R).
155
hipe_arm_registers:args(hipe_arm_cfg:arity(CFG)).