157 lines
4.7 KiB
Erlang
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.
|
|
|