@@ -333,15 +333,39 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
333
333
}
334
334
self . write_immediate ( * res, & dest) ?;
335
335
}
336
- sym:: simd_reduce_add_ordered | sym:: simd_reduce_mul_ordered => {
336
+ sym:: simd_reduce_add_ordered
337
+ | sym:: simd_reduce_add_unordered
338
+ | sym:: simd_reduce_mul_ordered
339
+ | sym:: simd_reduce_mul_unordered => {
337
340
use mir:: BinOp ;
338
341
339
342
let ( op, op_len) = self . project_to_simd ( & args[ 0 ] ) ?;
340
- let init = self . read_immediate ( & args[ 1 ] ) ?;
343
+ let elem_ty = op. layout . ty . sequence_element_type ( tcx) ;
344
+ let elem_layout = self . layout_of ( elem_ty) . unwrap ( ) ;
345
+ let init = match intrinsic_name {
346
+ sym:: simd_reduce_add_unordered => ImmTy :: from_int ( 0 , elem_layout) ,
347
+ sym:: simd_reduce_mul_unordered => match elem_ty. kind ( ) {
348
+ ty:: Int ( _) => ImmTy :: from_int ( 1i128 , elem_layout) ,
349
+ ty:: Uint ( _) => ImmTy :: from_uint ( 1u128 , elem_layout) ,
350
+ ty:: Float ( float_ty) => ImmTy :: from_scalar (
351
+ match float_ty {
352
+ FloatTy :: F16 => Scalar :: from_f16 ( Float :: from_i128 ( 1 ) . value ) ,
353
+ FloatTy :: F32 => Scalar :: from_f32 ( Float :: from_i128 ( 1 ) . value ) ,
354
+ FloatTy :: F64 => Scalar :: from_f64 ( Float :: from_i128 ( 1 ) . value ) ,
355
+ FloatTy :: F128 => Scalar :: from_f128 ( Float :: from_i128 ( 1 ) . value ) ,
356
+ } ,
357
+ elem_layout,
358
+ ) ,
359
+ _ => unreachable ! (
360
+ "`{intrinsic_name} called with unsupported SIMD element type `{elem_ty}`"
361
+ ) ,
362
+ } ,
363
+ _ => self . read_immediate ( & args[ 1 ] ) ?,
364
+ } ;
341
365
342
366
let mir_op = match intrinsic_name {
343
- sym:: simd_reduce_add_ordered => BinOp :: Add ,
344
- sym:: simd_reduce_mul_ordered => BinOp :: Mul ,
367
+ sym:: simd_reduce_add_ordered | sym :: simd_reduce_add_unordered => BinOp :: Add ,
368
+ sym:: simd_reduce_mul_ordered | sym :: simd_reduce_mul_unordered => BinOp :: Mul ,
345
369
_ => unreachable ! ( ) ,
346
370
} ;
347
371
0 commit comments