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