Each assembler procedure in the table is called with an assembly structure and a MacScheme instruction. The assembler procedure picks the instruction apart and calls procedures in the code generator to emit machine code. The native assembler creates the machine code for each instruction and performs certain local optimizations on the instruction stream such as branch delay slot filling and instruction scheduling. This section lists some common idioms that you will see in disassembled code or in millicode. The instruction at L1 will usually be lifted into the branch delay slot.
Larceny never uses the trapping version of the tagged add instruction.
The branch delay slot can be filled in the usual manner or it can be used to adjust the value of o7 if L0 is not at the call instruction. Millicode call See the section on millicode calling , below. Exception handling Exception handling in generated code is not done all that consistently, and needs to be cleaned up. Additionally, there is a sparc.label pseudo-operation, used for definining branch targets, and a sparc.slot instruction, which can be used in the branch delay slot of annulled branches. If, during target resolution, a too-large offset is discovered, then the failure mechanism is invoked.