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 Workerinline 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 Workerinline 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 Workerinline 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