aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/rem.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2012-02-15 19:44:24 -0800
committerAndrew Waterman <waterman@eecs.berkeley.edu>2012-02-15 19:44:24 -0800
commite819f852c5eafb457401396d9c3de85cd5870549 (patch)
tree309c14e1158e039f909b4c25b068ac4f99974634 /riscv/insns/rem.h
parentc12d9358ec36062a9713fd9edfd486e1e345afdf (diff)
downloadspike-e819f852c5eafb457401396d9c3de85cd5870549.zip
spike-e819f852c5eafb457401396d9c3de85cd5870549.tar.gz
spike-e819f852c5eafb457401396d9c3de85cd5870549.tar.bz2
reimplement div[u][w]/rem[u][w]
fixes bugs for inputs not properly sign-extended
Diffstat (limited to 'riscv/insns/rem.h')
-rw-r--r--riscv/insns/rem.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/riscv/insns/rem.h b/riscv/insns/rem.h
index ac82a56..8094b5b 100644
--- a/riscv/insns/rem.h
+++ b/riscv/insns/rem.h
@@ -1,6 +1,8 @@
-if(RS2 == 0)
- RD = RS1;
-else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
+sreg_t lhs = sext_xprlen(RS1);
+sreg_t rhs = sext_xprlen(RS2);
+if(rhs == 0)
+ RD = lhs;
+else if(lhs == INT64_MIN && rhs == -1)
RD = 0;
else
- RD = sext_xprlen(sext_xprlen(RS1) % sext_xprlen(RS2));
+ RD = sext_xprlen(lhs % rhs);