xref: /aosp_15_r20/external/executorch/kernels/optimized/vec/vec.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/kernels/optimized/vec/vec256/vec256.h>
12*523fa7a6SAndroid Build Coastguard Worker 
13*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
14*523fa7a6SAndroid Build Coastguard Worker namespace vec {
15*523fa7a6SAndroid Build Coastguard Worker 
16*523fa7a6SAndroid Build Coastguard Worker // See Note [CPU_CAPABILITY namespace]
17*523fa7a6SAndroid Build Coastguard Worker inline namespace CPU_CAPABILITY {
18*523fa7a6SAndroid Build Coastguard Worker 
convert_to_bool(Vectorized<int8_t> x)19*523fa7a6SAndroid Build Coastguard Worker inline Vectorized<bool> convert_to_bool(Vectorized<int8_t> x) {
20*523fa7a6SAndroid Build Coastguard Worker   __at_align__ bool buffer[x.size()];
21*523fa7a6SAndroid Build Coastguard Worker   x.ne(Vectorized<int8_t>(0)).store(buffer);
22*523fa7a6SAndroid Build Coastguard Worker 
23*523fa7a6SAndroid Build Coastguard Worker   Vectorized<bool> ret;
24*523fa7a6SAndroid Build Coastguard Worker   static_assert(x.size() == ret.size(), "");
25*523fa7a6SAndroid Build Coastguard Worker   std::memcpy(ret, buffer, ret.size() * sizeof(bool));
26*523fa7a6SAndroid Build Coastguard Worker   return ret;
27*523fa7a6SAndroid Build Coastguard Worker }
28*523fa7a6SAndroid Build Coastguard Worker 
29*523fa7a6SAndroid Build Coastguard Worker template <>
loadu(const void * ptr)30*523fa7a6SAndroid Build Coastguard Worker inline Vectorized<bool> Vectorized<bool>::loadu(const void* ptr) {
31*523fa7a6SAndroid Build Coastguard Worker   // See NOTE [Loading boolean values]
32*523fa7a6SAndroid Build Coastguard Worker   return convert_to_bool(Vectorized<int8_t>::loadu(ptr));
33*523fa7a6SAndroid Build Coastguard Worker }
34*523fa7a6SAndroid Build Coastguard Worker 
35*523fa7a6SAndroid Build Coastguard Worker template <>
loadu(const void * ptr,int64_t count)36*523fa7a6SAndroid Build Coastguard Worker inline Vectorized<bool> Vectorized<bool>::loadu(const void* ptr, int64_t count) {
37*523fa7a6SAndroid Build Coastguard Worker   // See NOTE [Loading boolean values]
38*523fa7a6SAndroid Build Coastguard Worker   return convert_to_bool(Vectorized<int8_t>::loadu(ptr, count));
39*523fa7a6SAndroid Build Coastguard Worker }
40*523fa7a6SAndroid Build Coastguard Worker 
41*523fa7a6SAndroid Build Coastguard Worker } // namespace CPU_CAPABILITY
42*523fa7a6SAndroid Build Coastguard Worker 
43*523fa7a6SAndroid Build Coastguard Worker } // namespace vec
44*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
45