add initial xop codepaths, still need to finish the rest of the compares, and then do shifts, rotates, and PERMUTE
Add vector simplification pass, so far it only recognizes whether VECTOR_DENORMFLUSH is useless and optimizes them away Tag restgplr/savegplr/restvmx/savevmx/restfpr/savefpr with useful information, i intend to inline them (they tend to be the most heavily called guest functions)
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
// NOTE: must be included last as it expects windows.h to already be included.
|
||||
#include "third_party/xbyak/xbyak/xbyak.h"
|
||||
#include "third_party/xbyak/xbyak/xbyak_util.h"
|
||||
|
||||
#include "x64_amdfx_extensions.h"
|
||||
namespace xe {
|
||||
namespace cpu {
|
||||
class Processor;
|
||||
@@ -169,6 +169,8 @@ enum XmmConst {
|
||||
XMMF16PackLCPI5,
|
||||
XMMF16PackLCPI6
|
||||
};
|
||||
using amdfx::xopcompare_e;
|
||||
using Xbyak::Xmm;
|
||||
// X64Backend specific Instr->runtime_flags
|
||||
enum : uint32_t {
|
||||
INSTR_X64_FLAGS_ELIMINATED =
|
||||
@@ -351,6 +353,37 @@ class X64Emitter : public Xbyak::CodeGenerator {
|
||||
|
||||
void EmitProfilerEpilogue();
|
||||
|
||||
void EmitXOP(amdfx::xop_t xoperation) {
|
||||
xoperation.ForeachByte([this](uint8_t b) { this->db(b); });
|
||||
}
|
||||
|
||||
void vpcmov(Xmm dest, Xmm src1, Xmm src2, Xmm selector) {
|
||||
auto xop_bytes = amdfx::operations::vpcmov(
|
||||
dest.getIdx(), src1.getIdx(), src2.getIdx(), selector.getIdx());
|
||||
EmitXOP(xop_bytes);
|
||||
}
|
||||
|
||||
void vpperm(Xmm dest, Xmm src1, Xmm src2, Xmm selector) {
|
||||
auto xop_bytes = amdfx::operations::vpperm(
|
||||
dest.getIdx(), src1.getIdx(), src2.getIdx(), selector.getIdx());
|
||||
EmitXOP(xop_bytes);
|
||||
}
|
||||
|
||||
#define DEFINECOMPARE(name) \
|
||||
void name(Xmm dest, Xmm src1, Xmm src2, xopcompare_e compareop) { \
|
||||
auto xop_bytes = amdfx::operations::name(dest.getIdx(), src1.getIdx(), \
|
||||
src2.getIdx(), compareop); \
|
||||
EmitXOP(xop_bytes); \
|
||||
}
|
||||
DEFINECOMPARE(vpcomb);
|
||||
DEFINECOMPARE(vpcomub);
|
||||
DEFINECOMPARE(vpcomw);
|
||||
DEFINECOMPARE(vpcomuw);
|
||||
DEFINECOMPARE(vpcomd);
|
||||
DEFINECOMPARE(vpcomud);
|
||||
DEFINECOMPARE(vpcomq);
|
||||
DEFINECOMPARE(vpcomuq);
|
||||
#undef DEFINECOMPARE
|
||||
protected:
|
||||
void* Emplace(const EmitFunctionInfo& func_info,
|
||||
GuestFunction* function = nullptr);
|
||||
|
||||
Reference in New Issue
Block a user