Hanlde 3 and 4 arguments, and, or, not.
This commit is contained in:
parent
23ed6caf64
commit
d6e63219cb
3
.gitignore
vendored
3
.gitignore
vendored
@ -9,4 +9,5 @@ rel/example_project
|
|||||||
.concrete/DEV_MODE
|
.concrete/DEV_MODE
|
||||||
.rebar
|
.rebar
|
||||||
aeb_asm_scan.erl
|
aeb_asm_scan.erl
|
||||||
aefa_asm_scan.erl
|
aefa_asm_scan.erl
|
||||||
|
_build
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
14
test/asm_code/bool.fate
Normal 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
|
||||||
|
|
4
test/asm_code/remote.fate
Normal file
4
test/asm_code/remote.fate
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
;; CONTRACT remote
|
||||||
|
FUNCTION add_five(integer):integer
|
||||||
|
ADD a 5 arg0
|
||||||
|
RETURN
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user