$ erlc -S test.erl
- 1024
Xregisters Yregister
Registers X, Y are represented like this:
| 5 bit tag: | 27 bit value |
|---|
The tags are 3=X, 4=Y, 5=r, 6=Literal
CP
- "Continuation Pointer" - return address
PC
- "Program Counter" - next instruction to be executed
- test
- move
{move, Src, Dest}
64 is the opcode for "move", 0x18000000 is the encoding of argument that means register {x, 0}
- gc_bif
- call
{call, Arity, {f, N}}
- set
P=N, CP=Next- jumps to label
N- arguments are stored in X0 ~ Xn
- return
- does
PC=CP- return value is stored in X0
- receive
- allocate
- deallocate
{deallocate, N}
- create and remove stack frames.
- there also exists
{allocate_zero, Ny, Ng}-NyY registers
- label
{label, N}
- Nth label in the module
- function
{function, Name, Arity, LabelID}
- defines a function
- bif
{bif, FuncAtom, {f, 0}, [], {x, 0}}
- calls, ?
- gc_bif
{gc_bif, '*', {f, A}, N1, [R1, R2, R3]}
- jumps to a function named
'*'- multiply R1 and R2, and set the result into R3. If any failure occurs jump to
A. If GC is triggered include N1 X registers starting at X0 in the root set for GC.
- send
send.
- sends the data in
X0?
- loop_rec
{loop_rec, {f, N}, {x, 0}}
- receive clause starts here, till
loop_rec_end
- wait_timeout
{wait_timeout, {f, N}, {integer, T}} - test
{test, is_eq_exact, {f, N}, [{x,0}, {atom, foo}]} remove_message.
No other timing than when a call or receive instruction is executed, check a reduction counter.
beam_lib:chunks("hw.beam", [abstract_code]),
- instruction set? genop.tab
- source code - beam_emu.c
- erlang vm opcodes: beam_opcodes.erl
- Joe Armsgrong, Deconstructing the BEAM , 2012.
- The Erlang BEAM Virtual Machine Specification
- File format for Beam R5 and later
- The Evolution of the Erlang VM
- A Guide to the Erlang Source