@@ -204,12 +204,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
204
204
205
205
this. write_scalar ( res, dest) ?;
206
206
}
207
- // Used to implement the _mm_cvtsi32_ss function .
208
- // Converts `right` from i32 to f32. Returns a SIMD vector with
207
+ // Used to implement the _mm_cvtsi32_ss and _mm_cvtsi64_ss functions .
208
+ // Converts `right` from i32/i64 to f32. Returns a SIMD vector with
209
209
// the result in the first component and the remaining components
210
210
// are copied from `left`.
211
211
// https://www.felixcloutier.com/x86/cvtsi2ss
212
- "cvtsi2ss" => {
212
+ "cvtsi2ss" | "cvtsi642ss" => {
213
213
let [ left, right] =
214
214
this. check_shim ( abi, Abi :: C { unwind : false } , link_name, args) ?;
215
215
@@ -218,42 +218,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
218
218
219
219
assert_eq ! ( dest_len, left_len) ;
220
220
221
- let right = this. read_scalar ( right) ? . to_i32 ( ) ?;
222
-
223
- let res0 = Scalar :: from_f32 ( Single :: from_i128 ( right. into ( ) ) . value ) ;
224
- this. write_scalar ( res0, & this . project_index ( & dest , 0 ) ? ) ?;
221
+ let right = this. read_immediate ( right) ?;
222
+ let dest0 = this . project_index ( & dest , 0 ) ? ;
223
+ let res0 = this . int_to_int_or_float ( & right, dest0 . layout . ty ) ? ;
224
+ this. write_immediate ( res0, & dest0 ) ?;
225
225
226
226
for i in 1 ..dest_len {
227
- let left = this. read_immediate ( & this. project_index ( & left, i) ?) ?;
228
- let dest = this. project_index ( & dest, i) ?;
229
-
230
- this. write_immediate ( * left, & dest) ?;
231
- }
232
- }
233
- // Used to implement the _mm_cvtsi64_ss function.
234
- // Converts `right` from i64 to f32. Returns a SIMD vector with
235
- // the result in the first component and the remaining components
236
- // are copied from `left`.
237
- // https://www.felixcloutier.com/x86/cvtsi2ss
238
- "cvtsi642ss" => {
239
- let [ left, right] =
240
- this. check_shim ( abi, Abi :: C { unwind : false } , link_name, args) ?;
241
-
242
- let ( left, left_len) = this. operand_to_simd ( left) ?;
243
- let ( dest, dest_len) = this. place_to_simd ( dest) ?;
244
-
245
- assert_eq ! ( dest_len, left_len) ;
246
-
247
- let right = this. read_scalar ( right) ?. to_i64 ( ) ?;
248
-
249
- let res0 = Scalar :: from_f32 ( Single :: from_i128 ( right. into ( ) ) . value ) ;
250
- this. write_scalar ( res0, & this. project_index ( & dest, 0 ) ?) ?;
251
-
252
- for i in 1 ..dest_len {
253
- let left = this. read_immediate ( & this. project_index ( & left, i) ?) ?;
254
- let dest = this. project_index ( & dest, i) ?;
255
-
256
- this. write_immediate ( * left, & dest) ?;
227
+ this. copy_op (
228
+ & this. project_index ( & left, i) ?,
229
+ & this. project_index ( & dest, i) ?,
230
+ /*allow_transmute*/ false ,
231
+ ) ?;
257
232
}
258
233
}
259
234
// Used to implement the _mm_movemask_ps function.
0 commit comments