Skip to content

Commit e0a51bc

Browse files
committed
ARM:MUL: update for conversion to C expressions
1 parent 3681100 commit e0a51bc

File tree

1 file changed

+55
-15
lines changed

1 file changed

+55
-15
lines changed

chb/arm/opcodes/ARMMultiply.py

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

5151

5252
class ARMMultiplyXData(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

@@ -112,10 +148,7 @@ def opargs(self) -> List[ARMOperand]:
112148

113149
def annotation(self, xdata: InstrXData) -> str:
114150
xd = ARMMultiplyXData(xdata)
115-
if xd.is_ok:
116-
return xd.annotation
117-
else:
118-
return "Error value"
151+
return xd.annotation
119152

120153
def ast_prov(
121154
self,
@@ -149,20 +182,27 @@ def ast_prov(
149182
# high-level assignment
150183

151184
xd = ARMMultiplyXData(xdata)
152-
if not xd.is_ok:
153-
chklogger.logger.error("Error value encountered at %s", iaddr)
154-
return ([], [])
155185

156-
lhs = xd.vrd
157-
rhs1 = xd.xrn
158-
rhs2 = xd.xrm
159-
rhs3 = xd.rresult
186+
if xd.is_cresult_ok and xd.is_rresult_ok:
187+
rhs = xd.cresult
188+
189+
elif xd.is_rresult_ok:
190+
rhs = xd.rresult
160191

192+
elif xd.is_result_ok:
193+
rhs = xd.result
194+
195+
else:
196+
chklogger.logger.error(
197+
"MUL: Encountered error value for rhs at address %s", iaddr)
198+
return ([], [ll_assign])
199+
200+
lhs = xd.vrd
161201
defuses = xdata.defuses
162202
defuseshigh = xdata.defuseshigh
163203

164204
hl_lhs = XU.xvariable_to_ast_lval(lhs, xdata, iaddr, astree)
165-
hl_rhs = XU.xxpr_to_ast_def_expr(rhs3, xdata, iaddr, astree)
205+
hl_rhs = XU.xxpr_to_ast_def_expr(rhs, xdata, iaddr, astree)
166206

167207
hl_assign = astree.mk_assign(
168208
hl_lhs,

0 commit comments

Comments
 (0)