Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
7438ae08
Commit
7438ae08
authored
Mar 15, 2006
by
Christian Würdig
Browse files
fixed some minor bugs
code cleanups fixed am optimizer changed comments
parent
bc577a3d
Changes
5
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/bearch_ia32.c
View file @
7438ae08
...
...
@@ -21,6 +21,7 @@
#include
"iredges_t.h"
#include
"ircons.h"
#include
"irgmod.h"
#include
"irgopt.h"
#include
"bitset.h"
#include
"debug.h"
...
...
@@ -274,6 +275,10 @@ static void ia32_prepare_graph(void *self) {
irg_walk_blkwise_graph
(
cg
->
irg
,
ia32_place_consts_set_modes
,
ia32_transform_node
,
cg
);
dump_ir_block_graph_sched
(
cg
->
irg
,
"-transformed"
);
edges_deactivate
(
cg
->
irg
);
dead_node_elimination
(
cg
->
irg
);
edges_activate
(
cg
->
irg
);
cg
->
mod
=
old_mod
;
if
(
cg
->
opt
.
doam
)
{
...
...
@@ -470,7 +475,8 @@ static void ia32_after_ra_walker(ir_node *node, void *env) {
tenv
.
mode
=
get_irn_mode
(
node
);
tenv
.
cg
=
cg
;
if
(
be_is_StackParam
(
node
)
||
be_is_Reload
(
node
))
{
/* be_is_StackParam(node) || */
if
(
be_is_Reload
(
node
))
{
transform_to_Load
(
&
tenv
);
}
else
if
(
be_is_Spill
(
node
))
{
...
...
ir/be/ia32/ia32_map_regs.c
View file @
7438ae08
...
...
@@ -202,7 +202,7 @@ long ia32_translate_proj_pos(const ir_node *proj) {
long
nr
=
get_Proj_proj
(
proj
);
if
(
is_ia32_Ld
(
pred
))
{
if
(
nr
==
pn_Load_res
)
if
(
nr
==
pn_Load_res
||
nr
==
0
)
return
0
;
assert
(
0
&&
"unsupported Proj(Load) number"
);
}
...
...
ir/be/ia32/ia32_optimize.c
View file @
7438ae08
...
...
@@ -12,6 +12,8 @@
#include
"../be_t.h"
#include
"../beabi.h"
#include
"../benode_t.h"
#include
"../besched_t.h"
#include
"ia32_new_nodes.h"
#include
"bearch_ia32_t.h"
...
...
@@ -271,7 +273,7 @@ static ir_node *get_mem_proj(const ir_node *irn) {
}
/**
* Returns the Proj with
number 0
connected to irn.
* Returns the
first
Proj with
mode != mode_M
connected to irn.
*/
static
ir_node
*
get_res_proj
(
const
ir_node
*
irn
)
{
const
ir_edge_t
*
edge
;
...
...
@@ -284,7 +286,7 @@ static ir_node *get_res_proj(const ir_node *irn) {
assert
(
is_Proj
(
src
)
&&
"Proj expected"
);
if
(
get_
Proj_proj
(
src
)
=
=
0
)
if
(
get_
irn_mode
(
src
)
!
=
mode_M
)
return
src
;
}
...
...
@@ -328,9 +330,7 @@ static int pred_is_specific_nodeblock(const ir_node *bl, const ir_node *pred,
return
0
;
}
static
int
is_addr_candidate
(
const
ir_node
*
block
,
const
ir_node
*
irn
)
{
}
/**
* Checks if irn is a candidate for address calculation or address mode.
...
...
@@ -351,22 +351,24 @@ static int is_addr_candidate(const ir_node *block, const ir_node *irn) {
* return 1 if irn is a candidate for AC or AM, 0 otherwise
*/
static
int
is_candidate
(
const
ir_node
*
block
,
const
ir_node
*
irn
,
int
check_addr
)
{
ir_node
*
load_proj
;
ir_node
*
in
;
int
n
,
is_cand
=
check_addr
;
if
(
pred_is_specific_nodeblock
(
block
,
get_irn_n
(
irn
,
2
),
is_ia32_Load
))
{
load_proj
=
get_irn_n
(
irn
,
2
);
n
=
ia32_get_irn_n_edges
(
load_proj
);
in
=
get_irn_n
(
irn
,
2
);
if
(
pred_is_specific_nodeblock
(
block
,
in
,
is_ia32_Ld
)
||
be_is_StackParam
(
in
))
{
n
=
ia32_get_irn_n_edges
(
in
);
is_cand
=
check_addr
?
(
n
==
1
?
0
:
is_cand
)
:
(
n
==
1
?
1
:
is_cand
);
}
if
(
pred_is_specific_nodeblock
(
block
,
get_irn_n
(
irn
,
3
),
is_ia32_Load
))
{
load_proj
=
get_irn_n
(
irn
,
3
);
n
=
ia32_get_irn_n_edges
(
load_proj
);
in
=
get_irn_n
(
irn
,
3
);
if
(
pred_is_specific_nodeblock
(
block
,
in
,
is_ia32_Ld
)
||
be_is_StackParam
(
in
))
{
n
=
ia32_get_irn_n_edges
(
in
);
is_cand
=
check_addr
?
(
n
==
1
?
0
:
is_cand
)
:
(
n
==
1
?
1
:
is_cand
);
}
is_cand
=
get_ia32_frame_ent
(
irn
)
?
(
check_addr
?
1
:
0
)
:
(
check_addr
?
0
:
1
)
;
is_cand
=
get_ia32_frame_ent
(
irn
)
?
(
check_addr
?
1
:
0
)
:
is_cand
;
return
is_cand
;
}
...
...
@@ -383,11 +385,16 @@ static int load_store_addr_is_equal(const ir_node *load, const ir_node *store,
entity
*
sent
=
get_ia32_frame_ent
(
store
);
/* are both entities set and equal? */
is_equal
=
(
lent
&&
sent
&&
(
lent
==
sent
))
?
1
:
is_equal
;
is_equal
=
lent
&&
sent
&&
(
lent
==
sent
);
/* are the load and the store of the same mode? */
is_equal
=
get_ia32_ls_mode
(
load
)
==
get_ia32_ls_mode
(
store
);
return
is_equal
;
}
/**
* Folds Add or Sub to LEA if possible
*/
...
...
@@ -412,12 +419,6 @@ static ir_node *fold_addr(be_abi_irg_t *babi, ir_node *irn, firm_dbg_module_t *m
left
=
get_irn_n
(
irn
,
2
);
right
=
get_irn_n
(
irn
,
3
);
base
=
left
;
index
=
noreg
;
offs
=
NULL
;
scale
=
0
;
am_flav
=
0
;
/* "normalize" arguments in case of add with two operands */
if
(
isadd
&&
!
be_is_NoReg
(
babi
,
right
))
{
/* put LEA == ia32_am_O as right operand */
...
...
@@ -448,6 +449,12 @@ static ir_node *fold_addr(be_abi_irg_t *babi, ir_node *irn, firm_dbg_module_t *m
}
}
base
=
left
;
index
=
noreg
;
offs
=
NULL
;
scale
=
0
;
am_flav
=
0
;
/* check if operand is either const */
if
(
get_ia32_cnst
(
irn
))
{
DBG
((
mod
,
LEVEL_1
,
"
\t
found op with imm"
));
...
...
@@ -524,7 +531,7 @@ static ir_node *fold_addr(be_abi_irg_t *babi, ir_node *irn, firm_dbg_module_t *m
/* a new LEA. */
/* If the LEA contains already a frame_entity then we also */
/* create a new one otherwise we would loose it. */
if
(
isadd
&&
((
!
be_is_NoReg
(
babi
,
index
)
&&
(
am_flav
&
ia32_am_I
))
||
get_ia32_frame_ent
(
left
)))
{
if
(
(
isadd
&&
((
!
be_is_NoReg
(
babi
,
index
)
&&
(
am_flav
&
ia32_am_I
))
)
||
get_ia32_frame_ent
(
left
)))
{
DBG
((
mod
,
LEVEL_1
,
"
\t
leave old LEA, creating new one
\n
"
));
}
else
{
...
...
ir/be/ia32/ia32_spec.pl
View file @
7438ae08
...
...
@@ -405,7 +405,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Lea: Lea(a,b) = lea [a+b*const+offs] | res = a + b * const + offs with const = 0,1,2,4,8
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
"
],
"
out
"
=>
[
"
gp
"
]
},
"
emit
"
=>
'
. lea %D1, %ia32_emit_am\t\t/*
%D1 = %S1 + %S2 << scale + %O,
(%A1, %A2) */
'
"
emit
"
=>
'
. lea %D1, %ia32_emit_am\t\t/*
LEA
(%A1, %A2) */
'
},
#--------------------------------------------------------#
...
...
ir/be/ia32/ia32_transform.c
View file @
7438ae08
...
...
@@ -1476,6 +1476,37 @@ static ir_node *gen_Conv(ia32_transform_env_t *env, ir_node *op) {
*
********************************************/
static
ir_node
*
gen_StackParam
(
ia32_transform_env_t
*
env
)
{
ir_node
*
new_op
=
NULL
;
ir_node
*
node
=
env
->
irn
;
ir_node
*
noreg
=
ia32_new_NoReg_gp
(
env
->
cg
);
ir_node
*
mem
=
new_rd_NoMem
(
env
->
irg
);
ir_node
*
ptr
=
get_irn_n
(
node
,
0
);
entity
*
ent
=
be_get_frame_entity
(
node
);
ir_mode
*
mode
=
env
->
mode
;
if
(
mode_is_float
(
mode
))
{
new_op
=
new_rd_ia32_fLoad
(
env
->
dbg
,
env
->
irg
,
env
->
block
,
ptr
,
noreg
,
mem
,
mode_T
);
}
else
{
new_op
=
new_rd_ia32_Load
(
env
->
dbg
,
env
->
irg
,
env
->
block
,
ptr
,
noreg
,
mem
,
mode_T
);
}
set_ia32_frame_ent
(
new_op
,
ent
);
set_ia32_use_frame
(
new_op
);
set_ia32_am_support
(
new_op
,
ia32_am_Source
);
set_ia32_op_type
(
new_op
,
ia32_AddrModeS
);
set_ia32_am_flavour
(
new_op
,
ia32_B
);
set_ia32_ls_mode
(
new_op
,
mode
);
#ifndef NDEBUG
set_ia32_orig_node
(
new_op
,
get_old_node_name
(
env
));
#endif
/* NDEBUG */
return
new_rd_Proj
(
env
->
dbg
,
env
->
irg
,
env
->
block
,
new_op
,
mode
,
0
);
}
/**
* Transforms a FrameAddr into an ia32 Add.
*/
...
...
@@ -1518,6 +1549,7 @@ static ir_node *gen_FrameLoad(ia32_transform_env_t *env) {
}
set_ia32_frame_ent
(
new_op
,
ent
);
set_ia32_use_frame
(
new_op
);
set_ia32_am_support
(
new_op
,
ia32_am_Source
);
set_ia32_op_type
(
new_op
,
ia32_AddrModeS
);
...
...
@@ -1551,7 +1583,9 @@ static ir_node *gen_FrameStore(ia32_transform_env_t *env) {
else
{
new_op
=
new_rd_ia32_Store
(
env
->
dbg
,
env
->
irg
,
env
->
block
,
ptr
,
noreg
,
val
,
mem
,
mode_T
);
}
set_ia32_frame_ent
(
new_op
,
ent
);
set_ia32_use_frame
(
new_op
);
set_ia32_am_support
(
new_op
,
ia32_am_Dest
);
set_ia32_op_type
(
new_op
,
ia32_AddrModeD
);
...
...
@@ -1755,6 +1789,7 @@ void ia32_transform_node(ir_node *node, void *env) {
BE_GEN
(
FrameAddr
);
BE_GEN
(
FrameLoad
);
BE_GEN
(
FrameStore
);
BE_GEN
(
StackParam
);
break
;
bad:
fprintf
(
stderr
,
"Not implemented: %s
\n
"
,
get_irn_opname
(
node
));
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment