Next: The Assembler and Up: Integrating Abstract Machines: Previous: Hash TablesJump

Defining Assembler Instructions

In the GAMA, new assembler instructions for an arbitrary abstract machine are defined with definstr. definstr expects a COMMON LISP argument list, a type specification for these arguments, and the COMMON LISP code defining the instruction.

The following example shows the definition of the LLAMA instruction push-constant:

(definstr push-constant (c) (CONST)
  :standard (ll.push-constant
             (stack-push (constant c))))

ll.push-constant is the name of the COMMON LISP function corresponding to the push-constant instruction. The keyword :standard declares push-constant to be a simple instruction. The next example shows a non-standard instruction for which more than one COMMON LISP definition is needed:

(definstr ll-call (proc) (LABEL)
  :static  (
            (stack-push (reg P))
            (set-reg P proc))
  :dynamic (
            (stack-push (reg P))
            (set-reg P (gmem.get proc))))

All instructions expecting a label can be used in two different ways: statically and dynamically. In the dynamic version, the address corresponding to the label is an entry in a jump table: an additional gmem.get is needed to dereference it. The static version does not use a jump table entry but directly uses the real address: dereferencing is not needed. It is used for procedures which will not be changed (like those in the prelude).

Harold Boley & Michael Sintek (