cbe5d8640b
Use f14 to f31 as register variables for 8-byte double-precison.
There are no regvars for 4-byte double precision, because all
regvar(reg_float) must have the same size. I expect more programs to
prefer 8-byte double precision.
Teach mach/powerpc/ncg/mach.c to emit stfd and lfd instructions to
save and restore 8-byte regvars. Delay emitting the function prolog
until f_regsave(), so we can use one addi to make stack space for both
local vars and saved registers. Be more careful with types in mach.c;
don't assume that int and long and full are the same.
In ncg table, add f14 to f31 as register variables, and some rules to
use them. Add rules to put the result of fadd, fsub, fmul, fdiv, fneg
in a regvar. Without such rules, the result would go in a scratch
FREG, and we would need fmr to move it to the regvar. Also add a rule
for pat sdl inreg($1)==reg_float with STACK, so we can unstack the
value directly into the regvar, again without a scratch FREG and fmr.
Edit util/ego/descr/powerpc.descr to tell ego about the new float
regvars. This might not be working right; ego usually decides against
using any float regvars, so ack -O1 (not running ego) uses the
regvars, but ack -O4 (running ego) doesn't use the regvars.
Beware that ack -mosxppc runs ego using powerpc.descr but -mlinuxppc
and -mqemuppc run ego without a config file (since 8ef7c31
). I am
testing powerpc.descr with a local edit to plat/linuxppc/descr to run
ego with powerpc.descr there, but I did not commit my local edit.
149 lines
2.6 KiB
Plaintext
149 lines
2.6 KiB
Plaintext
wordsize: 4
|
|
pointersize: 4
|
|
%%RA
|
|
general registers: 19
|
|
address registers: 0
|
|
floating point registers: 18
|
|
use general as pointer: yes
|
|
|
|
register score parameters:
|
|
local variable:
|
|
(3 cases)
|
|
pointer,general
|
|
(1 size)
|
|
default -> (3,4)
|
|
general,general
|
|
(1 size)
|
|
default -> (3,4)
|
|
float,float
|
|
(1 size)
|
|
default -> (5,4)
|
|
address of local variable:
|
|
(3 cases)
|
|
pointer,general
|
|
(1 size)
|
|
default -> (0,0)
|
|
general,general
|
|
(1 size)
|
|
default -> (0,0)
|
|
float,float
|
|
(1 size)
|
|
default -> (0,0)
|
|
constant:
|
|
(2 sizes)
|
|
fitbyte -> (-1,-1)
|
|
default -> (-1,-1)
|
|
double constant:
|
|
(1 size)
|
|
default -> (-1,-1)
|
|
address of global variable:
|
|
(1 size)
|
|
default -> (2,8)
|
|
address of procedure:
|
|
(1 size)
|
|
default -> (-1,-1)
|
|
|
|
opening cost parameters:
|
|
local variable:
|
|
(3 cases)
|
|
pointer
|
|
(1 size)
|
|
default -> (3,4)
|
|
general
|
|
(1 size)
|
|
default -> (3,4)
|
|
float
|
|
(1 size)
|
|
default -> (5,4)
|
|
address of local variable:
|
|
(3 cases)
|
|
pointer
|
|
(1 size)
|
|
default -> (1,4)
|
|
general
|
|
(1 size)
|
|
default -> (1,4)
|
|
float
|
|
(1 size)
|
|
default -> (1,4)
|
|
constant:
|
|
(2 sizes)
|
|
fitbyte -> (1000,1000)
|
|
default -> (1000,1000)
|
|
double constant:
|
|
(1 size)
|
|
default -> (1000,1000)
|
|
address of global variable:
|
|
(1 size)
|
|
default -> (2,8)
|
|
address of procedure:
|
|
(1 size)
|
|
default -> (1000,1000)
|
|
|
|
register save costs:
|
|
(39 cases)
|
|
0 -> (0,0)
|
|
1 -> (6,8)
|
|
2 -> (12,16)
|
|
3 -> (18,24)
|
|
4 -> (24,32)
|
|
5 -> (30,40)
|
|
6 -> (36,48)
|
|
7 -> (42,56)
|
|
8 -> (48,64)
|
|
9 -> (54,72)
|
|
10 -> (60,80)
|
|
11 -> (66,88)
|
|
12 -> (72,96)
|
|
13 -> (78,104)
|
|
14 -> (84,112)
|
|
15 -> (90,120)
|
|
16 -> (96,128)
|
|
17 -> (102,136)
|
|
18 -> (108,144)
|
|
19 -> (114,152)
|
|
20 -> (120,160)
|
|
21 -> (126,168)
|
|
22 -> (132,176)
|
|
23 -> (138,184)
|
|
24 -> (144,192)
|
|
25 -> (150,200)
|
|
26 -> (156,208)
|
|
27 -> (162,216)
|
|
28 -> (168,224)
|
|
29 -> (174,232)
|
|
30 -> (180,240)
|
|
31 -> (186,248)
|
|
32 -> (192,256)
|
|
33 -> (198,264)
|
|
34 -> (204,272)
|
|
35 -> (210,280)
|
|
36 -> (216,288)
|
|
37 -> (222,296)
|
|
0 -> (0,0)
|
|
%%UD
|
|
access costs of global variables:
|
|
(1 size)
|
|
default -> (5,12)
|
|
access costs of local variables:
|
|
(1 size)
|
|
default -> (3,4)
|
|
%%SR
|
|
overflow harmful?: no
|
|
array bound harmful?: yes
|
|
reduce sli if shift count larger than: 0
|
|
%%CS
|
|
#include "em_mnem.h"
|
|
first time then space:
|
|
addressing modes: op_ads op_adp op_lof op_ldf op_loi op_dch op_lpb -1
|
|
op_ads op_adp op_lof op_ldf op_loi op_dch op_lpb -1
|
|
cheap operations: op_cii op_ciu op_cui op_cuu op_cmi op_cmu op_cmp -1
|
|
op_cii op_ciu op_cui op_cuu op_cmi op_cmu op_cmp -1
|
|
lexical tresholds: 1 1
|
|
indirection limit: 8
|
|
do not eliminate sli if index on shiftcounts: -1
|
|
-1
|
|
forbidden operators: -1 -1
|
|
%%SP
|
|
global stack pollution allowed?: yes
|