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
57298884
Commit
57298884
authored
Jul 17, 2008
by
Moritz Kroll
Browse files
Fixed and simplified rot matcher
[r20511]
parent
20d9e094
Changes
1
Hide whitespace changes
Inline
Side-by-side
ir/ir/iropt.c
View file @
57298884
...
...
@@ -4546,7 +4546,7 @@ static ir_node *transform_node_Or_bf_store(ir_node *or) {
static
ir_node
*
transform_node_Or_Rotl
(
ir_node
*
or
)
{
ir_mode
*
mode
=
get_irn_mode
(
or
);
ir_node
*
shl
,
*
shr
,
*
block
;
ir_node
*
irn
,
*
x
,
*
c1
,
*
c2
,
*
v
,
*
sub
,
*
n
;
ir_node
*
irn
,
*
x
,
*
c1
,
*
c2
,
*
v
,
*
sub
,
*
n
,
*
rotval
;
tarval
*
tv1
,
*
tv2
;
if
(
!
mode_is_int
(
mode
))
...
...
@@ -4587,64 +4587,45 @@ static ir_node *transform_node_Or_Rotl(ir_node *or) {
return
or
;
/* yet, condition met */
block
=
get_
irn_n
(
or
,
-
1
);
block
=
get_
nodes_block
(
or
);
n
=
new_r_Rotl
(
current_ir_graph
,
block
,
x
,
c1
,
mode
);
DBG_OPT_ALGSIM1
(
or
,
shl
,
shr
,
n
,
FS_OPT_OR_SHFT_TO_ROTL
);
return
n
;
}
else
if
(
is_Sub
(
c1
))
{
v
=
c2
;
sub
=
c1
;
if
(
get_Sub_right
(
sub
)
!=
v
)
return
or
;
c1
=
get_Sub_left
(
sub
);
if
(
!
is_Const
(
c1
))
return
or
;
tv1
=
get_Const_tarval
(
c1
);
if
(
!
tarval_is_long
(
tv1
))
return
or
;
if
(
get_tarval_long
(
tv1
)
!=
(
int
)
get_mode_size_bits
(
mode
))
return
or
;
/* yet, condition met */
block
=
get_nodes_block
(
or
);
/* a Rot right is not supported, so use a rot left */
n
=
new_r_Rotl
(
current_ir_graph
,
block
,
x
,
sub
,
mode
);
}
DBG_OPT_ALGSIM0
(
or
,
n
,
FS_OPT_OR_SHFT_TO_ROTL
);
return
n
;
}
else
if
(
is_Sub
(
c2
))
{
v
=
c1
;
sub
=
c2
;
if
(
is_Sub
(
c1
))
{
v
=
c2
;
sub
=
c1
;
rotval
=
sub
;
/* a Rot right is not supported, so use a rot left */
}
else
if
(
is_Sub
(
c2
))
{
v
=
c1
;
sub
=
c2
;
rotval
=
v
;
}
else
return
or
;
c1
=
get_Sub_left
(
sub
);
if
(
!
is_Const
(
c1
))
return
or
;
if
(
get_Sub_right
(
sub
)
!=
v
)
return
or
;
tv
1
=
get_
Const_tarval
(
c1
);
if
(
!
tarval_
is_
l
on
g
(
tv
1
))
return
or
;
c
1
=
get_
Sub_left
(
sub
);
if
(
!
is_
C
on
st
(
c
1
))
return
or
;
if
(
get_tarval_long
(
tv1
)
!=
(
int
)
get_mode_size_bits
(
mode
))
return
or
;
tv1
=
get_Const_tarval
(
c1
);
if
(
!
tarval_is_long
(
tv1
))
return
or
;
/* yet, condition met */
block
=
get_irn_n
(
or
,
-
1
)
;
if
(
get_tarval_long
(
tv1
)
!=
(
int
)
get_mode_size_bits
(
mode
))
return
or
;
/*
a Rot Lef
t */
n
=
new_r_Rotl
(
current_ir_graph
,
block
,
x
,
v
,
mode
);
/*
yet, condition me
t */
block
=
get_nodes_block
(
or
);
DBG_OPT_ALGSIM0
(
or
,
n
,
FS_OPT_OR_SHFT_TO_ROTL
);
return
n
;
}
n
=
new_r_Rotl
(
current_ir_graph
,
block
,
x
,
rotval
,
mode
);
return
or
;
DBG_OPT_ALGSIM0
(
or
,
n
,
FS_OPT_OR_SHFT_TO_ROTL
);
return
n
;
}
/* transform_node_Or_Rotl */
/**
...
...
Write
Preview
Supports
Markdown
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