diff --git a/include/aefa_opcodes.hrl b/include/aefa_opcodes.hrl index abc189e..a401c9f 100644 --- a/include/aefa_opcodes.hrl +++ b/include/aefa_opcodes.hrl @@ -100,6 +100,7 @@ -define('SHA3' , 16#65). -define('SHA256' , 16#66). -define('BLAKE2B' , 16#67). +-define('RETURNR' , 16#68). -define('FUNCTION' , 16#fe). -define('EXTEND' , 16#ff). diff --git a/src/aefa_asm.erl b/src/aefa_asm.erl index 0d6f1e9..0553af1 100644 --- a/src/aefa_asm.erl +++ b/src/aefa_asm.erl @@ -419,7 +419,7 @@ to_list_of_types(Tokens) -> case to_type(Tokens) of {Type, [{',', _} | Rest]} -> {MoreTypes, Rest2} = to_list_of_types(Rest), - {[Type|MoreTypes], Rest2} + {[Type|MoreTypes], Rest2}; {Type, [{']', _} | Rest]} -> {[Type], Rest} end. diff --git a/src/aefa_asm_scan.xrl b/src/aefa_asm_scan.xrl index 84168e5..2a6ea2a 100644 --- a/src/aefa_asm_scan.xrl +++ b/src/aefa_asm_scan.xrl @@ -26,6 +26,7 @@ a : {token, {stack, TokenLine, 0}}. a{INT} : {token, {stack, TokenLine, parse_acc(TokenChars)}}. RETURN : {token, {mnemonic, TokenLine, 'RETURN'}}. +RETURNR : {token, {mnemonic, TokenLine, 'RETURNR'}}. CALL : {token, {mnemonic, TokenLine, 'CALL'}}. FUNCTION : {token, {function, TokenLine, 'FUNCTION' }}. NOP : {token, {mnemonic, TokenLine, 'NOP'}}. diff --git a/src/aefa_opcodes.erl b/src/aefa_opcodes.erl index 89e44d4..0d4cc56 100644 --- a/src/aefa_opcodes.erl +++ b/src/aefa_opcodes.erl @@ -26,6 +26,7 @@ opcode({comment,X}) -> ?COMMENT(X). mnemonic(?NOP) -> 'NOP' ; mnemonic(?RETURN) -> 'RETURN' ; +mnemonic(?RETURNR) -> 'RETURNR' ; mnemonic(?PUSH) -> 'PUSH' ; mnemonic(?JUMP) -> 'JUMP' ; mnemonic(?JUMPIF) -> 'JUMPIF' ; @@ -49,11 +50,13 @@ mnemonic(?EGT) -> 'EGT' ; mnemonic(?ELT) -> 'ELT' ; mnemonic(?EQ) -> 'EQ' ; mnemonic(?NEQ) -> 'NEQ' ; +mnemonic(?STORE) -> 'STORE' ; mnemonic(OP) -> {OP, nothandled}. m_to_op('NOP') -> ?NOP ; m_to_op('COMMENT') -> ?COMMENT("") ; m_to_op('RETURN') -> ?RETURN ; +m_to_op('RETURNR') -> ?RETURNR ; m_to_op('PUSH') -> ?PUSH ; m_to_op('JUMP') -> ?JUMP ; m_to_op('JUMPIF') -> ?JUMPIF ; @@ -73,6 +76,7 @@ m_to_op('ELT') -> ?ELT ; m_to_op('EGT') -> ?EGT ; m_to_op('EQ') -> ?EQ ; m_to_op('NEQ') -> ?NEQ ; +m_to_op('STORE') -> ?STORE ; m_to_op('CALL') -> ?CALL ; m_to_op('CALL_T') -> ?CALL_T ; m_to_op('CALL_R') -> ?CALL_R ; @@ -82,6 +86,7 @@ args(?NOP) -> 0; args(?RETURN) -> 0; args(?INC) -> 0; +args(?RETURNR) -> 1; args(?PUSH) -> 1; args(?JUMP) -> 1; args(?CALL) -> 1; @@ -91,6 +96,7 @@ args(?JUMPIF) -> 2; args(?CALL_R) -> 2; args(?CALL_TR) -> 2; args(?NOT) -> 2; +args(?STORE) -> 2; args(?ADD) -> 3; args(?SUB) -> 3; @@ -109,6 +115,7 @@ args(?NEQ) -> 3; args(_) -> 0. %% TODO do not allow this end_bb(?RETURN) -> true; +end_bb(?RETURNR)-> true; end_bb(?JUMP) -> true; end_bb(?JUMPIF) -> true; end_bb(?CALL) -> true; diff --git a/test/asm_code/memory.fate b/test/asm_code/memory.fate new file mode 100644 index 0000000..e162daa --- /dev/null +++ b/test/asm_code/memory.fate @@ -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