changes jh globals to seperate riscv specifics
This commit is contained in:
parent
051dd5e2d3
commit
86de536c8f
|
@ -91,7 +91,6 @@ protected:
|
||||||
using super::gen_wait;
|
using super::gen_wait;
|
||||||
using super::gen_leave;
|
using super::gen_leave;
|
||||||
using super::gen_sync;
|
using super::gen_sync;
|
||||||
using super::gen_set_tval;
|
|
||||||
|
|
||||||
using this_class = vm_impl<ARCH>;
|
using this_class = vm_impl<ARCH>;
|
||||||
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
|
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
|
||||||
|
@ -104,6 +103,8 @@ protected:
|
||||||
void gen_instr_prologue(jit_holder& jh);
|
void gen_instr_prologue(jit_holder& jh);
|
||||||
void gen_instr_epilogue(jit_holder& jh);
|
void gen_instr_epilogue(jit_holder& jh);
|
||||||
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
|
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
|
||||||
|
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>> void gen_set_tval(jit_holder& jh, T new_tval) ;
|
||||||
|
void gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) ;
|
||||||
|
|
||||||
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
|
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
|
||||||
inline S sext(U from) {
|
inline S sext(U from) {
|
||||||
|
@ -260,7 +261,7 @@ template <typename ARCH>
|
||||||
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
|
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
|
||||||
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
|
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
|
||||||
jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
|
jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
|
||||||
jh.tval = get_reg_Gp(jh.cc, 64, false);
|
jh.globals["tval"] = get_reg_Gp(jh.cc, 64, false);
|
||||||
}
|
}
|
||||||
template <typename ARCH>
|
template <typename ARCH>
|
||||||
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
||||||
|
@ -283,7 +284,7 @@ void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
||||||
call_enter_trap->setArg(0, jh.arch_if_ptr);
|
call_enter_trap->setArg(0, jh.arch_if_ptr);
|
||||||
call_enter_trap->setArg(1, current_trap_state);
|
call_enter_trap->setArg(1, current_trap_state);
|
||||||
call_enter_trap->setArg(2, current_pc);
|
call_enter_trap->setArg(2, current_pc);
|
||||||
call_enter_trap->setArg(3, jh.tval);
|
call_enter_trap->setArg(3, jh.globals["tval"]);
|
||||||
|
|
||||||
x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
|
x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
|
||||||
mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
|
mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
|
||||||
|
@ -300,6 +301,22 @@ inline void vm_impl<ARCH>::gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t
|
||||||
mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
|
mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
|
||||||
mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
|
mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
|
||||||
}
|
}
|
||||||
|
template <typename ARCH>
|
||||||
|
template <typename T, typename>
|
||||||
|
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, T new_tval) {
|
||||||
|
mov(jh.cc, jh.globals["tval"], new_tval);
|
||||||
|
}
|
||||||
|
template <typename ARCH>
|
||||||
|
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) {
|
||||||
|
if(std::holds_alternative<x86::Gp>(_new_tval)) {
|
||||||
|
x86::Gp new_tval = std::get<x86::Gp>(_new_tval);
|
||||||
|
if(new_tval.size() < 8)
|
||||||
|
new_tval = gen_ext_Gp(jh.cc, new_tval, 64, false);
|
||||||
|
mov(jh.cc, jh.globals["tval"], new_tval);
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error("Variant not supported in gen_set_tval");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace tgc5c
|
} // namespace tgc5c
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,6 @@ protected:
|
||||||
using super::gen_wait;
|
using super::gen_wait;
|
||||||
using super::gen_leave;
|
using super::gen_leave;
|
||||||
using super::gen_sync;
|
using super::gen_sync;
|
||||||
using super::gen_set_tval;
|
|
||||||
|
|
||||||
using this_class = vm_impl<ARCH>;
|
using this_class = vm_impl<ARCH>;
|
||||||
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
|
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
|
||||||
|
@ -104,6 +103,8 @@ protected:
|
||||||
void gen_instr_prologue(jit_holder& jh);
|
void gen_instr_prologue(jit_holder& jh);
|
||||||
void gen_instr_epilogue(jit_holder& jh);
|
void gen_instr_epilogue(jit_holder& jh);
|
||||||
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
|
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
|
||||||
|
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>> void gen_set_tval(jit_holder& jh, T new_tval) ;
|
||||||
|
void gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) ;
|
||||||
|
|
||||||
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
|
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
|
||||||
inline S sext(U from) {
|
inline S sext(U from) {
|
||||||
|
@ -4800,7 +4801,7 @@ template <typename ARCH>
|
||||||
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
|
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
|
||||||
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
|
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
|
||||||
jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
|
jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
|
||||||
jh.tval = get_reg_Gp(jh.cc, 64, false);
|
jh.globals["tval"] = get_reg_Gp(jh.cc, 64, false);
|
||||||
}
|
}
|
||||||
template <typename ARCH>
|
template <typename ARCH>
|
||||||
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
||||||
|
@ -4823,7 +4824,7 @@ void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
|
||||||
call_enter_trap->setArg(0, jh.arch_if_ptr);
|
call_enter_trap->setArg(0, jh.arch_if_ptr);
|
||||||
call_enter_trap->setArg(1, current_trap_state);
|
call_enter_trap->setArg(1, current_trap_state);
|
||||||
call_enter_trap->setArg(2, current_pc);
|
call_enter_trap->setArg(2, current_pc);
|
||||||
call_enter_trap->setArg(3, jh.tval);
|
call_enter_trap->setArg(3, jh.globals["tval"]);
|
||||||
|
|
||||||
x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
|
x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
|
||||||
mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
|
mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
|
||||||
|
@ -4840,6 +4841,22 @@ inline void vm_impl<ARCH>::gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t
|
||||||
mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
|
mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
|
||||||
mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
|
mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
|
||||||
}
|
}
|
||||||
|
template <typename ARCH>
|
||||||
|
template <typename T, typename>
|
||||||
|
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, T new_tval) {
|
||||||
|
mov(jh.cc, jh.globals["tval"], new_tval);
|
||||||
|
}
|
||||||
|
template <typename ARCH>
|
||||||
|
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) {
|
||||||
|
if(std::holds_alternative<x86::Gp>(_new_tval)) {
|
||||||
|
x86::Gp new_tval = std::get<x86::Gp>(_new_tval);
|
||||||
|
if(new_tval.size() < 8)
|
||||||
|
new_tval = gen_ext_Gp(jh.cc, new_tval, 64, false);
|
||||||
|
mov(jh.cc, jh.globals["tval"], new_tval);
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error("Variant not supported in gen_set_tval");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace tgc5c
|
} // namespace tgc5c
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue