diff --git a/.gitignore b/.gitignore index d18405b..ed38920 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ rel/example_project .concrete/DEV_MODE .rebar aeb_asm_scan.erl -aefa_asm_scan.erl \ No newline at end of file +aefa_asm_scan.erl +_build \ No newline at end of file diff --git a/src/aefa_asm.erl b/src/aefa_asm.erl index 50f9718..7cc45c9 100644 --- a/src/aefa_asm.erl +++ b/src/aefa_asm.erl @@ -181,9 +181,39 @@ deserialize_op(Op, Rest, Code) -> <> = Rest, {Arg0, Rest3} = aefa_encoding:deserialize_one(Rest2), {Arg1, Rest4} = aefa_encoding:deserialize_one(Rest3), - Modifier = bits_to_modifier(ArgType band 2#11), - Modifier2 = bits_to_modifier((ArgType bsr 2) band 2#11), - {Rest4, [{OpName, {Modifier, Arg0}, {Modifier2, Arg1}} | Code]} + Modifier0 = bits_to_modifier(ArgType band 2#11), + Modifier1 = bits_to_modifier((ArgType bsr 2) band 2#11), + {Rest4, [{OpName, {Modifier0, Arg0}, + {Modifier1, Arg1}} | Code]}; + 3 -> + <> = Rest, + {Arg0, Rest3} = aefa_encoding:deserialize_one(Rest2), + {Arg1, Rest4} = aefa_encoding:deserialize_one(Rest3), + {Arg2, Rest5} = aefa_encoding:deserialize_one(Rest4), + Modifier0 = bits_to_modifier(ArgType band 2#11), + Modifier1 = bits_to_modifier((ArgType bsr 2) band 2#11), + Modifier2 = bits_to_modifier((ArgType bsr 4) band 2#11), + {Rest5, [{ OpName + , {Modifier0, Arg0} + , {Modifier1, Arg1} + , {Modifier2, Arg2}} + | Code]}; + 4 -> + <> = Rest, + {Arg0, Rest3} = aefa_encoding:deserialize_one(Rest2), + {Arg1, Rest4} = aefa_encoding:deserialize_one(Rest3), + {Arg2, Rest5} = aefa_encoding:deserialize_one(Rest4), + {Arg3, Rest6} = aefa_encoding:deserialize_one(Rest5), + Modifier0 = bits_to_modifier(ArgType band 2#11), + Modifier1 = bits_to_modifier((ArgType bsr 2) band 2#11), + Modifier2 = bits_to_modifier((ArgType bsr 4) band 2#11), + Modifier3 = bits_to_modifier((ArgType bsr 6) band 2#11), + {Rest6, [{ OpName + , {Modifier0, Arg0} + , {Modifier1, Arg1} + , {Modifier2, Arg2} + , {Modifier3, Arg3}} + | Code]} end. diff --git a/src/aefa_opcodes.erl b/src/aefa_opcodes.erl index e1d26ea..22223e7 100644 --- a/src/aefa_opcodes.erl +++ b/src/aefa_opcodes.erl @@ -32,6 +32,11 @@ mnemonic(?INC) -> 'INC' ; mnemonic(?CALL) -> 'CALL' ; mnemonic(?CALL_T) -> 'CALL_T' ; mnemonic(?CALL_R) -> 'CALL_R' ; +mnemonic(?CALL_TR) -> 'CALL_TR' ; +mnemonic(?ADD) -> 'ADD' ; +mnemonic(?AND) -> 'AND' ; +mnemonic(?OR) -> 'OR' ; +mnemonic(?NOT) -> 'NOT' ; mnemonic(OP) -> {OP, nothandled} ; mnemonic({comment,_}) -> 'COMMENT' . @@ -41,19 +46,28 @@ m_to_op('RETURN') -> ?RETURN ; m_to_op('PUSH') -> ?PUSH ; m_to_op('JUMP') -> ?JUMP ; m_to_op('INC') -> ?INC ; +m_to_op('ADD') -> ?ADD ; +m_to_op('AND') -> ?AND ; +m_to_op('OR') -> ?OR ; +m_to_op('NOT') -> ?NOT ; m_to_op('CALL') -> ?CALL ; m_to_op('CALL_T') -> ?CALL_T ; m_to_op('CALL_R') -> ?CALL_R ; -m_to_op(Data) when 0= Data. +m_to_op('CALL_TR') -> ?CALL_TR . -args(?NOP) -> 0; -args(?RETURN) -> 0; -args(?PUSH) -> 1; -args(?JUMP) -> 1; -args(?INC) -> 0; -args(?CALL) -> 1; -args(?CALL_T) -> 1; -args(?CALL_R) -> 2; +args(?NOP) -> 0; +args(?RETURN) -> 0; +args(?INC) -> 0; +args(?PUSH) -> 1; +args(?JUMP) -> 1; +args(?CALL) -> 1; +args(?CALL_T) -> 1; +args(?CALL_R) -> 2; +args(?CALL_TR) -> 2; +args(?NOT) -> 2; +args(?ADD) -> 3; +args(?AND) -> 3; +args(?OR) -> 3; args(_) -> 0. %% TODO do not allow this end_bb(?RETURN) -> true; @@ -61,5 +75,6 @@ end_bb(?JUMP) -> true; end_bb(?CALL) -> true; end_bb(?CALL_T) -> true; end_bb(?CALL_R) -> true; +end_bb(?CALL_TR)-> true; end_bb(_) -> false. diff --git a/test/asm_code/bool.fate b/test/asm_code/bool.fate new file mode 100644 index 0000000..d12d881 --- /dev/null +++ b/test/asm_code/bool.fate @@ -0,0 +1,14 @@ +;; CONTRACT bool + +FUNCTION and(boolean, boolean) : boolean + AND a arg0 arg1 + RETURN + +FUNCTION or(boolean, boolean) : boolean + OR a arg0 arg1 + RETURN + +FUNCTION not(boolean) : boolean + NOT a arg0 + RETURN + diff --git a/test/asm_code/remote.fate b/test/asm_code/remote.fate new file mode 100644 index 0000000..5ad09ea --- /dev/null +++ b/test/asm_code/remote.fate @@ -0,0 +1,4 @@ +;; CONTRACT remote +FUNCTION add_five(integer):integer + ADD a 5 arg0 + RETURN diff --git a/test/asm_code/test.fate b/test/asm_code/test.fate index 1cd6b20..294e0c8 100644 --- a/test/asm_code/test.fate +++ b/test/asm_code/test.fate @@ -34,6 +34,9 @@ FUNCTION remote_call(integer) : integer INC RETURN +FUNCTION remote_tailcall(integer) : integer + PUSH arg0 + CALL_TR remote add_five ;; Test the code from the shell ;; _build/default/rel/aessembler/bin/aessembler console