1
1
%% -*- erlang-indent-level: 2 -*-
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6
%% hipe_sparc_registers.erl
8
%% See OTP/erts/emulator/hipe/hipe_sparc_abi.txt
4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6
%% File: hipe_sparc_registers.erl
9
%% See the file: OTP_DIR/erts/emulator/hipe/hipe_sparc_abi.txt
11
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11
13
-module(hipe_sparc_registers).
13
15
-export([reg_name/1,
24
%% number_of_physical/0,
169
170
%% Pre-allocated registers.
171
-define(STACK_POINTER,?SPARC_REG_NSP).
172
-define(STACK_LIMIT,?SPARC_REG_NSP_LIMIT).
173
-define(HEAP_POINTER,?SPARC_REG_HP).
174
-define(HEAP_LIMIT,?SPARC_REG_HP_LIMIT).
175
-define(PROC_POINTER,?SPARC_REG_P).
176
-define(FCALLS,?SPARC_REG_FCALLS).
177
-define(RETURN_ADDRESS,?SPARC_REG_RA).
178
-define(ARG0,?SPARC_REG_ARG0).
179
-define(ARG1,?SPARC_REG_ARG1).
180
-define(ARG2,?SPARC_REG_ARG2).
181
-define(ARG3,?SPARC_REG_ARG3).
182
-define(ARG4,?SPARC_REG_ARG4).
183
-define(ARG5,?SPARC_REG_ARG5).
184
-define(ARG6,?SPARC_REG_ARG6).
185
-define(ARG7,?SPARC_REG_ARG7).
186
-define(ARG8,?SPARC_REG_ARG8).
187
-define(ARG9,?SPARC_REG_ARG9).
188
-define(ARG10,?SPARC_REG_ARG10).
189
-define(ARG11,?SPARC_REG_ARG11).
190
-define(ARG12,?SPARC_REG_ARG12).
191
-define(ARG13,?SPARC_REG_ARG13).
192
-define(ARG14,?SPARC_REG_ARG14).
193
-define(ARG15,?SPARC_REG_ARG15).
194
-define(TEMP0,?SPARC_REG_TEMP0).%% used in emu <-> native transitions
195
-define(TEMP1,?SPARC_REG_TEMP1). %% used in emu <-> native transitions
196
-define(TEMP2,?SPARC_REG_TEMP2). %% used in emu <-> native transitions
197
-define(TEMP3,?SPARC_REG_TEMP3).
172
-define(STACK_POINTER,?I3).
173
-define(STACK_LIMIT,?I4).
174
-define(HEAP_POINTER,?I1).
175
-define(HEAP_LIMIT,?I2).
176
-define(PROC_POINTER,?I0).
178
-define(RETURN_ADDRESS,?O7).
184
-define(ARG5,?O0). %% also retval
185
-define(TEMP0,?G1). %% used in emu <-> native transitions
186
-define(TEMP1,?L7). %% used in emu <-> native transitions
187
-define(TEMP2,?L6). %% used in emu <-> native transitions
199
-define(CPSAVE, ?SPARC_REG_TEMP2). %% used in calls to inc_stack.
200
-define(CPLINK, ?SPARC_REG_TEMP1). %% see hipe_sparc_glue.S
190
-define(CPSAVE, ?TEMP2). %% used in calls to inc_stack.
203
193
%% The lowest of the virtual registers.
208
198
%% The number of physical registers
210
number_of_physical() -> ?NR_PHYSICAL.
213
%% True if a register number is precolored.
215
is_precolored(X) -> X =< ?LAST_PRECOLOURED.
218
%% The precolored registers.
200
%% number_of_physical() -> ?NR_PHYSICAL.
203
%% True if a register number is precoulored.
205
is_precoloured(X) -> X =< ?LAST_PRECOLOURED.
208
%% The precoloured registers.
220
210
stack_pointer() -> ?STACK_POINTER.
221
211
stack_limit() -> ?STACK_LIMIT.
311
%% To discourage the regalloc from using argument registers they
312
%% are placed at the end. This should be handled somewhere else.
313
[?TEMP3, ?TEMP2, ?TEMP1, ?ARG14, ?ARG13, ?ARG12,
314
?ARG11, ?ARG10, ?ARG9, ?ARG8, ?ARG7, ?ARG6, ?ARG5,
315
?ARG4, ?ARG3, ?ARG2, ?ARG1, ?ARG0, ?ARG15 ].
280
%% To discourage the regalloc from using argument registers they
281
%% are placed at the end. This should be handled somewhere else.
282
%% XXX: this order has no effect on the iterated coalescing regalloc
283
[?TEMP3, ?TEMP2, ?TEMP1, ?I7, ?G5, ?G4,
284
?G3, ?G2, ?L4, ?L3, ?L2, ?L1, ?L0,
285
?ARG4, ?ARG3, ?ARG2, ?ARG1, ?ARG0, ?O0].
318
288
%% Fixed registers.
350
%% A list of all precolored regs
311
%% A list of all precoulored regs
314
[?G0,?G1,?G2,?G3,?G4,?G5,?G6,?G7,
315
?O0,?O1,?O2,?O3,?O4,?O5,?O6,?O7,
316
?L0,?L1,?L2,?L3,?L4,?L5,?L6,?L7,
317
?I0,?I1,?I2,?I3,?I4,?I5,?I6,?I7,
318
?ICC,?XCC,?FCC0,?FCC1,?FCC2,?FCC3,?Y].
387
321
%% The number of arguments that are passed in registers.
389
register_args() -> ?SPARC_ARGS_IN_REGS.
390
register_rets() -> ?SPARC_ARGS_IN_REGS.
323
register_args() -> ?SPARC_NR_ARG_REGS.
324
register_rets() -> ?SPARC_NR_ARG_REGS.
393
%% The actual register number a precolored register should use.
327
%% The actual register number a precoulored register should use.
394
328
physical_name(P) -> P.