From ac8f8b05394ea0a6e32001ea98a47838ad2e941b Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Wed, 10 Jul 2024 12:43:43 +0200 Subject: [PATCH] updates vms with fixed Zc in tgc5c.core_desc --- src/vm/asmjit/vm_tgc5c.cpp | 6 +- src/vm/llvm/vm_tgc5c.cpp | 232 ++++++++++++++++--------------------- src/vm/tcc/vm_tgc5c.cpp | 166 +++++++++++++------------- 3 files changed, 189 insertions(+), 215 deletions(-) diff --git a/src/vm/asmjit/vm_tgc5c.cpp b/src/vm/asmjit/vm_tgc5c.cpp index d776a6c..1a0fbba 100644 --- a/src/vm/asmjit/vm_tgc5c.cpp +++ b/src/vm/asmjit/vm_tgc5c.cpp @@ -4333,7 +4333,8 @@ private: cc.comment("//behavior:"); /*generate behavior*/ if(rs1&&rs1(traits::RFS)){ - auto PC_val_v = gen_operation(cc, band, load_reg_from_mem(jh, traits::X0 + rs1%static_cast(traits::RFS)), ~ 1) + auto addr_mask = (uint32_t)- 2; + auto PC_val_v = gen_operation(cc, band, load_reg_from_mem(jh, traits::X0 + rs1%static_cast(traits::RFS)), addr_mask) ; mov(cc, jh.next_pc, PC_val_v); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), 32U); @@ -4464,10 +4465,11 @@ private: gen_raise(jh, 0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ + auto addr_mask = (uint32_t)- 2; auto new_pc = load_reg_from_mem(jh, traits::X0 + rs1); mov(cc, get_ptr_for(jh, traits::X0+ 1), (uint32_t)(PC+2)); - auto PC_val_v = gen_operation(cc, band, new_pc, ~ 1) + auto PC_val_v = gen_operation(cc, band, new_pc, addr_mask) ; mov(cc, jh.next_pc, PC_val_v); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), 32U); diff --git a/src/vm/llvm/vm_tgc5c.cpp b/src/vm/llvm/vm_tgc5c.cpp index aa4d9a0..7411353 100644 --- a/src/vm/llvm/vm_tgc5c.cpp +++ b/src/vm/llvm/vm_tgc5c.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2017, 2018 MINRES Technologies GmbH + * Copyright (C) 2017-2024 MINRES Technologies GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -352,7 +352,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -395,7 +395,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -438,7 +438,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(imm%static_cast(traits::INSTR_ALIGNMENT)){ this->gen_raise_trap(0, 0); @@ -489,7 +489,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto addr_mask =this->gen_const(32,(uint32_t)- 2); @@ -563,7 +563,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -620,7 +620,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -677,7 +677,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -738,7 +738,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -799,7 +799,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -856,7 +856,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -913,7 +913,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address =this->gen_ext( @@ -968,7 +968,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address =this->gen_ext( @@ -1023,7 +1023,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address =this->gen_ext( @@ -1078,7 +1078,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address =this->gen_ext( @@ -1131,7 +1131,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address =this->gen_ext( @@ -1184,7 +1184,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address =this->gen_ext( @@ -1234,7 +1234,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address =this->gen_ext( @@ -1284,7 +1284,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address =this->gen_ext( @@ -1334,7 +1334,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1383,7 +1383,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1434,7 +1434,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1484,7 +1484,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1531,7 +1531,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1578,7 +1578,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1625,7 +1625,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1672,7 +1672,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1719,7 +1719,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1729,8 +1729,7 @@ private: this->gen_ext( this->gen_reg_load(rs1+ traits::X0, 0), 32,true), this->gen_ext(this->gen_const(8,shamt), 32,false)) - ), - 32, true), + ), 32,false), get_reg_ptr(rd + traits::X0), false); } } @@ -1769,7 +1768,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1818,7 +1817,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1867,7 +1866,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1917,7 +1916,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1969,7 +1968,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2019,7 +2018,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2066,7 +2065,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2116,7 +2115,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2169,7 +2168,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2216,7 +2215,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2398,7 +2397,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrs1 =this->gen_reg_load(rs1+ traits::X0, 0); @@ -2451,7 +2450,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd =this->gen_read_mem(traits::CSR, csr, 4); @@ -2505,7 +2504,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd =this->gen_read_mem(traits::CSR, csr, 4); @@ -2559,7 +2558,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd =this->gen_read_mem(traits::CSR, csr, 4); @@ -2607,7 +2606,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd =this->gen_read_mem(traits::CSR, csr, 4); @@ -2660,7 +2659,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd =this->gen_read_mem(traits::CSR, csr, 4); @@ -2750,21 +2749,15 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res =this->gen_ext( - (this->builder.CreateMul( - this->gen_ext(this->gen_ext( - this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), 32,true), - 64, true), 128,true), - this->gen_ext(this->gen_ext( - this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), 32,true), - 64, true), 128,true)) - ), - 64, true); + auto res =this->builder.CreateMul( + this->gen_ext(this->gen_ext( + this->gen_reg_load(rs1+ traits::X0, 0), 32,true), 64,true), + this->gen_ext(this->gen_ext( + this->gen_reg_load(rs2+ traits::X0, 0), 32,true), 64,true)) + ; if(rd!=0) { this->builder.CreateStore( this->gen_ext( @@ -2808,21 +2801,15 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res =this->gen_ext( - (this->builder.CreateMul( - this->gen_ext(this->gen_ext( - this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), 32,true), - 64, true), 128,true), - this->gen_ext(this->gen_ext( - this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), 32,true), - 64, true), 128,true)) - ), - 64, true); + auto res =this->builder.CreateMul( + this->gen_ext(this->gen_ext( + this->gen_reg_load(rs1+ traits::X0, 0), 32,true), 64,true), + this->gen_ext(this->gen_ext( + this->gen_reg_load(rs2+ traits::X0, 0), 32,true), 64,true)) + ; if(rd!=0) { this->builder.CreateStore( this->gen_ext( @@ -2869,20 +2856,14 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res =this->gen_ext( - (this->builder.CreateMul( - this->gen_ext(this->gen_ext( - this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), 32,true), - 64, true), 128,true), - this->gen_ext(this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), - 64, false), 128,false)) - ), - 64, true); + auto res =this->builder.CreateMul( + this->gen_ext(this->gen_ext( + this->gen_reg_load(rs1+ traits::X0, 0), 32,true), 64,true), + this->gen_ext(this->gen_reg_load(rs2+ traits::X0, 0), 64,false)) + ; if(rd!=0) { this->builder.CreateStore( this->gen_ext( @@ -2929,19 +2910,13 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res =this->gen_ext( - (this->builder.CreateMul( - this->gen_ext(this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), - 64, false), 128,false), - this->gen_ext(this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), - 64, false), 128,false)) - ), - 64, false); + auto res =this->builder.CreateMul( + this->gen_ext(this->gen_reg_load(rs1+ traits::X0, 0), 64,false), + this->gen_ext(this->gen_reg_load(rs2+ traits::X0, 0), 64,false)) + ; if(rd!=0) { this->builder.CreateStore( this->gen_ext( @@ -2988,15 +2963,13 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto dividend =this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), - 32, false); + this->gen_reg_load(rs1+ traits::X0, 0), 32,true); auto divisor =this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), - 32, false); + this->gen_reg_load(rs2+ traits::X0, 0), 32,true); if(rd!=0){ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); auto bb_then = BasicBlock::Create(this->mod->getContext(), "bb_then", this->func, bb_merge); auto bb_else = BasicBlock::Create(this->mod->getContext(), "bb_else", this->func, bb_merge); @@ -3087,7 +3060,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -3101,12 +3074,10 @@ private: { if(rd!=0) { this->builder.CreateStore( - this->gen_ext( - (this->builder.CreateUDiv( - this->gen_reg_load(rs1+ traits::X0, 0), - this->gen_reg_load(rs2+ traits::X0, 0)) - ), - 32, false), + this->builder.CreateUDiv( + this->gen_reg_load(rs1+ traits::X0, 0), + this->gen_reg_load(rs2+ traits::X0, 0)) + , get_reg_ptr(rd + traits::X0), false); } } @@ -3157,7 +3128,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -3201,13 +3172,10 @@ private: this->gen_ext( (this->builder.CreateSRem( this->gen_ext( - this->gen_reg_load(rs1+ traits::X0, 0), - 32, false), + this->gen_reg_load(rs1+ traits::X0, 0), 32,true), this->gen_ext( - this->gen_reg_load(rs2+ traits::X0, 0), - 32, false)) - ), - 32, true), + this->gen_reg_load(rs2+ traits::X0, 0), 32,true)) + ), 32,false), get_reg_ptr(rd + traits::X0), false); } } @@ -3261,7 +3229,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rs1>=static_cast(traits::RFS)||rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto bb_merge = BasicBlock::Create(this->mod->getContext(), "bb_merge", this->func, this->leave_blk); @@ -3338,7 +3306,7 @@ private: get_reg_ptr(rd+8 + traits::X0), false); } else{ - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); auto returnValue = std::make_tuple(CONT,bb); @@ -3466,7 +3434,7 @@ private: /*generate behavior*/ if(rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rs1!=0) { @@ -3576,7 +3544,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -3619,7 +3587,7 @@ private: /*generate behavior*/ if(imm==0||rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } if(rd!=0) { this->builder.CreateStore( @@ -3669,7 +3637,7 @@ private: get_reg_ptr(2 + traits::X0), false); } else{ - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); auto returnValue = std::make_tuple(CONT,bb); @@ -3695,7 +3663,7 @@ private: this->gen_set_pc(pc, traits::NEXT_PC); /*generate behavior*/ - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); auto returnValue = std::make_tuple(CONT,bb); @@ -4154,7 +4122,7 @@ private: /*generate behavior*/ if(rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rs1!=0) { @@ -4200,7 +4168,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)||rd==0) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto offs =this->gen_ext( @@ -4251,7 +4219,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -4292,9 +4260,10 @@ private: this->gen_set_pc(pc, traits::NEXT_PC); /*generate behavior*/ - if(rs1&&rs1(traits::RFS)){ auto PC_val_v = this->builder.CreateAnd( + if(rs1&&rs1(traits::RFS)){ auto addr_mask =this->gen_const(32,(uint32_t)- 2); + auto PC_val_v = this->builder.CreateAnd( this->gen_reg_load(rs1%static_cast(traits::RFS)+ traits::X0, 0), - this->gen_const(32,~ 1)) + addr_mask) ; this->builder.CreateStore(PC_val_v, get_reg_ptr(traits::NEXT_PC), false); this->builder.CreateStore(this->gen_const(32,2U), get_reg_ptr(traits::LAST_BRANCH), false); @@ -4360,7 +4329,7 @@ private: /*generate behavior*/ if(rd>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -4407,16 +4376,17 @@ private: /*generate behavior*/ if(rs1>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ + auto addr_mask =this->gen_const(32,(uint32_t)- 2); auto new_pc =this->gen_reg_load(rs1+ traits::X0, 0); this->builder.CreateStore( this->gen_const(32,(uint32_t)(PC+2)), get_reg_ptr(1 + traits::X0), false); auto PC_val_v = this->builder.CreateAnd( new_pc, - this->gen_const(32,~ 1)) + addr_mask) ; this->builder.CreateStore(PC_val_v, get_reg_ptr(traits::NEXT_PC), false); this->builder.CreateStore(this->gen_const(32,2U), get_reg_ptr(traits::LAST_BRANCH), false); @@ -4479,7 +4449,7 @@ private: /*generate behavior*/ if(rs2>=static_cast(traits::RFS)) { - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto offs =this->gen_ext( @@ -4517,7 +4487,7 @@ private: this->gen_set_pc(pc, traits::NEXT_PC); /*generate behavior*/ - this->gen_raise_trap(0, 2); + this->gen_raise_trap(0, static_cast(traits::RV_CAUSE_ILLEGAL_INSTRUCTION)); bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); auto returnValue = std::make_tuple(CONT,bb); diff --git a/src/vm/tcc/vm_tgc5c.cpp b/src/vm/tcc/vm_tgc5c.cpp index cfc6375..b02372d 100644 --- a/src/vm/tcc/vm_tgc5c.cpp +++ b/src/vm/tcc/vm_tgc5c.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2020 MINRES Technologies GmbH + * Copyright (C) 2020-2024 MINRES Technologies GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -346,7 +346,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -381,7 +381,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -416,7 +416,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(imm%static_cast(traits:: INSTR_ALIGNMENT)){ this->gen_raise_trap(tu, 0, 0); @@ -459,7 +459,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto addr_mask = tu.assignment(tu.constant((uint32_t)- 2,32),32); @@ -510,7 +510,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_EQ, @@ -553,7 +553,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_NE, @@ -596,7 +596,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_SLT, @@ -639,7 +639,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_SGE, @@ -682,7 +682,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_ULT, @@ -725,7 +725,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_UGE, @@ -768,7 +768,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address = tu.assignment(tu.ext((tu.add( @@ -808,7 +808,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address = tu.assignment(tu.ext((tu.add( @@ -848,7 +848,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address = tu.assignment(tu.ext((tu.add( @@ -888,7 +888,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address = tu.assignment(tu.ext((tu.add( @@ -928,7 +928,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto load_address = tu.assignment(tu.ext((tu.add( @@ -968,7 +968,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address = tu.assignment(tu.ext((tu.add( @@ -1004,7 +1004,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address = tu.assignment(tu.ext((tu.add( @@ -1040,7 +1040,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto store_address = tu.assignment(tu.ext((tu.add( @@ -1076,7 +1076,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1114,7 +1114,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1152,7 +1152,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1190,7 +1190,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1228,7 +1228,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1266,7 +1266,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1304,7 +1304,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1342,7 +1342,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1380,7 +1380,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1418,7 +1418,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1456,7 +1456,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1494,7 +1494,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1534,7 +1534,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1572,7 +1572,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1610,7 +1610,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1648,7 +1648,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1688,7 +1688,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1728,7 +1728,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1766,7 +1766,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -1922,7 +1922,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrs1 = tu.assignment(tu.load(rs1+ traits::X0, 0),32); @@ -1963,7 +1963,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32); @@ -2006,7 +2006,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32); @@ -2049,7 +2049,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32); @@ -2087,7 +2087,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32); @@ -2129,7 +2129,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32); @@ -2199,12 +2199,12 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res = tu.assignment(tu.ext((tu.mul( - tu.ext(tu.ext(tu.load(rs1+ traits::X0, 0),32,true),64,true), - tu.ext(tu.ext(tu.load(rs2+ traits::X0, 0),32,true),64,true))),64,true),64); + auto res = tu.assignment(tu.mul( + tu.ext(tu.load(rs1+ traits::X0, 0),32,true), + tu.ext(tu.load(rs2+ traits::X0, 0),32,true)),64); if(rd!=0) { tu.store(rd + traits::X0, tu.ext(res,32,false)); @@ -2238,12 +2238,12 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res = tu.assignment(tu.ext((tu.mul( - tu.ext(tu.ext(tu.load(rs1+ traits::X0, 0),32,true),64,true), - tu.ext(tu.ext(tu.load(rs2+ traits::X0, 0),32,true),64,true))),64,true),64); + auto res = tu.assignment(tu.mul( + tu.ext(tu.load(rs1+ traits::X0, 0),32,true), + tu.ext(tu.load(rs2+ traits::X0, 0),32,true)),64); if(rd!=0) { tu.store(rd + traits::X0, tu.ext((tu.ashr( @@ -2279,12 +2279,12 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res = tu.assignment(tu.ext((tu.mul( - tu.ext(tu.ext(tu.load(rs1+ traits::X0, 0),32,true),64,true), - tu.ext(tu.load(rs2+ traits::X0, 0),64,false))),64,true),64); + auto res = tu.assignment(tu.mul( + tu.ext(tu.load(rs1+ traits::X0, 0),32,true), + tu.load(rs2+ traits::X0, 0)),64); if(rd!=0) { tu.store(rd + traits::X0, tu.ext((tu.ashr( @@ -2320,12 +2320,12 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ - auto res = tu.assignment(tu.ext((tu.mul( - tu.ext(tu.load(rs1+ traits::X0, 0),64,false), - tu.ext(tu.load(rs2+ traits::X0, 0),64,false))),64,false),64); + auto res = tu.assignment(tu.mul( + tu.load(rs1+ traits::X0, 0), + tu.load(rs2+ traits::X0, 0)),64); if(rd!=0) { tu.store(rd + traits::X0, tu.ext((tu.lshr( @@ -2361,7 +2361,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto dividend = tu.assignment(tu.ext(tu.load(rs1+ traits::X0, 0),32,true),32); @@ -2419,7 +2419,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_NE, @@ -2427,9 +2427,9 @@ private: tu.constant(0,8))); if(rd!=0) { tu.store(rd + traits::X0, - tu.ext((tu.udiv( + tu.udiv( tu.load(rs1+ traits::X0, 0), - tu.load(rs2+ traits::X0, 0))),32,false)); + tu.load(rs2+ traits::X0, 0))); } tu.open_else(); if(rd!=0) { @@ -2466,7 +2466,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_NE, @@ -2527,7 +2527,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ tu.open_if(tu.icmp(ICmpInst::ICMP_NE, @@ -2579,7 +2579,7 @@ private: tu.constant(imm,16))),32,false)); } else{ - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } auto returnValue = std::make_tuple(CONT); @@ -2671,7 +2671,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rs1!=0) { @@ -2760,7 +2760,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -2795,7 +2795,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(imm==0||rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } if(rd!=0) { tu.store(rd + traits::X0, @@ -2833,7 +2833,7 @@ private: tu.constant((int16_t)sext<10>(nzimm),16))),32,false)); } else{ - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } auto returnValue = std::make_tuple(CONT); @@ -2857,7 +2857,7 @@ private: pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); auto returnValue = std::make_tuple(CONT); tu.close_scope(); @@ -3197,7 +3197,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rs1!=0) { @@ -3234,7 +3234,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)||rd==0) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto offs = tu.assignment(tu.ext((tu.add( @@ -3270,7 +3270,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -3303,9 +3303,10 @@ private: pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); - if(rs1&&rs1(traits:: RFS)){ auto PC_val_v = tu.assignment("PC_val", tu.bitwise_and( + if(rs1&&rs1(traits:: RFS)){ auto addr_mask = tu.assignment(tu.constant((uint32_t)- 2,32),32); + auto PC_val_v = tu.assignment("PC_val", tu.bitwise_and( tu.load(rs1%static_cast(traits:: RFS)+ traits::X0, 0), - tu.constant(~ 1,32)),32); + addr_mask),32); tu.store(traits::NEXT_PC, PC_val_v); tu.store(traits::LAST_BRANCH, tu.constant(2U, 2)); } @@ -3361,7 +3362,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rd>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ if(rd!=0) { @@ -3397,15 +3398,16 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs1>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ + auto addr_mask = tu.assignment(tu.constant((uint32_t)- 2,32),32); auto new_pc = tu.assignment(tu.load(rs1+ traits::X0, 0),32); tu.store(1 + traits::X0, tu.constant((uint32_t)(PC+2),32)); auto PC_val_v = tu.assignment("PC_val", tu.bitwise_and( new_pc, - tu.constant(~ 1,32)),32); + addr_mask),32); tu.store(traits::NEXT_PC, PC_val_v); tu.store(traits::LAST_BRANCH, tu.constant(2U, 2)); } @@ -3458,7 +3460,7 @@ private: gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); if(rs2>=static_cast(traits:: RFS)) { - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); } else{ auto offs = tu.assignment(tu.ext((tu.add( @@ -3487,7 +3489,7 @@ private: pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); tu.open_scope(); - this->gen_raise_trap(tu, 0, 2); + this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); auto returnValue = std::make_tuple(CONT); tu.close_scope();