aboutsummaryrefslogtreecommitdiff
path: root/Instructions.icl
diff options
context:
space:
mode:
authorCamil Staps2016-07-01 19:37:38 +0200
committerCamil Staps2016-07-01 19:37:38 +0200
commitb3f1e3ff0404a5182b6eed2d88014b4b4fbd69c2 (patch)
treec2dbd5b0a43fffc6119510bdc2f5324aa3a0e3b5 /Instructions.icl
parentAssembler (diff)
Moved to directory, added test program
Diffstat (limited to 'Instructions.icl')
-rw-r--r--Instructions.icl386
1 files changed, 0 insertions, 386 deletions
diff --git a/Instructions.icl b/Instructions.icl
deleted file mode 100644
index 6317972..0000000
--- a/Instructions.icl
+++ /dev/null
@@ -1,386 +0,0 @@
-implementation module ABC.Instructions
-
-import StdEnv
-
-import ABC.Machine
-import ABC.Misc
-
-int_desc :== 0
-bool_desc :== 1
-rnf_entry :== 1
-
-add_args :: ASrc NrArgs ADst State -> State
-add_args a_src nr_args a_dst st=:{astack,graphstore}
- = {st & astack=astack`, graphstore=graphstore`}
-where
- astack` = as_popn nr_args astack
- graphstore` = gs_update dstid (n_fill descid entry newargs) graphstore
- dstid = as_get a_dst astack
- srcid = as_get a_src astack
- node = gs_get srcid graphstore
- descid = n_descid node
- entry = n_entry node
- arity = n_arity node
- newargs = n_args node arity ++ as_topn nr_args astack
-
-create :: State -> State
-create st=:{astack,graphstore}
- = {st & astack=astack`, graphstore=graphstore`}
-where
- astack` = as_push nodeid astack
- (graphstore`,nodeid) = gs_newnode graphstore
-
-del_args :: ASrc NrArgs ADst State -> State
-del_args a_src nr_args a_dst st=:{astack,graphstore}
- = {st & astack=astack`, graphstore=graphstore`}
-where
- astack` = as_pushn newargs astack
- graphstore` = gs_update dstid (n_fill descid entry newargs) graphstore
- dstid = as_get a_dst astack
- srcid = as_get a_src astack
- node = gs_get srcid graphstore
- descid = n_descid node
- entry = n_entry node
- newargs = n_nargs node (arity - nr_args) arity
- arity = n_arity node
-
-dump :: String State -> State
-dump s st=:{io}
- = {st & io=io_print ("\n" <+ s <+ "\n" <+ st) io}
-
-eq_desc :: DescId ASrc State -> State
-eq_desc descid a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB equal bstack
- equal = n_eq_descid node descid
- node = gs_get nodeid graphstore
- nodeid = as_get a_src astack
-
-eq_desc_arity :: DescId Arity ASrc State -> State
-eq_desc_arity descid arity a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB equal bstack
- equal = n_eq_descid node descid && n_eq_arity node arity
- node = gs_get nodeid graphstore
- nodeid = as_get a_src astack
-
-eq_symbol :: ASrc ASrc State -> State
-eq_symbol a_src1 a_src2 st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB equal bstack
- equal = n_eq_symbol node1 node2
- (node1, node2) = (gs_get id1 graphstore, gs_get id2 graphstore)
- (id1, id2) = (as_get a_src1 astack, as_get a_src2 astack)
-
-eqB :: State -> State
-eqB st=:{bstack}
- = {st & bstack=bs_eqB bstack}
-
-eqB_a :: Bool ASrc State -> State
-eqB_a b a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB equal bstack
- equal = n_eq_B (gs_get nodeid graphstore) b
- nodeid = as_get a_src astack
-
-eqB_b :: Bool BSrc State -> State
-eqB_b b b_src st=:{bstack}
- = {st & bstack=bs_eqBi b b_src bstack}
-
-eqI :: State -> State
-eqI st=:{bstack}
- = {st & bstack=bs_eqI bstack}
-
-eqI_a :: Int ASrc State -> State
-eqI_a i a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB equal bstack
- equal = n_eq_I (gs_get nodeid graphstore) i
- nodeid = as_get a_src astack
-
-eqI_b :: Int BSrc State -> State
-eqI_b i b_src st=:{bstack}
- = {st & bstack=bs_eqIi i b_src bstack}
-
-fill :: DescId NrArgs InstrId ADst State -> State
-fill desc nr_args entry a_dst st=:{astack,graphstore}
- = {st & astack=astack`, graphstore=graphstore`}
-where
- astack` = as_popn nr_args astack
- graphstore` = gs_update nodeid (n_fill desc entry args) graphstore
- nodeid = as_get a_dst astack
- args = as_topn nr_args astack
-
-fill_a :: ASrc ADst State -> State
-fill_a a_src a_dst st=:{astack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid_dst (n_copy node_src) graphstore
- node_src = gs_get nodeid_src graphstore
- nodeid_dst = as_get a_dst astack
- nodeid_src = as_get a_src astack
-
-fillB :: Bool ADst State -> State
-fillB b a_dst st=:{astack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid (n_fillB bool_desc rnf_entry b) graphstore
- nodeid = as_get a_dst astack
-
-fillB_b :: BSrc ADst State -> State
-fillB_b b_src a_dst st=:{astack,bstack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid (n_fillB bool_desc rnf_entry b) graphstore
- b = bs_getB b_src bstack
- nodeid = as_get a_dst astack
-
-fillI :: Int ADst State -> State
-fillI i a_dst st=:{astack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid (n_fillI int_desc rnf_entry i) graphstore
- nodeid = as_get a_dst astack
-
-fillI_b :: BSrc ADst State -> State
-fillI_b b_src a_dst st=:{astack,bstack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid (n_fillI int_desc rnf_entry i) graphstore
- i = bs_getI b_src bstack
- nodeid = as_get a_dst astack
-
-get_desc_arity :: ASrc State -> State
-get_desc_arity a_src st=:{astack,bstack,descstore,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushI arity bstack
- arity = d_arity (ds_get descid descstore)
- descid = n_descid (gs_get nodeid graphstore)
- nodeid = as_get a_src astack
-
-get_node_arity :: ASrc State -> State
-get_node_arity a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushI arity bstack
- arity = n_arity (gs_get nodeid graphstore)
- nodeid = as_get a_src astack
-
-halt :: State -> State
-halt st=:{pc}
- = {st & pc=pc_halt pc}
-
-jmp :: InstrId State -> State
-jmp addr st
- = {st & pc=addr}
-
-jmp_eval :: State -> State
-jmp_eval st=:{astack,graphstore}
- = {st & pc=pc`}
-where
- pc` = n_entry (gs_get nodeid graphstore)
- nodeid = as_get 0 astack
-
-jmp_false :: InstrId State -> State
-jmp_false addr st=:{bstack,pc}
- = {st & bstack=bstack`, pc=pc`}
-where
- pc` = if (not b) addr pc
- b = bs_getB 0 bstack
- bstack` = bs_popn 1 bstack
-
-jmp_true :: InstrId State -> State
-jmp_true addr st=:{bstack,pc}
- = {st & bstack=bstack`, pc=pc`}
-where
- pc` = if b addr pc
- b = bs_getB 0 bstack
- bstack` = bs_popn 1 bstack
-
-jsr :: InstrId State -> State
-jsr addr st=:{cstack,pc}
- = {st & cstack=cstack`, pc=pc`}
-where
- pc` = addr
- cstack` = cs_push pc cstack
-
-jsr_eval :: State -> State
-jsr_eval st=:{astack,cstack,graphstore,pc}
- = {st & cstack=cstack`, pc=pc`}
-where
- pc` = n_entry (gs_get nodeid graphstore)
- nodeid = as_get 0 astack
- cstack` = cs_push pc cstack
-
-no_op :: State -> State
-no_op st = st
-
-pop_a :: NrArgs State -> State
-pop_a n st=:{astack}
- = {st & astack=as_popn n astack}
-
-pop_b :: NrArgs State -> State
-pop_b n st=:{bstack}
- = {st & bstack=bs_popn n bstack}
-
-print :: String State -> State
-print s st=:{io}
- = {st & io=io_print s io}
-
-print_symbol :: ASrc State -> State
-print_symbol a_src st=:{astack,descstore,graphstore,io}
- = {st & io=io`}
-where
- io` = io_print string io
- string = show_node node desc
- desc = ds_get (n_descid node) descstore
- node = gs_get nodeid graphstore
- nodeid = as_get a_src astack
-
-push_a :: ASrc State -> State
-push_a a_src st=:{astack}
- = {st & astack=as_push (as_get a_src astack) astack}
-
-push_ap_entry :: ASrc State -> State
-push_ap_entry a_src st=:{astack,cstack,descstore,graphstore}
- = {st & cstack=cstack`}
-where
- cstack` = cs_push (d_ap_entry (ds_get descid descstore)) cstack
- descid = n_descid (gs_get nodeid graphstore)
- nodeid = as_get a_src astack
-
-push_arg :: ASrc Arity ArgNr State -> State
-push_arg a_src arity arg_nr st=:{astack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_push arg astack
- arg = n_arg (gs_get nodeid graphstore) arg_nr arity
- nodeid = as_get a_src astack
-
-push_arg_b :: ASrc State -> State
-push_arg_b a_src st=:{astack,bstack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_push arg astack
- arg = n_arg (gs_get nodeid graphstore) arg_nr arity
- nodeid = as_get a_src astack
- arg_nr = bs_getI 0 bstack
- arity = bs_getI 1 bstack
-
-push_args :: ASrc Arity NrArgs State -> State
-push_args a_src arity nr_args st=:{astack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_pushn args astack
- args = n_nargs (gs_get nodeid graphstore) nr_args arity
- nodeid = as_get a_src astack
-
-push_args_b :: ASrc State -> State
-push_args_b a_src st=:{astack,bstack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_pushn args astack
- args = n_nargs (gs_get nodeid graphstore) nargs arity
- nargs = bs_getI 0 bstack
- nodeid = as_get a_src astack
- arity = bs_getI 1 bstack
-
-push_b :: BSrc State -> State
-push_b b_src st=:{bstack}
- = {st & bstack=bs_push (bs_get b_src bstack) bstack}
-
-pushB :: Bool State -> State
-pushB b st=:{bstack}
- = {st & bstack=bs_pushB b bstack}
-
-pushB_a :: ASrc State -> State
-pushB_a a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushB b bstack
- b = n_B (gs_get nodeid graphstore)
- nodeid = as_get a_src astack
-
-pushI :: Int State -> State
-pushI i st=:{bstack}
- = {st & bstack=bs_pushI i bstack}
-
-pushI_a :: ASrc State -> State
-pushI_a a_src st=:{astack,bstack,graphstore}
- = {st & bstack=bstack`}
-where
- bstack` = bs_pushI i bstack
- i = n_I (gs_get nodeid graphstore)
- nodeid = as_get a_src astack
-
-repl_args :: Arity NrArgs State -> State
-repl_args arity nr_args st=:{astack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_pushn args (as_popn 1 astack)
- args = n_nargs (gs_get nodeid graphstore) nr_args arity
- nodeid = as_get 0 astack
-
-repl_args_b :: State -> State
-repl_args_b st=:{astack,bstack,graphstore}
- = {st & astack=astack`}
-where
- astack` = as_pushn args (as_popn 1 astack)
- args = n_nargs (gs_get nodeid graphstore) nr_args arity
- nodeid = as_get 0 astack
- arity = bs_getI 0 bstack
- nr_args = bs_getI 1 bstack
-
-rtn :: State -> State
-rtn st=:{cstack}
- = {st & cstack=cs_popn 1 cstack, pc=cs_get 0 cstack}
-
-set_entry :: InstrId ADst State -> State
-set_entry entry a_dst st=:{astack,graphstore}
- = {st & graphstore=graphstore`}
-where
- graphstore` = gs_update nodeid (n_setentry entry) graphstore
- nodeid = as_get a_dst astack
-
-update_a :: ASrc ADst State -> State
-update_a a_src a_dst st=:{astack}
- = {st & astack=as_update a_dst (as_get a_src astack) astack}
-
-update_b :: BSrc BDst State -> State
-update_b b_src b_dst st=:{bstack}
- = {st & bstack=bs_update b_dst (bs_get b_src bstack) bstack}
-
-
-addI :: State -> State
-addI st=:{bstack}
- = {st & bstack=bs_addI bstack}
-
-decI :: State -> State
-decI st=:{bstack}
- = {st & bstack=bs_decI bstack}
-
-gtI :: State -> State
-gtI st=:{bstack}
- = {st & bstack=bs_gtI bstack}
-
-incI :: State -> State
-incI st=:{bstack}
- = {st & bstack=bs_incI bstack}
-
-ltI :: State -> State
-ltI st=:{bstack}
- = {st & bstack=bs_ltI bstack}
-
-mulI :: State -> State
-mulI st=:{bstack}
- = {st & bstack=bs_mulI bstack}
-
-subI :: State -> State
-subI st=:{bstack}
- = {st & bstack=bs_subI bstack}