Add semicolons separating the statements

This commit is contained in:
Eugen Wissner 2025-05-01 01:32:45 +02:00
parent 23b7a1ab30
commit f3a8b2626a
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
5 changed files with 1341 additions and 1091 deletions

View File

@ -66,36 +66,3 @@ end
file 'build/stage2b' => ['build/stage2b.s', 'boot/common-boot.s'] do |t| file 'build/stage2b' => ['build/stage2b.s', 'boot/common-boot.s'] do |t|
sh CROSS_GCC, '-nostdlib', '-o', t.name, *t.prerequisites sh CROSS_GCC, '-nostdlib', '-o', t.name, *t.prerequisites
end end
desc 'Print remaining lines to rewrite'
task :statistics do
def is_false_positive(word)
word.start_with?('(*') ||
word.start_with?('*)') ||
('A'..'Z').include?(word[0]) ||
/^[[:alpha:]][[:digit:]]$/.match(word) ||
['end', 'if'].include?(word)
end
lines = File.read('boot/stage2.elna')
.split("\n")
.select { |line| line.start_with? "\t" }
.map { |line| line.delete_prefix("\t").split(' ') }
.reject { |words| is_false_positive(words.first) }
.group_by do |words|
if words.first.length < 5
case words.first
when 'goto'
'Statements'
else
words.first
end
else
'Statements'
end
end
lines.each do |key, value|
puts "#{key}: #{value.count}"
end
end

View File

@ -1,6 +1,6 @@
.global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower .global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower
.global _write_out, _read_file, _write_error, _put_char, _printi .global _write_out, _read_file, _write_error, _put_char, _printi
.global _get, _memcmp .global _get, _memcmp, _memchr, _memmem, _memcpy
.global _divide_by_zero_error, _exit .global _divide_by_zero_error, _exit
.section .rodata .section .rodata
@ -16,7 +16,8 @@ new_line: .ascii "\n"
.section .text .section .text
# Write the current token to stderr. # Write the current token to stderr. Ends the output with a newline.
#
# a0 - String pointer. # a0 - String pointer.
# a1 - String length. # a1 - String length.
.type _write_error, @function .type _write_error, @function
@ -306,3 +307,120 @@ _put_char:
_get: _get:
lw a0, (a0) lw a0, (a0)
ret ret
# Searches for the occurences of a character in the given memory block.
#
# Parameters:
# a0 - Memory block.
# a1 - Needle.
# a2 - Memory size.
#
# Sets a0 to the pointer to the found character or to null if the character
# doesn't occur in the memory block.
.type _memchr, @function
_memchr:
.Lmemchr_loop:
beqz a2, .Lmemchr_nil # Exit if the length is 0.
lbu t0, (a0) # Load the character from the memory block.
beq t0, a1, .Lmemchr_end # Exit if the character was found.
# Otherwise, continue with the next character.
addi a0, a0, 1
addi a2, a2, -1
j .Lmemchr_loop
.Lmemchr_nil:
li a0, 0
.Lmemchr_end:
ret
# Locates a substring.
#
# Parameters:
# a0 - Haystack.
# a1 - Haystack size.
# a2 - Needle.
# a3 - Needle size.
#
# Sets a0 to the pointer to the beginning of the substring in memory or to 0
# if the substring doesn't occur in the block.
.type _memmem, @function
_memmem:
# Prologue.
addi sp, sp, -24
sw ra, 20(sp)
sw s0, 16(sp)
addi s0, sp, 24
# Save preserved registers. They are used to keep arguments.
sw s1, 12(sp)
sw s2, 8(sp)
sw s3, 4(sp)
sw s4, 0(sp)
mv s1, a0
mv s2, a1
mv s3, a2
mv s4, a3
.Lmemmem_loop:
blt s2, s3, .Lmemmem_nil # Exit if the needle length is greater than memory.
mv a0, s1
mv a1, s3
mv a2, s4
call _memcmp
mv t0, a0 # memcmp result.
mv a0, s1 # Memory pointer for the case the substring was found.
beqz t0, .Lmemmem_end
addi s1, s1, 1
add s2, s2, -1
j .Lmemmem_loop
.Lmemmem_nil:
li a0, 0
.Lmemmem_end:
# Restore the preserved registers.
lw s1, 12(sp)
lw s2, 8(sp)
lw s3, 4(sp)
lw s4, 0(sp)
# Epilogue.
lw ra, 20(sp)
lw s0, 16(sp)
add sp, sp, 24
ret
# Copies memory.
#
# Parameters:
# a0 - Destination.
# a1 - Source.
# a2 - Size.
#
# Preserves a0.
.type _memcpy, @function
_memcpy:
mv t0, a0
.Lmemcpy_loop:
beqz a2, .Lmemcpy_end
lbu t1, (a1)
sb t1, (a0)
addi a0, a0, 1
addi a1, a1, 1
.Lmemcpy_end:
mv a0, t0
ret

