@@ -240,24 +240,55 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
240
240
self . copy_op_transmute ( args[ 0 ] , dest) ?;
241
241
}
242
242
"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 ;
245
244
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
+ } ;
254
273
}
255
- self . write_vector ( vector, dest) ?;
256
274
}
257
275
"simd_extract" => {
258
276
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
+ ) ?;
261
292
}
262
293
_ => return Ok ( false ) ,
263
294
}
0 commit comments