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

« back to all changes in this revision

Viewing changes to lib/hipe/sparc/hipe_sparc_registers.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
1
%% -*- erlang-indent-level: 2 -*-
2
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
3
%% $Id$
4
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5
 
%%
6
 
%% hipe_sparc_registers.erl
7
 
%%
8
 
%% See OTP/erts/emulator/hipe/hipe_sparc_abi.txt
9
 
%%
 
4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
5
%%
 
6
%% File: hipe_sparc_registers.erl
 
7
%%
 
8
%% @doc
 
9
%% See the file: OTP_DIR/erts/emulator/hipe/hipe_sparc_abi.txt
 
10
%% @end
 
11
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10
12
 
11
13
-module(hipe_sparc_registers).
12
14
 
13
15
-export([reg_name/1,
14
16
         fpreg_name/1,
15
17
         first_virtual/0,
16
 
         call_clobbered/0,
17
 
         is_precolored/1,
18
 
         all_precolored/0,
 
18
         %% call_clobbered/0,
 
19
         is_precoloured/1,
 
20
         all_precoloured/0,
19
21
         allocatable/0,
20
22
         is_fixed/1,
21
 
         fixed/0,
22
 
         number_of_physical/0,
 
23
         %% fixed/0,
 
24
         %% number_of_physical/0,
23
25
         register_args/0,
24
26
         register_rets/0,
25
27
         physical_name/1,
34
36
         zero/0,
35
37
         icc/0,
36
38
         xcc/0,
37
 
         fcc/1,
38
 
         y/0,
 
39
         %% fcc/1,
 
40
         %% y/0,
39
41
         arg/1,
40
42
         ret/1,
41
43
         temp0/0,
42
44
         temp1/0,
43
45
         temp2/0,
44
 
         temp3/0,
 
46
         %% temp3/0,
45
47
         cpsave/0,
46
 
         cplink/0]).
 
48
         alignment/0
 
49
        ]).
47
50
 
48
51
-include("../rtl/hipe_literals.hrl").
49
52
 
53
56
%% Numbers 0..38 denote physical registers:
54
57
%%      0..31 denote the standard integer registers.
55
58
%%      32 and 33 denote icc and xcc.
56
 
%%            34 to 37 denotes fcc0 to fcc3
57
 
%%      38 denote the y register.
 
59
%%            34 to 37 denote fcc0 to fcc3
 
60
%%      38 denotes the y register.
58
61
%% Numbers > 38 denote virtual registers
59
62
%%
60
63
 
104
107
-define(LAST_PRECOLOURED,38).
105
108
 
106
109
 
107
 
call_clobbered() ->
108
 
  allocatable().
109
 
%% -- [temp0(),temp1(),temp2(),temp3()].
110
 
%  lists:seq(0,?LAST_PRECOLOURED).
 
110
%% call_clobbered() ->
 
111
%%   allocatable().
111
112
 
112
113
 
113
114
%%
168
169
%%
169
170
%% Pre-allocated registers.
170
171
%%
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).
 
177
-define(FCALLS,?I5).
 
178
-define(RETURN_ADDRESS,?O7).
 
179
-define(ARG0,?O1).
 
180
-define(ARG1,?O2).
 
181
-define(ARG2,?O3).
 
182
-define(ARG3,?O4).
 
183
-define(ARG4,?O5).
 
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
 
188
-define(TEMP3,?L5).
198
189
 
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.
201
191
 
202
192
%%
203
193
%% The lowest of the virtual registers.
207
197
%%
208
198
%% The number of physical registers
209
199
%%
210
 
number_of_physical() -> ?NR_PHYSICAL.
211
 
 
212
 
%%
213
 
%% True if a register number is precolored.
214
 
%%
215
 
is_precolored(X) -> X =< ?LAST_PRECOLOURED.
216
 
 
217
 
%%
218
 
%% The precolored registers.
 
200
%% number_of_physical() -> ?NR_PHYSICAL.
 
201
 
 
202
%%
 
203
%% True if a register number is precoulored.
 
204
%%
 
205
is_precoloured(X) -> X =< ?LAST_PRECOLOURED.
 
206
 
 
207
%%
 
208
%% The precoloured registers.
219
209
%%
220
210
stack_pointer() -> ?STACK_POINTER.
221
211
stack_limit() -> ?STACK_LIMIT.
226
216
return_address() -> ?RETURN_ADDRESS.
227
217
icc() -> ?ICC.
228
218
xcc() -> ?XCC.
229
 
fcc(N) -> 
230
 
  case N of
231
 
    0 -> ?FCC0;
232
 
    1 -> ?FCC1;
233
 
    2 -> ?FCC2;
234
 
    3 -> ?FCC3
