unsigned comparison for addresses in more places

This commit is contained in:
Kartik Agaram 2019-06-30 22:28:19 -07:00
parent 954133e200
commit 51c311d5f9
20 changed files with 32 additions and 33 deletions

View File

@ -63,7 +63,7 @@ $string-equal?:lengths:
$string-equal?:loop:
# if (currs >= maxs) return true
39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI with ECX
7d/jump-if-greater-or-equal $string-equal?:true/disp8
73/jump-if-greater-or-equal-unsigned $string-equal?:true/disp8
# c1 = *currs
8a/copy-byte 0/mod/indirect 6/rm32/ESI . . . 0/r32/AL . . # copy byte at *ESI to AL
# c2 = *currb

View File

@ -37,7 +37,7 @@ clear-stream: # f : (address stream) -> <void>
$clear-stream:loop:
# if (EAX >= ECX) break
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $clear-stream:end/disp8
73/jump-if-greater-or-equal-unsigned $clear-stream:end/disp8
# *EAX = 0
c6 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm8 # copy byte to *EAX
# ++EAX

View File

@ -263,14 +263,13 @@ check-trace-scans-to: # line : (address string), msg : (address string)
89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
# . save registers
50/push-EAX
# EAX = trace-scan(*Trace-stream, line)
# EAX = trace-scan(line)
# . . push args
ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8)
ff 6/subop/push 0/mod/indirect 5/rm32/.disp32 . . . Trace-stream/disp32 # push *Trace-stream
# . . call
e8/call trace-scan/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP
# check-ints-equal(EAX, 1, msg)
# . . push args
ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 0xc/disp8 . # push *(EBP+12)
@ -571,12 +570,12 @@ next-line-matches?: # t : (address stream), line : (address string) -> result/E
$next-line-matches?:loop:
# if (currl/ESI >= maxl/ECX) break
39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI and ECX
7d/jump-if-greater-or-equal $next-line-matches?:break/disp8
73/jump-if-greater-or-equal-unsigned $next-line-matches?:break/disp8
# if (currt/EDI >= maxt/EDX) return false
# . EAX = false
b8/copy-to-EAX 0/imm32/false
39/compare 3/mod/direct 7/rm32/EDI . . . 2/r32/EDX . . # compare EDI and EDX
7d/jump-if-greater-or-equal $next-line-matches?:end/disp8
73/jump-if-greater-or-equal-unsigned $next-line-matches?:end/disp8
# if (*currt/EDI != *currl/ESI) return false
31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX
31/xor 3/mod/direct 3/rm32/EAX . . . 3/r32/EAX . . # clear EBX
@ -738,7 +737,7 @@ skip-next-line: # t : (address stream)
$skip-next-line:loop:
# if (curr/ECX >= max/EBX) break
39/compare 3/mod/direct 1/rm32/ECX . . . 3/r32/EBX . . # compare ECX and EBX
7d/jump-if-greater-or-equal $skip-next-line:end/disp8
73/jump-if-greater-or-equal-unsigned $skip-next-line:end/disp8
# ++i/EDX
42/increment-EDX
# if (*curr/ECX == '\n') break
@ -831,7 +830,7 @@ clear-trace-stream:
$clear-trace-stream:loop:
# if (EAX >= ECX) break
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $clear-trace-stream:end/disp8
73/jump-if-greater-or-equal-unsigned $clear-trace-stream:end/disp8
# *EAX = 0
c7 0/subop/copy 0/mod/direct 0/rm32/EAX . . . . . 0/imm32 # copy to *EAX
# EAX += 4
@ -904,10 +903,10 @@ _append-4: # out : address, outend : address, in : address, inend : address ->
$_append-4:loop:
# if (in >= inend) break
39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI with ECX
7d/jump-if-greater-or-equal $_append-4:end/disp8
73/jump-if-greater-or-equal-unsigned $_append-4:end/disp8
# if (out >= outend) abort # just to catch test failures fast
39/compare 3/mod/direct 7/rm32/EDI . . . 2/r32/EDX . . # compare EDI with EDX
7d/jump-if-greater-or-equal $_append-4:abort/disp8
73/jump-if-greater-or-equal-unsigned $_append-4:abort/disp8
# *out = *in
8a/copy-byte 0/mod/indirect 6/rm32/ESI . . . 3/r32/BL . . # copy byte at *ESI to BL
88/copy-byte 0/mod/indirect 7/rm32/EDI . . . 3/r32/BL . . # copy byte at BL to *EDI

