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: atoi_dec_loop:
load_8 r3, [r2] load_8 r3, [r2]
atoi_dec_positive: 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' 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 lsl flags, r1, 2 ; Use flags to help multiply by 10
add r1, r1, flags add r1, r1, flags
lsl r1, r1, 1 lsl r1, r1, 1
@@ -105,12 +103,10 @@ jne atoi_bin_loop
add r2, r2, 2 add r2, r2, 2
atoi_bin_loop: atoi_bin_loop:
load_8 r3, [r2] 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' sub r3, r3, 0x30 ; '0'
cmp r3, 1
ja atoi_done
add r2, r2, 1
lsl r1, r1, 1 lsl r1, r1, 1
add r1, r1, r3 add r1, r1, r3
jmp atoi_bin_loop jmp atoi_bin_loop
@@ -142,12 +138,10 @@ jne atoi_oct_loop
add r2, r2, 2 add r2, r2, 2
atoi_oct_loop: atoi_oct_loop:
load_8 r3, [r2] 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' sub r3, r3, 0x30 ; '0'
cmp r3, 7
ja atoi_done
add r2, r2, 1
lsl r1, r1, 3 lsl r1, r1, 3
add r1, r1, r3 add r1, r1, r3
jmp atoi_oct_loop jmp atoi_oct_loop
@@ -175,28 +169,20 @@ atoi_hex_positive:
load_16 r3, [r2] ; check for prefix load_16 r3, [r2] ; check for prefix
or r3, r3, 0x20 ; 2nd char to lower case or r3, r3, 0x20 ; 2nd char to lower case
cmp r3, 0x3078 ; "0x" cmp r3, 0x3078 ; "0x"
jne atoi_oct_loop jne atoi_hex_loop
add r2, r2, 2 add r2, r2, 2
atoi_hex_loop: atoi_hex_loop:
load_8 r3, [r2] 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' sub r3, r3, 0x30 ; '0'
lsl r1, r1, 4 cmp r3, 10
add r1, r1, r3 jb atoi_hex_add
jmp atoi_hex_loop sub r3, r3, 0x11 ; 'A' - '0'
and r3, r3, 0xdf ; to lower case
atoi_hex_letter: cmp r3, 5 ; 0-5: 6 letters
or r3, r3, 0x20 ; to lower case ja atoi_done
cmp r3, 0x61 ; 'a' add r3, r3, 10 ; Adjust for digits below
jl atoi_done atoi_hex_add:
cmp r3, 0x66 ; 'f'
jg atoi_done
add r2, r2, 1 add r2, r2, 1
sub r3, r3, 0x57 ; 'a' - 10
lsl r1, r1, 4 lsl r1, r1, 4
add r1, r1, r3 add r1, r1, r3
jmp atoi_hex_loop jmp atoi_hex_loop
+3 -3
View File
@@ -42,11 +42,11 @@ tests:
@0x1000 U32 0 U8 0 "\0" @0x1000 U32 0 U8 0 "\0"
@0x1010 U32 0 U8 1 "0\0" @0x1010 U32 0 U8 1 "0\0"
@0x1020 U32 1 U8 1 "1\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" @0x1040 U32 42 U8 2 "42\0"
@0x1050 U32 67 U8 2 "67lol\0" @0x1050 U32 67 U8 2 "67lol\0"
@0x1060 U32 0x69a U8 5 "0x69a\0" @0x1060 U32 0x69a U8 5 "0x69a@\0"
@0x1070 U32 0x4B4 U8 5 "0x4B4\0" @0x1070 U32 0x4B4 U8 5 "0x4B4g\0"
@0x1080 U32 0o23 U8 4 "0o239\0" @0x1080 U32 0o23 U8 4 "0o239\0"
@0x1090 U32 0b1011 U8 6 "0b1011\0" @0x1090 U32 0b1011 U8 6 "0b1011\0"
@0x10a0 U32 0b10001 U8 7 "0b100012\0" @0x10a0 U32 0b10001 U8 7 "0b100012\0"