Handle comp ops.
This commit is contained in:
parent
d6e63219cb
commit
56a2553698
@ -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);
|
||||||
|
@ -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
26
test/asm_code/comp.fate
Normal 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
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user