@@ -656,6 +656,54 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
656
656
}
657
657
}
658
658
}
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
+ }
659
707
660
708
name => throw_unsup_format ! ( "unimplemented intrinsic: `simd_{name}`" ) ,
661
709
}
0 commit comments