@@ -656,6 +656,54 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
656656 }
657657 }
658658 }
659+ "masked_load" => {
660+ let [ mask, ptr, default] = check_arg_count ( args) ?;
661+ let ( mask, mask_len) = this. operand_to_simd ( mask) ?;
662+ let ptr = this. read_pointer ( ptr) ?;
663+ let ( default, default_len) = this. operand_to_simd ( default) ?;
664+ let ( dest, dest_len) = this. place_to_simd ( dest) ?;
665+
666+ assert_eq ! ( dest_len, mask_len) ;
667+ assert_eq ! ( dest_len, default_len) ;
668+
669+ for i in 0 ..dest_len {
670+ let mask = this. read_immediate ( & this. project_index ( & mask, i) ?) ?;
671+ let default = this. read_immediate ( & this. project_index ( & default, i) ?) ?;
672+ let dest = this. project_index ( & dest, i) ?;
673+
674+ let val = if simd_element_to_bool ( mask) ? {
675+ // Size * u64 is implemented as always checked
676+ #[ allow( clippy:: arithmetic_side_effects) ]
677+ let ptr = ptr. wrapping_offset ( dest. layout . size * i, this) ;
678+ let place = this. ptr_to_mplace ( ptr, dest. layout ) ;
679+ this. read_immediate ( & place) ?
680+ } else {
681+ default
682+ } ;
683+ this. write_immediate ( * val, & dest) ?;
684+ }
685+ }
686+ "masked_store" => {
687+ let [ mask, ptr, vals] = check_arg_count ( args) ?;
688+ let ( mask, mask_len) = this. operand_to_simd ( mask) ?;
689+ let ptr = this. read_pointer ( ptr) ?;
690+ let ( vals, vals_len) = this. operand_to_simd ( vals) ?;
691+
692+ assert_eq ! ( mask_len, vals_len) ;
693+
694+ for i in 0 ..vals_len {
695+ let mask = this. read_immediate ( & this. project_index ( & mask, i) ?) ?;
696+ let val = this. read_immediate ( & this. project_index ( & vals, i) ?) ?;
697+
698+ if simd_element_to_bool ( mask) ? {
699+ // Size * u64 is implemented as always checked
700+ #[ allow( clippy:: arithmetic_side_effects) ]
701+ let ptr = ptr. wrapping_offset ( val. layout . size * i, this) ;
702+ let place = this. ptr_to_mplace ( ptr, val. layout ) ;
703+ this. write_immediate ( * val, & place) ?
704+ } ;
705+ }
706+ }
659707
660708 name => throw_unsup_format ! ( "unimplemented intrinsic: `simd_{name}`" ) ,
661709 }
0 commit comments