aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-10-02 11:39:09 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-10-02 11:39:09 -0700
commit82372d00398ce3712f0c7e9f243f6828041e0859 (patch)
treec023a7afd306544a8eb5f3e0cf059a3b2dc9da4a /riscv/insns
parente78da5da4a6e6a38953cda9b35992c421768c776 (diff)
downloadspike-82372d00398ce3712f0c7e9f243f6828041e0859.zip
spike-82372d00398ce3712f0c7e9f243f6828041e0859.tar.gz
spike-82372d00398ce3712f0c7e9f243f6828041e0859.tar.bz2
clean up shift instruction implementation
Diffstat (limited to 'riscv/insns')
-rw-r--r--riscv/insns/slli.h3
-rw-r--r--riscv/insns/srai.h10
-rw-r--r--riscv/insns/srl.h5
-rw-r--r--riscv/insns/srli.h10
4 files changed, 6 insertions, 22 deletions
diff --git a/riscv/insns/slli.h b/riscv/insns/slli.h
index dfe7168..26782fd 100644
--- a/riscv/insns/slli.h
+++ b/riscv/insns/slli.h
@@ -1,3 +1,2 @@
-if (SHAMT >= xlen)
- throw trap_illegal_instruction();
+require(SHAMT < xlen);
WRITE_RD(sext_xlen(RS1 << SHAMT));
diff --git a/riscv/insns/srai.h b/riscv/insns/srai.h
index 69066ef..7ae1d4e 100644
--- a/riscv/insns/srai.h
+++ b/riscv/insns/srai.h
@@ -1,8 +1,2 @@
-if (xlen == 64)
- WRITE_RD(sreg_t(RS1) >> SHAMT);
-else
-{
- if(SHAMT & 0x20)
- throw trap_illegal_instruction();
- WRITE_RD(sext32(int32_t(RS1) >> SHAMT));
-}
+require(SHAMT < xlen);
+WRITE_RD(sext_xlen(sext_xlen(RS1) >> SHAMT));
diff --git a/riscv/insns/srl.h b/riscv/insns/srl.h
index 0eb948b..0dabe9e 100644
--- a/riscv/insns/srl.h
+++ b/riscv/insns/srl.h
@@ -1,4 +1 @@
-if (xlen == 64)
- WRITE_RD(RS1 >> (RS2 & 0x3F));
-else
- WRITE_RD(sext32((uint32_t)RS1 >> (RS2 & 0x1F)));
+WRITE_RD(sext_xlen(zext_xlen(RS1) >> (RS2 & (xlen-1))));
diff --git a/riscv/insns/srli.h b/riscv/insns/srli.h
index 0cdc853..ea0b40d 100644
--- a/riscv/insns/srli.h
+++ b/riscv/insns/srli.h
@@ -1,8 +1,2 @@
-if (xlen == 64)
- WRITE_RD(RS1 >> SHAMT);
-else
-{
- if(SHAMT & 0x20)
- throw trap_illegal_instruction();
- WRITE_RD(sext32((uint32_t)RS1 >> SHAMT));
-}
+require(SHAMT < xlen);
+WRITE_RD(sext_xlen(zext_xlen(RS1) >> SHAMT));