18 #include <type_traits>
22 namespace ext::intel::experimental::esimd {
95 static_assert(VS == lsc_vector_size::n1 || VS == lsc_vector_size::n2 ||
96 VS == lsc_vector_size::n3 || VS == lsc_vector_size::n4 ||
97 VS == lsc_vector_size::n8 || VS == lsc_vector_size::n16 ||
98 VS == lsc_vector_size::n64 || VS == lsc_vector_size::n32,
99 "Unsupported vector size");
103 static_assert(VS == 1 || VS == 2 || VS == 3 || VS == 4 || VS == 8 ||
104 VS == 16 || VS == 32 || VS == 64,
105 "Unsupported vector size");
109 static_assert(DS != lsc_data_size::default_size ||
sizeof(T) == 1 ||
110 sizeof(T) == 2 ||
sizeof(T) == 4 ||
sizeof(T) == 8,
111 "Unsupported data type");
113 DS == lsc_data_size::default_size ||
115 (DS == lsc_data_size::u8 || DS == lsc_data_size::u8u32)) ||
117 (DS == lsc_data_size::u16 || DS == lsc_data_size::u16u32 ||
118 DS == lsc_data_size::u16u32h)) ||
120 (DS == lsc_data_size::u32 || DS == lsc_data_size::u8u32 ||
121 DS == lsc_data_size::u16u32 || DS == lsc_data_size::u16u32h)) ||
122 (
sizeof(T) == 8 && DS == lsc_data_size::u64),
123 "Data type does not match data size");
126 template <lsc_vector_size VS> constexpr uint8_t
to_int() {
127 check_lsc_vector_size<VS>();
129 case lsc_vector_size::n1:
131 case lsc_vector_size::n2:
133 case lsc_vector_size::n3:
135 case lsc_vector_size::n4:
137 case lsc_vector_size::n8:
139 case lsc_vector_size::n16:
141 case lsc_vector_size::n32:
143 case lsc_vector_size::n64:
151 check_lsc_vector_size<VS>();
154 return lsc_vector_size::n1;
156 return lsc_vector_size::n2;
158 return lsc_vector_size::n3;
160 return lsc_vector_size::n4;
162 return lsc_vector_size::n8;
164 return lsc_vector_size::n16;
166 return lsc_vector_size::n32;
168 return lsc_vector_size::n64;
170 return lsc_vector_size::n1;
174 template <
typename T, lsc_data_size DS>
176 check_lsc_data_size<T, DS>();
177 if (DS != lsc_data_size::default_size)
179 else if (
sizeof(T) == 1)
180 return lsc_data_size::u8;
181 else if (
sizeof(T) == 2)
182 return lsc_data_size::u16;
183 else if (
sizeof(T) == 4)
184 return lsc_data_size::u32;
185 else if (
sizeof(T) == 8)
186 return lsc_data_size::u64;
192 if (DS == lsc_data_size::u8)
193 return lsc_data_size::u8u32;
194 if (DS == lsc_data_size::u16)
195 return lsc_data_size::u16u32;
209 sizeof(T) == 1, uint8_t,
211 sizeof(T) == 2, uint16_t,
233 template <cache_h
int Last>
234 struct is_one_of_t<Last>
235 : std::conditional<Last == Hint, std::true_type, std::false_type>::type {
238 struct is_one_of_t<Head, Tail...>
239 : std::conditional<Head == Hint, std::true_type,
240 is_one_of_t<Tail...>>::type {};
245 return is_one_of_t<Hints...>::value;
250 return First == Val && Second == Val;
255 template <lsc_action Action, cache_h
int L1, cache_h
int L3>
261 L1H.template is_one_of<cache_hint::cached, cache_hint::uncached,
262 cache_hint::streaming>() &&
263 L3H.template is_one_of<cache_hint::cached,
264 cache_hint::uncached>() &&
265 !
are_both(L1H, L3H, cache_hint::uncached),
266 "unsupported cache hint");
267 }
else if constexpr (Action == lsc_action::load) {
269 are_both(L1H, L3H, cache_hint::none) ||
270 (L1H.template is_one_of<cache_hint::uncached, cache_hint::cached,
271 cache_hint::streaming>() &&
272 L3H.template is_one_of<cache_hint::uncached,
273 cache_hint::cached>()) ||
274 (L1H == cache_hint::read_invalidate && L3H == cache_hint::cached),
275 "unsupported cache hint");
276 }
else if constexpr (Action == lsc_action::store) {
277 static_assert(
are_both(L1H, L3H, cache_hint::none) ||
278 are_both(L1H, L3H, cache_hint::write_back) ||
279 (L1H.template is_one_of<cache_hint::uncached,
280 cache_hint::write_through,
281 cache_hint::streaming>() &&
282 L3H.template is_one_of<cache_hint::uncached,
283 cache_hint::write_back>()),
284 "unsupported cache hint");
285 }
else if constexpr (Action == lsc_action::atomic) {
286 static_assert(
are_both(L1H, L3H, cache_hint::none) ||
287 (L1H == cache_hint::uncached &&
288 L3H.template is_one_of<cache_hint::uncached,
289 cache_hint::write_back>()),
290 "unsupported cache hint");