View File

@ -207,11 +207,66 @@ _build_binary_expression:
addi sp, sp, 32 addi sp, sp, 32
ret ret
# Checks whether the given identifier starts with "loca".
# Parameters:
# a0 - Pointer to the identifier.
# a1 - Identifier length.
#
# Sets a0 to 1 if the identifier starts with "loca", otherwise to 0.
.type _is_local_identifier, @function
_is_local_identifier:
# Prologue.
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
addi s0, sp, 16
li t0, 0x61636f6c # loca
sw t0, 4(sp)
# a0 is already set.
addi a1, sp, 4
li a2, 4
call _memcmp
seqz a0, a0
# Epilogue.
lw ra, 12(sp)
lw s0, 8(sp)
addi sp, sp, 16
ret
# Checks whether the given identifier is a saved register name, like s1 or s2.
# Parameters:
# a0 - Pointer to the identifier.
# a1 - Identifier length.
#
# Sets a0 to 1 if the identifier is a preserved register, otherwise to 0.
.type _is_register_identifier, @function
_is_register_identifier:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
lbu a0, (a0)
addi a1, a1, -2
seqz a1, a1
addi t0, a0, -'s'
seqz t0, t0
and a0, a1, t0
# Epilogue.
lw ra, 4(sp)
lw s0, 0(sp)
addi sp, sp, 8
ret
# Parameters: # Parameters:
# a0 - Identifier length. # a0 - Identifier length.
# a1 - Register number as character. # a1 - Register number as character.
.type _build_identifier_expression, @function .type _compile_identifier_expression, @function
_build_identifier_expression: _compile_identifier_expression:
# Prologue. # Prologue.
addi sp, sp, -32 addi sp, sp, -32
sw ra, 28(sp) sw ra, 28(sp)
@ -221,22 +276,15 @@ _build_identifier_expression:
sw a0, 20(sp) # Identifier length. sw a0, 20(sp) # Identifier length.
sw a1, 16(sp) # Register number as character. sw a1, 16(sp) # Register number as character.
li t0, 0x61636f6c # loca
sw t0, 12(sp)
mv a0, s1 mv a0, s1
addi a1, sp, 12 lw a1, 20(sp)
li a2, 4 call _is_local_identifier
call _memcmp bnez a0, .Lcompile_identifier_expression_local
beqz a0, .Lbuild_identifier_expression_local
lbu a0, (s1) mv a0, s1
lw t0, 20(sp) lw a1, 20(sp)
addi t0, t0, -2 call _is_register_identifier
seqz t0, t0 bnez a0, .Lcompile_identifier_expression_saved
addi t1, a0, -'s'
seqz t1, t1
and t0, t0, t1
bnez t0, .Lbuild_identifier_expression_saved
# Global identifier. # Global identifier.
lw t1, 16(sp) lw t1, 16(sp)
@ -258,7 +306,7 @@ _build_identifier_expression:
lbu a0, (s1) lbu a0, (s1)
call _is_upper call _is_upper
beqz a0, .Lbuild_identifier_expression_end beqz a0, .Lcompile_identifier_expression_end
lw t1, 16(sp) lw t1, 16(sp)
li t0, 0x0a290061 # a\0)\n li t0, 0x0a290061 # a\0)\n
@ -274,9 +322,9 @@ _build_identifier_expression:
li a1, 12 li a1, 12
call _write_out call _write_out
j .Lbuild_identifier_expression_end j .Lcompile_identifier_expression_end
.Lbuild_identifier_expression_saved: .Lcompile_identifier_expression_saved:
li t0, 0x00202c00 # \0,_ li t0, 0x00202c00 # \0,_
lw t1, 16(sp) lw t1, 16(sp)
or t0, t0, t1 or t0, t0, t1
@ -294,9 +342,9 @@ _build_identifier_expression:
li a0, '\n' li a0, '\n'
call _put_char call _put_char
j .Lbuild_identifier_expression_end j .Lcompile_identifier_expression_end
.Lbuild_identifier_expression_local: .Lcompile_identifier_expression_local:
lw t1, 16(sp) lw t1, 16(sp)
li t0, 0x00202c00 # \0,_ li t0, 0x00202c00 # \0,_
or t0, t0, t1 or t0, t0, t1
@ -321,9 +369,9 @@ _build_identifier_expression:
li a0, '\n' li a0, '\n'
call _put_char call _put_char
j .Lbuild_identifier_expression_end j .Lcompile_identifier_expression_end
.Lbuild_identifier_expression_end: .Lcompile_identifier_expression_end:
# Epilogue. # Epilogue.
lw ra, 28(sp) lw ra, 28(sp)
@ -368,7 +416,7 @@ _build_expression:
lw a0, 20(sp) lw a0, 20(sp)
lw a1, 28(sp) lw a1, 28(sp)
call _build_identifier_expression call _compile_identifier_expression
j .Lbuild_expression_advance j .Lbuild_expression_advance
@ -455,6 +503,86 @@ _build_expression:
addi sp, sp, 40 addi sp, sp, 40
ret ret
# Compiles an lvalue.
#
# Parameters:
# a0 - Pointer to the identifier.
# a1 - Identifier length.
.type _compile_designator_expression, @function
_compile_designator_expression:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
sw s0, 24(sp)
addi s0, sp, 32
sw a0, 20(sp) # Identifier pointer.
sw a1, 16(sp) # Identifier length.
lw a0, 20(sp)
lw a1, 16(sp)
call _is_local_identifier
bnez a0, .Lcompile_designator_expression_local
lw a0, 20(sp)
lw a1, 16(sp)
call _is_register_identifier
bnez a0, .Lcompile_designator_expression_saved
.Lcompile_designator_expression_local:
li t0, 0x202c30 # 0,_
sw t0, 12(sp)
li t0, 0x61207773 # sw a
sw t0, 8(sp)
addi a0, sp, 8
li a1, 7
call _write_out
lw a0, 20(sp)
lw a1, 16(sp)
addi a0, a0, 4 # Skip the "loca" variable prefix.
addi a1, a1, -4 # Skip the "loca" variable prefix.
call _write_out
li t0, '\n'
sw t0, 12(sp)
li t0, 0x29707328 # (sp)
sw t0, 8(sp)
addi a0, sp, 8
li a1, 5
call _write_out
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_saved:
li t0, 0x20766d # mv_
sw t0, 12(sp)
addi a0, sp, 12
li a1, 3
call _write_out
lw a0, 20(sp)
lw a1, 16(sp)
call _write_out
li t0, 0x0a # \n
sw t0, 12(sp)
li t0, 0x3061202c # , a0
sw t0, 8(sp)
addi a0, sp, 8
li a1, 5
call _write_out
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_end:
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
ret
# Compiles a statement beginning with an identifier. # Compiles a statement beginning with an identifier.
# #
# Left values should be variables named "loca n", where n is the offset # Left values should be variables named "loca n", where n is the offset
@ -508,28 +636,9 @@ _compile_identifier:
.Lcompile_identifier_assign: .Lcompile_identifier_assign:
call _build_binary_expression call _build_binary_expression
li t0, 0x202c30 # 0,_
sw t0, 12(sp)
li t0, 0x61207773 # sw a
sw t0, 8(sp)
addi a0, sp, 8
li a1, 7
call _write_out
lw a0, 20(sp) lw a0, 20(sp)
lw a1, 16(sp) lw a1, 16(sp)
addi a0, a0, 4 # Skip the "loca" variable prefix. call _compile_designator_expression
addi a1, a1, -4 # Skip the "loca" variable prefix.
call _write_out
li t0, '\n'
sw t0, 12(sp)
li t0, 0x29707328 # (sp)
sw t0, 8(sp)
addi a0, sp, 8
li a1, 5
call _write_out
j .Lcompile_identifier_end j .Lcompile_identifier_end
@ -1310,11 +1419,7 @@ _compile_label:
addi s0, sp, 16 addi s0, sp, 16
sw a0, 0(sp) # Save the line length. sw a0, 0(sp) # Save the line length.
mv a1, a0 # Argument for _write_out later.
# Write the whole line as is.
mv a0, s1
lw a1, 0(sp)
call _write_out
lw t0, 0(sp) # Line length. lw t0, 0(sp) # Line length.
mv t1, s1 # Line start. mv t1, s1 # Line start.
@ -1323,8 +1428,15 @@ _compile_label:
addi t1, t1, -1 # Last character on the line. addi t1, t1, -1 # Last character on the line.
lbu t1, (t1) lbu t1, (t1)
li t2, ':' li t2, ';'
beq t1, t2, .Lcompile_label_colon bne t1, t2, .Lcompile_label_colon
addi a1, a1, -1
.Lcompile_label_colon:
# Write the whole line as is.
mv a0, s1
call _write_out
li t0, 0x3a # : li t0, 0x3a # :
sw t0, 4(sp) sw t0, 4(sp)
@ -1332,7 +1444,6 @@ _compile_label:
li a1, 1 li a1, 1
call _write_out call _write_out
.Lcompile_label_colon:
li t0, '\n' li t0, '\n'
sw t0, 4(sp) sw t0, 4(sp)
addi a0, sp, 4 addi a0, sp, 4
@ -1411,12 +1522,6 @@ _compile_if:
call _put_char call _put_char
.Lcompile_if_loop: .Lcompile_if_loop:
/* DEBUG
mv a0, s1
li a1, 6
call _write_error
call _divide_by_zero_error */
call _skip_spaces call _skip_spaces
call _read_token call _read_token
@ -1532,13 +1637,15 @@ _compile_line:
call _memcmp call _memcmp
beqz a0, .Lcompile_line_exit beqz a0, .Lcompile_line_exit
li t0, 0x61636f6c # loca
sw t0, 12(sp)
mv a0, s1 mv a0, s1
addi a1, sp, 12 lw a1, 20(sp)
li a2, 4 call _is_local_identifier
call _memcmp bnez a0, .Lcompile_line_identifier
beqz a0, .Lcompile_line_identifier
mv a0, s1
li a1, 2
call _is_register_identifier
bnez a0, .Lcompile_line_identifier
li t0, 0x6f706d69 # impo li t0, 0x6f706d69 # impo
sw t0, 12(sp) sw t0, 12(sp)
@ -1806,9 +1913,6 @@ _main:
.type _start, @function .type _start, @function
_start: _start:
call _tokenizer_initialize call _tokenizer_initialize
li a1, 50
call _write_error
call _main call _main
call _compile call _compile

