diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-04-03 12:35:53 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-04-03 12:35:53 -0700 |
commit | bfcc0f858aa324739ad645e2056d73a47ab66f82 (patch) | |
tree | 24a22e364b2c1d535013c604b7a9620a31606e71 /054string-equal.subx | |
parent | f730f2f2c7934f52091a848b71f9031ea99e2377 (diff) | |
download | mu-bfcc0f858aa324739ad645e2056d73a47ab66f82.tar.gz |
6182 - start of support for safe handles
So far it's unclear how to do this in a series of small commits. Still nibbling around the edges. In this commit we standardize some terminology: The length of an array or stream is denominated in the high-level elements. The _size_ is denominated in bytes. The thing we encode into the type is always the size, not the length. There's still an open question of what to do about the Mu `length` operator. I'd like to modify it to provide the length. Currently it provides the size. If I can't fix that I'll rename it.
Diffstat (limited to '054string-equal.subx')
-rw-r--r-- | 054string-equal.subx | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/054string-equal.subx b/054string-equal.subx index 29c06549..24d001b0 100644 --- a/054string-equal.subx +++ b/054string-equal.subx @@ -1,4 +1,4 @@ -# Comparing 'regular' length-prefixed strings. +# Comparing 'regular' size-prefixed strings. == code # instruction effective address register displacement immediate @@ -15,7 +15,7 @@ Entry: # run all tests string-equal?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boolean # pseudocode: - # if (s->length != benchmark->length) return false + # if (s->size != benchmark->size) return false # return string-starts-with?(s, benchmark) # # . prologue @@ -29,10 +29,10 @@ string-equal?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boo 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # edi = benchmark 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi - # ecx = s->length + # ecx = s->size 8b/copy 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # copy *esi to ecx -$string-equal?:lengths: - # if (ecx != benchmark->length) return false +$string-equal?:sizes: + # if (ecx != benchmark->size) return false 39/compare 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # compare *edi and ecx b8/copy-to-eax 0/imm32/false 75/jump-if-!= $string-equal?:end/disp8 @@ -57,10 +57,10 @@ $string-equal?:end: string-starts-with?: # s: (addr array byte), benchmark: (addr array byte) -> eax: boolean # pseudocode: - # if (s->length < benchmark->length) return false + # if (s->size < benchmark->size) return false # currs = s->data # currb = benchmark->data - # maxb = &benchmark->data[benchmark->length] + # maxb = &benchmark->data[benchmark->size] # while currb < maxb # c1 = *currs # c2 = *currb @@ -87,17 +87,17 @@ string-starts-with?: # s: (addr array byte), benchmark: (addr array byte) -> ea 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 6/r32/esi 8/disp8 . # copy *(ebp+8) to esi # edi = benchmark 8b/copy 1/mod/*+disp8 5/rm32/ebp . . . 7/r32/edi 0xc/disp8 . # copy *(ebp+12) to edi - # var blen/ecx: int = benchmark->length + # var bsize/ecx: int = benchmark->size 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx -$string-starts-with?:lengths: - # if (s->length < blen) return false +$string-starts-with?:sizes: + # if (s->size < bsize) return false 39/compare 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # compare *esi with ecx 7c/jump-if-< $string-starts-with?:false/disp8 # var currs/esi: (addr byte) = s->data 81 0/subop/add 3/mod/direct 6/rm32/esi . . . . . 4/imm32 # add to esi # var currb/edi: (addr byte) = benchmark->data 81 0/subop/add 3/mod/direct 7/rm32/edi . . . . . 4/imm32 # add to edi - # var maxb/ecx: (addr byte) = &benchmark->data[benchmark->length] + # var maxb/ecx: (addr byte) = &benchmark->data[benchmark->size] 01/add 3/mod/direct 1/rm32/ecx . . . 7/r32/edi . . # add edi to ecx # var c1/eax: byte = 0 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax @@ -157,7 +157,7 @@ test-compare-empty-with-empty-string: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp c3/return -test-compare-empty-with-non-empty-string: # also checks length-mismatch code path +test-compare-empty-with-non-empty-string: # also checks size-mismatch code path # eax = string-equal?("", "Abc") # . . push args 68/push "Abc"/imm32 @@ -197,7 +197,7 @@ test-compare-equal-strings: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp c3/return -test-compare-inequal-strings-equal-lengths: +test-compare-inequal-strings-equal-sizes: # eax = string-equal?("Abc", "Adc") # . . push args 68/push "Adc"/imm32 @@ -208,7 +208,7 @@ test-compare-inequal-strings-equal-lengths: 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # check-ints-equal(eax, 0, msg) # . . push args - 68/push "F - test-compare-inequal-strings-equal-lengths"/imm32 + 68/push "F - test-compare-inequal-strings-equal-sizes"/imm32 68/push 0/imm32/false 50/push-eax # . . call |