diff options
author | Camil Staps | 2016-10-02 12:13:15 +0000 |
---|---|---|
committer | Camil Staps | 2016-10-02 12:13:15 +0000 |
commit | f7f261f93896e2c7123db4742eb4d7efda246bf8 (patch) | |
tree | 0026a048f689a0d30b701d3e72b214eda88ee44b |
Initial commit
-rw-r--r-- | .gitignore | 11 | ||||
-rw-r--r-- | Makefile | 45 | ||||
-rw-r--r-- | _system.abc | 2407 | ||||
-rw-r--r-- | cgopts.s | 15 | ||||
-rw-r--r-- | test.icl | 8 |
5 files changed, 2486 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..053dbc4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.abc +!_system.abc + +*.s +!cgopts.s + +a.out +Clean System Files/ +*.o + +test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..75bbeb6 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +EXE:=test +OBJ:=$(addsuffix .o,$(EXE)) +ASM:=$(addsuffix .s,$(EXE)) +DEPS_O:=cgopts.o _system.o +SECONDARY:=_system.s +CC:=arm-linux-gnueabihf-gcc + +CLM:=clm +CG:=/home/pi/clean-code-generator/cg +AS:=arm-linux-gnueabihf-as + +ASFLAGS:=-g -march=armv8-a+crc -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard --gstabs +CFLAGS:=-g -march=armv8-a+crc -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -mtune=cortex-a53 -Wall + +all: all_exe all_asm all_obj + +all_exe: $(EXE) + +all_asm: $(ASM) + +all_obj: $(OBJ) + +$(OBJ): %.o: %.s + $(AS) -o $@ $< $(ASFLAGS) + +$(EXE): %: %.o $(DEPS_O) + $(CC) -o $@ $<\ + ~/clean-run-time-system/_startup.o\ + $(DEPS_O)\ + -lc -lm\ + $(CFLAGS) + +$(DEPS_O): %.o: %.s + $(CC) -c -o $@ $< $(CFLAGS) + +%.s: %.abc + $(CG) $(basename $@) -s $@ + +%.abc: %.icl + $(CLM) -ABC $(subst .abc,,$@); return 0 + mv Clean\ System\ Files/$@ $@ + if [ -z "$$(ls -qAL Clean\ System\ Files)" ]; then rmdir Clean\ System\ Files; fi + +clean: + $(RM) -r $(EXE) $(OBJ) $(DEPS_O) $(ASM) $(SECONDARY) Clean\ System\ Files diff --git a/_system.abc b/_system.abc new file mode 100644 index 0000000..a19b171 --- /dev/null +++ b/_system.abc @@ -0,0 +1,2407 @@ +.comp 920 010111011 +.code 0 0 0 +.start _nostart_ +.endinfo + +.module m__system "_system" + +.implab e_system_nind e_system_eaind + +.export _channel_code + +.export EMPTY INT BOOL CHAR REAL FILE _STRING_ _ARRAY_ ARRAY +.export _reserve _cycle_in_spine _hnf +.export _type_error _match_error selector_m_error index_error +.export _print_graph _eval_to_nf +.export _Tuple +.export _Select _select_code +.export _Nil _Cons + +.export e_system_dAP e_system_nAP e_system_eaAP e_system_dind +.export e_system_dif e_system_lif e_system_sif e_system_nif e_system_eaif +.export _HnfReducer _hnf_reducer +.export _Defer _defer_code + +.export d_S.1 d_S.2 d_S.3 d_S.4 d_S.5 d_S.6 +.export n_S.1 n_S.2 n_S.3 n_S.4 n_S.5 n_S.6 +.export ea_S.1 ea_S.2 ea_S.3 ea_S.4 ea_S.5 ea_S.6 + +.export d_Sr.1 d_Sr.2 d_Sr.3 d_Sr.4 d_Sr.5 d_Sr.6 +.export n_Sr.1 n_Sr.2 n_Sr.3 n_Sr.4 n_Sr.5 n_Sr.6 +.export ea_Sr.1 ea_Sr.2 ea_Sr.3 ea_Sr.4 ea_Sr.5 ea_Sr.6 + +.export _ind + +|| don't change the order of the following 9 descriptors + +|.desc CHANNEL _channel_code _hnf 1 "" +.desc GRAPH _hnf _hnf 0 0 "" +.desc _ARRAY_ _hnf _hnf 0 0 "_ARRAY_" +.desc _STRING_ _hnf _hnf 0 0 "_STRING_" +|.desc STRING _hnf _hnf 0 "STRING" +|.desc FILE _hnf _hnf 0 "FILE" +.desc REAL _hnf _hnf 0 0 "REAL" +.desc INT _hnf _hnf 0 0 "INT" +.desc BOOL _hnf _hnf 0 0 "BOOL" +.desc CHAR _hnf _hnf 0 0 "CHAR" + +.desc EMPTY _reserve _hnf 0 0 "EMPTY" + +.desc _Tuple _hnf _hnf 32 0 "_Tuple" +.desc _Select _hnf _hnf 2 0 "_Select" +.desc _Nil _hnf _hnf 0 0 "Nil" + +.desc _Cons _hnf l_Cons 2 0 "Cons" + +.record FILE ii 0 2 "File" + +.desc e_system_dAP _hnf e_system_lAP 2 0 "AP" +.desc e_system_dif e_system_nif e_system_lif 3 0 "if" + +.desc e_system_dind e_system_nind _hnf 0 0 "_ind" +| the next descriptor is for compatibility with older compiler, remove later +.desc _ind e_system_nind _hnf 0 0 "_ind" + + +.desc _Defer _defer_code _hnf 0 0 "_Defer" + +.desc ARRAY _hnf _hnf 1 0 "ARRAY" + +.desc _HnfReducer _hnf_reducer _hnf_reducer 0 0 "HnfReducer" +| .desc _NfReducer _nf_reducer _nf_reducer 0 0 "NfReducer" + +.export e__system_kFinalizer +.record e__system_kFinalizer diii 0 3 "Finalizer" +.export e__system_kFinalizerGCTemp +.record e__system_kFinalizerGCTemp daii 1 2 "FinalizerGCTemp" + +.o 0 2 i i +_match_error + print "Run time error, rule \'" + printD + print "\' in module \'" + printD + print "\' does not match\n" + halt + +.o 0 0 +selector_m_error + print "Run time error, selector does not match" + halt + +.n 0 _Defer +.o 1 0 +_defer_code + print "Error: defer code entered" + halt + +.a 2 ea_Cons +.o 2 0 +l_Cons + push_args 0 1 1 + update_a 2 1 + create + update_a 0 3 + pop_a 1 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.o 3 0 +ea_Cons + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.export _Conss n_Conss ea_Conss +.desc _Conss n_Conss l_Conss 2 0 "Cons!" + +.a 2 ea_Conss +.o 2 0 +l_Conss + push_args 0 1 1 + update_a 2 1 + create + update_a 0 3 + pop_a 1 + jsr_eval 0 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.n 2 _Conss ea_Conss +.o 1 0 +n_Conss + push_node _cycle_in_spine 2 +.o 3 0 +ea_Conss + jsr_eval 0 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.export _Consts n_Consts ea_Consts +.desc _Consts n_Consts l_Consts 2 0 "Cons!" + +.a 2 ea_Consts +.o 2 0 +l_Consts + push_args 0 1 1 + update_a 2 1 + create + update_a 0 3 + pop_a 1 + jsr_eval 1 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.n 2 _Consts ea_Consts +.o 1 0 +n_Consts + push_node _cycle_in_spine 2 +.o 3 0 +ea_Consts + jsr_eval 1 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.export _Conssts n_Conssts ea_Conssts +.desc _Conssts n_Conssts l_Conssts 2 0 "Cons!!" + +.a 2 ea_Conssts +.o 2 0 +l_Conssts + push_args 0 1 1 + update_a 2 1 + create + update_a 0 3 + pop_a 1 + jsr_eval 1 + jsr_eval 0 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.n 2 _Conssts ea_Conssts +.o 1 0 +n_Conssts + push_node _cycle_in_spine 2 +.o 3 0 +ea_Conssts + jsr_eval 1 + jsr_eval 0 + fill _Cons 2 _hnf 2 +.d 1 0 + rtn + +.export _Consi _Consr _Consc _Consb _Consf +.record _Consi lia 1 1 "[#Int]" +.record _Consr lra 1 2 "[#Real]" +.record _Consc lca 1 1 "[#Char]" +.record _Consb lba 1 1 "[#Bool]" +.record _Consf lfa 1 2 "[#File]" + +.export _Consits _Consrts _Conscts _Consbts _Consfts +.record _Consits lia 1 1 "[#Int!]" +.record _Consrts lra 1 2 "[#Real!]" +.record _Conscts lca 1 1 "[#Char!]" +.record _Consbts lba 1 1 "[#Bool!]" +.record _Consfts lfa 1 2 "[#File!]" + +.export _Consa +.record _Consa laa 2 0 "[#{}]" + +.descs d_S.1 n_S.1 _ 1 0 "_S.1" +.pb "_S.1" +.n -1 d_S.1 ea_S.1 +.o 1 0 +n_S.1 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + pushI 1 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn +.o 2 0 +ea_S.1 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + pushI 1 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jmp_eval_upd +.pe + +.o 1 0 +o_S.1 + get_node_arity 0 + pushI 1 + push_arg_b 0 + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.descs d_S.2 n_S.2 _ 2 0 "_S.2" +.pb "_S.2" +.n -1 d_S.2 ea_S.2 +.o 1 0 +n_S.2 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + eqI_b 2 0 + jmp_false n_S.2_ + pop_b 1 + repl_arg 2 2 + jsr_eval 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn +n_S.2_ + pop_b 1 + repl_arg 3 2 + jsr_eval 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn +.o 2 0 +ea_S.2 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + eqI_b 2 0 + jmp_false ea_S.2_ + pop_b 1 + repl_arg 2 2 + jmp_eval_upd +ea_S.2_ + repl_arg 3 2 + pop_b 1 + jmp_eval_upd +.pe + +.o 1 0 +o_S.2 + get_node_arity 0 + eqI_b 2 0 + jmp_false o_S.2_ + pop_b 1 + repl_arg 2 2 +.d 1 0 + rtn +o_S.2_ + repl_arg 3 2 + pop_b 1 +.d 1 0 + rtn + +.descs d_S.3 n_S.3 _ 4 0 "_S.3" +.pb "_S.3" +.n -1 d_S.3 ea_S.3 +.o 1 0 +n_S.3 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + pushI 3 + push_arg_b 0 + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_S.3 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + pushI 3 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jmp_eval_upd +.pe + +.o 1 0 +o_S.3 + get_node_arity 0 + pushI 3 + push_arg_b 0 + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.descs d_S.4 n_S.4 _ 5 0 "_S.4" +.n -1 d_S.4 ea_S.4 +.o 1 0 +n_S.4 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + pushI 4 + push_arg_b 0 + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_S.4 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + pushI 4 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jmp_eval_upd + +.o 1 0 +o_S.4 + get_node_arity 0 + pushI 4 + push_arg_b 0 + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.descs d_S.5 n_S.5 _ 6 0 "_S.5" +.n -1 d_S.5 ea_S.5 +.o 1 0 +n_S.5 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + pushI 5 + push_arg_b 0 + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_S.5 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + pushI 5 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jmp_eval_upd + +.o 1 0 +o_S.5 + get_node_arity 0 + pushI 5 + push_arg_b 0 + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.descs d_S.6 n_S.6 _ 7 0 "_S.6" +.n -1 d_S.6 ea_S.6 +.o 1 0 +n_S.6 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + pushI 6 + push_arg_b 0 + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_S.6 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + pushI 6 + push_arg_b 0 + update_a 0 1 + pop_a 1 + jmp_eval_upd + + +.o 1 0 +o_S.6 + get_node_arity 0 + pushI 6 + push_arg_b 0 + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + + + +.desc d_Sr.1 n_Sr.1 o_Sr.1 1 0 "_Sr.1" +.pb "_Sr.1" +.n -1 d_Sr.1 ea_Sr.1 +.o 1 0 +n_Sr.1 + push_node _reserve 1 + jsr_eval 0 + + push_args_u 0 1 1 + buildh _Nil 0 + fill1 _Tuple 1 2 01 +.keep 1 0 + + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_Sr.1 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + + push_args_u 0 1 1 + buildh _Nil 0 + fill1 _Tuple 1 2 01 +.keep 1 0 + + update_a 0 1 + pop_a 1 + jmp_eval_upd +.pe + +.o 1 0 +o_Sr.1 + push_args_u 0 1 1 + buildh _Nil 0 + fill1 _Tuple 1 2 01 +.keep 1 0 + + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.desc d_Sr.2 n_Sr.2 o_Sr.2 1 0 "_Sr.2" +.pb "_Sr.2" +.n -1 d_Sr.2 ea_Sr.2 +.o 1 0 +n_Sr.2 + push_node _reserve 1 + jsr_eval 0 + get_node_arity 0 + eqI_b 2 0 + update_b 0 1 + pop_b 1 + jmp_false n_Sr.2_ + + push_args_u 0 2 2 + pop_a 1 + buildh _Nil 0 + fill1 _Tuple 2 2 001 +.keep 1 0 + update_a 0 1 + pop_a 1 + + jsr_eval 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn + +n_Sr.2_ + push_args_u 0 3 2 + pop_a 1 + buildh _Nil 0 + fill2 _Tuple 3 2 0010 +.keep 1 0 + update_a 0 1 + pop_a 1 + + jsr_eval 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn +.o 2 0 +ea_Sr.2 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + get_node_arity 0 + eqI_b 2 0 + update_b 0 1 + pop_b 1 + jmp_false ea_Sr.2_ + + push_args_u 0 2 2 + pop_a 1 + buildh _Nil 0 + fill1 _Tuple 2 2 001 +.keep 1 0 + update_a 0 1 + pop_a 1 + + jmp_eval_upd + +ea_Sr.2_ + push_args_u 0 3 2 + pop_a 1 + buildh _Nil 0 + fill2 _Tuple 3 2 0010 +.keep 1 0 + update_a 0 1 + pop_a 1 + + jmp_eval_upd +.pe + +.o 1 0 +o_Sr.2 + get_node_arity 0 + eqI_b 2 0 + update_b 0 1 + pop_b 1 + jmp_false o_Sr.2_ + + push_args_u 0 2 2 + pop_a 1 + buildh _Nil 0 + fill1 _Tuple 2 2 001 +.keep 1 0 + update_a 0 1 + pop_a 1 + +.d 1 0 + rtn + +o_Sr.2_ + push_args_u 0 3 2 + pop_a 1 + buildh _Nil 0 + fill2 _Tuple 3 2 0010 +.keep 1 0 + update_a 0 1 + pop_a 1 + +.d 1 0 + rtn + +.desc d_Sr.3 n_Sr.3 o_Sr.3 1 0 "_Sr.3" +.pb "_Sr.3" +.n -1 d_Sr.3 ea_Sr.3 +.o 1 0 +n_Sr.3 + push_node _reserve 1 + jsr_eval 0 + + push_args_u 0 3 3 + pop_a 2 + buildh _Nil 0 + fill2 _Tuple 3 2 0001 +.keep 1 0 + + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 2 0 +ea_Sr.3 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + + push_args_u 0 3 3 + pop_a 2 + buildh _Nil 0 + fill2 _Tuple 3 2 0001 +.keep 1 0 + + update_a 0 1 + pop_a 1 + jmp_eval_upd +.pe + +.o 1 0 +o_Sr.3 + push_args_u 0 3 3 + pop_a 2 + buildh _Nil 0 + fill2 _Tuple 3 2 0001 +.keep 1 0 + + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.desc d_Sr.4 n_Sr.4 o_Sr.4 1 0 "_Sr.4" +.n -1 d_Sr.4 ea_Sr.4 +.o 1 0 +n_Sr.4 + push_node _reserve 1 + jsr_eval 0 + + push_args_u 0 4 4 + pop_a 3 + buildh _Nil 0 + fill2 _Tuple 4 2 00001 +.keep 1 0 + + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 1 0 +o_Sr.4 + push_args_u 0 4 4 + pop_a 3 + buildh _Nil 0 + fill2 _Tuple 4 2 00001 +.keep 1 0 + + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.o 2 0 +ea_Sr.4 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + + push_args_u 0 4 4 + pop_a 3 + buildh _Nil 0 + fill2 _Tuple 4 2 00001 +.keep 1 0 + + update_a 0 1 + pop_a 1 + jmp_eval_upd + + +.desc d_Sr.5 n_Sr.5 o_Sr.5 1 0 "_Sr.5" +.n -1 d_Sr.5 ea_Sr.5 +.o 1 0 +n_Sr.5 + push_node _reserve 1 + jsr_eval 0 + + push_args_u 0 5 5 + pop_a 4 + buildh _Nil 0 + fill2 _Tuple 5 2 000001 +.keep 1 0 + + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 1 0 +o_Sr.5 + push_args_u 0 5 5 + pop_a 4 + buildh _Nil 0 + fill2 _Tuple 5 2 000001 +.keep 1 0 + + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.o 2 0 +ea_Sr.5 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + + push_args_u 0 5 5 + pop_a 4 + buildh _Nil 0 + fill2 _Tuple 5 2 000001 +.keep 1 0 + + update_a 0 1 + pop_a 1 + jmp_eval_upd + + +.desc d_Sr.6 n_Sr.6 o_Sr.6 1 0 "_Sr.6" +.n -1 d_Sr.6 ea_Sr.6 +.o 1 0 +n_Sr.6 + push_node _reserve 1 + jsr_eval 0 + + push_args_u 0 6 6 + pop_a 5 + buildh _Nil 0 + fill2 _Tuple 6 2 0000001 +.keep 1 0 + + jsr_eval 0 + getWL 2 + fill_a 0 2 + release + pop_a 2 +.d 1 0 + rtn + +.o 1 0 +o_Sr.6 + push_args_u 0 6 6 + pop_a 5 + buildh _Nil 0 + fill2 _Tuple 6 2 0000001 +.keep 1 0 + + update_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.o 2 0 +ea_Sr.6 + push_arg 0 1 1 + push_a 2 +.keep 1 0 + fill e_system_dind -2 e_system_nind 2 +.keep 1 0 + update_a 0 1 + pop_a 1 + jsr_eval 0 + + push_args_u 0 6 6 + pop_a 5 + buildh _Nil 0 + fill2 _Tuple 6 2 0000001 +.keep 1 0 + + update_a 0 1 + pop_a 1 + jmp_eval_upd + + + + + +.n 2 _Select +.o 1 0 +_select_code + print "Error: select code entered" + halt + +.o 0 0 +e_system_lAP + print "Error: lazy entry of AP entered" + halt + +.o 3 0 +e_system_eaAP +.d 2 0 + jmp ea_AP + +.n 2 e_system_dAP e_system_eaAP +.o 1 0 +e_system_nAP + push_node _reserve 2 +.o 2 0 +ea_AP + jsr_eval 0 +.d 2 0 + jsr e_system_sAP +.o 1 0 + fill_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.o 2 0 +e_system_lif + repl_args 2 2 +.d 3 0 + jmp eval_args_if + +.n 3 e_system_dif e_system_eaif +.o 1 0 +e_system_nif + push_node _reserve 3 +.d 3 0 + jsr eval_args_if +.o 1 0 + getWL 1 + fill_a 0 1 + release + pop_a 1 +.d 1 0 + rtn + +.o 3 0 +eval_args_if + jsr_eval 0 + pushB_a 0 + pop_a 1 +.o 2 1 b +e_system_sif + jmp_false ifelse + update_a 0 1 + pop_a 1 + jmp_eval +ifelse + pop_a 1 + jmp_eval + +.o 4 0 +e_system_eaif + jsr_eval 0 + pushB_a 0 + pop_a 1 + jmp_false eaifelse + update_a 0 1 + pop_a 1 + jmp_eval_upd +eaifelse + pop_a 1 + jmp_eval_upd + +.n 0 _Nil +.o 1 0 +_hnf +.d 1 0 + rtn + +.n 0 EMPTY +.o 1 0 +_cycle_in_spine +.o 1 0 +_reserve + print "Run Time Warning: cycle in spine detected\n" + halt + +.descexp e_system_dseq e_system_nseq e_system_lseq 2 0 "seq" +.a 0 e_system_easeq +.o 2 0 +e_system_lseq + repl_args 1 1 +.o 2 0 +e_system_easeq + jsr_eval 0 + pop_a 1 + jmp_eval +.n 2 e_system_dseq _ +.o 1 0 +e_system_nseq + push_node _cycle_in_spine 2 + jsr_eval 0 + pop_a 1 + jsr_eval 0 + fill_a 0 1 + pop_a 1 +.d 1 0 + rtn + +|.n 0 EMPTY +|.o 1 0 +|_reserve +| setwait 0 +| suspend +|.d 1 0 +| rtn + +.o 0 0 +_hnf_reducer +.o 0 0 +_channel_code + halt +| jsr_eval 0 +| stop_reducer + +|.o 1 0 +|_nf_reduce: jsr_eval 0 +| get_node_arity 0 +| eqI_b 0 0 | check if arity is zero +| jmp_true _last1 +| push_b 0 | replace the node by +| push_b 0 +| repl_args_b | its arguments +|.o 0 1 i +|_reduce_args +| eqI_b 0 0 | check nr of args to do +| jmp_true _last +|.d 1 0 +| jsr _nf_reduce +|.o 0 0 +| decI +| jmp _reduce_args +|_last1: pop_a 1 +|_last: pop_b 1 +|.d 0 0 +| rtn + +|.o 0 0 +|_nf_reducer +|.d 1 0 +| jsr _nf_reduce +|.o 0 0 +| stop_reducer + +.o 0 0 +_type_error + print "Run Time Error: type error\n" + halt + +.o 0 0 +index_error + print "Run Time Error: index out of range\n" + halt + +.o 1 0 +_print_graph +.d 1 0 + jsr _print +.o 0 0 + print_sc "\n" +.d 0 0 + rtn + +.o 1 0 +_print + pushI 0 | push the bracket count +_continue_print + jsr_eval 0 +.o 1 1 i +_print2 + is_record 0 + jmp_true _print_record + eq_nulldesc _Tuple 0 + jmp_true _print_tuple + + get_node_arity 0 + eqI_b 0 0 + jmp_true _print_last + + eq_desc _Cons 2 0 + jmp_true _print_list + eq_desc ARRAY 1 0 + jmp_true _print_array + + print_sc "(" + print_symbol_sc 0 + push_b 0 + push_b 0 | replace the node by + repl_args_b | leave arity on b-stack +_print_args + print_sc " " + eqI_b 1 0 | check if last argument + jmp_true _print_last_arg +.d 1 0 + jsr _print +.o 0 0 + decI | decrease argument count + jmp _print_args +_print_last_arg + pop_b 1 | remove argument count + incI | increment bracket count + jmp _continue_print | optimised tail recursion! +_print_last + pop_b 1 | remove arity + eq_desc _Nil 0 0 + jmp_true _print_nil + eq_desc _ARRAY_ 0 0 + jmp_true _print__array_ + eq_desc _STRING_ 0 0 + jmp_true _print_char_array + + print_symbol_sc 0 + pop_a 1 | remove node +_print_brackets + eqI_b 0 0 | stop printing brackets if + jmp_true _exit_brackets | bracket count is zero + print_sc ")" + decI | decrement bracket count + jmp _print_brackets +_exit_brackets + pop_b 1 | remove bracket count +.d 0 0 + rtn + +_print_list + pop_b 1 + print_sc "[" +_print_rest_list + repl_args 2 2 +.d 1 0 + jsr _print +.o 0 0 + jsr_eval 0 + eq_desc _Nil 0 0 + jmp_true _print_last_list + print_sc "," + jmp _print_rest_list +_print_last_list + print_sc "]" + pop_a 1 + jmp _print_brackets + + + + +_print_unboxed_list + print_sc "[" + +_print_unboxed_list_lp0 + incI + push_r_arg_t + eqC_b 'R' 0 + updatepop_b 0 1 + jmp_true _print_ul_record + + push_t_r_args + +_print_unboxed_list_lp1 + incI + push_b 0 + push_r_arg_t +_print_unboxed_list_lp2 + eqC_b 'i' 0 + jmp_true _print_ul_integer + eqC_b 'c' 0 + jmp_true _print_ul_char + eqC_b 'r' 0 + jmp_true _print_ul_real + eqC_b 'b' 0 + jmp_true _print_ul_bool + eqC_b 'f' 0 + jmp_true _print_ul_file + eqC_b 'a' 0 + jmp_true _print_ul_graph + halt + +_print_ul_integer + pop_b 1 + push_b 1 + update_b 1 2 + updatepop_b 0 1 + + print_int + + jmp _print_rest_unboxed_list + +_print_ul_char + pop_b 1 + push_b 1 + update_b 1 2 + updatepop_b 0 1 + + print_sc "'" + print_char + print_sc "'" + + jmp _print_rest_unboxed_list + +_print_ul_real + pop_b 1 + push_b 2 + push_b 2 + update_b 2 4 + update_b 1 3 + updatepop_b 0 2 + + print_real + + jmp _print_rest_unboxed_list + +_print_ul_bool + pop_b 1 + push_b 1 + update_b 1 2 + updatepop_b 0 1 +.d 0 1 b + jsr _print_bool +.o 0 0 + jmp _print_rest_unboxed_list + +_print_ul_file + pop_b 1 + updatepop_b 0 2 + + print "File" + + jmp _print_rest_unboxed_list + +_print_ul_graph + pop_b 1 + + jsr_eval 0 + + pushI 0 +.d 1 1 i + jsr _print2 +.o 0 0 + jmp _print_rest_unboxed_list + +_print_rest_unboxed_list + incI + push_b 0 + push_r_arg_t + eqC_b 'a' 0 + jmp_false _print_ul_next_field + + push_b 1 + incI + push_r_arg_t + eqI_b 0 0 + updatepop_b 0 1 + jmp_false _print_ul_next_field + + pop_b 2 + + jsr_eval 0 + eq_desc _Nil 0 0 + jmp_true _print_last_unboxed_list + + print_sc "," + + push_t_r_a 0 + + push_b 0 + push_r_arg_t + eqC_b 'l' 0 + updatepop_b 0 1 + jmp_true _print_unboxed_list_lp0 + halt + +_print_last_unboxed_list + pop_a 1 + print_sc "]" + jmp _print_brackets + +_print_ul_next_field + eqC_b ',' 0 + jmp_true _print_ul_comma_next_field + eqC_b '(' 0 + jmp_true _print_ul_open_tuple_next_field + eqC_b ')' 0 + jmp_true _print_ul_close_tuple_next_field + print_sc " " + jmp _print_unboxed_list_lp2 + +_print_ul_open_tuple_next_field + pop_b 1 + print_sc " (" + jmp _print_ul_next_field_without_space + +_print_ul_comma_next_field + pop_b 1 + print_sc "," +_print_ul_next_field_without_space + incI + push_b 0 + push_r_arg_t + eqC_b '(' 0 + jmp_false _print_unboxed_list_lp2 + pop_b 1 + print_sc "(" + jmp _print_ul_next_field_without_space + +_print_ul_close_tuple_next_field + pop_b 1 + print_sc ")" + jmp _print_rest_unboxed_list + +_print_ul_record + pushD_a 0 +.d 0 1 i + jsr DtoAC +.o 1 0 + push_a 0 + pushI 2 + push_arraysize CHAR 0 1 + subI + pushI 2 +.d 1 2 ii + jsr sliceAC +.o 1 0 +.d 1 0 + jsr print_chars_sc +.o 0 0 + + print_sc " " + push_t_r_args + incI + jmp _print_ul_next_field_without_space + + +_print__array_ +.d 1 1 i + jmp _print__array2 + +_print_array + pop_b 1 + pushA_a 0 + update_a 0 1 + pop_a 1 +.o 1 1 i +_print__array + eq_desc _STRING_ 0 0 + jmp_true _print_char_array +_print__array2 + push_r_args_b 0 0 2 2 1 + + print_sc "{" + + push_b 0 + eq_desc_b BOOL 0 + jmp_true _print_bool_array + + push_b 0 + eq_desc_b INT 0 + jmp_true _print_int_array + + push_b 0 + eq_desc_b REAL 0 + jmp_true _print_real_array + + pushI 0 + + push_a 0 + push_arraysize _ 0 1 + + push_b 2 + update_b 2 3 + update_b 1 2 + update_b 0 1 + pop_b 1 + + pushI 0 + eqI + jmp_false _print_record_array + + jmp _print_array_lp2 +.o 1 2 i i +_print_array_lp1 + eqI_b 0 1 + jmp_true _no_comma_0 + print_sc "," +_no_comma_0 + push_b 1 + push_a 0 + select _ 0 1 +.d 1 0 + jsr _print +.o 0 0 + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_print_array_lp2 + eqI_b 0 0 + jmp_false _print_array_lp1 + pop_a 1 + pop_b 2 + print_sc "}" + jmp _print_brackets + +_print_record_array + jmp _print_record_array_lp2 +.o 1 2 i i +_print_record_array_lp1 + eqI_b 0 1 + jmp_true _no_comma_ar + print_sc "," +_no_comma_ar + push_r_args_b 0 0 2 2 1 + printD + + push_b 1 + push_a 0 + push_a_r_args + +_print_a_record_lp + push_b 0 + push_r_arg_t + eqI_b 0 0 + jmp_true _end_print_a_record + eqC_b ',' 0 + jmp_true _print_ar_tuple_comma + eqC_b ')' 0 + jmp_true _print_ar_close_tuple_char + print_sc " " +_print_a_record_lp__ + eqC_b 'r' 0 + jmp_true _print_ar_real + eqC_b 'i' 0 + jmp_true _print_ar_integer + eqC_b 'c' 0 + jmp_true _print_ar_char + eqC_b 'b' 0 + jmp_true _print_ar_bool + eqC_b 'f' 0 + jmp_true _print_ar_file + eqC_b 'a' 0 + jmp_true _print_ar_graph + eqC_b '(' 0 + jmp_true _print_ar_open_tuple_char + halt + +_print_ar_integer + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 + + print_int + + incI + jmp _print_a_record_lp + +_print_ar_char + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 + + print_sc "'" + print_char + print_sc "'" + + incI + jmp _print_a_record_lp + +_print_ar_real + pop_b 1 + push_b 2 + push_b 2 + update_b 2 4 + update_b 1 3 + update_b 0 2 + pop_b 2 + + print_real + + incI + jmp _print_a_record_lp + +_print_ar_bool + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 + jmp_true _print_ar_true + + print "False" + incI + jmp _print_a_record_lp + +_print_ar_true + print "True" + incI + jmp _print_a_record_lp + +_print_ar_file + pop_b 1 + update_b 0 2 + pop_b 2 + + print "File" + + incI + jmp _print_a_record_lp + +_print_ar_graph + pop_b 1 + + jsr_eval 0 + pushI 0 + eq_desc _ARRAY_ 0 0 + jmp_true _print_a_array +.d 1 1 i + jsr _print2 +.o 0 0 + incI + jmp _print_a_record_lp + +_print_a_array +.d 1 1 i + jsr _print__array +.o 0 0 + incI + jmp _print_a_record_lp + +_print_ar_open_tuple_char + pop_b 1 + incI + print_sc "(" +_print_ar_record_lp_no_space + push_b 0 + push_r_arg_t + eqC_b ')' 0 + jmp_true _print_ar_close_tuple_char + eqI_b 0 0 + jmp_false _print_a_record_lp__ + jmp _end_print_a_record + +_print_ar_tuple_comma + pop_b 1 + incI + print_sc "," + jmp _print_ar_record_lp_no_space + +_print_ar_close_tuple_char + pop_b 1 + incI + print_sc ")" + jmp _print_a_record_lp + +_end_print_a_record + pop_b 2 + + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_print_record_array_lp2 + eqI_b 0 0 + jmp_false _print_record_array_lp1 + pop_a 1 + pop_b 2 + print_sc "}" + jmp _print_brackets + +_print_char_array + print_sc "\"" +.d 1 0 + jsr print_string_ +.o 0 0 + print_sc "\"" + jmp _print_brackets + +_print_bool_array + pop_b 1 + pushI 0 + push_a 0 + push_arraysize BOOL 0 1 + jmp _print_bool_array_lp2 +.o 1 2 i i +_print_bool_array_lp1 + eqI_b 0 1 + jmp_true _no_comma_1 + print_sc "," +_no_comma_1 + push_b 1 + push_a 0 + select BOOL 0 1 +.d 0 1 b + jsr _print_bool +.o 0 0 + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_print_bool_array_lp2 + eqI_b 0 0 + jmp_false _print_bool_array_lp1 + + pop_a 1 + pop_b 2 + print_sc "}" + jmp _print_brackets + +_print_int_array + pop_b 1 + pushI 0 + push_a 0 + push_arraysize INT 0 1 + jmp _print_int_array_lp2 +.o 1 2 i i +_print_int_array_lp1 + eqI_b 0 1 + jmp_true _no_comma_2 + print_sc "," +_no_comma_2 + push_b 1 + push_a 0 + select INT 0 1 + print_int + + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_print_int_array_lp2 + eqI_b 0 0 + jmp_false _print_int_array_lp1 + + pop_a 1 + pop_b 2 + print_sc "}" + jmp _print_brackets + +_print_real_array + pop_b 1 + push_a 0 + pushI 0 + push_arraysize REAL 0 2 + jmp _print_real_array_lp2 +.o 1 2 i i +_print_real_array_lp1 + eqI_b 0 1 + jmp_true _no_comma_3 + print_sc "," +_no_comma_3 + push_b 1 + push_a 0 + select REAL 0 2 + + create + fillR_b 0 0 + pop_b 2 + print_symbol_sc 0 + pop_a 1 + + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_print_real_array_lp2 + eqI_b 0 0 + jmp_false _print_real_array_lp1 + pop_a 1 + pop_b 2 + print_sc "}" + jmp _print_brackets + +_print_nil + print_sc "[]" + pop_a 1 + jmp _print_brackets + +_print_tuple + print_sc "(" + get_node_arity 0 + push_b 0 + push_b 0 + repl_args_b +_print_rest_tuple +.d 1 0 + jsr _print +.o 0 0 + decI + eqI_b 0 0 + jmp_true _exit_print_tuple + print_sc "," + jmp _print_rest_tuple +_exit_print_tuple + pop_b 1 + print_sc ")" + jmp _print_brackets + +_print_record + push_t_r_a 0 + + push_b 0 + push_r_arg_t + eqC_b 'l' 0 + updatepop_b 0 1 + jmp_true _print_unboxed_list + + pop_b 1 + + print_sc "(" + print_symbol_sc 0 + + push_t_r_args + + push_b 0 + push_r_arg_t + eqC_b 'd' 0 + jmp_false _print_record_lp_ + + pop_b 1 + +_print_record_lp + incI + push_b 0 + push_r_arg_t +_print_record_lp_ + eqI_b 0 0 + jmp_true _end_print_record + eqC_b ',' 0 + jmp_true _print_tuple_comma + eqC_b ')' 0 + jmp_true _print_close_tuple_char + print_sc " " +_print_record_lp__ + eqC_b 'i' 0 + jmp_true _print_r_integer + eqC_b 'c' 0 + jmp_true _print_r_char + eqC_b 'r' 0 + jmp_true _print_r_real + eqC_b 'b' 0 + jmp_true _print_r_bool + eqC_b 'f' 0 + jmp_true _print_r_file + eqC_b 'a' 0 + jmp_true _print_r_graph + eqC_b '(' 0 + jmp_true _print_open_tuple_char + halt + +_print_r_integer + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 + + print_int + + jmp _print_record_lp + +_print_r_char + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 + + print_sc "'" + print_char + print_sc "'" + + jmp _print_record_lp + +_print_r_real + pop_b 1 + push_b 2 + push_b 2 + update_b 2 4 + update_b 1 3 + update_b 0 2 + pop_b 2 + + print_real + + jmp _print_record_lp + +_print_r_bool + pop_b 1 + push_b 1 + update_b 1 2 + update_b 0 1 + pop_b 1 +.d 0 1 b + jsr _print_bool +.o 0 0 + jmp _print_record_lp + +.o 0 1 b +_print_bool + jmp_true _print_r_true + + print "False" +.d 0 0 + rtn +_print_r_true + print "True" +.d 0 0 + rtn + +_print_r_file + pop_b 1 + update_b 0 2 + pop_b 2 + + print "File" + + jmp _print_record_lp + +_print_r_graph + pop_b 1 + + jsr_eval 0 + eq_desc _ARRAY_ 0 0 + jmp_true _print_r_array + + push_b 0 + incI + push_r_arg_t + pushI 0 + eqI + jmp_true _print_last_record_arg + + pushI 0 +.d 1 1 i + jsr _print2 +.o 0 0 + jmp _print_record_lp + +_print_open_tuple_char + pop_b 1 + print_sc "(" +_print_record_lp_no_space + incI + push_b 0 + push_r_arg_t + eqC_b ')' 0 + jmp_true _print_close_tuple_char + eqI_b 0 0 + jmp_false _print_record_lp__ + jmp _end_print_record + +_print_tuple_comma + pop_b 1 + print_sc "," + jmp _print_record_lp_no_space + +_print_close_tuple_char + pop_b 1 + print_sc ")" + jmp _print_record_lp + +_print_last_record_arg + pop_b 1 + incI + jmp _print2 + +_print_r_array + pushI 0 +.d 1 1 i + jsr _print__array +.o 0 0 + jmp _print_record_lp + +_end_print_record + pop_b 2 + incI + jmp _print_brackets + +.o 1 0 +_eval_to_nf +.d 1 0 + jsr _eval +.o 0 0 +.d 0 0 + rtn + +.o 1 0 +_eval + pushI 0 | push the bracket count +_continue_eval + jsr_eval 0 +.o 1 1 i +_eval2 + is_record 0 + jmp_true _eval_record + eq_nulldesc _Tuple 0 + jmp_true _eval_tuple + + get_node_arity 0 + eqI_b 0 0 | check if arity is zero + jmp_true _eval_last + + eq_desc _Cons 2 0 + jmp_true _eval_list + eq_desc ARRAY 1 0 + jmp_true _eval_array + push_b 0 + push_b 0 | replace the node by + repl_args_b | leave arity on b-stack +_eval_args + eqI_b 1 0 | check if last argument + jmp_true _eval_last_arg +.d 1 0 + jsr _eval +.o 0 0 + decI | decrease argument count + jmp _eval_args +_eval_last_arg + pop_b 1 | remove argument count + incI | increment bracket count + jmp _continue_eval | optimised tail recursion! +_eval_last + pop_b 1 | remove arity + eq_desc _Nil 0 0 + jmp_true _eval_nil + eq_desc _ARRAY_ 0 0 + jmp_true _eval__array_ + pop_a 1 | remove node +_eval_brackets + eqI_b 0 0 + jmp_true _exit_eval_brackets | bracket count is zero + decI | decrement bracket count + jmp _eval_brackets +_exit_eval_brackets + pop_b 1 | remove bracket count +.d 0 0 + rtn + +_eval_list + pop_b 1 +_eval_rest_list + repl_args 2 2 +.d 1 0 + jsr _eval +.o 0 0 + jsr_eval 0 + eq_desc _Nil 0 0 + jmp_true _eval_last_list + jmp _eval_rest_list +_eval_last_list + pop_a 1 + jmp _eval_brackets + + +_eval_unboxed_list + pop_b 1 + jmp _eval_unboxed_list_ + +_eval_unboxed_list_lp0 + push_t_r_args + + push_b 0 + push_r_arg_t + eqC_b 'l' 0 + updatepop_b 0 1 + jmp_true _eval_unboxed_list_ + halt + +_eval_unboxed_list_ + push_b 0 + incI + push_r_arg_t + eqC_b 'R' 0 + updatepop_b 0 1 + jmp_false _eval_unboxed_list_lp1 + +_eval_ul_record + incI + +_eval_unboxed_list_lp1 + incI + push_b 0 + push_r_arg_t +_eval_ul_next_field +_eval_unboxed_list_lp2 + eqC_b 'i' 0 + jmp_true _eval_ul_int_char_or_bool + eqC_b 'c' 0 + jmp_true _eval_ul_int_char_or_bool + eqC_b 'r' 0 + jmp_true _eval_ul_real_or_file + eqC_b 'b' 0 + jmp_true _eval_ul_int_char_or_bool + eqC_b 'f' 0 + jmp_true _eval_ul_real_or_file + eqC_b 'a' 0 + jmp_true _eval_ul_graph + eqC_b '(' 0 + jmp_true _eval_ul_skip_char + eqC_b ',' 0 + jmp_true _eval_ul_skip_char + eqC_b ')' 0 + jmp_true _eval_ul_skip_char + halt + +_eval_ul_int_char_or_bool + pop_b 1 + updatepop_b 0 1 + jmp _eval_rest_unboxed_list + +_eval_ul_real_or_file + pop_b 1 + updatepop_b 0 2 + jmp _eval_rest_unboxed_list + +_eval_ul_graph + pop_b 1 + + jsr_eval 0 + + pushI 0 +.d 1 1 i + jsr _eval2 +.o 0 0 + jmp _eval_rest_unboxed_list + +_eval_ul_skip_char + pop_b 1 +_eval_rest_unboxed_list + incI + push_b 0 + push_r_arg_t + eqC_b 'a' 0 + jmp_false _eval_ul_next_field + + push_b 1 + incI + push_r_arg_t + eqI_b 0 0 + updatepop_b 0 1 + jmp_false _eval_ul_next_field + + pop_b 2 + + jsr_eval 0 + eq_desc _Nil 0 0 + jmp_false _eval_unboxed_list_lp0 + +_eval_last_unboxed_list + pop_a 1 + jmp _eval_brackets + + +_eval__array_ +.d 1 1 i + jmp _eval__array2 + +_eval_array + pop_b 1 + pushA_a 0 + update_a 0 1 + pop_a 1 +.o 1 1 i +_eval__array + eq_desc _STRING_ 0 0 + jmp_true _eval_char_array +_eval__array2 + push_r_args_b 0 0 2 2 1 + + push_b 0 + eq_desc_b BOOL 0 + jmp_true _eval_bool_array + + push_b 0 + eq_desc_b INT 0 + jmp_true _eval_int_array + + push_b 0 + eq_desc_b REAL 0 + jmp_true _eval_real_array + + pushI 0 + + push_a 0 + push_arraysize _ 0 1 + + push_b 2 + update_b 2 3 + update_b 1 2 + update_b 0 1 + pop_b 1 + + pushI 0 + eqI + jmp_false _eval_record_array + + jmp _eval_array_lp2 +.o 1 2 i i +_eval_array_lp1 + push_b 1 + push_a 0 + select _ 0 1 +.d 1 0 + jsr _eval +.o 0 0 + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_eval_array_lp2 + eqI_b 0 0 + jmp_false _eval_array_lp1 + pop_a 1 + pop_b 2 + jmp _eval_brackets + +_eval_record_array + jmp _eval_record_array_lp2 +.o 1 2 i i +_eval_record_array_lp1 + push_b 1 + push_a 0 + push_a_r_args + +_eval_a_record_lp + push_b 0 + push_r_arg_t + eqI_b 0 0 + jmp_true _end_eval_a_record + eqC_b 'i' 0 + jmp_true _eval_ar_integer + eqC_b 'c' 0 + jmp_true _eval_ar_char + eqC_b 'r' 0 + jmp_true _eval_ar_real + eqC_b 'b' 0 + jmp_true _eval_ar_bool + eqC_b 'f' 0 + jmp_true _eval_ar_file + eqC_b 'a' 0 + jmp_true _eval_ar_graph + eqC_b '(' 0 + jmp_true _eval_a_skip_char + eqC_b ',' 0 + jmp_true _eval_a_skip_char + eqC_b ')' 0 + jmp_true _eval_a_skip_char + halt + +_eval_ar_bool +_eval_ar_char +_eval_ar_integer + pop_b 1 + update_b 0 1 + pop_b 1 + + incI + jmp _eval_a_record_lp + +_eval_ar_file +_eval_ar_real + pop_b 1 + update_b 0 2 + pop_b 2 + + incI + jmp _eval_a_record_lp + +_eval_ar_graph + pop_b 1 + + jsr_eval 0 + pushI 0 + eq_desc _ARRAY_ 0 0 + jmp_true _eval_a_array +.d 1 1 i + jsr _eval2 +.o 0 0 + incI + jmp _eval_a_record_lp + +_eval_a_array +.d 1 1 i + jsr _eval__array +.o 0 0 + incI + jmp _eval_a_record_lp + +_eval_a_skip_char + pop_b 1 + incI + jmp _eval_a_record_lp + +_end_eval_a_record + pop_b 2 + + push_b 1 + incI + update_b 0 2 + pop_b 1 + decI +_eval_record_array_lp2 + eqI_b 0 0 + jmp_false _eval_record_array_lp1 + pop_a 1 + pop_b 2 + jmp _eval_brackets + +_eval_char_array + pop_a 1 + jmp _eval_brackets + +_eval_real_array +_eval_bool_array +_eval_int_array + pop_b 1 + pop_a 1 + jmp _eval_brackets + +_eval_nil + pop_a 1 + jmp _eval_brackets + +_eval_tuple + get_node_arity 0 + push_b 0 + push_b 0 + repl_args_b +_eval_rest_tuple +.d 1 0 + jsr _eval +.o 0 0 + decI + eqI_b 0 0 + jmp_true _exit_eval_tuple + jmp _eval_rest_tuple +_exit_eval_tuple + pop_b 1 + jmp _eval_brackets + +_eval_record + push_t_r_args + + push_b 0 + push_r_arg_t + eqC_b 'l' 0 + jmp_true _eval_unboxed_list + eqC_b 'd' 0 + jmp_false _eval_record_lp_ + + pop_b 1 + incI + +_eval_record_lp + push_b 0 + push_r_arg_t +_eval_record_lp_ + eqI_b 0 0 + jmp_true _end_eval_record + eqC_b 'r' 0 + jmp_true _eval_r_real + eqC_b 'i' 0 + jmp_true _eval_r_integer + eqC_b 'c' 0 + jmp_true _eval_r_char + eqC_b 'b' 0 + jmp_true _eval_r_bool + eqC_b 'f' 0 + jmp_true _eval_r_file + eqC_b 'a' 0 + jmp_true _eval_r_graph + eqC_b '(' 0 + jmp_true _eval_r_skip_char + eqC_b ',' 0 + jmp_true _eval_r_skip_char + eqC_b ')' 0 + jmp_true _eval_r_skip_char + halt + +_eval_r_char +_eval_r_bool +_eval_r_integer + pop_b 1 + update_b 0 1 + pop_b 1 + incI + jmp _eval_record_lp + +_eval_r_file +_eval_r_real + pop_b 1 + update_b 0 2 + pop_b 2 + incI + jmp _eval_record_lp + +_eval_r_graph + pop_b 1 + + jsr_eval 0 + eq_desc _ARRAY_ 0 0 + jmp_true _eval_r_array + + push_b 0 + incI + push_r_arg_t + pushI 0 + eqI + jmp_true _eval_last_record_arg + + pushI 0 +.d 1 1 i + jsr _eval2 +.o 0 0 + incI + jmp _eval_record_lp + +_eval_r_skip_char + pop_b 1 + incI + jmp _eval_record_lp + +_eval_last_record_arg + pop_b 1 + incI + jmp _eval2 + +_eval_r_array + pushI 0 +.d 1 1 i + jsr _eval__array +.o 0 0 + incI + jmp _eval_record_lp + +_end_eval_record + pop_b 2 + incI + jmp _eval_brackets + +.export d_Sel n_Sel + +.descn d_Sel n_Sel 1 0 "_Sel" +.pb "_Sel" +.n 1 d_Sel _ +.o 1 0 +n_Sel + push_node _ 1 + jsr_eval 0 + pop_a 1 + jmp_eval +.pe + +.export d_indirection n_indirection + +.descn d_indirection n_indirection 1 0 "_indirection" +.pb "_indirection" +.n -2 d_indirection ea_indirection +.o 1 0 +n_indirection + push_node _cycle_in_spine 1 + jsr_eval 0 + fill_a 0 1 + pop_a 1 +.d 1 0 + rtn + +.o 2 0 +ea_indirection + push_node _cycle_in_spine 1 + jsr_eval 0 + fill_a 0 1 + fill_a 0 2 +.keep 1 2 + pop_a 2 +.d 1 0 + rtn +.pe + diff --git a/cgopts.s b/cgopts.s new file mode 100644 index 0000000..1e02239 --- /dev/null +++ b/cgopts.s @@ -0,0 +1,15 @@ + .data + + .global ab_stack_size + .global flags + .global heap_size + .global heap_size_multiple + .global initial_heap_size + + .align + +ab_stack_size: .word 0x0007d000 @ 500k +flags: .word 0x00000008 @ (from clm.c) +heap_size: .word 0x00a00000 @ 10M +heap_size_multiple: .word 0x00019000 @ 100 << 10 (100k, from clm.c) +initial_heap_size: .word 0x00001400 @ 20 << 8 (from clm.c) diff --git a/test.icl b/test.icl new file mode 100644 index 0000000..92f7a54 --- /dev/null +++ b/test.icl @@ -0,0 +1,8 @@ +module test + +(+) infixl 6 :: !Int !Int -> Int +(+) a b = code inline { + addI +} + +Start = 10 + 20 |