diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-02-12 23:18:33 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-02-12 23:49:00 -0800 |
commit | 378ffca74c7a1428431da5d4572b70731d41074d (patch) | |
tree | bea0d3e0571d5350ab928e66de656b2ff2a49f4b /baremetal/shell/value-stack.mu | |
parent | 97a77434c5950d7a491f77ec2543fcad3157c460 (diff) | |
download | mu-378ffca74c7a1428431da5d4572b70731d41074d.tar.gz |
7730 - baremetal/shell: boolean values
In the process I found a bug in the Mu compiler. Limitations of just asserting the emitted code but not running it.
Diffstat (limited to 'baremetal/shell/value-stack.mu')
-rw-r--r-- | baremetal/shell/value-stack.mu | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/baremetal/shell/value-stack.mu b/baremetal/shell/value-stack.mu index 1ea4180f..ee1ae3f9 100644 --- a/baremetal/shell/value-stack.mu +++ b/baremetal/shell/value-stack.mu @@ -67,6 +67,22 @@ fn push-array-to-value-stack _self: (addr value-stack), val: (handle array value increment *top-addr } +fn push-boolean-to-value-stack _self: (addr value-stack), _val: boolean { + var self/esi: (addr value-stack) <- copy _self + var top-addr/ecx: (addr int) <- get self, top + var data-ah/edx: (addr handle array value) <- get self, data + var data/eax: (addr array value) <- lookup *data-ah + var top/edx: int <- copy *top-addr + var dest-offset/edx: (offset value) <- compute-offset data, top + var dest-addr/edx: (addr value) <- index data, dest-offset + var dest-addr2/eax: (addr boolean) <- get dest-addr, boolean-data + var val/esi: boolean <- copy _val + copy-to *dest-addr2, val + increment *top-addr + var type-addr/eax: (addr int) <- get dest-addr, type + copy-to *type-addr, 3/boolean +} + fn push-value-stack _self: (addr value-stack), val: (addr value) { var self/esi: (addr value-stack) <- copy _self var top-addr/ecx: (addr int) <- get self, top @@ -85,9 +101,7 @@ fn pop-number-from-value-stack _self: (addr value-stack) -> _/xmm0: float { { compare *top-addr, 0 break-if-> - var minus-one/eax: int <- copy -1 - var minus-one-f/xmm0: float <- convert minus-one - return minus-one-f + abort "pop number: empty stack" } decrement *top-addr var data-ah/edx: (addr handle array value) <- get self, data @@ -99,6 +113,24 @@ fn pop-number-from-value-stack _self: (addr value-stack) -> _/xmm0: float { return *result-addr2 } +fn pop-boolean-from-value-stack _self: (addr value-stack) -> _/eax: boolean { + var self/esi: (addr value-stack) <- copy _self + var top-addr/ecx: (addr int) <- get self, top + { + compare *top-addr, 0 + break-if-> + abort "pop boolean: empty stack" + } + decrement *top-addr + var data-ah/edx: (addr handle array value) <- get self, data + var data/eax: (addr array value) <- lookup *data-ah + var top/edx: int <- copy *top-addr + var dest-offset/edx: (offset value) <- compute-offset data, top + var result-addr/eax: (addr value) <- index data, dest-offset + var result-addr2/eax: (addr boolean) <- get result-addr, boolean-data + return *result-addr2 +} + fn value-stack-empty? _self: (addr value-stack) -> _/eax: boolean { var self/esi: (addr value-stack) <- copy _self var top/eax: (addr int) <- get self, top @@ -139,3 +171,14 @@ fn save-lines in-h: (handle array (handle array byte)), _out-ah: (addr handle ar loop } } + +fn test-boolean { + var stack-storage: value-stack + var stack/esi: (addr value-stack) <- address stack-storage + push-boolean-to-value-stack stack, 0/false + var result/eax: boolean <- pop-boolean-from-value-stack stack + check-not result, "F - test-boolean/false" + push-boolean-to-value-stack stack, 1/true + var result/eax: boolean <- pop-boolean-from-value-stack stack + check result, "F - test-boolean/true" +} |