Skip to content

Commit 1c11b39

Browse files
committed
Annotate div/rem instructions
Two conditions are covered: * Division by zero * Overflow (signed only)
1 parent 558fcea commit 1c11b39

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/emulate.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,13 @@ RVOP(mulhu, {
708708
})
709709

710710
/* DIV: Divide Signed */
711+
/* +------------------------+-----------+----------+-----------+
712+
* | Condition | Dividend | Divisor | DIV[W] |
713+
* +------------------------+-----------+----------+-----------+
714+
* | Division by zero | x | 0 | −1 |
715+
* | Overflow (signed only) | −2^{L−1} | −1 | −2^{L−1} |
716+
* +------------------------+-----------+----------+-----------+
717+
*/
711718
RVOP(div, {
712719
const int32_t dividend = (int32_t) rv->X[ir->rs1];
713720
const int32_t divisor = (int32_t) rv->X[ir->rs2];
@@ -718,13 +725,26 @@ RVOP(div, {
718725
})
719726

720727
/* DIVU: Divide Unsigned */
728+
/* +------------------------+-----------+----------+----------+
729+
* | Condition | Dividend | Divisor | DIVU[W] |
730+
* +------------------------+-----------+----------+----------+
731+
* | Division by zero | x | 0 | 2^L − 1 |
732+
* +------------------------+-----------+----------+----------+
733+
*/
721734
RVOP(divu, {
722735
const uint32_t dividend = rv->X[ir->rs1];
723736
const uint32_t divisor = rv->X[ir->rs2];
724737
rv->X[ir->rd] = !divisor ? ~0U : dividend / divisor;
725738
})
726739

727740
/* REM: Remainder Signed */
741+
/* +------------------------+-----------+----------+---------+
742+
* | Condition | Dividend | Divisor | REM[W] |
743+
* +------------------------+-----------+----------+---------+
744+
* | Division by zero | x | 0 | x |
745+
* | Overflow (signed only) | −2^{L−1} | −1 | 0 |
746+
* +------------------------+-----------+----------+---------+
747+
*/
728748
RVOP(rem, {
729749
const int32_t dividend = rv->X[ir->rs1];
730750
const int32_t divisor = rv->X[ir->rs2];
@@ -735,6 +755,12 @@ RVOP(rem, {
735755
})
736756

737757
/* REMU: Remainder Unsigned */
758+
/* +------------------------+-----------+----------+----------+
759+
* | Condition | Dividend | Divisor | REMU[W] |
760+
* +------------------------+-----------+----------+----------+
761+
* | Division by zero | x | 0 | x |
762+
* +------------------------+-----------+----------+----------+
763+
*/
738764
RVOP(remu, {
739765
const uint32_t dividend = rv->X[ir->rs1];
740766
const uint32_t divisor = rv->X[ir->rs2];

0 commit comments

Comments
 (0)