@@ -136,6 +136,8 @@ where
136136 LLIL_ZX => ExprInfo :: Zx ( Operation :: new ( function, op) ) ,
137137 LLIL_LOW_PART => ExprInfo :: LowPart ( Operation :: new ( function, op) ) ,
138138
139+ LLIL_REG_SPLIT => ExprInfo :: RegSplit ( Operation :: new ( function, op) ) ,
140+
139141 LLIL_CMP_E => ExprInfo :: CmpE ( Operation :: new ( function, op) ) ,
140142 LLIL_CMP_NE => ExprInfo :: CmpNe ( Operation :: new ( function, op) ) ,
141143 LLIL_CMP_SLT => ExprInfo :: CmpSlt ( Operation :: new ( function, op) ) ,
@@ -273,6 +275,7 @@ where
273275 LLIL_LOAD => ExprInfo :: Load ( Operation :: new ( self . function , op) ) ,
274276 LLIL_POP => ExprInfo :: Pop ( Operation :: new ( self . function , op) ) ,
275277 LLIL_REG => ExprInfo :: Reg ( Operation :: new ( self . function , op) ) ,
278+ LLIL_REG_SPLIT => ExprInfo :: RegSplit ( Operation :: new ( self . function , op) ) ,
276279 LLIL_FLAG => ExprInfo :: Flag ( Operation :: new ( self . function , op) ) ,
277280 LLIL_FLAG_BIT => ExprInfo :: FlagBit ( Operation :: new ( self . function , op) ) ,
278281 LLIL_FLAG_COND => ExprInfo :: FlagCond ( Operation :: new ( self . function , op) ) , // TODO lifted only
@@ -327,6 +330,7 @@ where
327330 match op. operation {
328331 LLIL_LOAD_SSA => ExprInfo :: Load ( Operation :: new ( self . function , op) ) ,
329332 LLIL_REG_SSA | LLIL_REG_SSA_PARTIAL => ExprInfo :: Reg ( Operation :: new ( self . function , op) ) ,
333+ LLIL_REG_SPLIT_SSA => ExprInfo :: RegSplit ( Operation :: new ( self . function , op) ) ,
330334 LLIL_FLAG_SSA => ExprInfo :: Flag ( Operation :: new ( self . function , op) ) ,
331335 LLIL_FLAG_BIT_SSA => ExprInfo :: FlagBit ( Operation :: new ( self . function , op) ) ,
332336 _ => common_info ( self . function , op) ,
@@ -383,6 +387,7 @@ where
383387 Load ( Operation < ' func , A , M , F , operation:: Load > ) ,
384388 Pop ( Operation < ' func , A , M , F , operation:: Pop > ) ,
385389 Reg ( Operation < ' func , A , M , F , operation:: Reg > ) ,
390+ RegSplit ( Operation < ' func , A , M , F , operation:: RegSplit > ) ,
386391 Const ( Operation < ' func , A , M , F , operation:: Const > ) ,
387392 ConstPtr ( Operation < ' func , A , M , F , operation:: Const > ) ,
388393 Flag ( Operation < ' func , A , M , F , operation:: Flag > ) ,
@@ -595,6 +600,8 @@ where
595600
596601 Reg ( ref op) => & op. op ,
597602
603+ RegSplit ( ref op) => & op. op ,
604+
598605 Flag ( ref op) => & op. op ,
599606
600607 FlagBit ( ref op) => & op. op ,
@@ -648,6 +655,8 @@ where
648655
649656 Reg ( ref op) => op. flag_write ( ) ,
650657
658+ RegSplit ( ref op) => op. flag_write ( ) ,
659+
651660 Flag ( ref op) => op. flag_write ( ) ,
652661
653662 FlagBit ( ref op) => op. flag_write ( ) ,
@@ -735,6 +744,31 @@ where
735744 }
736745 }
737746
747+ RegSplit ( ref op) => {
748+ let low_reg = op. low_reg ( ) ;
749+ let high_reg = op. high_reg ( ) ;
750+ let size = op. size ( ) ;
751+
752+ let low_size = match low_reg {
753+ Register :: Temp ( _) => Some ( size) ,
754+ Register :: ArchReg ( ref r) if r. info ( ) . size ( ) != size => Some ( size) ,
755+ _ => None ,
756+ } ;
757+
758+ let high_size = match high_reg {
759+ Register :: Temp ( _) => Some ( size) ,
760+ Register :: ArchReg ( ref r) if r. info ( ) . size ( ) != size => Some ( size) ,
761+ _ => None ,
762+ } ;
763+
764+ match ( low_size, high_size) {
765+ ( Some ( ls) , Some ( hs) ) => write ! ( f, "{:?}.{}:{:?}.{}" , high_reg, hs, low_reg, ls) ,
766+ ( Some ( ls) , None ) => write ! ( f, "{:?}:{:?}.{}" , high_reg, low_reg, ls) ,
767+ ( None , Some ( hs) ) => write ! ( f, "{:?}.{}:{:?}" , high_reg, hs, low_reg) ,
768+ _ => write ! ( f, "{:?}:{:?}" , high_reg, low_reg) ,
769+ }
770+ }
771+
738772 Flag ( ref _op) => write ! ( f, "flag" ) , // TODO
739773
740774 FlagBit ( ref _op) => write ! ( f, "flag_bit" ) , // TODO
0 commit comments