lizzie 6 days ago
parent
commit
88a2d2cecb
  1. 11
      src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
  2. 4
      src/dynarmic/src/dynarmic/backend/x64/stack_layout.h
  3. 6
      src/video_core/host_shaders/CMakeLists.txt

11
src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp

@ -90,9 +90,8 @@ A64EmitX64::BlockDescriptor A64EmitX64::Emit(IR::Block& block) noexcept {
code.align(); code.align();
const auto* const entrypoint = code.getCurr(); const auto* const entrypoint = code.getCurr();
code.push(rbp);
code.mov(rbp, rsp);
code.and_(rsp, -16);
// code.mov(code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)], rbp);
// code.lea(rbp, code.ptr[rsp + ABI_SHADOW_SPACE - 8]);
DEBUG_ASSERT(block.GetCondition() == IR::Cond::AL); DEBUG_ASSERT(block.GetCondition() == IR::Cond::AL);
typedef void (EmitX64::*EmitHandlerFn)(EmitContext& context, IR::Inst* inst); typedef void (EmitX64::*EmitHandlerFn)(EmitContext& context, IR::Inst* inst);
@ -148,6 +147,9 @@ finish_this_inst:
if (conf.enable_cycle_counting) { if (conf.enable_cycle_counting) {
EmitAddCycles(block.CycleCount()); EmitAddCycles(block.CycleCount());
} }
//code.mov(rbp, code.qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, abi_base_pointer)]);
EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep()); EmitTerminal(block.GetTerminal(), ctx.Location().SetSingleStepping(false), ctx.IsSingleStep());
code.int3(); code.int3();
@ -252,9 +254,6 @@ void A64EmitX64::GenTerminalHandlers() {
} }
code.and_(code.ABI_PARAM1.cvt32(), fast_dispatch_table_mask); code.and_(code.ABI_PARAM1.cvt32(), fast_dispatch_table_mask);
code.lea(code.ABI_RETURN, code.ptr[code.ABI_PARAM2 + code.ABI_PARAM1]); code.lea(code.ABI_RETURN, code.ptr[code.ABI_PARAM2 + code.ABI_PARAM1]);
code.mov(rsp, rbp);
code.pop(rbp);
code.ret(); code.ret();
PerfMapRegister(fast_dispatch_table_lookup, code.getCurr(), "a64_fast_dispatch_table_lookup"); PerfMapRegister(fast_dispatch_table_lookup, code.getCurr(), "a64_fast_dispatch_table_lookup");
} }

4
src/dynarmic/src/dynarmic/backend/x64/stack_layout.h

@ -22,13 +22,11 @@ constexpr size_t SpillCount = 64;
#endif #endif
struct alignas(16) StackLayout { struct alignas(16) StackLayout {
u64 abi_base_pointer;
s64 cycles_remaining; s64 cycles_remaining;
s64 cycles_to_run; s64 cycles_to_run;
std::array<std::array<u64, 2>, SpillCount> spill; std::array<std::array<u64, 2>, SpillCount> spill;
u32 save_host_MXCSR; u32 save_host_MXCSR;
bool check_bit; bool check_bit;
}; };

6
src/video_core/host_shaders/CMakeLists.txt

@ -135,7 +135,7 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES})
${SOURCE_FILE} ${SOURCE_FILE}
DEPENDS DEPENDS
${INPUT_FILE} ${INPUT_FILE}
${SHADER_DIR}
# ${SHADER_DIR}
# HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified # HEADER_GENERATOR should be included here but msbuild seems to assume it's always modified
) )
set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE}) set(SHADER_HEADERS ${SHADER_HEADERS} ${SOURCE_HEADER_FILE})
@ -151,8 +151,8 @@ foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES})
${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION} ${GLSLANGVALIDATOR} -V ${QUIET_FLAG} -I"${FIDELITYFX_INCLUDE_DIR}" ${GLSL_FLAGS} --variable-name ${SPIRV_VARIABLE_NAME} -o ${SPIRV_HEADER_FILE} ${SOURCE_FILE} --target-env ${SPIR_V_VERSION}
MAIN_DEPENDENCY MAIN_DEPENDENCY
${SOURCE_FILE} ${SOURCE_FILE}
DEPENDS
${SHADER_DIR}
#DEPENDS
# ${SHADER_DIR}
) )
set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE}) set(SHADER_HEADERS ${SHADER_HEADERS} ${SPIRV_HEADER_FILE})
endif() endif()

Loading…
Cancel
Save