Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
peephole
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Taddeüs Kroes
peephole
Commits
5f9922d3
Commit
5f9922d3
authored
Dec 29, 2011
by
Jayke Meijer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added get_use. Needs testing.
parent
58c6acb7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
17 deletions
+45
-17
src/statement.py
src/statement.py
+45
-17
No files found.
src/statement.py
View file @
5f9922d3
...
@@ -65,6 +65,11 @@ class Statement:
...
@@ -65,6 +65,11 @@ class Statement:
return
self
.
is_command
()
\
return
self
.
is_command
()
\
and
re
.
match
(
'^beq|bne|blez|bgtz|bltz|bgez|bct|bcf$'
,
\
and
re
.
match
(
'^beq|bne|blez|bgtz|bltz|bgez|bct|bcf$'
,
\
self
.
name
)
self
.
name
)
def
is_branch_zero
(
self
):
"""Check if statement is a branch that compares with zero."""
return
self
.
is_command
()
\
and
re
.
match
(
'^blez|bgtz|bltz|bgez$'
,
self
.
name
)
def
is_shift
(
self
):
def
is_shift
(
self
):
"""Check if the statement is a shift operation."""
"""Check if the statement is a shift operation."""
...
@@ -75,6 +80,11 @@ class Statement:
...
@@ -75,6 +80,11 @@ class Statement:
return
self
.
is_command
()
and
self
.
name
in
[
'lw'
,
'li'
,
'dlw'
,
'l.s'
,
\
return
self
.
is_command
()
and
self
.
name
in
[
'lw'
,
'li'
,
'dlw'
,
'l.s'
,
\
'l.d'
]
'l.d'
]
def
is_store
(
self
):
"""Check if the statement is a store instruction."""
return
self
.
is_command
()
and
self
.
name
in
[
'sw'
,
's.d'
,
'dsw'
,
's.s'
,
\
's.b'
]
def
is_arith
(
self
):
def
is_arith
(
self
):
"""Check if the statement is an arithmetic operation."""
"""Check if the statement is an arithmetic operation."""
return
self
.
is_command
()
\
return
self
.
is_command
()
\
...
@@ -102,7 +112,7 @@ class Statement:
...
@@ -102,7 +112,7 @@ class Statement:
return self.is_command() and re.match('
^
(
xor
|
or
|
and
)
i
?$
', self.name)
return self.is_command() and re.match('
^
(
xor
|
or
|
and
)
i
?$
', self.name)
def is_double_aritmethic(self):
def is_double_aritmethic(self):
"""Check if the statement is a arit
hmet
ic .d operator."""
"""Check if the statement is a arit
meth
ic .d operator."""
return self.is_command() and
\
return self.is_command() and
\
re.match('
^
(
add
|
sub
|
div
|
mul
)
\
.
d
$
', self.name)
re.match('
^
(
add
|
sub
|
div
|
mul
)
\
.
d
$
', self.name)
...
@@ -127,6 +137,10 @@ class Statement:
...
@@ -127,6 +137,10 @@ class Statement:
"""Check if the statement is a convert operator."""
"""Check if the statement is a convert operator."""
return self.is_command() and re.match('
^
trunc
\
.[
a
-
z
\
.]
*
$
', self.name)
return self.is_command() and re.match('
^
trunc
\
.[
a
-
z
\
.]
*
$
', self.name)
def is_compare(self):
"""Check if the statement is a comparison."""
return self.is_command() and re.match('
^
c
\
.[
a
-
z
\
.]
*
$
', self.name)
def jump_target(self):
def jump_target(self):
"""Get the jump target of this statement."""
"""Get the jump target of this statement."""
if not self.is_jump():
if not self.is_jump():
...
@@ -136,37 +150,51 @@ class Statement:
...
@@ -136,37 +150,51 @@ class Statement:
def get_def(self):
def get_def(self):
"""Get the variable that this statement defines, if any."""
"""Get the variable that this statement defines, if any."""
instr = ['
move
', '
addu
', '
subu
', '
li
', '
mtc1
', '
dmfc1
']
instr = ['
move
', '
addu
', '
subu
', '
li
', '
mtc1
', '
dmfc1
'
, '
mov
.
d
'
]
if self.is_load_non_immediate() or self.is_arith()
\
if self.is_load_non_immediate() or self.is_arith()
\
or self.is_logical() or self.is_double_arit
hmet
ic()
\
or self.is_logical() or self.is_double_arit
meth
ic()
\
or self.is_move_from_spec() or self.is_double_unary()
\
or self.is_move_from_spec() or self.is_double_unary()
\
or self.is_set_if_less() or self.is_convert()
\
or self.is_set_if_less() or self.is_convert()
\
or self.is_truncate() or self.is_load()
\
or self.is_truncate() or self.is_load()
\
or (self.is_command and self.name in instr):
or (self.is_command
()
and self.name in instr):
return self[0]
return self[0]
return []
return []
def get_use(self):
def get_use(self):
# TODO: Finish with ALL the available commands!
"""Get the variables that this statement uses, if any."""
instr = ['
addu
', '
subu
', '
mult
', '
div
', '
move
', '
mtc1
', '
mov
.
d
',
\
'
dmfc1
']
use = []
use = []
if self.is_binop():
# Case arg0
use += self[1:]
if self.is_branch() or self.is_store() or self.is_compare()
\
elif self.is_command('
move
'):
or (self.is_command() and self.name in ['
mult
', '
div
', '
dsz
']):
if self.name == '
dsz
':
m = re.match('
^
\
d
+
\
(([
^
)]
+
)
\
)
$
', self[0])
use.append(m)
else:
use.append(self[0])
# Case arg1 direct adressing
if (self.is_branch() and not self.is_branch_zero()) or self.is_shift()
\
or self.is_double_arithmetic() or self.is_double_unary()
\
or self.is_logical() or self.is_convert()
\
or self.is_truncate() or self.is_set_if_less()
\
or (self.is_command() and self.name in instr):
use.append(self[1])
use.append(self[1])
elif self.is_command('
lw
', '
sb
', '
sw
', '
dsw
', '
s
.
s
', '
s
.
d
'):
# Case arg1 relative adressing
if self.is_load_non_immediate() or self.is_store():
m = re.match('
^
\
d
+
\
(([
^
)]
+
)
\
)
$
', self[1])
m = re.match('
^
\
d
+
\
(([
^
)]
+
)
\
)
$
', self[1])
if m:
if m:
use.append(m.group(1))
use.append(m)
else:
# '
sw
' also uses its first argument
use.append(self[1])
if self.name in ['
sw
', '
dsw
']:
# Case arg2
use.append(self[0])
if self.is_double_arithmetic() or self.is_set_if_less()
\
elif len(self) == 2: # FIXME: temporary fix, manually add all commands
or self.is_logical()
\
use.append(self[1])
or (self.is_command() and self.name in ['
addu
', '
subu
']) :
use.append(self[2])
return use
return use
...
...
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