File diff suppressed because it is too large Load Diff

View File

@ -1,165 +1,195 @@
.global _tokenizer_initialize .global _tokenizer_initialize
.section .rodata .section .rodata
#
# Classes:
#
# 0x00: Invalid
# 0x01: Digit
# 0x02: Character
# 0x03: Space
.type classes, @object
.size classes, 128
classes:
.byte 0x00 # 00 NUL
.byte 0x00 # 01 SOH
.byte 0x00 # 02 STX
.byte 0x00 # 03 ETX
.byte 0x00 # 04 EOT
.byte 0x00 # 05 ENQ
.byte 0x00 # 06 ACK
.byte 0x00 # 07 BEL
.byte 0x00 # 08 BS
.byte 0x00 # 09 HT
.byte 0x00 # 0A LF
.byte 0x00 # 0B VT
.byte 0x00 # 0C FF
.byte 0x00 # 0D CR
.byte 0x00 # 0E SO
.byte 0x00 # 0F SI
.byte 0x00 # 10 DLE
.byte 0x00 # 11 DC1
.byte 0x00 # 12 DC2
.byte 0x00 # 13 DC3
.byte 0x00 # 14 DC4
.byte 0x00 # 15 NAK
.byte 0x00 # 16 SYN
.byte 0x00 # 17 ETB
.byte 0x00 # 18 CAN
.byte 0x00 # 19 EM
.byte 0x00 # 1A SUB
.byte 0x00 # 1B ESC
.byte 0x00 # 1C FS
.byte 0x00 # 1D GS
.byte 0x00 # 1E RS
.byte 0x00 # 1F US
.byte 0x03 # 20 Space
.byte 0x00 # 21 !
.byte 0x00 # 22 "
.byte 0x00 # 23 #
.byte 0x00 # 24 $
.byte 0x00 # 25 %
.byte 0x00 # 26 &
.byte 0x00 # 27 '
.byte 0x00 # 28 (
.byte 0x00 # 29 )
.byte 0x00 # 2A *
.byte 0x00 # 2B +
.byte 0x00 # 2C ,
.byte 0x00 # 2D -
.byte 0x00 # 2E .
.byte 0x00 # 2F /
.byte 0x01 # 30 0
.byte 0x01 # 31 1
.byte 0x01 # 32 2
.byte 0x01 # 33 3
.byte 0x01 # 34 4
.byte 0x01 # 35 5
.byte 0x01 # 36 6
.byte 0x01 # 37 7
.byte 0x01 # 38 8
.byte 0x01 # 39 9
.byte 0x00 # 3A :
.byte 0x00 # 3B ;
.byte 0x00 # 3C <
.byte 0x00 # 3D =
.byte 0x00 # 3E >
.byte 0x00 # 3F ?
.byte 0x00 # 40 @
.byte 0x02 # 41 A
.byte 0x02 # 42 B
.byte 0x02 # 43 C
.byte 0x02 # 44 D
.byte 0x02 # 45 E
.byte 0x02 # 46 F
.byte 0x02 # 47 G
.byte 0x02 # 48 H
.byte 0x02 # 49 I
.byte 0x02 # 4A J
.byte 0x02 # 4B K
.byte 0x02 # 4C L
.byte 0x02 # 4D M
.byte 0x02 # 4E N
.byte 0x02 # 4F O
.byte 0x02 # 50 P
.byte 0x02 # 51 Q
.byte 0x02 # 52 R
.byte 0x02 # 53 S
.byte 0x02 # 54 T
.byte 0x02 # 55 U
.byte 0x02 # 56 V
.byte 0x02 # 57 W
.byte 0x02 # 58 X
.byte 0x02 # 59 Y
.byte 0x02 # 5A Z
.byte 0x00 # 5B [
.byte 0x00 # 5C \
.byte 0x00 # 5D ]
.byte 0x00 # 5E ^
.byte 0x00 # 5F _
.byte 0x00 # 60 `
.byte 0x02 # 61 a
.byte 0x02 # 62 b
.byte 0x02 # 63 c
.byte 0x02 # 64 d
.byte 0x02 # 65 e
.byte 0x02 # 66 f
.byte 0x02 # 67 g
.byte 0x02 # 68 h
.byte 0x02 # 69 i
.byte 0x02 # 6A j
.byte 0x02 # 6B k
.byte 0x02 # 6C l
.byte 0x02 # 6D m
.byte 0x02 # 6E n
.byte 0x02 # 6F o
.byte 0x02 # 70 p
.byte 0x02 # 71 q
.byte 0x02 # 72 r
.byte 0x02 # 73 s
.byte 0x02 # 74 t
.byte 0x02 # 75 u
.byte 0x02 # 76 v
.byte 0x02 # 77 w
.byte 0x02 # 78 x
.byte 0x02 # 79 y
.byte 0x02 # 7A z
.byte 0x00 # 7B {
.byte 0x00 # 7C |
.byte 0x00 # 7D }
.byte 0x00 # 7E ~
.byte 0x00 # 7F DEL
raw_classes: .section .data
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "space\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "digit\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "upper\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "lower\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.ascii "invalid\n"
.section .bss .section .bss
.type class_names, @object .type class_names, @object
.size class_names, 1024 .size class_names, 1024
class_names: .zero 1024 class_names: .zero 1024
.section .data
.type classes, @object
.size classes, 512 # 128 characters * 4 byte.
classes:
.section .text .section .text
# Initializes the classification table. # Initializes the classification table.
# #
# Paramaters: # Paramaters:
# a0 - Raw input for the classification table. # a0 - Raw input for the classification table.
.type _tokenizer_classes, @function .type _initialize_classes, @function
_tokenizer_classes: _initialize_classes:
# Prologue. # Prologue.
addi sp, sp, -8 addi sp, sp, -24
sw ra, 4(sp) sw ra, 20(sp)
sw s0, 0(sp) sw s0, 16(sp)
addi s0, sp, 8 addi s0, sp, 24
sw s1, 12(sp) # Preserve the s1 register used for the character counter.
li s1, 128 # 128 ASCII characters.
.Linitialize_classes_loop:
addi s1, s1, -1
la t0, classes
add t0, t0, s1
lbu t0, (t0)
li t1, 0x01
bne t0, t1, .Linitialize_classes_step
/* DEBUG */
li a0, 0x69676964
sw a0, 8(sp) # Preserve the memory address.
addi a0, sp, 8
li a1, 4
call _write_error
.Linitialize_classes_step:
bnez s1, .Linitialize_classes_loop
lw s1, 12(sp) # Restore the saved register.
# Epilogue. # Epilogue.
lw ra, 4(sp) lw ra, 20(sp)
lw s0, 0(sp) lw s0, 16(sp)
addi sp, sp, 8 addi sp, sp, 24
ret ret
# Initializes the lookup tables. # Initializes the lookup tables.
@ -171,8 +201,7 @@ _tokenizer_initialize:
sw s0, 0(sp) sw s0, 0(sp)
addi s0, sp, 8 addi s0, sp, 8
la a0, raw_classes call _initialize_classes
call _tokenizer_classes
# Epilogue. # Epilogue.
lw ra, 4(sp) lw ra, 4(sp)