@@ -241,16 +241,16 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
241
241
}
242
242
"simd_insert" => {
243
243
let index = self . read_scalar ( args[ 1 ] ) ?. to_u32 ( ) ? as u64 ;
244
- let scalar = self . read_immediate ( args[ 2 ] ) ? ;
244
+ let scalar = args[ 2 ] ;
245
245
let input = args[ 0 ] ;
246
246
let ( len, e_ty) = self . read_vector_ty ( input) ;
247
247
assert ! (
248
248
index < len,
249
- "index `{}` must be in bounds of vector type `{}`: `[0, {})`" ,
249
+ "Index `{}` must be in bounds of vector type `{}`: `[0, {})`" ,
250
250
index, e_ty, len
251
251
) ;
252
252
assert_eq ! (
253
- args [ 0 ] . layout, dest. layout,
253
+ input . layout, dest. layout,
254
254
"Return type `{}` must match vector type `{}`" ,
255
255
dest. layout. ty, input. layout. ty
256
256
) ;
@@ -261,34 +261,29 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
261
261
) ;
262
262
263
263
for i in 0 ..len {
264
- let place = self . place_field ( dest, index ) ?;
265
- if i == index {
266
- self . write_immediate ( * scalar, place ) ? ;
264
+ let place = self . place_field ( dest, i ) ?;
265
+ let value = if i == index {
266
+ scalar
267
267
} else {
268
- self . write_immediate (
269
- * self . read_immediate ( self . operand_field ( input, index) ?) ?,
270
- place
271
- ) ?;
268
+ self . operand_field ( input, i) ?
272
269
} ;
270
+ self . copy_op ( value, place) ?;
273
271
}
274
272
}
275
273
"simd_extract" => {
276
274
let index = self . read_scalar ( args[ 1 ] ) ?. to_u32 ( ) ? as _ ;
277
275
let ( len, e_ty) = self . read_vector_ty ( args[ 0 ] ) ;
278
276
assert ! (
279
277
index < len,
280
- "index `{}` must be in bounds of vector type `{}`: `[0, {}) `" ,
278
+ "index `{}` is out-of- bounds of vector type `{}` with length `{} `" ,
281
279
index, e_ty, len
282
280
) ;
283
281
assert_eq ! (
284
282
e_ty, dest. layout. ty,
285
283
"Return type `{}` must match vector element type `{}`" ,
286
284
dest. layout. ty, e_ty
287
285
) ;
288
- self . write_immediate (
289
- * self . read_immediate ( self . operand_field ( args[ 0 ] , index) ?) ?,
290
- dest
291
- ) ?;
286
+ self . copy_op ( self . operand_field ( args[ 0 ] , index) ?, dest) ?;
292
287
}
293
288
_ => return Ok ( false ) ,
294
289
}
0 commit comments