Erlang VM Opcodes

The Opcodes of Erlang’s emulator BEAM are listed as follow:

-spec opname(1..152) -> {atom(),0..8}.

opname(1) -> {label,1};
opname(2) -> {func_info,3};
opname(3) -> {int_code_end,0};
opname(4) -> {call,2};
opname(5) -> {call_last,3};
opname(6) -> {call_only,2};
opname(7) -> {call_ext,2};
opname(8) -> {call_ext_last,3};
opname(9) -> {bif0,2};
opname(10) -> {bif1,4};
opname(11) -> {bif2,5};
opname(12) -> {allocate,2};
opname(13) -> {allocate_heap,3};
opname(14) -> {allocate_zero,2};
opname(15) -> {allocate_heap_zero,3};
opname(16) -> {test_heap,2};
opname(17) -> {init,1};
opname(18) -> {deallocate,1};
opname(19) -> {return,0};
opname(20) -> {send,0};
opname(21) -> {remove_message,0};
opname(22) -> {timeout,0};
opname(23) -> {loop_rec,2};
opname(24) -> {loop_rec_end,1};
opname(25) -> {wait,1};
opname(26) -> {wait_timeout,2};
opname(27) -> {m_plus,4};
opname(28) -> {m_minus,4};
opname(29) -> {m_times,4};
opname(30) -> {m_div,4};
opname(31) -> {int_div,4};
opname(32) -> {int_rem,4};
opname(33) -> {int_band,4};
opname(34) -> {int_bor,4};
opname(35) -> {int_bxor,4};
opname(36) -> {int_bsl,4};
opname(37) -> {int_bsr,4};
opname(38) -> {int_bnot,3};
opname(39) -> {is_lt,3};
opname(40) -> {is_ge,3};
opname(41) -> {is_eq,3};
opname(42) -> {is_ne,3};
opname(43) -> {is_eq_exact,3};
opname(44) -> {is_ne_exact,3};
opname(45) -> {is_integer,2};
opname(46) -> {is_float,2};
opname(47) -> {is_number,2};
opname(48) -> {is_atom,2};
opname(49) -> {is_pid,2};
opname(50) -> {is_reference,2};
opname(51) -> {is_port,2};
opname(52) -> {is_nil,2};
opname(53) -> {is_binary,2};
opname(54) -> {is_constant,2};
opname(55) -> {is_list,2};
opname(56) -> {is_nonempty_list,2};
opname(57) -> {is_tuple,2};
opname(58) -> {test_arity,3};
opname(59) -> {select_val,3};
opname(60) -> {select_tuple_arity,3};
opname(61) -> {jump,1};
opname(62) -> {‘catch’,2};
opname(63) -> {catch_end,1};
opname(64) -> {move,2};
opname(65) -> {get_list,3};
opname(66) -> {get_tuple_element,3};
opname(67) -> {set_tuple_element,3};
opname(68) -> {put_string,3};
opname(69) -> {put_list,3};
opname(70) -> {put_tuple,2};
opname(71) -> {put,1};
opname(72) -> {badmatch,1};
opname(73) -> {if_end,0};
opname(74) -> {case_end,1};
opname(75) -> {call_fun,1};
opname(76) -> {make_fun,3};
opname(77) -> {is_function,2};
opname(78) -> {call_ext_only,2};
opname(79) -> {bs_start_match,2};
opname(80) -> {bs_get_integer,5};
opname(81) -> {bs_get_float,5};
opname(82) -> {bs_get_binary,5};
opname(83) -> {bs_skip_bits,4};
opname(84) -> {bs_test_tail,2};
opname(85) -> {bs_save,1};
opname(86) -> {bs_restore,1};
opname(87) -> {bs_init,2};
opname(88) -> {bs_final,2};
opname(89) -> {bs_put_integer,5};
opname(90) -> {bs_put_binary,5};
opname(91) -> {bs_put_float,5};
opname(92) -> {bs_put_string,2};
opname(93) -> {bs_need_buf,1};
opname(94) -> {fclearerror,0};
opname(95) -> {fcheckerror,1};
opname(96) -> {fmove,2};
opname(97) -> {fconv,2};
opname(98) -> {fadd,4};
opname(99) -> {fsub,4};
opname(100) -> {fmul,4};
opname(101) -> {fdiv,4};
opname(102) -> {fnegate,3};
opname(103) -> {make_fun2,1};
opname(104) -> {‘try’,2};
opname(105) -> {try_end,1};
opname(106) -> {try_case,1};
opname(107) -> {try_case_end,1};
opname(108) -> {raise,2};
opname(109) -> {bs_init2,6};
opname(110) -> {bs_bits_to_bytes,3};
opname(111) -> {bs_add,5};
opname(112) -> {apply,1};
opname(113) -> {apply_last,2};
opname(114) -> {is_boolean,2};
opname(115) -> {is_function2,3};
opname(116) -> {bs_start_match2,5};
opname(117) -> {bs_get_integer2,7};
opname(118) -> {bs_get_float2,7};
opname(119) -> {bs_get_binary2,7};
opname(120) -> {bs_skip_bits2,5};
opname(121) -> {bs_test_tail2,3};
opname(122) -> {bs_save2,2};
opname(123) -> {bs_restore2,2};
opname(124) -> {gc_bif1,5};
opname(125) -> {gc_bif2,6};
opname(126) -> {bs_final2,2};
opname(127) -> {bs_bits_to_bytes2,2};
opname(128) -> {put_literal,2};
opname(129) -> {is_bitstr,2};
opname(130) -> {bs_context_to_binary,1};
opname(131) -> {bs_test_unit,3};
opname(132) -> {bs_match_string,4};
opname(133) -> {bs_init_writable,0};
opname(134) -> {bs_append,8};
opname(135) -> {bs_private_append,6};
opname(136) -> {trim,2};
opname(137) -> {bs_init_bits,6};
opname(138) -> {bs_get_utf8,5};
opname(139) -> {bs_skip_utf8,4};
opname(140) -> {bs_get_utf16,5};
opname(141) -> {bs_skip_utf16,4};
opname(142) -> {bs_get_utf32,5};
opname(143) -> {bs_skip_utf32,4};
opname(144) -> {bs_utf8_size,3};
opname(145) -> {bs_put_utf8,3};
opname(146) -> {bs_utf16_size,3};
opname(147) -> {bs_put_utf16,3};
opname(148) -> {bs_put_utf32,3};
opname(149) -> {on_load,0};
opname(150) -> {recv_mark,1};
opname(151) -> {recv_set,1};
opname(152) -> {gc_bif3,7};
opname(Number) -> erlang:error(badarg, [Number]).

(Refer to: otp_src_R14B01/lib/compiler/src/beam_opcodes.erl)

You may compile an erlang source file into BEAM assembly code.
The erlc option  +’S’  does this job. For example:

  $ erlc “+’S’” foo.erl
  $ ls
  foo.erl  foo.S

About these ads
This entry was posted in erlang and tagged . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s