gmbytecode/src/aefa_opcodes.erl
2019-02-15 09:28:04 +01:00

157 lines
4.7 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @copyright (C) 2019, Aeternity Anstalt
%%% @doc
%%% Opcodes
%%% @end
%%%-------------------------------------------------------------------
-module(aefa_opcodes).
-export([ args/1
, end_bb/1
, mnemonic/1
, m_to_op/1
, opcode/1
]).
-include_lib("aebytecode/include/aefa_opcodes.hrl").
%%====================================================================
%% API
%%====================================================================
opcode(X) when X >= 0, X =< 255 -> X;
opcode({comment,X}) -> ?COMMENT(X).
mnemonic(?NOP) -> 'NOP' ;
mnemonic(?RETURN) -> 'RETURN' ;
mnemonic(?RETURNR) -> 'RETURNR' ;
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' ;
mnemonic(?LT) -> 'LT' ;
mnemonic(?GT) -> 'GT' ;
mnemonic(?EGT) -> 'EGT' ;
mnemonic(?ELT) -> 'ELT' ;
mnemonic(?EQ) -> 'EQ' ;
mnemonic(?NEQ) -> 'NEQ' ;
mnemonic(?STORE) -> 'STORE' ;
mnemonic(?TUPLE) -> 'TUPLE' ;
mnemonic(?ELEMENT) -> 'ELEMENT' ;
mnemonic(?MAP_EMPTY) -> 'MAP_EMPTY' ;
mnemonic(?MAP_UPDATE) -> 'MAP_UPDATE' ;
mnemonic(?MAP_DELETE) -> 'MAP_DELETE' ;
mnemonic(?MAP_MEMBER) -> 'MAP_MEMBER' ;
mnemonic(?MAP_LOOKUP) -> 'MAP_LOOKUP' ;
mnemonic(?MAP_LOOKUPD) -> 'MAP_LOOKUPD';
mnemonic(?MAP_FROM_LIST)->'MAP_FROM_LIST' ;
mnemonic(OP) -> {OP, nothandled}.
m_to_op('NOP') -> ?NOP ;
m_to_op('COMMENT') -> ?COMMENT("") ;
m_to_op('RETURN') -> ?RETURN ;
m_to_op('RETURNR') -> ?RETURNR ;
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 ;
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('STORE') -> ?STORE ;
m_to_op('TUPLE') -> ?TUPLE ;
m_to_op('ELEMENT') -> ?ELEMENT ;
m_to_op('MAP_EMPTY') -> ?MAP_EMPTY ;
m_to_op('MAP_UPDATE') -> ?MAP_UPDATE ;
m_to_op('MAP_DELETE') -> ?MAP_DELETE ;
m_to_op('MAP_MEMBER') -> ?MAP_MEMBER ;
m_to_op('MAP_LOOKUP') -> ?MAP_LOOKUP ;
m_to_op('MAP_LOOKUPD') -> ?MAP_LOOKUPD ;
m_to_op('MAP_FROM_LIST')->?MAP_FROM_LIST ;
m_to_op('CALL') -> ?CALL ;
m_to_op('CALL_T') -> ?CALL_T ;
m_to_op('CALL_R') -> ?CALL_R ;
m_to_op('CALL_TR') -> ?CALL_TR .
args(?NOP) -> 0;
args(?RETURN) -> 0;
args(?INC) -> 0;
args(?RETURNR) -> 1;
args(?PUSH) -> 1;
args(?JUMP) -> 1;
args(?CALL) -> 1;
args(?CALL_T) -> 1;
args(?TUPLE) -> 1;
args(?MAP_EMPTY) -> 1;
args(?JUMPIF) -> 2;
args(?CALL_R) -> 2;
args(?CALL_TR) -> 2;
args(?NOT) -> 2;
args(?STORE) -> 2;
args(?MAP_FROM_LIST) -> 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;
args(?GT) -> 3;
args(?EGT) -> 3;
args(?ELT) -> 3;
args(?EQ) -> 3;
args(?NEQ) -> 3;
args(?MAP_MEMBER) -> 3;
args(?MAP_LOOKUP) -> 3;
args(?MAP_DELETE) -> 3;
args(?ELEMENT) -> 4;
args(?MAP_UPDATE) -> 4;
args(?MAP_LOOKUPD) -> 4;
args(_) -> 0. %% TODO do not allow this
end_bb(?RETURN) -> true;
end_bb(?RETURNR)-> true;
end_bb(?JUMP) -> true;
end_bb(?JUMPIF) -> true;
end_bb(?CALL) -> true;
end_bb(?CALL_T) -> true;
end_bb(?CALL_R) -> true;
end_bb(?CALL_TR)-> true;
end_bb(_) -> false.