Merge branch 'stable-2.0'
[bpt/guile.git] / doc / ref / vm.texi
CommitLineData
8680d53b
AW
1@c -*-texinfo-*-
2@c This is part of the GNU Guile Reference Manual.
747bd534 3@c Copyright (C) 2008,2009,2010,2011,2013
8680d53b
AW
4@c Free Software Foundation, Inc.
5@c See the file guile.texi for copying conditions.
6
7@node A Virtual Machine for Guile
8@section A Virtual Machine for Guile
9
f11871d6
AW
10Guile has both an interpreter and a compiler. To a user, the difference
11is transparent---interpreted and compiled procedures can call each other
12as they please.
090d51ed
AW
13
14The difference is that the compiler creates and interprets bytecode
15for a custom virtual machine, instead of interpreting the
98850fd7
AW
16S-expressions directly. Loading and running compiled code is faster
17than loading and running source code.
090d51ed
AW
18
19The virtual machine that does the bytecode interpretation is a part of
20Guile itself. This section describes the nature of Guile's virtual
21machine.
22
8680d53b
AW
23@menu
24* Why a VM?::
25* VM Concepts::
26* Stack Layout::
27* Variables and the VM::
00ce5125 28* VM Programs::
1f6f591d 29* Object File Format::
8680d53b
AW
30* Instruction Set::
31@end menu
32
33@node Why a VM?
34@subsection Why a VM?
35
86872cc3 36@cindex interpreter
f11871d6
AW
37For a long time, Guile only had an interpreter. Guile's interpreter
38operated directly on the S-expression representation of Scheme source
39code.
090d51ed 40
f11871d6 41But while the interpreter was highly optimized and hand-tuned, it still
9e9745b3 42performed many needless computations during the course of evaluating an
e3ba263d 43expression. For example, application of a function to arguments
f11871d6
AW
44needlessly consed up the arguments in a list. Evaluation of an
45expression always had to figure out what the car of the expression is --
46a procedure, a memoized form, or something else. All values have to be
47allocated on the heap. Et cetera.
090d51ed 48
f11871d6 49The solution to this problem was to compile the higher-level language,
090d51ed 50Scheme, into a lower-level language for which all of the checks and
86872cc3 51dispatching have already been done---the code is instead stripped to
090d51ed
AW
52the bare minimum needed to ``do the job''.
53
54The question becomes then, what low-level language to choose? There
55are many options. We could compile to native code directly, but that
56poses portability problems for Guile, as it is a highly cross-platform
57project.
58
59So we want the performance gains that compilation provides, but we
60also want to maintain the portability benefits of a single code path.
61The obvious solution is to compile to a virtual machine that is
62present on all Guile installations.
63
64The easiest (and most fun) way to depend on a virtual machine is to
65implement the virtual machine within Guile itself. This way the
66virtual machine provides what Scheme needs (tail calls, multiple
86872cc3
AW
67values, @code{call/cc}) and can provide optimized inline instructions
68for Guile (@code{cons}, @code{struct-ref}, etc.).
090d51ed
AW
69
70So this is what Guile does. The rest of this section describes that VM
71that Guile implements, and the compiled procedures that run on it.
72
f11871d6
AW
73Before moving on, though, we should note that though we spoke of the
74interpreter in the past tense, Guile still has an interpreter. The
75difference is that before, it was Guile's main evaluator, and so was
76implemented in highly optimized C; now, it is actually implemented in
77Scheme, and compiled down to VM bytecode, just like any other program.
78(There is still a C interpreter around, used to bootstrap the compiler,
79but it is not normally used at runtime.)
80
81The upside of implementing the interpreter in Scheme is that we preserve
82tail calls and multiple-value handling between interpreted and compiled
23e2e780 83code. The downside is that the interpreter in Guile 2.2 is still slower
0c81a0c1 84than the interpreter in 1.8. We hope the that the compiler's speed makes
23e2e780
AW
85up for the loss. In any case, once we have native compilation for
86Scheme code, we expect the new self-hosted interpreter to beat the old
87hand-tuned C implementation.
f11871d6
AW
88
89Also note that this decision to implement a bytecode compiler does not
090d51ed
AW
90preclude native compilation. We can compile from bytecode to native
91code at runtime, or even do ahead of time compilation. More
86872cc3 92possibilities are discussed in @ref{Extending the Compiler}.
8680d53b
AW
93
94@node VM Concepts
95@subsection VM Concepts
96
23e2e780
AW
97Compiled code is run by a virtual machine (VM). Each thread has its own
98VM. The virtual machine executes the sequence of instructions in a
99procedure.
8680d53b 100
23e2e780
AW
101Each VM instruction starts by indicating which operation it is, and then
102follows by encoding its source and destination operands. Each procedure
103declares that it has some number of local variables, including the
104function arguments. These local variables form the available operands
105of the procedure, and are accessed by index.
8680d53b 106
23e2e780
AW
107The local variables for a procedure are stored on a stack. Calling a
108procedure typically enlarges the stack, and returning from a procedure
109shrinks it. Stack memory is exclusive to the virtual machine that owns
110it.
8680d53b 111
23e2e780
AW
112In addition to their stacks, virtual machines also have access to the
113global memory (modules, global bindings, etc) that is shared among other
114parts of Guile, including other VMs.
8680d53b
AW
115
116The registers that a VM has are as follows:
117
118@itemize
119@item ip - Instruction pointer
120@item sp - Stack pointer
121@item fp - Frame pointer
122@end itemize
123
23e2e780
AW
124In other architectures, the instruction pointer is sometimes called the
125``program counter'' (pc). This set of registers is pretty typical for
126virtual machines; their exact meanings in the context of Guile's VM are
127described in the next section.
81fd3152 128
8680d53b
AW
129@node Stack Layout
130@subsection Stack Layout
131
23e2e780
AW
132The stack of Guile's virtual machine is composed of @dfn{frames}. Each
133frame corresponds to the application of one compiled procedure, and
134contains storage space for arguments, local variables, and some
135bookkeeping information (such as what to do after the frame is
136finished).
8680d53b
AW
137
138While the compiler is free to do whatever it wants to, as long as the
139semantics of a computation are preserved, in practice every time you
140call a function, a new frame is created. (The notable exception of
141course is the tail call case, @pxref{Tail Calls}.)
142
23e2e780 143The structure of the top stack frame is as follows:
8680d53b
AW
144
145@example
23e2e780
AW
146 /------------------\ <- top of stack
147 | Local N-1 | <- sp
8274228f 148 | ... |
23e2e780
AW
149 | Local 1 |
150 | Local 0 | <- fp = SCM_FRAME_LOCALS_ADDRESS (fp)
8274228f 151 +==================+
8274228f 152 | Return address |
23e2e780 153 | Dynamic link | <- fp - 2 = SCM_FRAME_LOWER_ADDRESS (fp)
8274228f 154 +==================+
23e2e780 155 | | <- fp - 3 = SCM_FRAME_PREVIOUS_SP (fp)
8680d53b
AW
156@end example
157
23e2e780
AW
158In the above drawing, the stack grows upward. Usually the procedure
159being applied is in local 0, followed by the arguments from local 1.
160After that are enough slots to store the various lexically-bound and
161temporary values that are needed in the function's application.
162
163The @dfn{return address} is the @code{ip} that was in effect before this
164program was applied. When we return from this activation frame, we will
165jump back to this @code{ip}. Likewise, the @dfn{dynamic link} is the
166@code{fp} in effect before this program was applied.
167
168To prepare for a non-tail application, Guile's VM will emit code that
169shuffles the function to apply and its arguments into appropriate stack
170slots, with two free slots below them. The call then initializes those
171free slots with the current @code{ip} and @code{fp}, and updates
172@code{ip} to point to the function entry, and @code{fp} to point to the
173new call frame.
174
175In this way, the dynamic link links the current frame to the previous
176frame. Computing a stack trace involves traversing these frames.
8680d53b
AW
177
178@node Variables and the VM
179@subsection Variables and the VM
180
81fd3152 181Consider the following Scheme code as an example:
8680d53b
AW
182
183@example
184 (define (foo a)
185 (lambda (b) (list foo a b)))
186@end example
187
23e2e780
AW
188Within the lambda expression, @code{foo} is a top-level variable,
189@code{a} is a lexically captured variable, and @code{b} is a local
190variable.
98850fd7 191
23e2e780
AW
192Another way to refer to @code{a} and @code{b} is to say that @code{a} is
193a ``free'' variable, since it is not defined within the lambda, and
98850fd7 194@code{b} is a ``bound'' variable. These are the terms used in the
23e2e780
AW
195@dfn{lambda calculus}, a mathematical notation for describing functions.
196The lambda calculus is useful because it is a language in which to
197reason precisely about functions and variables. It is especially good
198at describing scope relations, and it is for that reason that we mention
199it here.
98850fd7
AW
200
201Guile allocates all variables on the stack. When a lexically enclosed
f11871d6
AW
202procedure with free variables---a @dfn{closure}---is created, it copies
203those variables into its free variable vector. References to free
98850fd7
AW
204variables are then redirected through the free variable vector.
205
206If a variable is ever @code{set!}, however, it will need to be
207heap-allocated instead of stack-allocated, so that different closures
208that capture the same variable can see the same value. Also, this
209allows continuations to capture a reference to the variable, instead
210of to its value at one point in time. For these reasons, @code{set!}
211variables are allocated in ``boxes''---actually, in variable cells.
212@xref{Variables}, for more information. References to @code{set!}
213variables are indirected through the boxes.
214
215Thus perhaps counterintuitively, what would seem ``closer to the
216metal'', viz @code{set!}, actually forces an extra memory allocation
217and indirection.
218
219Going back to our example, @code{b} may be allocated on the stack, as
220it is never mutated.
221
222@code{a} may also be allocated on the stack, as it too is never
223mutated. Within the enclosed lambda, its value will be copied into
224(and referenced from) the free variables vector.
225
226@code{foo} is a top-level variable, because @code{foo} is not
227lexically bound in this example.
8680d53b 228
00ce5125
AW
229@node VM Programs
230@subsection Compiled Procedures are VM Programs
8680d53b
AW
231
232By default, when you enter in expressions at Guile's REPL, they are
23e2e780
AW
233first compiled to bytecode. Then that bytecode is executed to produce a
234value. If the expression evaluates to a procedure, the result of this
235process is a compiled procedure.
236
237A compiled procedure is a compound object consisting of its bytecode and
238a reference to any captured lexical variables. In addition, when a
239procedure is compiled, it has associated metadata written to side
240tables, for instance a line number mapping, or its docstring. You can
241pick apart these pieces with the accessors in @code{(system vm
242program)}. @xref{Compiled Procedures}, for a full API reference.
243
244A procedure may reference data that was statically allocated when the
245procedure was compiled. For example, a pair of immediate objects
246(@pxref{Immediate objects}) can be allocated directly in the memory
247segment that contains the compiled bytecode, and accessed directly by
248the bytecode.
249
250Another use for statically allocated data is to serve as a cache for a
251bytecode. Top-level variable lookups are handled in this way. If the
252@code{toplevel-box} instruction finds that it does not have a cached
253variable for a top-level reference, it accesses other static data to
254resolve the reference, and fills in the cache slot. Thereafter all
255access to the variable goes through the cache cell. The variable's
256value may change in the future, but the variable itself will not.
8680d53b
AW
257
258We can see how these concepts tie together by disassembling the
81fd3152 259@code{foo} function we defined earlier to see what is going on:
8680d53b
AW
260
261@smallexample
262scheme@@(guile-user)> (define (foo a) (lambda (b) (list foo a b)))
263scheme@@(guile-user)> ,x foo
23e2e780
AW
264Disassembly of #<procedure foo (a)> at #x203be34:
265
266 0 (assert-nargs-ee/locals 2 1) ;; 1 arg, 1 local at (unknown file):1:0
267 1 (make-closure 2 6 1) ;; anonymous procedure at #x203be50 (1 free var)
268 4 (free-set! 2 1 0) ;; free var 0
269 6 (return 2)
8680d53b
AW
270
271----------------------------------------
23e2e780
AW
272Disassembly of anonymous procedure at #x203be50:
273
274 0 (assert-nargs-ee/locals 2 3) ;; 1 arg, 3 locals at (unknown file):1:0
275 1 (toplevel-box 2 73 57 71 #t) ;; `foo'
276 6 (box-ref 2 2)
277 7 (make-short-immediate 3 772) ;; ()
278 8 (cons 3 1 3)
279 9 (free-ref 4 0 0) ;; free var 0
280 11 (cons 3 4 3)
281 12 (cons 2 2 3)
282 13 (return 2)
8680d53b
AW
283@end smallexample
284
23e2e780
AW
285First there's some prelude, where @code{foo} checks that it was called
286with only 1 argument. Then at @code{ip} 1, we allocate a new closure
287and store it in slot 2. The `6' in the @code{(make-closure 2 6 1)} is a
288relative offset from the instruction pointer of the code for the
289closure.
290
291A closure is code with data. We already have the code part initialized;
292what remains is to set the data. @code{Ip} 4 initializes free variable
2930 in the new closure with the value from local variable 1, which
294corresponds to the first argument of @code{foo}: `a'. Finally we return
295the closure.
296
297The second stanza disassembles the code for the closure. After the
298prelude, we load the variable for the toplevel variable @code{foo} into
299local variable 2. This lookup occurs lazily, the first time the
300variable is actually referenced, and the location of the lookup is
301cached so that future references are very cheap. @xref{Top-Level
302Environment Instructions}, for more details. The @code{box-ref}
303dereferences the variable cell, replacing the contents of local 2.
304
305What follows is a sequence of conses to build up the result list.
306@code{Ip} 7 makes the tail of the list. @code{Ip} 8 conses on the value
307in local 1, corresponding to the first argument to the closure: `b'.
308@code{Ip} 9 loads free variable 0 of local 0 -- the procedure being
309called -- into slot 4, then @code{ip} 11 conses it onto the list.
310Finally we cons local 2, containing the @code{foo} toplevel, onto the
311front of the list, and we return it.
8680d53b 312
1f6f591d
AW
313
314@node Object File Format
315@subsection Object File Format
316
317To compile a file to disk, we need a format in which to write the
318compiled code to disk, and later load it into Guile. A good @dfn{object
319file format} has a number of characteristics:
320
321@itemize
322@item Above all else, it should be very cheap to load a compiled file.
323@item It should be possible to statically allocate constants in the
324file. For example, a bytevector literal in source code can be emitted
325directly into the object file.
326@item The compiled file should enable maximum code and data sharing
327between different processes.
328@item The compiled file should contain debugging information, such as
329line numbers, but that information should be separated from the code
330itself. It should be possible to strip debugging information if space
331is tight.
332@end itemize
333
334These characteristics are not specific to Scheme. Indeed, mainstream
335languages like C and C++ have solved this issue many times in the past.
336Guile builds on their work by adopting ELF, the object file format of
337GNU and other Unix-like systems, as its object file format. Although
338Guile uses ELF on all platforms, we do not use platform support for ELF.
339Guile implements its own linker and loader. The advantage of using ELF
340is not sharing code, but sharing ideas. ELF is simply a well-designed
341object file format.
342
343An ELF file has two meta-tables describing its contents. The first
344meta-table is for the loader, and is called the @dfn{program table} or
345sometimes the @dfn{segment table}. The program table divides the file
346into big chunks that should be treated differently by the loader.
347Mostly the difference between these @dfn{segments} is their
348permissions.
349
350Typically all segments of an ELF file are marked as read-only, except
351that part that represents modifiable static data or static data that
352needs load-time initialization. Loading an ELF file is as simple as
353mmapping the thing into memory with read-only permissions, then using
354the segment table to mark a small sub-region of the file as writable.
355This writable section is typically added to the root set of the garbage
356collector as well.
357
358One ELF segment is marked as ``dynamic'', meaning that it has data of
359interest to the loader. Guile uses this segment to record the Guile
360version corresponding to this file. There is also an entry in the
361dynamic segment that points to the address of an initialization thunk
362that is run to perform any needed link-time initialization. (This is
363like dynamic relocations for normal ELF shared objects, except that we
364compile the relocations as a procedure instead of having the loader
365interpret a table of relocations.) Finally, the dynamic segment marks
366the location of the ``entry thunk'' of the object file. This thunk is
367returned to the caller of @code{load-thunk-from-memory} or
368@code{load-thunk-from-file}. When called, it will execute the ``body''
369of the compiled expression.
370
371The other meta-table in an ELF file is the @dfn{section table}. Whereas
372the program table divides an ELF file into big chunks for the loader,
373the section table specifies small sections for use by introspective
374tools like debuggers or the like. One segment (program table entry)
375typically contains many sections. There may be sections outside of any
376segment, as well.
377
378Typical sections in a Guile @code{.go} file include:
379
380@table @code
381@item .rtl-text
382Bytecode.
383@item .data
384Data that needs initialization, or which may be modified at runtime.
385@item .rodata
386Statically allocated data that needs no run-time initialization, and
387which therefore can be shared between processes.
388@item .dynamic
389The dynamic section, discussed above.
390@item .symtab
391@itemx .strtab
392A table mapping addresses in the @code{.rtl-text} to procedure names.
393@code{.strtab} is used by @code{.symtab}.
394@item .guile.procprops
395@itemx .guile.arities
396@itemx .guile.arities.strtab
397@itemx .guile.docstrs
398@itemx .guile.docstrs.strtab
399Side tables of procedure properties, arities, and docstrings.
400@item .debug_info
401@itemx .debug_abbrev
402@itemx .debug_str
403@itemx .debug_loc
404@itemx .debug_line
405Debugging information, in DWARF format. See the DWARF specification,
406for more information.
407@item .shstrtab
408Section name string table.
409@end table
410
411For more information, see @uref{http://linux.die.net/man/5/elf,,the
412elf(5) man page}. See @uref{http://dwarfstd.org/,the DWARF
413specification} for more on the DWARF debugging format. Or if you are an
414adventurous explorer, try running @code{readelf} or @code{objdump} on
415compiled @code{.go} files. It's good times!
416
417
8680d53b
AW
418@node Instruction Set
419@subsection Instruction Set
420
23e2e780
AW
421There are currently about 130 instructions in Guile's virtual machine.
422These instructions represent atomic units of a program's execution.
423Ideally, they perform one task without conditional branches, then
424dispatch to the next instruction in the stream.
425
426Instructions themselves are composed of 1 or more 32-bit units. The low
4278 bits of the first word indicate the opcode, and the rest of
428instruction describe the operands. There are a number of different ways
429operands can be encoded.
430
431@table @code
432@item u@var{n}
433An unsigned @var{n}-bit integer. Usually indicates the index of a local
434variable, but some instructions interpret these operands as immediate
435values.
436@item l24
437An offset from the current @code{ip}, in 32-bit units, as a signed
43824-bit value. Indicates a bytecode address, for a relative jump.
439@item i16
440@itemx i32
441An immediate Scheme value (@pxref{Immediate objects}), encoded directly
442in 16 or 32 bits.
443@item a32
444@itemx b32
445An immediate Scheme value, encoded as a pair of 32-bit words.
446@code{a32} and @code{b32} values always go together on the same opcode,
447and indicate the high and low bits, respectively. Normally only used on
44864-bit systems.
449@item n32
450A statically allocated non-immediate. The address of the non-immediate
451is encoded as a signed 32-bit integer, and indicates a relative offset
452in 32-bit units. Think of it as @code{SCM x = ip + offset}.
453@item s32
454Indirect scheme value, like @code{n32} but indirected. Think of it as
455@code{SCM *x = ip + offset}.
456@item l32
457@item lo32
458An ip-relative address, as a signed 32-bit integer. Could indicate a
459bytecode address, as in @code{make-closure}, or a non-immediate address,
460as with @code{static-patch!}.
461
462@code{l32} and @code{lo32} are the same from the perspective of the
463virtual machine. The difference is that an assembler might want to
464allow an @code{lo32} address to be specified as a label and then some
465number of words offset from that label, for example when patching a
466field of a statically allocated object.
467@item b1
468A boolean value: 1 for true, otherwise 0.
469@item x@var{n}
470An ignored sequence of @var{n} bits.
471@end table
472
473An instruction is specified by giving its name, then describing its
474operands. The operands are packed by 32-bit words, with earlier
475operands occupying the lower bits.
476
477For example, consider the following instruction specification:
478
479@deftypefn Instruction {} free-set! u12:@var{dst} u12:@var{src} x8:@var{_} u24:@var{idx}
480Set free variable @var{idx} from the closure @var{dst} to @var{src}.
481@end deftypefn
bd7aa35f 482
23e2e780
AW
483The first word in the instruction will start with the 8-bit value
484corresponding to the @var{free-set!} opcode in the low bits, followed by
485@var{dst} and @var{src} as 12-bit values. The second word starts with 8
486dead bits, followed by the index as a 24-bit immediate value.
bd7aa35f
AW
487
488Sometimes the compiler can figure out that it is compiling a special
489case that can be run more efficiently. So, for example, while Guile
490offers a generic test-and-branch instruction, it also offers specific
491instructions for special cases, so that the following cases all have
492their own test-and-branch instructions:
493
494@example
495(if pred then else)
496(if (not pred) then else)
497(if (null? l) then else)
498(if (not (null? l)) then else)
499@end example
500
501In addition, some Scheme primitives have their own inline
23e2e780
AW
502implementations. For example, in the previous section we saw
503@code{cons}.
bd7aa35f 504
23e2e780
AW
505Guile's instruction set is a @emph{complete} instruction set, in that it
506provides the instructions that are suited to the problem, and is not
507concerned with making a minimal, orthogonal set of instructions. More
508instructions may be added over time.
8680d53b
AW
509
510@menu
69aecc6a
AW
511* Lexical Environment Instructions::
512* Top-Level Environment Instructions::
513* Procedure Call and Return Instructions::
514* Function Prologue Instructions::
515* Trampoline Instructions::
516* Branch Instructions::
517* Constant Instructions::
518* Dynamic Environment Instructions::
519* Miscellaneous Instructions::
520* Inlined Scheme Instructions::
521* Inlined Mathematical Instructions::
522* Inlined Bytevector Instructions::
8680d53b
AW
523@end menu
524
8680d53b 525
acc51c3e
AW
526@node Lexical Environment Instructions
527@subsubsection Lexical Environment Instructions
528
529These instructions access and mutate the lexical environment of a
69aecc6a
AW
530compiled procedure---its free and bound variables. @xref{Stack Layout},
531for more information on the format of stack frames.
532
533@deftypefn Instruction {} mov u12:@var{dst} u12:@var{src}
534@deftypefnx Instruction {} long-mov u24:@var{dst} x8:@var{_} u24:@var{src}
535Copy a value from one local slot to another.
536
537As discussed previously, procedure arguments and local variables are
538allocated to local slots. Guile's compiler tries to avoid shuffling
539variables around to different slots, which often makes @code{mov}
540instructions redundant. However there are some cases in which shuffling
541is necessary, and in those cases, @code{mov} is the thing to use.
542@end deftypefn
543
544@deftypefn Instruction {} make-closure u24:@var{dst} l32:@var{offset} x8:@var{_} u24:@var{nfree}
545Make a new closure, and write it to @var{dst}. The code for the closure
546will be found at @var{offset} words from the current @code{ip}.
547@var{offset} is a signed 32-bit integer. Space for @var{nfree} free
548variables will be allocated.
549
550The size of a closure is currently two words, plus one word per free
551variable.
552@end deftypefn
553
554@deftypefn Instruction {} free-ref u12:@var{dst} u12:@var{src} x8:@var{_} u24:@var{idx}
555Load free variable @var{idx} from the closure @var{src} into local slot
556@var{dst}.
557@end deftypefn
558
559@deftypefn Instruction {} free-set! u12:@var{dst} u12:@var{src} x8:@var{_} u24:@var{idx}
560Set free variable @var{idx} from the closure @var{dst} to @var{src}.
561
562This instruction is usually used when initializing a closure's free
563variables, but not to mutate free variables, as variables that are
564assigned are boxed.
565@end deftypefn
566
567Recall that variables that are assigned are usually allocated in boxes,
568so that continuations and closures can capture their identity and not
569their value at one point in time. Variables are also used in the
570implementation of top-level bindings; see the next section for more
571information.
572
573@deftypefn Instruction {} box u12:@var{dst} u12:@var{src}
574Create a new variable holding @var{src}, and place it in @var{dst}.
575@end deftypefn
576
577@deftypefn Instruction {} box-ref u12:@var{dst} u12:@var{src}
578Unpack the variable at @var{src} into @var{dst}, asserting that the
579variable is actually bound.
580@end deftypefn
581
582@deftypefn Instruction {} box-set! u12:@var{dst} u12:@var{src}
583Set the contents of the variable at @var{dst} to @var{set}.
584@end deftypefn
98850fd7 585
acc51c3e
AW
586
587@node Top-Level Environment Instructions
588@subsubsection Top-Level Environment Instructions
589
590These instructions access values in the top-level environment: bindings
591that were not lexically apparent at the time that the code in question
592was compiled.
593
594The location in which a toplevel binding is stored can be looked up once
595and cached for later. The binding itself may change over time, but its
596location will stay constant.
597
69aecc6a
AW
598@deftypefn Instruction {} current-module u24:@var{dst}
599Store the current module in @var{dst}.
600@end deftypefn
601
602@deftypefn Instruction {} resolve u24:@var{dst} b1:@var{bound?} x7:@var{_} u24:@var{sym}
603Resolve @var{sym} in the current module, and place the resulting
604variable in @var{dst}. An error will be signalled if no variable is
605found. If @var{bound?} is true, an error will be signalled if the
606variable is unbound.
607@end deftypefn
608
609@deftypefn Instruction {} define! u12:@var{sym} u12:@var{val}
610Look up a binding for @var{sym} in the current module, creating it if
611necessary. Set its value to @var{val}.
612@end deftypefn
613
614@deftypefn Instruction {} toplevel-box u24:@var{dst} s32:@var{var-offset} s32:@var{mod-offset} n32:@var{sym-offset} b1:@var{bound?} x31:@var{_}
615Load a value. The value will be fetched from memory, @var{var-offset}
61632-bit words away from the current instruction pointer.
617@var{var-offset} is a signed value. Up to here, @code{toplevel-box} is
618like @code{static-ref}.
619
620Then, if the loaded value is a variable, it is placed in @var{dst}, and
621control flow continues.
622
623Otherwise, we have to resolve the variable. In that case we load the
624module from @var{mod-offset}, just as we loaded the variable. Usually
625the module gets set when the closure is created. @var{sym-offset}
626specifies the name, as an offset to a symbol.
627
628We use the module and the symbol to resolve the variable, placing it in
629@var{dst}, and caching the resolved variable so that we will hit the
630cache next time. If @var{bound?} is true, an error will be signalled if
631the variable is unbound.
632@end deftypefn
633
634@deftypefn Instruction {} module-box u24:@var{dst} s32:@var{var-offset} n32:@var{mod-offset} n32:@var{sym-offset} b1:@var{bound?} x31:@var{_}
635Like @code{toplevel-box}, except @var{mod-offset} points at a module
636identifier instead of the module itself. A module identifier is a
637module name, as a list, prefixed by a boolean. If the prefix is true,
638then the variable is resolved relative to the module's public interface
639instead of its private interface.
640@end deftypefn
98850fd7 641
81fd3152 642
acc51c3e
AW
643@node Procedure Call and Return Instructions
644@subsubsection Procedure Call and Return Instructions
8680d53b 645
69aecc6a
AW
646As described earlier (@pxref{Stack Layout}), Guile's calling convention
647is that arguments are passed and values returned on the stack.
648
649For calls, both in tail position and in non-tail position, we require
650that the procedure and the arguments already be shuffled into place
651befor the call instruction. ``Into place'' for a tail call means that
652the procedure should be in slot 0, and the arguments should follow. For
653a non-tail call, if the procedure is in slot @var{n}, the arguments
654should follow from slot @var{n}+1, and there should be two free slots at
655@var{n}-1 and @var{n}-2 in which to save the @code{ip} and @code{fp}.
656
657Returning values is similar. Multiple-value returns should have values
658already shuffled down to start from slot 1 before emitting
659@code{return-values}. There is a short-cut in the single-value case, in
660that @code{return} handles the trivial shuffling itself. We start from
661slot 1 instead of slot 0 to make tail calls to @code{values} trivial.
662
663In both calls and returns, the @code{sp} is used to indicate to the
664callee or caller the number of arguments or return values, respectively.
665After receiving return values, it is the caller's responsibility to
666@dfn{restore the frame} by resetting the @code{sp} to its former value.
667
668@deftypefn Instruction {} call u24:@var{proc} x8:@var{_} u24:@var{nlocals}
669Call a procedure. @var{proc} is the local corresponding to a procedure.
670The two values below @var{proc} will be overwritten by the saved call
671frame data. The new frame will have space for @var{nlocals} locals: one
672for the procedure, and the rest for the arguments which should already
673have been pushed on.
674
675When the call returns, execution proceeds with the next instruction.
676There may be any number of values on the return stack; the precise
677number can be had by subtracting the address of @var{proc} from the
678post-call @code{sp}.
679@end deftypefn
680
681@deftypefn Instruction {} tail-call u24:@var{nlocals}
682Tail-call a procedure. Requires that the procedure and all of the
683arguments have already been shuffled into position. Will reset the
684frame to @var{nlocals}.
685@end deftypefn
686
687@deftypefn Instruction {} tail-call/shuffle u24:@var{from}
688Tail-call a procedure. The procedure should already be set to slot 0.
689The rest of the args are taken from the frame, starting at @var{from},
690shuffled down to start at slot 0. This is part of the implementation of
691the @code{call-with-values} builtin.
692@end deftypefn
693
694@deftypefn Instruction {} receive u12:@var{dst} u12:@var{proc} x8:@var{_} u24:@var{nlocals}
695Receive a single return value from a call whose procedure was in
696@var{proc}, asserting that the call actually returned at least one
697value. Afterwards, resets the frame to @var{nlocals} locals.
698@end deftypefn
699
700@deftypefn Instruction {} receive-values u24:@var{proc} b1:@var{allow-extra?} x7:@var{_} u24:@var{nvalues}
701Receive a return of multiple values from a call whose procedure was in
702@var{proc}. If fewer than @var{nvalues} values were returned, signal an
703error. Unless @var{allow-extra?} is true, require that the number of
704return values equals @var{nvalues} exactly. After @code{receive-values}
705has run, the values can be copied down via @code{mov}, or used in place.
706@end deftypefn
707
708@deftypefn Instruction {} return u24:@var{src}
709Return a value.
710@end deftypefn
711
712@deftypefn Instruction {} return-values x24:@var{_}
713Return a number of values from a call frame. This opcode corresponds to
714an application of @code{values} in tail position. As with tail calls,
715we expect that the values have already been shuffled down to a
716contiguous array starting at slot 1. We also expect the frame has
717already been reset.
718@end deftypefn
719
720@deftypefn Instruction {} call/cc x24:@var{_}
721Capture the current continuation, and tail-apply the procedure in local
722slot 1 to it. This instruction is part of the implementation of
723@code{call/cc}, and is not generated by the compiler.
724@end deftypefn
8274228f 725
8680d53b 726
acc51c3e
AW
727@node Function Prologue Instructions
728@subsubsection Function Prologue Instructions
729
730A function call in Guile is very cheap: the VM simply hands control to
731the procedure. The procedure itself is responsible for asserting that it
732has been passed an appropriate number of arguments. This strategy allows
733arbitrarily complex argument parsing idioms to be developed, without
734harming the common case.
735
736For example, only calls to keyword-argument procedures ``pay'' for the
737cost of parsing keyword arguments. (At the time of this writing, calling
738procedures with keyword arguments is typically two to four times as
739costly as calling procedures with a fixed set of arguments.)
740
69aecc6a
AW
741@deftypefn Instruction {} assert-nargs-ee u24:@var{expected}
742@deftypefnx Instruction {} assert-nargs-ge u24:@var{expected}
743@deftypefnx Instruction {} assert-nargs-le u24:@var{expected}
744If the number of actual arguments is not @code{==}, @code{>=}, or
745@code{<=} @var{expected}, respectively, signal an error.
acc51c3e
AW
746
747The number of arguments is determined by subtracting the frame pointer
69aecc6a
AW
748from the stack pointer (@code{sp + 1 - fp}). @xref{Stack Layout}, for
749more details on stack frames. Note that @var{expected} includes the
750procedure itself.
751@end deftypefn
acc51c3e 752
69aecc6a
AW
753@deftypefn Instruction {} br-if-nargs-ne u24:@var{expected} x8:@var{_} l24:@var{offset}
754@deftypefnx Instruction {} br-if-nargs-lt u24:@var{expected} x8:@var{_} l24:@var{offset}
755@deftypefnx Instruction {} br-if-nargs-gt u24:@var{expected} x8:@var{_} l24:@var{offset}
756If the number of actual arguments is not equal, less than, or greater
757than @var{expected}, respectively, add @var{offset}, a signed 24-bit
758number, to the current instruction pointer. Note that @var{expected}
759includes the procedure itself.
acc51c3e 760
ecb87335 761These instructions are used to implement multiple arities, as in
acc51c3e 762@code{case-lambda}. @xref{Case-lambda}, for more information.
69aecc6a
AW
763@end deftypefn
764
765@deftypefn Instruction {} alloc-frame u24:@var{nlocals}
766Ensure that there is space on the stack for @var{nlocals} local
767variables, setting them all to @code{SCM_UNDEFINED}, except those values
768that are already on the stack.
769@end deftypefn
770
771@deftypefn Instruction {} reset-frame u24:@var{nlocals}
772Like @code{alloc-frame}, but doesn't check that the stack is big enough,
773and doesn't initialize values to @code{SCM_UNDEFINED}. Used to reset
774the frame size to something less than the size that was previously set
775via alloc-frame.
776@end deftypefn
777
778@deftypefn Instruction {} assert-nargs-ee/locals u12:@var{expected} u12:@var{nlocals}
779Equivalent to a sequence of @code{assert-nargs-ee} and
780@code{reserve-locals}. The number of locals reserved is @var{expected}
781+ @var{nlocals}.
782@end deftypefn
783
784@deftypefn Instruction {} br-if-npos-gt u24:@var{nreq} x8:@var{_} u24:@var{npos} x8:@var{_} l24:@var{offset}
785Find the first positional argument after @var{nreq}. If it is greater
786than @var{npos}, jump to @var{offset}.
787
788This instruction is only emitted for functions with multiple clauses,
789and an earlier clause has keywords and no rest arguments.
790@xref{Case-lambda}, for more on how @code{case-lambda} chooses the
791clause to apply.
792@end deftypefn
793
794@deftypefn Instruction {} bind-kwargs u24:@var{nreq} u8:@var{flags} u24:@var{nreq-and-opt} x8:@var{_} u24:@var{ntotal} n32:@var{kw-offset}
795@var{flags} is a bitfield, whose lowest bit is @var{allow-other-keys},
796second bit is @var{has-rest}, and whose following six bits are unused.
797
798Find the last positional argument, and shuffle all the rest above
799@var{ntotal}. Initialize the intervening locals to
800@code{SCM_UNDEFINED}. Then load the constant at @var{kw-offset} words
801from the current @var{ip}, and use it and the @var{allow-other-keys}
802flag to bind keyword arguments. If @var{has-rest}, collect all shuffled
803arguments into a list, and store it in @var{nreq-and-opt}. Finally,
804clear the arguments that we shuffled up.
acc51c3e
AW
805
806The parsing is driven by a keyword arguments association list, looked up
69aecc6a
AW
807using @var{kw-offset}. The alist is a list of pairs of the form
808@code{(@var{kw} . @var{index})}, mapping keyword arguments to their
809local slot indices. Unless @code{allow-other-keys} is set, the parser
810will signal an error if an unknown key is found.
811
812A macro-mega-instruction.
813@end deftypefn
814
815@deftypefn Instruction {} bind-rest u24:@var{dst}
816Collect any arguments at or above @var{dst} into a list, and store that
817list at @var{dst}.
818@end deftypefn
de45d8ee 819
acc51c3e
AW
820
821@node Trampoline Instructions
822@subsubsection Trampoline Instructions
823
69aecc6a
AW
824Though most applicable objects in Guile are procedures implemented in
825bytecode, not all are. There are primitives, continuations, and other
826procedure-like objects that have their own calling convention. Instead
acc51c3e
AW
827of adding special cases to the @code{call} instruction, Guile wraps
828these other applicable objects in VM trampoline procedures, then
829provides special support for these objects in bytecode.
830
831Trampoline procedures are typically generated by Guile at runtime, for
69aecc6a
AW
832example in response to a call to @code{scm_c_make_gsubr}. As such, a
833compiler probably shouldn't emit code with these instructions. However,
acc51c3e
AW
834it's still interesting to know how these things work, so we document
835these trampoline instructions here.
836
69aecc6a
AW
837@deftypefn Instruction {} subr-call u24:@var{ptr-idx}
838Call a subr, passing all locals in this frame as arguments. Fetch the
839foreign pointer from @var{ptr-idx}, a free variable. Return from the
840calling frame.
841@end deftypefn
acc51c3e 842
69aecc6a
AW
843@deftypefn Instruction {} foreign-call u12:@var{cif-idx} u12:@var{ptr-idx}
844Call a foreign function. Fetch the @var{cif} and foreign pointer from
845@var{cif-idx} and @var{ptr-idx}, both free variables. Return from the calling
846frame. Arguments are taken from the stack.
847@end deftypefn
848
849@deftypefn Instruction {} continuation-call u24:@var{contregs}
850Return to a continuation, nonlocally. The arguments to the continuation
851are taken from the stack. @var{contregs} is a free variable containing
852the reified continuation.
853@end deftypefn
acc51c3e 854
69aecc6a
AW
855@deftypefn Instruction {} compose-continuation u24:@var{cont}
856Compose a partial continution with the current continuation. The
857arguments to the continuation are taken from the stack. @var{cont} is a
858free variable containing the reified continuation.
859@end deftypefn
acc51c3e 860
69aecc6a
AW
861@deftypefn Instruction {} tail-apply x24:@var{_}
862Tail-apply the procedure in local slot 0 to the rest of the arguments.
863This instruction is part of the implementation of @code{apply}, and is
864not generated by the compiler.
865@end deftypefn
866
867@deftypefn Instruction {} builtin-ref u12:@var{dst} u12:@var{idx}
868Load a builtin stub by index into @var{dst}.
869@end deftypefn
acc51c3e
AW
870
871
872@node Branch Instructions
873@subsubsection Branch Instructions
874
69aecc6a
AW
875All offsets to branch instructions are 24-bit signed numbers, which
876count 32-bit units. This gives Guile effectively a 26-bit address range
877for relative jumps.
acc51c3e 878
69aecc6a
AW
879@deftypefn Instruction {} br l24:@var{offset}
880Add @var{offset} to the current instruction pointer.
881@end deftypefn
acc51c3e 882
69aecc6a
AW
883All the conditional branch instructions described below have an
884@var{invert} parameter, which if true reverses the test:
885@code{br-if-true} becomes @code{br-if-false}, and so on.
acc51c3e 886
69aecc6a
AW
887@deftypefn Instruction {} br-if-true u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
888If the value in @var{test} is true for the purposes of Scheme, add
889@var{offset} to the current instruction pointer.
890@end deftypefn
891
892@deftypefn Instruction {} br-if-null u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
893If the value in @var{test} is the end-of-list or Lisp nil, add
894@var{offset} to the current instruction pointer.
895@end deftypefn
896
897@deftypefn Instruction {} br-if-nil u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
898If the value in @var{test} is false to Lisp, add @var{offset} to the
899current instruction pointer.
900@end deftypefn
901
902@deftypefn Instruction {} br-if-pair u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
903If the value in @var{test} is a pair, add @var{offset} to the current
904instruction pointer.
905@end deftypefn
906
907@deftypefn Instruction {} br-if-struct u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
908If the value in @var{test} is a struct, add @var{offset} number to the
909current instruction pointer.
910@end deftypefn
911
912@deftypefn Instruction {} br-if-char u24:@var{test} b1:@var{invert} x7:@var{_} l24:@var{offset}
913If the value in @var{test} is a char, add @var{offset} to the current
914instruction pointer.
915@end deftypefn
916
917@deftypefn Instruction {} br-if-tc7 u24:@var{test} b1:@var{invert} u7:@var{tc7} l24:@var{offset}
918If the value in @var{test} has the TC7 given in the second word, add
919@var{offset} to the current instruction pointer. TC7 codes are part of
920the way Guile represents non-immediate objects, and are deep wizardry.
921See @code{libguile/tags.h} for all the details.
922@end deftypefn
923
924@deftypefn Instruction {} br-if-eq u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
925@deftypefnx Instruction {} br-if-eqv u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
926@deftypefnx Instruction {} br-if-equal u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
927If the value in @var{a} is @code{eq?}, @code{eqv?}, or @code{equal?} to
928the value in @var{b}, respectively, add @var{offset} to the current
929instruction pointer.
930@end deftypefn
931
932@deftypefn Instruction {} br-if-= u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
933@deftypefnx Instruction {} br-if-< u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
934@deftypefnx Instruction {} br-if-<= u12:@var{a} u12:@var{b} b1:@var{invert} x7:@var{_} l24:@var{offset}
935If the value in @var{a} is @code{=}, @code{<}, or @code{<=} to the value
936in @var{b}, respectively, add @var{offset} to the current instruction
937pointer.
938@end deftypefn
939
940
941@node Constant Instructions
942@subsubsection Constant Instructions
943
944The following instructions load literal data into a program. There are
945two kinds.
946
947The first set of instructions loads immediate values. These
948instructions encode the immediate directly into the instruction stream.
949
950@deftypefn Instruction {} make-short-immediate u8:@var{dst} i16:@var{low-bits}
951Make an immediate whose low bits are @var{low-bits}, and whose top bits are
9520.
953@end deftypefn
954
955@deftypefn Instruction {} make-long-immediate u24:@var{dst} i32:@var{low-bits}
956Make an immediate whose low bits are @var{low-bits}, and whose top bits are
9570.
958@end deftypefn
959
960@deftypefn Instruction {} make-long-long-immediate u24:@var{dst} a32:@var{high-bits} b32:@var{low-bits}
961Make an immediate with @var{high-bits} and @var{low-bits}.
962@end deftypefn
963
964Non-immediate constant literals are referenced either directly or
965indirectly. For example, Guile knows at compile-time what the layout of
966a string will be like, and arranges to embed that object directly in the
967compiled image. A reference to a string will use
968@code{make-non-immediate} to treat a pointer into the compilation unit
969as a @code{SCM} value directly.
970
971@deftypefn Instruction {} make-non-immediate u24:@var{dst} n32:@var{offset}
972Load a pointer to statically allocated memory into @var{dst}. The
973object's memory is will be found @var{offset} 32-bit words away from the
974current instruction pointer. Whether the object is mutable or immutable
975depends on where it was allocated by the compiler, and loaded by the
976loader.
977@end deftypefn
978
979Some objects must be unique across the whole system. This is the case
980for symbols and keywords. For these objects, Guile arranges to
981initialize them when the compilation unit is loaded, storing them into a
982slot in the image. References go indirectly through that slot.
983@code{static-ref} is used in this case.
984
985@deftypefn Instruction {} static-ref u24:@var{dst} s32:@var{offset}
986Load a @var{scm} value into @var{dst}. The @var{scm} value will be fetched from
987memory, @var{offset} 32-bit words away from the current instruction
988pointer. @var{offset} is a signed value.
989@end deftypefn
990
991Fields of non-immediates may need to be fixed up at load time, because
992we do not know in advance at what address they will be loaded. This is
993the case, for example, for a pair containing a non-immediate in one of
994its fields. @code{static-ref} and @code{static-patch!} are used in
995these situations.
996
997@deftypefn Instruction {} static-set! u24:@var{src} lo32:@var{offset}
998Store a @var{scm} value into memory, @var{offset} 32-bit words away from the
999current instruction pointer. @var{offset} is a signed value.
1000@end deftypefn
acc51c3e 1001
69aecc6a
AW
1002@deftypefn Instruction {} static-patch! x24:@var{_} lo32:@var{dst-offset} l32:@var{src-offset}
1003Patch a pointer at @var{dst-offset} to point to @var{src-offset}. Both offsets
1004are signed 32-bit values, indicating a memory address as a number
1005of 32-bit words away from the current instruction pointer.
1006@end deftypefn
1007
1008Many kinds of literals can be loaded with the above instructions, once
1009the compiler has prepared the statically allocated data. This is the
1010case for vectors, strings, uniform vectors, pairs, and procedures with
1011no free variables. Other kinds of data might need special initializers;
1012those instructions follow.
acc51c3e 1013
69aecc6a
AW
1014@deftypefn Instruction {} string->number u12:@var{dst} u12:@var{src}
1015Parse a string in @var{src} to a number, and store in @var{dst}.
1016@end deftypefn
1017
1018@deftypefn Instruction {} string->symbol u12:@var{dst} u12:@var{src}
1019Parse a string in @var{src} to a symbol, and store in @var{dst}.
1020@end deftypefn
1021
1022@deftypefn Instruction {} symbol->keyword u12:@var{dst} u12:@var{src}
1023Make a keyword from the symbol in @var{src}, and store it in @var{dst}.
1024@end deftypefn
1025
1026@deftypefn Instruction {} load-typed-array u8:@var{dst} u8:@var{type} u8:@var{shape} n32:@var{offset} u32:@var{len}
1027Load the contiguous typed array located at @var{offset} 32-bit words away
1028from the instruction pointer, and store into @var{dst}. @var{len} is a byte
1029length. @var{offset} is signed.
1030@end deftypefn
acc51c3e 1031
acc51c3e
AW
1032
1033@node Dynamic Environment Instructions
1034@subsubsection Dynamic Environment Instructions
1035
1036Guile's virtual machine has low-level support for @code{dynamic-wind},
1037dynamic binding, and composable prompts and aborts.
1038
69aecc6a
AW
1039@deftypefn Instruction {} abort x24:@var{_}
1040Abort to a prompt handler. The tag is expected in slot 1, and the rest
1041of the values in the frame are returned to the prompt handler. This
1042corresponds to a tail application of abort-to-prompt.
1043
1044If no prompt can be found in the dynamic environment with the given tag,
1045an error is signalled. Otherwise all arguments are passed to the
1046prompt's handler, along with the captured continuation, if necessary.
1047
1048If the prompt's handler can be proven to not reference the captured
1049continuation, no continuation is allocated. This decision happens
1050dynamically, at run-time; the general case is that the continuation may
1051be captured, and thus resumed. A reinstated continuation will have its
1052arguments pushed on the stack from slot 1, as if from a multiple-value
1053return, and control resumes in the caller. Thus to the calling
1054function, a call to @code{abort-to-prompt} looks like any other function
1055call.
1056@end deftypefn
1057
1058@deftypefn Instruction {} prompt u24:@var{tag} b1:@var{escape-only?} x7:@var{_} u24:@var{proc-slot} x8:@var{_} l24:@var{handler-offset}
1059Push a new prompt on the dynamic stack, with a tag from @var{tag} and a
1060handler at @var{handler-offset} words from the current @var{ip}.
1061
1062If an abort is made to this prompt, control will jump to the handler.
1063The handler will expect a multiple-value return as if from a call with
1064the procedure at @var{proc-slot}, with the reified partial continuation
1065as the first argument, followed by the values returned to the handler.
1066If control returns to the handler, the prompt is already popped off by
1067the abort mechanism. (Guile's @code{prompt} implements Felleisen's
1068@dfn{--F--} operator.)
acc51c3e
AW
1069
1070If @var{escape-only?} is nonzero, the prompt will be marked as
1071escape-only, which allows an abort to this prompt to avoid reifying the
1072continuation.
acc51c3e 1073
69aecc6a
AW
1074@xref{Prompts}, for more information on prompts.
1075@end deftypefn
acc51c3e 1076
69aecc6a
AW
1077@deftypefn Instruction {} wind u12:@var{winder} u12:@var{unwinder}
1078Push wind and unwind procedures onto the dynamic stack. Note that
1079neither are actually called; the compiler should emit calls to wind and
1080unwind for the normal dynamic-wind control flow. Also note that the
1081compiler should have inserted checks that they wind and unwind procs are
1082thunks, if it could not prove that to be the case. @xref{Dynamic Wind}.
1083@end deftypefn
acc51c3e 1084
69aecc6a
AW
1085@deftypefn Instruction {} unwind x24:@var{_}
1086@var{a} normal exit from the dynamic extent of an expression. Pop the top
1087entry off of the dynamic stack.
1088@end deftypefn
acc51c3e 1089
69aecc6a
AW
1090@deftypefn Instruction {} push-fluid u12:@var{fluid} u12:@var{value}
1091Dynamically bind @var{value} to @var{fluid} by creating a with-fluids
1092object and pushing that object on the dynamic stack. @xref{Fluids and
1093Dynamic States}.
1094@end deftypefn
8680d53b 1095
69aecc6a
AW
1096@deftypefn Instruction {} pop-fluid x24:@var{_}
1097Leave the dynamic extent of a @code{with-fluid*} expression, restoring
1098the fluid to its previous value. @code{push-fluid} should always be
1099balanced with @code{pop-fluid}.
1100@end deftypefn
8680d53b 1101
69aecc6a
AW
1102@deftypefn Instruction {} fluid-ref u12:@var{dst} u12:@var{src}
1103Reference the fluid in @var{src}, and place the value in @var{dst}.
1104@end deftypefn
bd7aa35f 1105
69aecc6a
AW
1106@deftypefn Instruction {} fluid-set u12:@var{fluid} u12:@var{val}
1107Set the value of the fluid in @var{dst} to the value in @var{src}.
1108@end deftypefn
8680d53b 1109
8680d53b 1110
69aecc6a
AW
1111@node Miscellaneous Instructions
1112@subsubsection Miscellaneous Instructions
8680d53b 1113
69aecc6a
AW
1114@deftypefn Instruction {} halt x24:@var{_}
1115Bring the VM to a halt, returning all the values from the stack. Used
1116in the ``boot continuation'', which is used when entering the VM from C.
1117@end deftypefn
8680d53b 1118
8680d53b
AW
1119
1120@node Inlined Scheme Instructions
1121@subsubsection Inlined Scheme Instructions
1122
bd7aa35f 1123The Scheme compiler can recognize the application of standard Scheme
69aecc6a
AW
1124procedures. It tries to inline these small operations to avoid the
1125overhead of creating new stack frames. This allows the compiler to
1126optimize better.
1127
1128@deftypefn Instruction {} make-vector/immediate u8:@var{dst} u8:@var{length} u8:@var{init}
1129Make a short vector of known size and write it to @var{dst}. The vector
1130will have space for @var{length} slots, an immediate value. They will
1131be filled with the value in slot @var{init}.
1132@end deftypefn
1133
1134@deftypefn Instruction {} vector-length u12:@var{dst} u12:@var{src}
1135Store the length of the vector in @var{src} in @var{dst}.
1136@end deftypefn
1137
1138@deftypefn Instruction {} vector-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1139Fetch the item at position @var{idx} in the vector in @var{src}, and
1140store it in @var{dst}.
1141@end deftypefn
1142
1143@deftypefn Instruction {} vector-ref/immediate u8:@var{dst} u8:@var{src} u8:@var{idx}
1144Fill @var{dst} with the item @var{idx} elements into the vector at
1145@var{src}. Useful for building data types using vectors.
1146@end deftypefn
1147
1148@deftypefn Instruction {} vector-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1149Store @var{src} into the vector @var{dst} at index @var{idx}.
1150@end deftypefn
1151
1152@deftypefn Instruction {} vector-set!/immediate u8:@var{dst} u8:@var{idx} u8:@var{src}
1153Store @var{src} into the vector @var{dst} at index @var{idx}. Here
1154@var{idx} is an immediate value.
1155@end deftypefn
1156
1157@deftypefn Instruction {} struct-vtable u12:@var{dst} u12:@var{src}
1158Store the vtable of @var{src} into @var{dst}.
1159@end deftypefn
1160
1161@deftypefn Instruction {} allocate-struct/immediate u8:@var{dst} u8:@var{vtable} u8:@var{nfields}
1162Allocate a new struct with @var{vtable}, and place it in @var{dst}. The
1163struct will be constructed with space for @var{nfields} fields, which
1164should correspond to the field count of the @var{vtable}.
1165@end deftypefn
1166
1167@deftypefn Instruction {} struct-ref/immediate u8:@var{dst} u8:@var{src} u8:@var{idx}
1168Fetch the item at slot @var{idx} in the struct in @var{src}, and store
1169it in @var{dst}. @var{idx} is an immediate unsigned 8-bit value.
1170@end deftypefn
1171
1172@deftypefn Instruction {} struct-set!/immediate u8:@var{dst} u8:@var{idx} u8:@var{src}
1173Store @var{src} into the struct @var{dst} at slot @var{idx}. @var{idx}
1174is an immediate unsigned 8-bit value.
1175@end deftypefn
1176
1177@deftypefn Instruction {} class-of u12:@var{dst} u12:@var{type}
1178Store the vtable of @var{src} into @var{dst}.
1179@end deftypefn
1180
1181@deftypefn Instruction {} make-array u12:@var{dst} u12:@var{type} x8:@var{_} u12:@var{fill} u12:@var{bounds}
1182Make a new array with @var{type}, @var{fill}, and @var{bounds}, storing it in @var{dst}.
1183@end deftypefn
1184
1185@deftypefn Instruction {} string-length u12:@var{dst} u12:@var{src}
1186Store the length of the string in @var{src} in @var{dst}.
1187@end deftypefn
1188
1189@deftypefn Instruction {} string-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1190Fetch the character at position @var{idx} in the string in @var{src}, and store
1191it in @var{dst}.
1192@end deftypefn
1193
1194@deftypefn Instruction {} cons u8:@var{dst} u8:@var{car} u8:@var{cdr}
1195Cons @var{car} and @var{cdr}, and store the result in @var{dst}.
1196@end deftypefn
1197
1198@deftypefn Instruction {} car u12:@var{dst} u12:@var{src}
1199Place the car of @var{src} in @var{dst}.
1200@end deftypefn
1201
1202@deftypefn Instruction {} cdr u12:@var{dst} u12:@var{src}
1203Place the cdr of @var{src} in @var{dst}.
1204@end deftypefn
1205
1206@deftypefn Instruction {} set-car! u12:@var{pair} u12:@var{car}
1207Set the car of @var{dst} to @var{src}.
1208@end deftypefn
1209
1210@deftypefn Instruction {} set-cdr! u12:@var{pair} u12:@var{cdr}
1211Set the cdr of @var{dst} to @var{src}.
1212@end deftypefn
bd7aa35f
AW
1213
1214Note that @code{caddr} and friends compile to a series of @code{car}
1215and @code{cdr} instructions.
8680d53b 1216
69aecc6a 1217
8680d53b
AW
1218@node Inlined Mathematical Instructions
1219@subsubsection Inlined Mathematical Instructions
1220
bd7aa35f
AW
1221Inlining mathematical operations has the obvious advantage of handling
1222fixnums without function calls or allocations. The trick, of course,
1223is knowing when the result of an operation will be a fixnum, and there
1224might be a couple bugs here.
1225
1226More instructions could be added here over time.
1227
69aecc6a
AW
1228All of these operations place their result in their first operand,
1229@var{dst}.
1230
1231@deftypefn Instruction {} add u8:@var{dst} u8:@var{a} u8:@var{b}
1232Add @var{a} to @var{b}.
1233@end deftypefn
1234
1235@deftypefn Instruction {} add1 u12:@var{dst} u12:@var{src}
1236Add 1 to the value in @var{src}.
1237@end deftypefn
1238
1239@deftypefn Instruction {} sub u8:@var{dst} u8:@var{a} u8:@var{b}
1240Subtract @var{b} from @var{a}.
1241@end deftypefn
1242
1243@deftypefn Instruction {} sub1 u12:@var{dst} u12:@var{src}
1244Subtract 1 from @var{src}.
1245@end deftypefn
1246
1247@deftypefn Instruction {} mul u8:@var{dst} u8:@var{a} u8:@var{b}
1248Multiply @var{a} and @var{b}.
1249@end deftypefn
1250
1251@deftypefn Instruction {} div u8:@var{dst} u8:@var{a} u8:@var{b}
1252Divide @var{a} by @var{b}.
1253@end deftypefn
1254
1255@deftypefn Instruction {} quo u8:@var{dst} u8:@var{a} u8:@var{b}
1256Divide @var{a} by @var{b}.
1257@end deftypefn
1258
1259@deftypefn Instruction {} rem u8:@var{dst} u8:@var{a} u8:@var{b}
1260Divide @var{a} by @var{b}.
1261@end deftypefn
1262
1263@deftypefn Instruction {} mod u8:@var{dst} u8:@var{a} u8:@var{b}
1264Compute the modulo of @var{a} by @var{b}.
1265@end deftypefn
1266
1267@deftypefn Instruction {} ash u8:@var{dst} u8:@var{a} u8:@var{b}
1268Shift @var{a} arithmetically by @var{b} bits.
1269@end deftypefn
1270
1271@deftypefn Instruction {} logand u8:@var{dst} u8:@var{a} u8:@var{b}
1272Compute the bitwise @code{and} of @var{a} and @var{b}.
1273@end deftypefn
1274
1275@deftypefn Instruction {} logior u8:@var{dst} u8:@var{a} u8:@var{b}
1276Compute the bitwise inclusive @code{or} of @var{a} with @var{b}.
1277@end deftypefn
1278
1279@deftypefn Instruction {} logxor u8:@var{dst} u8:@var{a} u8:@var{b}
1280Compute the bitwise exclusive @code{or} of @var{a} with @var{b}.
1281@end deftypefn
1282
98850fd7
AW
1283
1284@node Inlined Bytevector Instructions
1285@subsubsection Inlined Bytevector Instructions
1286
1287Bytevector operations correspond closely to what the current hardware
1288can do, so it makes sense to inline them to VM instructions, providing
1289a clear path for eventual native compilation. Without this, Scheme
1290programs would need other primitives for accessing raw bytes -- but
1291these primitives are as good as any.
1292
69aecc6a
AW
1293@deftypefn Instruction {} bv-u8-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1294@deftypefnx Instruction {} bv-s8-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1295@deftypefnx Instruction {} bv-u16-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1296@deftypefnx Instruction {} bv-s16-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1297@deftypefnx Instruction {} bv-u32-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1298@deftypefnx Instruction {} bv-s32-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1299@deftypefnx Instruction {} bv-u64-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1300@deftypefnx Instruction {} bv-s64-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1301@deftypefnx Instruction {} bv-f32-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1302@deftypefnx Instruction {} bv-f64-ref u8:@var{dst} u8:@var{src} u8:@var{idx}
1303
1304Fetch the item at byte offset @var{idx} in the bytevector @var{src}, and
1305store it in @var{dst}. All accesses use native endianness.
1306@end deftypefn
1307
1308@deftypefn Instruction {} bv-u8-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1309@deftypefnx Instruction {} bv-s8-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1310@deftypefnx Instruction {} bv-u16-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1311@deftypefnx Instruction {} bv-s16-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1312@deftypefnx Instruction {} bv-u32-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1313@deftypefnx Instruction {} bv-s32-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1314@deftypefnx Instruction {} bv-u64-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1315@deftypefnx Instruction {} bv-s64-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1316@deftypefnx Instruction {} bv-f32-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1317@deftypefnx Instruction {} bv-f64-set! u8:@var{dst} u8:@var{idx} u8:@var{src}
1318
1319Store @var{src} into the bytevector @var{dst} at byte offset @var{idx}.
1320Multibyte values are written using native endianness.
1321@end deftypefn