#ifndef CPU_X64_SHUFFLE_JIT_UNI_SHUFFLE_KERNEL_HPP
#define CPU_X64_SHUFFLE_JIT_UNI_SHUFFLE_KERNEL_HPP
#include "common/c_types_map.hpp"
#include "common/type_helpers.hpp"
#include "common/utils.hpp"
#include "cpu/cpu_shuffle_pd.hpp"
#include "cpu/x64/cpu_isa_traits.hpp"
#include "cpu/x64/jit_generator.hpp"
#include "cpu/x64/jit_primitive_conf.hpp"
#include "cpu/x64/shuffle/jit_uni_shuffle.hpp"
namespace dnnl {
namespace impl {
namespace cpu {
namespace x64 {
using namespace Xbyak;
template <cpu_isa_t isa>
struct jit_uni_shuffle_kernel_t : public jit_generator_t {
DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_shuffle_kernel_t)
jit_uni_shuffle_kernel_t(const jit_shuffle_conf_t &conf);
using Vmm = typename cpu_isa_traits_t<isa>::Vmm;
constexpr int vmm_idx(int idx) const {
return (cpu_isa_traits_t<isa>::n_vregs - 1) - idx;
}
void prepare_mask();
void emu_gather_data(const Reg64 ®_src_addr, const int indices_idx,
const int data_idx, const bool is_tail = false);
void gather_data(const Reg64 ®_src_addr, const int indices_idx,
const int data_idx, const bool is_tail = false);
void store_data(const int data_idx, const Reg64 ®_dst_addr,
const int offset = 0, const bool is_tail = false);
void shuffle_blocked_format();
void append_zero_padding(
const Reg64 ®_dst_addr, const bool zero_extend_write);
void generate() override;
const Vmm vmm_tail_mask_ = Vmm(0);
const Vmm vmm_full_mask_ = Vmm(1);
const Vmm vmm_src_ = Vmm(2);
const Vmm vmm_tmp_ = Vmm(3);
const Vmm vmm_indices_ = Vmm(4);
const Vmm vmm_zero_ = Vmm(11);
const Opmask k_tail_mask_ = k1;
const Opmask k_full_mask_ = k2;
const Reg64 ®_tmp_ = rax;
const Reg64 ®_dst_ = rbx;
const Reg64 ®_indices_ = rcx;
const Reg64 ®_work_ = rdx;
const Reg64 ®_param = rdi;
const Reg64 ®_src_ = rsi;
const Reg64 ®_tmp1_ = r8;
const Reg64 ®_tmp2_ = r9;
const Reg64 ®_tmp3_ = r10;
const Reg64 ®_tmp4_ = r11;
const Reg64 ®_tmp5_ = r12;
const Reg64 ®_tmp6_ = r13;
const Reg8 ®_padded_block = r14b;
const jit_shuffle_conf_t conf_;
const size_t padding_size_;
};
} } } }
#endif