From 66fe04ffab1ae0e1a7251f70c4e9e866a2ff9d68 Mon Sep 17 00:00:00 2001 From: Zijie Zhao Date: Tue, 13 Jan 2026 17:40:04 -0600 Subject: [PATCH] Add f16 and f128 support to NaN canonicalization Extend the NaN canonicalization pass to handle f16 and f128 floating point types, which were previously unsupported and would cause a panic. Closes #12336 --- cranelift/codegen/src/nan_canonicalization.rs | 11 ++++++++++- .../isa/riscv64/nan-canonicalization-f16.clif | 9 +++++++++ .../isa/s390x/nan-canonicalization-f128.clif | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 cranelift/filetests/filetests/isa/riscv64/nan-canonicalization-f16.clif create mode 100644 cranelift/filetests/filetests/isa/s390x/nan-canonicalization-f128.clif diff --git a/cranelift/codegen/src/nan_canonicalization.rs b/cranelift/codegen/src/nan_canonicalization.rs index e6a73deaf83a..761277f1fd27 100644 --- a/cranelift/codegen/src/nan_canonicalization.rs +++ b/cranelift/codegen/src/nan_canonicalization.rs @@ -4,7 +4,7 @@ use crate::cursor::{Cursor, FuncCursor}; use crate::ir::condcodes::FloatCC; -use crate::ir::immediates::{Ieee32, Ieee64}; +use crate::ir::immediates::{Ieee16, Ieee32, Ieee64, Ieee128}; use crate::ir::types::{self}; use crate::ir::{Function, Inst, InstBuilder, InstructionData, Opcode, Value}; use crate::opts::MemFlags; @@ -90,6 +90,10 @@ fn add_nan_canon_seq(pos: &mut FuncCursor, inst: Inst, has_vector_support: bool) }; match val_type { + types::F16 => { + let canon_nan = pos.ins().f16const(Ieee16::NAN); + scalar_select(pos, canon_nan); + } types::F32 => { let canon_nan = pos.ins().f32const(Ieee32::NAN); if has_vector_support { @@ -116,6 +120,11 @@ fn add_nan_canon_seq(pos: &mut FuncCursor, inst: Inst, has_vector_support: bool) let canon_nan = pos.ins().splat(types::F64X2, canon_nan); vector_select(pos, canon_nan); } + types::F128 => { + let nan_const = pos.func.dfg.constants.insert(Ieee128::NAN.into()); + let canon_nan = pos.ins().f128const(nan_const); + scalar_select(pos, canon_nan); + } _ => { // Panic if the type given was not an IEEE floating point type. panic!("Could not canonicalize NaN: Unexpected result type found."); diff --git a/cranelift/filetests/filetests/isa/riscv64/nan-canonicalization-f16.clif b/cranelift/filetests/filetests/isa/riscv64/nan-canonicalization-f16.clif new file mode 100644 index 000000000000..ab6f26fbb8a8 --- /dev/null +++ b/cranelift/filetests/filetests/isa/riscv64/nan-canonicalization-f16.clif @@ -0,0 +1,9 @@ +test compile +set enable_nan_canonicalization=true +target riscv64 has_zfhmin has_zfh + +function %fadd_f16(f16, f16) -> f16 { +block0(v0: f16, v1: f16): + v2 = fadd v0, v1 + return v2 +} diff --git a/cranelift/filetests/filetests/isa/s390x/nan-canonicalization-f128.clif b/cranelift/filetests/filetests/isa/s390x/nan-canonicalization-f128.clif new file mode 100644 index 000000000000..3917ee87e31e --- /dev/null +++ b/cranelift/filetests/filetests/isa/s390x/nan-canonicalization-f128.clif @@ -0,0 +1,10 @@ +test compile +set enable_nan_canonicalization=true +target s390x + +function %fadd_f128(i64, f128, f128) { +block0(v0: i64, v1: f128, v2: f128): + v3 = fadd v1, v2 + store v3, v0 + return +}