From a0e9d28f2a21cc42dff7ed2fce3e52cb04bc5170 Mon Sep 17 00:00:00 2001 From: Wojciech Kosior Date: Mon, 23 Nov 2020 11:22:19 +0100 Subject: add unsigned division remainder instruction --- design/stack_machine.v | 10 +++++++++- tclasm.tcl | 4 ++++ tests/stack_machine_rem/Makefile | 1 + tests/stack_machine_rem/instructions.s.tcl | 17 +++++++++++++++++ tests/stack_machine_rem/test.v | 1 + tests/stack_machine_rem/words_to_verify.mem | 6 ++++++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 120000 tests/stack_machine_rem/Makefile create mode 100644 tests/stack_machine_rem/instructions.s.tcl create mode 120000 tests/stack_machine_rem/test.v create mode 100644 tests/stack_machine_rem/words_to_verify.mem diff --git a/design/stack_machine.v b/design/stack_machine.v index f68421e..13e55c1 100644 --- a/design/stack_machine.v +++ b/design/stack_machine.v @@ -286,6 +286,10 @@ module stack_machine_new assign instr_uge = !set_im && !use_im && stack_shrinks_by_1 && instruction[11:0] == 12'd15; + wire instr_urem; + assign instr_urem = !set_im && !use_im && stack_shrinks_by_1 && + instruction[11:0] == 12'd16; + wire instr_ret; assign instr_ret = !set_im && !use_im && stack_shrinks_by_1 && instruction[11:0] == 12'b000010000000; @@ -326,7 +330,7 @@ module stack_machine_new reg arithmetic_uncompleted; wire arithmetic_completes; - assign arithmetic_completes = instr_udiv ? div_done : + assign arithmetic_completes = instr_udiv || instr_urem ? div_done : instr_halt ? 0 : 1; @@ -611,6 +615,9 @@ module stack_machine_new if (instr_udiv && arithmetic_uncompleted) r1 <= div_quotient; + if (instr_urem && arithmetic_uncompleted) + r1 <= div_remainder; + if (instr_mul && arithmetic_uncompleted) r1 <= r0 * r1; @@ -687,6 +694,7 @@ module stack_machine_new instr_ugt ? "ugt" : instr_ge ? "ge" : instr_uge ? "uge" : + instr_urem ? "urem" : instr_ret ? "ret" : instr_cond_jump ? "cond_jump" : instr_cond_jump_n ? "cond_jump_n" : diff --git a/tclasm.tcl b/tclasm.tcl index 90adda5..3fa53d2 100755 --- a/tclasm.tcl +++ b/tclasm.tcl @@ -376,6 +376,10 @@ proc uge {} { puts 0011000000001111 } +proc rem {} { + puts 0011000000010000 +} + proc ret {} { puts 0011000010000000 diff --git a/tests/stack_machine_rem/Makefile b/tests/stack_machine_rem/Makefile new file mode 120000 index 0000000..2c3c770 --- /dev/null +++ b/tests/stack_machine_rem/Makefile @@ -0,0 +1 @@ +../stack_machine_store/Makefile \ No newline at end of file diff --git a/tests/stack_machine_rem/instructions.s.tcl b/tests/stack_machine_rem/instructions.s.tcl new file mode 100644 index 0000000..1376d51 --- /dev/null +++ b/tests/stack_machine_rem/instructions.s.tcl @@ -0,0 +1,17 @@ +### store 2 values to memory, load them back, divide one by another and store +### the result (remainder); this is analogous to addition and substraction tests + +set_sp 0 + +const 777681520 +store h1EEE0 +const 3721 +store h1EEE4 + +load h1EEE0 +load h1EEE4 +# dividing 777681520 by 3721 should yield 208997 r 3683 +rem +store h1EEE8 + +halt diff --git a/tests/stack_machine_rem/test.v b/tests/stack_machine_rem/test.v new file mode 120000 index 0000000..f5b6a59 --- /dev/null +++ b/tests/stack_machine_rem/test.v @@ -0,0 +1 @@ +../stack_machine_store/test.v \ No newline at end of file diff --git a/tests/stack_machine_rem/words_to_verify.mem b/tests/stack_machine_rem/words_to_verify.mem new file mode 100644 index 0000000..c11e8b5 --- /dev/null +++ b/tests/stack_machine_rem/words_to_verify.mem @@ -0,0 +1,6 @@ +// address value + 1EEE0 2E5A7A70 // 777681520 in hex is 2E5A7A70 + + 1EEE4 E89 // 3721 in hex is E89 + + 1EEE8 E63 // 3683 in hex is E63 -- cgit v1.2.3