Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions crates/rustc_codegen_spirv/src/builder/builder_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3389,8 +3389,6 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {

let libm_intrinsic =
instance_def_id.and_then(|def_id| self.libm_intrinsics.borrow().get(&def_id).copied());
let num_traits_intrinsics = instance_def_id
.and_then(|def_id| self.num_traits_intrinsics.borrow().get(&def_id).copied());
let buffer_load_intrinsic = instance_def_id
.is_some_and(|def_id| self.buffer_load_intrinsics.borrow().contains(&def_id));
let buffer_store_intrinsic = instance_def_id
Expand All @@ -3400,7 +3398,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
let from_trait_impl =
instance_def_id.and_then(|def_id| self.from_trait_impls.borrow().get(&def_id).copied());

if let Some(libm_intrinsic) = libm_intrinsic.or(num_traits_intrinsics) {
if let Some(libm_intrinsic) = libm_intrinsic {
let result = self.call_libm_intrinsic(libm_intrinsic, result_type, args);
if result_type != result.ty {
bug!(
Expand Down
10 changes: 0 additions & 10 deletions crates/rustc_codegen_spirv/src/builder/libm_intrinsics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ pub enum LibmCustomIntrinsic {
Tgamma,
Log1p,
NextAfter,
Powi,
Remainder,
RemQuo,
Scalbn,
Expand Down Expand Up @@ -199,9 +198,6 @@ pub const LIBM_TABLE: &[(&str, LibmIntrinsic)] = &[
("truncf", LibmIntrinsic::GLOp(GLOp::Trunc)),
];

pub const NUM_TRAITS_TABLE: &[(&str, LibmIntrinsic)] =
&[("powi", LibmIntrinsic::Custom(LibmCustomIntrinsic::Powi))];

impl Builder<'_, '_> {
pub fn call_libm_intrinsic(
&mut self,
Expand Down Expand Up @@ -310,12 +306,6 @@ impl Builder<'_, '_> {
LibmIntrinsic::Custom(LibmCustomIntrinsic::NextAfter) => {
self.undef_zombie(result_type, "NextAfter not supported yet")
}
LibmIntrinsic::Custom(LibmCustomIntrinsic::Powi) => {
assert_eq!(args.len(), 2);
// Convert integer exponent to float, then use GLOp::Pow
let float_exp = self.sitofp(args[1], args[0].ty);
self.gl_op(GLOp::Pow, result_type, [args[0], float_exp])
}
LibmIntrinsic::Custom(LibmCustomIntrinsic::Remainder) => {
self.undef_zombie(result_type, "Remainder not supported yet")
}
Expand Down
10 changes: 0 additions & 10 deletions crates/rustc_codegen_spirv/src/codegen_cx/declare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,16 +181,6 @@ impl<'tcx> CodegenCx<'tcx> {
}
}

// Check for usage of `num_traits` intrinsics (like Float::powi) that we can optimize
if self.tcx.crate_name(def_id.krate) == self.sym.num_traits && !def_id.is_local() {
let item_name = self.tcx.item_name(def_id);
if let Some(&intrinsic) = self.sym.num_traits_intrinsics.get(&item_name) {
self.num_traits_intrinsics
.borrow_mut()
.insert(def_id, intrinsic);
}
}

// Check if this is a From trait implementation
if let Some(impl_def_id) = self.tcx.impl_of_assoc(def_id)
&& let Some(trait_ref) = self.tcx.impl_opt_trait_ref(impl_def_id)
Expand Down
3 changes: 0 additions & 3 deletions crates/rustc_codegen_spirv/src/codegen_cx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@ pub struct CodegenCx<'tcx> {
// FIXME(eddyb) should the maps exist at all, now that the `DefId` is known
// at `call` time, and presumably its high-level details can be looked up?
pub libm_intrinsics: RefCell<FxHashMap<DefId, super::builder::libm_intrinsics::LibmIntrinsic>>,
pub num_traits_intrinsics:
RefCell<FxHashMap<DefId, super::builder::libm_intrinsics::LibmIntrinsic>>,

/// All `panic!(...)`s and builtin panics (from MIR `Assert`s) call into one
/// of these lang items, which we always replace with an "abort".
Expand Down Expand Up @@ -239,7 +237,6 @@ impl<'tcx> CodegenCx<'tcx> {
sym,
instruction_table: InstructionTable::new(),
libm_intrinsics: Default::default(),
num_traits_intrinsics: Default::default(),
panic_entry_points: Default::default(),
fmt_args_new_fn_ids: Default::default(),
fmt_rt_arg_new_fn_ids_to_ty_and_spec: Default::default(),
Expand Down
10 changes: 0 additions & 10 deletions crates/rustc_codegen_spirv/src/symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ pub struct Symbols {
pub vector: Symbol,
pub v1: Symbol,
pub libm: Symbol,
pub num_traits: Symbol,
pub entry_point_name: Symbol,
pub spv_khr_vulkan_memory_model: Symbol,

Expand All @@ -34,7 +33,6 @@ pub struct Symbols {
pub attributes: FxHashMap<Symbol, SpirvAttribute>,
pub execution_modes: FxHashMap<Symbol, (ExecutionMode, ExecutionModeExtraDim)>,
pub libm_intrinsics: FxHashMap<Symbol, libm_intrinsics::LibmIntrinsic>,
pub num_traits_intrinsics: FxHashMap<Symbol, libm_intrinsics::LibmIntrinsic>,
}

const BUILTINS: &[(&str, BuiltIn)] = {
Expand Down Expand Up @@ -416,20 +414,13 @@ impl Symbols {
assert!(old.is_none());
}

let mut num_traits_intrinsics = FxHashMap::default();
for &(a, b) in libm_intrinsics::NUM_TRAITS_TABLE {
let old = num_traits_intrinsics.insert(Symbol::intern(a), b);
assert!(old.is_none());
}

Self {
discriminant: Symbol::intern("discriminant"),
rust_gpu: Symbol::intern("rust_gpu"),
spirv_attr_with_version: Symbol::intern(&spirv_attr_with_version()),
vector: Symbol::intern("vector"),
v1: Symbol::intern("v1"),
libm: Symbol::intern("libm"),
num_traits: Symbol::intern("num_traits"),
entry_point_name: Symbol::intern("entry_point_name"),
spv_khr_vulkan_memory_model: Symbol::intern("SPV_KHR_vulkan_memory_model"),

Expand All @@ -445,7 +436,6 @@ impl Symbols {
attributes,
execution_modes,
libm_intrinsics,
num_traits_intrinsics,
}
}

Expand Down
22 changes: 22 additions & 0 deletions crates/spirv-std/src/float.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,28 @@
use crate::glam::{Vec2, Vec4};
#[cfg(target_arch = "spirv")]
use core::arch::asm;
#[cfg(target_arch = "spirv")]
use core::intrinsics;

#[cfg(target_arch = "spirv")]
impl f32 {
/// Raises a number to an integer power.
#[inline]
#[rustc_allow_incoherent_impl]
pub fn powi(self, n: i32) -> f32 {
intrinsics::powif32(self, n)
}
}

#[cfg(target_arch = "spirv")]
impl f64 {
/// Raises a number to an integer power.
#[inline]
#[rustc_allow_incoherent_impl]
pub fn powi(self, n: i32) -> f64 {
intrinsics::powif64(self, n)
}
}

/// Converts two f32 values (floats) into two f16 values (halfs). The result is a u32, with the low
/// 16 bits being the first f16, and the high 16 bits being the second f16.
Expand Down
2 changes: 1 addition & 1 deletion crates/spirv-std/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#![cfg_attr(
target_arch = "spirv",
allow(internal_features),
feature(asm_experimental_arch, lang_items)
feature(asm_experimental_arch, core_intrinsics, lang_items, rustc_attrs)
)]
// FIXME(eddyb) update/review these lints.
//
Expand Down
1 change: 0 additions & 1 deletion tests/compiletests/ui/dis/powi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
// build-pass
// compile-flags: -C llvm-args=--disassemble-entry=main

use spirv_std::num_traits::Float;
use spirv_std::spirv;

#[spirv(fragment)]
Expand Down
12 changes: 6 additions & 6 deletions tests/compiletests/ui/dis/powi.stderr
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
%1 = OpFunction %2 None %3
%4 = OpLabel
OpLine %5 11 12
OpLine %5 10 12
%6 = OpLoad %7 %8
OpLine %5 12 20
%9 = OpConvertSToF %7 %10
%11 = OpExtInst %7 %12 26 %6 %9
OpLine %5 12 4
OpStore %13 %11
OpLine %9 15 8
%10 = OpConvertSToF %7 %11
%12 = OpExtInst %7 %13 26 %6 %10
OpLine %5 11 4
OpStore %14 %12
OpNoLine
OpReturn
OpFunctionEnd
Loading