~rabbits/uxnlin

f50f4cfee5bb8c5f5b21bd2117e3aa95e664b7c0 — Devine Lu Linvega a month ago 3d3bbad
Detect tail-calls for JSI
2 files changed, 43 insertions(+), 1 deletions(-)

M etc/example.tal
M src/uxnlin.tal
M etc/example.tal => etc/example.tal +9 -1
@@ 76,9 76,17 @@
	#0102 ADD

	( do not catch )
	[ LIT &test $1 ] #00 EQU 
	[ LIT &test $1 ] #00 EQU

BRK

( try tailcall )

@label

	label-name

JMP2r

~etc/include.tal


M src/uxnlin.tal => src/uxnlin.tal +34 -0
@@ 151,6 151,13 @@ JMP2r
		;static-dup print-warn2
		&no-lit

	( tail-calls )
	;token ;jmp scmp3 #00 EQU ?&no-tail
	;token/last is-opcode ?&no-tail
	;token/last LDA cilc #00 EQU ?&no-tail
		;tailcall print-warn2
		&no-tail

	&cleanup
	;token/last ;token/last2 scpy
	;token ;token/last scpy


@@ 206,12 213,30 @@ JMP2r

	LDAk LIT "; EQU ?&pass
	LDAk LIT ". EQU ?&pass
	LDAk LIT ", EQU ?&pass
	LDAk LIT "# EQU ?&pass
	POP2 #00

JMP2r
	&pass POP2 #01 JMP2r

@is-opcode ( string* -- f )

	DUP2 ;opcodes/brk scmp3 ?find-opcode/on-brk

@find-opcode ( name* -- byte )

	,&t STR2
	#2000
	&l
		#00 OVR #03 MUL ;opcodes ADD2 [ LIT2 &t $2 ] scmp3 ?&on-found
		INC GTHk ?&l
	POP2 #00

JMP2r
	&on-found POP2 #01 JMP2r
	&on-brk POP2 #01 JMP2r

@print-warn ( str* -- )

	.stats/warnings LDZ2k INC2 ROT STZ2


@@ 271,6 296,7 @@ JMP2r
@|stdlib )

@ciuc ( c -- f ) LIT "A SUB #19 LTH JMP2r
@cilc ( c -- f ) LIT "a SUB #1a LTH JMP2r
@scap ( str* -- end* ) LDAk #00 NEQ [ JMP JMP2r ] &w INC2 LDAk ?&w JMP2r
@sput ( chr str* -- ) scap STA JMP2r
@slen ( str* -- len* ) DUP2 scap SWP2 SUB2 JMP2r


@@ 351,6 377,13 @@ JMP2r
(
@|assets )

@opcodes
	"LIT "INC "POP "NIP "SWP "ROT "DUP "OVR
	"EQU "NEQ "GTH "LTH "JMP "JCN "JSR "STH
	"LDZ "STZ "LDR "STR "LDA "STA "DEI "DEO
	"ADD "SUB "MUL "DIV "AND "ORA "EOR "SFT
	&brk "BRK

@ariopcodes
	"ADD $1 "SUB $1 "MUL $1 "DIV $1
	"GTH $1 "LTH $1 "EQU $1 "NEQ $1


@@ 383,6 416,7 @@ JMP2r
@combine "Combine $1 ( sequences of two literal bytes )
@uncalled "Uncalled $1 ( using JSR when could be calling )
@optimize "Optimize $1 ( bad design )
@tailcall "Tailcall $1 ( should be a jmi )

( specifics )
	@inc "INC $1 @inc2 "INC2 $1