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:
@@ -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);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|||||||
Reference in New Issue
Block a user