Skip to content

Commit 7072335

Browse files
committed
ARM:BIC: update for conversion to C expressions
1 parent f408fdd commit 7072335

File tree

1 file changed

+64
-21
lines changed

1 file changed

+64
-21
lines changed

chb/arm/opcodes/ARMBitwiseBitClear.py

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

5050

5151
class ARMBitwiseBitClearXData(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)
@@ -57,26 +70,55 @@ def __init__(self, xdata: InstrXData) -> None:
5770
def vrd(self) -> "XVariable":
5871
return self.var(0, "vrd")
5972

73+
@property
74+
def xrn(self) -> "XXpr":
75+
return self.xpr(0, "xrn")
76+
6077
@property
6178
def xrm(self) -> "XXpr":
62-
return self.xpr(0, "xrm")
79+
return self.xpr(1, "xrm")
6380

6481
@property
6582
def result(self) -> "XXpr":
66-
return self.xpr(1, "result")
83+
return self.xpr(2, "result")
84+
85+
@property
86+
def is_result_ok(self) -> bool:
87+
return self.is_xpr_ok(2)
6788

6889
@property
6990
def rresult(self) -> "XXpr":
70-
return self.xpr(2, "rresult")
91+
return self.xpr(3, "rresult")
92+
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)
71104

72105
@property
73106
def result_simplified(self) -> str:
74-
return simplify_result(
75-
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+
elif self.is_result_ok:
111+
return str(self.result)
112+
else:
113+
return str(self.xrn) + " & ~" + str(self.xrm)
76114

77115
@property
78116
def annotation(self) -> str:
79-
assignment = str(self.vrd) + " := " + self.result_simplified
117+
cresult = (
118+
" (C: "
119+
+ (str(self.cresult) if self.is_cresult_ok else "None")
120+
+ ")")
121+
assignment = str(self.vrd) + " := " + self.result_simplified + cresult
80122
return self.add_instruction_condition(assignment)
81123

82124

@@ -93,13 +135,8 @@ class ARMBitwiseBitClear(ARMOpcode):
93135
args[3]: index of op3 in armdictionary
94136
args[4]: is-wide (thumb)
95137
96-
xdata format: a:vxxxxrr..dh
97-
---------------------------
98-
vars[0]: lhs
99-
xprs[0]: rhs1
100-
xprs[1]: rhs2
101-
xprs[2]: rhs1 & (not (rhs2))
102-
xprs[3]: rhs1 & (not (rhs2)) simplified
138+
xdata format
139+
------------
103140
rdefs[0]: rhs1
104141
rdefs[1]: rhs2
105142
rdefs[2:.]: result
@@ -121,10 +158,7 @@ def opargs(self) -> List[ARMOperand]:
121158

122159
def annotation(self, xdata: InstrXData) -> str:
123160
xd = ARMBitwiseBitClearXData(xdata)
124-
if xd.is_ok:
125-
return xd.annotation
126-
else:
127-
return "Error value"
161+
return xd.annotation
128162

129163
def ast_prov(
130164
self,
@@ -159,13 +193,22 @@ def ast_prov(
159193
# high-level assignment
160194

161195
xd = ARMBitwiseBitClearXData(xdata)
162-
if not xd.is_ok:
196+
197+
if xd.is_cresult_ok:
198+
rhs = xd.cresult
199+
200+
elif xd.is_rresult_ok:
201+
rhs = xd.rresult
202+
203+
elif xd.is_result_ok:
204+
rhs = xd.result
205+
206+
else:
163207
chklogger.logger.error(
164-
"Encountered error value at address %s", iaddr)
165-
return ([], [])
208+
"BIC: Encountered error value for rhs at address %s", iaddr)
209+
return ([], [ll_assign])
166210

167211
lhs = xd.vrd
168-
rhs = xd.rresult
169212
defuses = xdata.defuses
170213
defuseshigh = xdata.defuseshigh
171214

0 commit comments

Comments
 (0)