mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 20:44:02 +08:00 
			
		
		
		
	shader_jit_x64.cpp: Rename JitCompiler to JitShader.
This commit is contained in:
		
							parent
							
								
									847fb951e2
								
							
						
					
					
						commit
						3f623b2561
					
				@ -28,8 +28,8 @@ namespace Pica {
 | 
			
		||||
namespace Shader {
 | 
			
		||||
 | 
			
		||||
#ifdef ARCHITECTURE_x86_64
 | 
			
		||||
static std::unordered_map<u64, std::unique_ptr<JitCompiler>> shader_map;
 | 
			
		||||
static const JitCompiler* jit_shader;
 | 
			
		||||
static std::unordered_map<u64, std::unique_ptr<JitShader>> shader_map;
 | 
			
		||||
static const JitShader* jit_shader;
 | 
			
		||||
#endif // ARCHITECTURE_x86_64
 | 
			
		||||
 | 
			
		||||
void Setup() {
 | 
			
		||||
@ -42,7 +42,7 @@ void Setup() {
 | 
			
		||||
        if (iter != shader_map.end()) {
 | 
			
		||||
            jit_shader = iter->second.get();
 | 
			
		||||
        } else {
 | 
			
		||||
            auto shader = std::make_unique<JitCompiler>();
 | 
			
		||||
            auto shader = std::make_unique<JitShader>();
 | 
			
		||||
            shader->Compile();
 | 
			
		||||
            jit_shader = shader.get();
 | 
			
		||||
            shader_map[cache_key] = std::move(shader);
 | 
			
		||||
 | 
			
		||||
@ -20,73 +20,73 @@ namespace Shader {
 | 
			
		||||
 | 
			
		||||
using namespace Gen;
 | 
			
		||||
 | 
			
		||||
typedef void (JitCompiler::*JitFunction)(Instruction instr);
 | 
			
		||||
typedef void (JitShader::*JitFunction)(Instruction instr);
 | 
			
		||||
 | 
			
		||||
const JitFunction instr_table[64] = {
 | 
			
		||||
    &JitCompiler::Compile_ADD,      // add
 | 
			
		||||
    &JitCompiler::Compile_DP3,      // dp3
 | 
			
		||||
    &JitCompiler::Compile_DP4,      // dp4
 | 
			
		||||
    &JitCompiler::Compile_DPH,      // dph
 | 
			
		||||
    &JitShader::Compile_ADD,        // add
 | 
			
		||||
    &JitShader::Compile_DP3,        // dp3
 | 
			
		||||
    &JitShader::Compile_DP4,        // dp4
 | 
			
		||||
    &JitShader::Compile_DPH,        // dph
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_EX2,      // ex2
 | 
			
		||||
    &JitCompiler::Compile_LG2,      // lg2
 | 
			
		||||
    &JitShader::Compile_EX2,        // ex2
 | 
			
		||||
    &JitShader::Compile_LG2,        // lg2
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_MUL,      // mul
 | 
			
		||||
    &JitCompiler::Compile_SGE,      // sge
 | 
			
		||||
    &JitCompiler::Compile_SLT,      // slt
 | 
			
		||||
    &JitCompiler::Compile_FLR,      // flr
 | 
			
		||||
    &JitCompiler::Compile_MAX,      // max
 | 
			
		||||
    &JitCompiler::Compile_MIN,      // min
 | 
			
		||||
    &JitCompiler::Compile_RCP,      // rcp
 | 
			
		||||
    &JitCompiler::Compile_RSQ,      // rsq
 | 
			
		||||
    &JitShader::Compile_MUL,        // mul
 | 
			
		||||
    &JitShader::Compile_SGE,        // sge
 | 
			
		||||
    &JitShader::Compile_SLT,        // slt
 | 
			
		||||
    &JitShader::Compile_FLR,        // flr
 | 
			
		||||
    &JitShader::Compile_MAX,        // max
 | 
			
		||||
    &JitShader::Compile_MIN,        // min
 | 
			
		||||
    &JitShader::Compile_RCP,        // rcp
 | 
			
		||||
    &JitShader::Compile_RSQ,        // rsq
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_MOVA,     // mova
 | 
			
		||||
    &JitCompiler::Compile_MOV,      // mov
 | 
			
		||||
    &JitShader::Compile_MOVA,       // mova
 | 
			
		||||
    &JitShader::Compile_MOV,        // mov
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_DPH,      // dphi
 | 
			
		||||
    &JitShader::Compile_DPH,        // dphi
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_SGE,      // sgei
 | 
			
		||||
    &JitCompiler::Compile_SLT,      // slti
 | 
			
		||||
    &JitShader::Compile_SGE,        // sgei
 | 
			
		||||
    &JitShader::Compile_SLT,        // slti
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    nullptr,                        // unknown
 | 
			
		||||
    &JitCompiler::Compile_NOP,      // nop
 | 
			
		||||
    &JitCompiler::Compile_END,      // end
 | 
			
		||||
    &JitShader::Compile_NOP,        // nop
 | 
			
		||||
    &JitShader::Compile_END,        // end
 | 
			
		||||
    nullptr,                        // break
 | 
			
		||||
    &JitCompiler::Compile_CALL,     // call
 | 
			
		||||
    &JitCompiler::Compile_CALLC,    // callc
 | 
			
		||||
    &JitCompiler::Compile_CALLU,    // callu
 | 
			
		||||
    &JitCompiler::Compile_IF,       // ifu
 | 
			
		||||
    &JitCompiler::Compile_IF,       // ifc
 | 
			
		||||
    &JitCompiler::Compile_LOOP,     // loop
 | 
			
		||||
    &JitShader::Compile_CALL,       // call
 | 
			
		||||
    &JitShader::Compile_CALLC,      // callc
 | 
			
		||||
    &JitShader::Compile_CALLU,      // callu
 | 
			
		||||
    &JitShader::Compile_IF,         // ifu
 | 
			
		||||
    &JitShader::Compile_IF,         // ifc
 | 
			
		||||
    &JitShader::Compile_LOOP,       // loop
 | 
			
		||||
    nullptr,                        // emit
 | 
			
		||||
    nullptr,                        // sete
 | 
			
		||||
    &JitCompiler::Compile_JMP,      // jmpc
 | 
			
		||||
    &JitCompiler::Compile_JMP,      // jmpu
 | 
			
		||||
    &JitCompiler::Compile_CMP,      // cmp
 | 
			
		||||
    &JitCompiler::Compile_CMP,      // cmp
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // madi
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitCompiler::Compile_MAD,      // mad
 | 
			
		||||
    &JitShader::Compile_JMP,        // jmpc
 | 
			
		||||
    &JitShader::Compile_JMP,        // jmpu
 | 
			
		||||
    &JitShader::Compile_CMP,        // cmp
 | 
			
		||||
    &JitShader::Compile_CMP,        // cmp
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // madi
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
    &JitShader::Compile_MAD,        // mad
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// The following is used to alias some commonly used registers. Generally, RAX-RDX and XMM0-XMM3 can
 | 
			
		||||
@ -151,7 +151,7 @@ static void LogCritical(const char* msg) {
 | 
			
		||||
    LOG_CRITICAL(HW_GPU, msg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::RuntimeAssert(bool condition, const char* msg) {
 | 
			
		||||
void JitShader::RuntimeAssert(bool condition, const char* msg) {
 | 
			
		||||
    if (!condition) {
 | 
			
		||||
        ABI_CallFunctionP(reinterpret_cast<const void*>(LogCritical), const_cast<char*>(msg));
 | 
			
		||||
    }
 | 
			
		||||
@ -164,7 +164,7 @@ void JitCompiler::RuntimeAssert(bool condition, const char* msg) {
 | 
			
		||||
 * @param src_reg SourceRegister object corresponding to the source register to load
 | 
			
		||||
 * @param dest Destination XMM register to store the loaded, swizzled source register
 | 
			
		||||
 */
 | 
			
		||||
void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRegister src_reg, X64Reg dest) {
 | 
			
		||||
void JitShader::Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRegister src_reg, X64Reg dest) {
 | 
			
		||||
    X64Reg src_ptr;
 | 
			
		||||
    size_t src_offset;
 | 
			
		||||
 | 
			
		||||
@ -236,7 +236,7 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_DestEnable(Instruction instr,X64Reg src) {
 | 
			
		||||
void JitShader::Compile_DestEnable(Instruction instr,X64Reg src) {
 | 
			
		||||
    DestRegister dest;
 | 
			
		||||
    unsigned operand_desc_id;
 | 
			
		||||
    if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD ||
 | 
			
		||||
@ -283,7 +283,7 @@ void JitCompiler::Compile_DestEnable(Instruction instr,X64Reg src) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_SanitizedMul(Gen::X64Reg src1, Gen::X64Reg src2, Gen::X64Reg scratch) {
 | 
			
		||||
void JitShader::Compile_SanitizedMul(Gen::X64Reg src1, Gen::X64Reg src2, Gen::X64Reg scratch) {
 | 
			
		||||
    MOVAPS(scratch, R(src1));
 | 
			
		||||
    CMPPS(scratch, R(src2), CMP_ORD);
 | 
			
		||||
 | 
			
		||||
@ -296,7 +296,7 @@ void JitCompiler::Compile_SanitizedMul(Gen::X64Reg src1, Gen::X64Reg src2, Gen::
 | 
			
		||||
    ANDPS(src1, R(scratch));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_EvaluateCondition(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_EvaluateCondition(Instruction instr) {
 | 
			
		||||
    // Note: NXOR is used below to check for equality
 | 
			
		||||
    switch (instr.flow_control.op) {
 | 
			
		||||
    case Instruction::FlowControlType::Or:
 | 
			
		||||
@ -327,23 +327,23 @@ void JitCompiler::Compile_EvaluateCondition(Instruction instr) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_UniformCondition(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_UniformCondition(Instruction instr) {
 | 
			
		||||
    int offset = offsetof(decltype(g_state.vs.uniforms), b) + (instr.flow_control.bool_uniform_id * sizeof(bool));
 | 
			
		||||
    CMP(sizeof(bool) * 8, MDisp(UNIFORMS, offset), Imm8(0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BitSet32 JitCompiler::PersistentCallerSavedRegs() {
 | 
			
		||||
BitSet32 JitShader::PersistentCallerSavedRegs() {
 | 
			
		||||
    return persistent_regs & ABI_ALL_CALLER_SAVED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_ADD(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_ADD(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
    ADDPS(SRC1, R(SRC2));
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_DP3(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_DP3(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
 | 
			
		||||
@ -362,7 +362,7 @@ void JitCompiler::Compile_DP3(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_DP4(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_DP4(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
 | 
			
		||||
@ -379,7 +379,7 @@ void JitCompiler::Compile_DP4(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_DPH(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_DPH(Instruction instr) {
 | 
			
		||||
    if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::DPHI) {
 | 
			
		||||
        Compile_SwizzleSrc(instr, 1, instr.common.src1i, SRC1);
 | 
			
		||||
        Compile_SwizzleSrc(instr, 2, instr.common.src2i, SRC2);
 | 
			
		||||
@ -411,7 +411,7 @@ void JitCompiler::Compile_DPH(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_EX2(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_EX2(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    MOVSS(XMM0, R(SRC1));
 | 
			
		||||
 | 
			
		||||
@ -424,7 +424,7 @@ void JitCompiler::Compile_EX2(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_LG2(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_LG2(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    MOVSS(XMM0, R(SRC1));
 | 
			
		||||
 | 
			
		||||
@ -437,14 +437,14 @@ void JitCompiler::Compile_LG2(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MUL(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MUL(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
    Compile_SanitizedMul(SRC1, SRC2, SCRATCH);
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_SGE(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_SGE(Instruction instr) {
 | 
			
		||||
    if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::SGEI) {
 | 
			
		||||
        Compile_SwizzleSrc(instr, 1, instr.common.src1i, SRC1);
 | 
			
		||||
        Compile_SwizzleSrc(instr, 2, instr.common.src2i, SRC2);
 | 
			
		||||
@ -459,7 +459,7 @@ void JitCompiler::Compile_SGE(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_SLT(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_SLT(Instruction instr) {
 | 
			
		||||
    if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::SLTI) {
 | 
			
		||||
        Compile_SwizzleSrc(instr, 1, instr.common.src1i, SRC1);
 | 
			
		||||
        Compile_SwizzleSrc(instr, 2, instr.common.src2i, SRC2);
 | 
			
		||||
@ -474,7 +474,7 @@ void JitCompiler::Compile_SLT(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_FLR(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_FLR(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
 | 
			
		||||
    if (Common::GetCPUCaps().sse4_1) {
 | 
			
		||||
@ -487,7 +487,7 @@ void JitCompiler::Compile_FLR(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MAX(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MAX(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
    // SSE semantics match PICA200 ones: In case of NaN, SRC2 is returned.
 | 
			
		||||
@ -495,7 +495,7 @@ void JitCompiler::Compile_MAX(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MIN(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MIN(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2);
 | 
			
		||||
    // SSE semantics match PICA200 ones: In case of NaN, SRC2 is returned.
 | 
			
		||||
@ -503,7 +503,7 @@ void JitCompiler::Compile_MIN(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MOVA(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MOVA(Instruction instr) {
 | 
			
		||||
    SwizzlePattern swiz = { g_state.vs.swizzle_data[instr.common.operand_desc_id] };
 | 
			
		||||
 | 
			
		||||
    if (!swiz.DestComponentEnabled(0) && !swiz.DestComponentEnabled(1)) {
 | 
			
		||||
@ -548,12 +548,12 @@ void JitCompiler::Compile_MOVA(Instruction instr) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MOV(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MOV(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_RCP(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_RCP(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
 | 
			
		||||
    // TODO(bunnei): RCPSS is a pretty rough approximation, this might cause problems if Pica
 | 
			
		||||
@ -564,7 +564,7 @@ void JitCompiler::Compile_RCP(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_RSQ(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_RSQ(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1);
 | 
			
		||||
 | 
			
		||||
    // TODO(bunnei): RSQRTSS is a pretty rough approximation, this might cause problems if Pica
 | 
			
		||||
@ -575,15 +575,15 @@ void JitCompiler::Compile_RSQ(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_NOP(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_NOP(Instruction instr) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_END(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_END(Instruction instr) {
 | 
			
		||||
    ABI_PopRegistersAndAdjustStack(ABI_ALL_CALLEE_SAVED, 8);
 | 
			
		||||
    RET();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_CALL(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_CALL(Instruction instr) {
 | 
			
		||||
    // Push offset of the return
 | 
			
		||||
    PUSH(64, Imm32(instr.flow_control.dest_offset + instr.flow_control.num_instructions));
 | 
			
		||||
 | 
			
		||||
@ -595,21 +595,21 @@ void JitCompiler::Compile_CALL(Instruction instr) {
 | 
			
		||||
    ADD(64, R(RSP), Imm32(8));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_CALLC(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_CALLC(Instruction instr) {
 | 
			
		||||
    Compile_EvaluateCondition(instr);
 | 
			
		||||
    FixupBranch b = J_CC(CC_Z, true);
 | 
			
		||||
    Compile_CALL(instr);
 | 
			
		||||
    SetJumpTarget(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_CALLU(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_CALLU(Instruction instr) {
 | 
			
		||||
    Compile_UniformCondition(instr);
 | 
			
		||||
    FixupBranch b = J_CC(CC_Z, true);
 | 
			
		||||
    Compile_CALL(instr);
 | 
			
		||||
    SetJumpTarget(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_CMP(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_CMP(Instruction instr) {
 | 
			
		||||
    using Op = Instruction::Common::CompareOpType::Op;
 | 
			
		||||
    Op op_x = instr.common.compare_op.x;
 | 
			
		||||
    Op op_y = instr.common.compare_op.y;
 | 
			
		||||
@ -652,7 +652,7 @@ void JitCompiler::Compile_CMP(Instruction instr) {
 | 
			
		||||
    SHR(64, R(COND1), Imm8(63));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_MAD(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_MAD(Instruction instr) {
 | 
			
		||||
    Compile_SwizzleSrc(instr, 1, instr.mad.src1, SRC1);
 | 
			
		||||
 | 
			
		||||
    if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI) {
 | 
			
		||||
@ -669,7 +669,7 @@ void JitCompiler::Compile_MAD(Instruction instr) {
 | 
			
		||||
    Compile_DestEnable(instr, SRC1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_IF(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_IF(Instruction instr) {
 | 
			
		||||
    RuntimeAssert(instr.flow_control.dest_offset >= program_counter, "Backwards if-statements not supported");
 | 
			
		||||
 | 
			
		||||
    // Evaluate the "IF" condition
 | 
			
		||||
@ -700,7 +700,7 @@ void JitCompiler::Compile_IF(Instruction instr) {
 | 
			
		||||
    SetJumpTarget(b2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_LOOP(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_LOOP(Instruction instr) {
 | 
			
		||||
    RuntimeAssert(instr.flow_control.dest_offset >= program_counter, "Backwards loops not supported");
 | 
			
		||||
    RuntimeAssert(!looping, "Nested loops not supported");
 | 
			
		||||
 | 
			
		||||
@ -728,7 +728,7 @@ void JitCompiler::Compile_LOOP(Instruction instr) {
 | 
			
		||||
    looping = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_JMP(Instruction instr) {
 | 
			
		||||
void JitShader::Compile_JMP(Instruction instr) {
 | 
			
		||||
    if (instr.opcode.Value() == OpCode::Id::JMPC)
 | 
			
		||||
        Compile_EvaluateCondition(instr);
 | 
			
		||||
    else if (instr.opcode.Value() == OpCode::Id::JMPU)
 | 
			
		||||
@ -743,13 +743,13 @@ void JitCompiler::Compile_JMP(Instruction instr) {
 | 
			
		||||
    fixup_branches.push_back({ b, instr.flow_control.dest_offset });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_Block(unsigned end) {
 | 
			
		||||
void JitShader::Compile_Block(unsigned end) {
 | 
			
		||||
    while (program_counter < end) {
 | 
			
		||||
        Compile_NextInstr();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_Return() {
 | 
			
		||||
void JitShader::Compile_Return() {
 | 
			
		||||
    // Peek return offset on the stack and check if we're at that offset
 | 
			
		||||
    MOV(64, R(RAX), MDisp(RSP, 8));
 | 
			
		||||
    CMP(32, R(RAX), Imm32(program_counter));
 | 
			
		||||
@ -760,7 +760,7 @@ void JitCompiler::Compile_Return() {
 | 
			
		||||
    SetJumpTarget(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile_NextInstr() {
 | 
			
		||||
void JitShader::Compile_NextInstr() {
 | 
			
		||||
    if (std::binary_search(return_offsets.begin(), return_offsets.end(), program_counter)) {
 | 
			
		||||
        Compile_Return();
 | 
			
		||||
    }
 | 
			
		||||
@ -783,7 +783,7 @@ void JitCompiler::Compile_NextInstr() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::FindReturnOffsets() {
 | 
			
		||||
void JitShader::FindReturnOffsets() {
 | 
			
		||||
    return_offsets.clear();
 | 
			
		||||
 | 
			
		||||
    for (size_t offset = 0; offset < g_state.vs.program_code.size(); ++offset) {
 | 
			
		||||
@ -802,7 +802,7 @@ void JitCompiler::FindReturnOffsets() {
 | 
			
		||||
    std::sort(return_offsets.begin(), return_offsets.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void JitCompiler::Compile() {
 | 
			
		||||
void JitShader::Compile() {
 | 
			
		||||
    // Reset flow control state
 | 
			
		||||
    program = (CompiledShader*)GetCodePtr();
 | 
			
		||||
    program_counter = 0;
 | 
			
		||||
@ -857,7 +857,7 @@ void JitCompiler::Compile() {
 | 
			
		||||
    LOG_DEBUG(HW_GPU, "Compiled shader size=%d", size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
JitCompiler::JitCompiler() {
 | 
			
		||||
JitShader::JitShader() {
 | 
			
		||||
    AllocCodeSpace(MAX_SHADER_SIZE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -29,9 +29,9 @@ constexpr size_t MAX_SHADER_SIZE = 1024 * 64;
 | 
			
		||||
 * This class implements the shader JIT compiler. It recompiles a Pica shader program into x86_64
 | 
			
		||||
 * code that can be executed on the host machine directly.
 | 
			
		||||
 */
 | 
			
		||||
class JitCompiler : public Gen::XCodeBlock {
 | 
			
		||||
class JitShader : public Gen::XCodeBlock {
 | 
			
		||||
public:
 | 
			
		||||
    JitCompiler();
 | 
			
		||||
    JitShader();
 | 
			
		||||
 | 
			
		||||
    void Run(void* registers, unsigned offset) const {
 | 
			
		||||
        program(registers, code_ptr[offset]);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user