#ifndef CPU_AARCH64_SHUFFLE_JIT_UNI_SHUFFLE_KERNEL_HPP
#define CPU_AARCH64_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/aarch64/cpu_isa_traits.hpp"
#include "cpu/aarch64/jit_generator.hpp"
#include "cpu/aarch64/jit_primitive_conf.hpp"
#include "cpu/aarch64/shuffle/jit_uni_shuffle.hpp"
namespace dnnl {
namespace impl {
namespace cpu {
namespace aarch64 {
using namespace Xbyak_aarch64;
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 TReg = typename utils::conditional<isa == asimd, VReg, ZReg>::type;
using TRegS = typename cpu_isa_traits<isa>::TRegS;
constexpr int vmm_idx(int idx) const {
return (cpu_isa_traits<isa>::n_vregs - 1) - idx;
}
void prepare_mask();
void emu_gather_data(const XReg ®_src_addr, const int indices_idx,
const int data_idx, const bool is_tail = false);
void gather_data(const XReg ®_src_addr, const int indices_idx,
const int data_idx, const bool is_tail = false);
void store_data(const int data_idx, const XReg ®_dst_addr,
const int offset = 0, const bool is_tail = false);
void shuffle_blocked_format();
void append_zero_padding(
const XReg ®_dst_addr, const bool zero_extend_write);
void generate() override;
const TReg vmm_full_mask_ = TReg(1);
const TReg vmm_src_ = TReg(2);
const TReg vmm_tmp_ = TReg(3);
const TReg vmm_indices_ = TReg(4);
const TReg vmm_zero_ = TReg(11);
const PReg k_tail_mask_ = p1;
const PReg k_full_mask_ = p2;
const XReg ®_tmp_ = x7;
const XReg ®_dst_ = x3;
const XReg ®_indices_ = x1;
const XReg ®_work_ = x2;
const XReg ®_param = x0;
const XReg ®_src_ = x6;
const XReg ®_tmp1_ = x8;
const XReg ®_tmp2_ = x9;
const XReg ®_tmp3_ = x10;
const XReg ®_tmp4_ = x11;
const XReg ®_tmp5_ = x12;
const XReg ®_tmp6_ = x13;
const XReg ®_padded_block = x14;
const jit_shuffle_conf_t conf_;
const size_t padding_size_;
const uint64_t isa_sveLen
= is_superset(isa, sve_128) ? cpu_isa_traits<isa>::vlen : 0;
};
} } } }
#endif