Skip to content

Commit 6cc045a

Browse files
committed
ARM:AND: update for conversion to C expressions
1 parent a716367 commit 6cc045a

File tree

1 file changed

+55
-18
lines changed

1 file changed

+55
-18
lines changed

chb/arm/opcodes/ARMBitwiseAnd.py

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@
5050

5151

5252
class ARMBitwiseAndXData(ARMOpcodeXData):
53+
"""Data format:
54+
- variables:
55+
0: vrd
56+
57+
- expressions:
58+
0: xrn
59+
1: xrm
60+
2: result
61+
3: rresult (result rewritten)
62+
63+
- c expressions:
64+
0: cresult
65+
"""
5366

5467
def __init__(self, xdata: InstrXData) -> None:
5568
ARMOpcodeXData.__init__(self, xdata)
@@ -70,18 +83,41 @@ def xrm(self) -> "XXpr":
7083
def result(self) -> "XXpr":
7184
return self.xpr(2, "result")
7285

86+
@property
87+
def is_result_ok(self) -> bool:
88+
return self.is_xpr_ok(2)
89+
7390
@property
7491
def rresult(self) -> "XXpr":
7592
return self.xpr(3, "rresult")
7693

94+
@property
95+
def is_rresult_ok(self) -> bool:
96+
return self.is_xpr_ok(3)
97+
98+
@property
99+
def cresult(self) -> "XXpr":
100+
return self.cxpr(0, "cresult")
101+
102+
@property
103+
def is_cresult_ok(self) -> bool:
104+
return self.is_cxpr_ok(0)
105+
77106
@property
78107
def result_simplified(self) -> str:
79-
return simplify_result(
80-
self.xdata.args[3], self.xdata.args[4], self.result, self.rresult)
108+
if self.is_result_ok and self.is_rresult_ok:
109+
return simplify_result(
110+
self.xdata.args[3], self.xdata.args[4], self.result, self.rresult)
111+
else:
112+
return str(self.xrn) + " & " + str(self.xrm)
81113

82114
@property
83115
def annotation(self) -> str:
84-
assignment = str(self.vrd) + " := " + self.result_simplified
116+
cresult = (
117+
" (C: "
118+
+ (str(self.cresult) if self.is_cresult_ok else "None")
119+
+ ")")
120+
assignment = str(self.vrd) + " := " + self.result_simplified + cresult
85121
return self.add_instruction_condition(assignment)
86122

87123

@@ -99,13 +135,8 @@ class ARMBitwiseAnd(ARMOpcode):
99135
args[3]: index of rm in armdictionary
100136
args[4]: is-wide (thumb)
101137
102-
xdata format: a:vxxxxrrdh
103-
-------------------------
104-
vars[0]: lhs
105-
xprs[0]: xrn
106-
xprs[1]: xrm
107-
xprs[2]: xrn & xrm
108-
xprs[3]: xrn & xrm (simplified)
138+
xdata format:
139+
-------------
109140
rdefs[0]: xrm
110141
rdefs[1]: xrn
111142
rdefs[2..]: xrn & xrm (simplified)
@@ -136,10 +167,7 @@ def mnemonic_extension(self) -> str:
136167

137168
def annotation(self, xdata: InstrXData) -> str:
138169
xd = ARMBitwiseAndXData(xdata)
139-
if xd.is_ok:
140-
return xd.annotation
141-
else:
142-
return "Error value"
170+
return xd.annotation
143171

144172
def ast_prov(
145173
self,
@@ -173,13 +201,22 @@ def ast_prov(
173201
# high-level assignment
174202

175203
xd = ARMBitwiseAndXData(xdata)
176-
if not xd.is_ok:
204+
205+
if xd.is_cresult_ok and xd.is_rresult_ok:
206+
rhs = xd.cresult
207+
208+
elif xd.is_rresult_ok:
209+
rhs = xd.rresult
210+
211+
elif xd.is_result_ok:
212+
rhs = xd.result
213+
214+
else:
177215
chklogger.logger.error(
178-
"Encountered error value at address %s", iaddr)
179-
return ([], [])
216+
"AND: Encountered error value for rhs at address %s", iaddr)
217+
return ([], [ll_assign])
180218

181219
lhs = xd.vrd
182-
rhs = xd.rresult
183220

184221
defuses = xdata.defuses
185222
defuseshigh = xdata.defuseshigh

0 commit comments

Comments
 (0)