@@ -2,7 +2,7 @@ use rustc_middle::mir;
22use rustc_span:: Symbol ;
33use rustc_target:: spec:: abi:: Abi ;
44
5- use super :: { round_all, round_first} ;
5+ use super :: { bin_op_folded , round_all, round_first} ;
66use crate :: * ;
77use shims:: foreign_items:: EmulateForeignItemResult ;
88
@@ -257,26 +257,18 @@ pub(super) trait EvalContextExt<'mir, 'tcx: 'mir>:
257257 "ptestz" | "ptestc" | "ptestnzc" => {
258258 let [ op, mask] = this. check_shim ( abi, Abi :: C { unwind : false } , link_name, args) ?;
259259
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) ?;
280272 }
281273 _ => return Ok ( EmulateForeignItemResult :: NotSupported ) ,
282274 }
0 commit comments