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) ->
|
||||
%% 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);
|
||||
|
@ -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;
|
||||
|
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