From a23f18a6a6b647c7872e605662d8803b15a01e4d Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sat, 11 Jun 2011 16:12:48 -0700 Subject: [PATCH] [xcc] instructions now set PC explicitly --- riscv/decode.h | 14 ++++++++++++++ riscv/insns/beq.h | 2 +- riscv/insns/bge.h | 2 +- riscv/insns/bgeu.h | 2 +- riscv/insns/blt.h | 2 +- riscv/insns/bltu.h | 2 +- riscv/insns/bne.h | 2 +- riscv/insns/c_addi.h | 6 +++--- riscv/insns/c_beq.h | 2 +- riscv/insns/c_bne.h | 2 +- riscv/insns/c_j.h | 2 +- riscv/insns/eret.h | 2 +- riscv/insns/j.h | 2 +- riscv/insns/jal.h | 2 +- riscv/insns/jalr_c.h | 6 +++--- 15 files changed, 32 insertions(+), 18 deletions(-) diff --git a/riscv/decode.h b/riscv/decode.h index 59ca87a1..6dfe6b97 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -212,6 +212,20 @@ private: #define sext_xprlen(x) ((sreg_t(x) << (64-xprlen)) >> (64-xprlen)) #define zext_xprlen(x) ((reg_t(x) << (64-xprlen)) >> (64-xprlen)) +#ifndef RISCV_ENABLE_RVC +# define set_pc(x) \ + do { if((x) & (sizeof(insn_t)-1)) \ + { badvaddr = (x); throw trap_instruction_address_misaligned; } \ + npc = (x); \ + } while(0) +#else +# define set_pc(x) \ + do { if((x) & ((sr & SR_EC) ? 1 : 3)) \ + { badvaddr = (x); throw trap_instruction_address_misaligned; } \ + npc = (x); \ + } while(0) +#endif + // RVC stuff #define INSN_IS_RVC(x) (((x) & 0x3) < 0x3) diff --git a/riscv/insns/beq.h b/riscv/insns/beq.h index 072b7b84..7b26488e 100644 --- a/riscv/insns/beq.h +++ b/riscv/insns/beq.h @@ -1,2 +1,2 @@ if(cmp_trunc(RS1) == cmp_trunc(RS2)) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/bge.h b/riscv/insns/bge.h index 45dcc2ee..dca544b4 100644 --- a/riscv/insns/bge.h +++ b/riscv/insns/bge.h @@ -1,2 +1,2 @@ if(sreg_t(cmp_trunc(RS1)) >= sreg_t(cmp_trunc(RS2))) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/bgeu.h b/riscv/insns/bgeu.h index 2ba3fa81..63254669 100644 --- a/riscv/insns/bgeu.h +++ b/riscv/insns/bgeu.h @@ -1,2 +1,2 @@ if(cmp_trunc(RS1) >= cmp_trunc(RS2)) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/blt.h b/riscv/insns/blt.h index 3ffd20e7..d84fd7a3 100644 --- a/riscv/insns/blt.h +++ b/riscv/insns/blt.h @@ -1,2 +1,2 @@ if(sreg_t(cmp_trunc(RS1)) < sreg_t(cmp_trunc(RS2))) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/bltu.h b/riscv/insns/bltu.h index 186dcbef..250fd4f9 100644 --- a/riscv/insns/bltu.h +++ b/riscv/insns/bltu.h @@ -1,2 +1,2 @@ if(cmp_trunc(RS1) < cmp_trunc(RS2)) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/bne.h b/riscv/insns/bne.h index 39b0b19e..f7757214 100644 --- a/riscv/insns/bne.h +++ b/riscv/insns/bne.h @@ -1,2 +1,2 @@ if(cmp_trunc(RS1) != cmp_trunc(RS2)) - npc = BRANCH_TARGET; + set_pc(BRANCH_TARGET); diff --git a/riscv/insns/c_addi.h b/riscv/insns/c_addi.h index c716f699..448e31a3 100644 --- a/riscv/insns/c_addi.h +++ b/riscv/insns/c_addi.h @@ -1,10 +1,10 @@ require_rvc; if(CRD_REGNUM == 0) { - reg_t temp = npc; - npc = CRS1; + reg_t temp = CRS1; if(CIMM6 & 0x20) - RA = temp; + RA = npc; + set_pc(temp); } else CRD = sext_xprlen(CRS2 + CIMM6); diff --git a/riscv/insns/c_beq.h b/riscv/insns/c_beq.h index 4ceaba26..031d96db 100644 --- a/riscv/insns/c_beq.h +++ b/riscv/insns/c_beq.h @@ -1,3 +1,3 @@ require_rvc; if(cmp_trunc(CRS1S) == cmp_trunc(CRS2S)) - npc = CBRANCH_TARGET; + set_pc(CBRANCH_TARGET); diff --git a/riscv/insns/c_bne.h b/riscv/insns/c_bne.h index 59f257b5..caf92290 100644 --- a/riscv/insns/c_bne.h +++ b/riscv/insns/c_bne.h @@ -1,3 +1,3 @@ require_rvc; if(cmp_trunc(CRS1S) != cmp_trunc(CRS2S)) - npc = CBRANCH_TARGET; + set_pc(CBRANCH_TARGET); diff --git a/riscv/insns/c_j.h b/riscv/insns/c_j.h index 87ee0150..5ba9c735 100644 --- a/riscv/insns/c_j.h +++ b/riscv/insns/c_j.h @@ -1,2 +1,2 @@ require_rvc; -npc = CJUMP_TARGET; +set_pc(CJUMP_TARGET); diff --git a/riscv/insns/eret.h b/riscv/insns/eret.h index 37e85885..46d5bed2 100644 --- a/riscv/insns/eret.h +++ b/riscv/insns/eret.h @@ -2,4 +2,4 @@ require_supervisor; if(sr & SR_ET) throw trap_illegal_instruction; set_sr(((sr & SR_PS) ? sr : (sr & ~SR_S)) | SR_ET); -npc = epc; +set_pc(epc); diff --git a/riscv/insns/j.h b/riscv/insns/j.h index 8abe0ba2..3a4da2a7 100644 --- a/riscv/insns/j.h +++ b/riscv/insns/j.h @@ -1 +1 @@ -npc = JUMP_TARGET; +set_pc(JUMP_TARGET); diff --git a/riscv/insns/jal.h b/riscv/insns/jal.h index bca7241e..41dc4037 100644 --- a/riscv/insns/jal.h +++ b/riscv/insns/jal.h @@ -1,2 +1,2 @@ RA = npc; -npc = JUMP_TARGET; +set_pc(JUMP_TARGET); diff --git a/riscv/insns/jalr_c.h b/riscv/insns/jalr_c.h index 536ebbf7..91be911b 100644 --- a/riscv/insns/jalr_c.h +++ b/riscv/insns/jalr_c.h @@ -1,3 +1,3 @@ -reg_t temp = npc; -npc = RS1 + SIMM; -RD = temp; +reg_t temp = RS1; +RD = npc; +set_pc(temp + SIMM);