@@ -800,15 +800,25 @@ impl Evaluator<'_> {
800
800
}
801
801
"ctpop" => {
802
802
let [ arg] = args else {
803
- return Err ( MirEvalError :: TypeError ( "likely arg is not provided" ) ) ;
803
+ return Err ( MirEvalError :: TypeError ( "ctpop arg is not provided" ) ) ;
804
804
} ;
805
805
let result = u128:: from_le_bytes ( pad16 ( arg. get ( self ) ?, false ) ) . count_ones ( ) ;
806
806
destination
807
807
. write_from_bytes ( self , & ( result as u128 ) . to_le_bytes ( ) [ 0 ..destination. size ] )
808
808
}
809
+ "ctlz" | "ctlz_nonzero" => {
810
+ let [ arg] = args else {
811
+ return Err ( MirEvalError :: TypeError ( "cttz arg is not provided" ) ) ;
812
+ } ;
813
+ let result =
814
+ u128:: from_le_bytes ( pad16 ( arg. get ( self ) ?, false ) ) . leading_zeros ( ) as usize ;
815
+ let result = result - ( 128 - arg. interval . size * 8 ) ;
816
+ destination
817
+ . write_from_bytes ( self , & ( result as u128 ) . to_le_bytes ( ) [ 0 ..destination. size ] )
818
+ }
809
819
"cttz" | "cttz_nonzero" => {
810
820
let [ arg] = args else {
811
- return Err ( MirEvalError :: TypeError ( "likely arg is not provided" ) ) ;
821
+ return Err ( MirEvalError :: TypeError ( "cttz arg is not provided" ) ) ;
812
822
} ;
813
823
let result = u128:: from_le_bytes ( pad16 ( arg. get ( self ) ?, false ) ) . trailing_zeros ( ) ;
814
824
destination
@@ -932,6 +942,24 @@ impl Evaluator<'_> {
932
942
let addr = Address :: from_bytes ( arg. interval . get ( self ) ?) ?;
933
943
destination. write_from_interval ( self , Interval { addr, size : destination. size } )
934
944
}
945
+ "write_bytes" => {
946
+ let [ dst, val, count] = args else {
947
+ return Err ( MirEvalError :: TypeError ( "write_bytes args are not provided" ) ) ;
948
+ } ;
949
+ let count = from_bytes ! ( usize , count. get( self ) ?) ;
950
+ let val = from_bytes ! ( u8 , val. get( self ) ?) ;
951
+ let Some ( ty) = generic_args. as_slice ( Interner ) . get ( 0 ) . and_then ( |it| it. ty ( Interner ) )
952
+ else {
953
+ return Err ( MirEvalError :: TypeError (
954
+ "write_bytes generic arg is not provided" ,
955
+ ) ) ;
956
+ } ;
957
+ let dst = Address :: from_bytes ( dst. get ( self ) ?) ?;
958
+ let size = self . size_of_sized ( ty, locals, "copy_nonoverlapping ptr type" ) ?;
959
+ let size = count * size;
960
+ self . write_memory_using_ref ( dst, size) ?. fill ( val) ;
961
+ Ok ( ( ) )
962
+ }
935
963
_ => not_supported ! ( "unknown intrinsic {name}" ) ,
936
964
}
937
965
}
0 commit comments