Skip to content

Commit e876c78

Browse files
committed
ARM:ORR: update for conversion to C expressions
1 parent 09c4683 commit e876c78

File tree

1 file changed

+56
-19
lines changed

1 file changed

+56
-19
lines changed

chb/arm/opcodes/ARMBitwiseOr.py

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@
4949

5050

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

5366
def __init__(self, xdata: InstrXData) -> None:
5467
ARMOpcodeXData.__init__(self, xdata)
@@ -69,18 +82,41 @@ def xrm(self) -> "XXpr":
6982
def result(self) -> "XXpr":
7083
return self.xpr(2, "result")
7184

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

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

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

86122

@@ -98,13 +134,8 @@ class ARMBitwiseOr(ARMOpcode):
98134
args[3]: index of op3 in armdictionary
99135
args[4]: is-wide (thumb)
100136
101-
xdata format: a:vxxxxrrdh
102-
-------------------------
103-
vars[0]: lhs
104-
xprs[0]: xrn
105-
xprs[1]: xrm
106-
xprs[2]: xrn & xrm
107-
xprs[3]: xrn & xrm (simplified)
137+
xdata format:
138+
-------------
108139
rdefs[0]: xrm
109140
rdefs[1]: xrn
110141
rdefs[2..]: xrn & xrm (simplified)
@@ -136,10 +167,7 @@ def opargs(self) -> List[ARMOperand]:
136167

137168
def annotation(self, xdata: InstrXData) -> str:
138169
xd = ARMBitwiseOrXData(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,18 +201,27 @@ def ast_prov(
173201
# high-level assignment
174202

175203
xd = ARMBitwiseOrXData(xdata)
176-
if not xd.is_ok:
204+
205+
if xd.is_cresult_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+
"ORR: Encountered error value for rhs at address %s", iaddr)
217+
return ([], [ll_assign])
180218

181219
lhs = xd.vrd
182-
rhs3 = xd.rresult
183220
defuses = xdata.defuses
184221
defuseshigh = xdata.defuseshigh
185222

186223
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
187-
hl_rhs = XU.xxpr_to_ast_def_expr(rhs3, xdata, iaddr, astree)
224+
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
188225

189226
hl_assign = astree.mk_assign(
190227
hl_lhs,

0 commit comments

Comments
 (0)