#include <algorithm>
#include <cstdint>
#include <cstring>
#include "ruy/check_macros.h"
#include "ruy/kernel_common.h"
#include "ruy/kernel_x86.h"
#include "ruy/opt_set.h"
#include "ruy/platform.h"
#include "ruy/profiler/instrumentation.h"
#if RUY_PLATFORM_AVX2_FMA && RUY_OPT(ASM)
#include <immintrin.h>
#endif
namespace ruy {
#if !(RUY_PLATFORM_AVX2_FMA && RUY_OPT(ASM))
void Kernel8bitAvx2(const KernelParams8bit<8, 8>&) {
RUY_DCHECK(false);
}
void Kernel8bitAvx2SingleCol(const KernelParams8bit<8, 8>&) {
RUY_DCHECK(false);
}
void KernelFloatAvx2(const KernelParamsFloat<8, 8>&) {
RUY_DCHECK(false);
}
void KernelFloatAvx2SingleCol(const KernelParamsFloat<8, 8>&) {
RUY_DCHECK(false);
}
#else
static constexpr int kAvx8bitBlockSize = …;
static constexpr int kAvx8bitInnerSize = …;
namespace {
namespace intrin_utils {
template <>
inline __m256i mm256_shuffle_epi8<Path::kAvx2Fma>(const __m256i& a,
const __m256i& b) { … }
template <>
inline __m256 MulAdd<Path::kAvx2Fma>(const __m256& a, const __m256& b,
const __m256& c) { … }
template <>
inline __m128i mm256_extracti128_si256<Path::kAvx2Fma>(const __m256i& a,
const int imm) { … }
__m256i mm256_blendv_epi32(const __m256i& a, const __m256i& b,
const __m256i& mask) { … }
}
}
template <Path path>
void Kernel8bitAvx2Impl(const KernelParams8bit<8, 8>& params) { … }
void Kernel8bitAvx2(const KernelParams8bit<8, 8>& params) { … }
template <Path path>
void Kernel8bitAvx2SingleColImpl(const KernelParams8bit<8, 8>& params) { … }
void Kernel8bitAvx2SingleCol(const KernelParams8bit<8, 8>& params) { … }
void KernelFloatAvx2(const KernelParamsFloat<8, 8>& params) { … }
void KernelFloatAvx2SingleCol(const KernelParamsFloat<8, 8>& params) { … }
#endif
}