diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-09-16 18:33:57 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-09-16 18:34:54 -0700 |
commit | 797c93e054d210a6d595f0b57fd3d9adb9669d8c (patch) | |
tree | 1cd20170a27a7df7711eb1884d931628878a48ed /406try-divide.mu | |
parent | 9b873e3bcddf34d5b6d60e66838d71dd46de51f4 (diff) | |
download | mu-797c93e054d210a6d595f0b57fd3d9adb9669d8c.tar.gz |
6793
Diffstat (limited to '406try-divide.mu')
-rw-r--r-- | 406try-divide.mu | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/406try-divide.mu b/406try-divide.mu new file mode 100644 index 00000000..9c7a0229 --- /dev/null +++ b/406try-divide.mu @@ -0,0 +1,83 @@ +# slow, iterative divide instruction +# preconditions: _nr >= 0, _dr > 0 +fn try-divide _nr: int, _dr: int -> result/eax: int { + # x = next power-of-2 multiple of _dr after _nr + var x/ecx: int <- copy 1 + { +#? print-int32-hex 0, x +#? print-string 0, "\n" + var tmp/edx: int <- copy _dr + tmp <- multiply x + compare tmp, _nr + break-if-> + x <- shift-left 1 + loop + } +#? print-string 0, "--\n" + # min, max = x/2, x + var max/ecx: int <- copy x + var min/edx: int <- copy max + min <- shift-right 1 + # narrow down result between min and max + var i/eax: int <- copy min + { +#? print-int32-hex 0, i +#? print-string 0, "\n" + var foo/ebx: int <- copy _dr + foo <- multiply i + compare foo, _nr + break-if-> + i <- increment + loop + } + result <- copy i + result <- decrement +#? print-string 0, "=> " +#? print-int32-hex 0, result +#? print-string 0, "\n" +} + +fn test-try-divide-1 { + var result/eax: int <- try-divide 0, 2 + check-ints-equal result, 0, "F - try-divide-1\n" +} + +fn test-try-divide-2 { + var result/eax: int <- try-divide 1, 2 + check-ints-equal result, 0, "F - try-divide-2\n" +} + +fn test-try-divide-3 { + var result/eax: int <- try-divide 2, 2 + check-ints-equal result, 1, "F - try-divide-3\n" +} + +fn test-try-divide-4 { + var result/eax: int <- try-divide 4, 2 + check-ints-equal result, 2, "F - try-divide-4\n" +} + +fn test-try-divide-5 { + var result/eax: int <- try-divide 6, 2 + check-ints-equal result, 3, "F - try-divide-5\n" +} + +fn test-try-divide-6 { + var result/eax: int <- try-divide 9, 3 + check-ints-equal result, 3, "F - try-divide-6\n" +} + +fn test-try-divide-7 { + var result/eax: int <- try-divide 0xc, 4 + check-ints-equal result, 3, "F - try-divide-7\n" +} + +fn test-try-divide-8 { + var result/eax: int <- try-divide 0x1b, 3 # 27/3 + check-ints-equal result, 9, "F - try-divide-8\n" +} + +fn test-try-divide-9 { + var result/eax: int <- try-divide 0x1c, 3 # 28/3 + check-ints-equal result, 9, "F - try-divide-9\n" +} |