@@ -2,7 +2,7 @@ use rustc_middle::mir;
2
2
use rustc_span:: Symbol ;
3
3
use rustc_target:: spec:: abi:: Abi ;
4
4
5
- use super :: { round_all, round_first} ;
5
+ use super :: { bin_op_folded , round_all, round_first} ;
6
6
use crate :: * ;
7
7
use shims:: foreign_items:: EmulateForeignItemResult ;
8
8
@@ -257,26 +257,18 @@ pub(super) trait EvalContextExt<'mir, 'tcx: 'mir>:
257
257
"ptestz" | "ptestc" | "ptestnzc" => {
258
258
let [ op, mask] = this. check_shim ( abi, Abi :: C { unwind : false } , link_name, args) ?;
259
259
260
- let ( op, op_len) = this. operand_to_simd ( op) ?;
261
- let ( mask, mask_len) = this. operand_to_simd ( mask) ?;
262
-
263
- assert_eq ! ( op_len, mask_len) ;
264
-
265
- let f = match unprefixed_name {
266
- "ptestz" => |op, mask| op & mask == 0 ,
267
- "ptestc" => |op, mask| op & mask == mask,
268
- "ptestnzc" => |op, mask| op & mask != 0 && op & mask != mask,
269
- _ => unreachable ! ( ) ,
270
- } ;
271
-
272
- let mut all_zero = true ;
273
- for i in 0 ..op_len {
274
- let op = this. read_scalar ( & this. project_index ( & op, i) ?) ?. to_u64 ( ) ?;
275
- let mask = this. read_scalar ( & this. project_index ( & mask, i) ?) ?. to_u64 ( ) ?;
276
- all_zero &= f ( op, mask) ;
277
- }
278
-
279
- this. write_scalar ( Scalar :: from_i32 ( all_zero. into ( ) ) , dest) ?;
260
+ let res = bin_op_folded ( this, op, mask, true , |acc, op, mask| {
261
+ let op = op. to_scalar ( ) . to_uint ( op. layout . size ) ?;
262
+ let mask = mask. to_scalar ( ) . to_uint ( mask. layout . size ) ?;
263
+ Ok ( match unprefixed_name {
264
+ "ptestz" => acc && ( op & mask) == 0 ,
265
+ "ptestc" => acc && ( op & mask) == mask,
266
+ "ptestnzc" => acc && ( op & mask) != 0 && ( op & mask) != mask,
267
+ _ => unreachable ! ( ) ,
268
+ } )
269
+ } ) ?;
270
+
271
+ this. write_scalar ( Scalar :: from_i32 ( res. into ( ) ) , dest) ?;
280
272
}
281
273
_ => return Ok ( EmulateForeignItemResult :: NotSupported ) ,
282
274
}
0 commit comments