commit - 9fbaab72c1953893040111708affa2b75702cf87
commit + 34149a2174203f148ec1e47ec74ce8eaba14e3bf
blob - 187d8c4683bbfe89f50fe21c75f516a4d549fb5b
blob + 2232800451f29c868cdb69efa04074b45a10c2bb
--- rvforth.S
+++ rvforth.S
.section .text
-// memeq (s1, s2, n);
-_MEMEQ:
- beq a2, zero, 1f
- lbu t0, 0(a0)
- lbu t1, 0(a1)
- bne t0, t1, 2f
- addi a0, a0, 1
- addi a1, a1, 1
- addi a2, a2, -1
- j _MEMEQ
-
-1: // equal
- li a0, -1
- jr ra
-
-2: // not equal
- mv a0, zero
- jr ra
-.size _MEMEQ, . - _MEMEQ
-
// return:
// a0 - word
// a1 - wordlen
PUSH a0
NEXT
-defcode "MEMEQ", 5, MEMEQ, WORD
- POP a0
- POP a1
- POP a2
- jal _MEMEQ
- PUSH a0
- NEXT
+// ( s1 s2 len -- eql )
+defword "MEMEQ", 5, MEMEQ, WORD
+ .quad ROT // ( len s1 s2 )
+ .quad DUP // ( len len s1 s2 )
+ GOTOZ 4f // ( len s1 s2 )
+
+ .quad TOR // ( s1 s2 -- len )
+
+1: // ( s1 s2 -- len )
+ .quad DUP // ( s1 s1 s2 -- len )
+ .quad FETCHBYTE // ( c1 s1 s2 -- len )
+ .quad TOR // ( s1 s2 -- c1 len )
+ .quad SWAP // ( s2 s1 -- c1 len )
+ .quad DUP // ( s2 s2 s1 -- c1 len )
+ .quad FETCHBYTE // ( c2 s2 s1 -- c1 len )
+ .quad FROMR // ( c1 c2 s2 s1 -- len )
+ .quad SUB // ( eql s2 s1 -- len )
+ GOTONZ 3f // ( s2 s1 -- len )
+
+ .quad FROMR // ( len s2 s1 )
+ .quad DEC // ( len-1 s2 s1 )
+ .quad DUP // ( len-1 len-1 s2 s1 )
+ GOTOZ 4f // ( len-1 s2 s1 )
+
+ .quad TOR // ( s2 s1 -- len-1 )
+ .quad INC // ( s2+1 s1 -- len-1 )
+ .quad SWAP // ( s1 s2+1 -- len-1 )
+ .quad INC // ( s1+1 s2+1 -- len-1 )
+ GOTO 1b
+
+
+3: // not equal // ( s2 s1 -- len )
+ .quad FROMR // ( len s2 s1 )
+ .quad TDROP // ( s1 )
+ .quad DROP // ( )
+ .quad LIT, 0 // ( 0 )
+ .quad EXIT
+4: // equal // ( len s2 s1 )
+ .quad TDROP // ( s1 )
+ .quad DROP // ( )
+ .quad LIT, -1 // ( 0 )
+ .quad EXIT
+
// ( name namelen -- &word )
defword "FIND", 4, FIND, MEMEQ
.quad TOR // ( namelen -- name )