DPC++ Runtime
Runtime libraries for oneAPI DPC++
math_intrin.hpp
Go to the documentation of this file.
1 //==------------ math_intrin.hpp - DPC++ Explicit SIMD API -----------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 // Declares experimental Explicit SIMD math intrinsics.
9 //===----------------------------------------------------------------------===//
10 
11 #pragma once
12 
14 
18 
19 #define __ESIMD_raw_vec_t(T, SZ) \
20  sycl::ext::intel::esimd::detail::vector_type_t< \
21  sycl::ext::intel::esimd::detail::__raw_t<T>, SZ>
22 #define __ESIMD_cpp_vec_t(T, SZ) \
23  sycl::ext::intel::esimd::detail::vector_type_t< \
24  sycl::ext::intel::esimd::detail::__cpp_t<T>, SZ>
25 
26 template <typename T0, typename T1, int SZ>
27 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
28  __esimd_ssshl(__ESIMD_raw_vec_t(T1, SZ) src0,
29  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
30 template <typename T0, typename T1, int SZ>
31 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
32  __esimd_sushl(__ESIMD_raw_vec_t(T1, SZ) src0,
33  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
34 template <typename T0, typename T1, int SZ>
35 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
36  __esimd_usshl(__ESIMD_raw_vec_t(T1, SZ) src0,
37  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
38 template <typename T0, typename T1, int SZ>
39 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
40  __esimd_uushl(__ESIMD_raw_vec_t(T1, SZ) src0,
41  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
42 template <typename T0, typename T1, int SZ>
43 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
44  __esimd_ssshl_sat(__ESIMD_raw_vec_t(T1, SZ) src0,
45  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
46 template <typename T0, typename T1, int SZ>
47 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
48  __esimd_sushl_sat(__ESIMD_raw_vec_t(T1, SZ) src0,
49  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
50 template <typename T0, typename T1, int SZ>
51 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
52  __esimd_usshl_sat(__ESIMD_raw_vec_t(T1, SZ) src0,
53  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
54 template <typename T0, typename T1, int SZ>
55 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
56  __esimd_uushl_sat(__ESIMD_raw_vec_t(T1, SZ) src0,
57  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
58 
59 template <typename T0, typename T1, int SZ>
60 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
61  __esimd_rol(__ESIMD_raw_vec_t(T1, SZ) src0,
62  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
63 template <typename T0, typename T1, int SZ>
64 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
65  __esimd_ror(__ESIMD_raw_vec_t(T1, SZ) src0,
66  __ESIMD_raw_vec_t(T1, SZ) src1) __ESIMD_INTRIN_END;
67 
68 template <typename T, int SZ>
69 __ESIMD_INTRIN __ESIMD_raw_vec_t(T, SZ)
70  __esimd_umulh(__ESIMD_raw_vec_t(T, SZ) src0,
71  __ESIMD_raw_vec_t(T, SZ) src1) __ESIMD_INTRIN_END;
72 template <typename T, int SZ>
73 __ESIMD_INTRIN __ESIMD_raw_vec_t(T, SZ)
74  __esimd_smulh(__ESIMD_raw_vec_t(T, SZ) src0,
75  __ESIMD_raw_vec_t(T, SZ) src1) __ESIMD_INTRIN_END;
76 
77 template <int SZ>
78 __ESIMD_INTRIN __ESIMD_DNS::vector_type_t<float, SZ>
79 __esimd_frc(__ESIMD_DNS::vector_type_t<float, SZ> src0) __ESIMD_INTRIN_END;
80 
81 template <typename T, int SZ>
82 __ESIMD_INTRIN __ESIMD_raw_vec_t(T, SZ)
83  __esimd_lzd(__ESIMD_raw_vec_t(T, SZ) src0) __ESIMD_INTRIN_END;
84 
85 template <typename T0, typename T1, int SZ>
86 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
87  __esimd_bfrev(__ESIMD_raw_vec_t(T1, SZ) src0) __ESIMD_INTRIN_END;
88 
89 template <typename T0, int SZ>
90 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
91  __esimd_bfi(__ESIMD_raw_vec_t(T0, SZ) src0, __ESIMD_raw_vec_t(T0, SZ) src1,
92  __ESIMD_raw_vec_t(T0, SZ) src2,
93  __ESIMD_raw_vec_t(T0, SZ) src3) __ESIMD_INTRIN_END;
94 
95 template <typename T0, int SZ>
96 __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ)
97  __esimd_sbfe(__ESIMD_raw_vec_t(T0, SZ) src0, __ESIMD_raw_vec_t(T0, SZ) src1,
98  __ESIMD_raw_vec_t(T0, SZ) src2) __ESIMD_INTRIN_END;
99 
100 template <typename T, int N>
101 __ESIMD_INTRIN __ESIMD_raw_vec_t(T, N)
102  __esimd_dp4(__ESIMD_raw_vec_t(T, N) v1,
103  __ESIMD_raw_vec_t(T, N) v2) __ESIMD_INTRIN_END;
104 
105 template <__ESIMD_XMX_NS::dpas_argument_type src1_precision,
106  __ESIMD_XMX_NS::dpas_argument_type src2_precision, int systolic_depth,
107  int repeat_count, typename T, typename T0, typename T1, typename T2,
108  int N, int N1, int N2, int res_sign = std::is_signed_v<T>,
109  int acc_sign = std::is_signed_v<T0>>
110 __ESIMD_INTRIN __ESIMD_DNS::vector_type_t<T, N>
111 __esimd_dpas2(__ESIMD_DNS::vector_type_t<T0, N> src0,
112  __ESIMD_DNS::vector_type_t<T1, N1> src1,
113  __ESIMD_DNS::vector_type_t<T2, N2> src2) __ESIMD_INTRIN_END;
114 
115 template <int Info, typename T, typename T1, typename T2, int N, int N1, int N2>
116 __ESIMD_INTRIN __ESIMD_DNS::vector_type_t<T, N>
117 __esimd_dpas_nosrc0(__ESIMD_DNS::vector_type_t<T1, N1> src1,
118  __ESIMD_DNS::vector_type_t<T2, N2> src2) __ESIMD_INTRIN_END;
119 
120 template <int Info, typename T, typename T1, typename T2, int N, int N1, int N2>
121 __ESIMD_INTRIN __ESIMD_DNS::vector_type_t<T, N>
122 __esimd_dpasw(__ESIMD_DNS::vector_type_t<T, N> src0,
123  __ESIMD_DNS::vector_type_t<T1, N1> src1,
124  __ESIMD_DNS::vector_type_t<T2, N2> src2) __ESIMD_INTRIN_END;
125 
126 template <int Info, typename T, typename T1, typename T2, int N, int N1, int N2>
127 __ESIMD_INTRIN __ESIMD_DNS::vector_type_t<T, N> __esimd_dpasw_nosrc0(
128  __ESIMD_DNS::vector_type_t<T1, N1> src1,
129  __ESIMD_DNS::vector_type_t<T2, N2> src2) __ESIMD_INTRIN_END;
130 
131 template <typename T, int N>
132 __ESIMD_INTRIN std::pair<__ESIMD_DNS::vector_type_t<T, N>,
133  __ESIMD_DNS::vector_type_t<T, N>>
134 __esimd_addc(__ESIMD_DNS::vector_type_t<T, N> src0,
135  __ESIMD_DNS::vector_type_t<T, N> src1) __ESIMD_INTRIN_END;
136 
137 template <typename T, int N>
138 __ESIMD_INTRIN std::pair<__ESIMD_DNS::vector_type_t<T, N>,
139  __ESIMD_DNS::vector_type_t<T, N>>
140 __esimd_subb(__ESIMD_DNS::vector_type_t<T, N> src0,
141  __ESIMD_DNS::vector_type_t<T, N> src1) __ESIMD_INTRIN_END;
142 
143 template <uint8_t FuncControl, typename T, int N>
144 __ESIMD_INTRIN __ESIMD_raw_vec_t(T, N)
145  __esimd_bfn(__ESIMD_raw_vec_t(T, N) src0, __ESIMD_raw_vec_t(T, N) src1,
146  __ESIMD_raw_vec_t(T, N) src2) __ESIMD_INTRIN_END;
147 
148 template <int N>
149 __ESIMD_INTRIN __ESIMD_raw_vec_t(sycl::half, N)
150  __esimd_srnd(__ESIMD_DNS::vector_type_t<float, N> src1,
151  __ESIMD_DNS::vector_type_t<uint16_t, N> src2)
152  __ESIMD_INTRIN_END;
153 
154 __ESIMD_INTRIN __ESIMD_raw_vec_t(uint32_t, 4)
155  __esimd_timestamp() __ESIMD_INTRIN_END;
156 
157 #undef __ESIMD_raw_vec_t
158 #undef __ESIMD_cpp_vec_t
159 
__ESIMD_API SZ simd< T, SZ > src1
Definition: math.hpp:179
__ESIMD_API SZ simd< T, SZ > Sat int SZ
Definition: math.hpp:210
__ESIMD_API SZ src0
Definition: math.hpp:179
dpas_argument_type
Describes the element types in the input matrices.
Definition: common.hpp:22