@@ -240,24 +240,55 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
240240 self . copy_op_transmute ( args[ 0 ] , dest) ?;
241241 }
242242 "simd_insert" => {
243- let mut vector = self . read_vector ( args[ 0 ] ) ?;
244- let index = self . read_scalar ( args[ 1 ] ) ?. to_u32 ( ) ? as usize ;
243+ let index = self . read_scalar ( args[ 1 ] ) ?. to_u32 ( ) ? as u64 ;
245244 let scalar = self . read_immediate ( args[ 2 ] ) ?;
246- if vector[ index] . layout . size == scalar. layout . size {
247- vector[ index] = scalar;
248- } else {
249- throw_ub_format ! (
250- "Inserting `{}` with size `{}` to a vector element place of size `{}`" ,
251- scalar. layout. ty,
252- scalar. layout. size. bytes( ) , vector[ index] . layout. size. bytes( )
253- ) ;
245+ let input = args[ 0 ] ;
246+ let ( len, e_ty) = self . read_vector_ty ( input) ;
247+ assert ! (
248+ index < len,
249+ "index `{}` must be in bounds of vector type `{}`: `[0, {})`" ,
250+ index, e_ty, len
251+ ) ;
252+ assert_eq ! (
253+ args[ 0 ] . layout, dest. layout,
254+ "Return type `{}` must match vector type `{}`" ,
255+ dest. layout. ty, input. layout. ty
256+ ) ;
257+ assert_eq ! (
258+ scalar. layout. ty, e_ty,
259+ "Scalar type `{}` must match vector element type `{}`" ,
260+ scalar. layout. ty, e_ty
261+ ) ;
262+
263+ for i in 0 ..len {
264+ let place = self . place_field ( dest, index) ?;
265+ if i == index {
266+ self . write_immediate ( * scalar, place) ?;
267+ } else {
268+ self . write_immediate (
269+ * self . read_immediate ( self . operand_field ( input, index) ?) ?,
270+ place
271+ ) ?;
272+ } ;
254273 }
255- self . write_vector ( vector, dest) ?;
256274 }
257275 "simd_extract" => {
258276 let index = self . read_scalar ( args[ 1 ] ) ?. to_u32 ( ) ? as _ ;
259- let scalar = self . read_immediate ( self . operand_field ( args[ 0 ] , index) ?) ?;
260- self . write_immediate ( * scalar, dest) ?;
277+ let ( len, e_ty) = self . read_vector_ty ( args[ 0 ] ) ;
278+ assert ! (
279+ index < len,
280+ "index `{}` must be in bounds of vector type `{}`: `[0, {})`" ,
281+ index, e_ty, len
282+ ) ;
283+ assert_eq ! (
284+ e_ty, dest. layout. ty,
285+ "Return type `{}` must match vector element type `{}`" ,
286+ dest. layout. ty, e_ty
287+ ) ;
288+ self . write_immediate (
289+ * self . read_immediate ( self . operand_field ( args[ 0 ] , index) ?) ?,
290+ dest
291+ ) ?;
261292 }
262293 _ => return Ok ( false ) ,
263294 }
0 commit comments