Hanlde 3 and 4 arguments, and, or, not.

This commit is contained in:
Erik Stenman 2019-02-14 15:00:48 +01:00
parent 23ed6caf64
commit d6e63219cb
6 changed files with 80 additions and 13 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ rel/example_project
.rebar .rebar
aeb_asm_scan.erl aeb_asm_scan.erl
aefa_asm_scan.erl aefa_asm_scan.erl
_build

View File

@ -181,9 +181,39 @@ deserialize_op(Op, Rest, Code) ->
<<ArgType:8, Rest2/binary>> = Rest, <<ArgType:8, Rest2/binary>> = Rest,
{Arg0, Rest3} = aefa_encoding:deserialize_one(Rest2), {Arg0, Rest3} = aefa_encoding:deserialize_one(Rest2),
{Arg1, Rest4} = aefa_encoding:deserialize_one(Rest3), {Arg1, Rest4} = aefa_encoding:deserialize_one(Rest3),
Modifier = bits_to_modifier(ArgType band 2#11), Modifier0 = bits_to_modifier(ArgType band 2#11),
Modifier2 = bits_to_modifier((ArgType bsr 2) band 2#11), Modifier1 = bits_to_modifier((ArgType bsr 2) band 2#11),
{Rest4, [{OpName, {Modifier, Arg0}, {Modifier2, Arg1}} | Code]} {Rest4, [{OpName, {Modifier0, Arg0},
{Modifier1, Arg1}} | Code]};
3 ->
<<ArgType:8, Rest2/binary>> = 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 ->
<<ArgType:8, Rest2/binary>> = 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. end.

View File

@ -32,6 +32,11 @@ mnemonic(?INC) -> 'INC' ;
mnemonic(?CALL) -> 'CALL' ; mnemonic(?CALL) -> 'CALL' ;
mnemonic(?CALL_T) -> 'CALL_T' ; mnemonic(?CALL_T) -> 'CALL_T' ;
mnemonic(?CALL_R) -> 'CALL_R' ; 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(OP) -> {OP, nothandled} ;
mnemonic({comment,_}) -> 'COMMENT' . mnemonic({comment,_}) -> 'COMMENT' .
@ -41,19 +46,28 @@ m_to_op('RETURN') -> ?RETURN ;
m_to_op('PUSH') -> ?PUSH ; m_to_op('PUSH') -> ?PUSH ;
m_to_op('JUMP') -> ?JUMP ; m_to_op('JUMP') -> ?JUMP ;
m_to_op('INC') -> ?INC ; 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') -> ?CALL ;
m_to_op('CALL_T') -> ?CALL_T ; m_to_op('CALL_T') -> ?CALL_T ;
m_to_op('CALL_R') -> ?CALL_R ; m_to_op('CALL_R') -> ?CALL_R ;
m_to_op(Data) when 0=<Data, Data=<255 -> Data. m_to_op('CALL_TR') -> ?CALL_TR .
args(?NOP) -> 0; args(?NOP) -> 0;
args(?RETURN) -> 0; args(?RETURN) -> 0;
args(?PUSH) -> 1; args(?INC) -> 0;
args(?JUMP) -> 1; args(?PUSH) -> 1;
args(?INC) -> 0; args(?JUMP) -> 1;
args(?CALL) -> 1; args(?CALL) -> 1;
args(?CALL_T) -> 1; args(?CALL_T) -> 1;
args(?CALL_R) -> 2; 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 args(_) -> 0. %% TODO do not allow this
end_bb(?RETURN) -> true; end_bb(?RETURN) -> true;
@ -61,5 +75,6 @@ end_bb(?JUMP) -> true;
end_bb(?CALL) -> true; end_bb(?CALL) -> true;
end_bb(?CALL_T) -> true; end_bb(?CALL_T) -> true;
end_bb(?CALL_R) -> true; end_bb(?CALL_R) -> true;
end_bb(?CALL_TR)-> true;
end_bb(_) -> false. end_bb(_) -> false.

14
test/asm_code/bool.fate Normal file
View File

@ -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

View File

@ -0,0 +1,4 @@
;; CONTRACT remote
FUNCTION add_five(integer):integer
ADD a 5 arg0
RETURN

View File

@ -34,6 +34,9 @@ FUNCTION remote_call(integer) : integer
INC INC
RETURN RETURN
FUNCTION remote_tailcall(integer) : integer
PUSH arg0
CALL_TR remote add_five
;; Test the code from the shell ;; Test the code from the shell
;; _build/default/rel/aessembler/bin/aessembler console ;; _build/default/rel/aessembler/bin/aessembler console