@@ -800,15 +800,25 @@ impl Evaluator<'_> {
800800 }
801801 "ctpop" => {
802802 let [ arg] = args else {
803- return Err ( MirEvalError :: TypeError ( "likely arg is not provided" ) ) ;
803+ return Err ( MirEvalError :: TypeError ( "ctpop arg is not provided" ) ) ;
804804 } ;
805805 let result = u128:: from_le_bytes ( pad16 ( arg. get ( self ) ?, false ) ) . count_ones ( ) ;
806806 destination
807807 . write_from_bytes ( self , & ( result as u128 ) . to_le_bytes ( ) [ 0 ..destination. size ] )
808808 }
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+ }
809819 "cttz" | "cttz_nonzero" => {
810820 let [ arg] = args else {
811- return Err ( MirEvalError :: TypeError ( "likely arg is not provided" ) ) ;
821+ return Err ( MirEvalError :: TypeError ( "cttz arg is not provided" ) ) ;
812822 } ;
813823 let result = u128:: from_le_bytes ( pad16 ( arg. get ( self ) ?, false ) ) . trailing_zeros ( ) ;
814824 destination
@@ -932,6 +942,24 @@ impl Evaluator<'_> {
932942 let addr = Address :: from_bytes ( arg. interval . get ( self ) ?) ?;
933943 destination. write_from_interval ( self , Interval { addr, size : destination. size } )
934944 }
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+ }
935963 _ => not_supported ! ( "unknown intrinsic {name}" ) ,
936964 }
937965 }
0 commit comments