Skip to content

Commit 5c3a94b

Browse files
committed
ARM:CMP: update for conversion to C expressions
1 parent d1e0683 commit 5c3a94b

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

chb/arm/opcodes/ARMCompare.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,17 @@
4949

5050

5151
class ARMCompareXData(ARMOpcodeXData):
52-
"""
53-
xdata format: a:xxxrr
54-
---------------------
55-
xprs[0]: xrn
56-
xprs[1]: xrm
57-
xprs[2]: xrn - xrm (simplified)
52+
"""Data format:
53+
---------------
54+
- expressions:
55+
0: xrn
56+
1: xrm:
57+
2: xresult (xrn - xrm)
58+
3: result (xresult rewritten)
59+
60+
- c expressions:
61+
0: cresult
62+
5863
rdefs[0]: rn
5964
rdefs[1]: rm
6065
rdefs[2..]: xrn - xrm (simplified)
@@ -71,15 +76,32 @@ def xrn(self) -> "XXpr":
7176
def xrm(self) -> "XXpr":
7277
return self.xpr(1, "xrm")
7378

79+
@property
80+
def xresult(self) -> "XXpr":
81+
return self.xpr(2, "xresult")
82+
7483
@property
7584
def result(self) -> "XXpr":
76-
return self.xpr(2, "result")
85+
return self.xpr(3, "result")
86+
87+
@property
88+
def is_result_ok(self) -> bool:
89+
return self.is_xpr_ok(3)
90+
91+
@property
92+
def cresult(self) -> "XXpr":
93+
return self.cxpr(0, "cresult")
94+
95+
@property
96+
def is_cresult_ok(self) -> bool:
97+
return self.is_cxpr_ok(0)
7798

7899
@property
79100
def annotation(self) -> str:
101+
cx = " (C: " + (str(self.cresult) if self.is_cresult_ok else "None") + ")"
80102
ann = "compare " + str(self.xrn) + " and " + str(self.xrm)
81103
if self.is_ok:
82-
ann += " (" + str(self.result) + ")"
104+
ann += " (" + str(self.result) + ")" + cx
83105
return self.add_instruction_condition(ann)
84106

85107

@@ -149,15 +171,15 @@ def ast_prov(
149171

150172
rdefs = xdata.reachingdefs
151173
xd = ARMCompareXData(xdata)
152-
if xd.is_ok:
174+
175+
if xd.is_cresult_ok:
176+
rhs = xd.cresult
177+
elif xd.is_result_ok:
153178
rhs = xd.result
154-
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
155179
else:
156-
rhs1 = xd.xrn
157-
rhs2 = xd.xrm
158-
hl_rhs1 = XU.xxpr_to_ast_def_expr(rhs1, xdata, iaddr, astree)
159-
hl_rhs2 = XU.xxpr_to_ast_def_expr(rhs2, xdata, iaddr, astree)
160-
hl_rhs = astree.mk_binary_op("minus", hl_rhs1, hl_rhs2)
180+
rhs = xd.xresult
181+
182+
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
161183

162184
hl_assign = astree.mk_assign(
163185
astree.ignoredlhs,

0 commit comments

Comments
 (0)