#include "common/z_magic.hpp"
#include "cpu/x64/utils/jit_regops.hpp"
namespace dnnl {
namespace impl {
namespace cpu {
namespace x64 {
namespace regops {
void horizontal_add_ps(
jit_generator_t *code, Xbyak::Xmm src, Xbyak::Xmm workspace) {
UNUSED(workspace);
if (code->is_valid_isa(avx)) {
code->vhaddps(src, src, src);
code->vhaddps(src, src, src);
} else {
code->haddps(src, src);
code->haddps(src, src);
}
}
void horizontal_add_ps(
jit_generator_t *code, Xbyak::Ymm src, Xbyak::Ymm workspace) {
const Xbyak::Xmm xmm_ws {workspace.getIdx()};
const Xbyak::Xmm xmm_src {src.getIdx()};
code->vextractf128(xmm_ws, src, 1);
code->vaddps(xmm_src, xmm_src, xmm_ws);
horizontal_add_ps(code, xmm_src);
}
void horizontal_add_ps(
jit_generator_t *code, Xbyak::Zmm src, Xbyak::Zmm workspace) {
const Xbyak::Ymm ymm_ws {workspace.getIdx()};
const Xbyak::Ymm ymm_src {src.getIdx()};
code->vextractf64x4(ymm_ws, src, 1);
code->vaddps(ymm_src, ymm_src, ymm_ws);
horizontal_add_ps(code, ymm_src, ymm_ws);
}
} } } } }