Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
41c1e596
Commit
41c1e596
authored
Mar 09, 2006
by
Christian Würdig
Browse files
fixed some minor bugs
code cleanups added new magic (register generic functions at op's)
parent
79d4457b
Changes
8
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/bearch_ia32.c
View file @
41c1e596
...
...
@@ -190,8 +190,6 @@ static arch_irn_class_t ia32_classify(const void *self, const ir_node *irn) {
irn
=
my_skip_proj
(
irn
);
if
(
is_cfop
(
irn
))
return
arch_irn_class_branch
;
else
if
(
is_ia32_Call
(
irn
))
return
arch_irn_class_call
;
else
if
(
is_ia32_irn
(
irn
))
return
arch_irn_class_normal
;
else
...
...
ir/be/ia32/ia32_emitter.c
View file @
41c1e596
...
...
@@ -15,6 +15,7 @@
#include "irprog_t.h"
#include "../besched.h"
#include "../benode_t.h"
#include "ia32_emitter.h"
#include "gen_ia32_emitter.h"
...
...
@@ -58,11 +59,21 @@ char *ia32_emit_binop(const ir_node *n) {
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%1D, %4S"
,
n
,
n
);
}
break
;
case
ia32_
am_Source
:
case
ia32_
AddrModeS
:
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%1D, %s"
,
n
,
ia32_emit_am
(
n
));
break
;
case
ia32_am_Dest
:
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%s, %4S"
,
ia32_emit_am
(
n
),
n
);
case
ia32_AddrModeD
:
if
(
get_ia32_cnst
(
n
))
{
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%s, %s"
,
ia32_emit_am
(
n
),
get_ia32_cnst
(
n
));
}
else
{
if
(
is_ia32_St
(
n
))
{
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%s, %3S"
,
ia32_emit_am
(
n
),
n
);
}
else
{
lc_esnprintf
(
ia32_get_arg_env
(),
buf
,
SNPRINTF_BUF_LEN
,
"%s, %4S"
,
ia32_emit_am
(
n
),
n
);
}
}
break
;
default:
assert
(
0
&&
"unsupported op type"
);
...
...
@@ -172,7 +183,7 @@ static int ia32_get_arg_type(const lc_arg_occ_t *occ) {
/**
* Returns the register at in position pos.
*/
static
const
arch_register_t
*
get_in_reg
(
ir_node
*
irn
,
int
pos
)
{
static
const
arch_register_t
*
get_in_reg
(
const
ir_node
*
irn
,
int
pos
)
{
ir_node
*
op
;
const
arch_register_t
*
reg
=
NULL
;
...
...
@@ -191,7 +202,7 @@ static const arch_register_t *get_in_reg(ir_node *irn, int pos) {
/**
* Returns the register at out position pos.
*/
static
const
arch_register_t
*
get_out_reg
(
ir_node
*
irn
,
int
pos
)
{
static
const
arch_register_t
*
get_out_reg
(
const
ir_node
*
irn
,
int
pos
)
{
ir_node
*
proj
;
const
arch_register_t
*
reg
=
NULL
;
...
...
@@ -275,9 +286,8 @@ static int ia32_get_reg_name(lc_appendable_t *app,
if
(
!
X
)
return
lc_arg_append
(
app
,
occ
,
"(null)"
,
6
);
buf
=
get_ia32_reg_name
(
X
,
nr
,
occ
->
conversion
==
'S'
?
IN_REG
:
OUT_REG
);
buf
=
get_ia32_reg_name
(
X
,
nr
,
occ
->
conversion
==
'S'
?
IN_REG
:
OUT_REG
);
lc_appendable_chadd
(
app
,
'%'
);
return
lc_arg_append
(
app
,
occ
,
buf
,
strlen
(
buf
));
}
...
...
@@ -314,10 +324,7 @@ static int ia32_get_mode_suffix(lc_appendable_t *app,
if
(
!
X
)
return
lc_arg_append
(
app
,
occ
,
"(null)"
,
6
);
if
(
get_mode_size_bits
(
get_irn_mode
(
X
))
==
32
)
return
lc_appendable_chadd
(
app
,
's'
);
else
return
lc_appendable_chadd
(
app
,
'd'
);
return
lc_appendable_chadd
(
app
,
get_mode_size_bits
(
get_irn_mode
(
X
))
==
32
?
's'
:
'd'
);
}
/**
...
...
@@ -334,7 +341,6 @@ const lc_arg_env_t *ia32_get_arg_env(void) {
if
(
env
==
NULL
)
{
/* extend the firm printer */
env
=
firm_get_arg_env
();
//lc_arg_new_env();
lc_arg_register
(
env
,
"ia32:sreg"
,
'S'
,
&
ia32_reg_handler
);
lc_arg_register
(
env
,
"ia32:dreg"
,
'D'
,
&
ia32_reg_handler
);
...
...
@@ -443,7 +449,7 @@ static char *get_cfop_target(const ir_node *irn, char *buf) {
/**
* Emits the jump sequence for a conditional jump (cmp + jmp_true + jmp_false)
*/
static
void
finish_CondJmp
(
FILE
*
F
,
ir_node
*
irn
)
{
static
void
finish_CondJmp
(
FILE
*
F
,
const
ir_node
*
irn
)
{
const
ir_node
*
proj
;
const
ir_edge_t
*
edge
;
char
buf
[
SNPRINTF_BUF_LEN
];
...
...
@@ -474,7 +480,7 @@ static void finish_CondJmp(FILE *F, ir_node *irn) {
/**
* Emits code for conditional jump with two variables.
*/
static
void
emit_ia32_CondJmp
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
static
void
emit_ia32_CondJmp
(
const
ir_node
*
irn
,
emit_env_t
*
env
)
{
FILE
*
F
=
env
->
out
;
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %2S, %1S
\t\t\t
/* CondJmp(%+F, %+F) */
\n
"
,
irn
,
irn
,
...
...
@@ -485,7 +491,7 @@ static void emit_ia32_CondJmp(ir_node *irn, emit_env_t *env) {
/**
* Emits code for conditional jump with immediate.
*/
void
emit_ia32_CondJmp_i
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
void
emit_ia32_CondJmp_i
(
const
ir_node
*
irn
,
emit_env_t
*
env
)
{
FILE
*
F
=
env
->
out
;
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %C, %1S
\t\t\t
/* CondJmp_i(%+F) */
\n
"
,
irn
,
irn
,
get_irn_n
(
irn
,
0
));
...
...
@@ -601,12 +607,11 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
if
(
do_jmp_tbl
)
{
/* emit the table */
if
(
tbl
.
min_value
!=
0
)
{
fprintf
(
F
,
"
\t
cmpl %lu, -%d
"
,
interval
,
tbl
.
min_value
);
lc_efprintf
(
env
,
F
,
"(%1S)
\t\t
/* first switch value is not 0 */
\n
"
,
irn
);
lc_e
fprintf
(
env
,
F
,
"
\t
cmpl %lu, -%d
(%1S)
\t\t
/* first switch value is not 0 */
\n
"
,
interval
,
tbl
.
min_value
,
irn
);
}
else
{
fprintf
(
F
,
"
\t
cmpl %lu, "
,
interval
);
lc_efprintf
(
env
,
F
,
"%1S
\t\t\t
/* compare for switch */
\n
"
,
irn
);
lc_efprintf
(
env
,
F
,
"
\t
cmpl %lu, %1S
\t\t\t
/* compare for switch */
\n
"
,
interval
,
irn
);
}
fprintf
(
F
,
"
\t
ja %s
\t\t\t
/* default jump if out of range */
\n
"
,
get_cfop_target
(
tbl
.
defProj
,
buf
));
...
...
@@ -614,7 +619,6 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
if
(
tbl
.
num_branches
>
1
)
{
/* create table */
//fprintf(F, "\tjmp *%s", tbl.label);
lc_efprintf
(
env
,
F
,
"
\t
jmp *%s(,%1S,4)
\t\t
/* get jump table entry as target */
\n
"
,
tbl
.
label
,
irn
);
fprintf
(
F
,
"
\t
.section
\t
.rodata
\t\t
/* start jump table */
\n
"
);
...
...
@@ -640,9 +644,7 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
}
else
{
// no jump table
for
(
i
=
0
;
i
<
tbl
.
num_branches
;
++
i
)
{
fprintf
(
F
,
"
\t
cmpl %d, "
,
tbl
.
branches
[
i
].
value
);
lc_efprintf
(
env
,
F
,
"%1S"
,
irn
);
fprintf
(
F
,
"
\t\t\t
/* case %d */
\n
"
,
tbl
.
branches
[
i
].
value
);
lc_efprintf
(
env
,
F
,
"
\t
cmpl %d, %1S
\t\t\t
/* case %d */
\n
"
,
tbl
.
branches
[
i
].
value
,
irn
,
i
);
fprintf
(
F
,
"
\t
je %s
\n
"
,
get_cfop_target
(
tbl
.
branches
[
i
].
target
,
buf
));
}
...
...
@@ -658,7 +660,7 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
/**
* Emits code for a unconditional jump.
*/
void
emit_Jmp
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
void
emit_Jmp
(
const
ir_node
*
irn
,
emit_env_t
*
env
)
{
FILE
*
F
=
env
->
out
;
char
buf
[
SNPRINTF_BUF_LEN
];
...
...
@@ -681,7 +683,7 @@ void emit_Jmp(ir_node *irn, emit_env_t *env) {
/**
* Emits code for a proj -> node
*/
void
emit_Proj
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
void
emit_Proj
(
const
ir_node
*
irn
,
emit_env_t
*
env
)
{
ir_node
*
pred
=
get_Proj_pred
(
irn
);
if
(
get_irn_op
(
pred
)
==
op_Start
)
{
...
...
@@ -724,7 +726,7 @@ static void emit_CopyB_prolog(FILE *F, int rem, int size) {
}
}
void
emit_ia32_CopyB
(
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
void
emit_ia32_CopyB
(
const
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
FILE
*
F
=
emit_env
->
out
;
tarval
*
tv
=
get_ia32_Immop_tarval
(
irn
);
int
rem
=
get_tarval_long
(
tv
);
...
...
@@ -735,7 +737,7 @@ void emit_ia32_CopyB(ir_node *irn, emit_env_t *emit_env) {
fprintf
(
F
,
"
\t
rep movsd
\t\t\t\t
/* memcopy */
\n
"
);
}
void
emit_ia32_CopyB_i
(
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
void
emit_ia32_CopyB_i
(
const
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
tarval
*
tv
=
get_ia32_Immop_tarval
(
irn
);
int
size
=
get_tarval_long
(
tv
);
FILE
*
F
=
emit_env
->
out
;
...
...
@@ -748,17 +750,41 @@ void emit_ia32_CopyB_i(ir_node *irn, emit_env_t *emit_env) {
}
}
/********************
* _____ _ _
* / ____| | | |
* | | __ _| | |
* | | / _` | | |
* | |___| (_| | | |
* \_____\__,_|_|_|
/*******************************************
* _ _
* | | | |
* | |__ ___ _ __ ___ __| | ___ ___
* | '_ \ / _ \ '_ \ / _ \ / _` |/ _ \/ __|
* | |_) | __/ | | | (_) | (_| | __/\__ \
* |_.__/ \___|_| |_|\___/ \__,_|\___||___/
*
********************/
*******************************************/
void
emit_be_Call
(
const
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
FILE
*
F
=
emit_env
->
out
;
void
emit_ia32_Call
(
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
call %3S
\t\t\t
/* %+F(%+F) (be_Call) */
\n
"
,
irn
,
irn
,
get_irn_n
(
irn
,
2
));
}
void
emit_be_IncSP
(
const
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
FILE
*
F
=
emit_env
->
out
;
unsigned
offs
=
be_get_IncSP_offset
(
irn
);
be_stack_dir_t
dir
=
be_get_IncSP_direction
(
irn
);
if
(
offs
)
{
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
add %1S,%s%u
\t\t\t
/* %+F (IncSP) */
\n
"
,
irn
,
(
dir
==
be_stack_dir_along
)
?
" -"
:
" "
,
offs
,
irn
);
}
else
{
fprintf
(
F
,
"
\t\t\t\t\t
/* omitted IncSP with 0 */
\n
"
);
}
}
void
emit_be_AddSP
(
const
ir_node
*
irn
,
emit_env_t
*
emit_env
)
{
FILE
*
F
=
emit_env
->
out
;
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
add %1D, %1S
\t\t\t
/* %+F (AddSP) */
\n
"
,
irn
,
irn
,
irn
);
}
...
...
@@ -778,98 +804,52 @@ void emit_ia32_Call(ir_node *irn, emit_env_t *emit_env) {
* pointer of an opcode.
*/
void
ia32_register_emitters
(
void
)
{
int
i
;
#define IA32_EMIT(a) op_ia32_##a->ops.generic = (op_func)emit_ia32_##a
#define EMIT(a) op_##a->ops.generic = (op_func)emit_##a
#define BE_EMIT(a) op_be_##a->ops.generic = (op_func)emit_be_##a
/* first clear all generic operations */
for
(
i
=
get_irp_n_opcodes
()
-
1
;
i
>=
0
;
--
i
)
{
ir_op
*
op
=
get_irp_opcode
(
i
);
op
->
ops
.
generic
=
(
op_func
)
NULL
;
}
/* generated int emitter functions */
IA32_EMIT
(
Const
);
IA32_EMIT
(
Add
);
IA32_EMIT
(
Sub
);
IA32_EMIT
(
Minus
);
IA32_EMIT
(
Inc
);
IA32_EMIT
(
Dec
);
IA32_EMIT
(
Max
);
IA32_EMIT
(
Min
);
IA32_EMIT
(
CMov
);
IA32_EMIT
(
And
);
IA32_EMIT
(
Or
);
IA32_EMIT
(
Eor
);
IA32_EMIT
(
Not
);
IA32_EMIT
(
Shl
);
IA32_EMIT
(
Shr
);
IA32_EMIT
(
Shrs
);
IA32_EMIT
(
RotL
);
IA32_EMIT
(
RotR
);
IA32_EMIT
(
Lea
);
IA32_EMIT
(
Mul
);
IA32_EMIT
(
Cdq
);
IA32_EMIT
(
DivMod
);
IA32_EMIT
(
Store
);
IA32_EMIT
(
Load
);
IA32_EMIT
(
CopyB
);
IA32_EMIT
(
CopyB_i
);
/* generated floating point emitter */
IA32_EMIT
(
fConst
);
IA32_EMIT
(
fAdd
);
IA32_EMIT
(
fSub
);
IA32_EMIT
(
fMul
);
IA32_EMIT
(
fDiv
);
IA32_EMIT
(
fMin
);
IA32_EMIT
(
fMax
);
IA32_EMIT
(
fLoad
);
IA32_EMIT
(
fStore
);
/* register all emitter functions defined in spec */
ia32_register_spec_emitters
();
/* other emitter functions */
IA32_EMIT
(
CondJmp
);
IA32_EMIT
(
SwitchJmp
);
IA32_EMIT
(
Call
);
IA32_EMIT
(
CopyB
);
IA32_EMIT
(
CopyB_i
);
/* benode emitter */
BE_EMIT
(
Call
);
BE_EMIT
(
IncSP
);
BE_EMIT
(
AddSP
);
/* firm emitter */
EMIT
(
Jmp
);
EMIT
(
Proj
);
#undef IA32_EMIT
#undef BE_EMIT
#undef EMIT
}
/**
* Emits code for a node.
*/
static
void
ia32_emit_node
(
ir_node
*
irn
,
void
*
env
)
{
emit_env_t
*
emit_env
=
env
;
firm_dbg_module_t
*
mod
=
emit_env
->
mod
;
FILE
*
F
=
emit_env
->
out
;
ir_op
*
op
=
get_irn_op
(
irn
);
static
void
ia32_emit_node
(
const
ir_node
*
irn
,
void
*
env
)
{
emit_env_t
*
emit_env
=
env
;
firm_dbg_module_t
*
mod
=
emit_env
->
mod
;
FILE
*
F
=
emit_env
->
out
;
ir_op
*
op
=
get_irn_op
(
irn
);
DBG
((
mod
,
LEVEL_1
,
"emitting code for %+F
\n
"
,
irn
));
if
(
op
->
ops
.
generic
)
{
void
(
*
emit
)(
ir_node
*
,
void
*
)
=
(
void
(
*
)(
ir_node
*
,
void
*
))
op
->
ops
.
generic
;
void
(
*
emit
)(
const
ir_node
*
,
void
*
)
=
(
void
(
*
)(
const
ir_node
*
,
void
*
))
op
->
ops
.
generic
;
(
*
emit
)(
irn
,
env
);
}
ir_fprintf
(
F
,
"
\t\t\t\t\t
/* %+F */
\n
"
,
irn
);
else
{
ir_fprintf
(
F
,
"
\t\t\t\t\t
/* %+F */
\n
"
,
irn
);
}
}
/**
...
...
@@ -877,7 +857,7 @@ static void ia32_emit_node(ir_node *irn, void *env) {
* and emits code for each node.
*/
static
void
ia32_gen_block
(
ir_node
*
block
,
void
*
env
)
{
ir_node
*
irn
;
const
ir_node
*
irn
;
if
(
!
is_Block
(
block
))
return
;
...
...
@@ -892,7 +872,7 @@ static void ia32_gen_block(ir_node *block, void *env) {
/**
* Emits code for function start.
*/
void
ia32_emit_
start
(
FILE
*
F
,
ir_graph
*
irg
)
{
static
void
ia32_emit_
func_prolog
(
FILE
*
F
,
ir_graph
*
irg
)
{
const
char
*
irg_name
=
get_entity_name
(
get_irg_entity
(
irg
));
fprintf
(
F
,
"
\t
.text
\n
"
);
...
...
@@ -904,7 +884,7 @@ void ia32_emit_start(FILE *F, ir_graph *irg) {
/**
* Emits code for function end
*/
void
ia32_emit_
end
(
FILE
*
F
,
ir_graph
*
irg
)
{
static
void
ia32_emit_
func_epilog
(
FILE
*
F
,
ir_graph
*
irg
)
{
const
char
*
irg_name
=
get_entity_name
(
get_irg_entity
(
irg
));
fprintf
(
F
,
"
\t
ret
\n
"
);
...
...
@@ -915,7 +895,7 @@ void ia32_emit_end(FILE *F, ir_graph *irg) {
* Sets labels for control flow nodes (jump target)
* TODO: Jump optimization
*/
void
ia32_gen_labels
(
ir_node
*
block
,
void
*
env
)
{
static
void
ia32_gen_labels
(
ir_node
*
block
,
void
*
env
)
{
ir_node
*
pred
;
int
n
=
get_Block_n_cfgpreds
(
block
);
...
...
@@ -939,8 +919,8 @@ void ia32_gen_routine(FILE *F, ir_graph *irg, const ia32_code_gen_t *cg) {
/* set the global arch_env (needed by print hooks) */
arch_env
=
cg
->
arch_env
;
ia32_emit_
start
(
F
,
irg
);
ia32_emit_
func_prolog
(
F
,
irg
);
irg_block_walk_graph
(
irg
,
ia32_gen_labels
,
NULL
,
&
emit_env
);
irg_walk_blkwise_graph
(
irg
,
NULL
,
ia32_gen_block
,
&
emit_env
);
ia32_emit_
end
(
F
,
irg
);
ia32_emit_
func_epilog
(
F
,
irg
);
}
ir/be/ia32/ia32_map_regs.c
View file @
41c1e596
...
...
@@ -233,9 +233,6 @@ long ia32_translate_proj_pos(const ir_node *proj) {
else
assert
(
0
&&
"there should be no more Projs for a fDiv"
);
}
else
if
(
is_ia32_Call
(
pred
))
{
return
0
;
}
else
if
(
get_irn_mode
(
proj
)
==
mode_X
&&
nr
==
pn_Start_X_initial_exec
)
{
return
0
;
}
...
...
ir/be/ia32/ia32_new_nodes.c
View file @
41c1e596
...
...
@@ -180,7 +180,6 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) {
ir_mode
*
mode
=
NULL
;
int
bad
=
0
;
int
i
,
n_res
,
am_flav
,
flags
;
ia32_attr_t
*
attr
;
const
ia32_register_req_t
**
reqs
;
const
arch_register_t
**
slots
;
...
...
@@ -192,23 +191,15 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) {
case
dump_node_mode_txt
:
mode
=
get_irn_mode
(
n
);
if
(
is_ia32_L
oa
d
(
n
)
||
is_ia32_St
ore
(
n
))
{
if
(
is_ia32_Ld
(
n
)
||
is_ia32_St
(
n
))
{
mode
=
get_ia32_ls_mode
(
n
);
}
if
(
mode
)
{
fprintf
(
F
,
"[%s]"
,
get_mode_name
(
mode
));
}
else
{
fprintf
(
F
,
"[?NOMODE?]"
);
}
fprintf
(
F
,
"[%s]"
,
mode
?
get_mode_name
(
mode
)
:
"?NOMODE?"
);
break
;
case
dump_node_nodeattr_txt
:
if
(
is_ia32_Call
(
n
))
{
fprintf
(
F
,
"&%s "
,
get_ia32_sc
(
n
));
}
else
if
(
get_ia32_cnst
(
n
))
{
if
(
get_ia32_cnst
(
n
))
{
char
*
pref
=
""
;
if
(
get_ia32_sc
(
n
))
{
...
...
@@ -230,7 +221,6 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) {
break
;
case
dump_node_info_txt
:
attr
=
get_ia32_attr
(
n
);
n_res
=
get_ia32_n_res
(
n
);
fprintf
(
F
,
"=== IA32 attr begin ===
\n
"
);
...
...
@@ -250,15 +240,10 @@ static int dump_node_ia32(ir_node *n, FILE *F, dump_reason_t reason) {
slots
=
get_ia32_slots
(
n
);
if
(
slots
&&
n_res
>
0
)
{
for
(
i
=
0
;
i
<
n_res
;
i
++
)
{
if
(
slots
[
i
])
{
fprintf
(
F
,
"reg #%d = %s
\n
"
,
i
,
slots
[
i
]
->
name
);
}
else
{
fprintf
(
F
,
"reg #%d = n/a
\n
"
,
i
);
}
fprintf
(
F
,
"reg #%d = %s
\n
"
,
i
,
slots
[
i
]
?
slots
[
i
]
->
name
:
"n/a"
);
}
fprintf
(
F
,
"
\n
"
);
}
fprintf
(
F
,
"
\n
"
);
/* dump op type */
fprintf
(
F
,
"op = "
);
...
...
@@ -510,15 +495,12 @@ static void extend_ia32_am_offs(ir_node *node, char *offset, char op) {
/* offset could already have an explicit sign */
/* -> supersede op if necessary */
if
(
offset
[
0
]
==
'-'
&&
op
==
'-'
)
{
op
=
'+'
;
}
else
if
(
offset
[
0
]
==
'-'
&&
op
==
'+'
)
{
op
=
'-'
;
}
/* skip explicit sign */
if
(
offset
[
0
]
==
'-'
||
offset
[
0
]
==
'+'
)
{
if
(
offset
[
0
]
==
'-'
)
{
op
=
(
op
==
'-'
)
?
'+'
:
'-'
;
}
/* skip explicit sign */
offset
++
;
}
...
...
@@ -563,8 +545,8 @@ int get_ia32_am_scale(const ir_node *node) {
* Sets the index register scale for addrmode.
*/
void
set_ia32_am_scale
(
ir_node
*
node
,
int
scale
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
attr
->
data
.
am_scale
=
scale
;
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
attr
->
data
.
am_scale
=
scale
;
}
/**
...
...
@@ -617,7 +599,7 @@ char *get_ia32_cnst(const ir_node *node) {
* Sets the uses_frame flag.
*/
void
set_ia32_use_frame
(
ir_node
*
node
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
attr
->
data
.
use_frame
=
1
;
}
...
...
@@ -625,7 +607,7 @@ void set_ia32_use_frame(ir_node *node) {
* Clears the uses_frame flag.
*/
void
clear_ia32_use_frame
(
ir_node
*
node
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
attr
->
data
.
use_frame
=
0
;
}
...
...
@@ -658,7 +640,6 @@ void clear_ia32_commutative(ir_node *node) {
*/
int
is_ia32_commutative
(
const
ir_node
*
node
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
return
attr
->
data
.
is_commutative
;
}
...
...
@@ -848,7 +829,7 @@ void set_ia32_pncode(ir_node *node, long code) {
unsigned
get_ia32_Const_type
(
const
ir_node
*
node
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
assert
(
(
is_ia32_C
o
nst
(
node
)
||
is_ia32_fConst
(
node
))
&&
"Need ia32_Const to get type"
);
assert
(
is_ia32_Cnst
(
node
)
&&
"Need ia32_Const to get type"
);
return
attr
->
data
.
tp
;
}
...
...
@@ -859,7 +840,7 @@ unsigned get_ia32_Const_type(const ir_node *node) {
void
set_ia32_Const_type
(
ir_node
*
node
,
int
type
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
node
);
assert
(
(
is_ia32_C
o
nst
(
node
)
||
is_ia32_fConst
(
node
))
&&
"Need ia32_Const to set type"
);
assert
(
is_ia32_Cnst
(
node
)
&&
"Need ia32_Const to set type"
);
assert
((
type
==
ia32_Const
||
type
==
ia32_SymConst
)
&&
"Unsupported ia32_Const type"
);
attr
->
data
.
tp
=
type
;
...
...
@@ -872,7 +853,7 @@ void set_ia32_Immop_attr(ir_node *node, ir_node *cnst) {
ia32_attr_t
*
na
=
get_ia32_attr
(
node
);
ia32_attr_t
*
ca
=
get_ia32_attr
(
cnst
);
assert
(
(
is_ia32_C
o
nst
(
cnst
)
||
is_ia32_fConst
(
cnst
))
&&
"Need ia32_Const to set Immop attr"
);
assert
(
is_ia32_Cnst
(
cnst
)
&&
"Need ia32_Const to set Immop attr"
);
na
->
tv
=
ca
->
tv
;
...
...
@@ -892,19 +873,19 @@ void set_ia32_Immop_attr(ir_node *node, ir_node *cnst) {
void
set_ia32_Const_attr
(
ir_node
*
ia32_cnst
,
ir_node
*
cnst
)
{
ia32_attr_t
*
attr
=
get_ia32_attr
(
ia32_cnst
);
assert
(
(
is_ia32_C
o
nst
(
ia32_cnst
)
||
is_ia32_fConst
(
ia32_cnst
))
&&
"Need ia32_Const to set Const attr"
);
assert
(
is_ia32_Cnst
(
ia32_cnst
)
&&
"Need ia32_Const to set Const attr"
);
switch
(
get_irn_opcode
(
cnst
))
{
case
iro_Const
:
attr
->
data
.
tp
=
ia32_Const
;
attr
->
tv
=
get_Const_tarval
(
cnst
);
attr
->
cnst
=
set_cnst_from_tv
(
attr
->
cnst
,
attr
->
tv
);
attr
->
data
.
tp
=
ia32_Const
;
attr
->
tv
=
get_Const_tarval
(
cnst
);
attr
->
cnst
=
set_cnst_from_tv
(
attr
->
cnst
,
attr
->
tv
);
break
;
case
iro_SymConst
:
attr
->
data
.
tp
=
ia32_SymConst
;
attr
->
tv
=
NULL
;
attr
->
sc
=
copy_str
(
attr
->
sc
,
get_sc_name
(
cnst
));
attr
->
cnst
=
attr
->
sc
;
attr
->
data
.
tp
=
ia32_SymConst
;
attr
->
tv
=
NULL
;
attr
->
sc
=
copy_str
(
attr
->
sc
,
get_sc_name
(
cnst
));
attr
->
cnst
=
attr
->
sc
;
break
;
case
iro_Unknown
:
assert
(
0
&&
"Unknown Const NYI"
);
...
...
@@ -962,6 +943,13 @@ int is_ia32_St(const ir_node *node) {
return
is_ia32_Store
(
node
)
||
is_ia32_fStore
(
node
);
}
/**
* Checks if node is a Const or fConst.
*/
int
is_ia32_Cnst
(
const
ir_node
*
node
)
{
return
is_ia32_Const
(
node
)
||
is_ia32_fConst
(
node
);
}
/**
* Returns the name of the OUT register at position pos.
*/
...
...
@@ -1014,7 +1002,7 @@ void alloc_ia32_reg_slots(ir_node *node, int num) {
attr
->
slots
=
NULL
;
}
attr
->
data
.
n_res
;
attr
->
data
.
n_res
=
num
;
}
/**
...
...
@@ -1039,5 +1027,17 @@ void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_regi
*
***************************************************************************************/
/* default compare operation to compare immediate ops */
int
ia32_compare_immop_attr
(
ia32_attr_t
*
a
,
ia32_attr_t
*
b
)
{
if
(
a
->
data
.
tp
==
b
->
data
.
tp
)
{
if
(
!
a
->
cnst
||
!
b
->
cnst
)
return
1
;
return
strcmp
(
a
->
cnst
,
b
->
cnst
);
}
return
1
;
}
/* Include the generated constructor functions */
#include "gen_ia32_new_nodes.c.inl"
ir/be/ia32/ia32_new_nodes.h
View file @
41c1e596
...
...
@@ -320,6 +320,11 @@ int is_ia32_Ld(const ir_node *node);
*/
int
is_ia32_St
(
const
ir_node
*
node
);