diff --git a/src/aefa_asm.erl b/src/aefa_asm.erl index 7cc45c9..bcf370d 100644 --- a/src/aefa_asm.erl +++ b/src/aefa_asm.erl @@ -218,8 +218,6 @@ deserialize_op(Op, Rest, Code) -> serialize(#{functions := Functions} = Env) -> - %% TODO: add serialization of immediates - %% TODO: add serialization of function definitions Code = [[?FUNCTION, Name, serialize_signature(Sig), C] || {Name, {Sig, C}} <- maps:to_list(Functions)], serialize_code(lists:flatten(Code)). @@ -236,7 +234,6 @@ serialize(#{functions := Functions} = Env) -> %% 10 : varN %% 11 : immediate -%% TODO: serialize complex immediates serialize_code([ {Arg0Type, Arg0} , {Arg1Type, Arg1} , {Arg2Type, Arg2} @@ -357,7 +354,6 @@ to_bytecode([{function,_line, 'FUNCTION'}|Rest], Address, Env, Code, Opts) -> to_bytecode(Rest2, Fun, Env2, [], Opts); to_bytecode([{mnemonic,_line, Op}|Rest], Address, Env, Code, Opts) -> OpCode = aefa_opcodes:m_to_op(Op), - %% TODO: arguments to_bytecode(Rest, Address, Env, [OpCode|Code], Opts); to_bytecode([{arg,_line, N}|Rest], Address, Env, Code, Opts) -> to_bytecode(Rest, Address, Env, [{arg, N}|Code], Opts); diff --git a/src/aefa_opcodes.erl b/src/aefa_opcodes.erl index 22223e7..f63fee9 100644 --- a/src/aefa_opcodes.erl +++ b/src/aefa_opcodes.erl @@ -37,8 +37,13 @@ mnemonic(?ADD) -> 'ADD' ; mnemonic(?AND) -> 'AND' ; mnemonic(?OR) -> 'OR' ; mnemonic(?NOT) -> 'NOT' ; -mnemonic(OP) -> {OP, nothandled} ; -mnemonic({comment,_}) -> 'COMMENT' . +mnemonic(?LT) -> 'LT' ; +mnemonic(?GT) -> 'GT' ; +mnemonic(?EGT) -> 'EGT' ; +mnemonic(?ELT) -> 'ELT' ; +mnemonic(?EQ) -> 'EQ' ; +mnemonic(?NEQ) -> 'NEQ' ; +mnemonic(OP) -> {OP, nothandled}. m_to_op('NOP') -> ?NOP ; m_to_op('COMMENT') -> ?COMMENT("") ; @@ -50,6 +55,12 @@ m_to_op('ADD') -> ?ADD ; m_to_op('AND') -> ?AND ; m_to_op('OR') -> ?OR ; m_to_op('NOT') -> ?NOT ; +m_to_op('LT') -> ?LT ; +m_to_op('GT') -> ?GT ; +m_to_op('ELT') -> ?ELT ; +m_to_op('EGT') -> ?EGT ; +m_to_op('EQ') -> ?EQ ; +m_to_op('NEQ') -> ?NEQ ; m_to_op('CALL') -> ?CALL ; m_to_op('CALL_T') -> ?CALL_T ; m_to_op('CALL_R') -> ?CALL_R ; @@ -68,6 +79,12 @@ args(?NOT) -> 2; args(?ADD) -> 3; args(?AND) -> 3; args(?OR) -> 3; +args(?LT) -> 3; +args(?GT) -> 3; +args(?EGT) -> 3; +args(?ELT) -> 3; +args(?EQ) -> 3; +args(?NEQ) -> 3; args(_) -> 0. %% TODO do not allow this end_bb(?RETURN) -> true; diff --git a/test/asm_code/comp.fate b/test/asm_code/comp.fate new file mode 100644 index 0000000..b3f8345 --- /dev/null +++ b/test/asm_code/comp.fate @@ -0,0 +1,26 @@ +;; CONTRACT comp + +FUNCTION lt(integer, integer) : boolean + LT a arg0 arg1 + RETURN + +FUNCTION gt(integer, integer) : boolean + GT a arg0 arg1 + RETURN + +FUNCTION egt(integer, integer) : boolean + EGT a arg0 arg1 + RETURN + +FUNCTION elt(integer, integer) : boolean + ELT a arg0 arg1 + RETURN + +FUNCTION eq(integer, integer) : boolean + EQ a arg0 arg1 + RETURN + +FUNCTION neq(integer, integer) : boolean + NEQ a arg0 arg1 + RETURN +