235
 
  end.
236
 
y() -> ?Y.
 
219
%% fcc(N) -> 
 
220
%%   case N of
 
221
%%     0 -> ?FCC0;
 
222
%%     1 -> ?FCC1;
 
223
%%     2 -> ?FCC2;
 
224
%%     3 -> ?FCC3
 
225
%%   end.
 
226
%% y() -> ?Y.
237
227
zero() -> ?Z.
238
228
arg(X) ->
239
229
   case X of
243
233
      3 -> ?ARG3;
244
234
      4 -> ?ARG4;
245
235
      5 -> ?ARG5;
246
 
      6 -> ?ARG6;
247
 
      7 -> ?ARG7;
248
 
      8 -> ?ARG8;
249
 
      9 -> ?ARG9;
250
 
      10 -> ?ARG10;
251
 
      11 -> ?ARG11;
252
 
      12 -> ?ARG12;
253
 
      13 -> ?ARG13;
254
 
      14 -> ?ARG14;
255
 
      15 -> ?ARG15;
256
236
      Other -> exit({?MODULE, {"Argument out of range", Other}})
257
237
   end.
258
238
 
259
239
ret(X) ->
260
240
   case X of
261
 
      0 -> ?ARG15;
 
241
      0 -> ?ARG5;
262
242
      1 -> ?ARG0;
263
243
      2 -> ?ARG1;
264
244
      3 -> ?ARG2;
265
245
      4 -> ?ARG3;
266
246
      5 -> ?ARG4;
267
 
      6 -> ?ARG5;
268
 
      7 -> ?ARG6;
269
 
      8 -> ?ARG7;
270
 
      9 -> ?ARG8;
271
 
      10 -> ?ARG9;
272
 
      11 -> ?ARG10;
273
 
      12 -> ?ARG11;
274
 
      13 -> ?ARG12;
275
 
      14 -> ?ARG13;
276
 
      15 -> ?ARG14;
277
247
      Other -> exit({?MODULE, {"Ret value of range", Other}})
278
248
   end.
279
249
temp0() -> ?TEMP0.
280
250
temp1() -> ?TEMP1.
281
251
temp2() -> ?TEMP2.
282
 
temp3() -> ?TEMP3.
 
252
%% temp3() -> ?TEMP3.
283
253
cpsave() -> ?CPSAVE.
284
 
cplink() -> ?CPLINK.
285
254
  
286
255
 
287
256
%%
308
277
%%
309
278
 
310
279
allocatable() ->
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].
316
286
 
317
287
%%
318
288
%% Fixed registers.
326
296
is_fixed(?RETURN_ADDRESS) -> true;
327
297
is_fixed(_) -> false.
328
298
 
329
 
fixed() ->
330
 
  [?STACK_POINTER, 
331
 
   ?STACK_LIMIT,
332
 
   ?HEAP_POINTER,
333
 
   ?HEAP_LIMIT,
334
 
   ?PROC_POINTER,
335
 
   ?FCALLS,
336
 
   ?RETURN_ADDRESS].
337
 
 
338
299
%%
339
300
%% Global registers. Always live, never saved in call frames.
340
301
%%
347
308
    ?FCALLS].
348
309
 
349
310
%%
350
 
%% A list of all precolored regs
 
311
%% A list of all precoulored regs
351
312
%%
352
 
all_precolored() ->
353
 
   [?STACK_POINTER,
354
 
    ?STACK_LIMIT,
355
 
    ?HEAP_POINTER,
356
 
    ?HEAP_LIMIT,
357
 
    ?PROC_POINTER,
358
 
    ?FCALLS,
359
 
    ?RETURN_ADDRESS,
360
 
    ?Z,
361
 
    ?XCC,
362
 
    ?ICC,
363
 
    ?Y,
364
 
    ?TEMP0,
365
 
    ?TEMP1,
366
 
    ?TEMP2,
367
 
    ?TEMP3,
368
 
    ?ARG0,
369
 
    ?ARG1,
370
 
    ?ARG2,
371
 
    ?ARG3,
372
 
    ?ARG4,
373
 
    ?ARG5,
374
 
    ?ARG6,
375
 
    ?ARG7,
376
 
    ?ARG8,
377
 
    ?ARG9,
378
 
    ?ARG10,
379
 
    ?ARG11,
380
 
    ?ARG12,
381
 
    ?ARG13,
382
 
    ?ARG14,
383
 
    ?ARG15
384
 
].
 
313
all_precoloured() ->
 
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].
385
319
 
386
320
%%
387
321
%% The number of arguments that are passed in registers.
388
322
%%
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.
391
325
 
392
326
%%
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.
 
329
 
 
330
alignment() -> 4.
 
331