mirror of https://github.com/PCSX2/pcsx2.git
gsdx sw JIT: dynamically select ISA for SetupPrim
This commit is contained in:
parent
574a2c774e
commit
8fd46e96aa
|
@ -22,6 +22,8 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
#include "GSSetupPrimCodeGenerator.h"
|
||||||
|
|
||||||
|
using namespace Xbyak;
|
||||||
|
|
||||||
#if _M_SSE >= 0x501
|
#if _M_SSE >= 0x501
|
||||||
GSVector8 GSSetupPrimCodeGenerator::m_shift[9];
|
GSVector8 GSSetupPrimCodeGenerator::m_shift[9];
|
||||||
#else
|
#else
|
||||||
|
@ -75,3 +77,14 @@ GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(void* param, uint64 key, void
|
||||||
|
|
||||||
Generate();
|
Generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _M_SSE >= 0x501
|
||||||
|
#else
|
||||||
|
void GSSetupPrimCodeGenerator::Generate()
|
||||||
|
{
|
||||||
|
if(g_cpu.has(util::Cpu::tAVX))
|
||||||
|
Generate_AVX();
|
||||||
|
else
|
||||||
|
Generate_SSE();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "GSScanlineEnvironment.h"
|
#include "GSScanlineEnvironment.h"
|
||||||
#include "GSFunctionMap.h"
|
#include "GSFunctionMap.h"
|
||||||
|
#include "GSUtil.h"
|
||||||
|
|
||||||
class GSSetupPrimCodeGenerator : public GSCodeGenerator
|
class GSSetupPrimCodeGenerator : public GSCodeGenerator
|
||||||
{
|
{
|
||||||
|
@ -35,9 +36,21 @@ class GSSetupPrimCodeGenerator : public GSCodeGenerator
|
||||||
|
|
||||||
void Generate();
|
void Generate();
|
||||||
|
|
||||||
|
#if _M_SSE < 0x501
|
||||||
|
void Generate_SSE();
|
||||||
|
void Depth_SSE();
|
||||||
|
void Texture_SSE();
|
||||||
|
void Color_SSE();
|
||||||
|
|
||||||
|
void Generate_AVX();
|
||||||
|
void Depth_AVX();
|
||||||
|
void Texture_AVX();
|
||||||
|
void Color_AVX();
|
||||||
|
#else
|
||||||
void Depth();
|
void Depth();
|
||||||
void Texture();
|
void Texture();
|
||||||
void Color();
|
void Color();
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GSSetupPrimCodeGenerator(void* param, uint64 key, void* code, size_t maxsize);
|
GSSetupPrimCodeGenerator(void* param, uint64 key, void* code, size_t maxsize);
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
#include "GSSetupPrimCodeGenerator.h"
|
||||||
#include "GSVertexSW.h"
|
#include "GSVertexSW.h"
|
||||||
|
|
||||||
#if _M_SSE == 0x500 && (defined(_M_AMD64) || defined(_WIN64))
|
#if _M_SSE < 0x501 && (defined(_M_AMD64) || defined(_WIN64))
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Generate()
|
void GSSetupPrimCodeGenerator::Generate_AVX()
|
||||||
{
|
{
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
sub(rsp, 8 + 2 * 16);
|
sub(rsp, 8 + 2 * 16);
|
||||||
|
@ -48,11 +48,11 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Depth();
|
Depth_AVX();
|
||||||
|
|
||||||
Texture();
|
Texture_AVX();
|
||||||
|
|
||||||
Color();
|
Color_AVX();
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
vmovdqa(xmm6, ptr[rsp + 0]);
|
vmovdqa(xmm6, ptr[rsp + 0]);
|
||||||
|
@ -64,7 +64,7 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
ret();
|
ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Depth()
|
void GSSetupPrimCodeGenerator::Depth_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.z && !m_en.f)
|
if(!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -158,7 +158,7 @@ void GSSetupPrimCodeGenerator::Depth()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Texture()
|
void GSSetupPrimCodeGenerator::Texture_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.t)
|
if(!m_en.t)
|
||||||
{
|
{
|
||||||
|
@ -234,7 +234,7 @@ void GSSetupPrimCodeGenerator::Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Color()
|
void GSSetupPrimCodeGenerator::Color_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.c)
|
if(!m_en.c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
#include "GSSetupPrimCodeGenerator.h"
|
||||||
#include "GSVertexSW.h"
|
#include "GSVertexSW.h"
|
||||||
|
|
||||||
#if _M_SSE < 0x500 && (defined(_M_AMD64) || defined(_WIN64))
|
#if _M_SSE < 0x501 && (defined(_M_AMD64) || defined(_WIN64))
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Generate()
|
void GSSetupPrimCodeGenerator::Generate_SSE()
|
||||||
{
|
{
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
sub(rsp, 8 + 2 * 16);
|
sub(rsp, 8 + 2 * 16);
|
||||||
|
@ -48,11 +48,11 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Depth();
|
Depth_SSE();
|
||||||
|
|
||||||
Texture();
|
Texture_SSE();
|
||||||
|
|
||||||
Color();
|
Color_SSE();
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
vmovdqa(xmm6, ptr[rsp + 0]);
|
vmovdqa(xmm6, ptr[rsp + 0]);
|
||||||
|
@ -64,7 +64,7 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
ret();
|
ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Depth()
|
void GSSetupPrimCodeGenerator::Depth_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.z && !m_en.f)
|
if(!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -163,7 +163,7 @@ void GSSetupPrimCodeGenerator::Depth()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Texture()
|
void GSSetupPrimCodeGenerator::Texture_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.t)
|
if(!m_en.t)
|
||||||
{
|
{
|
||||||
|
@ -242,7 +242,7 @@ void GSSetupPrimCodeGenerator::Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Color()
|
void GSSetupPrimCodeGenerator::Color_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.c)
|
if(!m_en.c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
#include "GSSetupPrimCodeGenerator.h"
|
||||||
#include "GSVertexSW.h"
|
#include "GSVertexSW.h"
|
||||||
|
|
||||||
#if _M_SSE == 0x500 && !(defined(_M_AMD64) || defined(_WIN64))
|
#if _M_SSE < 0x501 && !(defined(_M_AMD64) || defined(_WIN64))
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ static const int _vertex = _args + 4;
|
||||||
static const int _index = _args + 8;
|
static const int _index = _args + 8;
|
||||||
static const int _dscan = _args + 12;
|
static const int _dscan = _args + 12;
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Generate()
|
void GSSetupPrimCodeGenerator::Generate_AVX()
|
||||||
{
|
{
|
||||||
if((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS || m_en.t || m_en.c && m_sel.iip)
|
if((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS || m_en.t || m_en.c && m_sel.iip)
|
||||||
{
|
{
|
||||||
|
@ -44,16 +44,16 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Depth();
|
Depth_AVX();
|
||||||
|
|
||||||
Texture();
|
Texture_AVX();
|
||||||
|
|
||||||
Color();
|
Color_AVX();
|
||||||
|
|
||||||
ret();
|
ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Depth()
|
void GSSetupPrimCodeGenerator::Depth_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.z && !m_en.f)
|
if(!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -144,7 +144,7 @@ void GSSetupPrimCodeGenerator::Depth()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Texture()
|
void GSSetupPrimCodeGenerator::Texture_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.t)
|
if(!m_en.t)
|
||||||
{
|
{
|
||||||
|
@ -213,7 +213,7 @@ void GSSetupPrimCodeGenerator::Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Color()
|
void GSSetupPrimCodeGenerator::Color_AVX()
|
||||||
{
|
{
|
||||||
if(!m_en.c)
|
if(!m_en.c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
#include "GSSetupPrimCodeGenerator.h"
|
||||||
#include "GSVertexSW.h"
|
#include "GSVertexSW.h"
|
||||||
|
|
||||||
#if _M_SSE < 0x500 && !(defined(_M_AMD64) || defined(_WIN64))
|
#if _M_SSE < 0x501 && !(defined(_M_AMD64) || defined(_WIN64))
|
||||||
|
|
||||||
using namespace Xbyak;
|
using namespace Xbyak;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ static const int _vertex = _args + 4;
|
||||||
static const int _index = _args + 8;
|
static const int _index = _args + 8;
|
||||||
static const int _dscan = _args + 12;
|
static const int _dscan = _args + 12;
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Generate()
|
void GSSetupPrimCodeGenerator::Generate_SSE()
|
||||||
{
|
{
|
||||||
if((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS || m_en.t || m_en.c && m_sel.iip)
|
if((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS || m_en.t || m_en.c && m_sel.iip)
|
||||||
{
|
{
|
||||||
|
@ -44,16 +44,16 @@ void GSSetupPrimCodeGenerator::Generate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Depth();
|
Depth_SSE();
|
||||||
|
|
||||||
Texture();
|
Texture_SSE();
|
||||||
|
|
||||||
Color();
|
Color_SSE();
|
||||||
|
|
||||||
ret();
|
ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Depth()
|
void GSSetupPrimCodeGenerator::Depth_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.z && !m_en.f)
|
if(!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -149,7 +149,7 @@ void GSSetupPrimCodeGenerator::Depth()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Texture()
|
void GSSetupPrimCodeGenerator::Texture_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.t)
|
if(!m_en.t)
|
||||||
{
|
{
|
||||||
|
@ -221,7 +221,7 @@ void GSSetupPrimCodeGenerator::Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator::Color()
|
void GSSetupPrimCodeGenerator::Color_SSE()
|
||||||
{
|
{
|
||||||
if(!m_en.c)
|
if(!m_en.c)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue