diff --git a/CHANGELOG.md b/CHANGELOG.md index 855000535e..428b491120 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed 🩹 +- [PR#200](https://github.com/Rust-GPU/rust-gpu/pull/200) fixed [#199](https://github.com/Rust-GPU/rust-gpu/issues/199) by correctly generating an `fmul` in the `log10` intrinsic - [PR#174](https://github.com/Rust-GPU/rust-gpu/pull/174) fixed [#169](https://github.com/Rust-GPU/rust-gpu/issues/169) by handling signed integers in the `bswap` intrinsic - [PR#1129](https://github.com/EmbarkStudios/rust-gpu/pull/1129) fixed [#1062](https://github.com/EmbarkStudios/rust-gpu/issues/1062) by not flipping the comparison of the rotate amount with zero diff --git a/crates/rustc_codegen_spirv/src/builder/intrinsics.rs b/crates/rustc_codegen_spirv/src/builder/intrinsics.rs index 6896ad0e2e..45757888e9 100644 --- a/crates/rustc_codegen_spirv/src/builder/intrinsics.rs +++ b/crates/rustc_codegen_spirv/src/builder/intrinsics.rs @@ -174,7 +174,7 @@ impl<'a, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'tcx> { // log10(x) == (1 / ln(10)) * ln(x) let mul = self.constant_float(args[0].immediate().ty, 1.0 / 10.0f64.ln()); let ln = self.gl_op(GLOp::Log, ret_ty, [args[0].immediate()]); - self.mul(mul, ln) + self.fmul(mul, ln) } sym::fmaf32 | sym::fmaf64 => self.gl_op(GLOp::Fma, ret_ty, [ args[0].immediate(), diff --git a/crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs b/crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs index 8c62126820..54cb4e7584 100644 --- a/crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs +++ b/crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs @@ -240,7 +240,7 @@ impl Builder<'_, '_> { // log10(x) == (1 / ln(10)) * ln(x) let mul = self.constant_float(args[0].ty, 1.0 / 10.0f64.ln()); let ln = self.gl_op(GLOp::Log, result_type, [args[0]]); - self.mul(mul, ln) + self.fmul(mul, ln) } LibmIntrinsic::Custom(LibmCustomIntrinsic::Log1p) => { assert_eq!(args.len(), 1); diff --git a/tests/ui/lang/core/intrinsics/log10.rs b/tests/ui/lang/core/intrinsics/log10.rs new file mode 100644 index 0000000000..3f589d540b --- /dev/null +++ b/tests/ui/lang/core/intrinsics/log10.rs @@ -0,0 +1,17 @@ +// Test log10 intrinsic +// build-pass + +#![allow(internal_features)] +#![feature(core_intrinsics)] +#![no_std] + +use spirv_std::num_traits::Float as _; +use spirv_std::spirv; + +#[spirv(compute(threads(1)))] +pub fn main( + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] input: &[f32], + #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] output: &mut [f32], +) { + output[0] = input[0].log10(); +}