The following instructions load literal data into a program. There are two kinds.
The first set of instructions loads immediate values. These instructions encode the immediate directly into the instruction stream.
s8:dst zi16:low-bits
¶Make an immediate whose low bits are low-bits, sign-extended.
s8:dst i16:low-bits
¶Make an immediate whose low bits are low-bits, and whose top bits are 0.
s24:dst i32:low-bits
¶Make an immediate whose low bits are low-bits, and whose top bits are 0.
s24:dst a32:high-bits b32:low-bits
¶Make an immediate with high-bits and low-bits.
Non-immediate constant literals are referenced either directly or
indirectly. For example, Guile knows at compile-time what the layout of
a string will be like, and arranges to embed that object directly in the
compiled image. A reference to a string will use
make-non-immediate
to treat a pointer into the compilation unit
as a scm
value directly.
s24:dst n32:offset
¶Load a pointer to statically allocated memory into dst. The object’s memory will be found offset 32-bit words away from the current instruction pointer. Whether the object is mutable or immutable depends on where it was allocated by the compiler, and loaded by the loader.
Sometimes you need to load up a code pointer into a register; for this,
use load-label
.
s24:dst l32:offset
¶Load a label offset words away from the current ip
and
write it to dst. offset is a signed 32-bit integer.
Finally, Guile supports a number of unboxed data types, with their associate constant loaders.
s24:dst au32:high-bits au32:low-bits
¶Load a double-precision floating-point value formed by joining high-bits and low-bits, and write it to dst.
s24:dst au32:high-bits au32:low-bits
¶Load an unsigned 64-bit integer formed by joining high-bits and low-bits, and write it to dst.
s24:dst au32:high-bits au32:low-bits
¶Load a signed 64-bit integer formed by joining high-bits and low-bits, and write it to dst.
Some objects must be unique across the whole system. This is the case
for symbols and keywords. For these objects, Guile arranges to
initialize them when the compilation unit is loaded, storing them into a
slot in the image. References go indirectly through that slot.
static-ref
is used in this case.
s24:dst r32:offset
¶Load a scm value into dst. The scm value will be fetched from memory, offset 32-bit words away from the current instruction pointer. offset is a signed value.
Fields of non-immediates may need to be fixed up at load time, because
we do not know in advance at what address they will be loaded. This is
the case, for example, for a pair containing a non-immediate in one of
its fields. static-set!
and static-patch!
are used in
these situations.
s24:src lo32:offset
¶Store a scm value into memory, offset 32-bit words away from the current instruction pointer. offset is a signed value.
x24:_ lo32:dst-offset l32:src-offset
¶Patch a pointer at dst-offset to point to src-offset. Both offsets are signed 32-bit values, indicating a memory address as a number of 32-bit words away from the current instruction pointer.