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
aee4e102
Commit
aee4e102
authored
Nov 14, 2012
by
Christoph Mallon
Browse files
x87: Simplify sim_Fucom().
Whether the operands are permuted can be deduced by testing op1_idx != 0.
parent
bcc74445
Changes
1
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_x87.c
View file @
aee4e102
...
...
@@ -1190,8 +1190,6 @@ static int sim_Fucom(x87_state *state, ir_node *n)
int
reg_index_1
=
op1
->
index
;
int
reg_index_2
=
op2
->
index
;
unsigned
live
=
vfp_live_args_after
(
sim
,
n
,
0
);
bool
permuted
=
attr
->
attr
.
data
.
ins_permuted
;
bool
xchg
=
false
;
int
pops
=
0
;
DB
((
dbg
,
LEVEL_1
,
">>> %+F %s, %s
\n
"
,
n
,
op1
->
name
,
op2
->
name
));
...
...
@@ -1213,21 +1211,11 @@ static int sim_Fucom(x87_state *state, ir_node *n)
if
(
is_vfp_live
(
reg_index_1
,
live
))
{
/* both operands are live */
if
(
op1_idx
==
0
)
{
/* res = tos X op */
}
else
if
(
op2_idx
==
0
)
{
/* res = op X tos */
permuted
=
!
permuted
;
xchg
=
true
;
}
else
{
if
(
op1_idx
!=
0
&&
op2_idx
!=
0
)
{
/* bring the first one to tos */
x87_create_fxch
(
state
,
n
,
op1_idx
);
if
(
op1_idx
==
op2_idx
)
{
if
(
op1_idx
==
op2_idx
)
op2_idx
=
0
;
}
else
if
(
op2_idx
==
0
)
{
op2_idx
=
op1_idx
;
}
op1_idx
=
0
;
/* res = tos X op */
}
...
...
@@ -1257,9 +1245,7 @@ static int sim_Fucom(x87_state *state, ir_node *n)
op2_idx
=
0
;
}
/* res = op X tos, pop */
pops
=
1
;
permuted
=
!
permuted
;
xchg
=
true
;
pops
=
1
;
}
else
{
/* both operands are dead here, check first for identity. */
if
(
op1_idx
==
op2_idx
)
{
...
...
@@ -1293,9 +1279,7 @@ static int sim_Fucom(x87_state *state, ir_node *n)
op2_idx
=
0
;
}
/* res = op X tos, pop, pop */
permuted
=
!
permuted
;
xchg
=
true
;
pops
=
2
;
pops
=
2
;
}
else
{
/* if one is already the TOS, we need two fxch */
if
(
op1_idx
==
0
)
{
...
...
@@ -1306,9 +1290,7 @@ static int sim_Fucom(x87_state *state, ir_node *n)
x87_create_fxch
(
state
,
n
,
op2_idx
);
op2_idx
=
0
;
/* res = op X tos, pop, pop */
pops
=
2
;
permuted
=
!
permuted
;
xchg
=
true
;
pops
=
2
;
}
else
if
(
op2_idx
==
0
)
{
/* second one is TOS, move to st(1) */
x87_create_fxch
(
state
,
n
,
1
);
...
...
@@ -1366,10 +1348,11 @@ static int sim_Fucom(x87_state *state, ir_node *n)
}
x87_patch_insn
(
n
,
dst
);
if
(
xchg
)
{
if
(
op1_idx
!=
0
)
{
int
tmp
=
op1_idx
;
op1_idx
=
op2_idx
;
op2_idx
=
tmp
;
attr
->
attr
.
data
.
ins_permuted
^=
true
;
}
op1
=
get_st_reg
(
op1_idx
);
...
...
@@ -1378,7 +1361,6 @@ static int sim_Fucom(x87_state *state, ir_node *n)
op2
=
get_st_reg
(
op2_idx
);
attr
->
x87
[
1
]
=
op2
;
}
attr
->
attr
.
data
.
ins_permuted
=
permuted
;
attr
->
pop
=
pops
!=
0
;
if
(
op2_idx
>=
0
)
{
...
...
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