Optimize digit parse loops

This commit is contained in:
PleegWat
2026-09-04 23:07:21 +02:00
parent f18199c5d0
commit 3968179026
2 changed files with 21 additions and 35 deletions
+18 -32
View File
@@ -66,12 +66,10 @@ add r2, r2, 1
atoi_dec_loop:
load_8 r3, [r2]
atoi_dec_positive:
cmp r3, 0x30 ; '0'
jl atoi_done
cmp r3, 0x39 ; '9'
jg atoi_done
add r2, r2, 1
sub r3, r3, 0x30 ; '0'
cmp r3, 9
ja atoi_done
add r2, r2, 1
lsl flags, r1, 2 ; Use flags to help multiply by 10
add r1, r1, flags
lsl r1, r1, 1
@@ -105,12 +103,10 @@ jne atoi_bin_loop
add r2, r2, 2
atoi_bin_loop:
load_8 r3, [r2]
cmp r3, 0x30 ; '0'
jl atoi_done
cmp r3, 0x31 ; '1'
jg atoi_done
add r2, r2, 1
sub r3, r3, 0x30 ; '0'
cmp r3, 1
ja atoi_done
add r2, r2, 1
lsl r1, r1, 1
add r1, r1, r3
jmp atoi_bin_loop
@@ -142,12 +138,10 @@ jne atoi_oct_loop
add r2, r2, 2
atoi_oct_loop:
load_8 r3, [r2]
cmp r3, 0x30 ; '0'
jl atoi_done
cmp r3, 0x37 ; '7'
jg atoi_done
add r2, r2, 1
sub r3, r3, 0x30 ; '0'
cmp r3, 7
ja atoi_done
add r2, r2, 1
lsl r1, r1, 3
add r1, r1, r3
jmp atoi_oct_loop
@@ -175,28 +169,20 @@ atoi_hex_positive:
load_16 r3, [r2] ; check for prefix
or r3, r3, 0x20 ; 2nd char to lower case
cmp r3, 0x3078 ; "0x"
jne atoi_oct_loop
jne atoi_hex_loop
add r2, r2, 2
atoi_hex_loop:
load_8 r3, [r2]
cmp r3, 0x30 ; '0'
jl atoi_done
cmp r3, 0x39 ; '9'
jg atoi_hex_letter
add r2, r2, 1
sub r3, r3, 0x30 ; '0'
lsl r1, r1, 4
add r1, r1, r3
jmp atoi_hex_loop
atoi_hex_letter:
or r3, r3, 0x20 ; to lower case
cmp r3, 0x61 ; 'a'
jl atoi_done
cmp r3, 0x66 ; 'f'
jg atoi_done
cmp r3, 10
jb atoi_hex_add
sub r3, r3, 0x11 ; 'A' - '0'
and r3, r3, 0xdf ; to lower case
cmp r3, 5 ; 0-5: 6 letters
ja atoi_done
add r3, r3, 10 ; Adjust for digits below
atoi_hex_add:
add r2, r2, 1
sub r3, r3, 0x57 ; 'a' - 10
lsl r1, r1, 4
add r1, r1, r3
jmp atoi_hex_loop
+3 -3
View File
@@ -42,11 +42,11 @@ tests:
@0x1000 U32 0 U8 0 "\0"
@0x1010 U32 0 U8 1 "0\0"
@0x1020 U32 1 U8 1 "1\0"
@0x1030 U32 2 U8 1 "2\0"
@0x1030 U32 2 U8 1 "2:\0"
@0x1040 U32 42 U8 2 "42\0"
@0x1050 U32 67 U8 2 "67lol\0"
@0x1060 U32 0x69a U8 5 "0x69a\0"
@0x1070 U32 0x4B4 U8 5 "0x4B4\0"
@0x1060 U32 0x69a U8 5 "0x69a@\0"
@0x1070 U32 0x4B4 U8 5 "0x4B4g\0"
@0x1080 U32 0o23 U8 4 "0o239\0"
@0x1090 U32 0b1011 U8 6 "0b1011\0"
@0x10a0 U32 0b10001 U8 7 "0b100012\0"