diff --git a/include/aefa_opcodes.hrl b/include/aefa_opcodes.hrl index c52016e..abc189e 100644 --- a/include/aefa_opcodes.hrl +++ b/include/aefa_opcodes.hrl @@ -7,7 +7,7 @@ -define('CALL_T' , 16#04). -define('CALL_TR' , 16#05). -define('JUMP' , 16#06). --define('JUMPI' , 16#07). +-define('JUMPIF' , 16#07). -define('SWITCH' , 16#08). -define('PUSH' , 16#09). -define('DUP' , 16#0a). diff --git a/src/aefa_asm.erl b/src/aefa_asm.erl index bcf370d..0d6f1e9 100644 --- a/src/aefa_asm.erl +++ b/src/aefa_asm.erl @@ -217,7 +217,7 @@ deserialize_op(Op, Rest, Code) -> end. -serialize(#{functions := Functions} = Env) -> +serialize(#{functions := Functions} =_Env) -> Code = [[?FUNCTION, Name, serialize_signature(Sig), C] || {Name, {Sig, C}} <- maps:to_list(Functions)], serialize_code(lists:flatten(Code)). @@ -419,25 +419,13 @@ 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. -%% Also reverses the code (back to unreversed state). -resolve_refs([{ref, ID} | Rest], Env, Code) -> - Address = maps:get(ID, Env), - resolve_refs(Rest, Env, [Address | Code]); -resolve_refs([Op | Rest], Env, Code) -> - resolve_refs(Rest, Env, [Op | Code]); -resolve_refs([],_Env, Code) -> Code. - -expand_args([OP | Rest]) -> - [OP | expand_args(Rest)]; -expand_args([]) -> []. - insert_fun(none, [], Env) -> Env; insert_fun({Name, Type, RetType}, Code, #{functions := Functions} = Env) -> {Hash, Env2} = insert_symbol(Name, Env), diff --git a/src/aefa_asm_scan.xrl b/src/aefa_asm_scan.xrl index 50a2575..84168e5 100644 --- a/src/aefa_asm_scan.xrl +++ b/src/aefa_asm_scan.xrl @@ -34,7 +34,7 @@ CALL_R : {token, {mnemonic, TokenLine, 'CALL_R'}}. CALL_T : {token, {mnemonic, TokenLine, 'CALL_T'}}. CALL_TR : {token, {mnemonic, TokenLine, 'CALL_TR'}}. JUMP : {token, {mnemonic, TokenLine, 'JUMP'}}. -JUMPI : {token, {mnemonic, TokenLine, 'JUMPI'}}. +JUMPIF : {token, {mnemonic, TokenLine, 'JUMPIF'}}. SWITCH : {token, {mnemonic, TokenLine, 'SWITCH'}}. PUSH : {token, {mnemonic, TokenLine, 'PUSH'}}. diff --git a/src/aefa_opcodes.erl b/src/aefa_opcodes.erl index f63fee9..89e44d4 100644 --- a/src/aefa_opcodes.erl +++ b/src/aefa_opcodes.erl @@ -28,12 +28,18 @@ mnemonic(?NOP) -> 'NOP' ; mnemonic(?RETURN) -> 'RETURN' ; mnemonic(?PUSH) -> 'PUSH' ; mnemonic(?JUMP) -> 'JUMP' ; +mnemonic(?JUMPIF) -> 'JUMPIF' ; 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(?SUB) -> 'SUB' ; +mnemonic(?MUL) -> 'MUL' ; +mnemonic(?DIV) -> 'DIV' ; +mnemonic(?MOD) -> 'MOD' ; +mnemonic(?POW) -> 'POW' ; mnemonic(?AND) -> 'AND' ; mnemonic(?OR) -> 'OR' ; mnemonic(?NOT) -> 'NOT' ; @@ -50,8 +56,14 @@ m_to_op('COMMENT') -> ?COMMENT("") ; m_to_op('RETURN') -> ?RETURN ; m_to_op('PUSH') -> ?PUSH ; m_to_op('JUMP') -> ?JUMP ; +m_to_op('JUMPIF') -> ?JUMPIF ; m_to_op('INC') -> ?INC ; m_to_op('ADD') -> ?ADD ; +m_to_op('SUB') -> ?SUB ; +m_to_op('MUL') -> ?MUL ; +m_to_op('DIV') -> ?DIV ; +m_to_op('MOD') -> ?MOD ; +m_to_op('POW') -> ?POW ; m_to_op('AND') -> ?AND ; m_to_op('OR') -> ?OR ; m_to_op('NOT') -> ?NOT ; @@ -69,14 +81,23 @@ m_to_op('CALL_TR') -> ?CALL_TR . args(?NOP) -> 0; args(?RETURN) -> 0; args(?INC) -> 0; + args(?PUSH) -> 1; args(?JUMP) -> 1; args(?CALL) -> 1; args(?CALL_T) -> 1; + +args(?JUMPIF) -> 2; args(?CALL_R) -> 2; args(?CALL_TR) -> 2; args(?NOT) -> 2; + args(?ADD) -> 3; +args(?SUB) -> 3; +args(?MUL) -> 3; +args(?DIV) -> 3; +args(?MOD) -> 3; +args(?POW) -> 3; args(?AND) -> 3; args(?OR) -> 3; args(?LT) -> 3; @@ -89,6 +110,7 @@ args(_) -> 0. %% TODO do not allow this end_bb(?RETURN) -> true; end_bb(?JUMP) -> true; +end_bb(?JUMPIF) -> true; end_bb(?CALL) -> true; end_bb(?CALL_T) -> true; end_bb(?CALL_R) -> true;