View File

@ -19,7 +19,7 @@ stream-data-equal?: # f : (address stream), s : (address string) -> EAX : boole
8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 6/r32/ESI 8/disp8 . # copy *(EBP+8) to ESI
# EAX = f->write
8b/copy 0/mod/indirect 6/rm32/ESI . . . 0/r32/EAX . . # copy *ESI to EAX
# max/EDX = f->data + f->write
# maxf/EDX = f->data + f->write
8d/copy-address 1/mod/*+disp8 4/rm32/sib 6/base/ESI 0/index/EAX . 2/r32/EDX 0xc/disp8 . # copy ESI+EAX+12 to EDX
# currf/ESI = f->data
81 0/subop/add 3/mod/direct 6/rm32/ESI . . . . . 0xc/imm32 # add to ESI
@ -34,9 +34,9 @@ stream-data-equal?: # f : (address stream), s : (address string) -> EAX : boole
31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX
31/xor 3/mod/direct 1/rm32/ECX . . . 1/r32/ECX . . # clear ECX
$stream-data-equal?:loop:
# if (curr >= max) return true
# if (currf >= maxf) return true
39/compare 3/mod/direct 6/rm32/ESI . . . 2/r32/EDX . . # compare ESI with EDX
7d/jump-if-greater-or-equal $stream-data-equal?:true/disp8
73/jump-if-greater-or-equal-unsigned $stream-data-equal?:true/disp8
# AL = *currs
8a/copy-byte 0/mod/indirect 6/rm32/ESI . . . 0/r32/AL . . # copy byte at *ESI to AL
# CL = *curr

View File

@ -165,10 +165,10 @@ _buffer-4: # out : address, outend : address, in : address, inend : address ->
$_buffer-4:loop:
# if (in >= inend) break
39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI with ECX
7d/jump-if-greater-or-equal $_buffer-4:end/disp8
73/jump-if-greater-or-equal-unsigned $_buffer-4:end/disp8
# if (out >= outend) break # for now silently ignore filled up buffer
39/compare 3/mod/direct 7/rm32/EDI . . . 2/r32/EDX . . # compare EDI with EDX
7d/jump-if-greater-or-equal $_buffer-4:end/disp8
73/jump-if-greater-or-equal-unsigned $_buffer-4:end/disp8
# *out = *in
8a/copy-byte 0/mod/indirect 6/rm32/ESI . . . 3/r32/BL . . # copy byte at *ESI to BL
88/copy-byte 0/mod/indirect 7/rm32/EDI . . . 3/r32/BL . . # copy byte at BL to *EDI

View File

@ -23,7 +23,7 @@ is-hex-int?: # in : (address slice) -> EAX : boolean
# if s is empty return false
b8/copy-to-EAX 0/imm32/false
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $is-hex-int?:end/disp8
73/jump-if-greater-or-equal-unsigned $is-hex-int?:end/disp8
# skip past leading '-'
# . if (*curr == '-') ++curr
31/xor 3/mod/direct 3/rm32/EBX . . . 3/r32/EBX . . # clear EBX
@ -44,7 +44,7 @@ $is-hex-int?:initial-0:
$is-hex-int?:initial-0x:
# . if (curr >= in->end) return true
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $is-hex-int?:true/disp8
73/jump-if-greater-or-equal-unsigned $is-hex-int?:true/disp8
# . if (*curr != 'x') jump to loop # the previous '0' is still valid so doesn't need to be checked again
31/xor 3/mod/direct 3/rm32/EBX . . . 3/r32/EBX . . # clear EBX
8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 3/r32/BL . . # copy byte at *ECX to BL
@ -55,7 +55,7 @@ $is-hex-int?:initial-0x:
$is-hex-int?:loop:
# if (curr >= in->end) return true
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $is-hex-int?:true/disp8
73/jump-if-greater-or-equal-unsigned $is-hex-int?:true/disp8
# EAX = is-hex-digit?(*curr)
# . . push args
8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL
@ -356,7 +356,7 @@ $parse-hex-int:initial-0:
$parse-hex-int:initial-0x:
# . if (curr >= in->end) return result
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $parse-hex-int:end/disp8
73/jump-if-greater-or-equal-unsigned $parse-hex-int:end/disp8
# . if (*curr != 'x') jump to loop # the previous '0' is still valid so doesn't need to be checked again
31/xor 3/mod/direct 0/rm32/EAX . . . 0/r32/EAX . . # clear EAX
8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL
@ -367,7 +367,7 @@ $parse-hex-int:initial-0x:
$parse-hex-int:loop:
# if (curr >= in->end) break
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $parse-hex-int:negate/disp8
73/jump-if-greater-or-equal-unsigned $parse-hex-int:negate/disp8
# EAX = from-hex-char(*curr)
# . . copy arg to EAX
8a/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy byte at *ECX to AL

View File

@ -52,7 +52,7 @@ write-buffered: # f : (address buffered-file), msg : (address array byte) -> <v
$write-buffered:loop:
# if (in >= inend) break
39/compare 3/mod/direct 6/rm32/ESI . . . 1/r32/ECX . . # compare ESI with ECX
7d/jump-if-greater-or-equal $write-buffered:loop-end/disp8
73/jump-if-greater-or-equal-unsigned $write-buffered:loop-end/disp8
# if (f->write >= f->length) flush and clear f's stream
39/compare 3/mod/direct 3/rm32/EBX . . . 2/r32/EDX . . # compare EBX with EDX
7c/jump-if-lesser $write-buffered:to-stream/disp8

View File

@ -147,7 +147,7 @@ $slice-equal?:nonnull-string:
$slice-equal?:loop:
# if (currs >= maxs) return true
39/compare 3/mod/direct 2/rm32/EDX . . . 6/r32/ESI . . # compare EDX with ESI
7d/jump-if-greater-or-equal $slice-equal?:true/disp8
73/jump-if-greater-or-equal-unsigned $slice-equal?:true/disp8
# AL = *currp
8a/copy-byte 0/mod/indirect 3/rm32/EBX . . . 0/r32/AL . . # copy byte at *EBX to AL
# CL = *currs
@ -723,7 +723,7 @@ write-slice-buffered: # out : (address buffered-file), s : (address slice)
$write-slice-buffered:loop:
# if (curr >= max) break
39/compare 3/mod/direct 1/rm32/ECX . . . 6/r32/ESI . . # compare ECX with ESI
7d/jump-if-greater-or-equal $write-slice-buffered:loop-end/disp8
73/jump-if-greater-or-equal-unsigned $write-slice-buffered:loop-end/disp8
# if (out->write >= out->length) flush and clear out's stream
39/compare 3/mod/direct 3/rm32/EBX . . . 2/r32/EDX . . # compare EBX with EDX
7c/jump-if-lesser $write-slice-buffered:to-stream/disp8

View File

@ -693,7 +693,7 @@ skip-chars-matching-in-slice: # curr : (address byte), end : (address byte), de
$skip-chars-matching-in-slice:loop:
# if (curr >= end) break
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $skip-chars-matching-in-slice:end/disp8
73/jump-if-greater-or-equal-unsigned $skip-chars-matching-in-slice:end/disp8
# if (*curr != delimiter) break
8a/copy-byte 0/mod/indirect 0/rm32/EAX . . . 3/r32/BL . . # copy byte at *EAX to BL
39/compare 3/mod/direct 3/rm32/EBX . . . 2/r32/EDX . . # compare EBX and EDX
@ -789,7 +789,7 @@ skip-chars-not-matching-in-slice: # curr : (address byte), end : (address byte)
$skip-chars-not-matching-in-slice:loop:
# if (curr >= end) break
39/compare 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # compare EAX with ECX
7d/jump-if-greater-or-equal $skip-chars-not-matching-in-slice:end/disp8
73/jump-if-greater-or-equal-unsigned $skip-chars-not-matching-in-slice:end/disp8
# if (*curr == delimiter) break
8a/copy-byte 0/mod/indirect 0/rm32/EAX . . . 3/r32/BL . . # copy byte at *EAX to BL
39/compare 3/mod/direct 3/rm32/EBX . . . 2/r32/EDX . . # compare EBX and EDX

View File

@ -89,7 +89,7 @@ $print-int32-decimal:write-loop:
74/jump-if-equal $print-int32-decimal:write-break/disp8
# if (curr >= max) abort
39/compare 3/mod/direct 1/rm32/ECX . . . 3/r32/EBX . . # compare ECX with EBX
7d/jump-if-greater-or-equal $print-int32-decimal:abort/disp8
73/jump-if-greater-or-equal-unsigned $print-int32-decimal:abort/disp8
$print-int32-decimal:write-char:
# *curr = AL
88/copy-byte 0/mod/indirect 1/rm32/ECX . . . 0/r32/AL . . # copy AL to byte at *ECX

View File

@ -294,7 +294,7 @@ parse-array-of-ints: # ad : (address allocation-descriptor), s : (address strin
$parse-array-of-ints:loop1:
# if (curr >= end) break
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $parse-array-of-ints:break1/disp8
73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:break1/disp8
# curr = skip-chars-matching-in-slice(curr, end, ' ')
# . EAX = skip-chars-matching-in-slice(curr, end, ' ')
# . . push args
@ -309,7 +309,7 @@ $parse-array-of-ints:loop1:
89/copy 3/mod/direct 1/rm32/ECX . . . 0/r32/EAX . . # copy EAX to ECX
# if (curr >= end) break
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $parse-array-of-ints:break1/disp8
73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:break1/disp8
# curr = skip-chars-not-matching-in-slice(curr, end, ' ')
# . EAX = skip-chars-not-matching-in-slice(curr, end, ' ')
# . . push args
@ -355,7 +355,7 @@ $parse-array-of-ints:pass2:
$parse-array-of-ints:loop2:
# if (slice->curr >= end) break
39/compare 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # compare *ECX with EDX
7d/jump-if-greater-or-equal $parse-array-of-ints:end/disp8
73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:end/disp8
# slice->curr = skip-chars-matching-in-slice(slice->curr, end, ' ')
# . EAX = skip-chars-matching-in-slice(slice->curr, end, ' ')
# . . push args
@ -370,7 +370,7 @@ $parse-array-of-ints:loop2:
89/copy 0/mod/indirect 1/rm32/ECX . . . 0/r32/EAX . . # copy EAX to *ECX
# if (slice->curr >= end) break
39/compare 0/mod/indirect 1/rm32/ECX . . . 2/r32/EDX . . # compare *ECX with EDX
7d/jump-if-greater-or-equal $parse-array-of-ints:end/disp8
73/jump-if-greater-or-equal-unsigned $parse-array-of-ints:end/disp8
# slice->end = skip-chars-not-matching-in-slice(slice->curr, end, ' ')
# . EAX = skip-chars-not-matching-in-slice(curr, end, ' ')
# . . push args

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -71,7 +71,7 @@ $get-or-insert:not-found:
# if (table->write >= table->length) abort
8b/copy 0/mod/indirect 6/rm32/ESI . . . 1/r32/ECX . . # copy *ESI to ECX
3b/compare 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 8/disp8 . # compare ECX with *(ESI+8)
7d/jump-if-greater-or-equal $get-or-insert:abort/disp8
73/jump-if-greater-or-equal-unsigned $get-or-insert:abort/disp8
# *max = key
# . EAX = key
8b/copy 1/mod/*+disp8 5/rm32/EBP . . . 0/r32/EAX 0xc/disp8 . # copy *(EBP+12) to EAX
@ -290,7 +290,7 @@ get-or-insert-slice: # table : (address stream {string, _}), key : (address sli
$get-or-insert-slice:search-loop:
# if (curr >= max) break
39/compare 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # compare ECX with EDX
7d/jump-if-greater-or-equal $get-or-insert-slice:not-found/disp8
73/jump-if-greater-or-equal-unsigned $get-or-insert-slice:not-found/disp8
# if (slice-equal?(key, *curr)) return curr+4
# . EAX = slice-equal?(key, *curr)
# . . push args

Binary file not shown.