4949
5050
5151class ARMCompareXData (ARMOpcodeXData ):
52- """
53- xdata format: a:xxxrr
54- ---------------------
55- xprs[0]: xrn
56- xprs[1]: xrm
57- xprs[2]: xrn - xrm (simplified)
52+ """Data format:
53+ ---------------
54+ - expressions:
55+ 0: xrn
56+ 1: xrm:
57+ 2: xresult (xrn - xrm)
58+ 3: result (xresult rewritten)
59+
60+ - c expressions:
61+ 0: cresult
62+
5863 rdefs[0]: rn
5964 rdefs[1]: rm
6065 rdefs[2..]: xrn - xrm (simplified)
@@ -71,15 +76,32 @@ def xrn(self) -> "XXpr":
7176 def xrm (self ) -> "XXpr" :
7277 return self .xpr (1 , "xrm" )
7378
79+ @property
80+ def xresult (self ) -> "XXpr" :
81+ return self .xpr (2 , "xresult" )
82+
7483 @property
7584 def result (self ) -> "XXpr" :
76- return self .xpr (2 , "result" )
85+ return self .xpr (3 , "result" )
86+
87+ @property
88+ def is_result_ok (self ) -> bool :
89+ return self .is_xpr_ok (3 )
90+
91+ @property
92+ def cresult (self ) -> "XXpr" :
93+ return self .cxpr (0 , "cresult" )
94+
95+ @property
96+ def is_cresult_ok (self ) -> bool :
97+ return self .is_cxpr_ok (0 )
7798
7899 @property
79100 def annotation (self ) -> str :
101+ cx = " (C: " + (str (self .cresult ) if self .is_cresult_ok else "None" ) + ")"
80102 ann = "compare " + str (self .xrn ) + " and " + str (self .xrm )
81103 if self .is_ok :
82- ann += " (" + str (self .result ) + ")"
104+ ann += " (" + str (self .result ) + ")" + cx
83105 return self .add_instruction_condition (ann )
84106
85107
@@ -149,15 +171,15 @@ def ast_prov(
149171
150172 rdefs = xdata .reachingdefs
151173 xd = ARMCompareXData (xdata )
152- if xd .is_ok :
174+
175+ if xd .is_cresult_ok :
176+ rhs = xd .cresult
177+ elif xd .is_result_ok :
153178 rhs = xd .result
154- hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
155179 else :
156- rhs1 = xd .xrn
157- rhs2 = xd .xrm
158- hl_rhs1 = XU .xxpr_to_ast_def_expr (rhs1 , xdata , iaddr , astree )
159- hl_rhs2 = XU .xxpr_to_ast_def_expr (rhs2 , xdata , iaddr , astree )
160- hl_rhs = astree .mk_binary_op ("minus" , hl_rhs1 , hl_rhs2 )
180+ rhs = xd .xresult
181+
182+ hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
161183
162184 hl_assign = astree .mk_assign (
163185 astree .ignoredlhs ,
0 commit comments