diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-09-19 22:11:11 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-09-19 22:11:11 -0700 |
commit | a085820e215614e35accbf4651407f433adf1fda (patch) | |
tree | 659bc746c07b1f5b3c00db46c68aadc4e3e5d20a /311parse-decimal-int.subx | |
parent | 86a124769dcc2e94a452595cc80cc1debb63383c (diff) | |
download | mu-a085820e215614e35accbf4651407f433adf1fda.tar.gz |
6809
Diffstat (limited to '311parse-decimal-int.subx')
-rw-r--r-- | 311parse-decimal-int.subx | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/311parse-decimal-int.subx b/311parse-decimal-int.subx deleted file mode 100644 index fe08b932..00000000 --- a/311parse-decimal-int.subx +++ /dev/null @@ -1,285 +0,0 @@ -# Helpers for parsing decimal ints. - -parse-decimal-int-from-slice: # in: (addr slice) -> out/eax: int - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 51/push-ecx - # ecx = in - 8b/-> *(ebp+8) 1/r32/ecx - # - (parse-decimal-int-helper *ecx *(ecx+4)) # => eax -$parse-decimal-int-from-slice:end: - # . restore registers - 59/pop-to-ecx - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -parse-decimal-int: # in: (addr array byte) -> result/eax: int - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 51/push-ecx - 52/push-edx - # eax = in - 8b/-> *(ebp+8) 0/r32/eax - # var start/ecx: (addr byte) = &in->data - 8d/copy-address *(eax+4) 1/r32/ecx - # var end/edx: (addr byte) = &in->data[in->size] - 8b/-> *eax 2/r32/edx - 8d/copy-address *(eax+edx+4) 2/r32/edx - # - (parse-decimal-int-helper %ecx %edx) # => eax -$parse-decimal-int:end: - # . restore registers - 5a/pop-to-edx - 59/pop-to-ecx - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -parse-decimal-int-from-stream: # in: (addr stream byte) -> result/eax: int - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 51/push-ecx - 52/push-edx - # eax = in - 8b/-> *(ebp+8) 0/r32/eax - # var start/ecx: (addr byte) = &in->data[in->read] - 8b/-> *(eax+4) 1/r32/ecx - 8d/copy-address *(eax+ecx+0xc) 1/r32/ecx - # var end/edx: (addr byte) = &in->data[in->write] - 8b/-> *eax 2/r32/edx - 8d/copy-address *(eax+edx+0xc) 2/r32/edx - # - (parse-decimal-int-helper %ecx %edx) # => eax -$parse-decimal-int-from-stream:end: - # . restore registers - 5a/pop-to-edx - 59/pop-to-ecx - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -parse-decimal-int-helper: # start: (addr byte), end: (addr byte) -> result/eax: int - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 51/push-ecx - 52/push-edx - 53/push-ebx - 56/push-esi - 57/push-edi - # var curr/esi: (addr byte) = start - 8b/-> *(ebp+8) 6/r32/esi - # edi = end - 8b/-> *(ebp+0xc) 7/r32/edi - # var negate?/edx: boolean = false - ba/copy-to-edx 0/imm32/false - # if (*curr == '-') ++curr, negate = true - { -$parse-decimal-int-helper:negative: - b8/copy-to-eax 0/imm32 - 8a/copy-byte *esi 0/r32/AL - 3d/compare-eax-and 0x2d/imm32/- - 75/jump-if-!= break/disp8 - # . ++curr - 46/increment-esi - # . negate = true - ba/copy-to-edx 1/imm32/true - } - # spill negate? - 52/push-edx - # var result/eax: int = 0 - b8/copy-to-eax 0/imm32 - # var digit/ecx: int = 0 - b9/copy-to-ecx 0/imm32 - # const TEN/ebx: int = 10 - bb/copy-to-ebx 0xa/imm32 - { -$parse-decimal-int-helper:loop: - # if (curr >= in->end) break - 39/compare %esi 7/r32/edi - 73/jump-if-addr>= break/disp8 - # digit = from-decimal-char(*curr) - 8a/copy-byte *esi 1/r32/CL - 81 5/subop/subtract %ecx 0x30/imm32/zero - # TODO: error checking - # result = result * 10 + digit - ba/copy-to-edx 0/imm32 - f7 4/subop/multiply-into-edx-eax %ebx - # TODO: check edx for overflow - 01/add %eax 1/r32/ecx - # ++curr - 46/increment-esi - # - eb/jump loop/disp8 - } -$parse-decimal-int-helper:negate: - # if (negate?) result = -result - 5a/pop-to-edx - { - 81 7/subop/compare %edx 0/imm32/false - 74/jump-if-= break/disp8 - f7 3/subop/negate %eax - } -$parse-decimal-int-helper:end: - # . restore registers - 5f/pop-to-edi - 5e/pop-to-esi - 5b/pop-to-ebx - 5a/pop-to-edx - 59/pop-to-ecx - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-parse-decimal-int-from-slice-single-digit: - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - # (eax..ecx) = "3" - b8/copy-to-eax "3"/imm32 - 8b/-> *eax 1/r32/ecx - 8d/copy-address *(eax+ecx+4) 1/r32/ecx - 05/add-to-eax 4/imm32 - # var slice/ecx: slice = {eax, ecx} - 51/push-ecx - 50/push-eax - 89/<- %ecx 4/r32/esp - # - (parse-decimal-int-from-slice %ecx) # => eax - (check-ints-equal %eax 3 "F - test-parse-decimal-int-from-slice-single-digit") -$test-parse-decimal-int-helper-single-digit:end: - # . restore registers - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-parse-decimal-int-from-slice-multi-digit: - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - # (eax..ecx) = "34" - b8/copy-to-eax "34"/imm32 - 8b/-> *eax 1/r32/ecx - 8d/copy-address *(eax+ecx+4) 1/r32/ecx - 05/add-to-eax 4/imm32 - # var slice/ecx: slice = {eax, ecx} - 51/push-ecx - 50/push-eax - 89/<- %ecx 4/r32/esp - # - (parse-decimal-int-from-slice %ecx) # => eax - (check-ints-equal %eax 0x22 "F - test-parse-decimal-int-from-slice-multi-digit") # 34 in hex -$test-parse-decimal-int-helper-multi-digit:end: - # . restore registers - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-parse-decimal-int-from-slice-zero: - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - # (eax..ecx) = "00" - b8/copy-to-eax "00"/imm32 - 8b/-> *eax 1/r32/ecx - 8d/copy-address *(eax+ecx+4) 1/r32/ecx - 05/add-to-eax 4/imm32 - # var slice/ecx: slice = {eax, ecx} - 51/push-ecx - 50/push-eax - 89/<- %ecx 4/r32/esp - # - (parse-decimal-int-from-slice %ecx) # => eax - (check-ints-equal %eax 0 "F - test-parse-decimal-int-from-slice-zero") -$test-parse-decimal-int-helper-zero:end: - # . restore registers - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-parse-decimal-int-from-slice-negative: - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - # (eax..ecx) = "-3" - b8/copy-to-eax "-3"/imm32 - 8b/-> *eax 1/r32/ecx - 8d/copy-address *(eax+ecx+4) 1/r32/ecx - 05/add-to-eax 4/imm32 - # var slice/ecx: slice = {eax, ecx} - 51/push-ecx - 50/push-eax - 89/<- %ecx 4/r32/esp - # - (parse-decimal-int-from-slice %ecx) # => eax - (check-ints-equal %eax -3 "F - test-parse-decimal-int-from-slice-negative") -$test-parse-decimal-int-helper-negative:end: - # . restore registers - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -test-parse-decimal-int-from-slice-multi-digit-negative: - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - # (eax..ecx) = "-32" - b8/copy-to-eax "-32"/imm32 - 8b/-> *eax 1/r32/ecx - 8d/copy-address *(eax+ecx+4) 1/r32/ecx - 05/add-to-eax 4/imm32 - # var slice/ecx: slice = {eax, ecx} - 51/push-ecx - 50/push-eax - 89/<- %ecx 4/r32/esp - # - (parse-decimal-int-from-slice %ecx) # => eax - (check-ints-equal %eax -0x20 "F - test-parse-decimal-int-from-slice-multi-digit-negative") # -32 in hex -$test-parse-decimal-int-helper-multi-digit-negative:end: - # . restore registers - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return |