4949
5050
5151class 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