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