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
d9930adf
Commit
d9930adf
authored
Oct 17, 2006
by
Christian Würdig
Browse files
BugFix: return gcc-like names for st0-st7: %st, %st(1) - %st(7)
BugFix: test for parity on unordered compares
parent
9b569bd0
Changes
1
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_emitter.c
View file @
d9930adf
...
...
@@ -272,18 +272,32 @@ static int ia32_get_reg_name(lc_appendable_t *app,
static
int
ia32_get_x87_name
(
lc_appendable_t
*
app
,
const
lc_arg_occ_t
*
occ
,
const
lc_arg_value_t
*
arg
)
{
const
char
*
buf
;
const
char
*
buf
;
ir_node
*
irn
=
arg
->
v_ptr
;
int
nr
=
occ
->
width
-
1
;
ia32_attr_t
*
attr
;
char
*
n
;
int
res
=
0
;
if
(
!
irn
)
return
lc_appendable_snadd
(
app
,
"(null)"
,
6
);
attr
=
get_ia32_attr
(
irn
);
buf
=
attr
->
x87
[
nr
]
->
name
;
lc_appendable_chadd
(
app
,
'%'
);
return
lc_appendable_snadd
(
app
,
buf
,
strlen
(
buf
));
buf
=
attr
->
x87
[
nr
]
->
name
;
res
+=
lc_appendable_chadd
(
app
,
'%'
);
if
(
buf
[
2
]
==
'0'
)
{
/* just omit 'st' (skip the 0) */
res
+=
lc_appendable_snadd
(
app
,
buf
,
strlen
(
buf
)
-
1
);
}
else
{
res
+=
lc_appendable_snadd
(
app
,
"st("
,
3
);
res
+=
lc_appendable_chadd
(
app
,
buf
[
2
]);
res
+=
lc_appendable_chadd
(
app
,
')'
);
}
return
res
;
}
/**
...
...
@@ -496,6 +510,28 @@ static const char *pointer_size(ir_mode *mode, int x87_insn)
return
NULL
;
}
/**
* Translate the stx names into %st(x).
*/
static
char
*
get_x87_reg_name
(
const
arch_register_t
*
reg
,
char
*
buf
)
{
const
char
*
name
=
arch_register_get_name
(
reg
);
buf
[
0
]
=
'%'
;
buf
[
1
]
=
's'
;
buf
[
2
]
=
't'
;
if
(
name
[
2
]
==
'0'
)
buf
[
3
]
=
'\0'
;
else
{
buf
[
3
]
=
'('
;
buf
[
4
]
=
name
[
2
];
buf
[
5
]
=
')'
;
buf
[
6
]
=
'\0'
;
}
return
buf
;
}
/**
* Emits registers and/or address mode of a binary operation.
*/
...
...
@@ -525,13 +561,12 @@ const char *ia32_emit_x87_binop(const ir_node *n, ia32_emit_env_t *env) {
const
arch_register_t
*
in2
=
attr
->
x87
[
1
];
const
arch_register_t
*
out
=
attr
->
x87
[
2
];
const
arch_register_t
*
in
;
const
char
*
in_name
;
char
buf1
[
7
],
buf2
[
7
]
;
in
=
out
?
(
REGS_ARE_EQUAL
(
out
,
in2
)
?
in1
:
in2
)
:
in2
;
out
=
out
?
out
:
in1
;
in_name
=
arch_register_get_name
(
in
);
in
=
out
?
(
REGS_ARE_EQUAL
(
out
,
in2
)
?
in1
:
in2
)
:
in2
;
out
=
out
?
out
:
in1
;
snprintf
(
buf
,
SNPRINTF_BUF_LEN
,
"%
%%
s,
%%
%s"
,
arch_register_get_name
(
out
),
in_name
);
snprintf
(
buf
,
SNPRINTF_BUF_LEN
,
"%s, %s"
,
get_x87_reg_name
(
out
,
buf1
),
get_x87_reg_name
(
in
,
buf2
)
);
}
break
;
case
ia32_AddrModeS
:
...
...
@@ -871,15 +906,23 @@ static void finish_CondJmp(FILE *F, const ir_node *irn, ir_mode *mode) {
if
(
get_cfop_target_block
(
proj_true
)
==
next_block
)
{
/* exchange both proj's so the second one can be omitted */
const
ir_node
*
t
=
proj_true
;
proj_true
=
proj_false
;
proj_false
=
t
;
flipped
=
1
;
pnc
=
get_negated_pnc
(
pnc
,
mode
);
proj_true
=
proj_false
;
proj_false
=
t
;
flipped
=
1
;
pnc
=
get_negated_pnc
(
pnc
,
mode
);
}
/* the first Proj must always be created */
is_unsigned
=
mode_is_float
(
mode
)
||
!
mode_is_signed
(
mode
);
/* in case of unordered compare, check for parity */
if
(
pnc
&
pn_Cmp_Uo
)
{
snprintf
(
cmd_buf
,
SNPRINTF_BUF_LEN
,
"jp %s"
,
get_cfop_target
(
proj_true
,
buf
));
snprintf
(
cmnt_buf
,
SNPRINTF_BUF_LEN
,
"/* jump to false if result is unordered */"
);
IA32_DO_EMIT
(
irn
);
}
snprintf
(
cmd_buf
,
SNPRINTF_BUF_LEN
,
"j%s %s"
,
get_cmp_suffix
(
pnc
,
is_unsigned
),
get_cfop_target
(
proj_true
,
buf
));
...
...
@@ -981,12 +1024,13 @@ static void emit_ia32_xCondJmp(ir_node *irn, ia32_emit_env_t *env) {
FILE
*
F
=
env
->
out
;
char
cmd_buf
[
SNPRINTF_BUF_LEN
];
char
cmnt_buf
[
SNPRINTF_BUF_LEN
];
const
lc_arg_env_t
*
arg_env
=
ia32_get_arg_env
();
lc_esnprintf
(
ia32_get_
arg_env
()
,
cmd_buf
,
SNPRINTF_BUF_LEN
,
"ucomis%M %s"
,
irn
,
ia32_emit_binop
(
irn
,
env
));
lc_esnprintf
(
ia32_get_
arg_env
()
,
cmnt_buf
,
SNPRINTF_BUF_LEN
,
"/* %+F */"
,
irn
);
lc_esnprintf
(
arg_env
,
cmd_buf
,
SNPRINTF_BUF_LEN
,
"ucomis%M %s"
,
irn
,
ia32_emit_binop
(
irn
,
env
));
lc_esnprintf
(
arg_env
,
cmnt_buf
,
SNPRINTF_BUF_LEN
,
"/* %+F */"
,
irn
);
IA32_DO_EMIT
(
irn
);
finish_CondJmp
(
F
,
irn
,
mode_F
);
finish_CondJmp
(
F
,
irn
,
mode_F
);
}
/**
...
...
@@ -2021,6 +2065,9 @@ static void ia32_emit_dbg(const ir_node *irn, ia32_emit_env_t *env) {
unsigned
lineno
;
const
char
*
fname
=
be_retrieve_dbg_info
(
db
,
&
lineno
);
if
(
!
env
->
cg
->
birg
->
main_env
->
options
->
stabs_debug_support
)
return
;
if
(
fname
)
{
if
(
last_name
!=
fname
)
{
last_line
=
-
1
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a 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