@@ -8,7 +8,7 @@ use rustc_middle::{mir, mir::BinOp, ty, ty::FloatTy};
8
8
use rustc_target:: abi:: { Align , Integer } ;
9
9
10
10
use crate :: * ;
11
- use helpers:: check_arg_count;
11
+ use helpers:: { bool_to_simd_element , check_arg_count, simd_element_to_bool } ;
12
12
13
13
pub enum AtomicOp {
14
14
MirOp ( mir:: BinOp , bool ) ,
@@ -365,8 +365,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
365
365
// Special handling for boolean-returning operations
366
366
assert_eq ! ( ty, this. tcx. types. bool ) ;
367
367
let val = val. to_bool ( ) . unwrap ( ) ;
368
- let val = if val { -1 } else { 0 } ; // SIMD uses all-1 as pattern for "true"
369
- let val = Scalar :: from_int ( val, dest. layout . size ) ;
368
+ let val = bool_to_simd_element ( val, dest. layout . size ) ;
370
369
this. write_scalar ( val, & dest. into ( ) ) ?;
371
370
} else {
372
371
assert_eq ! ( ty, dest. layout. ty) ;
@@ -381,16 +380,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
381
380
let mut res = false ; // the neutral element
382
381
for i in 0 ..arg_len {
383
382
let op = this. read_immediate ( & this. mplace_index ( & arg, i) ?. into ( ) ) ?;
384
- // We convert it to a *signed* integer and expect either 0 or -1 (the latter means all bits were set).
385
- let val = op. to_scalar ( ) ?. to_int ( op. layout . size ) ?;
386
- let val = match val {
387
- 0 => false ,
388
- -1 => true ,
389
- _ =>
390
- throw_ub_format ! (
391
- "each element of a simd_reduce_any operand must be all-0-bits or all-1-bits"
392
- ) ,
393
- } ;
383
+ let val = simd_element_to_bool ( op) ?;
394
384
res = res | val;
395
385
}
396
386
0 commit comments