forth-riscv

My forth
git clone git://git.electrosoup.com/forth-riscv
Log | Files | Refs

commit 26459f69ca2732a62504a5ab655469f8af721ca6
parent 51ea8748a32244c57113c6bedef511397cfe76dd
Author: Christian Ermann <christianermann@gmail.com>
Date:   Fri, 29 Nov 2024 15:04:49 -0800

Remove interpretation, only compile

Diffstat:
Msrc/forth.s | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 80 insertions(+), 27 deletions(-)

diff --git a/src/forth.s b/src/forth.s @@ -182,22 +182,22 @@ defcode "bye", bye, 0x71F39F63 defvar "#", prefix_decimal, 0x260C9112 .int 0x23 .int 0 - .int string_to_decimal + .int string_to_decimal_comma defvar "$", prefix_hex, 0x210C8933 .int 0x24 .int _prefix_decimal - .int string_to_hex + .int string_to_hex_comma defvar "%", prefix_binary, 0x200C87A0 .int 0x25 .int _prefix_hex - .int string_to_binary + .int string_to_binary_comma defvar "'", prefix_address, 0x220C8AC6 .int 0x27 .int _prefix_binary - .int string_to_address + .int string_to_address_comma defvar "*", prefix_execute, 0x2F0C9F3D .int 0x2A @@ -514,8 +514,6 @@ defword "string>#", string_to_decimal, 0x75831783 li y, 10 sw y, 0(x) jal to_number - bnez w, _string_to_number_fail - not w, w exit defword "string>$", string_to_hex, 0x7A831F62 @@ -523,8 +521,6 @@ defword "string>$", string_to_hex, 0x7A831F62 li y, 16 sw y, 0(x) jal to_number - bnez w, _string_to_number_fail - not w, w exit defword "string>%", string_to_binary, 0x7B8320F5 @@ -532,21 +528,86 @@ defword "string>%", string_to_binary, 0x7B8320F5 li y, 2 sw y, 0(x) jal to_number - bnez w, _string_to_number_fail - not w, w exit -_string_to_number_fail: +defword "number,", number_comma, 0x5E932C64 + bnez w, _number_comma_error + not w, w + jal swap + jal literal + exit +_number_comma_error: mv w, zero exit +defword "string>#,", string_to_decimal_comma, 0xAC5E487D + jal string_to_decimal + jal number_comma + exit + +defword "string>$,", string_to_hex_comma, 0x2A6A47CA + jal string_to_hex + jal number_comma + exit + +defword "string>%,", string_to_binary_comma, 0x486CB59B + jal string_to_binary + jal number_comma + exit + defword "string>address", string_to_address, 0xFDC3CE9A jal find addi x, w, code_offset push x exit -defword "string>execute" string_to_execute, 0xC1A5C011 +defword "string>address,", string_to_address_comma, 0x313E6882 + jal string_to_address + beqz w, _string_to_address_comma_fail + jal swap + jal literal + exit +_string_to_address_comma_fail: + exit + +defword "literal", literal, 0xECB9D8E4, flags=flag_immediate + push w + li w, 0xFFC10113 # addi psp, psp, -4 + push w + li w, 0xFEA12E23 # sw w, -4(psp) + jal comma + jal comma + mv x, w +_literal_small_1: + # emit `addi w, zero, immed` + andi w, x, -1 # 0xFFF + slli w, w, 20 + addi w, w, 0x513 + li y, 0xFFF + bltu x, y, _literal_small_2 +_literal_large_1: + # change to `addi w, w, immed` + li y, 0xA + slli y, y, 15 + add w, w, y + push w + # encode upper immediate + li w, 0xFFFFF000 + and w, x, w + srli y, x, 11 + andi y, y, 1 + beqz y, _literal_large_2 + li y, 0x00001000 + add w, w, y +_literal_large_2: + # emit `lui w, immed` + addi w, w, 0x537 + jal comma +_literal_small_2: + jal comma + exit + +defword "string>execute", string_to_execute, 0xC1A5C011 jal string_to_address beqz w, _string_to_execute_done pop w @@ -631,6 +692,10 @@ _match_prefix_done: next defword "interpret", interpret, 0x1F98C57A + la x, _dp + load_cell x, 0(x) + push_ret x + jal docol_comma _interpret_start: jal parse_word beqz w, _interpret_parse_area_empty @@ -642,25 +707,10 @@ _interpret_find_word: beqz w, _interpret_retry _interpret_word_found: addi w, w, code_offset - # compiling? - la x, _state - load_cell x, 0(x) - beqz x, _interpret_execute_word - # immediate? - addi x, w, flag_offset - code_offset - lb x, 0(x) - andi x, x, flag_immediate - bnez x, _interpret_execute_word -_interpret_compile_word: load_cell w, 0(w) jal jal_to jal comma j _interpret_start -_interpret_execute_word: - load_cell x, 0(w) - pop w - jalr x - j _interpret_start _interpret_execute_prefix: load_cell x, 0(w) pop w @@ -675,6 +725,9 @@ _interpret_retry: _interpret_parse_area_empty: addi psp, psp, cell pop w + jal exit_comma + pop_ret x + jalr x exit defword "bootstrap", bootstrap, 0x15C160D9