Skip to content

Commit 0618889

Browse files
committed
ARM:MOV: update for conversion to C expressions
1 parent c8f8bc8 commit 0618889

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

chb/arm/opcodes/ARMMove.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@
5151

5252

5353
class ARMMoveXData(ARMOpcodeXData):
54+
"""Data format:
55+
- variables:
56+
0: vrd
57+
58+
- expressions:
59+
0: xrm
60+
1: result
61+
62+
- c expressions:
63+
0: cresult
64+
"""
5465

5566
def __init__(self, xdata: InstrXData) -> None:
5667
ARMOpcodeXData.__init__(self, xdata)
@@ -67,9 +78,23 @@ def xrm(self) -> "XXpr":
6778
def result(self) -> "XXpr":
6879
return self.xpr(1, "result")
6980

81+
@property
82+
def is_result_ok(self) -> bool:
83+
return self.is_xpr_ok(1)
84+
85+
@property
86+
def cresult(self) -> "XXpr":
87+
return self.cxpr(0, "cresult")
88+
89+
@property
90+
def is_cresult_ok(self) -> bool:
91+
return self.is_cxpr_ok(0)
92+
7093
@property
7194
def annotation(self) -> str:
72-
assignment = str(self.vrd) + " := " + str(self.result)
95+
cx = " (C: " + (str(self.cresult) if self.is_cresult_ok else "None") + ")"
96+
rhs = str(self.result) if self.is_result_ok else str(self.xrm)
97+
assignment = str(self.vrd) + " := " + rhs + cx
7398
return self.add_instruction_condition(assignment)
7499

75100

@@ -87,11 +112,8 @@ class ARMMove(ARMOpcode):
87112
args[3]: is-wide (thumb)
88113
args[4]: wide
89114
90-
xdata format: a:vxxrdh
91-
----------------------
92-
vars[0]: lhs
93-
xprs[0]: rhs
94-
xprs[1]: rhs (simplified)
115+
xdata format
116+
------------
95117
rdefs[0]: rhs
96118
rdefs[1..]: rhs (simplified)
97119
uses[0]: lhs
@@ -134,10 +156,7 @@ def annotation(self, xdata: InstrXData) -> str:
134156
return "NOP"
135157

136158
xd = ARMMoveXData(xdata)
137-
if xd.is_ok:
138-
return xd.annotation
139-
else:
140-
return "Error value"
159+
return xd.annotation
141160

142161
def ast_prov_subsumed(
143162
self,
@@ -178,7 +197,6 @@ def ast_prov(
178197
xdata: InstrXData) -> Tuple[
179198
List[AST.ASTInstruction], List[AST.ASTInstruction]]:
180199

181-
xd = ARMMoveXData(xdata)
182200
annotations: List[str] = [iaddr, "MOV"]
183201

184202
if xdata.is_nop:
@@ -208,12 +226,16 @@ def ast_prov(
208226

209227
# high-level assignment
210228

211-
if not xd.is_ok:
212-
chklogger.logger.error("Error value encountered at %s", iaddr)
213-
return ([], [])
229+
xd = ARMMoveXData(xdata)
230+
231+
if xd.is_cresult_ok:
232+
rhs = xd.cresult
233+
elif xd.is_result_ok:
234+
rhs = xd.result
235+
else:
236+
rhs = xd.xrm
214237

215238
lhs = xd.vrd
216-
rhs = xd.result
217239
rdefs = xdata.reachingdefs
218240
defuses = xdata.defuses
219241
defuseshigh = xdata.defuseshigh

0 commit comments

Comments
 (0)