Handle comp ops.

This commit is contained in:
Erik Stenman 2019-02-14 15:20:49 +01:00
parent d6e63219cb
commit 56a2553698
3 changed files with 45 additions and 6 deletions

View File

@ -218,8 +218,6 @@ deserialize_op(Op, Rest, Code) ->
serialize(#{functions := Functions} = Env) -> serialize(#{functions := Functions} = Env) ->
%% TODO: add serialization of immediates
%% TODO: add serialization of function definitions
Code = [[?FUNCTION, Name, serialize_signature(Sig), C] || Code = [[?FUNCTION, Name, serialize_signature(Sig), C] ||
{Name, {Sig, C}} <- maps:to_list(Functions)], {Name, {Sig, C}} <- maps:to_list(Functions)],
serialize_code(lists:flatten(Code)). serialize_code(lists:flatten(Code)).
@ -236,7 +234,6 @@ serialize(#{functions := Functions} = Env) ->
%% 10 : varN %% 10 : varN
%% 11 : immediate %% 11 : immediate
%% TODO: serialize complex immediates
serialize_code([ {Arg0Type, Arg0} serialize_code([ {Arg0Type, Arg0}
, {Arg1Type, Arg1} , {Arg1Type, Arg1}
, {Arg2Type, Arg2} , {Arg2Type, Arg2}
@ -357,7 +354,6 @@ to_bytecode([{function,_line, 'FUNCTION'}|Rest], Address, Env, Code, Opts) ->
to_bytecode(Rest2, Fun, Env2, [], Opts); to_bytecode(Rest2, Fun, Env2, [], Opts);
to_bytecode([{mnemonic,_line, Op}|Rest], Address, Env, Code, Opts) -> to_bytecode([{mnemonic,_line, Op}|Rest], Address, Env, Code, Opts) ->
OpCode = aefa_opcodes:m_to_op(Op), OpCode = aefa_opcodes:m_to_op(Op),
%% TODO: arguments
to_bytecode(Rest, Address, Env, [OpCode|Code], Opts); to_bytecode(Rest, Address, Env, [OpCode|Code], Opts);
to_bytecode([{arg,_line, N}|Rest], Address, Env, Code, Opts) -> to_bytecode([{arg,_line, N}|Rest], Address, Env, Code, Opts) ->
to_bytecode(Rest, Address, Env, [{arg, N}|Code], Opts); to_bytecode(Rest, Address, Env, [{arg, N}|Code], Opts);

View File

@ -37,8 +37,13 @@ mnemonic(?ADD) -> 'ADD' ;
mnemonic(?AND) -> 'AND' ; mnemonic(?AND) -> 'AND' ;
mnemonic(?OR) -> 'OR' ; mnemonic(?OR) -> 'OR' ;
mnemonic(?NOT) -> 'NOT' ; mnemonic(?NOT) -> 'NOT' ;
mnemonic(OP) -> {OP, nothandled} ; mnemonic(?LT) -> 'LT' ;
mnemonic({comment,_}) -> 'COMMENT' . 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('NOP') -> ?NOP ;
m_to_op('COMMENT') -> ?COMMENT("") ; m_to_op('COMMENT') -> ?COMMENT("") ;
@ -50,6 +55,12 @@ m_to_op('ADD') -> ?ADD ;
m_to_op('AND') -> ?AND ; m_to_op('AND') -> ?AND ;
m_to_op('OR') -> ?OR ; m_to_op('OR') -> ?OR ;
m_to_op('NOT') -> ?NOT ; 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') -> ?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 ;
@ -68,6 +79,12 @@ args(?NOT) -> 2;
args(?ADD) -> 3; args(?ADD) -> 3;
args(?AND) -> 3; args(?AND) -> 3;
args(?OR) -> 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 args(_) -> 0. %% TODO do not allow this
end_bb(?RETURN) -> true; end_bb(?RETURN) -> true;

26
test/asm_code/comp.fate Normal file
View File

@ -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