diff --git a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs index 16fa2bca7a..faa7d3e73d 100644 --- a/crates/rustc_codegen_spirv/src/builder/builder_methods.rs +++ b/crates/rustc_codegen_spirv/src/builder/builder_methods.rs @@ -418,6 +418,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { )), }, SpirvType::Float(width) => match width { + 16 => { + let ty = SpirvType::Float(16).def(self.span(), self); + self.def_constant(ty, SpirvConst::Scalar(memset_fill_u16(fill_byte) as u128)) + .def(self) + } 32 => self .constant_f32(self.span(), f32::from_bits(memset_fill_u32(fill_byte))) .def(self), @@ -472,6 +477,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { )), }, SpirvType::Float(width) => match width { + 16 => memset_dynamic_scalar(self, fill_var, 2, true), 32 => memset_dynamic_scalar(self, fill_var, 4, true), 64 => memset_dynamic_scalar(self, fill_var, 8, true), _ => self.fatal(format!("memset on float width {width} not implemented yet")), diff --git a/tests/compiletests/ui/lang/f16/array_init.rs b/tests/compiletests/ui/lang/f16/array_init.rs new file mode 100644 index 0000000000..656129029e --- /dev/null +++ b/tests/compiletests/ui/lang/f16/array_init.rs @@ -0,0 +1,12 @@ +// build-pass +// compile-flags: -C target-feature=+Float16 +#![feature(f16)] + +use spirv_std::num_traits::Float; +use spirv_std::spirv; + +#[spirv(fragment)] +pub fn main(#[spirv(flat)] i: u32, o: &mut f32) { + let a = [0.123f16; 16]; + *o = a[i as usize] as f32; +}