projects
/
libfirm
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
1443c53
)
fix fehler69
author
Matthias Braun
<matze@braunis.de>
Mon, 13 Aug 2007 15:08:57 +0000
(15:08 +0000)
committer
Matthias Braun
<matze@braunis.de>
Mon, 13 Aug 2007 15:08:57 +0000
(15:08 +0000)
[r15530]
ir/be/ia32/bearch_ia32.c
patch
|
blob
|
history
ir/be/ia32/ia32_nodes_attr.h
patch
|
blob
|
history
ir/be/ia32/ia32_optimize.c
patch
|
blob
|
history
ir/be/ia32/ia32_transform.c
patch
|
blob
|
history
diff --git
a/ir/be/ia32/bearch_ia32.c
b/ir/be/ia32/bearch_ia32.c
index
43a3865
..
6d9bade
100644
(file)
--- a/
ir/be/ia32/bearch_ia32.c
+++ b/
ir/be/ia32/bearch_ia32.c
@@
-1256,6
+1256,7
@@
static void ia32_collect_frame_entity_nodes(ir_node *node, void *data)
be_node_needs_frame_entity(env, node, mode, align);
} else if(is_ia32_irn(node) && get_ia32_frame_ent(node) == NULL
&& is_ia32_use_frame(node)) {
be_node_needs_frame_entity(env, node, mode, align);
} else if(is_ia32_irn(node) && get_ia32_frame_ent(node) == NULL
&& is_ia32_use_frame(node)) {
+ ir_fprintf(stderr, "H: %+F\n", node);
if (is_ia32_need_stackent(node) || is_ia32_Load(node)) {
const ir_mode *mode = get_ia32_ls_mode(node);
const ia32_attr_t *attr = get_ia32_attr_const(node);
if (is_ia32_need_stackent(node) || is_ia32_Load(node)) {
const ir_mode *mode = get_ia32_ls_mode(node);
const ia32_attr_t *attr = get_ia32_attr_const(node);
@@
-1264,6
+1265,10
@@
static void ia32_collect_frame_entity_nodes(ir_node *node, void *data)
if(attr->data.need_64bit_stackent) {
mode = mode_Ls;
}
if(attr->data.need_64bit_stackent) {
mode = mode_Ls;
}
+ if(attr->data.need_32bit_stackent) {
+ printf("I was here\n");
+ mode = mode_Is;
+ }
be_node_needs_frame_entity(env, node, mode, align);
} else if (is_ia32_vfild(node) || is_ia32_xLoad(node)
|| is_ia32_vfld(node)) {
be_node_needs_frame_entity(env, node, mode, align);
} else if (is_ia32_vfild(node) || is_ia32_xLoad(node)
|| is_ia32_vfld(node)) {
diff --git
a/ir/be/ia32/ia32_nodes_attr.h
b/ir/be/ia32/ia32_nodes_attr.h
index
008ab39
..
a4a2361
100644
(file)
--- a/
ir/be/ia32/ia32_nodes_attr.h
+++ b/
ir/be/ia32/ia32_nodes_attr.h
@@
-129,6
+129,7
@@
struct ia32_attr_t {
unsigned need_stackent:1; /**< Set to 1 if node need space on stack. */
unsigned need_64bit_stackent:1; /**< needs a 64bit stack entity (see double->unsigned int conv) */
unsigned need_stackent:1; /**< Set to 1 if node need space on stack. */
unsigned need_64bit_stackent:1; /**< needs a 64bit stack entity (see double->unsigned int conv) */
+ unsigned need_32bit_stackent:1; /**< needs a 32bit stack entity */
} data;
int *out_flags; /**< flags for each produced value */
} data;
int *out_flags; /**< flags for each produced value */
diff --git
a/ir/be/ia32/ia32_optimize.c
b/ir/be/ia32/ia32_optimize.c
index
dcc1140
..
e5790fb
100644
(file)
--- a/
ir/be/ia32/ia32_optimize.c
+++ b/
ir/be/ia32/ia32_optimize.c
@@
-1485,6
+1485,8
@@
static void optimize_am(ir_node *irn, void *env) {
}
if (source_possible) {
}
if (source_possible) {
+ const ia32_attr_t *attr_load = get_ia32_attr_const(load);
+ ia32_attr_t *attr_irn = get_ia32_attr(irn);
addr_b = get_irn_n(load, 0);
addr_i = get_irn_n(load, 1);
addr_b = get_irn_n(load, 0);
addr_i = get_irn_n(load, 1);
@@
-1496,6
+1498,10
@@
static void optimize_am(ir_node *irn, void *env) {
set_ia32_am_flavour(irn, get_ia32_am_flavour(load));
set_ia32_op_type(irn, ia32_AddrModeS);
set_ia32_frame_ent(irn, get_ia32_frame_ent(load));
set_ia32_am_flavour(irn, get_ia32_am_flavour(load));
set_ia32_op_type(irn, ia32_AddrModeS);
set_ia32_frame_ent(irn, get_ia32_frame_ent(load));
+ attr_irn->data.need_64bit_stackent
+ = attr_load->data.need_64bit_stackent;
+ attr_irn->data.need_32bit_stackent
+ = attr_load->data.need_32bit_stackent;
/* set ls_mode if not already present (conv nodes already have ls_mode
set) */
/* set ls_mode if not already present (conv nodes already have ls_mode
set) */
diff --git
a/ir/be/ia32/ia32_transform.c
b/ir/be/ia32/ia32_transform.c
index
e99c972
..
59834b3
100644
(file)
--- a/
ir/be/ia32/ia32_transform.c
+++ b/
ir/be/ia32/ia32_transform.c
@@
-2191,6
+2191,10
@@
static ir_node *gen_x87_fp_to_gp(ir_node *node) {
if(get_ia32_ls_mode(fist) == mode_Ls) {
ia32_attr_t *attr = get_ia32_attr(load);
attr->data.need_64bit_stackent = 1;
if(get_ia32_ls_mode(fist) == mode_Ls) {
ia32_attr_t *attr = get_ia32_attr(load);
attr->data.need_64bit_stackent = 1;
+ } else {
+ ia32_attr_t *attr = get_ia32_attr(load);
+ attr->data.need_32bit_stackent = 1;
+ ir_fprintf(stderr, "here too: %+F\n", load);
}
SET_IA32_ORIG_NODE(load, ia32_get_old_node_name(cg, node));
}
SET_IA32_ORIG_NODE(load, ia32_get_old_node_name(cg, node));
@@
-3539,7
+3543,8
@@
static ir_node *gen_ia32_l_vfist(ir_node *node) {
long am_offs;
ia32_am_flavour_t am_flav = ia32_B;
long am_offs;
ia32_am_flavour_t am_flav = ia32_B;
- new_op = new_rd_ia32_vfist(dbgi, irg, block, new_ptr, noreg, new_val, trunc_mode, new_mem);
+ new_op = new_rd_ia32_vfist(dbgi, irg, block, new_ptr, noreg, new_val,
+ trunc_mode, new_mem);
if ((am_offs = get_ia32_am_offs_int(node)) != 0) {
am_flav |= ia32_O;
if ((am_offs = get_ia32_am_offs_int(node)) != 0) {
am_flav |= ia32_O;