1macro_rules! impl_dev_intrinsics {
5 ($name:ident, $t: ty) => {
6 #[inline(never)]
7 #[rustc_diagnostic_item = concat!("gpu::device_intrinsics::", stringify!($name))]
8 #[gpu_codegen::device]
9 fn $name(self) -> $t {
10 unimplemented!()
11 }
12 };
13}
14
15macro_rules! impl_dev_intrinsics3 {
16 ($name:ident, $t: ty) => {
17 #[inline(never)]
18 #[rustc_diagnostic_item = concat!("gpu::device_intrinsics::", stringify!($name))]
19 #[gpu_codegen::device]
20 fn $name(self, _y: $t, _z: $t) -> $t {
21 unimplemented!()
22 }
23 };
24}
25
26macro_rules! impl_dev_intrinsics_for_core {
28 () => {
29 impl_dev_intrinsics!(max, Self);
30 impl_dev_intrinsics!(min, Self);
31 impl_dev_intrinsics!(sqrt, Self);
32 impl_dev_intrinsics!(ceil, Self);
33 impl_dev_intrinsics!(exp, Self);
34 impl_dev_intrinsics!(exp2, Self);
35 impl_dev_intrinsics!(sin, Self);
36 impl_dev_intrinsics!(cos, Self);
37 impl_dev_intrinsics!(log, Self);
38 };
39}
40
41pub trait GPUDeviceFloatIntrinsics: Sized {
44 impl_dev_intrinsics3!(fma, Self);
45 impl_dev_intrinsics!(rsqrt, Self);
46 impl_dev_intrinsics!(expm1, Self);
47 impl_dev_intrinsics!(sinh, Self);
48 impl_dev_intrinsics!(cosh, Self);
49 impl_dev_intrinsics!(tan, Self);
50 impl_dev_intrinsics!(tanh, Self);
51 impl_dev_intrinsics!(pow, Self);
52 impl_dev_intrinsics!(log10, Self);
53 impl_dev_intrinsics!(log1p, Self);
54 impl_dev_intrinsics!(log2, Self);
55 impl_dev_intrinsics_for_core!();
56}
57
58impl GPUDeviceFloatIntrinsics for f32 {}
59impl GPUDeviceFloatIntrinsics for f64 {}