Handle store and return_r.

This commit is contained in:
Erik Stenman 2019-02-15 08:21:58 +01:00
parent 27c9b50409
commit 65a806ed90
5 changed files with 41 additions and 1 deletions

View File

@ -100,6 +100,7 @@
-define('SHA3' , 16#65). -define('SHA3' , 16#65).
-define('SHA256' , 16#66). -define('SHA256' , 16#66).
-define('BLAKE2B' , 16#67). -define('BLAKE2B' , 16#67).
-define('RETURNR' , 16#68).
-define('FUNCTION' , 16#fe). -define('FUNCTION' , 16#fe).
-define('EXTEND' , 16#ff). -define('EXTEND' , 16#ff).

View File

@ -419,7 +419,7 @@ to_list_of_types(Tokens) ->
case to_type(Tokens) of case to_type(Tokens) of
{Type, [{',', _} | Rest]} -> {Type, [{',', _} | Rest]} ->
{MoreTypes, Rest2} = to_list_of_types(Rest), {MoreTypes, Rest2} = to_list_of_types(Rest),
{[Type|MoreTypes], Rest2} {[Type|MoreTypes], Rest2};
{Type, [{']', _} | Rest]} -> {Type, [{']', _} | Rest]} ->
{[Type], Rest} {[Type], Rest}
end. end.

View File

@ -26,6 +26,7 @@ a : {token, {stack, TokenLine, 0}}.
a{INT} : {token, {stack, TokenLine, parse_acc(TokenChars)}}. a{INT} : {token, {stack, TokenLine, parse_acc(TokenChars)}}.
RETURN : {token, {mnemonic, TokenLine, 'RETURN'}}. RETURN : {token, {mnemonic, TokenLine, 'RETURN'}}.
RETURNR : {token, {mnemonic, TokenLine, 'RETURNR'}}.
CALL : {token, {mnemonic, TokenLine, 'CALL'}}. CALL : {token, {mnemonic, TokenLine, 'CALL'}}.
FUNCTION : {token, {function, TokenLine, 'FUNCTION' }}. FUNCTION : {token, {function, TokenLine, 'FUNCTION' }}.
NOP : {token, {mnemonic, TokenLine, 'NOP'}}. NOP : {token, {mnemonic, TokenLine, 'NOP'}}.

View File

@ -26,6 +26,7 @@ opcode({comment,X}) -> ?COMMENT(X).
mnemonic(?NOP) -> 'NOP' ; mnemonic(?NOP) -> 'NOP' ;
mnemonic(?RETURN) -> 'RETURN' ; mnemonic(?RETURN) -> 'RETURN' ;
mnemonic(?RETURNR) -> 'RETURNR' ;
mnemonic(?PUSH) -> 'PUSH' ; mnemonic(?PUSH) -> 'PUSH' ;
mnemonic(?JUMP) -> 'JUMP' ; mnemonic(?JUMP) -> 'JUMP' ;
mnemonic(?JUMPIF) -> 'JUMPIF' ; mnemonic(?JUMPIF) -> 'JUMPIF' ;
@ -49,11 +50,13 @@ mnemonic(?EGT) -> 'EGT' ;
mnemonic(?ELT) -> 'ELT' ; mnemonic(?ELT) -> 'ELT' ;
mnemonic(?EQ) -> 'EQ' ; mnemonic(?EQ) -> 'EQ' ;
mnemonic(?NEQ) -> 'NEQ' ; mnemonic(?NEQ) -> 'NEQ' ;
mnemonic(?STORE) -> 'STORE' ;
mnemonic(OP) -> {OP, nothandled}. mnemonic(OP) -> {OP, nothandled}.
m_to_op('NOP') -> ?NOP ; m_to_op('NOP') -> ?NOP ;
m_to_op('COMMENT') -> ?COMMENT("") ; m_to_op('COMMENT') -> ?COMMENT("") ;
m_to_op('RETURN') -> ?RETURN ; m_to_op('RETURN') -> ?RETURN ;
m_to_op('RETURNR') -> ?RETURNR ;
m_to_op('PUSH') -> ?PUSH ; m_to_op('PUSH') -> ?PUSH ;
m_to_op('JUMP') -> ?JUMP ; m_to_op('JUMP') -> ?JUMP ;
m_to_op('JUMPIF') -> ?JUMPIF ; m_to_op('JUMPIF') -> ?JUMPIF ;
@ -73,6 +76,7 @@ m_to_op('ELT') -> ?ELT ;
m_to_op('EGT') -> ?EGT ; m_to_op('EGT') -> ?EGT ;
m_to_op('EQ') -> ?EQ ; m_to_op('EQ') -> ?EQ ;
m_to_op('NEQ') -> ?NEQ ; m_to_op('NEQ') -> ?NEQ ;
m_to_op('STORE') -> ?STORE ;
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 ;
@ -82,6 +86,7 @@ args(?NOP) -> 0;
args(?RETURN) -> 0; args(?RETURN) -> 0;
args(?INC) -> 0; args(?INC) -> 0;
args(?RETURNR) -> 1;
args(?PUSH) -> 1; args(?PUSH) -> 1;
args(?JUMP) -> 1; args(?JUMP) -> 1;
args(?CALL) -> 1; args(?CALL) -> 1;
@ -91,6 +96,7 @@ args(?JUMPIF) -> 2;
args(?CALL_R) -> 2; args(?CALL_R) -> 2;
args(?CALL_TR) -> 2; args(?CALL_TR) -> 2;
args(?NOT) -> 2; args(?NOT) -> 2;
args(?STORE) -> 2;
args(?ADD) -> 3; args(?ADD) -> 3;
args(?SUB) -> 3; args(?SUB) -> 3;
@ -109,6 +115,7 @@ args(?NEQ) -> 3;
args(_) -> 0. %% TODO do not allow this args(_) -> 0. %% TODO do not allow this
end_bb(?RETURN) -> true; end_bb(?RETURN) -> true;
end_bb(?RETURNR)-> true;
end_bb(?JUMP) -> true; end_bb(?JUMP) -> true;
end_bb(?JUMPIF) -> true; end_bb(?JUMPIF) -> true;
end_bb(?CALL) -> true; end_bb(?CALL) -> true;

31
test/asm_code/memory.fate Normal file
View File

@ -0,0 +1,31 @@
;; CONTRACT memory
FUNCTION call(integer):integer
STORE var1 arg0
PUSH 0
CALL write
PUSH var1
RETURN
FUNCTION write(integer):integer
STORE var1 arg0
RETURNR var1
FUNCTION dest_add(integer, integer): integer
STORE var1 arg0
STORE var2 arg1
ADD var3 var1 var2
PUSH var3
RETURN
FUNCTION dest_add_imm(integer):integer
STORE var1 arg0
ADD var3 var1 2
PUSH var3
RETURN
FUNCTION dest_add_stack(integer, integer): integer
STORE var1 arg0
PUSH arg1
ADD var3 var1 a
PUSH var3
RETURN