updates template and adds braces when using conditions

This commit is contained in:
Eyck-Alexander Jentzsch 2024-08-13 08:55:14 +02:00
parent 0b5062d21c
commit b5341700aa
2 changed files with 42 additions and 4 deletions

View File

@ -38,7 +38,9 @@
#include <asmjit/asmjit.h> #include <asmjit/asmjit.h>
#include <util/logging.h> #include <util/logging.h>
#include <iss/instruction_decoder.h> #include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
#endif #endif
@ -100,7 +102,9 @@ protected:
void gen_block_prologue(jit_holder& jh) override; void gen_block_prologue(jit_holder& jh) override;
void gen_block_epilogue(jit_holder& jh) override; void gen_block_epilogue(jit_holder& jh) override;
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
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);
@ -113,6 +117,9 @@ protected:
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
<%functions.each{ it.eachLine { %>
${it}<%}%>
<%}%>
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions

View File

@ -113,6 +113,7 @@ protected:
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
@ -500,6 +501,7 @@ private:
(gen_operation(cc, band, (gen_operation(cc, add, load_reg_from_mem(jh, traits::X0 + rs1), (int16_t)sext<12>(imm)) (gen_operation(cc, band, (gen_operation(cc, add, load_reg_from_mem(jh, traits::X0 + rs1), (int16_t)sext<12>(imm))
), addr_mask) ), addr_mask)
), 32, true); ), 32, true);
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, urem, new_pc, static_cast<uint32_t>(traits::INSTR_ALIGNMENT)) cmp(cc, gen_operation(cc, urem, new_pc, static_cast<uint32_t>(traits::INSTR_ALIGNMENT))
,0); ,0);
@ -521,6 +523,7 @@ private:
mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(UNKNOWN_JUMP)); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(UNKNOWN_JUMP));
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -566,6 +569,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2)) cmp(cc, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2))
,0); ,0);
@ -583,6 +587,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -628,6 +633,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2)) cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2))
,0); ,0);
@ -645,6 +651,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -690,6 +697,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, lt, gen_ext(cc, cmp(cc, gen_operation(cc, lt, gen_ext(cc,
load_reg_from_mem(jh, traits::X0 + rs1), 32, false), gen_ext(cc, load_reg_from_mem(jh, traits::X0 + rs1), 32, false), gen_ext(cc,
@ -709,6 +717,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -754,6 +763,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, gte, gen_ext(cc, cmp(cc, gen_operation(cc, gte, gen_ext(cc,
load_reg_from_mem(jh, traits::X0 + rs1), 32, false), gen_ext(cc, load_reg_from_mem(jh, traits::X0 + rs1), 32, false), gen_ext(cc,
@ -773,6 +783,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -818,6 +829,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ltu, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2)) cmp(cc, gen_operation(cc, ltu, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2))
,0); ,0);
@ -835,6 +847,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -880,6 +893,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, gteu, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2)) cmp(cc, gen_operation(cc, gteu, load_reg_from_mem(jh, traits::X0 + rs1), load_reg_from_mem(jh, traits::X0 + rs2))
,0); ,0);
@ -897,6 +911,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = BRANCH; auto returnValue = BRANCH;
@ -3116,6 +3131,7 @@ private:
auto divisor = gen_ext(cc, auto divisor = gen_ext(cc,
load_reg_from_mem(jh, traits::X0 + rs2), 32, true); load_reg_from_mem(jh, traits::X0 + rs2), 32, true);
if(rd!=0){ if(rd!=0){
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, divisor, 0) cmp(cc, gen_operation(cc, ne, divisor, 0)
,0); ,0);
@ -3123,6 +3139,7 @@ private:
cc.je(label_else); cc.je(label_else);
{ {
auto MMIN = ((uint32_t)1)<<(static_cast<uint32_t>(traits::XLEN)-1); auto MMIN = ((uint32_t)1)<<(static_cast<uint32_t>(traits::XLEN)-1);
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, land, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), MMIN) cmp(cc, gen_operation(cc, land, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), MMIN)
, gen_operation(cc, eq, divisor, - 1) , gen_operation(cc, eq, divisor, - 1)
@ -3143,6 +3160,7 @@ private:
), 32, true)); ), 32, true));
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
cc.jmp(label_merge); cc.jmp(label_merge);
cc.bind(label_else); cc.bind(label_else);
@ -3151,6 +3169,7 @@ private:
(uint32_t)- 1); (uint32_t)- 1);
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
} }
auto returnValue = CONT; auto returnValue = CONT;
@ -3196,6 +3215,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0) cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0)
,0); ,0);
@ -3217,6 +3237,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = CONT; auto returnValue = CONT;
@ -3261,6 +3282,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0) cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0)
,0); ,0);
@ -3268,6 +3290,7 @@ private:
cc.je(label_else); cc.je(label_else);
{ {
auto MMIN = (uint32_t)1<<(static_cast<uint32_t>(traits::XLEN)-1); auto MMIN = (uint32_t)1<<(static_cast<uint32_t>(traits::XLEN)-1);
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, land, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), MMIN) cmp(cc, gen_operation(cc, land, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1), MMIN)
, gen_operation(cc, eq, gen_ext(cc, , gen_operation(cc, eq, gen_ext(cc,
@ -3296,6 +3319,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
cc.jmp(label_merge); cc.jmp(label_merge);
cc.bind(label_else); cc.bind(label_else);
@ -3306,6 +3330,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = CONT; auto returnValue = CONT;
@ -3350,6 +3375,7 @@ private:
gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise(jh, 0, static_cast<int32_t>(traits::RV_CAUSE_ILLEGAL_INSTRUCTION));
} }
else{ else{
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0) cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs2), 0)
,0); ,0);
@ -3371,6 +3397,7 @@ private:
} }
} }
cc.bind(label_merge); cc.bind(label_merge);
}
} }
auto returnValue = CONT; auto returnValue = CONT;
@ -4194,6 +4221,7 @@ private:
cc.comment("//behavior:"); cc.comment("//behavior:");
/*generate behavior*/ /*generate behavior*/
mov(jh.cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(NO_JUMP)); mov(jh.cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(NO_JUMP));
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1+8), 0) cmp(cc, gen_operation(cc, eq, load_reg_from_mem(jh, traits::X0 + rs1+8), 0)
,0); ,0);
@ -4204,6 +4232,7 @@ private:
mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(KNOWN_JUMP)); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(KNOWN_JUMP));
} }
cc.bind(label_merge); cc.bind(label_merge);
}
auto returnValue = BRANCH; auto returnValue = BRANCH;
gen_sync(jh, POST_SYNC, 75); gen_sync(jh, POST_SYNC, 75);
@ -4243,6 +4272,7 @@ private:
cc.comment("//behavior:"); cc.comment("//behavior:");
/*generate behavior*/ /*generate behavior*/
mov(jh.cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(NO_JUMP)); mov(jh.cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(NO_JUMP));
{
auto label_merge = cc.newLabel(); auto label_merge = cc.newLabel();
cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs1+8), 0) cmp(cc, gen_operation(cc, ne, load_reg_from_mem(jh, traits::X0 + rs1+8), 0)
,0); ,0);
@ -4253,6 +4283,7 @@ private:
mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(KNOWN_JUMP)); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(KNOWN_JUMP));
} }
cc.bind(label_merge); cc.bind(label_merge);
}
auto returnValue = BRANCH; auto returnValue = BRANCH;
gen_sync(jh, POST_SYNC, 76); gen_sync(jh, POST_SYNC, 76);