4949
5050
5151class ARMArithmeticShiftRightXData (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,43 @@ 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+ elif self .is_result_ok :
111+ return str (self .result )
112+ else :
113+ return str (self .xrn ) + " s>> " + str (self .xrm )
80114
81115 @property
82116 def annotation (self ) -> str :
83- 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
84122 return self .add_instruction_condition (assignment )
85123
86124
@@ -98,13 +136,8 @@ class ARMArithmeticShiftRight(ARMOpcode):
98136 args[3]: index of rm in armdictionary
99137 args[4]: is-wide (thumb)
100138
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)
139+ xdata format
140+ ------------
108141 rdefs[0]: xrm
109142 rdefs[1]: xrn
110143 rdefs[2..]: xrn >> xrm (simplified)
@@ -136,10 +169,7 @@ def mnemonic_extension(self) -> str:
136169
137170 def annotation (self , xdata : InstrXData ) -> str :
138171 xd = ARMArithmeticShiftRightXData (xdata )
139- if xd .is_ok :
140- return xd .annotation
141- else :
142- return "Error value"
172+ return xd .annotation
143173
144174 def ast_prov (
145175 self ,
@@ -168,21 +198,30 @@ def ast_prov(
168198 # high-level assignment
169199
170200 xd = ARMArithmeticShiftRightXData (xdata )
171- if not xd .is_ok :
201+
202+ if xd .is_cresult_ok and xd .is_rresult_ok :
203+ rhs = xd .cresult
204+
205+ elif xd .is_rresult_ok :
206+ rhs = xd .rresult
207+
208+ elif xd .is_result_ok :
209+ rhs = xd .result
210+
211+ else :
172212 chklogger .logger .error (
173- "Encountered error value at address %s" , iaddr )
174- return ([], [])
213+ "ASR: Encountered error value for rhs at address %s" , iaddr )
214+ return ([], [ll_assign ])
175215
176216 lhs = xd .vrd
177217 rhs1 = xd .xrn
178218 rhs2 = xd .xrm
179- rhs3 = xd .rresult
180219 rdefs = xdata .reachingdefs
181220 defuses = xdata .defuses
182221 defuseshigh = xdata .defuseshigh
183222
184223 hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
185- 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 )
186225
187226 hl_assign = astree .mk_assign (
188227 hl_lhs ,
0 commit comments