Instruction set

(zero)             ; implemented
(drop)             ; implemented

(getlocal idx)     ; implemented
(setlocal idx)     ; implemented

(getglobal idx)    ; implemented
(setglobal idx)    ; implemented

(getconst idx)     ; implemented

(call:func func_idx nargs)     ; implemented
(call:ext ext_func_idx)        ; implemented
(ret nvals)                    ; implemented
(ret:void)
(jmp offs16)                   ; implemented
(jz  offs16)                   ; implemented

; arithmetic, logic, comparisons -- for now implemented with call:ext
(add)
(sub)
(mul)
(div)

(lt)
(gt)

; arrays?
(getelem)
(setelem)

ISA optimization opportunities

(we are not doing any of these as we want to minimize amount of implementation code to avoid ossification (at least for now))

  • (const N) (add N) for 8-bit constants
  • (one) (two)
  • (dup)
  • (getlocal) could always be referenced to stack pointer if we keep track of temporaries during compilation
  • (getlocal:N) (getconst:N) (setlocal:N) for low values of N

Stack layout

Stack layout for function call

Locals
Temporaries
Args --> become first N locals of called function

Function entry:

old_frame->pc = pc
old_frame->fp = fp
fp = sp - func->argc
sp += num_locals

Function return:

ret_val = STACK[--sp]
sp -= func->num_locals + func->argc
STACK[sp++] = ret_val
fp = old_frame->fp