Use vselect in NaN canonicalization pass. (#5192)

Change add_nan_canon_seq to use vselect instead of bitselect.
This is more straightforward and removes bitcast operations.
Codegen should be unchanged.
This commit is contained in:
Ulrich Weigand
2022-11-03 21:36:38 +01:00
committed by GitHub
parent 137a8b710f
commit 342f805812

View File

@@ -70,11 +70,9 @@ fn add_nan_canon_seq(pos: &mut FuncCursor, inst: Inst) {
.select(is_nan, canon_nan, new_res); .select(is_nan, canon_nan, new_res);
}; };
let vector_select = |pos: &mut FuncCursor, canon_nan: Value| { let vector_select = |pos: &mut FuncCursor, canon_nan: Value| {
let cond = pos.ins().bitcast(types::I8X16, is_nan); pos.ins()
let canon_nan = pos.ins().bitcast(types::I8X16, canon_nan); .with_result(val)
let result = pos.ins().bitcast(types::I8X16, new_res); .vselect(is_nan, canon_nan, new_res);
let bitmask = pos.ins().bitselect(cond, canon_nan, result);
pos.ins().with_result(val).bitcast(val_type, bitmask);
}; };
match val_type { match val_type {
@@ -87,13 +85,13 @@ fn add_nan_canon_seq(pos: &mut FuncCursor, inst: Inst) {
scalar_select(pos, canon_nan); scalar_select(pos, canon_nan);
} }
types::F32X4 => { types::F32X4 => {
let canon_nan = pos.ins().iconst(types::I32, i64::from(CANON_32BIT_NAN)); let canon_nan = pos.ins().f32const(Ieee32::with_bits(CANON_32BIT_NAN));
let canon_nan = pos.ins().splat(types::I32X4, canon_nan); let canon_nan = pos.ins().splat(types::F32X4, canon_nan);
vector_select(pos, canon_nan); vector_select(pos, canon_nan);
} }
types::F64X2 => { types::F64X2 => {
let canon_nan = pos.ins().iconst(types::I64, CANON_64BIT_NAN as i64); let canon_nan = pos.ins().f64const(Ieee64::with_bits(CANON_64BIT_NAN));
let canon_nan = pos.ins().splat(types::I64X2, canon_nan); let canon_nan = pos.ins().splat(types::F64X2, canon_nan);
vector_select(pos, canon_nan); vector_select(pos, canon_nan);
} }
_ => { _ => {