The MacScheme machine assembly code generated by the code generator is translated to native code by an optimizing assembler. Porting Twobit to a new target architecture is mostly a matter of rewriting the assembler tables.
It would take much, much longer to port the Larceny runtime system than to retarget Twobit.
For the
reverse-map
example,
peephole optimizations convert the
MacScheme machine assembly code
that is produced by the code generator into
lambda *,0 setglbl reverse-map const reverse-map return .proc args= 2 const/setreg (),3 .align 4 L1001 .proc .proc-doc #(.loop|2 #f 2 #f #f (l x)) reg/op1/branchf internal:branchf-pair?,2,1004 save 3 store 0,0 store 1,2 store 2,3 store 3,1 reg/op1/setreg internal:car,2,7 movereg 1,2 movereg 7,1 reg 2 setrtn 1007 invoke 1 .align 4 L1007 .cont load 0,0 load 7,1 reg/op2/setreg internal:cons,result,7,3 load 1,2 stack 3 reg/op1/setreg internal:cdr,result,2 pop 3 branch 1001,3 L1004 reg/return 3
Peephole optimization actually occurs during the same pass that translates MacScheme machine assembly language into the SPARC machine code shown below. Comments show the correspondence between the SPARC code and the MacScheme machine assembly code from which it was generated. This correspondence is disguised by delayed branch instructions, whose delay slots are filled by a simple backpatching algorithm.
Segment # #f 0 jmpl %globals + 1024, %o7 ;lambda 1,0 4 or %g0, 16, %result 8 or %g0, 3326, %tmp0 12 st %tmp0, [ %result ] 16 add %result, 7, %result 20 ld [ %r0 + 1 ], %tmp0 24 ld [ %tmp0 + 5 ], %tmp1 28 st %tmp1, [ %result - 3 ] 32 ld [ %tmp0 + 9 ], %tmp1 36 st %tmp1, [ %result + 1 ] 40 st %r0, [ %result + 5 ] 44 or %g0, %result, %argreg2 48 ld [ %r0 + 1 ], %tmp0 ;setglbl reverse-map 52 ld [ %tmp0 + 13 ], %result 56 jmpl %globals + 1048, %o7 60 st %argreg2, [ %result - 1 ] 64 ld [ %r0 + 1 ], %tmp0 ;const reverse-map 68 ld [ %tmp0 + 17 ], %result 72 ld [ %stkp + 4 ], %o7 ;return 76 jmpl %o7 + 8, %g0 80 nop ------------------------------------------ Constant vector element # 0 Data: #f ------------------------------------------ Constant vector element # 1 Code vector 0 subcc %result, 8, %g0 ;args= 2 4 be,a #24 8 or %g0, 10, %r3 12 jmpl %globals + 1464, %o7 16 or %g0, 8, %argreg2 20 or %g0, 10, %r3 ;const/setreg (),3 24 and %r2, 7, %tmp0 ;L1001 ;reg/op1/branchf 28 subcc %tmp0, 1, %g0 ; internal:branchf-pair?,2,1004 32 bne,a #312 36 ld [ %stkp + 4 ], %o7 40 sub %stkp, 32, %stkp ;save 3 44 subcc %etop, %stkp, %g0 48 ble,a #68 52 or %g0, 24, %tmp0 56 add %stkp, 32, %stkp 60 jmpl %globals + 1056, %o7 64 add %o7, -28, %o7 68 st %tmp0, [ %stkp ] 72 st %g0, [ %stkp + 4 ] 76 st %r0, [ %stkp + 12 ] ;store 0,0 80 st %r1, [ %stkp + 20 ] ;store 1,2 84 st %r2, [ %stkp + 24 ] ;store 2,3 88 st %r3, [ %stkp + 16 ] ;store 3,1 92 and %r2, 7, %tmp0 ;reg/op1/setreg internal:car,2,7 96 subcc %tmp0, 1, %g0 100 be,a #128 104 ld [ %r2 - 1 ], %r7 108 or %g0, %r2, %result 112 or %g0, 0, %tmp0 116 jmpl %globals + 1384, %o7 120 add %o7, -32, %o7 124 ld [ %r2 - 1 ], %r7 128 or %g0, %r1, %r2 ;movereg 1,2 132 or %g0, %r7, %r1 ;movereg 7,1 136 or %g0, %r2, %result ;reg 2 140 call #148 ;setrtn 1007 144 add %o7, 56, %o7 148 st %o7, [ %stkp + 4 ] 152 subcc %timer, 1, %timer ;invoke 1 156 bne #172 160 and %result, 7, %tmp0 164 jmpl %globals + 1376, %o7 168 add %o7, -20, %o7 172 subcc %tmp0, 7, %g0 176 be,a #192 180 ld [ %result - 3 ], %tmp0 184 jmpl %globals + 1448, %o7 188 add %o7, -40, %o7 192 or %g0, %result, %r0 196 jmpl %tmp0 - 1, %g0 200 or %g0, 4, %result 204 ld [ %stkp + 12 ], %r0 ;L1007 ;load 0,0 208 ld [ %stkp + 16 ], %r7 ;load 7,1 212 add %etop, 8, %etop ;reg/op2/setreg 216 subcc %etop, %stkp, %g0 ; internal:cons,result,7,3 220 ble,a #236 224 st %result, [ %etop - 8 ] 228 jmpl %globals + 1040, %o7 232 add %o7, -24, %o7 236 st %r7, [ %etop - 4 ] 240 sub %etop, 7, %r3 244 ld [ %stkp + 20 ], %r1 ;load 1,2 248 ld [ %stkp + 24 ], %result ;stack 3 252 and %result, 7, %tmp0 ;reg/op1/setreg 256 subcc %tmp0, 1, %g0 ; internal:cdr,result,2 260 be,a #284 264 ld [ %result + 3 ], %r2 268 or %g0, 4, %tmp0 272 jmpl %globals + 1384, %o7 276 add %o7, -28, %o7 280 ld [ %result + 3 ], %r2 284 add %stkp, 32, %stkp ;pop 3 288 subcc %timer, 1, %timer ;branch 1001,3 292 bne,a #28 296 and %r2, 7, %tmp0 300 jmpl %globals + 1376, %o7 304 add %o7, -284, %o7 308 ld [ %stkp + 4 ], %o7 ;L1004 ;reg/return 3 312 jmpl %o7 + 8, %g0 316 or %g0, %r3, %result ------------------------------------------ Constant vector element # 2 Constant vector ------------------------------------------ Constant vector element # 0 Data: ((0 . #(reverse-map #f 2 #f #f (f l))) (24 . #(.loop|2 #f 2 #f #f (l x)))) ------------------------------------------ Constant vector element # 3 Global: reverse-map ------------------------------------------ Constant vector element # 4 Data: reverse-map ========================================