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
|
||||
.rebar
|
||||
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,
|
||||
{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 ->
|
||||
<<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.
|
||||
|
||||
|
||||
|
@ -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, Data=<255 -> 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.
|
||||
|
||||
|
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
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user