Index: /branches/arm/lisp-kernel/arm-spentry.s
===================================================================
--- /branches/arm/lisp-kernel/arm-spentry.s	(revision 13671)
+++ /branches/arm/lisp-kernel/arm-spentry.s	(revision 13672)
@@ -1,4 +1,3 @@
 /* Copyright (C) 2010 Clozure Associates */
-/* Copyright (C) 1994-2001 Digitool, Inc */
 /* This file is part of Clozure CL.   */
 
@@ -19,10 +18,12 @@
 	_beginfile
         .align 2
+        .arm
+        .syntax unified
 	
 local_label(start):
         .set sporg,0        
 define(`_spentry',`ifdef(`__func_name',`_endfn',`')
+        .org sporg
 	_exportfn(_SP$1)
-        .org sporg
         .set sporg,sporg+256        
 	.line  __line__
@@ -57,8 +58,4 @@
 /* Subprims for catch, throw, unwind_protect.  */
 
-/* Push a catch frame on the temp stack (and some of it on the cstack, as well.)  */
-/* The PC in question is 4 bytes past the caller's return address. ALWAYS.  */
-/* The catch tag is in arg_z, the multiple-value flags is in imm2.  */
-
 
 _spentry(mkcatch1v)
@@ -77,663 +74,37 @@
 	__(mkcatch())
         __(bx lr)
-        
-/* Caller has pushed tag and 0 or more values; nargs = nvalues.  */
-/* Otherwise, process unwind-protects and throw to indicated catch frame.  */
-	
-_spentry(throw)
-	__(ldr imm1,[rcontext, #tcr.catch_top])
-	__(mov imm0,#0) /* count intervening catch/unwind-protect frames.  */
-	__(cmpri(cr0,imm1,0))
-	__(ldr temp0,[vsp,nargs])
-	__(beq- cr0,local_label(_throw_tag_not_found))
-local_label(_throw_loop):
-	__(ldr temp1,[imm1,#catch_frame.catch_tag])
-	__(cmpr(cr0,temp0,temp1))
-	__(mov imm2,imm1)
-	__(ldr imm1,[imm1,#catch_frame.link])
-	__(cmpri(cr1,imm1,0))
-	__(beq cr0,local_label(_throw_found))
-	__(addi imm0,imm0,fixnum_one)
-	__(beq- cr1,local_label(_throw_tag_not_found))
-	__(b local_label(_throw_loop))
-/* imm2: (tstack-consed) target catch frame, imm0: count of intervening  */
-/* frames. If target isn't a multiple-value receiver, discard extra values */
-/* (less hair, maybe.)  */
-local_label(_throw_found):
-	__(ldr imm1,[imm2,#catch_frame.mvflag])
-	__(cmpri(cr0,imm1,0))
-	__(cmpri(cr1,nargs,0))
-	__(mov fn,#0)
-	__(add imm1,vsp,nargs)
-	__(la imm1,-node_size(imm1))
-	__(bne cr0,local_label(_throw_all_values))
-	__(set_nargs(1))
-	__(beq cr1,local_label(_throw_default_1_val))
-	__(mov vsp,imm1)
-	__(b local_label(_throw_all_values))
-local_label(_throw_default_1_val):
-	__(mov imm4,#nil_value)
-	__(vpush1(imm4))
-local_label(_throw_all_values):
-	__(bl _SPnthrowvalues)
-	__(ldr imm3,[rcontext,#tcr.catch_top])
-	__(ldr imm1,[rcontext,#tcr.db_link])
-	__(ldr imm0,[imm3,#catch_frame.db_link])
-	__(ldr imm4,[imm3,#catch_frame.mvflag])
-	__(cmpr(cr0,imm0,imm1))
-	__(cmpri(cr1,imm4,0))
-	__(la tsp,-((tsp_frame.fixed_overhead+fulltag_misc))(imm3))
-	__(beq cr0,local_label(_throw_dont_unbind))
-        __(bl _SPunbind_to)
-local_label(_throw_dont_unbind):
-	__(add imm0,vsp,nargs)
-	__(cmpri(cr0,nargs,0))
-	__(ldr imm1,[imm3,#catch_frame.csp])
-	__(ldr imm1,[imm1,#lisp_frame.savevsp])
-	__(bne cr1,local_label(_throw_multiple))
-        /* Catcher expects single value in arg_z  */
-	__(ldr arg_z,[imm0,#-node_size])
-	__(b local_label(_throw_pushed_values))
-local_label(_throw_multiple):
-	__(beq cr0,local_label(_throw_pushed_values))
-	__(mov imm2,nargs)
-local_label(_throw_mvloop):
-	__(subi imm2,imm2,fixnum_one)
-	__(cmpri(imm2,0))
-	__(ldru(temp0,-node_size(imm0)))
-	__(push(temp0,imm1))
-	__(bgt local_label(_throw_mvloop))
-local_label(_throw_pushed_values):
-	__(mov vsp,imm1)
-	__(ldr imm1,[imm3,#catch_frame.xframe])
-	__(str(imm1,tcr.xframe(rcontext)))
-	__(ldr sp,[imm3,#catch_frame.csp])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-        __(restore_catch_nvrs(imm3))
-	__(ldr imm3,[imm3,#catch_frame.link])
-	__(str(imm3,tcr.catch_top(rcontext)))
-	__(unlink(tsp))
-	__(bx lr)
-local_label(_throw_tag_not_found):
-	__(uuo_interr(error_throw_tag_missing,temp0))
-	__(strux(temp0,vsp,nargs))
-	__(b _SPthrow)
-
-
-/* This takes N multiple values atop the vstack.  */
-_spentry(nthrowvalues)
-        __(mov imm1,#1)
-	__(mov imm4,imm0)
-        __(str(imm1,tcr.unwinding(rcontext)))
-local_label(_nthrowv_nextframe):
-	__(subi imm4,imm4,fixnum_one)
-	__(cmpri(cr1,imm4,0))
-	__(ldr temp0,[rcontext,#tcr.catch_top])
-	__(ldr imm1,[rcontext,#tcr.db_link])
-	__(blt cr1,local_label(_nthrowv_done))
-	__(ldr imm0,[temp0,#catch_frame.db_link])
-	__(ldr imm3,[temp0,#catch_frame.link])
-	__(cmpr(cr0,imm0,imm1))
-	__(str(imm3,tcr.catch_top(rcontext)))
-	__(ldr temp1,[temp0,#catch_frame.catch_tag])
-	__(cmpri(cr7,temp1,unbound_marker))		/* unwind-protect ?  */
-	__(ldr first_nvr,[temp0,#catch_frame.xframe])
-	__(str(first_nvr,tcr.xframe(rcontext)))
-	__(ldr sp,[temp0,#catch_frame.csp])
-	__(beq cr0,local_label(_nthrowv_dont_unbind))
-	__(mflr loc_pc)
-        __(bl _SPunbind_to)
-	__(mtlr loc_pc)
-local_label(_nthrowv_dont_unbind):
-	__(beq cr7,local_label(_nthrowv_do_unwind))
-/* A catch frame.  If the last one, restore context from there.  */
-	__(bne cr1,local_label(_nthrowv_skip))
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(str(rzero,lisp_frame.savevsp(sp)))	/* marker for stack overflow code  */
-	__(add imm1,vsp,nargs)
-	__(mov imm2,nargs)
-	__(b local_label(_nthrowv_push_test))
-local_label(_nthrowv_push_loop):
-	__(ldru(temp1,-node_size(imm1)))
-	__(push(temp1,imm0))
-local_label(_nthrowv_push_test):
-	__(cmpri(imm2,0))
-	__(subi imm2,imm2,fixnum_one)
-	__(bne local_label(_nthrowv_push_loop))
-	__(mov vsp,imm0)
-        __(restore_catch_nvrs(temp0))
-
-local_label(_nthrowv_skip):
-	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
-	__(unlink(tsp))
-	__(discard_lisp_frame())
-	__(b local_label(_nthrowv_nextframe))
-local_label(_nthrowv_do_unwind):
-        /* This is harder.  Call the cleanup code with the multiple */
-	/* values (and nargs, which is a fixnum.)  Remember the throw count  */
-        /* (also a fixnum) as well.  */
-        /* Save our caller's LR and FN in the csp frame created by the unwind-  */
-        /* protect.  (Clever, eh ?)  */
-	__(ldr first_nvr,[temp0,#catch_frame.xframe])
-	__(str(first_nvr,tcr.xframe(rcontext)))
-        __(restore_catch_nvrs(temp0))
-	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
-	__(unlink(tsp))
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr nfn,[sp,#lisp_frame.savefn])
-	__(mtctr loc_pc)	/* cleanup code address.  */
-	__(str(fn,lisp_frame.savefn(sp)))
-	__(mflr loc_pc)
-	__(mov fn,nfn)
-	__(str(loc_pc,lisp_frame.savelr(sp)))
-	__(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count  */
-	__(TSP_Alloc_Var_Boxed_nz(imm0,imm1))
-	__(mov imm2,nargs)
-	__(add imm1,nargs,vsp)
-	__(la imm0,tsp_frame.data_offset(tsp))
-	__(str(nargs,0(imm0)))
-	__(b local_label(_nthrowv_tpushtest))
-local_label(_nthrowv_tpushloop):
-	__(ldru(temp0,-node_size(imm1)))
-	__(stru(temp0,node_size(imm0)))
-	__(subi imm2,imm2,fixnum_one)
-local_label(_nthrowv_tpushtest):
-	__(cmpri(imm2,0))
-	__(bne local_label(_nthrowv_tpushloop))
-	__(stru(imm4,node_size(imm0)))
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-        /* Interrupts should be disabled here (we're calling and returning */
-        /* from the cleanup form.  Clear the tcr.unwinding flag, so that */
-        /* interrupts can be taken if they're enabled in the cleanup form.  */
-        __(str(rzero,tcr.unwinding(rcontext)))        
-	__(bctrl)
-        __(mov imm1,#1)
-	__(la imm0,tsp_frame.data_offset(tsp))
-        __(str(imm1,tcr.unwinding(rcontext)))
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-	__(ldr nargs,[imm0,#0])
-	__(mov imm2,nargs)
-	__(b local_label(_nthrowv_tpoptest))
-local_label(_nthrowv_tpoploop):
-	__(ldru(temp0,node_size(imm0)))
-	__(vpush1(temp0))
-	__(subi imm2,imm2,fixnum_one)
-local_label(_nthrowv_tpoptest):
-	__(cmpri(imm2,0))
-	__(bne local_label(_nthrowv_tpoploop))
-	__(ldr imm4,[imm0,#node_size])
-	__(unlink(tsp))
-	__(b local_label(_nthrowv_nextframe))
-local_label(_nthrowv_done):
-        __(str(rzero,tcr.unwinding(rcontext)))
-        /* Poll for a deferred interrupt.  That clobbers nargs (which we've */
-        /* just expended a lot of effort to preserve), so expend a little *
-        /* more effort. */
-        __(mov imm4,nargs)
-        __(check_pending_interrupt())
-        __(mov nargs,imm4)
-        __(bx lr)
-
-/* This is a (slight) optimization.  When running an unwind-protect, */
-/* save the single value and the throw count in the tstack frame. */
-/* Note that this takes a single value in arg_z.  */
-_spentry(nthrow1value)
-        __(mov imm1,#1)
-	__(mov imm4,imm0)
-        __(str(imm1,tcr.unwinding(rcontext)))
-local_label(_nthrow1v_nextframe):
-	__(subi imm4,imm4,fixnum_one)
-	__(cmpri(cr1,imm4,0))
-	__(ldr temp0,[rcontext,#tcr.catch_top])
-	__(ldr imm1,[rcontext,#tcr.db_link])
-	__(set_nargs(1))
-	__(blt cr1,local_label(_nthrow1v_done))
-	__(ldr imm3,[temp0,#catch_frame.link])
-	__(ldr imm0,[temp0,#catch_frame.db_link])
-	__(cmpr(cr0,imm0,imm1))
-	__(str(imm3,tcr.catch_top(rcontext)))
-        __(ldr imm3,[temp0,#catch_frame.xframe])
-	__(ldr temp1,[temp0,#catch_frame.catch_tag])
-	__(cmpri(cr7,temp1,unbound_marker))		/* unwind-protect ?  */
-        __(str(imm3,tcr.xframe(rcontext)))
-	__(ldr sp,[temp0,#catch_frame.csp])
-	__(beq cr0,local_label(_nthrow1v_dont_unbind))
-	 __(mflr loc_pc)
-         __(bl _SPunbind_to)
-	 __(mtlr loc_pc)
-local_label(_nthrow1v_dont_unbind):
-	__(beq cr7,local_label(_nthrow1v_do_unwind))
-        /* A catch frame.  If the last one, restore context from there.  */
-	__(bne cr1,local_label(_nthrow1v_skip))
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-        __(restore_catch_nvrs(temp0))
-local_label(_nthrow1v_skip):
-	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
-	__(unlink(tsp))
-	__(discard_lisp_frame())
-	__(b local_label(_nthrow1v_nextframe))
-local_label(_nthrow1v_do_unwind):
-        /* This is harder, but not as hard (not as much BLTing) as the  */
-        /* multiple-value case.  */
-        /* Save our caller's LR and FN in the csp frame created by the unwind-  */
-        /* protect.  (Clever, eh ?)  */
-
-        __(restore_catch_nvrs(temp0))
-	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
-	__(unlink(tsp))
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr nfn,[sp,#lisp_frame.savefn])
-	__(mtctr loc_pc)		/* cleanup code address.  */
-	__(str(fn,lisp_frame.savefn(sp)))
-	__(mflr loc_pc)
-	__(mov fn,nfn)
-	__(str(loc_pc,lisp_frame.savelr(sp)))
-	__(TSP_Alloc_Fixed_Boxed(2*node_size)) /* tsp overhead, value, throw count  */
-	__(str(arg_z,tsp_frame.data_offset(tsp)))
-	__(str(imm4,tsp_frame.data_offset+node_size(tsp)))
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-        __(str(rzero,tcr.unwinding(rcontext)))
-	__(bctrl)
-        __(mov imm1,#1)
-	__(ldr arg_z,[tsp,#tsp_frame.data_offset])
-        __(str(imm1,tcr.unwinding(rcontext)))
-	__(ldr imm4,[tsp,#tsp_frame.data_offset+node_size])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-	__(unlink(tsp))
-	__(b local_label(_nthrow1v_nextframe))
-local_label(_nthrow1v_done):
-        __(str(rzero,tcr.unwinding(rcontext)))
-        /* nargs has an undefined value here, so we can clobber it while */
-        /* polling for a deferred interrupt  */
-        __(check_pending_interrupt())
-        __(bx lr)
 
 /* This never affects the symbol's vcell  */
 /* Non-null symbol in arg_y, new value in arg_z          */
 _spentry(bind)
-        __(ldr imm3,[arg_y,#symbol.binding_index])
+        __(ldr imm1,[arg_y,#symbol.binding_index])
         __(ldr imm0,[rcontext,#tcr.tlb_limit])
-        __(trlle(imm0,imm3))           /* tlb too small  */
-        __(cmpri(imm3,0))
+        __(cmp imm0,imm1)
+        __(uuo_tlb_too_small(hs))
+        __(cmp imm1,#0)
         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
-        __(ldr imm1,[rcontext,#tcr.db_link])
-        __(ldr temp1,[imm2,imm3])
+        __(ldr imm0,[rcontext,#tcr.db_link])
+        __(ldr temp1,[imm2,imm0])
         __(beq 9f)
         __(vpush1(temp1))
-        __(vpush1(imm3))
         __(vpush1(imm1))
-        __(strx(arg_z,imm2,imm3))
-        __(str(vsp,tcr.db_link(rcontext)))
+        __(vpush1(imm0))
+        __(str arg_z,[imm2,imm1])
+        __(str vsp,[rcontext,#tcr.db_link])
         __(bx lr)
 9:
         __(mov arg_z,arg_y)
-        __(lwi(arg_y,XSYMNOBIND))
+        __(mov arg_y,#XSYMNOBIND)
         __(set_nargs(2))
         __(b _SPksignalerr)
 
-/* arg_z = symbol: bind it to its current value          */
-_spentry(bind_self)
-        __(ldr imm3,[arg_z,#symbol.binding_index])
-        __(ldr imm0,[rcontext,#tcr.tlb_limit])
-        __(cmpri(imm3,0))
-        __(trlle(imm0,imm3))           /* tlb too small  */
-        __(ldr imm2,[rcontext,#tcr.tlb_pointer])
-        __(ldr imm1,[rcontext,#tcr.db_link])
-        __(ldr temp1,[imm2,imm3])
-        __(cmpri(cr1,temp1,no_thread_local_binding_marker))
-        __(beq 9f)
-        __(mov temp0,temp1)
-        __(bne cr1,1f)
-        __(ldr temp0,[arg_z,#symbol.vcell])
-1:              
-        __(vpush1(temp1))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(strx(temp0,imm2,imm3))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(bx lr)
-9:      __(lwi(arg_y,XSYMNOBIND))
-        __(set_nargs(2))
-        __(b _SPksignalerr)
-
-/* Bind symbol in arg_z to NIL                 */
-_spentry(bind_nil)
-        __(ldr imm3,[arg_z,#symbol.binding_index])
-        __(ldr imm0,[rcontext,#tcr.tlb_limit])
-        __(cmpri(imm3,0))
-        __(beq- 9f)
-        __(trlle(imm0,imm3))           /* tlb too small  */
-        __(ldr imm2,[rcontext,#tcr.tlb_pointer])
-        __(ldr temp1,[imm2,imm3])
-        __(ldr imm1,[rcontext,#tcr.db_link])
-        __(mov imm0,#nil_value)
-        __(vpush1(temp1))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(strx(imm0,imm2,imm3))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(bx lr)
-9:      __(lwi(arg_y,XSYMNOBIND))
-        __(set_nargs(2))
-        __(b _SPksignalerr)
-
-       
-/* Bind symbol in arg_z to its current value;  trap if symbol is unbound */
-_spentry(bind_self_boundp_check)
-        __(ldr imm3,[arg_z,#symbol.binding_index])
-        __(ldr imm0,[rcontext,#tcr.tlb_limit])
-        __(cmpri(imm3,0))
-        __(trlle(imm0,imm3))           /* tlb too small  */
-        __(ldr imm2,[rcontext,#tcr.tlb_pointer])
-        __(ldr temp1,[imm2,imm3])
-        __(ldr imm1,[rcontext,#tcr.db_link])
-        __(beq 9f)              /* no real tlb index  */
-        __(cmpri(temp1,no_thread_local_binding_marker))
-        __(mov temp0,temp1)
-        __(bne 1f)
-        __(ldr temp0,[arg_z,#symbol.vcell])
-1:      __(treqi(temp0,unbound_marker))       
-        __(vpush1(temp1))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(strx(temp0,imm2,imm3))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(bx lr)
-9:      __(lwi(arg_y,XSYMNOBIND))
-        __(set_nargs(2))
-        __(b _SPksignalerr)
-
-
-/* The function pc_luser_xp() - which is used to ensure that suspended threads */
-/* are suspended in a GC-safe way - has to treat these subprims (which  */
-/* implement the EGC write-barrier) specially.  Specifically, a store that */
-/* might introduce an intergenerational reference (a young pointer stored  */
-/* in an old object) has to "memoize" that reference by setting a bit in  */
-/* the global "refbits" bitmap. */
-/* This has to happen atomically, and has to happen atomically wrt GC. */
-/* Note that updating a word in a bitmap is itself not atomic, unless we use */
-/* interlocked loads and stores. */
-
-
-/* For RPLACA and RPLACD, things are fairly simple: regardless of where we  */
-/* are in the function, we can do the store (even if it's already been done)  */
-/* and calculate whether or not we need to set the bit out-of-line.  (Actually */
-/* setting the bit needs to be done atomically, unless we're sure that other */
-/* threads are suspended.) */
-/* We can unconditionally set the suspended thread's PC to its LR. */
-	
-        .globl C(egc_write_barrier_start)
-_spentry(rplaca)
-C(egc_write_barrier_start):
-        __(cmplr(cr2,arg_z,arg_y))
-        __(_rplaca(arg_y,arg_z))
-        __(blelr cr2)
-        __(ref_global(imm2,ref_base))
-        __(sub imm0,arg_y,imm2)
-        __(load_highbit(imm3))
-        __(srri(imm0,imm0,dnode_shift))       
-        __(ref_global(imm1,oldspace_dnode_count))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(cmplr(imm0,imm1))
-        __(srr(imm3,imm3,imm4))
-        __(srri(imm0,imm0,bitmap_shift))       
-        __(ref_global(imm2,refbits))
-        __(bgelr)
-        __(slri(imm0,imm0,word_shift))
-        __(ldr imm1,[imm2,imm0])
-        __(and. imm1,imm1,imm3)
-        __(bnelr)
-1:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 1b)
-        __(isync)
-        __(bx lr)
-
-        .globl C(egc_rplacd)
-_spentry(rplacd)
-C(egc_rplacd):
-        __(cmplr(cr2,arg_z,arg_y))
-	__(_rplacd(arg_y,arg_z))
-        __(blelr cr2)
-        __(ref_global(imm2,ref_base))
-        __(sub imm0,arg_y,imm2)
-        __(load_highbit(imm3))
-        __(srri(imm0,imm0,dnode_shift))       
-        __(ref_global(imm1,oldspace_dnode_count))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(cmplr(imm0,imm1))
-        __(srr(imm3,imm3,imm4))
-        __(srri(imm0,imm0,bitmap_shift))       
-        __(ref_global(imm2,refbits))
-        __(bgelr)
-        __(slri(imm0,imm0,word_shift))
-        __(ldr imm1,[imm2,imm0])
-        __(and. imm1,imm1,imm3)
-        __(bnelr)        
-1:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 1b)
-        __(isync)
-        __(bx lr)
-
-/* Storing into a gvector can be handled the same way as storing into a CONS. */
-
-        .globl C(egc_gvset)
-_spentry(gvset)
-C(egc_gvset):
-        __(cmplr(cr2,arg_z,arg_x))
-        __(la imm0,misc_data_offset(arg_y))
-        __(strx(arg_z,arg_x,imm0))
-        __(blelr cr2)
-        __(add imm0,imm0,arg_x)
-        __(ref_global(imm2,ref_base))
-        __(load_highbit(imm3))
-        __(ref_global(imm1,oldspace_dnode_count))
-        __(sub imm0,imm0,imm2)
-        __(srri(imm0,imm0,dnode_shift))       
-        __(cmplr(imm0,imm1))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(srri(imm0,imm0,bitmap_shift))       
-        __(srr(imm3,imm3,imm4))
-        __(ref_global(imm2,refbits))
-        __(bgelr)
-        __(slri(imm0,imm0,word_shift))
-        __(ldrx(imm1,imm2,imm0))
-        __(and. imm1,imm1,imm3)
-        __(bnelr)        
-1:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 1b)
-        __(isync)
-        __(bx lr)
-
-/* This is a special case of storing into a gvector: if we need to memoize  */
-/* the store, record the address of the hash-table vector in the refmap,  */
-/* as well. */
-        .globl C(egc_set_hash_key)        
-_spentry(set_hash_key)
-C(egc_set_hash_key):
-        __(cmplr(cr2,arg_z,arg_x))
-        __(la imm0,misc_data_offset(arg_y))
-        __(strx(arg_z,arg_x,imm0))
-        __(blelr cr2)
-        __(add imm0,imm0,arg_x)
-        __(ref_global(imm2,ref_base))
-        __(load_highbit(imm3))
-        __(ref_global(imm1,oldspace_dnode_count))
-        __(sub imm0,imm0,imm2)
-        __(srri(imm0,imm0,dnode_shift))       
-        __(cmplr(imm0,imm1))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(srri(imm0,imm0,bitmap_shift))       
-        __(srr(imm3,imm3,imm4))
-        __(ref_global(imm2,refbits))
-        __(bgelr)
-        __(slri(imm0,imm0,word_shift))
-        __(ldrx(imm1,imm2,imm0))
-        __(and. imm1,imm1,imm3)
-        __(bne 2f)        
-1:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 1b)
-        __(isync)
-2:              
-        __(ref_global(imm1,ref_base))
-        __(sub imm0,arg_x,imm1)
-        __(srri(imm0,imm0,dnode_shift))
-        __(load_highbit(imm3))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(srri(imm0,imm0,bitmap_shift))
-        __(srr(imm3,imm3,imm4))
-        __(slri(imm0,imm0,word_shift))
-        __(ldrx(imm1,imm2,imm0))
-        __(and. imm1,imm1,imm3)
-        __(bnelr)
-3:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 3b)
-        __(isync)
-        __(bx lr)
-        
-/*
-   Interrupt handling (in pc_luser_xp()) notes:	
-   If we are in this function and before the test which follows the
-   conditional (at egc_store_node_conditional), or at that test
-   and cr0`eq' is clear, pc_luser_xp() should just let this continue
-   (we either haven't done the store conditional yet, or got a
-   possibly transient failure.)  If we're at that test and the
-   cr0`EQ' bit is set, then the conditional store succeeded and
-   we have to atomically memoize the possible intergenerational
-   reference.  Note that the local labels 4 and 5 are in the
-   body of the next subprim (and at or beyond 'egc_write_barrier_end').
-
-   N.B:	it's not possible to really understand what's going on just
-   by the state of the cr0`eq' bit.  A transient failure in the
-   conditional stores that handle memoization might clear cr0`eq'
-   without having completed the memoization.
-*/
-
-        .globl C(egc_store_node_conditional)
-        .globl C(egc_write_barrier_end)
-_spentry(store_node_conditional)
-C(egc_store_node_conditional):
-        __(cmplr(cr2,arg_z,arg_x))
-        __(vpop(temp0))
-        __(unbox_fixnum(imm4,temp0))
-1:      __(lrarx(temp1,arg_x,imm4))
-        __(cmpr(cr1,temp1,arg_y))
-        __(bne cr1,5f)
-        __(strcx(arg_z,arg_x,imm4))
-	.globl C(egc_store_node_conditional_test)
-C(egc_store_node_conditional_test):	
-        __(bne 1b)
-        __(isync)
-        __(add imm0,imm4,arg_x)
-        __(ref_global(imm2,ref_base))
-        __(ref_global(imm1,oldspace_dnode_count))
-        __(sub imm0,imm0,imm2)
-        __(load_highbit(imm3))
-        __(srri(imm0,imm0,dnode_shift))       
-        __(cmplr(imm0,imm1))
-        __(extract_bit_shift_count(imm2,imm0))
-        __(srri(imm0,imm0,bitmap_shift))       
-        __(srr(imm3,imm3,imm2))
-        __(ref_global(imm2,refbits))
-        __(bge 4f)
-        __(slri(imm0,imm0,word_shift))
-2:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx( imm1,imm2,imm0))
-        __(bne- 2b)
-        __(isync)
-        __(b 4f)
-
-/* arg_z = new value, arg_y = expected old value, arg_x = hash-vector,
-   vsp`0' = (boxed) byte-offset 
-   Interrupt-related issues are as in store_node_conditional, but
-   we have to do more work to actually do the memoization.*/
-_spentry(set_hash_key_conditional)
-	.globl C(egc_set_hash_key_conditional)
-C(egc_set_hash_key_conditional):
-	__(cmplr(cr2,arg_z,arg_x))
-	__(vpop(imm4))
-	__(unbox_fixnum(imm4,imm4))
-1:	__(lrarx(temp1,arg_x,imm4))
-	__(cmpr(cr1,temp1,arg_y))
-	__(bne cr1,5f)
-	__(strcx(arg_z,arg_x,imm4))
-	.globl C(egc_set_hash_key_conditional_test)
-C(egc_set_hash_key_conditional_test):	
-	__(bne 1b)
-	__(isync)
-	__(add imm0,imm4,arg_x)
-	__(ref_global(imm2,ref_base))
-	__(ref_global(imm1,oldspace_dnode_count))
-	__(sub imm0,imm0,imm2)
-	__(load_highbit(imm3))
-	__(srri(imm0,imm0,dnode_shift))
-	__(cmplr(imm0,imm1))
-	__(extract_bit_shift_count(imm2,imm0))
-	__(srri(imm0,imm0,bitmap_shift))
-	__(srr(imm3,imm3,imm2))
-	__(ref_global(imm2,refbits))
-	__(bge 4f)
-	__(slri(imm0,imm0,word_shift))
-2:	__(lrarx(imm1,imm2,imm0))
-	__(or imm1,imm1,imm3)
-	__(strcx(imm1,imm2,imm0))
-	__(bne- 2b)
-	__(isync)
-	/* Memoize hash table header */		
-        __(ref_global(imm1,ref_base))
-        __(sub imm0,arg_x,imm1)
-        __(srri(imm0,imm0,dnode_shift))
-        __(load_highbit(imm3))
-        __(extract_bit_shift_count(imm4,imm0))
-        __(srri(imm0,imm0,bitmap_shift))
-        __(srr(imm3,imm3,imm4))
-        __(slri(imm0,imm0,word_shift))
-        __(ldrx(imm1,imm2,imm0))
-        __(and. imm1,imm1,imm3)
-        __(bne 4f)
-3:      __(lrarx(imm1,imm2,imm0))
-        __(or imm1,imm1,imm3)
-        __(strcx(imm1,imm2,imm0))
-        __(bne- 3b)
-        __(isync)
-C(egc_write_barrier_end):
-4:	__(mov arg_z,#t_value)
-	__(bx lr)
-5:      __(mov imm0,#RESERVATION_DISCHARGE)
-        __(strcx(rzero,0,imm0))
-	__(mov arg_z,#nil_value)
-	__(bx lr)
-	
-	
-	       
 _spentry(conslist)
 	__(mov arg_z,#nil_value)
-	__(cmpri(nargs,0))
+        __(cmp nargs,#0)
 	__(b 2f)	
 1:
-	__(ldr temp0,[vsp,#0])
-	__(cmpri(nargs,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(Cons(arg_z,temp0,arg_z))
-	__(subi nargs,nargs,fixnum_one)
+        __(vpop1(arg_y))
+	__(Cons(arg_z,arg_z,arg_z))
+	__(subs nargs,nargs,#fixnum_one)
 2:
 	__(bne 1b)
@@ -742,316 +113,189 @@
 /* do list*: last arg in arg_z, all others vpushed, nargs set to #args vpushed.  */
 /* Cons, one cons cell at at time.  Maybe optimize this later.  */
+	
 _spentry(conslist_star)
-	__(cmpri(nargs,0))
+        __(cmp nargs,#0)
 	__(b 2f)	
 1:
-	__(ldr temp0,[vsp,#0])
-	__(cmpri(nargs,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(Cons(arg_z,temp0,arg_z))
-	__(subi nargs,nargs,fixnum_one)
+	__(vpop1(arg_y))
+	__(Cons(arg_z,arg_y,arg_z))
+	__(subs nargs,nargs,fixnum_one)
 2:
 	__(bne 1b)
 	__(bx lr)
-
-/* We always have to create a tsp frame (even if nargs is 0), so the compiler  */
-/* doesn't get confused.  */
-_spentry(stkconslist)
-	__(mov arg_z,#nil_value)
-	__(cmpri(cr1,nargs,0))
-	__(add imm1,nargs,nargs)
-	__(addi imm1,imm1,tsp_frame.fixed_overhead)
-	__(TSP_Alloc_Var_Boxed(imm1,imm2))
-	__(la imm1,tsp_frame.data_offset+fulltag_cons(tsp))
-	__(b 2f)
-1:	__(ldr temp0,[vsp,#0])
-	__(cmpri(cr1,nargs,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(_rplaca(imm1,temp0))
-	__(_rplacd(imm1,arg_z))
-	__(mov arg_z,imm1)
-	__(la imm1,cons.size(imm1))
-	__(la nargs,-fixnum_one(nargs))
-2:
-	__(bne cr1,1b)
+	
+_spentry(makes32)
+        __(adds imm1,imm0,imm0)
+	__(addsvc arg_z,imm1,imm1)
+	__(bxvc lr)
+	__(movc16(imm1,one_digit_bignum_header))
+	__(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(1)))
+	__(str imm0,[arg_z,#misc_data_offset])
 	__(bx lr)
 
-/* do list*: last arg in arg_z, all others vpushed,  */
-/* nargs set to #args vpushed.  */
-_spentry(stkconslist_star)
-	__(cmpri(cr1,nargs,0))
-	__(add imm1,nargs,nargs)
-	__(addi imm1,imm1,tsp_frame.fixed_overhead)
-	__(TSP_Alloc_Var_Boxed(imm1,imm2))
-	__(la imm1,tsp_frame.data_offset+fulltag_cons(tsp))
-	__(b 2f)
-1:	__(ldr temp0,[vsp,#0])
-	__(cmpri(cr1,nargs,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(_rplaca(imm1,temp0))
-	__(_rplacd(imm1,arg_z))
-	__(mov arg_z,imm1)
-	__(la imm1,cons.size(imm1))
-	__(la nargs,-fixnum_one(nargs))
-2:
-	__(bne cr1,1b)
+/* Construct a lisp integer out of the 32-bit unsigned value in imm0 */
+
+        
+_spentry(makeu32)
+        __(tst imm0,#0xe0000000)
+        __(box_fixnum(arg_z,imm0))
+        __(bxeq lr)
+        __(tst imm0,#0x80000000)
+        __(bne 2f)
+        __(movc16(imm1,one_digit_bignum_header))
+        __(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(1)))
+	__(str imm0,[arg_z,#misc_data_offset])
+	__(bx lr)
+2:              
+	__(movc16(imm1,two_digit_bignum_header))
+	__(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(2)))
+	__(str imm0,[arg_z,#misc_data_offset])
 	__(bx lr)
 
+        
+/* arg_z has overflowed (by one bit) as the result of an addition or subtraction. */
+/* Make a bignum out of it. */
 
-/* Make a stack-consed simple-vector out of the NARGS objects  */
-/* on top of the vstack; return it in arg_z.  */
-_spentry(mkstackv)
-	__(cmpri(cr1,nargs,0))
-	__(dnode_align(imm1,nargs,tsp_frame.fixed_overhead+node_size))
-	__(TSP_Alloc_Var_Boxed_nz(imm1,imm2))
-	__(slwi imm0,nargs,num_subtag_bits-fixnumshift)
-	__(ori imm0,imm0,subtag_simple_vector)
-	__(str(imm0,tsp_frame.data_offset(tsp)))
-	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
-	__(beq- cr1,2f)
-	__(la imm0,misc_data_offset(arg_z))
-	__(add imm1,imm0,nargs)
+_spentry(fix_overflow)
+        __(unbox_fixnum(imm0,arg_z))
+        __(eor imm0,imm0,#0xc0000000)
+        __(b _SPmakes32)
+
+_spentry(builtin_plus)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(adds arg_z,arg_y,arg_z)
+        __(bxvc lr)
+        __(b _SPfix_overflow)
 1:
-	__(la nargs,-node_size(nargs))
-	__(cmpri(cr1,nargs,0))
-	__(ldr temp1,[vsp,#0])
-	__(la vsp,node_size(vsp))
-	__(stru(temp1,-node_size(imm1)))
-	__(bne cr1,1b)
-2:
+	__(jump_builtin(_builtin_plus,2))
+	
+_spentry(builtin_minus)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(subs arg_z,arg_y,arg_z)
+        __(bxvc lr)
+        __(b _SPfix_overflow)
+1:
+	__(jump_builtin(_builtin_minus,2))
+
+/*  Construct a lisp integer out of the 64-bit unsigned value in */
+/*           imm0 (low 32 bits) and imm1 (high 32 bits) */
+        	
+_spentry(makeu64)
+        __(cmp imm1,0)
+        __(beq _SPmakeu32)
+        __(blt 3f)
+        __(movc16(imm2,two_digit_bignum_header))
+	__(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
+	__(str imm0,[arg_z,#misc_data_offset])
+	__(str imm1,[arg_z,#misc_data_offset+4])
+	__(bx lr)
+3:              
+        __(movc16(imm2,three_digit_bignum_header))
+	__(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
+	__(str imm0,[arg_z,#misc_data_offset])
+	__(str imm1,[arg_z,#misc_data_offset+4])
 	__(bx lr)
 
-	
+/*  Construct a lisp integer out of the 64-bit signed value in */
+/*        imm0 (low 32 bits) and imm1 (high 32 bits). */
+_spentry(makes64)
+        __(cmp imm1,imm0,asr #31) /* is imm1 sign extension of imm0 ? */
+        __(beq _SPmakes32)        /* forget imm1 if so */
+	__(movc16(imm2,two_digit_bignum_header))
+	__(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
+	__(str imm0,[arg_z,#misc_data_offset])
+	__(str imm1,[arg_z,#misc_data_offset+4])
+	__(bx lr)
         
+_spentry(builtin_times)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(unbox_fixnum(imm2,arg_z))
+        __(smull arg_z,imm1,imm2,arg_y)
+        /* Now have a "64-bit fixnum" in imm1(high) and arg_z(low). If */
+        /* imm1 is just a sign extension of arg_z, return arg_z */
+        __(cmp imm1,arg_z,asr #(nbits_in_word-1))
+        __(bxeq lr)
+        /* Need to ashift the pair imm1:imm0 right fixnumshift bits */
+        __(mov imm0,imm0,lsr #fixnumshift)
+        __(and imm2,imm1,#fixnummask)
+        __(orr imm0,imm0,imm2,lsl #(nbits_in_word-fixnumshift))
+        __(unbox_fixnum(imm1,imm1))
+        __(b _SPmakes64)
 
-_spentry(setqsym)
-	__(ldr imm0,[arg_y,#symbol.flags])
-	__(andi. imm0,imm0,sym_vbit_const_mask)
-	__(beq _SPspecset)
-	__(mov arg_z,arg_y)
-	__(lwi(arg_y,XCONST))
-	__(set_nargs(2))
-	__(b _SPksignalerr)
+1:	__(jump_builtin(_builtin_times,2))
 
+_spentry(builtin_eq)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addeq arg_z,arg_z,#t_offset)
+        __(bx lr)        
+1:
+	__(jump_builtin(_builtin_eq,2))
 
-	
-_spentry(progvsave)
-	/* Error if arg_z isn't a proper list.  That's unlikely, */
-	/* but it's better to check now than to crash later. */
-	
-	__(cmpri(arg_z,nil_value))
-	__(mov arg_x,arg_z)	/* fast  */
-	__(mov temp1,arg_z)	/* slow  */
-	__(beq 9f)		/* Null list is proper  */
-0:	
-	__(trap_unless_list(arg_x,imm0))
-	__(_cdr(temp2,arg_x))	/* (null (cdr fast)) ?  */
-	__(cmpri(cr3,temp2,nil_value))
-	__(trap_unless_list(temp2,imm0,cr0))
-	__(_cdr(arg_x,temp2))
-	__(beq cr3,9f)
-	__(_cdr(temp1,temp1))
-	__(cmpr(arg_x,temp1))
-	__(bne 0b)
-	__(lwi(arg_y,XIMPROPERLIST))
-	__(set_nargs(2))
-	__(b _SPksignalerr)
-9:	/* Whew 	 */
-	
-        /* Next, determine the length of arg_y.  We  */
-        /* know that it's a proper list.  */
-	__(mov imm0,#-node_size)
-	__(mov arg_x,arg_y)
+_spentry(builtin_ne)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addne arg_z,arg_z,#t_offset)
+	__(bx lr)
 1:
-	__(cmpri(cr0,arg_x,nil_value))
-	__(la imm0,node_size(imm0))
-	__(_cdr(arg_x,arg_x))
-	__(bne 1b)
-	/* imm0 is now (boxed) triplet count.  */
-	/* Determine word count, add 1 (to align), and make room.  */
-	/* if count is 0, make an empty tsp frame and exit  */
-	__(cmpri(cr0,imm0,0))
-	__(add imm1,imm0,imm0)
-	__(add imm1,imm1,imm0)
-        __(dnode_align(imm1,imm1,node_size))
-	__(bne+ cr0,2f)
-	 __(TSP_Alloc_Fixed_Boxed(2*node_size))
-	 __(bx lr)
-2:
-	__(la imm1,tsp_frame.fixed_overhead(imm1))	/* tsp header  */
-	__(TSP_Alloc_Var_Boxed_nz(imm1,imm2))
-	__(str(imm0,tsp_frame.data_offset(tsp)))
-	__(ldr imm2,[tsp,#tsp_frame.backlink])
-	__(mov arg_x,arg_y)
-	__(ldr imm1,[rcontext,#tcr.db_link])
-        __(ldr imm3,[rcontext,#tcr.tlb_limit])
-3:
-        __(cmpri(cr1,arg_z,nil_value))
-	__(_car(temp0,arg_x))
-        __(ldr imm0,[temp0,#symbol.binding_index])
-	__(_cdr(arg_x,arg_x))
-        __(trlle(imm3,imm0))
-        __(ldr imm4,[rcontext,#tcr.tlb_pointer]) /* Need to reload after trap  */
-        __(ldrx(temp3,imm4,imm0))
-	__(cmpri(cr0,arg_x,nil_value))
-        __(mov temp2,#unbound_marker)
-        __(beq cr1,4f)
-	__(_car(temp2,arg_z))
-	__(_cdr(arg_z,arg_z))
-4:      __(push(temp3,imm2))
-	__(push(imm0,imm2))
-	__(push(imm1,imm2))
-        __(strx(temp2,imm4,imm0))
-	__(mov imm1,imm2)
-	__(bne cr0,3b)
-	__(str(imm2,tcr.db_link(rcontext)))
+	__(jump_builtin(_builtin_ne,2))
+
+_spentry(builtin_gt)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addgt arg_z,arg_z,#t_offset)
 	__(bx lr)
+1:
+	__(jump_builtin(_builtin_gt,2))
 
-	
-/* Allocate a miscobj on the temp stack.  (Push a frame on the tsp and  */
-/* heap-cons the object if there's no room on the tstack.)  */
-_spentry(stack_misc_alloc)
-        __ifdef(`PPC64')
-         __(extract_unsigned_byte_bits_(imm2,arg_y,56))
-         __(unbox_fixnum(imm0,arg_z))
-         __(clrldi imm2,imm0,64-nlowtagbits)
-         __(extract_fulltag(imm1,imm0))
-         __(bne cr0,9f)
-         __(cmpdi cr2,imm2,lowtag_nodeheader)
-         __(cmpdi cr4,imm1,ivector_class_8_bit)
-         __(cmpdi cr1,imm1,ivector_class_64_bit)
-         __(cmpdi cr3,imm1,ivector_class_32_bit)
-         __(cmpdi cr5,imm1,ivector_class_other_bit)
-         __(sldi imm1,arg_y,num_subtag_bits-fixnumshift)
-         __(mov imm2,arg_y)
-         __(beq cr2,3f)
-         __(cmpdi cr2,imm0,subtag_bit_vector)
-         __(beq cr1,3f)
-         __(beq cr3,1f)
-         __(beq cr4,2f)
-         __(beq cr2,0f)
-         /* 2 bytes per element  */
-         __(srdi imm2,imm2,2)
-         __(b 3f)
-0:       /* bit-vector case  */
-         __(addi imm2,imm2,7<<fixnumshift)
-         __(srdi imm2,imm2,3+fixnumshift)
-         __(b 3f)        
-         /* 4 bytes per element  */
-1:       __(srdi imm2,imm2,1)
-         __(b 3f)
-2:       /* 1 byte per element  */
-         __(srdi imm2,imm2,3)
-3:       /* 8 bytes per element  */
-         __(or imm0,imm1,imm0)   /* imm0 = header, imm2 = byte count  */
-         __(dnode_align(imm3,imm2,tsp_frame.fixed_overhead+node_size))
-	 __(cmpldi cr0,imm3,tstack_alloc_limit) /* more than limit ?  */
-	 __(bgt- cr0,4f)
-	 __(TSP_Alloc_Var_Boxed_nz(imm3,imm4))
-        /* Slap the header on the vector, then return.  */
-	 __(str(imm0,tsp_frame.data_offset(tsp)))
-	 __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+_spentry(builtin_ge)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addge arg_z,arg_z,#t_offset)
 	__(bx lr)
-        /* Too large to safely fit on tstack.  Heap-cons the vector, but make  */
-        /* sure that there's an empty tsp frame to keep the compiler happy.  */
-4:       __(TSP_Alloc_Fixed_Unboxed(0))
-	 __(b _SPmisc_alloc)
-        __else
-	 __(rlwinm. imm2,arg_y,32-fixnumshift,0,(8+fixnumshift)-1)
-	 __(unbox_fixnum(imm0,arg_z))
-	 __(extract_fulltag(imm1,imm0))
-	 __(bne- cr0,9f)
-	 __(cmpri(cr0,imm1,fulltag_nodeheader))
-	 __(mov imm3,imm0)
-	 __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))
-	 __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) /* imm0 now = header  */
-	 __(mov imm2,arg_y)
-	 __(beq cr0,1f)	/* do probe if node object  */
-        		/* (fixnum element count = byte count).  */
-	 __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))
-	 __(bng cr1,1f) /* do probe if 32-bit imm object  */
-	 __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))
-	 __(srwi imm2,imm2,1)
-	 __(bgt cr0,3f)
-	 __(bgt cr1,1f)
-	 __(srwi imm2,imm2,1)
-/* imm2 now = byte count.  Add 4 for header, 7 to align, then  */
-/*	clear low three bits.  */
 1:
-         __(dnode_align(imm3,imm2,tsp_frame.fixed_overhead+node_size))
-	 __(cmplri(cr0,imm3,tstack_alloc_limit)) /* more than limit ?  */
-	 __(bgt- cr0,0f)
-	 __(TSP_Alloc_Var_Boxed_nz(imm3,imm4))
+	__(jump_builtin(_builtin_ge,2))
 
-/* Slap the header on the vector, then return.  */
-	 __(str(imm0,tsp_frame.data_offset(tsp)))
-	 __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
-	 __(bx lr)
-9: 
+_spentry(builtin_lt)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addgt arg_z,arg_z,#t_offset)
+	__(bx lr)
+1:
+	__(jump_builtin(_builtin_lt,2))
 
+_spentry(builtin_le)
+        __(test_two_fixnums(arg_y,arg_z,imm0))
+        __(bne 1f)
+        __(cmp arg_y,arg_z)
+        __(mov arg_z,#nil_value)
+        __(addle arg_z,arg_z,#t_offset)
+	__(bx lr)
+1:
+	__(jump_builtin(_builtin_le,2))
 
+/* funcall nfn, returning multiple values if it does.  */
+_spentry(mvpass)
+        __(subs imm0,nargs,#node_size*nargregs)
+        __(movge imm0,#0)
+        __(add imm0,vsp,imm0)
+	__(build_lisp_frame(temp1,imm0))
+        __(adr lr,C(ret1valn))
+	__(mov fn,#0)
+	__(funcall_nfn())
 
-/* Too large to safely fit on tstack.  Heap-cons the vector, but make  */
-/* sure that there's an empty tsp frame to keep the compiler happy.  */
-0:
-	 __(TSP_Alloc_Fixed_Unboxed(0))
-	 __(b _SPmisc_alloc)
-3:
-	 __(cmplri(imm3,subtag_double_float_vector))
-	 __(slwi imm2,arg_y,1)
-	 __(beq 1b)
-	 __(addi imm2,arg_y,7<<fixnumshift)
-	 __(srwi imm2,imm2,fixnumshift+3)
-	 __(b 1b)
-        __endif
-        
-/* subtype (boxed, of course) is vpushed, followed by nargs bytes worth of  */
-/* initial-contents.  Note that this can be used to cons any type of initialized  */
-/* node-header'ed misc object (symbols, closures, ...) as well as vector-like  */
-/* objects.  */
-/* Note that we're guaranteed to win (or force GC, or run out of memory)  */
-/* because nargs < 32K.  */
-_spentry(gvector)
-        __(subi nargs,nargs,node_size)
-	__(ldrx(arg_z,vsp,nargs))
-	__(unbox_fixnum(imm0,arg_z))
-        __ifdef(`PPC64')
-         __(sldi imm1,nargs,num_subtag_bits-fixnum_shift)
-         __(or imm0,imm0,imm1)
-        __else
-	 __(rlwimi imm0,nargs,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits)
-        __endif
-        __(dnode_align(imm1,nargs,node_size))
-	__(Misc_Alloc(arg_z,imm0,imm1))
-	__(mov imm1,nargs)
-	__(la imm2,misc_data_offset(imm1))
-	__(b 2f)
-1:
-	__(strx(temp0,arg_z,imm2))
-2:
-	__(subi imm1,imm1,node_size)
-	__(cmpri(cr0,imm1,0))
-	__(subi imm2,imm2,node_size)
-	__(vpop(temp0))         /* Note the intentional fencepost: */
-				/* discard the subtype as well.  */
-	__(bge cr0,1b)
-	__(bx lr)
-	
-	
-/* funcall temp0, returning multiple values if it does.  */
-_spentry(mvpass)
-	__(cmpri(cr0,nargs,node_size*nargregs))
-	__(mflr loc_pc)
-	__(mov imm0,vsp)
-	__(ble+ cr0,1f)
-	 __(subi imm0,imm0,node_size*nargregs)
-	 __(add imm0,imm0,nargs)
-1:
-	__(build_lisp_frame(fn,loc_pc,imm0))
-	__(ref_global(loc_pc,ret1val_addr))
-	__(mov fn,#0)
-	__(mtlr loc_pc)
-	__(do_funcall())
-	
 /* ret1valn returns "1 multiple value" when a called function does not  */
 /* return multiple values.  Its presence on the stack (as a return address)  */
@@ -1059,41 +303,8 @@
 
 _exportfn(C(ret1valn))
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(discard_lisp_frame())
+        __(restore_lisp_frame(imm0))
 	__(vpush1(arg_z))
 	__(set_nargs(1))
 	__(bx lr)
-	
-_spentry(fitvals)
-	__(subf. imm0,nargs,imm0)
-	__(mov imm1,#nil_value)
-	__(bge 2f)
-	__(sub vsp,vsp,imm0)
-	__(bx lr)
-1:
-	__(subic. imm0,imm0,node_size)
-	__(vpush1(imm1))
-	__(addi nargs,nargs,node_size)
-2:
-	__(bne 1b)
-	__(bx lr)
-
-
-_spentry(nthvalue)
-	__(add imm0,vsp,nargs)
-	__(ldr imm1,[imm0,#0])
-	__(cmplr(imm1,nargs))	/*  do unsigned compare:	 if (n < 0) => nil.  */
-	__(mov arg_z,#nil_value)
-	__(neg imm1,imm1)
-	__(subi imm1,imm1,node_size)
-	__(bge 1f)
-	__(ldrx(arg_z,imm0,imm1))
-1:	
-	__(la vsp,node_size(imm0))
-	__(bx lr)
-        
 
 /* Come here to return multiple values when  */
@@ -1102,39 +313,27 @@
 
 _spentry(values)
-	__(mflr loc_pc)
 local_label(return_values):  
 	__(ref_global(imm0,ret1val_addr))
 	__(mov arg_z,#nil_value)
-	/* max tsp frame is 4K. 8+8 is overhead for save_values_to_tsp below  */
-	/* and @do_unwind in nthrowvalues in "sp_catch.s".  */
-	__(cmpri(cr2,nargs,4096-(dnode_size+dnode_size)))
-	__(cmpr(cr1,imm0,loc_pc))
-	__(cmpri(cr0,nargs,fixnum_one))
-	__(bge cr2,2f)
-	__(beq+ cr1,3f)
-	__(mtlr loc_pc)
+	__(cmp imm0,lr)
+	__(beq 3f)
+	__(cmp nargs,#fixnum_one)
 	__(add imm0,nargs,vsp)
-	__(blt- cr0,1f)
-	__(ldr arg_z,[imm0,#-node_size])
-1:
+	__(ldrge arg_z,[imm0,#-node_size])
 	__(mov vsp,temp0)
 	__(bx lr)
 
-2:
-	__(uuo_interr(error_too_many_values,nargs))
-	__(b 2b)
 
 /* Return multiple values to real caller.  */
 3:
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+	__(ldr lr,[sp,#lisp_frame.savelr])
 	__(add imm1,nargs,vsp)
 	__(ldr imm0,[sp,#lisp_frame.savevsp])
 	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(cmpr(cr0,imm1,imm0)) /* a fairly common case  */
-	__(mtlr loc_pc)
-	__(cmpri(cr1,nargs,fixnum_one)) /* sadly, a very common case  */
+	__(cmp imm1,imm0) /* a fairly common case  */
 	__(discard_lisp_frame())
-	__(beqlr cr0) /* already in the right place  */
-	__(bne cr1,4f)
+	__(bxeq lr) /* already in the right place  */
+	__(cmp nargs,#fixnum_one) /* sadly, a very common case  */
+	__(bne 4f)
 	 __(ldr arg_z,[vsp,#0])
 	 __(mov vsp,imm0)
@@ -1142,1551 +341,5680 @@
 	 __(bx lr)
 4:
-	__(blt cr1,6f)
-	__(mov imm2,#fixnum_one)
+	__(blt 6f)
+	__(mov temp1,#fixnum_one)
 5:
-	__(cmpr(cr0,imm2,nargs))
-	__(addi imm2,imm2,fixnum_one)
-	__(ldru(arg_z,-node_size(imm1)))
-	__(push(arg_z,imm0))
-	__(bne cr0,5b)
+	__(cmp temp1,nargs)
+	__(add temp1,temp1,#fixnum_one)
+	__(ldr arg_z,[imm1,#-node_size]!)
+	__(push1(imm0,arg_z))
+	__(bne 5b)
 6:
 	__(mov vsp,imm0)
 	__(bx lr)
 
-	.globl C(nvalret)
 	
 /* Come here with saved context on top of stack.  */
 _spentry(nvalret)
+	.globl C(nvalret)
 C(nvalret):	
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+	__(ldr lr,[sp,#lisp_frame.savelr])
 	__(ldr temp0,[sp,#lisp_frame.savevsp])
 	__(ldr fn,[sp,#lisp_frame.savefn])
 	__(discard_lisp_frame())
         __(b local_label(return_values))
-        	
-/* Provide default (NIL) values for &optional arguments; imm0 is  */
-/* the (fixnum) upper limit on the total of required and &optional  */
-/* arguments.  nargs is preserved, all arguments wind up on the  */
-/* vstack.  */
-_spentry(default_optional_args)
-	__(cmplr( cr7,nargs,imm0))
-	__(mov imm5,#nil_value)
-	__(vpush_argregs())
-	__(mov imm1,nargs)
-	__(bgelr cr7)
-1:	
-	__(addi imm1,imm1,fixnum_one)
-	__(cmpr(cr0,imm1,imm0))
-	__(vpush1(imm5))
-	__(bne cr0,1b)
-	__(bx lr)
+                                                
 	
-/* Indicate whether &optional arguments were actually supplied.  nargs  */
-/* contains the actual arg count (minus the number of required args);  */
-/* imm0 contains the number of &optional args in the lambda list.  */
-/* Note that nargs may be > imm0 if &rest/&key is involved.  */
-_spentry(opt_supplied_p)
-	__(mov imm1,#0)
-1:
-	/* (vpush (< imm1 nargs))  */
-        __ifdef(`PPC64')
-	 __(xor imm2,imm1,nargs)
-	 __(sradi imm2,imm2,63)
-	 __(or imm2,imm2,imm1)
-	 __(addi imm1,imm1,fixnumone)
-	 __(cmpr(cr0,imm1,imm0))
-	 __(subf imm2,nargs,imm2)
-	 __(srdi imm2,imm2,63)
-         __(mulli imm2,imm2,t_offset)
-	 __(addi imm2,imm2,nil_value)
-	 __(vpush1(imm2))
-	 __(bne cr0,1b)
-	 __(bx lr)
-        __else
-	 __(xor imm2,imm1,nargs)
-	 __(srawi imm2,imm2,31)
-	 __(or imm2,imm2,imm1)
-	 __(addi imm1,imm1,fixnumone)
-	 __(cmpr(cr0,imm1,imm0))
-	 __(subf imm2,nargs,imm2)
-	 __(srwi imm2,imm2,31)
-	 __(insrwi imm2,imm2,1,27)
-	 __(addi imm2,imm2,nil_value)
-	 __(vpush1(imm2))
-	 __(bne cr0,1b)
-	 __(bx lr)
-        __endif
-	
-
-
-/* If nargs is <= imm0, vpush a nil.  Otherwise, cons a list of length  */
-/* (- nargs imm0) and vpush it.  */
-/* Use this entry point to heap-cons a simple &rest arg.  */
-_spentry(heap_rest_arg)
-	__(mov imm0,#0)
-	__(vpush_argregs())
- 	__(sub imm1,nargs,imm0)
-	__(cmpri(imm1,0))
-	__(mov arg_z,#nil_value)
-	__(b 2f)
-1:
-	__(ldr temp0,[vsp,#0])
-	__(cmpri(imm1,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(Cons(arg_z,temp0,arg_z))
-	__(subi imm1,imm1,fixnum_one)
-2:
-	__(bgt 1b)
-	__(vpush1(arg_z))
-	__(bx lr)
-
-	
-/* And this entry point when the argument registers haven't yet been  */
-/* vpushed (as is typically the case when required/&rest but no  */
-/* &optional/&key.)  */
-_spentry(req_heap_rest_arg)
-	__(vpush_argregs())
- 	__(sub imm1,nargs,imm0)
-	__(cmpri(imm1,0))
-	__(mov arg_z,#nil_value)
-	__(b 2f)
-1:
-	__(ldr temp0,[vsp,#0])
-	__(cmpri(imm1,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(Cons(arg_z,temp0,arg_z))
-	__(subi imm1,imm1,fixnum_one)
-2:
-	__(bgt 1b)
-	__(vpush1(arg_z))
-	__(bx lr)
-
-
-_spentry(heap_cons_rest_arg)
- 	__(sub imm1,nargs,imm0)
-	__(cmpri(imm1,0))
-	__(mov arg_z,#nil_value)
-	__(b 2f)
-1:
-	__(ldr temp0,[vsp,#0])
-	__(cmpri(imm1,fixnum_one))
-	__(la vsp,node_size(vsp))
-	__(Cons(arg_z,temp0,arg_z))
-	__(subi imm1,imm1,fixnum_one)
-2:
-	__(bgt 1b)
-	__(vpush1(arg_z))
-	__(bx lr)
-
-	
-_spentry(simple_keywords)
-	__(mov imm0,#0)
-        __(vpush_argregs())
-        __(b _SPkeyword_bind)
-                
-_spentry(keyword_args)
-	__(vpush_argregs())
-        __(b _SPkeyword_bind)
-
-/* Treat the last (- nargs imm0) values on the vstack as keyword/value  */
-/* pairs.  There'll be imm3 keyword arguments.  Imm2 contains flags  */
-/* that indicate whether &allow-other-keys was specified and whether  */
-/* or not to leave the keyword/value pairs on the vstack for an &rest  */
-/* argument.  Temp3 contains a vector of keyword specifiers which we  */
-/* must (in general) match.  */
-/* If the number of arguments is greater than imm0, the difference must  */
-/* be even.  */
-/* Note that the caller hasn't yet saved its caller's context and that  */
-/* the temp registers used to pass next_method_context  */
-/* (temp1) may still have "live" values in them, as does nfn (temp2).  */
-
-define(`keyword_flags',`imm2')
-define(`keyword_vector',`temp3')
-define(`keyword_count',`imm3')
-
-
-
-define(`varptr',`save0')
-define(`valptr',`save1')
-define(`limit',`save2')
-
-_spentry(keyword_bind)
-        /* Before we can really do anything, we have to  */
-        /* save the caller's context.  To do so, we need to know  */
-        /* how many args have actually been pushed.  Ordinarily, that'd  */
-        /* be "nargs", but we may have pushed more args than we received  */
-	/* if we had to default any &optionals.  */
-	/* So, the number of args pushed so far is the larger of nargs  */
-	/* and the (canonical) total of required/&optional args received.  */
-	__(cmpr(cr0,nargs,imm0))
-	__(add arg_z,vsp,nargs)
-	__(bge+ cr0,1f)
-	__(add arg_z,vsp,imm0)
-1:
-	__(build_lisp_frame(fn,loc_pc,arg_z))
-	__(mov fn,nfn)
-	/* If there are key/value pairs to consider, we slide them down  */
-	/* the vstack to make room for the value/supplied-p pairs.  */
-	/* The first step in that operation involves pushing imm3 pairs  */
-	/* of NILs.  */
-	/* If there aren't any such pairs, the first step is the last  */
-	/* step.  */
-	__(cmpri(cr0,imm3,0))
-	__(mov arg_z,#0)
-	__(sub imm1,nargs,imm0)
-	__(mov imm4,vsp)	/* in case odd keywords error  */
-	__(cmpri(cr1,imm1,0))
-	__(b 3f)
-2:
-	__(addi arg_z,arg_z,fixnum_one)
-	__(cmplr(cr0,arg_z,imm3))
-	__(mov imm5,#nil_value)
-	__(vpush1(imm5))
-	__(vpush1(imm5))
-3:
-	__(bne cr0,2b)
-	__(andi. arg_z,imm1,fixnum_one)
-	__(blelr cr1)	/* no keyword/value pairs to consider.  */
-	__(bne cr0,odd_keywords)
-	/* We have key/value pairs.  Move them to the top of the vstack,  */
-	/* then set the value/supplied-p vars to NIL.  */
-	/* Have to use some save regs to do this.  */
-	__(vpush1(limit))
-	__(vpush1(valptr))
-	__(vpush1(varptr))
-	/* recompute ptr to user args in case stack overflowed  */
-	__(add imm4,vsp,imm3)
-	__(add imm4,imm4,imm3)
-	__(addi imm4,imm4,3*node_size)
-	/* error if odd number of keyword/value args  */
-	__(mov varptr,imm4)
-	__(la limit,3*node_size(vsp))
-	__(mov valptr,limit)
-	__(mov arg_z,imm1)
-4:
-	__(mov imm4,#nil_value)
-	__(subi arg_z,arg_z,2<<fixnumshift)
-	__(cmplri(cr0,arg_z,0))
-	__(ldr arg_x,[varptr,#node_size*0])
-	__(ldr arg_y,[varptr,#node_size*1])
-	__(str(imm4,node_size*0(varptr)))
-	__(str(imm4,node_size*1(varptr)))
-	__(la varptr,node_size*2(varptr))
-	__(str(arg_x,node_size*0(valptr)))
-	__(str(arg_y,node_size*1(valptr)))
-	__(la valptr,node_size*2(valptr))
-	__(bne cr0,4b)
-
-
-        /* Now, iterate through each supplied keyword/value pair.  If  */
-        /* it's :allow-other-keys and the corresponding value is non-nil,  */
-        /* note that other keys will be allowed.  */
-        /* Find its position in the function's keywords vector.  If that's  */
-        /* nil, note that an unknown keyword was encountered.  */
-        /* Otherwise, if the keyword arg hasn't already had a value supplied,  */
-        /* supply it.  */
-        /* When done, complain if any unknown keywords were found and that  */
-        /* situation was unexpected.  */
-	__(mov imm4,valptr)
-5:
-        __(cmpri(cr0,keyword_flags,16<<fixnumshift)) /* seen :a-o-k yet ?  */
-	__(ldru(arg_z,-node_size(valptr)))
-	__(ldru(arg_y,-node_size(valptr)))
-	__(cmpri(cr1,arg_y,nil_value))
-	__(mov arg_x,#nrs.kallowotherkeys)
-        /* cr6_eq <- (eq current-keyword :allow-other-keys)  */
-	__(cmpr(cr6,arg_x,arg_z))
-	__(cmpr(cr7,valptr,limit))
-	__(bne cr6,6f)
-        __(bge cr0,6f) /* Already seen :allow-other-keys  */
-        __(ori keyword_flags,keyword_flags,16<<fixnumshift)
-	__(beq cr1,6f)
-	__(ori keyword_flags,keyword_flags,fixnum_one)
-6:
-	__(cmpri(cr1,imm3,0))
-	__(mov imm1,#misc_data_offset)
-	__(mov imm0,#0)
-	__(b 8f)
-7:
-	__(addi imm0,imm0,fixnum_one)
-	__(cmpr(cr1,imm0,imm3))
-	__(ldrx(arg_x,keyword_vector,imm1))
-	__(cmpr(cr0,arg_x,arg_z))
-	__(addi imm1,imm1,fixnum_one)
-	__(bne cr0,8f)
-	__(add imm0,imm0,imm0)
-	__(sub imm0,varptr,imm0)
-	__(ldr arg_x,[imm0,#0])
-	__(cmpri(cr0,arg_x,nil_value))
-	__(mov arg_z,#t_value)
-	__(bne cr0,9f)
-	__(str(arg_y,node_size(imm0)))
-	__(str(arg_z,0(imm0)))
-	__(b 9f)
-8:
-	__(bne cr1,7b)
-	/* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */
-        /* be set.  */
-        __(beq cr6,9f)
-	__(ori keyword_flags,keyword_flags,2<<fixnumshift)
-9:
-	__(bne cr7,5b)
-	__(vpop(varptr))
-	__(vpop(valptr))
-	__(vpop(limit))
-	/* All keyword/value pairs have been processed.  */
-	/* If we saw an unknown keyword and didn't expect to, error.  */
-	/* Unless bit 2 is set in the fixnum in keyword_flags, discard the  */
-	/* keyword/value pairs from the vstack.  */
-	__(andi. imm0,keyword_flags,(fixnum_one)|(2<<fixnumshift))
-	__(cmpri(cr0,imm0,2<<fixnumshift))
-	__(beq- cr0,badkeys)
-	__(andi. imm2,keyword_flags,4<<fixnumshift)
-	__(bnelr cr0)
-	__(mov vsp,imm4)
-	__(bx lr)
-
-/* Signal an error.  We saved context on entry, so this thing doesn't  */
-/* have to.  */
-/* The "unknown keywords" error could be continuable (ignore them.)  */
-/* It might be hard to then cons an &rest arg.  */
-/* In the general case, it's hard to recover the set of args that were  */
-/* actually supplied to us ...  */
-/* For now, just cons a list out of the keyword/value pairs */
-/* that were actually provided, and signal an "invalid keywords" */
-/* error with that list as an operand.  */
-odd_keywords:
-	__(mov vsp,imm4)
-	__(mov nargs,imm1)
-	__(b 1f)
-badkeys:
-	__(sub nargs,imm4,vsp)
-1:
-	__(bl _SPconslist)
-	__(mov arg_y,#XBADKEYS)
-	__(set_nargs(2))
-	__(b _SPksignalerr)
-
-/*  A PowerOpen ff-call.  arg_z is either a fixnum (word-aligned entrypoint) */
-/*  or a macptr (whose address had better be word-aligned as well.)  A */
-/*  PowerOpen stack frame is on top of the stack; 4 additional words (to */
-/*  be used a a lisp frame) sit under the C frame. */
-
-/*  Since we probably can't deal with FP exceptions in foreign code, we */
-/*  disable them in the FPSCR, then check on return to see if any previously */
-/*  enabled FP exceptions occurred. */
-
-/*  As it turns out, we can share a lot of code with the eabi version of */
-/*  ff-call.  Some things that happen up to the point of call differ between */
-/*  the ABIs, but everything that happens after is the same. */
-
-        
-_spentry(poweropen_ffcall)
-LocalLabelPrefix`'ffcall:                
-	__(mflr loc_pc)
-	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
-	__(mov save0,rcontext)	/* or address globals.  */
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(cr7,imm0,subtag_macptr))
-	__(ldr save1,[sp,#0])	/* bottom of reserved lisp frame  */
-	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
-        __(zero_doublewords save2,0,lisp_frame.size)
-	__(str(save1,lisp_frame.backlink(save2)))
-	__(str(save2,c_frame.backlink(sp)))
-	__(str(fn,lisp_frame.savefn(save2)))
-	__(str(loc_pc,lisp_frame.savelr(save2)))
-	__(str(vsp,lisp_frame.savevsp(save2)))
-        __(mov nargs,arg_z)
-       	__(bne cr7,1f)
-	__(ldr nargs,[arg_z,#macptr.address])
-1:
-	__(ldr save3,[rcontext,#tcr.cs_area])
-	__(str(save2,area.active(save3)))
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(rzero,tcr.ffi_exception(rcontext)))
-	__(mffs f0)
-	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
-	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
-	__(mov r4,#TCR_STATE_FOREIGN)
-	__(str(r4,tcr.valence(rcontext)))
-        __ifdef(`rTOC')
-         __(ld rTOC,8(nargs))
-         __(ld nargs,0(nargs))
-        __else
-	 __(mov rcontext,#0)
-        __endif
-LocalLabelPrefix`'ffcall_setup: 
-	__(mtctr nargs)
-	__(ldr r3,[sp,#c_frame.param0])
-	__(ldr r4,[sp,#c_frame.param1])
-	__(ldr r5,[sp,#c_frame.param2])
-	__(ldr r6,[sp,#c_frame.param3])
-	__(ldr r7,[sp,#c_frame.param4])
-	__(ldr r8,[sp,#c_frame.param5])
-	__(ldr r9,[sp,#c_frame.param6])
-	__(ldr r10,[sp,#c_frame.param7])
-	/* Darwin is allegedly very picky about what register points */
-	/* to the function on entry.  */
-	__(mov r12,nargs)
-LocalLabelPrefix`'ffcall_setup_end: 
-LocalLabelPrefix`'ffcall_call:
-	__(bctrl)
-LocalLabelPrefix`'ffcall_call_end:
-	/* C should have preserved save0 (= rcontext) for us.  */
-	__(ldr sp,[sp,#0])
-	__(mov imm2,save0)
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(mov rzero,#0)
-	__(mov loc_pc,rzero)
-	__(mov arg_x,#nil_value)
-	__(mov arg_y,#nil_value)
-	__(mov arg_z,#nil_value)
-	__(mov temp0,#nil_value)
-	__(mov temp1,#nil_value)
-	__(mov temp2,#nil_value)
-	__(mov temp3,#nil_value)
-	__(mov fn,#nil_value)
-	__(mov rcontext,imm2)
-	__(mov imm2,#TCR_STATE_LISP)
-	__(ldr tsp,[rcontext,#tcr.save_tsp])
-        __(mov save0,#0)
-        __(mov save1,#0)
-        __(mov save2,#0)
-        __(mov save3,#0)
-        __(mov save4,#0)
-        __(mov save5,#0)
-        __(mov save6,#0)
-        __(mov save7,#0)
-        __(mov allocptr,#-dnode_size)
-        __(mov allocbase,#-dnode_size)
-	__(str(imm2,tcr.valence(rcontext)))	
-	__(vpop_saveregs())
-	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
-	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(mffs f0)
-	__(stfd f0,8(sp))
-	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
-        __(clrrwi imm2,imm3,8)
-	__(discard_lisp_frame())
-	__(str(imm2,tcr.ffi_exception(rcontext)))
-	__(lfd f0,tcr.lisp_fpscr(rcontext))
-	__(mtfsf 0xff,f0)
-	__(check_pending_interrupt(`cr1'))
-        __(mtxer rzero)
-        __(mtctr rzero)
-        __ifdef(`PPC64')
-         __ifdef(`DARWIN')
-          __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
-          __(ld imm4,tcr.flags(rcontext))
-          __(and. imm3,imm3,imm4)
-          __(bne cr0,0f)
-         __endif
-        __endif
-	__(bx lr)
-        __ifdef(`PPC64')
-         __ifdef(`DARWIN')
-0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
-          /* was set in tcr.flags.  Clear that bit. */
-          __(andc imm4,imm4,imm3)
-          __(std imm4,tcr.flags(rcontext))
- 	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
-	  /* Box it, then signal a lisp error. */
-          __(mov imm1,#macptr_header)
-          __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
-          __(std imm0,macptr.address(arg_z))
-          __(mov arg_y,#XFOREIGNEXCEPTION)
-          __(set_nargs(2))
-          __(b _SPksignalerr)
-        /* Handle exceptions, for ObjC 2.0 */
-LocalLabelPrefix`'ffcallLandingPad:      
-          __(mov save1,r3)
-          __(cmpdi r4,1)
-          __(beq 1f)
-LocalLabelPrefix`'ffcallUnwindResume:
-          __(ref_global(r12,unwind_resume))
-          __(mtctr r12)
-          __(bctrl)
-LocalLabelPrefix`'ffcallUnwindResume_end:         
-1:        __(mov r3,save1)
-LocalLabelPrefix`'ffcallBeginCatch:
-          __(ref_global(r12,objc2_begin_catch))
-          __(mtctr r12)
-          __(bctrl)
-LocalLabelPrefix`'ffcallBeginCatch_end:          
-          __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
-LocalLabelPrefix`'ffcallEndCatch:  
-          __(ref_global(r12,objc2_end_catch))
-          __(mtctr r12)
-          __(bctrl)              
-LocalLabelPrefix`'ffcallEndCatch_end:     
-          __(ref_global(r12,get_tcr))
-          __(mtctr r12)
-          __(mov imm0,#1)       
-	  __(bctrl)
-          __(ld imm2,tcr.flags(imm0))
-          __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
-          __(std imm2,tcr.flags(imm0))
-          __(mov imm0,save1)
-	  __(b LocalLabelPrefix`'ffcall_call_end)
-LocalLabelPrefix`'ffcall_end:   
-
-        	.section __DATA,__gcc_except_tab
-	  .align 3
-LLSDA1:
-	  .byte	0xff	/* @LPStart format (omit) */
-	  .byte	0x0	/* @TType format (absolute) */
-	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
-	  .byte	0x3	/* call-site format (udata4) */
-	  .byte	0x41	/* uleb128 0x41; Call-site table length */
-	
-	  .long Lffcall_setup-Lffcall	/* region 0 start */
-	  .long Lffcall_setup_end-Lffcall_setup	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-        
-	  .long Lffcall_call-Lffcall	/* region 1 start */
-	  .long Lffcall_call_end-Lffcall_call	/* length */
-	  .long LffcallLandingPad-Lffcall	/* landing pad */
-	  .byte	0x1	/* uleb128 0x1; action */
-        
-	  .long LffcallUnwindResume-Lffcall	/* region 2 start */
-	  .long LffcallUnwindResume_end-LffcallUnwindResume	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-	
-	  .long LffcallBeginCatch-Lffcall	/* region 3 start */
-	  .long LffcallBeginCatch_end-LffcallBeginCatch	/* length */
-	  .long 0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-        
-	  .long LffcallEndCatch-Lffcall
-	  .long LffcallEndCatch_end-LffcallEndCatch	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-        
-	  .byte	0x1	/* Action record table */
-	  .byte	0x0
-	  .align 3
-	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
-          .text
-         __endif
-        __endif
-
-/* Just like poweropen_ffcall, only we save all argument(result)
-   registers in a buffer passed in arg_y on entry before returning
-   to lisp.  (We have to do this in the ffcall glue here, because
-   r9 and r10 - at least - are overloaded as dedicated lisp registers */
-_spentry(poweropen_ffcall_return_registers)
-LocalLabelPrefix`'ffcall_return_registers:                
-	__(mflr loc_pc)
-	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
-        __(ldr save7,[arg_y,#macptr.address])
-	__(mov save0,rcontext)	/* or address globals.  */
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(cr7,imm0,subtag_macptr))
-	__(ldr save1,[sp,#0])	/* bottom of reserved lisp frame  */
-	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
-        __(zero_doublewords save2,0,lisp_frame.size)
-	__(str(save1,lisp_frame.backlink(save2)))
-	__(str(save2,c_frame.backlink(sp)))
-	__(str(fn,lisp_frame.savefn(save2)))
-	__(str(loc_pc,lisp_frame.savelr(save2)))
-	__(str(vsp,lisp_frame.savevsp(save2)))
-        __(mov nargs,arg_z)
-       	__(bne cr7,1f)
-	__(ldr nargs,[arg_z,#macptr.address])
-1:
-	__(ldr save3,[rcontext,#tcr.cs_area])
-	__(str(save2,area.active(save3)))
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(rzero,tcr.ffi_exception(rcontext)))
-	__(mffs f0)
-	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
-	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
-	__(mov r4,#TCR_STATE_FOREIGN)
-	__(str(r4,tcr.valence(rcontext)))
-        __ifdef(`rTOC')
-         __(ld rTOC,8(nargs))
-         __(ld nargs,0(nargs))
-        __else
-	 __(mov rcontext,#0)
-        __endif
-LocalLabelPrefix`'ffcall_return_registers_setup: 
-	__(mtctr nargs)
-	__(ldr r3,[sp,#c_frame.param0])
-	__(ldr r4,[sp,#c_frame.param1])
-	__(ldr r5,[sp,#c_frame.param2])
-	__(ldr r6,[sp,#c_frame.param3])
-	__(ldr r7,[sp,#c_frame.param4])
-	__(ldr r8,[sp,#c_frame.param5])
-	__(ldr r9,[sp,#c_frame.param6])
-	__(ldr r10,[sp,#c_frame.param7])
-	/* Darwin is allegedly very picky about what register points */
-	/* to the function on entry.  */
-	__(mov r12,nargs)
-LocalLabelPrefix`'ffcall_return_registers_setup_end: 
-LocalLabelPrefix`'ffcall_return_registers_call:
-	__(bctrl)
-LocalLabelPrefix`'ffcall_return_registers_call_end:
-        __(str(r3,0*node_size(save7)))        
-        __(str(r4,1*node_size(save7)))        
-        __(str(r5,2*node_size(save7)))        
-        __(str(r6,3*node_size(save7)))        
-        __(str(r7,4*node_size(save7)))        
-        __(str(r8,5*node_size(save7)))        
-        __(str(r9,6*node_size(save7)))        
-        __(str(r10,7*node_size(save7)))
-        __(stfd f1,((8*node_size)+(0*8))(save7))
-        __(stfd f2,((8*node_size)+(1*8))(save7))
-        __(stfd f3,((8*node_size)+(2*8))(save7))
-        __(stfd f4,((8*node_size)+(3*8))(save7))
-        __(stfd f5,((8*node_size)+(4*8))(save7))
-        __(stfd f6,((8*node_size)+(5*8))(save7))
-        __(stfd f7,((8*node_size)+(6*8))(save7))
-        __(stfd f8,((8*node_size)+(7*8))(save7))
-        __(stfd f9,((8*node_size)+(8*8))(save7))
-        __(stfd f10,((8*node_size)+(9*8))(save7))
-        __(stfd f11,((8*node_size)+(10*8))(save7))
-        __(stfd f12,((8*node_size)+(11*8))(save7))
-        __(stfd f13,((8*node_size)+(12*8))(save7))
-	/* C should have preserved save0 (= rcontext) for us.  */
-	__(ldr sp,[sp,#0])
-	__(mov imm2,save0)
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(mov rzero,#0)
-	__(mov loc_pc,rzero)
-	__(mov arg_x,#nil_value)
-	__(mov arg_y,#nil_value)
-	__(mov arg_z,#nil_value)
-	__(mov temp0,#nil_value)
-	__(mov temp1,#nil_value)
-	__(mov temp2,#nil_value)
-	__(mov temp3,#nil_value)
-	__(mov fn,#nil_value)
-	__(mov rcontext,imm2)
-	__(mov imm2,#TCR_STATE_LISP)
-	__(ldr tsp,[rcontext,#tcr.save_tsp])
-        __(mov save0,#0)
-        __(mov save1,#0)
-        __(mov save2,#0)
-        __(mov save3,#0)
-        __(mov save4,#0)
-        __(mov save5,#0)
-        __(mov save6,#0)
-        __(mov save7,#0)
-        __(mov allocptr,#-dnode_size)
-        __(mov allocbase,#-dnode_size)
-	__(str(imm2,tcr.valence(rcontext)))	
-	__(vpop_saveregs())
-	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
-	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(mffs f0)
-	__(stfd f0,8(sp))
-	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
-        __(clrrwi imm2,imm3,8)
-	__(discard_lisp_frame())
-	__(str(imm2,tcr.ffi_exception(rcontext)))
-	__(lfd f0,tcr.lisp_fpscr(rcontext))
-	__(mtfsf 0xff,f0)
-	__(check_pending_interrupt(`cr1'))
-        __(mtxer rzero)
-        __(mtctr rzero)
-        __ifdef(`DARWIN')
-         __ifdef(`PPC64')
-          __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
-          __(ld imm4,tcr.flags(rcontext))
-          __(and. imm3,imm3,imm4)
-          __(bne 0f)
-         __endif
-        __endif
-	__(bx lr)
-
-        __ifdef(`DARWIN')
-         __ifdef(`PPC64')
-0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
-          /* was set in tcr.flags.  Clear that bit. */
-          __(andc imm4,imm4,imm3)
-          __(std imm4,tcr.flags(rcontext))
- 	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
-	  /* Box it, then signal a lisp error. */
-          __(mov imm1,#macptr_header)
-          __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
-          __(std imm0,macptr.address(arg_z))
-          __(mov arg_y,#XFOREIGNEXCEPTION)
-          __(set_nargs(2))
-          __(b _SPksignalerr)
-        /* Handle exceptions, for ObjC 2.0 */
-LocalLabelPrefix`'ffcall_return_registersLandingPad:      
-          __(mov save1,r3)
-          __(cmpdi r4,1)
-          __(beq 1f)
-LocalLabelPrefix`'ffcall_return_registersUnwindResume:
-          __(ref_global(r12,unwind_resume))
-          __(mtctr r12)
-          __(bctrl)
-LocalLabelPrefix`'ffcall_return_registersUnwindResume_end:         
-1:        __(mov r3,save1)
-LocalLabelPrefix`'ffcall_return_registersBeginCatch:
-          __(ref_global(r12,objc2_begin_catch))
-          __(mtctr r12)
-          __(bctrl)
-LocalLabelPrefix`'ffcall_return_registersBeginCatch_end:          
-          __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
-LocalLabelPrefix`'ffcall_return_registersEndCatch:  
-          __(ref_global(r12,objc2_end_catch))
-          __(mtctr r12)
-          __(bctrl)              
-LocalLabelPrefix`'ffcall_return_registersEndCatch_end:     
-          __(ref_global(r12,get_tcr))
-          __(mtctr r12)
-          __(mov imm0,#1)       
-	  __(bctrl)
-          __(ld imm2,tcr.flags(imm0))
-          __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
-          __(std imm2,tcr.flags(imm0))
-          __(mov imm0,save1)
-	  __(b LocalLabelPrefix`'ffcall_return_registers_call_end)
-LocalLabelPrefix`'ffcall_return_registers_end:
-	  .section __DATA,__gcc_except_tab
-	  .align 3
-LLSDA2:
-	  .byte	0xff	/* @LPStart format (omit) */
-  	  .byte	0x0	/* @TType format (absolute) */
-	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
-	  .byte	0x3	/* call-site format (udata4) */
-	  .byte	0x41	/* uleb128 0x41; Call-site table length */
-	
-	  .long Lffcall_return_registers_setup-Lffcall_return_registers	/* region 0 start */
-	  .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-        
-	  .long Lffcall_return_registers_call-Lffcall_return_registers	/* region 1 start */
-	  .long Lffcall_return_registers_call_end-Lffcall_return_registers_call	/* length */
-	  .long Lffcall_return_registersLandingPad-Lffcall_return_registers	/* landing pad */
-	  .byte	0x1	/* uleb128 0x1; action */
-        
-	  .long Lffcall_return_registersUnwindResume-Lffcall_return_registers	/* region 2 start */
-	  .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-	
-	  .long Lffcall_return_registersBeginCatch-Lffcall_return_registers	/* region 3 start */
-	  .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch	/* length */
-	  .long 0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-        
-	  .long Lffcall_return_registersEndCatch-Lffcall_return_registers
-	  .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch	/* length */
-	  .long	0x0	/* landing pad */
-	  .byte	0x0	/* uleb128 0x0; action */
-	  .byte	0x1	/* Action record table */
-	  .byte	0x0
-	  .align 3
-	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
-          .text
-         __endif
-        __endif
-                      
-
-        	
-/* Signal an error synchronously, via %ERR-DISP.  */
-/* If %ERR-DISP isn't fbound, it'd be nice to print a message  */
-/* on the C runtime stderr.  */
-
-_spentry(ksignalerr)
-	__(mov fname,#nrs.errdisp)
-	__(jump_fname)
-        
-/* As in the heap-consed cases, only stack-cons the &rest arg  */
-_spentry(stack_rest_arg)
-	__(mov imm0,#0)
-	__(vpush_argregs())
-        __(b _SPstack_cons_rest_arg)
-
-	
-_spentry(req_stack_rest_arg)
-	__(vpush_argregs())
-        __(b _SPstack_cons_rest_arg)
-	
-_spentry(stack_cons_rest_arg)
-	__(sub imm1,nargs,imm0)
-	__(cmpri(cr0,imm1,0))
-	__(cmpri(cr1,imm1,(4096-dnode_size)/2))
-	__(mov arg_z,#nil_value)
-	__(ble cr0,2f)		/* always temp-push something.  */
-	__(bge cr1,3f)
-	__(add imm1,imm1,imm1)
-	__(dnode_align(imm2,imm1,tsp_frame.fixed_overhead))
-	__(TSP_Alloc_Var_Boxed(imm2,imm3))
-	__(la imm0,tsp_frame.data_offset+fulltag_cons(tsp))
-1:
-	__(cmpri(cr0,imm1,cons.size))	/* last time through ?  */
-	__(subi imm1,imm1,cons.size)
-	__(vpop(arg_x))
-	__(_rplacd(imm0,arg_z))
-	__(_rplaca(imm0,arg_x))
-	__(mov arg_z,imm0)
-	__(la imm0,cons.size(imm0))
-	__(bne cr0,1b)
-	__(vpush1(arg_z))
-	__(bx lr)
-2:
-	__(TSP_Alloc_Fixed_Unboxed(0))
-	__(vpush1(arg_z))
-	__(bx lr)
-3:
-	__(TSP_Alloc_Fixed_Unboxed(0))
-	__(b _SPheap_cons_rest_arg)
-
-/* This was trying to swap exception ports to work around Darwin JNI lossage.
-   It's tended to bitrot, and we have another way to do that now.
-*/        
-_spentry(poweropen_callbackX)
-        .long 0x7c800008        /* debug trap */
-	
-/* Prepend all but the first two (closure code, fn) and last two  */
-/* (function name, lfbits) elements of nfn to the "arglist".  */
-/* Doing things this way (the same way that 68K MCL does) lets  */
-/* functions which take "inherited arguments" work consistently  */
-/* even in cases where no closure object is created.  */
-_spentry(call_closure)        
-	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
-	__(cmpri(cr1,nargs,fixnum_one))
-	__(vector_length(imm0,nfn,imm0))
-	__(subi imm0,imm0,4<<fixnumshift) /* imm0 = inherited arg count  */
-	__(mov imm1,#misc_data_offset+(2<<fixnumshift)) /* point to 1st arg  */
-	__(mov imm4,#nil_value)
-	__(ble+ cr0,local_label(no_insert))
-	/* Some arguments have already been vpushed.  Vpush imm0's worth  */
-	/* of NILs, copy those arguments that have already been vpushed from  */
-	/* the old TOS to the new, then insert all of the inerited args  */
-	/* and go to the function.  */
-	__(mov imm2,#0)
-local_label(push_nil_loop):
-	__(addi imm2,imm2,fixnum_one)
-	__(cmpr(cr2,imm2,imm0))
-	__(vpush1(imm4))
-	__(bne cr2,local_label(push_nil_loop))
-
-	__(mov imm3,vsp)
-	__(add imm4,vsp,imm0)
-	__(subi imm2,nargs,nargregs<<fixnumshift)
-local_label(copy_already_loop):
-	__(cmpri(cr2,imm2,fixnum_one))
-	__(subi imm2,imm2,fixnum_one)
-	__(ldr fname,[imm4,#0])
-	__(addi imm4,imm4,fixnum_one)
-	__(str(fname,0(imm3)))
-	__(addi imm3,imm3,fixnum_one)
-	__(bne cr2,local_label(copy_already_loop))
-
-local_label(insert_loop):
-	__(cmpri(cr2,imm0,fixnum_one))
-	__(ldrx(fname,nfn,imm1))
-	__(addi imm1,imm1,fixnum_one)
-	__(addi nargs,nargs,fixnum_one)
-	__(subi imm0,imm0,fixnum_one)
-	__(push(fname,imm4))
-	__(bne cr2,local_label(insert_loop))
-	__(b local_label(go))
-local_label(no_insert):
-	/* nargregs or fewer args were already vpushed.  */
-	/* if exactly nargregs, vpush remaining inherited vars.  */
-	__(add imm2,imm1,imm0)
-	__(bne cr0,local_label(set_regs))
-local_label(vpush_remaining):
-	__(cmpri(cr2,imm0,fixnum_one))
-	__(ldrx(fname,nfn,imm1))
-	__(addi imm1,imm1,fixnum_one)
-	__(vpush1(fname))
-	__(subi imm0,imm0,fixnum_one)
-	__(addi nargs,nargs,fixnum_one)
-	__(bne cr2,local_label(vpush_remaining))
-	__(b local_label(go))
-local_label(set_regs):
-	/* if nargs was > 1 (and we know that it was < 3), it must have  */
-	/* been 2.  Set arg_x, then vpush the remaining args.  */
-	__(ble cr1,local_label(set_y_z))
-local_label(set_arg_x):
-	__(subi imm0,imm0,fixnum_one)
-	__(cmpri(cr0,imm0,0))
-	__(subi imm2,imm2,fixnum_one)
-	__(ldrx(arg_x,nfn,imm2))
-	__(addi nargs,nargs,fixnum_one)
-	__(bne cr0,local_label(vpush_remaining))
-	__(b local_label(go))
-	/* Maybe set arg_y or arg_z, preceding args  */
-local_label(set_y_z):
-	__(bne cr1,local_label(set_arg_z))
-	/* Set arg_y, maybe arg_x, preceding args  */
-local_label(set_arg_y):
-	__(subi imm0,imm0,fixnum_one)
-	__(cmpri(cr0,imm0,0))
-	__(subi imm2,imm2,fixnum_one)
-	__(ldrx(arg_y,nfn,imm2))
-	__(addi nargs,nargs,fixnum_one)
-	__(bne cr0,local_label(set_arg_x))
-	__(b local_label(go))
-local_label(set_arg_z):
-	__(subi imm0,imm0,fixnum_one)
-	__(cmpri(cr0,imm0,0))
-	__(subi imm2,imm2,fixnum_one)
-	__(ldrx(arg_z,nfn,imm2))
-	__(addi nargs,nargs,fixnum_one)
-	__(bne cr0,local_label(set_arg_y))
-
-local_label(go):
-	__(vrefr(nfn,nfn,1))
-	__(ldr loc_pc,[nfn,#_function.codevector])
-	__(mtctr loc_pc)
-	__(bctr)
-        
-/* This  treats anything that's either */
-/* #+ppc32 (signed-byte 32), (unsigned-byte 32) */
-/* #+ppc64 (signed-byte 64), (unsigned-byte 64) */
-/* as if it denoted a "natural-sized" value.  */
-/* Argument in arg_z, result in imm0.  May use temp0.  */
-_spentry(getxlong)
-        __ifdef(`PPC64')
-        __else
-        __(extract_typecode(imm0,arg_z))
-	__(cmpri(cr0,imm0,tag_fixnum))
-	__(cmpri(cr1,imm0,subtag_bignum))
-	__(unbox_fixnum(imm0,arg_z))
-	__(beqlr cr0)
-	__(mov temp0,arg_z)
-	__(bne- cr1,local_label(error))
-	__(getvheader(imm0,temp0))
-	__(cmpri(cr1,imm0,one_digit_bignum_header))
-	__(cmpri(cr7,imm0,two_digit_bignum_header))
-	__(beq cr1,local_label(big1))
-        __(beq cr7,local_label(big2))
-local_label(error):
-	__(uuo_interr(error_object_not_integer,arg_z)) /* not quite right but what 68K MCL said  */
-
-
-
-local_label(big2):
-	__(vrefr(imm0,temp0,1)) /* sign digit must be 0  */
-	__(cmpri(imm0,0))
-	__(bne local_label(error))
-local_label(big1):
-	__(vrefr(imm0,temp0,0))
-	__(bx lr)
-
-
-        __endif
-                
-/* Everything up to the last arg has been vpushed, nargs is set to  */
-/* the (boxed) count of things already pushed.  */
-/* On exit, arg_x, arg_y, arg_z, and nargs are set as per a normal  */
-/* function call (this may require vpopping a few things.)  */
-/* ppc2-invoke-fn assumes that temp1 is preserved here.  */
-_spentry(spreadargz)
-        __ifdef(`PPC64')
-	 __(extract_fulltag(imm1,arg_z))
-	 __(cmpri(cr1,imm1,fulltag_cons))
-        __else
-	 __(extract_lisptag(imm1,arg_z))
-	 __(cmpri(cr1,imm1,tag_list))
-        __endif
-	__(cmpri(cr0,arg_z,nil_value))
-	__(mov imm0,#0)
-	__(mov arg_y,arg_z)		/*  save in case of error  */
-	__(beq cr0,2f)
-1:
-	__(bne- cr1,3f)
-	__(_car(arg_x,arg_z))
-	__(_cdr(arg_z,arg_z))
-	__(cmpri(cr0,arg_z,nil_value))
-        __ifdef(`PPC64')
-	 __(extract_fulltag(imm1,arg_z))
-	 __(cmpri(cr1,imm1,fulltag_cons))
-        __else
-	 __(extract_lisptag(imm1,arg_z))
-	 __(cmpri(cr1,imm1,tag_list))
-        __endif
-	__(vpush1(arg_x))
-	__(addi imm0,imm0,fixnum_one)
-	__(bne cr0,1b)
-2:
-	__(add. nargs,nargs,imm0)
-	__(cmpri(cr2,nargs,2<<fixnumshift))
-	__(beqlr- cr0)
-	__(vpop(arg_z))
-	__(bltlr cr2)
-	__(vpop(arg_y))
-	__(beqlr cr2)
-	__(vpop(arg_x))
-	__(bx lr)
-        /*  Discard whatever's been vpushed already, complain.  */
-3:	
-	__(add vsp,vsp,imm0)
-	__(mov arg_z,arg_y)		/* recover original arg_z  */
-	__(mov arg_y,#XNOSPREAD)
-	__(set_nargs(2))
-	__(b _SPksignalerr)
-        
-/* Tail-recursively funcall temp0.  */
-/* Pretty much the same as the tcallsym* cases above.  */
-_spentry(tfuncallgen)
-	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(mtlr loc_pc)
-	__(ble cr0,2f)
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	/* can use nfn (= temp2) as a temporary  */
-	__(subi imm1,nargs,nargregs<<fixnumshift)
-	__(add imm1,imm1,vsp)
-1:
-	__(ldru(temp2,-node_size(imm1)))
-	__(cmpr(cr0,imm1,vsp))
-	__(push(temp2,imm0))
-	__(bne cr0,1b)
-	__(mov vsp,imm0)
-	__(do_funcall())
-2:
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(do_funcall())
-
-
-/* Some args were vpushed.  Slide them down to the base of  */
-/* the current frame, then do funcall.  */
-_spentry(tfuncallslide)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	/* can use nfn (= temp2) as a temporary  */
-	__(subi imm1,nargs,nargregs<<fixnumshift)
-	__(add imm1,imm1,vsp)
-	__(mtlr loc_pc)
-1:
-	__(ldru(temp2,-node_size(imm1)))
-	__(cmpr(cr0,imm1,vsp))
-	__(push(temp2,imm0))
-	__(bne cr0,1b)
-	__(mov vsp,imm0)
-	__(do_funcall())
-
-/* No args were vpushed; recover saved context & do funcall  */
-_spentry(tfuncallvsp)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(mtlr loc_pc)
-	__(discard_lisp_frame())
-	__(do_funcall())
-        
-/* Tail-recursively call the (known symbol) in fname.  */
-/* In the general case, we don't know if any args were  */
-/* vpushed or not.  If so, we have to "slide" them down  */
-/* to the base of the frame.  If not, we can just restore  */
-/* vsp, lr, fn from the saved lisp frame on the control stack.  */
-_spentry(tcallsymgen)
-	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(mtlr loc_pc)
-	__(ble cr0,2f)
-
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	/* can use nfn (= temp2) as a temporary  */
-	__(subi imm1,nargs,nargregs<<fixnumshift)
-	__(add imm1,imm1,vsp)
-1:
-	__(ldru(temp2,-node_size(imm1)))
-	__(cmpr(cr0,imm1,vsp))
-	__(push(temp2,imm0))
-	__(bne cr0,1b)
-	__(mov vsp,imm0)
-	__(jump_fname)
-	
-2:		
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(jump_fname)
-	
-	
-/* Some args were vpushed.  Slide them down to the base of  */
-/* the current frame, then do funcall.  */
-_spentry(tcallsymslide)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-	/* can use nfn (= temp2) as a temporary  */
-	__(subi imm1,nargs,nargregs<<fixnumshift)
-	__(add imm1,imm1,vsp)
-1:
-	__(ldru(temp2,-node_size(imm1)))
-	__(cmpr(cr0,imm1,vsp))
-	__(push(temp2,imm0))
-	__(bne cr0,1b)
-	__(mov vsp,imm0)
-	__(jump_fname)
-
-/* No args were vpushed; recover saved context & call symbol  */
-_spentry(tcallsymvsp)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-	__(jump_fname)
-	
-/* Tail-recursively call the function in nfn.  */
-/* Pretty much the same as the tcallsym* cases above.  */
-_spentry(tcallnfngen)
-	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
-	__(ble cr0,_SPtcallnfnvsp)
-        __(b _SPtcallnfnslide)
-
-/* Some args were vpushed.  Slide them down to the base of  */
-/* the current frame, then do funcall.  */
-_spentry(tcallnfnslide)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr imm0,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-	/* Since we have a known function, can use fname as a temporary.  */
-	__(subi imm1,nargs,nargregs<<fixnumshift)
-	__(add imm1,imm1,vsp)
-1:
-	__(ldru(fname,-node_size(imm1)))
-	__(cmpr(cr0,imm1,vsp))
-	__(push(fname,imm0))
-	__(bne cr0,1b)
-	__(mov vsp,imm0)
-       	__(jump_nfn())
-        
-_spentry(tcallnfnvsp)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(mtlr loc_pc)
-       	__(jump_nfn())
-	
-/* Reference index arg_z of a misc-tagged object (arg_y).  */
-/* Note that this conses in some cases.  Return a properly-tagged  */
-/* lisp object in arg_z.  Do type and bounds-checking.  */
-	
-_spentry(misc_ref)
-	__(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))
-	__(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
-	__(vector_length(imm0,arg_y,imm1))
-	__(trlge(arg_z,imm0))
-	__(extract_lowbyte(imm1,imm1))	/* imm1 = subtag  */
-	
-local_label(misc_ref_common):   
-        __ifdef(`PPC64')
-         __(slwi imm1,imm1,3)
-         __(mov imm0,#LO(local_label(misc_ref_jmp)))
-         __(addis imm0,imm0,HA(local_label(misc_ref_jmp)))
-         __(ldx imm0,imm0,imm1)
-         __(mtctr imm0)
-         __(bctr)
-
-local_label(misc_ref_jmp):              
-        /* 00-0f  */
-         .quad local_label(misc_ref_invalid) /* 00 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 01 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 02 immheader_0  */
-         .quad local_label(misc_ref_node) /* 03 function  */
-         .quad local_label(misc_ref_invalid) /* 04 cons  */
-         .quad local_label(misc_ref_invalid) /* 05 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 06 immheader_1  */
-         .quad local_label(misc_ref_node) /* 07 catch_frame  */
-         .quad local_label(misc_ref_invalid) /* 08 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 09 imm_2  */
-         .quad local_label(misc_ref_u32) /* 0a code_vector  */
-         .quad local_label(misc_ref_node) /* 0b slot_vector  */
-         .quad local_label(misc_ref_invalid) /* 0c misc  */
-         .quad local_label(misc_ref_invalid) /* 0d imm3  */
-         .quad local_label(misc_ref_invalid) /* 0e immheader_3  */
-         .quad local_label(misc_ref_node) /* 0f ratio  */
-        /* 10-1f  */
-         .quad local_label(misc_ref_invalid) /* 10 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 11 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 12 immheader_0  */
-         .quad local_label(misc_ref_node) /* 13 symbol_0  */
-         .quad local_label(misc_ref_invalid) /* 14 cons  */
-         .quad local_label(misc_ref_invalid) /* 15 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 16 immheader_1  */
-         .quad local_label(misc_ref_node) /* 17 lisp_tread  */
-         .quad local_label(misc_ref_invalid) /* 18 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 19 imm_2  */
-         .quad local_label(misc_ref_u32) /* 1a xcode_vector  */
-         .quad local_label(misc_ref_node) /* 1b instance  */
-         .quad local_label(misc_ref_invalid) /* 1c misc  */
-         .quad local_label(misc_ref_invalid) /* 1d imm3  */
-         .quad local_label(misc_ref_u64) /* 1e macptr  */
-         .quad local_label(misc_ref_node) /* 1f complex  */
-        /* 20-2f  */
-         .quad local_label(misc_ref_invalid) /* 20 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 21 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 22 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 23 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 24 cons  */
-         .quad local_label(misc_ref_invalid) /* 25 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 26 immheader_1  */
-         .quad local_label(misc_ref_node) /* 27 lock  */
-         .quad local_label(misc_ref_invalid) /* 28 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 29 imm_2  */
-         .quad local_label(misc_ref_u32) /* 2a bignum  */
-         .quad local_label(misc_ref_node) /* 2b struct  */
-         .quad local_label(misc_ref_invalid) /* 2c misc  */
-         .quad local_label(misc_ref_invalid) /* 2d imm3  */
-         .quad local_label(misc_ref_u64) /* 2e dead_macptr  */
-         .quad local_label(misc_ref_invalid) /* 2f nodeheader_3  */
-        /* 30-3f  */
-         .quad local_label(misc_ref_invalid) /* 30 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 31 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 32 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 33 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 34 cons  */
-         .quad local_label(misc_ref_invalid) /* 35 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 36 immheader_1  */
-         .quad local_label(misc_ref_node) /* 37 hash_vector  */
-         .quad local_label(misc_ref_invalid) /* 38 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 39 imm_2  */
-         .quad local_label(misc_ref_u32) /* 3a double_float  */
-         .quad local_label(misc_ref_node) /* 3b istruct  */
-         .quad local_label(misc_ref_invalid) /* 3c misc  */
-         .quad local_label(misc_ref_invalid) /* 3d imm3  */
-         .quad local_label(misc_ref_invalid) /* 3e immheader_3  */
-         .quad local_label(misc_ref_invalid) /* 3f nodeheader_3  */
-        /* 40-4f  */
-         .quad local_label(misc_ref_invalid) /* 40 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 41 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 42 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 43 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 44 cons  */
-         .quad local_label(misc_ref_invalid) /* 45 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 46 immheader_1  */
-         .quad local_label(misc_ref_node) /* 47 pool  */
-         .quad local_label(misc_ref_invalid) /* 48 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 49 imm_2  */
-         .quad local_label(misc_ref_invalid) /* 4a immheader_2  */
-         .quad local_label(misc_ref_node) /* 4b value_cell_2  */
-         .quad local_label(misc_ref_invalid) /* 4c misc  */
-         .quad local_label(misc_ref_invalid) /* 4d imm3  */
-         .quad local_label(misc_ref_invalid) /* 4e immheader_3  */
-         .quad local_label(misc_ref_invalid) /* 4f nodeheader_3  */
-        /* 50-5f  */
-         .quad local_label(misc_ref_invalid) /* 50 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 51 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 52 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 53 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 54 cons  */
-         .quad local_label(misc_ref_invalid) /* 55 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 56 immheader_1  */
-         .quad local_label(misc_ref_node) /* 57 weak  */
-         .quad local_label(misc_ref_invalid) /* 58 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 59 imm_2  */
-         .quad local_label(misc_ref_invalid) /* 5a immheader_2  */
-         .quad local_label(misc_ref_node) /* 5b xfunction  */
-         .quad local_label(misc_ref_invalid) /* 5c misc  */
-         .quad local_label(misc_ref_invalid) /* 5d imm3  */
-         .quad local_label(misc_ref_invalid) /* 5e immheader_3  */
-         .quad local_label(misc_ref_invalid) /* 5f nodeheader_3  */
-        /* 60-6f  */
-         .quad local_label(misc_ref_invalid) /* 60 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 61 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 62 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 63 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 64 cons  */
-         .quad local_label(misc_ref_invalid) /* 65 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 66 immheader_1  */
-         .quad local_label(misc_ref_node) /* 67 package  */
-         .quad local_label(misc_ref_invalid) /* 68 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 69 imm_2  */
-         .quad local_label(misc_ref_invalid) /* 6a immheader_2  */
-         .quad local_label(misc_ref_invalid) /* 6b nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* 6c misc  */
-         .quad local_label(misc_ref_invalid) /* 6d imm3  */
-         .quad local_label(misc_ref_invalid) /* 6e immheader_3  */
-         .quad local_label(misc_ref_invalid) /* 6f nodeheader_3  */
-        /* 70-7f  */
-         .quad local_label(misc_ref_invalid) /* 70 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 71 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 72 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 73 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 74 cons  */
-         .quad local_label(misc_ref_invalid) /* 75 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 76 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* 77 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* 78 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 79 imm_2  */
-         .quad local_label(misc_ref_invalid) /* 7a immheader_2  */
-         .quad local_label(misc_ref_invalid) /* 7b nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* 7c misc  */
-         .quad local_label(misc_ref_invalid) /* 7d imm3  */
-         .quad local_label(misc_ref_invalid) /* 7e immheader_3  */
-         .quad local_label(misc_ref_invalid) /* 7f nodeheader_3  */
-        /* 80-8f  */
-         .quad local_label(misc_ref_invalid) /* 80 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 81 imm_0  */
-         .quad local_label(misc_ref_invalid) /* 82 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* 83 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 84 cons  */
-         .quad local_label(misc_ref_invalid) /* 85 imm_1  */
-         .quad local_label(misc_ref_invalid) /* 86 immheader_1  */
-         .quad local_label(misc_ref_node)    /* 87 arrayH  */ 
-         .quad local_label(misc_ref_invalid) /* 88 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 89 imm_2  */
-         .quad local_label(misc_ref_invalid) /* 8a immheader_2  */
-         .quad local_label(misc_ref_node)    /* 8b vectorH  */
-         .quad local_label(misc_ref_invalid) /* 8c misc  */
-         .quad local_label(misc_ref_invalid) /* 8d imm3  */
-         .quad local_label(misc_ref_invalid) /* 8e immheader_3  */
-         .quad local_label(misc_ref_node) /* 8f simple_vector  */
-        /* 90-9f  */
-         .quad local_label(misc_ref_invalid) /* 90 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 91 imm_0  */
-         .quad local_label(misc_ref_s8) /* 92 s8  */
-         .quad local_label(misc_ref_invalid) /* 93 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* 94 cons  */
-         .quad local_label(misc_ref_invalid) /* 95 imm_1  */
-         .quad local_label(misc_ref_s16) /* 96 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* 97 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* 98 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* 99 imm_2  */
-         .quad local_label(misc_ref_s32) /* 9a s32  */
-         .quad local_label(misc_ref_invalid) /* 9b nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* 9c misc  */
-         .quad local_label(misc_ref_invalid) /* 9d imm3  */
-         .quad local_label(misc_ref_s64) /* 9e s64  */
-         .quad local_label(misc_ref_invalid) /* 9f nodeheader_3  */
-        /* a0-af  */
-         .quad local_label(misc_ref_invalid) /* a0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* a1 imm_0  */
-         .quad local_label(misc_ref_u8) /* a2 u8  */
-         .quad local_label(misc_ref_invalid) /* a3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* a4 cons  */
-         .quad local_label(misc_ref_invalid) /* a5 imm_1  */
-         .quad local_label(misc_ref_u16) /* a6 u16  */
-         .quad local_label(misc_ref_invalid) /* a7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* a8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* a9 imm_2  */
-         .quad local_label(misc_ref_u32) /* aa u32  */
-         .quad local_label(misc_ref_invalid) /* ab nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* ac misc  */
-         .quad local_label(misc_ref_invalid) /* ad imm3  */
-         .quad local_label(misc_ref_u64) /* ae u64  */
-         .quad local_label(misc_ref_invalid) /* af nodeheader_3  */
-        /* b0-bf  */
-         .quad local_label(misc_ref_invalid) /* b0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* b1 imm_0  */
-         .quad local_label(misc_ref_invalid) /* b2 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* b3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* b4 cons  */
-         .quad local_label(misc_ref_invalid) /* b5 imm_1  */
-         .quad local_label(misc_ref_invalid) /* b6 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* b7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* b8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* b9 imm_2  */
-         .quad local_label(misc_ref_single_float_vector) /* ba sf vector  */
-         .quad local_label(misc_ref_invalid) /* bb nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* bc misc  */
-         .quad local_label(misc_ref_invalid) /* bd imm3  */
-         .quad local_label(misc_ref_fixnum_vector) /* be fixnum_vector  */
-         .quad local_label(misc_ref_invalid) /* bf nodeheader_3  */
-        /* c0-cf  */
-         .quad local_label(misc_ref_invalid) /* c0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* c1 imm_0  */
-         .quad local_label(misc_ref_invalid) /* c2 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* c3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* c4 cons  */
-         .quad local_label(misc_ref_invalid) /* c5 imm_1  */
-         .quad local_label(misc_ref_invalid) /* c6 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* c7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* c8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* c9 imm_2  */
-         .quad local_label(misc_ref_invalid) /* ca immheader_2  */
-         .quad local_label(misc_ref_invalid) /* cb nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* cc misc  */
-         .quad local_label(misc_ref_invalid) /* cd imm3  */
-         .quad local_label(misc_ref_double_float_vector) /* ce double-float vector  */
-         .quad local_label(misc_ref_invalid) /* cf nodeheader_3  */
-        /* d0-df  */
-         .quad local_label(misc_ref_invalid) /* d0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* d1 imm_0  */
-         .quad local_label(misc_ref_string) /* d2 string  */
-         .quad local_label(misc_ref_invalid) /* d3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* d4 cons  */
-         .quad local_label(misc_ref_invalid) /* d5 imm_1  */
-         .quad local_label(misc_ref_invalid) /* d6 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* d7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* d8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* d9 imm_2  */
-         .quad local_label(misc_ref_new_string) /* da new_string  */
-         .quad local_label(misc_ref_invalid) /* db nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* dc misc  */
-         .quad local_label(misc_ref_invalid) /* dd imm3  */
-         .quad local_label(misc_ref_invalid) /* de immheader_3  */
-         .quad local_label(misc_ref_invalid) /* df nodeheader_3  */
-        /* e0-ef  */
-         .quad local_label(misc_ref_invalid) /* e0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* e1 imm_0  */
-         .quad local_label(misc_ref_invalid) /* e2 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* e3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* e4 cons  */
-         .quad local_label(misc_ref_invalid) /* e5 imm_1  */
-         .quad local_label(misc_ref_invalid) /* e6 immheader_1  */
-         .quad local_label(misc_ref_invalid) /* e7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* e8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* e9 imm_2  */
-         .quad local_label(misc_ref_invalid) /* ea immheader_2  */
-         .quad local_label(misc_ref_invalid) /* eb nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* ec misc  */
-         .quad local_label(misc_ref_invalid) /* ed imm3  */
-         .quad local_label(misc_ref_invalid) /* ee immheader_3  */
-         .quad local_label(misc_ref_invalid) /* ef nodeheader_3  */
-        /* f0-ff  */
-         .quad local_label(misc_ref_invalid) /* f0 even_fixnum  */
-         .quad local_label(misc_ref_invalid) /* f1 imm_0  */
-         .quad local_label(misc_ref_invalid) /* f2 immheader_0  */
-         .quad local_label(misc_ref_invalid) /* f3 nodeheader_0  */
-         .quad local_label(misc_ref_invalid) /* f4 cons  */
-         .quad local_label(misc_ref_invalid) /* f5 imm_1  */
-         .quad local_label(misc_ref_bit_vector) /* f6 bit_vector  */
-         .quad local_label(misc_ref_invalid) /* f7 nodeheader_1  */
-         .quad local_label(misc_ref_invalid) /* f8 odd_fixnum  */
-         .quad local_label(misc_ref_invalid) /* f9 imm_2  */
-         .quad local_label(misc_ref_invalid) /* fa immheader_2  */
-         .quad local_label(misc_ref_invalid) /* fb nodeheader_2  */
-         .quad local_label(misc_ref_invalid) /* fc misc  */
-         .quad local_label(misc_ref_invalid) /* fd imm3  */
-         .quad local_label(misc_ref_invalid) /* fe immheader_3  */
-         .quad local_label(misc_ref_invalid) /* ff nodeheader_3  */
-	
-         /* A node vector  */
-local_label(misc_ref_node):        
-         __(la imm0,misc_data_offset(arg_z))
-         __(ldx arg_z,arg_y,imm0)
-         __(bx lr)
-local_label(misc_ref_double_float_vector):        
-         __(la imm0,misc_data_offset(arg_z))
-         __(ldx imm0,arg_y,imm0)
-         __(mov imm1,#double_float_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm1,double_float.size))
-         __(std imm0,double_float.value(arg_z))
-         __(bx lr)
-local_label(misc_ref_s64):      
-         __(la imm0,misc_data_offset(arg_z))
-         __(ldx imm0,arg_y,imm0)
-         __(b _SPmakes64)
-local_label(misc_ref_fixnum_vector):    
-         __(la imm0,misc_data_offset(arg_z))
-         __(ldx imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_u64):      
-         __(la imm0,misc_data_offset(arg_z))
-         __(ldx imm0,arg_y,imm0)
-         __(b _SPmakeu64)
-local_label(misc_ref_new_string):        
-         __(srdi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lwzx imm0,arg_y,imm0)
-         __(slwi imm0,imm0,charcode_shift)
-         __(ori arg_z,imm0,subtag_character)
-         __(bx lr)
-local_label(misc_ref_s32):                     
-         __(srdi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lwax imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_u32):                     
-         __(srdi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lwzx imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_single_float_vector):             
-         __(srdi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lwzx imm0,arg_y,imm0)
-         __(rldicr arg_z,imm0,32,31)
-         __(ori arg_z,arg_z,subtag_single_float)
-         __(bx lr)
-local_label(misc_ref_s16):      
-         __(srdi imm0,arg_z,2)
-         __(la imm0,misc_data_offset(imm0))
-         __(lhax imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_u16):
-         __(srdi imm0,arg_z,2)
-         __(la imm0,misc_data_offset(imm0))
-         __(lhzx imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_s8):       
-         __(srdi imm0,arg_z,3)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
-         __(extsb imm0,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_u8):       
-         __(srdi imm0,arg_z,3)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-local_label(misc_ref_string):              
-         __(srdi imm0,arg_z,3)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
-         __(sldi imm0,imm0,charcode_shift)
-         __(ori arg_z,imm0,subtag_character)
-         __(bx lr)
-local_label(misc_ref_bit_vector):               
-	 __(extrwi imm1,arg_z,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
-         __(la imm1,1+fixnumshift(imm1))
-         __(srdi imm0,arg_z,5+fixnumshift)
-         __(sldi imm0,imm0,2)
-	 __(la imm0,misc_data_offset(imm0))
-	 __(lwzx imm0,arg_y,imm0)
-	 __(rlwnm arg_z,imm0,imm1,31-fixnumshift,31-fixnumshift)
-	 __(bx lr)
-local_label(misc_ref_invalid):      
-         __(mov arg_x,#XBADVEC)
-         __(set_nargs(3))
-         __(b _SPksignalerr)        
-        __else
-         __(slwi imm1,imm1,2)
-         __(mov imm0,#LO(local_label(misc_ref_jmp)))
-         __(addis imm0,imm0,HA(local_label(misc_ref_jmp)))
-         __(lwzx imm0,imm0,imm1)
-         __(mtctr imm0)
-         __(bctr)
-
-local_label(misc_ref_jmp):           
-        /* 00-0f  */
+dnl /* Caller has pushed tag and 0 or more values; nargs = nvalues.  */
+dnl /* Otherwise, process unwind-protects and throw to indicated catch frame.  */
+dnl 
+dnl _spentry(throw)
+dnl 	__(ldr imm1,[rcontext, #tcr.catch_top])
+dnl 	__(mov imm0,#0) /* count intervening catch/unwind-protect frames.  */
+dnl 	__(cmpri(cr0,imm1,0))
+dnl 	__(ldr temp0,[vsp,nargs])
+dnl 	__(beq- cr0,local_label(_throw_tag_not_found))
+dnl local_label(_throw_loop):
+dnl 	__(ldr temp1,[imm1,#catch_frame.catch_tag])
+dnl 	__(cmpr(cr0,temp0,temp1))
+dnl 	__(mov imm2,imm1)
+dnl 	__(ldr imm1,[imm1,#catch_frame.link])
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(beq cr0,local_label(_throw_found))
+dnl 	__(addi imm0,imm0,fixnum_one)
+dnl 	__(beq- cr1,local_label(_throw_tag_not_found))
+dnl 	__(b local_label(_throw_loop))
+dnl /* imm2: (tstack-consed) target catch frame, imm0: count of intervening  */
+dnl /* frames. If target isn't a multiple-value receiver, discard extra values */
+dnl /* (less hair, maybe.)  */
+dnl local_label(_throw_found):
+dnl 	__(ldr imm1,[imm2,#catch_frame.mvflag])
+dnl 	__(cmpri(cr0,imm1,0))
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(mov fn,#0)
+dnl 	__(add imm1,vsp,nargs)
+dnl 	__(add imm1,[imm1,#-node_size])
+dnl 	__(bne cr0,local_label(_throw_all_values))
+dnl 	__(set_nargs(1))
+dnl 	__(beq cr1,local_label(_throw_default_1_val))
+dnl 	__(mov vsp,imm1)
+dnl 	__(b local_label(_throw_all_values))
+dnl local_label(_throw_default_1_val):
+dnl 	__(mov imm4,#nil_value)
+dnl 	__(vpush1(imm4))
+dnl local_label(_throw_all_values):
+dnl 	__(bl _SPnthrowvalues)
+dnl 	__(ldr imm3,[rcontext,#tcr.catch_top])
+dnl 	__(ldr imm1,[rcontext,#tcr.db_link])
+dnl 	__(ldr imm0,[imm3,#catch_frame.db_link])
+dnl 	__(ldr imm4,[imm3,#catch_frame.mvflag])
+dnl 	__(cmpr(cr0,imm0,imm1))
+dnl 	__(cmpri(cr1,imm4,0))
+dnl 	__(add tsp,[imm3,#-((tsp_frame.fixed_overhead+fulltag_misc))])
+dnl 	__(beq cr0,local_label(_throw_dont_unbind))
+dnl         __(bl _SPunbind_to)
+dnl local_label(_throw_dont_unbind):
+dnl 	__(add imm0,vsp,nargs)
+dnl 	__(cmpri(cr0,nargs,0))
+dnl 	__(ldr imm1,[imm3,#catch_frame.csp])
+dnl 	__(ldr imm1,[imm1,#lisp_frame.savevsp])
+dnl 	__(bne cr1,local_label(_throw_multiple))
+dnl         /* Catcher expects single value in arg_z  */
+dnl 	__(ldr arg_z,[imm0,#-node_size])
+dnl 	__(b local_label(_throw_pushed_values))
+dnl local_label(_throw_multiple):
+dnl 	__(beq cr0,local_label(_throw_pushed_values))
+dnl 	__(mov imm2,nargs)
+dnl local_label(_throw_mvloop):
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(cmpri(imm2,0))
+dnl 	__(ldru(temp0,-node_size(imm0)))
+dnl 	__(push(temp0,imm1))
+dnl 	__(bgt local_label(_throw_mvloop))
+dnl local_label(_throw_pushed_values):
+dnl 	__(mov vsp,imm1)
+dnl 	__(ldr imm1,[imm3,#catch_frame.xframe])
+dnl 	__(str(imm1,tcr.xframe(rcontext)))
+dnl 	__(ldr sp,[imm3,#catch_frame.csp])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl         __(restore_catch_nvrs(imm3))
+dnl 	__(ldr imm3,[imm3,#catch_frame.link])
+dnl 	__(str(imm3,tcr.catch_top(rcontext)))
+dnl 	__(unlink(tsp))
+dnl 	__(bx lr)
+dnl local_label(_throw_tag_not_found):
+dnl 	__(uuo_interr(error_throw_tag_missing,temp0))
+dnl 	__(strux(temp0,vsp,nargs))
+dnl 	__(b _SPthrow)
+dnl 
+dnl 
+dnl /* This takes N multiple values atop the vstack.  */
+dnl _spentry(nthrowvalues)
+dnl         __(mov imm1,#1)
+dnl 	__(mov imm4,imm0)
+dnl         __(str(imm1,tcr.unwinding(rcontext)))
+dnl local_label(_nthrowv_nextframe):
+dnl 	__(subi imm4,imm4,fixnum_one)
+dnl 	__(cmpri(cr1,imm4,0))
+dnl 	__(ldr temp0,[rcontext,#tcr.catch_top])
+dnl 	__(ldr imm1,[rcontext,#tcr.db_link])
+dnl 	__(blt cr1,local_label(_nthrowv_done))
+dnl 	__(ldr imm0,[temp0,#catch_frame.db_link])
+dnl 	__(ldr imm3,[temp0,#catch_frame.link])
+dnl 	__(cmpr(cr0,imm0,imm1))
+dnl 	__(str(imm3,tcr.catch_top(rcontext)))
+dnl 	__(ldr temp1,[temp0,#catch_frame.catch_tag])
+dnl 	__(cmpri(cr7,temp1,unbound_marker))		/* unwind-protect ?  */
+dnl 	__(ldr first_nvr,[temp0,#catch_frame.xframe])
+dnl 	__(str(first_nvr,tcr.xframe(rcontext)))
+dnl 	__(ldr sp,[temp0,#catch_frame.csp])
+dnl 	__(beq cr0,local_label(_nthrowv_dont_unbind))
+dnl 	__(mflr loc_pc)
+dnl         __(bl _SPunbind_to)
+dnl 	__(mtlr loc_pc)
+dnl local_label(_nthrowv_dont_unbind):
+dnl 	__(beq cr7,local_label(_nthrowv_do_unwind))
+dnl /* A catch frame.  If the last one, restore context from there.  */
+dnl 	__(bne cr1,local_label(_nthrowv_skip))
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(str(rzero,lisp_frame.savevsp(sp)))	/* marker for stack overflow code  */
+dnl 	__(add imm1,vsp,nargs)
+dnl 	__(mov imm2,nargs)
+dnl 	__(b local_label(_nthrowv_push_test))
+dnl local_label(_nthrowv_push_loop):
+dnl 	__(ldru(temp1,-node_size(imm1)))
+dnl 	__(push(temp1,imm0))
+dnl local_label(_nthrowv_push_test):
+dnl 	__(cmpri(imm2,0))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(bne local_label(_nthrowv_push_loop))
+dnl 	__(mov vsp,imm0)
+dnl         __(restore_catch_nvrs(temp0))
+dnl 
+dnl local_label(_nthrowv_skip):
+dnl 	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
+dnl 	__(unlink(tsp))
+dnl 	__(discard_lisp_frame())
+dnl 	__(b local_label(_nthrowv_nextframe))
+dnl local_label(_nthrowv_do_unwind):
+dnl         /* This is harder.  Call the cleanup code with the multiple */
+dnl 	/* values (and nargs, which is a fixnum.)  Remember the throw count  */
+dnl         /* (also a fixnum) as well.  */
+dnl         /* Save our caller's LR and FN in the csp frame created by the unwind-  */
+dnl         /* protect.  (Clever, eh ?)  */
+dnl 	__(ldr first_nvr,[temp0,#catch_frame.xframe])
+dnl 	__(str(first_nvr,tcr.xframe(rcontext)))
+dnl         __(restore_catch_nvrs(temp0))
+dnl 	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
+dnl 	__(unlink(tsp))
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr nfn,[sp,#lisp_frame.savefn])
+dnl 	__(mtctr loc_pc)	/* cleanup code address.  */
+dnl 	__(str(fn,lisp_frame.savefn(sp)))
+dnl 	__(mflr loc_pc)
+dnl 	__(mov fn,nfn)
+dnl 	__(str(loc_pc,lisp_frame.savelr(sp)))
+dnl 	__(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count  */
+dnl 	__(TSP_Alloc_Var_Boxed_nz(imm0,imm1))
+dnl 	__(mov imm2,nargs)
+dnl 	__(add imm1,nargs,vsp)
+dnl 	__(la imm0,tsp_frame.data_offset(tsp))
+dnl 	__(str(nargs,0(imm0)))
+dnl 	__(b local_label(_nthrowv_tpushtest))
+dnl local_label(_nthrowv_tpushloop):
+dnl 	__(ldru(temp0,-node_size(imm1)))
+dnl 	__(stru(temp0,node_size(imm0)))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl local_label(_nthrowv_tpushtest):
+dnl 	__(cmpri(imm2,0))
+dnl 	__(bne local_label(_nthrowv_tpushloop))
+dnl 	__(stru(imm4,node_size(imm0)))
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl         /* Interrupts should be disabled here (we're calling and returning */
+dnl         /* from the cleanup form.  Clear the tcr.unwinding flag, so that */
+dnl         /* interrupts can be taken if they're enabled in the cleanup form.  */
+dnl         __(str(rzero,tcr.unwinding(rcontext)))        
+dnl 	__(bctrl)
+dnl         __(mov imm1,#1)
+dnl 	__(la imm0,tsp_frame.data_offset(tsp))
+dnl         __(str(imm1,tcr.unwinding(rcontext)))
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr nargs,[imm0,#0])
+dnl 	__(mov imm2,nargs)
+dnl 	__(b local_label(_nthrowv_tpoptest))
+dnl local_label(_nthrowv_tpoploop):
+dnl 	__(ldru(temp0,node_size(imm0)))
+dnl 	__(vpush1(temp0))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl local_label(_nthrowv_tpoptest):
+dnl 	__(cmpri(imm2,0))
+dnl 	__(bne local_label(_nthrowv_tpoploop))
+dnl 	__(ldr imm4,[imm0,#node_size])
+dnl 	__(unlink(tsp))
+dnl 	__(b local_label(_nthrowv_nextframe))
+dnl local_label(_nthrowv_done):
+dnl         __(str(rzero,tcr.unwinding(rcontext)))
+dnl         /* Poll for a deferred interrupt.  That clobbers nargs (which we've */
+dnl         /* just expended a lot of effort to preserve), so expend a little *
+dnl         /* more effort. */
+dnl         __(mov imm4,nargs)
+dnl         __(check_pending_interrupt())
+dnl         __(mov nargs,imm4)
+dnl         __(bx lr)
+dnl 
+dnl /* This is a (slight) optimization.  When running an unwind-protect, */
+dnl /* save the single value and the throw count in the tstack frame. */
+dnl /* Note that this takes a single value in arg_z.  */
+dnl _spentry(nthrow1value)
+dnl         __(mov imm1,#1)
+dnl 	__(mov imm4,imm0)
+dnl         __(str(imm1,tcr.unwinding(rcontext)))
+dnl local_label(_nthrow1v_nextframe):
+dnl 	__(subi imm4,imm4,fixnum_one)
+dnl 	__(cmpri(cr1,imm4,0))
+dnl 	__(ldr temp0,[rcontext,#tcr.catch_top])
+dnl 	__(ldr imm1,[rcontext,#tcr.db_link])
+dnl 	__(set_nargs(1))
+dnl 	__(blt cr1,local_label(_nthrow1v_done))
+dnl 	__(ldr imm3,[temp0,#catch_frame.link])
+dnl 	__(ldr imm0,[temp0,#catch_frame.db_link])
+dnl 	__(cmpr(cr0,imm0,imm1))
+dnl 	__(str(imm3,tcr.catch_top(rcontext)))
+dnl         __(ldr imm3,[temp0,#catch_frame.xframe])
+dnl 	__(ldr temp1,[temp0,#catch_frame.catch_tag])
+dnl 	__(cmpri(cr7,temp1,unbound_marker))		/* unwind-protect ?  */
+dnl         __(str(imm3,tcr.xframe(rcontext)))
+dnl 	__(ldr sp,[temp0,#catch_frame.csp])
+dnl 	__(beq cr0,local_label(_nthrow1v_dont_unbind))
+dnl 	 __(mflr loc_pc)
+dnl          __(bl _SPunbind_to)
+dnl 	 __(mtlr loc_pc)
+dnl local_label(_nthrow1v_dont_unbind):
+dnl 	__(beq cr7,local_label(_nthrow1v_do_unwind))
+dnl         /* A catch frame.  If the last one, restore context from there.  */
+dnl 	__(bne cr1,local_label(_nthrow1v_skip))
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl         __(restore_catch_nvrs(temp0))
+dnl local_label(_nthrow1v_skip):
+dnl 	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
+dnl 	__(unlink(tsp))
+dnl 	__(discard_lisp_frame())
+dnl 	__(b local_label(_nthrow1v_nextframe))
+dnl local_label(_nthrow1v_do_unwind):
+dnl         /* This is harder, but not as hard (not as much BLTing) as the  */
+dnl         /* multiple-value case.  */
+dnl         /* Save our caller's LR and FN in the csp frame created by the unwind-  */
+dnl         /* protect.  (Clever, eh ?)  */
+dnl 
+dnl         __(restore_catch_nvrs(temp0))
+dnl 	__(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
+dnl 	__(unlink(tsp))
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr nfn,[sp,#lisp_frame.savefn])
+dnl 	__(mtctr loc_pc)		/* cleanup code address.  */
+dnl 	__(str(fn,lisp_frame.savefn(sp)))
+dnl 	__(mflr loc_pc)
+dnl 	__(mov fn,nfn)
+dnl 	__(str(loc_pc,lisp_frame.savelr(sp)))
+dnl 	__(TSP_Alloc_Fixed_Boxed(2*node_size)) /* tsp overhead, value, throw count  */
+dnl 	__(str(arg_z,tsp_frame.data_offset(tsp)))
+dnl 	__(str(imm4,tsp_frame.data_offset+node_size(tsp)))
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl         __(str(rzero,tcr.unwinding(rcontext)))
+dnl 	__(bctrl)
+dnl         __(mov imm1,#1)
+dnl 	__(ldr arg_z,[tsp,#tsp_frame.data_offset])
+dnl         __(str(imm1,tcr.unwinding(rcontext)))
+dnl 	__(ldr imm4,[tsp,#tsp_frame.data_offset+node_size])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl 	__(unlink(tsp))
+dnl 	__(b local_label(_nthrow1v_nextframe))
+dnl local_label(_nthrow1v_done):
+dnl         __(str(rzero,tcr.unwinding(rcontext)))
+dnl         /* nargs has an undefined value here, so we can clobber it while */
+dnl         /* polling for a deferred interrupt  */
+dnl         __(check_pending_interrupt())
+dnl         __(bx lr)
+dnl 
+dnl /* arg_z = symbol: bind it to its current value          */
+dnl _spentry(bind_self)
+dnl         __(ldr imm3,[arg_z,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(cmpri(imm3,0))
+dnl         __(trlle(imm0,imm3))           /* tlb too small  */
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr temp1,[imm2,imm3])
+dnl         __(cmpri(cr1,temp1,no_thread_local_binding_marker))
+dnl         __(beq 9f)
+dnl         __(mov temp0,temp1)
+dnl         __(bne cr1,1f)
+dnl         __(ldr temp0,[arg_z,#symbol.vcell])
+dnl 1:              
+dnl         __(vpush1(temp1))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str temp0,imm2,imm3)
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 9:      __(mov arg_y,#XSYMNOBIND)
+dnl         __(set_nargs(2))
+dnl         __(b _SPksignalerr)
+dnl 
+dnl /* Bind symbol in arg_z to NIL                 */
+dnl _spentry(bind_nil)
+dnl         __(ldr imm3,[arg_z,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(cmpri(imm3,0))
+dnl         __(beq- 9f)
+dnl         __(trlle(imm0,imm3))           /* tlb too small  */
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr temp1,[imm2,imm3])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(mov imm0,#nil_value)
+dnl         __(vpush1(temp1))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str imm0,imm2,imm3)
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 9:      __(mov arg_y,#XSYMNOBIND)
+dnl         __(set_nargs(2))
+dnl         __(b _SPksignalerr)
+dnl 
+dnl        
+dnl /* Bind symbol in arg_z to its current value;  trap if symbol is unbound */
+dnl _spentry(bind_self_boundp_check)
+dnl         __(ldr imm3,[arg_z,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(cmpri(imm3,0))
+dnl         __(trlle(imm0,imm3))           /* tlb too small  */
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr temp1,[imm2,imm3])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(beq 9f)              /* no real tlb index  */
+dnl         __(cmpri(temp1,no_thread_local_binding_marker))
+dnl         __(mov temp0,temp1)
+dnl         __(bne 1f)
+dnl         __(ldr temp0,[arg_z,#symbol.vcell])
+dnl 1:      __(treqi(temp0,unbound_marker))       
+dnl         __(vpush1(temp1))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str temp0,imm2,imm3)
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 9:      __(mov arg_y,#XSYMNOBIND)
+dnl         __(set_nargs(2))
+dnl         __(b _SPksignalerr)
+dnl 
+dnl 
+dnl /* The function pc_luser_xp() - which is used to ensure that suspended threads */
+dnl /* are suspended in a GC-safe way - has to treat these subprims (which  */
+dnl /* implement the EGC write-barrier) specially.  Specifically, a store that */
+dnl /* might introduce an intergenerational reference (a young pointer stored  */
+dnl /* in an old object) has to "memoize" that reference by setting a bit in  */
+dnl /* the global "refbits" bitmap. */
+dnl /* This has to happen atomically, and has to happen atomically wrt GC. */
+dnl /* Note that updating a word in a bitmap is itself not atomic, unless we use */
+dnl /* interlocked loads and stores. */
+dnl 
+dnl 
+dnl /* For RPLACA and RPLACD, things are fairly simple: regardless of where we  */
+dnl /* are in the function, we can do the store (even if it's already been done)  */
+dnl /* and calculate whether or not we need to set the bit out-of-line.  (Actually */
+dnl /* setting the bit needs to be done atomically, unless we're sure that other */
+dnl /* threads are suspended.) */
+dnl /* We can unconditionally set the suspended thread's PC to its LR. */
+dnl 	
+dnl         .globl C(egc_write_barrier_start)
+dnl _spentry(rplaca)
+dnl C(egc_write_barrier_start):
+dnl         __(cmplr(cr2,arg_z,arg_y))
+dnl         __(_rplaca(arg_y,arg_z))
+dnl         __(blelr cr2)
+dnl         __(ref_global(imm2,ref_base))
+dnl         __(sub imm0,arg_y,imm2)
+dnl         __(load_highbit(imm3))
+dnl         __(srri(imm0,imm0,dnode_shift))       
+dnl         __(ref_global(imm1,oldspace_dnode_count))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(cmplr(imm0,imm1))
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(srri(imm0,imm0,bitmap_shift))       
+dnl         __(ref_global(imm2,refbits))
+dnl         __(bgelr)
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldr imm1,[imm2,imm0])
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bnelr)
+dnl 1:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 1b)
+dnl         __(isync)
+dnl         __(bx lr)
+dnl 
+dnl         .globl C(egc_rplacd)
+dnl _spentry(rplacd)
+dnl C(egc_rplacd):
+dnl         __(cmplr(cr2,arg_z,arg_y))
+dnl 	__(_rplacd(arg_y,arg_z))
+dnl         __(blelr cr2)
+dnl         __(ref_global(imm2,ref_base))
+dnl         __(sub imm0,arg_y,imm2)
+dnl         __(load_highbit(imm3))
+dnl         __(srri(imm0,imm0,dnode_shift))       
+dnl         __(ref_global(imm1,oldspace_dnode_count))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(cmplr(imm0,imm1))
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(srri(imm0,imm0,bitmap_shift))       
+dnl         __(ref_global(imm2,refbits))
+dnl         __(bgelr)
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldr imm1,[imm2,imm0])
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bnelr)        
+dnl 1:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 1b)
+dnl         __(isync)
+dnl         __(bx lr)
+dnl 
+dnl /* Storing into a gvector can be handled the same way as storing into a CONS. */
+dnl 
+dnl         .globl C(egc_gvset)
+dnl _spentry(gvset)
+dnl C(egc_gvset):
+dnl         __(cmplr(cr2,arg_z,arg_x))
+dnl         __(la imm0,misc_data_offset(arg_y))
+dnl         __(str arg_z,arg_x,imm0)
+dnl         __(blelr cr2)
+dnl         __(add imm0,imm0,arg_x)
+dnl         __(ref_global(imm2,ref_base))
+dnl         __(load_highbit(imm3))
+dnl         __(ref_global(imm1,oldspace_dnode_count))
+dnl         __(sub imm0,imm0,imm2)
+dnl         __(srri(imm0,imm0,dnode_shift))       
+dnl         __(cmplr(imm0,imm1))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(srri(imm0,imm0,bitmap_shift))       
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(ref_global(imm2,refbits))
+dnl         __(bgelr)
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldrx(imm1,imm2,imm0))
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bnelr)        
+dnl 1:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 1b)
+dnl         __(isync)
+dnl         __(bx lr)
+dnl 
+dnl /* This is a special case of storing into a gvector: if we need to memoize  */
+dnl /* the store, record the address of the hash-table vector in the refmap,  */
+dnl /* as well. */
+dnl         .globl C(egc_set_hash_key)        
+dnl _spentry(set_hash_key)
+dnl C(egc_set_hash_key):
+dnl         __(cmplr(cr2,arg_z,arg_x))
+dnl         __(la imm0,misc_data_offset(arg_y))
+dnl         __(str arg_z,arg_x,imm0)
+dnl         __(blelr cr2)
+dnl         __(add imm0,imm0,arg_x)
+dnl         __(ref_global(imm2,ref_base))
+dnl         __(load_highbit(imm3))
+dnl         __(ref_global(imm1,oldspace_dnode_count))
+dnl         __(sub imm0,imm0,imm2)
+dnl         __(srri(imm0,imm0,dnode_shift))       
+dnl         __(cmplr(imm0,imm1))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(srri(imm0,imm0,bitmap_shift))       
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(ref_global(imm2,refbits))
+dnl         __(bgelr)
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldrx(imm1,imm2,imm0))
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bne 2f)        
+dnl 1:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 1b)
+dnl         __(isync)
+dnl 2:              
+dnl         __(ref_global(imm1,ref_base))
+dnl         __(sub imm0,arg_x,imm1)
+dnl         __(srri(imm0,imm0,dnode_shift))
+dnl         __(load_highbit(imm3))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(srri(imm0,imm0,bitmap_shift))
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldrx(imm1,imm2,imm0))
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bnelr)
+dnl 3:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 3b)
+dnl         __(isync)
+dnl         __(bx lr)
+dnl         
+dnl /*
+dnl    Interrupt handling (in pc_luser_xp()) notes:	
+dnl    If we are in this function and before the test which follows the
+dnl    conditional (at egc_store_node_conditional), or at that test
+dnl    and cr0`eq' is clear, pc_luser_xp() should just let this continue
+dnl    (we either haven't done the store conditional yet, or got a
+dnl    possibly transient failure.)  If we're at that test and the
+dnl    cr0`EQ' bit is set, then the conditional store succeeded and
+dnl    we have to atomically memoize the possible intergenerational
+dnl    reference.  Note that the local labels 4 and 5 are in the
+dnl    body of the next subprim (and at or beyond 'egc_write_barrier_end').
+dnl 
+dnl    N.B:	it's not possible to really understand what's going on just
+dnl    by the state of the cr0`eq' bit.  A transient failure in the
+dnl    conditional stores that handle memoization might clear cr0`eq'
+dnl    without having completed the memoization.
+dnl */
+dnl 
+dnl         .globl C(egc_store_node_conditional)
+dnl         .globl C(egc_write_barrier_end)
+dnl _spentry(store_node_conditional)
+dnl C(egc_store_node_conditional):
+dnl         __(cmplr(cr2,arg_z,arg_x))
+dnl         __(vpop(temp0))
+dnl         __(unbox_fixnum(imm4,temp0))
+dnl 1:      __(lrarx(temp1,arg_x,imm4))
+dnl         __(cmpr(cr1,temp1,arg_y))
+dnl         __(bne cr1,5f)
+dnl         __(strcx(arg_z,arg_x,imm4))
+dnl 	.globl C(egc_store_node_conditional_test)
+dnl C(egc_store_node_conditional_test):	
+dnl         __(bne 1b)
+dnl         __(isync)
+dnl         __(add imm0,imm4,arg_x)
+dnl         __(ref_global(imm2,ref_base))
+dnl         __(ref_global(imm1,oldspace_dnode_count))
+dnl         __(sub imm0,imm0,imm2)
+dnl         __(load_highbit(imm3))
+dnl         __(srri(imm0,imm0,dnode_shift))       
+dnl         __(cmplr(imm0,imm1))
+dnl         __(extract_bit_shift_count(imm2,imm0))
+dnl         __(srri(imm0,imm0,bitmap_shift))       
+dnl         __(srr(imm3,imm3,imm2))
+dnl         __(ref_global(imm2,refbits))
+dnl         __(bge 4f)
+dnl         __(slri(imm0,imm0,word_shift))
+dnl 2:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx( imm1,imm2,imm0))
+dnl         __(bne- 2b)
+dnl         __(isync)
+dnl         __(b 4f)
+dnl 
+dnl /* arg_z = new value, arg_y = expected old value, arg_x = hash-vector,
+dnl    vsp`0' = (boxed) byte-offset 
+dnl    Interrupt-related issues are as in store_node_conditional, but
+dnl    we have to do more work to actually do the memoization.*/
+dnl _spentry(set_hash_key_conditional)
+dnl 	.globl C(egc_set_hash_key_conditional)
+dnl C(egc_set_hash_key_conditional):
+dnl 	__(cmplr(cr2,arg_z,arg_x))
+dnl 	__(vpop(imm4))
+dnl 	__(unbox_fixnum(imm4,imm4))
+dnl 1:	__(lrarx(temp1,arg_x,imm4))
+dnl 	__(cmpr(cr1,temp1,arg_y))
+dnl 	__(bne cr1,5f)
+dnl 	__(strcx(arg_z,arg_x,imm4))
+dnl 	.globl C(egc_set_hash_key_conditional_test)
+dnl C(egc_set_hash_key_conditional_test):	
+dnl 	__(bne 1b)
+dnl 	__(isync)
+dnl 	__(add imm0,imm4,arg_x)
+dnl 	__(ref_global(imm2,ref_base))
+dnl 	__(ref_global(imm1,oldspace_dnode_count))
+dnl 	__(sub imm0,imm0,imm2)
+dnl 	__(load_highbit(imm3))
+dnl 	__(srri(imm0,imm0,dnode_shift))
+dnl 	__(cmplr(imm0,imm1))
+dnl 	__(extract_bit_shift_count(imm2,imm0))
+dnl 	__(srri(imm0,imm0,bitmap_shift))
+dnl 	__(srr(imm3,imm3,imm2))
+dnl 	__(ref_global(imm2,refbits))
+dnl 	__(bge 4f)
+dnl 	__(slri(imm0,imm0,word_shift))
+dnl 2:	__(lrarx(imm1,imm2,imm0))
+dnl 	__(or imm1,imm1,imm3)
+dnl 	__(strcx(imm1,imm2,imm0))
+dnl 	__(bne- 2b)
+dnl 	__(isync)
+dnl 	/* Memoize hash table header */		
+dnl         __(ref_global(imm1,ref_base))
+dnl         __(sub imm0,arg_x,imm1)
+dnl         __(srri(imm0,imm0,dnode_shift))
+dnl         __(load_highbit(imm3))
+dnl         __(extract_bit_shift_count(imm4,imm0))
+dnl         __(srri(imm0,imm0,bitmap_shift))
+dnl         __(srr(imm3,imm3,imm4))
+dnl         __(slri(imm0,imm0,word_shift))
+dnl         __(ldrx(imm1,imm2,imm0))
+dnl         __(and. imm1,imm1,imm3)
+dnl         __(bne 4f)
+dnl 3:      __(lrarx(imm1,imm2,imm0))
+dnl         __(or imm1,imm1,imm3)
+dnl         __(strcx(imm1,imm2,imm0))
+dnl         __(bne- 3b)
+dnl         __(isync)
+dnl C(egc_write_barrier_end):
+dnl 4:	__(mov arg_z,#t_value)
+dnl 	__(bx lr)
+dnl 5:      __(mov imm0,#RESERVATION_DISCHARGE)
+dnl         __(strcx(rzero,0,imm0))
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(bx lr)
+dnl 	
+dnl 	
+dnl 	       
+dnl 	
+dnl 
+dnl /* We always have to create a tsp frame (even if nargs is 0), so the compiler  */
+dnl /* doesn't get confused.  */
+dnl _spentry(stkconslist)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(add imm1,nargs,nargs)
+dnl 	__(addi imm1,imm1,tsp_frame.fixed_overhead)
+dnl 	__(TSP_Alloc_Var_Boxed(imm1,imm2))
+dnl 	__(la imm1,tsp_frame.data_offset+fulltag_cons(tsp))
+dnl 	__(b 2f)
+dnl 1:	__(ldr temp0,[vsp,#0])
+dnl 	__(cmpri(cr1,nargs,fixnum_one))
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(_rplaca(imm1,temp0))
+dnl 	__(_rplacd(imm1,arg_z))
+dnl 	__(mov arg_z,imm1)
+dnl 	__(la imm1,cons.size(imm1))
+dnl 	__(la nargs,-fixnum_one(nargs))
+dnl 2:
+dnl 	__(bne cr1,1b)
+dnl 	__(bx lr)
+dnl 
+dnl /* do list*: last arg in arg_z, all others vpushed,  */
+dnl /* nargs set to #args vpushed.  */
+dnl _spentry(stkconslist_star)
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(add imm1,nargs,nargs)
+dnl 	__(addi imm1,imm1,tsp_frame.fixed_overhead)
+dnl 	__(TSP_Alloc_Var_Boxed(imm1,imm2))
+dnl 	__(la imm1,tsp_frame.data_offset+fulltag_cons(tsp))
+dnl 	__(b 2f)
+dnl 1:	__(ldr temp0,[vsp,#0])
+dnl 	__(cmpri(cr1,nargs,fixnum_one))
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(_rplaca(imm1,temp0))
+dnl 	__(_rplacd(imm1,arg_z))
+dnl 	__(mov arg_z,imm1)
+dnl 	__(la imm1,cons.size(imm1))
+dnl 	__(la nargs,-fixnum_one(nargs))
+dnl 2:
+dnl 	__(bne cr1,1b)
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl /* Make a stack-consed simple-vector out of the NARGS objects  */
+dnl /* on top of the vstack; return it in arg_z.  */
+dnl _spentry(mkstackv)
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(dnode_align(imm1,nargs,tsp_frame.fixed_overhead+node_size))
+dnl 	__(TSP_Alloc_Var_Boxed_nz(imm1,imm2))
+dnl 	__(slwi imm0,nargs,num_subtag_bits-fixnumshift)
+dnl 	__(ori imm0,imm0,subtag_simple_vector)
+dnl 	__(str(imm0,tsp_frame.data_offset(tsp)))
+dnl 	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+dnl 	__(beq- cr1,2f)
+dnl 	__(la imm0,misc_data_offset(arg_z))
+dnl 	__(add imm1,imm0,nargs)
+dnl 1:
+dnl 	__(la nargs,-node_size(nargs))
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(ldr temp1,[vsp,#0])
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(stru(temp1,-node_size(imm1)))
+dnl 	__(bne cr1,1b)
+dnl 2:
+dnl 	__(bx lr)
+dnl 
+dnl 	
+dnl         
+dnl 
+dnl _spentry(setqsym)
+dnl 	__(ldr imm0,[arg_y,#symbol.flags])
+dnl 	__(andi. imm0,imm0,sym_vbit_const_mask)
+dnl 	__(beq _SPspecset)
+dnl 	__(mov arg_z,arg_y)
+dnl 	__(mov arg_y,#XCONST)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl 
+dnl 
+dnl 	
+dnl _spentry(progvsave)
+dnl 	/* Error if arg_z isn't a proper list.  That's unlikely, */
+dnl 	/* but it's better to check now than to crash later. */
+dnl 	
+dnl 	__(cmpri(arg_z,nil_value))
+dnl 	__(mov arg_x,arg_z)	/* fast  */
+dnl 	__(mov temp1,arg_z)	/* slow  */
+dnl 	__(beq 9f)		/* Null list is proper  */
+dnl 0:	
+dnl 	__(trap_unless_list(arg_x,imm0))
+dnl 	__(_cdr(temp2,arg_x))	/* (null (cdr fast)) ?  */
+dnl 	__(cmpri(cr3,temp2,nil_value))
+dnl 	__(trap_unless_list(temp2,imm0,cr0))
+dnl 	__(_cdr(arg_x,temp2))
+dnl 	__(beq cr3,9f)
+dnl 	__(_cdr(temp1,temp1))
+dnl 	__(cmpr(arg_x,temp1))
+dnl 	__(bne 0b)
+dnl 	__(mov arg_y,#XIMPROPERLIST)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl 9:	/* Whew 	 */
+dnl 	
+dnl         /* Next, determine the length of arg_y.  We  */
+dnl         /* know that it's a proper list.  */
+dnl 	__(mov imm0,#-node_size)
+dnl 	__(mov arg_x,arg_y)
+dnl 1:
+dnl 	__(cmpri(cr0,arg_x,nil_value))
+dnl 	__(la imm0,node_size(imm0))
+dnl 	__(_cdr(arg_x,arg_x))
+dnl 	__(bne 1b)
+dnl 	/* imm0 is now (boxed) triplet count.  */
+dnl 	/* Determine word count, add 1 (to align), and make room.  */
+dnl 	/* if count is 0, make an empty tsp frame and exit  */
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(add imm1,imm0,imm0)
+dnl 	__(add imm1,imm1,imm0)
+dnl         __(dnode_align(imm1,imm1,node_size))
+dnl 	__(bne+ cr0,2f)
+dnl 	 __(TSP_Alloc_Fixed_Boxed(2*node_size))
+dnl 	 __(bx lr)
+dnl 2:
+dnl 	__(la imm1,tsp_frame.fixed_overhead(imm1))	/* tsp header  */
+dnl 	__(TSP_Alloc_Var_Boxed_nz(imm1,imm2))
+dnl 	__(str(imm0,tsp_frame.data_offset(tsp)))
+dnl 	__(ldr imm2,[tsp,#tsp_frame.backlink])
+dnl 	__(mov arg_x,arg_y)
+dnl 	__(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr imm3,[rcontext,#tcr.tlb_limit])
+dnl 3:
+dnl         __(cmpri(cr1,arg_z,nil_value))
+dnl 	__(_car(temp0,arg_x))
+dnl         __(ldr imm0,[temp0,#symbol.binding_index])
+dnl 	__(_cdr(arg_x,arg_x))
+dnl         __(trlle(imm3,imm0))
+dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer]) /* Need to reload after trap  */
+dnl         __(ldrx(temp3,imm4,imm0))
+dnl 	__(cmpri(cr0,arg_x,nil_value))
+dnl         __(mov temp2,#unbound_marker)
+dnl         __(beq cr1,4f)
+dnl 	__(_car(temp2,arg_z))
+dnl 	__(_cdr(arg_z,arg_z))
+dnl 4:      __(push(temp3,imm2))
+dnl 	__(push(imm0,imm2))
+dnl 	__(push(imm1,imm2))
+dnl         __(str temp2,imm4,imm0)
+dnl 	__(mov imm1,imm2)
+dnl 	__(bne cr0,3b)
+dnl 	__(str(imm2,tcr.db_link(rcontext)))
+dnl 	__(bx lr)
+dnl 
+dnl 	
+dnl /* Allocate a miscobj on the temp stack.  (Push a frame on the tsp and  */
+dnl /* heap-cons the object if there's no room on the tstack.)  */
+dnl _spentry(stack_misc_alloc)
+dnl 	 __(rlwinm. imm2,arg_y,32-fixnumshift,0,(8+fixnumshift)-1)
+dnl 	 __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(extract_fulltag(imm1,imm0))
+dnl 	 __(bne- cr0,9f)
+dnl 	 __(cmpri(cr0,imm1,fulltag_nodeheader))
+dnl 	 __(mov imm3,imm0)
+dnl 	 __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))
+dnl 	 __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) /* imm0 now = header  */
+dnl 	 __(mov imm2,arg_y)
+dnl 	 __(beq cr0,1f)	/* do probe if node object  */
+dnl         		/* (fixnum element count = byte count).  */
+dnl 	 __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))
+dnl 	 __(bng cr1,1f) /* do probe if 32-bit imm object  */
+dnl 	 __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))
+dnl 	 __(srwi imm2,imm2,1)
+dnl 	 __(bgt cr0,3f)
+dnl 	 __(bgt cr1,1f)
+dnl 	 __(srwi imm2,imm2,1)
+dnl /* imm2 now = byte count.  Add 4 for header, 7 to align, then  */
+dnl /*	clear low three bits.  */
+dnl 1:
+dnl          __(dnode_align(imm3,imm2,tsp_frame.fixed_overhead+node_size))
+dnl 	 __(cmplri(cr0,imm3,tstack_alloc_limit)) /* more than limit ?  */
+dnl 	 __(bgt- cr0,0f)
+dnl 	 __(TSP_Alloc_Var_Boxed_nz(imm3,imm4))
+dnl 
+dnl /* Slap the header on the vector, then return.  */
+dnl 	 __(str(imm0,tsp_frame.data_offset(tsp)))
+dnl 	 __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+dnl 	 __(bx lr)
+dnl 9: 
+dnl 
+dnl 
+dnl 
+dnl /* Too large to safely fit on tstack.  Heap-cons the vector, but make  */
+dnl /* sure that there's an empty tsp frame to keep the compiler happy.  */
+dnl 0:
+dnl 	 __(TSP_Alloc_Fixed_Unboxed(0))
+dnl 	 __(b _SPmisc_alloc)
+dnl 3:
+dnl 	 __(cmplri(imm3,subtag_double_float_vector))
+dnl 	 __(slwi imm2,arg_y,1)
+dnl 	 __(beq 1b)
+dnl 	 __(addi imm2,arg_y,7<<fixnumshift)
+dnl 	 __(srwi imm2,imm2,fixnumshift+3)
+dnl 	 __(b 1b)
+dnl 
+dnl         
+dnl /* subtype (boxed, of course) is vpushed, followed by nargs bytes worth of  */
+dnl /* initial-contents.  Note that this can be used to cons any type of initialized  */
+dnl /* node-header'ed misc object (symbols, closures, ...) as well as vector-like  */
+dnl /* objects.  */
+dnl /* Note that we're guaranteed to win (or force GC, or run out of memory)  */
+dnl /* because nargs < 32K.  */
+dnl _spentry(gvector)
+dnl         __(subi nargs,nargs,node_size)
+dnl 	__(ldrx(arg_z,vsp,nargs))
+dnl 	__(unbox_fixnum(imm0,arg_z))
+dnl         __ifdef(`PPC64')
+dnl          __(sldi imm1,nargs,num_subtag_bits-fixnum_shift)
+dnl          __(or imm0,imm0,imm1)
+dnl         __else
+dnl 	 __(rlwimi imm0,nargs,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits)
+dnl         __endif
+dnl         __(dnode_align(imm1,nargs,node_size))
+dnl 	__(Misc_Alloc(arg_z,imm0,imm1))
+dnl 	__(mov imm1,nargs)
+dnl 	__(la imm2,misc_data_offset(imm1))
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(str temp0,arg_z,imm2)
+dnl 2:
+dnl 	__(subi imm1,imm1,node_size)
+dnl 	__(cmpri(cr0,imm1,0))
+dnl 	__(subi imm2,imm2,node_size)
+dnl 	__(vpop(temp0))         /* Note the intentional fencepost: */
+dnl 				/* discard the subtype as well.  */
+dnl 	__(bge cr0,1b)
+dnl 	__(bx lr)
+dnl 	
+dnl 	
+dnl 	
+dnl 	
+dnl _spentry(fitvals)
+dnl 	__(subf. imm0,nargs,imm0)
+dnl 	__(mov imm1,#nil_value)
+dnl 	__(bge 2f)
+dnl 	__(sub vsp,vsp,imm0)
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(subic. imm0,imm0,node_size)
+dnl 	__(vpush1(imm1))
+dnl 	__(addi nargs,nargs,node_size)
+dnl 2:
+dnl 	__(bne 1b)
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl _spentry(nthvalue)
+dnl 	__(add imm0,vsp,nargs)
+dnl 	__(ldr imm1,[imm0,#0])
+dnl 	__(cmplr(imm1,nargs))	/*  do unsigned compare:	 if (n < 0) => nil.  */
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(neg imm1,imm1)
+dnl 	__(subi imm1,imm1,node_size)
+dnl 	__(bge 1f)
+dnl 	__(ldrx(arg_z,imm0,imm1))
+dnl 1:	
+dnl 	__(la vsp,node_size(imm0))
+dnl 	__(bx lr)
+dnl         
+dnl 
+dnl         	
+dnl /* Provide default (NIL) values for &optional arguments; imm0 is  */
+dnl /* the (fixnum) upper limit on the total of required and &optional  */
+dnl /* arguments.  nargs is preserved, all arguments wind up on the  */
+dnl /* vstack.  */
+dnl _spentry(default_optional_args)
+dnl 	__(cmplr( cr7,nargs,imm0))
+dnl 	__(mov imm5,#nil_value)
+dnl 	__(vpush_argregs())
+dnl 	__(mov imm1,nargs)
+dnl 	__(bgelr cr7)
+dnl 1:	
+dnl 	__(addi imm1,imm1,fixnum_one)
+dnl 	__(cmpr(cr0,imm1,imm0))
+dnl 	__(vpush1(imm5))
+dnl 	__(bne cr0,1b)
+dnl 	__(bx lr)
+dnl 	
+dnl /* Indicate whether &optional arguments were actually supplied.  nargs  */
+dnl /* contains the actual arg count (minus the number of required args);  */
+dnl /* imm0 contains the number of &optional args in the lambda list.  */
+dnl /* Note that nargs may be > imm0 if &rest/&key is involved.  */
+dnl _spentry(opt_supplied_p)
+dnl 	__(mov imm1,#0)
+dnl 1:
+dnl 	/* (vpush (< imm1 nargs))  */
+dnl         __ifdef(`PPC64')
+dnl 	 __(xor imm2,imm1,nargs)
+dnl 	 __(sradi imm2,imm2,63)
+dnl 	 __(or imm2,imm2,imm1)
+dnl 	 __(addi imm1,imm1,fixnumone)
+dnl 	 __(cmpr(cr0,imm1,imm0))
+dnl 	 __(subf imm2,nargs,imm2)
+dnl 	 __(srdi imm2,imm2,63)
+dnl          __(mulli imm2,imm2,t_offset)
+dnl 	 __(addi imm2,imm2,nil_value)
+dnl 	 __(vpush1(imm2))
+dnl 	 __(bne cr0,1b)
+dnl 	 __(bx lr)
+dnl         __else
+dnl 	 __(xor imm2,imm1,nargs)
+dnl 	 __(srawi imm2,imm2,31)
+dnl 	 __(or imm2,imm2,imm1)
+dnl 	 __(addi imm1,imm1,fixnumone)
+dnl 	 __(cmpr(cr0,imm1,imm0))
+dnl 	 __(subf imm2,nargs,imm2)
+dnl 	 __(srwi imm2,imm2,31)
+dnl 	 __(insrwi imm2,imm2,1,27)
+dnl 	 __(addi imm2,imm2,nil_value)
+dnl 	 __(vpush1(imm2))
+dnl 	 __(bne cr0,1b)
+dnl 	 __(bx lr)
+dnl         __endif
+dnl 	
+dnl 
+dnl 
+dnl /* If nargs is <= imm0, vpush a nil.  Otherwise, cons a list of length  */
+dnl /* (- nargs imm0) and vpush it.  */
+dnl /* Use this entry point to heap-cons a simple &rest arg.  */
+dnl _spentry(heap_rest_arg)
+dnl 	__(mov imm0,#0)
+dnl 	__(vpush_argregs())
+dnl  	__(sub imm1,nargs,imm0)
+dnl 	__(cmpri(imm1,0))
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(ldr temp0,[vsp,#0])
+dnl 	__(cmpri(imm1,fixnum_one))
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(Cons(arg_z,temp0,arg_z))
+dnl 	__(subi imm1,imm1,fixnum_one)
+dnl 2:
+dnl 	__(bgt 1b)
+dnl 	__(vpush1(arg_z))
+dnl 	__(bx lr)
+dnl 
+dnl 	
+dnl /* And this entry point when the argument registers haven't yet been  */
+dnl /* vpushed (as is typically the case when required/&rest but no  */
+dnl /* &optional/&key.)  */
+dnl _spentry(req_heap_rest_arg)
+dnl 	__(vpush_argregs())
+dnl  	__(sub imm1,nargs,imm0)
+dnl 	__(cmpri(imm1,0))
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(ldr temp0,[vsp,#0])
+dnl 	__(cmpri(imm1,fixnum_one))
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(Cons(arg_z,temp0,arg_z))
+dnl 	__(subi imm1,imm1,fixnum_one)
+dnl 2:
+dnl 	__(bgt 1b)
+dnl 	__(vpush1(arg_z))
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl _spentry(heap_cons_rest_arg)
+dnl  	__(sub imm1,nargs,imm0)
+dnl 	__(cmpri(imm1,0))
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(ldr temp0,[vsp,#0])
+dnl 	__(cmpri(imm1,fixnum_one))
+dnl 	__(la vsp,node_size(vsp))
+dnl 	__(Cons(arg_z,temp0,arg_z))
+dnl 	__(subi imm1,imm1,fixnum_one)
+dnl 2:
+dnl 	__(bgt 1b)
+dnl 	__(vpush1(arg_z))
+dnl 	__(bx lr)
+dnl 
+dnl 	
+dnl _spentry(simple_keywords)
+dnl 	__(mov imm0,#0)
+dnl         __(vpush_argregs())
+dnl         __(b _SPkeyword_bind)
+dnl                 
+dnl _spentry(keyword_args)
+dnl 	__(vpush_argregs())
+dnl         __(b _SPkeyword_bind)
+dnl 
+dnl /* Treat the last (- nargs imm0) values on the vstack as keyword/value  */
+dnl /* pairs.  There'll be imm3 keyword arguments.  Imm2 contains flags  */
+dnl /* that indicate whether &allow-other-keys was specified and whether  */
+dnl /* or not to leave the keyword/value pairs on the vstack for an &rest  */
+dnl /* argument.  Temp3 contains a vector of keyword specifiers which we  */
+dnl /* must (in general) match.  */
+dnl /* If the number of arguments is greater than imm0, the difference must  */
+dnl /* be even.  */
+dnl /* Note that the caller hasn't yet saved its caller's context and that  */
+dnl /* the temp registers used to pass next_method_context  */
+dnl /* (temp1) may still have "live" values in them, as does nfn (temp2).  */
+dnl 
+dnl define(`keyword_flags',`imm2')
+dnl define(`keyword_vector',`temp3')
+dnl define(`keyword_count',`imm3')
+dnl 
+dnl 
+dnl 
+dnl define(`varptr',`save0')
+dnl define(`valptr',`save1')
+dnl define(`limit',`save2')
+dnl 
+dnl _spentry(keyword_bind)
+dnl         /* Before we can really do anything, we have to  */
+dnl         /* save the caller's context.  To do so, we need to know  */
+dnl         /* how many args have actually been pushed.  Ordinarily, that'd  */
+dnl         /* be "nargs", but we may have pushed more args than we received  */
+dnl 	/* if we had to default any &optionals.  */
+dnl 	/* So, the number of args pushed so far is the larger of nargs  */
+dnl 	/* and the (canonical) total of required/&optional args received.  */
+dnl 	__(cmpr(cr0,nargs,imm0))
+dnl 	__(add arg_z,vsp,nargs)
+dnl 	__(bge+ cr0,1f)
+dnl 	__(add arg_z,vsp,imm0)
+dnl 1:
+dnl 	__(build_lisp_frame(fn,loc_pc,arg_z))
+dnl 	__(mov fn,nfn)
+dnl 	/* If there are key/value pairs to consider, we slide them down  */
+dnl 	/* the vstack to make room for the value/supplied-p pairs.  */
+dnl 	/* The first step in that operation involves pushing imm3 pairs  */
+dnl 	/* of NILs.  */
+dnl 	/* If there aren't any such pairs, the first step is the last  */
+dnl 	/* step.  */
+dnl 	__(cmpri(cr0,imm3,0))
+dnl 	__(mov arg_z,#0)
+dnl 	__(sub imm1,nargs,imm0)
+dnl 	__(mov imm4,vsp)	/* in case odd keywords error  */
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(b 3f)
+dnl 2:
+dnl 	__(addi arg_z,arg_z,fixnum_one)
+dnl 	__(cmplr(cr0,arg_z,imm3))
+dnl 	__(mov imm5,#nil_value)
+dnl 	__(vpush1(imm5))
+dnl 	__(vpush1(imm5))
+dnl 3:
+dnl 	__(bne cr0,2b)
+dnl 	__(andi. arg_z,imm1,fixnum_one)
+dnl 	__(blelr cr1)	/* no keyword/value pairs to consider.  */
+dnl 	__(bne cr0,odd_keywords)
+dnl 	/* We have key/value pairs.  Move them to the top of the vstack,  */
+dnl 	/* then set the value/supplied-p vars to NIL.  */
+dnl 	/* Have to use some save regs to do this.  */
+dnl 	__(vpush1(limit))
+dnl 	__(vpush1(valptr))
+dnl 	__(vpush1(varptr))
+dnl 	/* recompute ptr to user args in case stack overflowed  */
+dnl 	__(add imm4,vsp,imm3)
+dnl 	__(add imm4,imm4,imm3)
+dnl 	__(addi imm4,imm4,3*node_size)
+dnl 	/* error if odd number of keyword/value args  */
+dnl 	__(mov varptr,imm4)
+dnl 	__(la limit,3*node_size(vsp))
+dnl 	__(mov valptr,limit)
+dnl 	__(mov arg_z,imm1)
+dnl 4:
+dnl 	__(mov imm4,#nil_value)
+dnl 	__(subi arg_z,arg_z,2<<fixnumshift)
+dnl 	__(cmplri(cr0,arg_z,0))
+dnl 	__(ldr arg_x,[varptr,#node_size*0])
+dnl 	__(ldr arg_y,[varptr,#node_size*1])
+dnl 	__(str(imm4,node_size*0(varptr)))
+dnl 	__(str(imm4,node_size*1(varptr)))
+dnl 	__(la varptr,node_size*2(varptr))
+dnl 	__(str(arg_x,node_size*0(valptr)))
+dnl 	__(str(arg_y,node_size*1(valptr)))
+dnl 	__(la valptr,node_size*2(valptr))
+dnl 	__(bne cr0,4b)
+dnl 
+dnl 
+dnl         /* Now, iterate through each supplied keyword/value pair.  If  */
+dnl         /* it's :allow-other-keys and the corresponding value is non-nil,  */
+dnl         /* note that other keys will be allowed.  */
+dnl         /* Find its position in the function's keywords vector.  If that's  */
+dnl         /* nil, note that an unknown keyword was encountered.  */
+dnl         /* Otherwise, if the keyword arg hasn't already had a value supplied,  */
+dnl         /* supply it.  */
+dnl         /* When done, complain if any unknown keywords were found and that  */
+dnl         /* situation was unexpected.  */
+dnl 	__(mov imm4,valptr)
+dnl 5:
+dnl         __(cmpri(cr0,keyword_flags,16<<fixnumshift)) /* seen :a-o-k yet ?  */
+dnl 	__(ldru(arg_z,-node_size(valptr)))
+dnl 	__(ldru(arg_y,-node_size(valptr)))
+dnl 	__(cmpri(cr1,arg_y,nil_value))
+dnl 	__(mov arg_x,#nrs.kallowotherkeys)
+dnl         /* cr6_eq <- (eq current-keyword :allow-other-keys)  */
+dnl 	__(cmpr(cr6,arg_x,arg_z))
+dnl 	__(cmpr(cr7,valptr,limit))
+dnl 	__(bne cr6,6f)
+dnl         __(bge cr0,6f) /* Already seen :allow-other-keys  */
+dnl         __(ori keyword_flags,keyword_flags,16<<fixnumshift)
+dnl 	__(beq cr1,6f)
+dnl 	__(ori keyword_flags,keyword_flags,fixnum_one)
+dnl 6:
+dnl 	__(cmpri(cr1,imm3,0))
+dnl 	__(mov imm1,#misc_data_offset)
+dnl 	__(mov imm0,#0)
+dnl 	__(b 8f)
+dnl 7:
+dnl 	__(addi imm0,imm0,fixnum_one)
+dnl 	__(cmpr(cr1,imm0,imm3))
+dnl 	__(ldrx(arg_x,keyword_vector,imm1))
+dnl 	__(cmpr(cr0,arg_x,arg_z))
+dnl 	__(addi imm1,imm1,fixnum_one)
+dnl 	__(bne cr0,8f)
+dnl 	__(add imm0,imm0,imm0)
+dnl 	__(sub imm0,varptr,imm0)
+dnl 	__(ldr arg_x,[imm0,#0])
+dnl 	__(cmpri(cr0,arg_x,nil_value))
+dnl 	__(mov arg_z,#t_value)
+dnl 	__(bne cr0,9f)
+dnl 	__(str(arg_y,node_size(imm0)))
+dnl 	__(str(arg_z,0(imm0)))
+dnl 	__(b 9f)
+dnl 8:
+dnl 	__(bne cr1,7b)
+dnl 	/* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */
+dnl         /* be set.  */
+dnl         __(beq cr6,9f)
+dnl 	__(ori keyword_flags,keyword_flags,2<<fixnumshift)
+dnl 9:
+dnl 	__(bne cr7,5b)
+dnl 	__(vpop(varptr))
+dnl 	__(vpop(valptr))
+dnl 	__(vpop(limit))
+dnl 	/* All keyword/value pairs have been processed.  */
+dnl 	/* If we saw an unknown keyword and didn't expect to, error.  */
+dnl 	/* Unless bit 2 is set in the fixnum in keyword_flags, discard the  */
+dnl 	/* keyword/value pairs from the vstack.  */
+dnl 	__(andi. imm0,keyword_flags,(fixnum_one)|(2<<fixnumshift))
+dnl 	__(cmpri(cr0,imm0,2<<fixnumshift))
+dnl 	__(beq- cr0,badkeys)
+dnl 	__(andi. imm2,keyword_flags,4<<fixnumshift)
+dnl 	__(bnelr cr0)
+dnl 	__(mov vsp,imm4)
+dnl 	__(bx lr)
+dnl 
+dnl /* Signal an error.  We saved context on entry, so this thing doesn't  */
+dnl /* have to.  */
+dnl /* The "unknown keywords" error could be continuable (ignore them.)  */
+dnl /* It might be hard to then cons an &rest arg.  */
+dnl /* In the general case, it's hard to recover the set of args that were  */
+dnl /* actually supplied to us ...  */
+dnl /* For now, just cons a list out of the keyword/value pairs */
+dnl /* that were actually provided, and signal an "invalid keywords" */
+dnl /* error with that list as an operand.  */
+dnl odd_keywords:
+dnl 	__(mov vsp,imm4)
+dnl 	__(mov nargs,imm1)
+dnl 	__(b 1f)
+dnl badkeys:
+dnl 	__(sub nargs,imm4,vsp)
+dnl 1:
+dnl 	__(bl _SPconslist)
+dnl 	__(mov arg_y,#XBADKEYS)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl 
+dnl /*  A PowerOpen ff-call.  arg_z is either a fixnum (word-aligned entrypoint) */
+dnl /*  or a macptr (whose address had better be word-aligned as well.)  A */
+dnl /*  PowerOpen stack frame is on top of the stack; 4 additional words (to */
+dnl /*  be used a a lisp frame) sit under the C frame. */
+dnl 
+dnl /*  Since we probably can't deal with FP exceptions in foreign code, we */
+dnl /*  disable them in the FPSCR, then check on return to see if any previously */
+dnl /*  enabled FP exceptions occurred. */
+dnl 
+dnl /*  As it turns out, we can share a lot of code with the eabi version of */
+dnl /*  ff-call.  Some things that happen up to the point of call differ between */
+dnl /*  the ABIs, but everything that happens after is the same. */
+dnl 
+dnl         
+dnl _spentry(poweropen_ffcall)
+dnl LocalLabelPrefix`'ffcall:                
+dnl 	__(mflr loc_pc)
+dnl 	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
+dnl 	__(mov save0,rcontext)	/* or address globals.  */
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr7,imm0,subtag_macptr))
+dnl 	__(ldr save1,[sp,#0])	/* bottom of reserved lisp frame  */
+dnl 	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
+dnl         __(zero_doublewords save2,0,lisp_frame.size)
+dnl 	__(str(save1,lisp_frame.backlink(save2)))
+dnl 	__(str(save2,c_frame.backlink(sp)))
+dnl 	__(str(fn,lisp_frame.savefn(save2)))
+dnl 	__(str(loc_pc,lisp_frame.savelr(save2)))
+dnl 	__(str(vsp,lisp_frame.savevsp(save2)))
+dnl         __(mov nargs,arg_z)
+dnl        	__(bne cr7,1f)
+dnl 	__(ldr nargs,[arg_z,#macptr.address])
+dnl 1:
+dnl 	__(ldr save3,[rcontext,#tcr.cs_area])
+dnl 	__(str(save2,area.active(save3)))
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(rzero,tcr.ffi_exception(rcontext)))
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
+dnl 	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
+dnl 	__(mov r4,#TCR_STATE_FOREIGN)
+dnl 	__(str(r4,tcr.valence(rcontext)))
+dnl         __ifdef(`rTOC')
+dnl          __(ld rTOC,8(nargs))
+dnl          __(ld nargs,0(nargs))
+dnl         __else
+dnl 	 __(mov rcontext,#0)
+dnl         __endif
+dnl LocalLabelPrefix`'ffcall_setup: 
+dnl 	__(mtctr nargs)
+dnl 	__(ldr r3,[sp,#c_frame.param0])
+dnl 	__(ldr r4,[sp,#c_frame.param1])
+dnl 	__(ldr r5,[sp,#c_frame.param2])
+dnl 	__(ldr r6,[sp,#c_frame.param3])
+dnl 	__(ldr r7,[sp,#c_frame.param4])
+dnl 	__(ldr r8,[sp,#c_frame.param5])
+dnl 	__(ldr r9,[sp,#c_frame.param6])
+dnl 	__(ldr r10,[sp,#c_frame.param7])
+dnl 	/* Darwin is allegedly very picky about what register points */
+dnl 	/* to the function on entry.  */
+dnl 	__(mov r12,nargs)
+dnl LocalLabelPrefix`'ffcall_setup_end: 
+dnl LocalLabelPrefix`'ffcall_call:
+dnl 	__(bctrl)
+dnl LocalLabelPrefix`'ffcall_call_end:
+dnl 	/* C should have preserved save0 (= rcontext) for us.  */
+dnl 	__(ldr sp,[sp,#0])
+dnl 	__(mov imm2,save0)
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mov rzero,#0)
+dnl 	__(mov loc_pc,rzero)
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov arg_y,#nil_value)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(mov temp0,#nil_value)
+dnl 	__(mov temp1,#nil_value)
+dnl 	__(mov temp2,#nil_value)
+dnl 	__(mov temp3,#nil_value)
+dnl 	__(mov fn,#nil_value)
+dnl 	__(mov rcontext,imm2)
+dnl 	__(mov imm2,#TCR_STATE_LISP)
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])
+dnl         __(mov save0,#0)
+dnl         __(mov save1,#0)
+dnl         __(mov save2,#0)
+dnl         __(mov save3,#0)
+dnl         __(mov save4,#0)
+dnl         __(mov save5,#0)
+dnl         __(mov save6,#0)
+dnl         __(mov save7,#0)
+dnl         __(mov allocptr,#-dnode_size)
+dnl         __(mov allocbase,#-dnode_size)
+dnl 	__(str(imm2,tcr.valence(rcontext)))	
+dnl 	__(vpop_saveregs())
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,8(sp))
+dnl 	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
+dnl         __(clrrwi imm2,imm3,8)
+dnl 	__(discard_lisp_frame())
+dnl 	__(str(imm2,tcr.ffi_exception(rcontext)))
+dnl 	__(lfd f0,tcr.lisp_fpscr(rcontext))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(check_pending_interrupt(`cr1'))
+dnl         __(mtxer rzero)
+dnl         __(mtctr rzero)
+dnl         __ifdef(`PPC64')
+dnl          __ifdef(`DARWIN')
+dnl           __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+dnl           __(ld imm4,tcr.flags(rcontext))
+dnl           __(and. imm3,imm3,imm4)
+dnl           __(bne cr0,0f)
+dnl          __endif
+dnl         __endif
+dnl 	__(bx lr)
+dnl         __ifdef(`PPC64')
+dnl          __ifdef(`DARWIN')
+dnl 0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
+dnl           /* was set in tcr.flags.  Clear that bit. */
+dnl           __(andc imm4,imm4,imm3)
+dnl           __(std imm4,tcr.flags(rcontext))
+dnl  	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
+dnl 	  /* Box it, then signal a lisp error. */
+dnl           __(mov imm1,#macptr_header)
+dnl           __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
+dnl           __(std imm0,macptr.address(arg_z))
+dnl           __(mov arg_y,#XFOREIGNEXCEPTION)
+dnl           __(set_nargs(2))
+dnl           __(b _SPksignalerr)
+dnl         /* Handle exceptions, for ObjC 2.0 */
+dnl LocalLabelPrefix`'ffcallLandingPad:      
+dnl           __(mov save1,r3)
+dnl           __(cmpdi r4,1)
+dnl           __(beq 1f)
+dnl LocalLabelPrefix`'ffcallUnwindResume:
+dnl           __(ref_global(r12,unwind_resume))
+dnl           __(mtctr r12)
+dnl           __(bctrl)
+dnl LocalLabelPrefix`'ffcallUnwindResume_end:         
+dnl 1:        __(mov r3,save1)
+dnl LocalLabelPrefix`'ffcallBeginCatch:
+dnl           __(ref_global(r12,objc2_begin_catch))
+dnl           __(mtctr r12)
+dnl           __(bctrl)
+dnl LocalLabelPrefix`'ffcallBeginCatch_end:          
+dnl           __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
+dnl LocalLabelPrefix`'ffcallEndCatch:  
+dnl           __(ref_global(r12,objc2_end_catch))
+dnl           __(mtctr r12)
+dnl           __(bctrl)              
+dnl LocalLabelPrefix`'ffcallEndCatch_end:     
+dnl           __(ref_global(r12,get_tcr))
+dnl           __(mtctr r12)
+dnl           __(mov imm0,#1)       
+dnl 	  __(bctrl)
+dnl           __(ld imm2,tcr.flags(imm0))
+dnl           __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+dnl           __(std imm2,tcr.flags(imm0))
+dnl           __(mov imm0,save1)
+dnl 	  __(b LocalLabelPrefix`'ffcall_call_end)
+dnl LocalLabelPrefix`'ffcall_end:   
+dnl 
+dnl         	.section __DATA,__gcc_except_tab
+dnl 	  .align 3
+dnl LLSDA1:
+dnl 	  .byte	0xff	/* @LPStart format (omit) */
+dnl 	  .byte	0x0	/* @TType format (absolute) */
+dnl 	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
+dnl 	  .byte	0x3	/* call-site format (udata4) */
+dnl 	  .byte	0x41	/* uleb128 0x41; Call-site table length */
+dnl 	
+dnl 	  .long Lffcall_setup-Lffcall	/* region 0 start */
+dnl 	  .long Lffcall_setup_end-Lffcall_setup	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl         
+dnl 	  .long Lffcall_call-Lffcall	/* region 1 start */
+dnl 	  .long Lffcall_call_end-Lffcall_call	/* length */
+dnl 	  .long LffcallLandingPad-Lffcall	/* landing pad */
+dnl 	  .byte	0x1	/* uleb128 0x1; action */
+dnl         
+dnl 	  .long LffcallUnwindResume-Lffcall	/* region 2 start */
+dnl 	  .long LffcallUnwindResume_end-LffcallUnwindResume	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl 	
+dnl 	  .long LffcallBeginCatch-Lffcall	/* region 3 start */
+dnl 	  .long LffcallBeginCatch_end-LffcallBeginCatch	/* length */
+dnl 	  .long 0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl         
+dnl 	  .long LffcallEndCatch-Lffcall
+dnl 	  .long LffcallEndCatch_end-LffcallEndCatch	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl         
+dnl 	  .byte	0x1	/* Action record table */
+dnl 	  .byte	0x0
+dnl 	  .align 3
+dnl 	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
+dnl           .text
+dnl          __endif
+dnl         __endif
+dnl 
+dnl /* Just like poweropen_ffcall, only we save all argument(result)
+dnl    registers in a buffer passed in arg_y on entry before returning
+dnl    to lisp.  (We have to do this in the ffcall glue here, because
+dnl    r9 and r10 - at least - are overloaded as dedicated lisp registers */
+dnl _spentry(poweropen_ffcall_return_registers)
+dnl LocalLabelPrefix`'ffcall_return_registers:                
+dnl 	__(mflr loc_pc)
+dnl 	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
+dnl         __(ldr save7,[arg_y,#macptr.address])
+dnl 	__(mov save0,rcontext)	/* or address globals.  */
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr7,imm0,subtag_macptr))
+dnl 	__(ldr save1,[sp,#0])	/* bottom of reserved lisp frame  */
+dnl 	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
+dnl         __(zero_doublewords save2,0,lisp_frame.size)
+dnl 	__(str(save1,lisp_frame.backlink(save2)))
+dnl 	__(str(save2,c_frame.backlink(sp)))
+dnl 	__(str(fn,lisp_frame.savefn(save2)))
+dnl 	__(str(loc_pc,lisp_frame.savelr(save2)))
+dnl 	__(str(vsp,lisp_frame.savevsp(save2)))
+dnl         __(mov nargs,arg_z)
+dnl        	__(bne cr7,1f)
+dnl 	__(ldr nargs,[arg_z,#macptr.address])
+dnl 1:
+dnl 	__(ldr save3,[rcontext,#tcr.cs_area])
+dnl 	__(str(save2,area.active(save3)))
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(rzero,tcr.ffi_exception(rcontext)))
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
+dnl 	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
+dnl 	__(mov r4,#TCR_STATE_FOREIGN)
+dnl 	__(str(r4,tcr.valence(rcontext)))
+dnl         __ifdef(`rTOC')
+dnl          __(ld rTOC,8(nargs))
+dnl          __(ld nargs,0(nargs))
+dnl         __else
+dnl 	 __(mov rcontext,#0)
+dnl         __endif
+dnl LocalLabelPrefix`'ffcall_return_registers_setup: 
+dnl 	__(mtctr nargs)
+dnl 	__(ldr r3,[sp,#c_frame.param0])
+dnl 	__(ldr r4,[sp,#c_frame.param1])
+dnl 	__(ldr r5,[sp,#c_frame.param2])
+dnl 	__(ldr r6,[sp,#c_frame.param3])
+dnl 	__(ldr r7,[sp,#c_frame.param4])
+dnl 	__(ldr r8,[sp,#c_frame.param5])
+dnl 	__(ldr r9,[sp,#c_frame.param6])
+dnl 	__(ldr r10,[sp,#c_frame.param7])
+dnl 	/* Darwin is allegedly very picky about what register points */
+dnl 	/* to the function on entry.  */
+dnl 	__(mov r12,nargs)
+dnl LocalLabelPrefix`'ffcall_return_registers_setup_end: 
+dnl LocalLabelPrefix`'ffcall_return_registers_call:
+dnl 	__(bctrl)
+dnl LocalLabelPrefix`'ffcall_return_registers_call_end:
+dnl         __(str(r3,0*node_size(save7)))        
+dnl         __(str(r4,1*node_size(save7)))        
+dnl         __(str(r5,2*node_size(save7)))        
+dnl         __(str(r6,3*node_size(save7)))        
+dnl         __(str(r7,4*node_size(save7)))        
+dnl         __(str(r8,5*node_size(save7)))        
+dnl         __(str(r9,6*node_size(save7)))        
+dnl         __(str(r10,7*node_size(save7)))
+dnl         __(stfd f1,((8*node_size)+(0*8))(save7))
+dnl         __(stfd f2,((8*node_size)+(1*8))(save7))
+dnl         __(stfd f3,((8*node_size)+(2*8))(save7))
+dnl         __(stfd f4,((8*node_size)+(3*8))(save7))
+dnl         __(stfd f5,((8*node_size)+(4*8))(save7))
+dnl         __(stfd f6,((8*node_size)+(5*8))(save7))
+dnl         __(stfd f7,((8*node_size)+(6*8))(save7))
+dnl         __(stfd f8,((8*node_size)+(7*8))(save7))
+dnl         __(stfd f9,((8*node_size)+(8*8))(save7))
+dnl         __(stfd f10,((8*node_size)+(9*8))(save7))
+dnl         __(stfd f11,((8*node_size)+(10*8))(save7))
+dnl         __(stfd f12,((8*node_size)+(11*8))(save7))
+dnl         __(stfd f13,((8*node_size)+(12*8))(save7))
+dnl 	/* C should have preserved save0 (= rcontext) for us.  */
+dnl 	__(ldr sp,[sp,#0])
+dnl 	__(mov imm2,save0)
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mov rzero,#0)
+dnl 	__(mov loc_pc,rzero)
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov arg_y,#nil_value)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(mov temp0,#nil_value)
+dnl 	__(mov temp1,#nil_value)
+dnl 	__(mov temp2,#nil_value)
+dnl 	__(mov temp3,#nil_value)
+dnl 	__(mov fn,#nil_value)
+dnl 	__(mov rcontext,imm2)
+dnl 	__(mov imm2,#TCR_STATE_LISP)
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])
+dnl         __(mov save0,#0)
+dnl         __(mov save1,#0)
+dnl         __(mov save2,#0)
+dnl         __(mov save3,#0)
+dnl         __(mov save4,#0)
+dnl         __(mov save5,#0)
+dnl         __(mov save6,#0)
+dnl         __(mov save7,#0)
+dnl         __(mov allocptr,#-dnode_size)
+dnl         __(mov allocbase,#-dnode_size)
+dnl 	__(str(imm2,tcr.valence(rcontext)))	
+dnl 	__(vpop_saveregs())
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,8(sp))
+dnl 	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
+dnl         __(clrrwi imm2,imm3,8)
+dnl 	__(discard_lisp_frame())
+dnl 	__(str(imm2,tcr.ffi_exception(rcontext)))
+dnl 	__(lfd f0,tcr.lisp_fpscr(rcontext))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(check_pending_interrupt(`cr1'))
+dnl         __(mtxer rzero)
+dnl         __(mtctr rzero)
+dnl         __ifdef(`DARWIN')
+dnl          __ifdef(`PPC64')
+dnl           __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+dnl           __(ld imm4,tcr.flags(rcontext))
+dnl           __(and. imm3,imm3,imm4)
+dnl           __(bne 0f)
+dnl          __endif
+dnl         __endif
+dnl 	__(bx lr)
+dnl 
+dnl         __ifdef(`DARWIN')
+dnl          __ifdef(`PPC64')
+dnl 0:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
+dnl           /* was set in tcr.flags.  Clear that bit. */
+dnl           __(andc imm4,imm4,imm3)
+dnl           __(std imm4,tcr.flags(rcontext))
+dnl  	  /* Unboxed foreign exception (likely an NSException) in %imm0. */
+dnl 	  /* Box it, then signal a lisp error. */
+dnl           __(mov imm1,#macptr_header)
+dnl           __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
+dnl           __(std imm0,macptr.address(arg_z))
+dnl           __(mov arg_y,#XFOREIGNEXCEPTION)
+dnl           __(set_nargs(2))
+dnl           __(b _SPksignalerr)
+dnl         /* Handle exceptions, for ObjC 2.0 */
+dnl LocalLabelPrefix`'ffcall_return_registersLandingPad:      
+dnl           __(mov save1,r3)
+dnl           __(cmpdi r4,1)
+dnl           __(beq 1f)
+dnl LocalLabelPrefix`'ffcall_return_registersUnwindResume:
+dnl           __(ref_global(r12,unwind_resume))
+dnl           __(mtctr r12)
+dnl           __(bctrl)
+dnl LocalLabelPrefix`'ffcall_return_registersUnwindResume_end:         
+dnl 1:        __(mov r3,save1)
+dnl LocalLabelPrefix`'ffcall_return_registersBeginCatch:
+dnl           __(ref_global(r12,objc2_begin_catch))
+dnl           __(mtctr r12)
+dnl           __(bctrl)
+dnl LocalLabelPrefix`'ffcall_return_registersBeginCatch_end:          
+dnl           __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
+dnl LocalLabelPrefix`'ffcall_return_registersEndCatch:  
+dnl           __(ref_global(r12,objc2_end_catch))
+dnl           __(mtctr r12)
+dnl           __(bctrl)              
+dnl LocalLabelPrefix`'ffcall_return_registersEndCatch_end:     
+dnl           __(ref_global(r12,get_tcr))
+dnl           __(mtctr r12)
+dnl           __(mov imm0,#1)       
+dnl 	  __(bctrl)
+dnl           __(ld imm2,tcr.flags(imm0))
+dnl           __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
+dnl           __(std imm2,tcr.flags(imm0))
+dnl           __(mov imm0,save1)
+dnl 	  __(b LocalLabelPrefix`'ffcall_return_registers_call_end)
+dnl LocalLabelPrefix`'ffcall_return_registers_end:
+dnl 	  .section __DATA,__gcc_except_tab
+dnl 	  .align 3
+dnl LLSDA2:
+dnl 	  .byte	0xff	/* @LPStart format (omit) */
+dnl   	  .byte	0x0	/* @TType format (absolute) */
+dnl 	  .byte	0x4d	/* uleb128 0x4d; @TType base offset */
+dnl 	  .byte	0x3	/* call-site format (udata4) */
+dnl 	  .byte	0x41	/* uleb128 0x41; Call-site table length */
+dnl 	
+dnl 	  .long Lffcall_return_registers_setup-Lffcall_return_registers	/* region 0 start */
+dnl 	  .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl         
+dnl 	  .long Lffcall_return_registers_call-Lffcall_return_registers	/* region 1 start */
+dnl 	  .long Lffcall_return_registers_call_end-Lffcall_return_registers_call	/* length */
+dnl 	  .long Lffcall_return_registersLandingPad-Lffcall_return_registers	/* landing pad */
+dnl 	  .byte	0x1	/* uleb128 0x1; action */
+dnl         
+dnl 	  .long Lffcall_return_registersUnwindResume-Lffcall_return_registers	/* region 2 start */
+dnl 	  .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl 	
+dnl 	  .long Lffcall_return_registersBeginCatch-Lffcall_return_registers	/* region 3 start */
+dnl 	  .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch	/* length */
+dnl 	  .long 0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl         
+dnl 	  .long Lffcall_return_registersEndCatch-Lffcall_return_registers
+dnl 	  .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch	/* length */
+dnl 	  .long	0x0	/* landing pad */
+dnl 	  .byte	0x0	/* uleb128 0x0; action */
+dnl 	  .byte	0x1	/* Action record table */
+dnl 	  .byte	0x0
+dnl 	  .align 3
+dnl 	  .quad	0       /* _OBJC_EHTYPE_$_NSException */
+dnl           .text
+dnl          __endif
+dnl         __endif
+dnl                       
+dnl 
+dnl         	
+dnl /* Signal an error synchronously, via %ERR-DISP.  */
+dnl /* If %ERR-DISP isn't fbound, it'd be nice to print a message  */
+dnl /* on the C runtime stderr.  */
+dnl 
+dnl _spentry(ksignalerr)
+dnl 	__(mov fname,#nrs.errdisp)
+dnl 	__(jump_fname)
+dnl         
+dnl /* As in the heap-consed cases, only stack-cons the &rest arg  */
+dnl _spentry(stack_rest_arg)
+dnl 	__(mov imm0,#0)
+dnl 	__(vpush_argregs())
+dnl         __(b _SPstack_cons_rest_arg)
+dnl 
+dnl 	
+dnl _spentry(req_stack_rest_arg)
+dnl 	__(vpush_argregs())
+dnl         __(b _SPstack_cons_rest_arg)
+dnl 	
+dnl _spentry(stack_cons_rest_arg)
+dnl 	__(sub imm1,nargs,imm0)
+dnl 	__(cmpri(cr0,imm1,0))
+dnl 	__(cmpri(cr1,imm1,(4096-dnode_size)/2))
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(ble cr0,2f)		/* always temp-push something.  */
+dnl 	__(bge cr1,3f)
+dnl 	__(add imm1,imm1,imm1)
+dnl 	__(dnode_align(imm2,imm1,tsp_frame.fixed_overhead))
+dnl 	__(TSP_Alloc_Var_Boxed(imm2,imm3))
+dnl 	__(la imm0,tsp_frame.data_offset+fulltag_cons(tsp))
+dnl 1:
+dnl 	__(cmpri(cr0,imm1,cons.size))	/* last time through ?  */
+dnl 	__(subi imm1,imm1,cons.size)
+dnl 	__(vpop(arg_x))
+dnl 	__(_rplacd(imm0,arg_z))
+dnl 	__(_rplaca(imm0,arg_x))
+dnl 	__(mov arg_z,imm0)
+dnl 	__(la imm0,cons.size(imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(vpush1(arg_z))
+dnl 	__(bx lr)
+dnl 2:
+dnl 	__(TSP_Alloc_Fixed_Unboxed(0))
+dnl 	__(vpush1(arg_z))
+dnl 	__(bx lr)
+dnl 3:
+dnl 	__(TSP_Alloc_Fixed_Unboxed(0))
+dnl 	__(b _SPheap_cons_rest_arg)
+dnl 
+dnl /* This was trying to swap exception ports to work around Darwin JNI lossage.
+dnl    It's tended to bitrot, and we have another way to do that now.
+dnl */        
+dnl _spentry(poweropen_callbackX)
+dnl         .long 0x7c800008        /* debug trap */
+dnl 	
+dnl /* Prepend all but the first two (closure code, fn) and last two  */
+dnl /* (function name, lfbits) elements of nfn to the "arglist".  */
+dnl /* Doing things this way (the same way that 68K MCL does) lets  */
+dnl /* functions which take "inherited arguments" work consistently  */
+dnl /* even in cases where no closure object is created.  */
+dnl _spentry(call_closure)        
+dnl 	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
+dnl 	__(cmpri(cr1,nargs,fixnum_one))
+dnl 	__(vector_length(imm0,nfn,imm0))
+dnl 	__(subi imm0,imm0,4<<fixnumshift) /* imm0 = inherited arg count  */
+dnl 	__(mov imm1,#misc_data_offset+(2<<fixnumshift)) /* point to 1st arg  */
+dnl 	__(mov imm4,#nil_value)
+dnl 	__(ble+ cr0,local_label(no_insert))
+dnl 	/* Some arguments have already been vpushed.  Vpush imm0's worth  */
+dnl 	/* of NILs, copy those arguments that have already been vpushed from  */
+dnl 	/* the old TOS to the new, then insert all of the inerited args  */
+dnl 	/* and go to the function.  */
+dnl 	__(mov imm2,#0)
+dnl local_label(push_nil_loop):
+dnl 	__(addi imm2,imm2,fixnum_one)
+dnl 	__(cmpr(cr2,imm2,imm0))
+dnl 	__(vpush1(imm4))
+dnl 	__(bne cr2,local_label(push_nil_loop))
+dnl 
+dnl 	__(mov imm3,vsp)
+dnl 	__(add imm4,vsp,imm0)
+dnl 	__(subi imm2,nargs,nargregs<<fixnumshift)
+dnl local_label(copy_already_loop):
+dnl 	__(cmpri(cr2,imm2,fixnum_one))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(ldr fname,[imm4,#0])
+dnl 	__(addi imm4,imm4,fixnum_one)
+dnl 	__(str(fname,0(imm3)))
+dnl 	__(addi imm3,imm3,fixnum_one)
+dnl 	__(bne cr2,local_label(copy_already_loop))
+dnl 
+dnl local_label(insert_loop):
+dnl 	__(cmpri(cr2,imm0,fixnum_one))
+dnl 	__(ldrx(fname,nfn,imm1))
+dnl 	__(addi imm1,imm1,fixnum_one)
+dnl 	__(addi nargs,nargs,fixnum_one)
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(push(fname,imm4))
+dnl 	__(bne cr2,local_label(insert_loop))
+dnl 	__(b local_label(go))
+dnl local_label(no_insert):
+dnl 	/* nargregs or fewer args were already vpushed.  */
+dnl 	/* if exactly nargregs, vpush remaining inherited vars.  */
+dnl 	__(add imm2,imm1,imm0)
+dnl 	__(bne cr0,local_label(set_regs))
+dnl local_label(vpush_remaining):
+dnl 	__(cmpri(cr2,imm0,fixnum_one))
+dnl 	__(ldrx(fname,nfn,imm1))
+dnl 	__(addi imm1,imm1,fixnum_one)
+dnl 	__(vpush1(fname))
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(addi nargs,nargs,fixnum_one)
+dnl 	__(bne cr2,local_label(vpush_remaining))
+dnl 	__(b local_label(go))
+dnl local_label(set_regs):
+dnl 	/* if nargs was > 1 (and we know that it was < 3), it must have  */
+dnl 	/* been 2.  Set arg_x, then vpush the remaining args.  */
+dnl 	__(ble cr1,local_label(set_y_z))
+dnl local_label(set_arg_x):
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(ldrx(arg_x,nfn,imm2))
+dnl 	__(addi nargs,nargs,fixnum_one)
+dnl 	__(bne cr0,local_label(vpush_remaining))
+dnl 	__(b local_label(go))
+dnl 	/* Maybe set arg_y or arg_z, preceding args  */
+dnl local_label(set_y_z):
+dnl 	__(bne cr1,local_label(set_arg_z))
+dnl 	/* Set arg_y, maybe arg_x, preceding args  */
+dnl local_label(set_arg_y):
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(ldrx(arg_y,nfn,imm2))
+dnl 	__(addi nargs,nargs,fixnum_one)
+dnl 	__(bne cr0,local_label(set_arg_x))
+dnl 	__(b local_label(go))
+dnl local_label(set_arg_z):
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(subi imm2,imm2,fixnum_one)
+dnl 	__(ldrx(arg_z,nfn,imm2))
+dnl 	__(addi nargs,nargs,fixnum_one)
+dnl 	__(bne cr0,local_label(set_arg_y))
+dnl 
+dnl local_label(go):
+dnl 	__(vrefr(nfn,nfn,1))
+dnl 	__(ldr loc_pc,[nfn,#_function.codevector])
+dnl 	__(mtctr loc_pc)
+dnl 	__(bctr)
+dnl         
+dnl /* This  treats anything that's either */
+dnl /* #+ppc32 (signed-byte 32), (unsigned-byte 32) */
+dnl /* #+ppc64 (signed-byte 64), (unsigned-byte 64) */
+dnl /* as if it denoted a "natural-sized" value.  */
+dnl /* Argument in arg_z, result in imm0.  May use temp0.  */
+dnl _spentry(getxlong)
+dnl         __ifdef(`PPC64')
+dnl         __else
+dnl         __(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr0,imm0,tag_fixnum))
+dnl 	__(cmpri(cr1,imm0,subtag_bignum))
+dnl 	__(unbox_fixnum(imm0,arg_z))
+dnl 	__(beqlr cr0)
+dnl 	__(mov temp0,arg_z)
+dnl 	__(bne- cr1,local_label(error))
+dnl 	__(getvheader(imm0,temp0))
+dnl 	__(cmpri(cr1,imm0,one_digit_bignum_header))
+dnl 	__(cmpri(cr7,imm0,two_digit_bignum_header))
+dnl 	__(beq cr1,local_label(big1))
+dnl         __(beq cr7,local_label(big2))
+dnl local_label(error):
+dnl 	__(uuo_interr(error_object_not_integer,arg_z)) /* not quite right but what 68K MCL said  */
+dnl 
+dnl 
+dnl 
+dnl local_label(big2):
+dnl 	__(vrefr(imm0,temp0,1)) /* sign digit must be 0  */
+dnl 	__(cmpri(imm0,0))
+dnl 	__(bne local_label(error))
+dnl local_label(big1):
+dnl 	__(vrefr(imm0,temp0,0))
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl         __endif
+dnl                 
+dnl /* Everything up to the last arg has been vpushed, nargs is set to  */
+dnl /* the (boxed) count of things already pushed.  */
+dnl /* On exit, arg_x, arg_y, arg_z, and nargs are set as per a normal  */
+dnl /* function call (this may require vpopping a few things.)  */
+dnl /* ppc2-invoke-fn assumes that temp1 is preserved here.  */
+dnl _spentry(spreadargz)
+dnl         __ifdef(`PPC64')
+dnl 	 __(extract_fulltag(imm1,arg_z))
+dnl 	 __(cmpri(cr1,imm1,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_lisptag(imm1,arg_z))
+dnl 	 __(cmpri(cr1,imm1,tag_list))
+dnl         __endif
+dnl 	__(cmpri(cr0,arg_z,nil_value))
+dnl 	__(mov imm0,#0)
+dnl 	__(mov arg_y,arg_z)		/*  save in case of error  */
+dnl 	__(beq cr0,2f)
+dnl 1:
+dnl 	__(bne- cr1,3f)
+dnl 	__(_car(arg_x,arg_z))
+dnl 	__(_cdr(arg_z,arg_z))
+dnl 	__(cmpri(cr0,arg_z,nil_value))
+dnl         __ifdef(`PPC64')
+dnl 	 __(extract_fulltag(imm1,arg_z))
+dnl 	 __(cmpri(cr1,imm1,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_lisptag(imm1,arg_z))
+dnl 	 __(cmpri(cr1,imm1,tag_list))
+dnl         __endif
+dnl 	__(vpush1(arg_x))
+dnl 	__(addi imm0,imm0,fixnum_one)
+dnl 	__(bne cr0,1b)
+dnl 2:
+dnl 	__(add. nargs,nargs,imm0)
+dnl 	__(cmpri(cr2,nargs,2<<fixnumshift))
+dnl 	__(beqlr- cr0)
+dnl 	__(vpop(arg_z))
+dnl 	__(bltlr cr2)
+dnl 	__(vpop(arg_y))
+dnl 	__(beqlr cr2)
+dnl 	__(vpop(arg_x))
+dnl 	__(bx lr)
+dnl         /*  Discard whatever's been vpushed already, complain.  */
+dnl 3:	
+dnl 	__(add vsp,vsp,imm0)
+dnl 	__(mov arg_z,arg_y)		/* recover original arg_z  */
+dnl 	__(mov arg_y,#XNOSPREAD)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl         
+dnl /* Tail-recursively funcall temp0.  */
+dnl /* Pretty much the same as the tcallsym* cases above.  */
+dnl _spentry(tfuncallgen)
+dnl 	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ble cr0,2f)
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	/* can use nfn (= temp2) as a temporary  */
+dnl 	__(subi imm1,nargs,nargregs<<fixnumshift)
+dnl 	__(add imm1,imm1,vsp)
+dnl 1:
+dnl 	__(ldru(temp2,-node_size(imm1)))
+dnl 	__(cmpr(cr0,imm1,vsp))
+dnl 	__(push(temp2,imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(mov vsp,imm0)
+dnl 	__(do_funcall())
+dnl 2:
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(do_funcall())
+dnl 
+dnl 
+dnl /* Some args were vpushed.  Slide them down to the base of  */
+dnl /* the current frame, then do funcall.  */
+dnl _spentry(tfuncallslide)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	/* can use nfn (= temp2) as a temporary  */
+dnl 	__(subi imm1,nargs,nargregs<<fixnumshift)
+dnl 	__(add imm1,imm1,vsp)
+dnl 	__(mtlr loc_pc)
+dnl 1:
+dnl 	__(ldru(temp2,-node_size(imm1)))
+dnl 	__(cmpr(cr0,imm1,vsp))
+dnl 	__(push(temp2,imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(mov vsp,imm0)
+dnl 	__(do_funcall())
+dnl 
+dnl /* No args were vpushed; recover saved context & do funcall  */
+dnl _spentry(tfuncallvsp)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mtlr loc_pc)
+dnl 	__(discard_lisp_frame())
+dnl 	__(do_funcall())
+dnl         
+dnl /* Tail-recursively call the (known symbol) in fname.  */
+dnl /* In the general case, we don't know if any args were  */
+dnl /* vpushed or not.  If so, we have to "slide" them down  */
+dnl /* to the base of the frame.  If not, we can just restore  */
+dnl /* vsp, lr, fn from the saved lisp frame on the control stack.  */
+dnl _spentry(tcallsymgen)
+dnl 	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ble cr0,2f)
+dnl 
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	/* can use nfn (= temp2) as a temporary  */
+dnl 	__(subi imm1,nargs,nargregs<<fixnumshift)
+dnl 	__(add imm1,imm1,vsp)
+dnl 1:
+dnl 	__(ldru(temp2,-node_size(imm1)))
+dnl 	__(cmpr(cr0,imm1,vsp))
+dnl 	__(push(temp2,imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(mov vsp,imm0)
+dnl 	__(jump_fname)
+dnl 	
+dnl 2:		
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(jump_fname)
+dnl 	
+dnl 	
+dnl /* Some args were vpushed.  Slide them down to the base of  */
+dnl /* the current frame, then do funcall.  */
+dnl _spentry(tcallsymslide)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl 	/* can use nfn (= temp2) as a temporary  */
+dnl 	__(subi imm1,nargs,nargregs<<fixnumshift)
+dnl 	__(add imm1,imm1,vsp)
+dnl 1:
+dnl 	__(ldru(temp2,-node_size(imm1)))
+dnl 	__(cmpr(cr0,imm1,vsp))
+dnl 	__(push(temp2,imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(mov vsp,imm0)
+dnl 	__(jump_fname)
+dnl 
+dnl /* No args were vpushed; recover saved context & call symbol  */
+dnl _spentry(tcallsymvsp)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl 	__(jump_fname)
+dnl 	
+dnl /* Tail-recursively call the function in nfn.  */
+dnl /* Pretty much the same as the tcallsym* cases above.  */
+dnl _spentry(tcallnfngen)
+dnl 	__(cmpri(cr0,nargs,nargregs<<fixnumshift))
+dnl 	__(ble cr0,_SPtcallnfnvsp)
+dnl         __(b _SPtcallnfnslide)
+dnl 
+dnl /* Some args were vpushed.  Slide them down to the base of  */
+dnl /* the current frame, then do funcall.  */
+dnl _spentry(tcallnfnslide)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr imm0,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl 	/* Since we have a known function, can use fname as a temporary.  */
+dnl 	__(subi imm1,nargs,nargregs<<fixnumshift)
+dnl 	__(add imm1,imm1,vsp)
+dnl 1:
+dnl 	__(ldru(fname,-node_size(imm1)))
+dnl 	__(cmpr(cr0,imm1,vsp))
+dnl 	__(push(fname,imm0))
+dnl 	__(bne cr0,1b)
+dnl 	__(mov vsp,imm0)
+dnl        	__(jump_nfn())
+dnl         
+dnl _spentry(tcallnfnvsp)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mtlr loc_pc)
+dnl        	__(jump_nfn())
+dnl 	
+dnl /* Reference index arg_z of a misc-tagged object (arg_y).  */
+dnl /* Note that this conses in some cases.  Return a properly-tagged  */
+dnl /* lisp object in arg_z.  Do type and bounds-checking.  */
+dnl 	
+dnl _spentry(misc_ref)
+dnl 	__(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))
+dnl 	__(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
+dnl 	__(vector_length(imm0,arg_y,imm1))
+dnl 	__(trlge(arg_z,imm0))
+dnl 	__(extract_lowbyte(imm1,imm1))	/* imm1 = subtag  */
+dnl         __(b local_label(misc_ref_common))	
+dnl 	
+dnl 
+dnl         
+dnl /* like misc_ref, only the boxed subtag is in arg_x.  */
+dnl 
+dnl _spentry(subtag_misc_ref)
+dnl 	__(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))
+dnl         __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
+dnl 	__(vector_length(imm0,arg_y,imm1))
+dnl 	__(trlge(arg_z,imm0))
+dnl 	__(unbox_fixnum(imm1,arg_x))
+dnl         __(b local_label(misc_ref_common))
+dnl 
+dnl _spentry(builtin_aref1)
+dnl 	__(extract_typecode(imm0,arg_y))
+dnl 	__(cmpri(cr0,imm0,min_vector_subtag))
+dnl 	__(box_fixnum(arg_x,imm0))
+dnl 	__(bgt cr0,_SPsubtag_misc_ref)
+dnl 	__(jump_builtin(_builtin_aref1,2))
+dnl         	
+dnl 	
+dnl /* Make a cons cell on the vstack.  Always push 3 words, 'cause we're   */
+dnl /* not sure how the vstack will be aligned.  */
+dnl _spentry(stkconsyz)
+dnl 	__(mov imm0,#nil_value)
+dnl 	__(vpush1(imm0))
+dnl 	__(vpush1(imm0))
+dnl 	__(vpush1(imm0))
+dnl 	__(andi. imm0,vsp,1<<word_shift) /* (oddp vsp ?)  */
+dnl 	__(beq cr0,1f)
+dnl 	__(str(arg_y,node_size*2(vsp))) /* car  */
+dnl 	__(str(arg_z,node_size(vsp))) /* cdr  */
+dnl 	__(la arg_z,fulltag_cons+node_size(vsp))
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(str(arg_y,node_size(vsp))) /* car, again  */
+dnl 	__(str(arg_z,0(vsp)))
+dnl 	__(la arg_z,fulltag_cons(vsp))
+dnl 	__(bx lr)
+dnl 
+dnl /* Make a stack-consed value cell.  Much like the case of */
+dnl /* stack-allocating a cons cell.  Imm0 points to the closed-over value */
+dnl /* (already vpushed).  Replace that locative with the vcell.  */
+dnl _spentry(stkvcell0)
+dnl 	__(sub imm1,imm0,vsp) /* imm1 = delta from vsp to value cell loc  */
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(vpush1(arg_z))
+dnl 	__(vpush1(arg_z))
+dnl 	__(vpush1(arg_z))
+dnl 	__(addi imm1,imm1,node_size*3)
+dnl 	__(add imm0,vsp,imm1) /* in case stack overflowed  */
+dnl 	__(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
+dnl 	__(mov imm1,#value_cell_header)
+dnl 	__(ldr arg_z,[imm0,#0])
+dnl 	__(beq cr0,1f)
+dnl 	__(str(arg_z,node_size*2(vsp)))
+dnl 	__(str(imm1,node_size(vsp)))
+dnl 	__(la arg_z,fulltag_misc+node_size(vsp))
+dnl 	__(str(arg_z,0(imm0)))
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(str(arg_z,node_size(vsp)))
+dnl 	__(str(imm1,0(vsp)))
+dnl 	__(la arg_z,fulltag_misc(vsp))
+dnl 	__(str(arg_z,0(imm0)))
+dnl 	__(bx lr)
+dnl 
+dnl         
+dnl _spentry(stkvcellvsp)      
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(vpush1(arg_z))
+dnl 	__(vpush1(arg_z))
+dnl 	__(vpush1(arg_z))
+dnl 	__(mov imm1,#node_size*3)
+dnl 	__(add imm0,vsp,imm1) /* in case stack overflowed  */
+dnl 	__(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
+dnl 	__(mov imm1,#value_cell_header)
+dnl 	__(ldr arg_z,[imm0,#0])
+dnl 	__(beq cr0,1f)
+dnl 	__(str(arg_z,node_size*2(vsp)))
+dnl 	__(str(imm1,node_size(vsp)))
+dnl 	__(la arg_z,fulltag_misc+node_size(vsp))
+dnl 	__(str(arg_z,0(imm0)))
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(str(arg_z,node_size(vsp)))
+dnl 	__(str(imm1,0(vsp)))
+dnl 	__(la arg_z,fulltag_misc(vsp))
+dnl 	__(str(arg_z,0(imm0)))
+dnl 	__(bx lr)
+dnl 
+dnl /* Make a "raw" area on the temp stack, stack-cons a macptr to point to it,  */
+dnl /* and return the macptr.  Size (in bytes, boxed) is in arg_z on entry; macptr */
+dnl /* in arg_z on exit.  */
+dnl _spentry(makestackblock)
+dnl 	__(unbox_fixnum(imm0,arg_z))
+dnl         __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size))
+dnl 	__(cmplri(cr0,imm0,tstack_alloc_limit))
+dnl 	__(bge cr0,1f)
+dnl 	__(TSP_Alloc_Var_Unboxed(imm0))
+dnl 	__(mov imm0,#macptr_header)
+dnl 	__(la imm1,tsp_frame.data_offset+macptr.size(tsp))
+dnl 	__(str(imm0,tsp_frame.data_offset(tsp)))
+dnl 	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+dnl 	__(str(imm1,macptr.address(arg_z)))
+dnl         __ifdef(`PPC64')
+dnl          __(std rzero,macptr.domain(arg_z))
+dnl          __(std rzero,macptr.type(arg_z))
+dnl         __else
+dnl 	 __(stfd fp_zero,macptr.domain(arg_z))
+dnl         __endif
+dnl 	__(bx lr)
+dnl 
+dnl         /* Too big. Heap cons a gcable macptr  */
+dnl 1:
+dnl 	__(TSP_Alloc_Fixed_Unboxed(0))
+dnl 	__(set_nargs(1))
+dnl 	__(mov fname,#nrs.new_gcable_ptr)
+dnl 	__(jump_fname())
+dnl 
+dnl /* As above, only set the block's contents to 0.  */
+dnl _spentry(makestackblock0)
+dnl 	__(unbox_fixnum(imm0,arg_z))
+dnl         __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size))
+dnl 	__(cmplri(cr0,imm0,tstack_alloc_limit))
+dnl 	__(bge cr0,3f)
+dnl 	__(TSP_Alloc_Var_Unboxed(imm0))
+dnl 	__(Zero_TSP_Frame(imm0,imm1))
+dnl 	__(mov imm0,#macptr_header)
+dnl 	__(la imm1,tsp_frame.data_offset+macptr.size(tsp))
+dnl 	__(str(imm0,tsp_frame.data_offset(tsp)))
+dnl 	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+dnl 	__(str(imm1,macptr.address(arg_z))) /* makestackblock0 expects the address to be in imm1  */
+dnl 	__(stfd fp_zero,macptr.domain(arg_z))
+dnl 	__(bx lr)
+dnl 
+dnl         /* Too big. Heap cons a gcable macptr  */
+dnl 3:
+dnl 	__(TSP_Alloc_Fixed_Unboxed(0)) /* "raw" block to make the compiler happy  */
+dnl 
+dnl 	__(mov arg_y,arg_z) /* save block size  */
+dnl 	__(mov arg_z,#t_value) /* clear-p arg to %new-gcable-ptr  */
+dnl 	__(set_nargs(2))
+dnl 	__(mov fname,#nrs.new_gcable_ptr)
+dnl 	__(jump_fname())
+dnl 
+dnl /* Make a list of length arg_y (boxed), initial-element arg_z (boxed) on  */
+dnl /* the tstack.  Return the list in arg_z.  */
+dnl _spentry(makestacklist)
+dnl 	__(add imm0,arg_y,arg_y)
+dnl 	__(cmplri(cr1,imm0,((tstack_alloc_limit+1)-cons.size)))
+dnl 	__(addi imm0,imm0,tsp_frame.fixed_overhead)
+dnl 	__(bge cr1,3f)
+dnl 	__(TSP_Alloc_Var_Boxed(imm0,imm1))
+dnl 	__(mov imm1,arg_y)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(mov arg_y,arg_z)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(ldr imm2,[tsp,#tsp_frame.backlink])
+dnl 	__(la imm2,-tsp_frame.fixed_overhead+fulltag_cons(imm2))
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(subi imm1,imm1,fixnum1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(_rplacd(imm2,arg_z))
+dnl 	__(_rplaca(imm2,arg_y))
+dnl 	__(mov arg_z,imm2)
+dnl 	__(subi imm2,imm2,cons.size)
+dnl 2:
+dnl 	__(bne cr1,1b)
+dnl 	__(bx lr)
+dnl 
+dnl 3:
+dnl 	__(cmpri(cr1,arg_y,0))
+dnl 	__(TSP_Alloc_Fixed_Boxed(0))  /* make the compiler happy  */
+dnl 	__(mov imm1,arg_y) /* count  */
+dnl 	__(mov arg_y,arg_z) /* initial value  */
+dnl 	__(mov arg_z,#nil_value) /* result  */
+dnl 	__(b 5f)
+dnl 4:
+dnl 	__(subi imm1,imm1,fixnum1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(Cons(arg_z,arg_y,arg_z))
+dnl 5:
+dnl 	__(bne cr1,4b)
+dnl 	__(bx lr)
+dnl 
+dnl /* subtype (boxed) vpushed before initial values. (Had better be a  */
+dnl /* node header subtag.) Nargs set to count of things vpushed.  */
+dnl 
+dnl _spentry(stkgvector)
+dnl 	__(la imm0,-fixnum_one(nargs))
+dnl 	__(cmpri(cr1,imm0,0))
+dnl 	__(add imm1,vsp,nargs)
+dnl 	__(ldru(temp0,-node_size(imm1)))
+dnl 	__(slri(imm2,imm0,num_subtag_bits-fixnumshift))
+dnl         __ifdef(`PPC64')
+dnl          __(unbox_fixnum(imm3,temp0))
+dnl          __(or imm2,imm3,imm2)
+dnl         __else
+dnl 	 __(rlwimi imm2,temp0,32-fixnumshift,32-num_subtag_bits,31)
+dnl         __endif
+dnl         __(dnode_align(imm0,imm0,node_size+tsp_frame.fixed_overhead))
+dnl 	__(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
+dnl 	__(str(imm2,tsp_frame.data_offset(tsp)))
+dnl 	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
+dnl 	__(la imm3,misc_header_offset(arg_z))
+dnl 	__(mov imm0,#fixnum1)
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(addi imm0,imm0,fixnum1)
+dnl 	__(cmpr(cr1,imm0,nargs))
+dnl 	__(ldru(temp0,-node_size(imm1)))
+dnl 	__(stru(temp0,node_size(imm3)))
+dnl 2:
+dnl 	__(bne cr1,1b)
+dnl 	__(add vsp,vsp,nargs)
+dnl 	__(bx lr)
+dnl 
+dnl /* Allocate a "fulltag_misc" object.  On entry, arg_y contains the element  */
+dnl /* count (boxed) and  arg_z contains the subtag (boxed).  Both of these   */
+dnl /* parameters must be "reasonable" (the  subtag must be valid, the element  */
+dnl /* count must be of type (unsigned-byte 24)/(unsigned-byte 56).   */
+dnl /* On exit, arg_z contains the (properly tagged) misc object; it'll have a  */
+dnl /* proper header on it and its contents will be 0.   imm0 contains   */
+dnl /* the object's header (fulltag = fulltag_immheader or fulltag_nodeheader.)  */
+dnl /* This is intended for things like "make-array" and "%make-bignum" and the   */
+dnl /* like.  Things that involve creating small objects of known size can usually  */
+dnl /* do so inline with less hair.  */
+dnl 
+dnl /* If this has to go out-of-line (to GC or whatever), it should do so via a   */
+dnl /* trap (or should otherwise ensure that both the LR and CTR are preserved   */
+dnl /* where the GC can find them.)  */
+dnl 
+dnl 
+dnl _spentry(misc_alloc)
+dnl         __ifdef(`PPC64')
+dnl          __(extract_unsigned_byte_bits_(imm2,arg_y,56))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(sldi imm2,arg_y,num_subtag_bits-fixnumshift)
+dnl          __(clrldi imm1,imm0,64-nlowtagbits)
+dnl          __(or imm0,imm2,imm0)
+dnl          __(extract_fulltag(imm2,imm0))
+dnl          __(cmpdi cr1,imm1,lowtag_nodeheader)
+dnl          __(cmpdi cr2,imm2,ivector_class_64_bit)
+dnl          __(bne- cr0,9f)
+dnl          __(cmpdi cr3,imm2,ivector_class_32_bit)
+dnl          __(cmpdi cr4,imm2,ivector_class_8_bit)
+dnl          __(mov imm2,arg_y)
+dnl          __(cmpdi cr5,imm1,subtag_bit_vector)
+dnl          __(beq cr1,1f)
+dnl          __(beq cr2,1f)
+dnl          __(srdi imm2,imm2,1)
+dnl          __(beq cr3,1f)
+dnl          __(beq cr5,2f)
+dnl          __(srdi imm2,imm2,1)
+dnl          __(bne cr4,1f)
+dnl          __(srdi imm2,imm2,1)
+dnl /* imm2 now = byte count.  Add 8 for header, 15 to align, then clear */
+dnl /* low four bits. */
+dnl 1:
+dnl          __(dnode_align(imm2,imm2,node_size))
+dnl 
+dnl 	 __(Misc_Alloc(arg_z,imm0,imm2))
+dnl 	 __(bx lr)
+dnl 2:      /* bit-vector case  */
+dnl          __(addi imm2,arg_y,7<<fixnumshift)
+dnl          __(srdi imm2,imm2,3+fixnumshift)
+dnl          __(b 1b)
+dnl 9:                      
+dnl 	 __(uuo_interr(error_object_not_unsigned_byte_56,arg_y))
+dnl         __else
+dnl 	 __(extract_unsigned_byte_bits_(imm2,arg_y,24))
+dnl 	 __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(extract_fulltag(imm1,imm0))
+dnl 	 __(bne- cr0,9f)
+dnl 	 __(cmpri(cr0,imm1,fulltag_nodeheader))
+dnl 	 __(mov imm3,imm0)
+dnl 	 __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))
+dnl 	 __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits	)/* imm0 now = header  */
+dnl 	 __(mov imm2,arg_y)
+dnl 	 __(beq cr0,1f)	/* do probe if node object (fixnum element count = byte count).  */
+dnl 	 __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))
+dnl 	 __(bng cr1,1f)	/* do probe if 32-bit imm object  */
+dnl 	 __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))
+dnl 	 __(srwi imm2,imm2,1)
+dnl 	 __(bgt cr0,2f)
+dnl 	 __(bgt cr1,1f)
+dnl 	 __(srwi imm2,imm2,1)
+dnl         /* imm2 now = byte count.  Add 4 for header, 7 to align, then clear */
+dnl         /* low three bits.  */
+dnl 1:
+dnl          __(dnode_align(imm2,imm2,node_size))
+dnl 
+dnl 	 __(Misc_Alloc(arg_z,imm0,imm2))
+dnl 	 __(bx lr)
+dnl 2:
+dnl 	 __(cmplri(imm3,subtag_double_float_vector))
+dnl 	 __(slwi imm2,arg_y,1)
+dnl 	 __(beq 1b)
+dnl 	 __(addi imm2,arg_y,7<<fixnumshift)
+dnl 	 __(srwi imm2,imm2,fixnumshift+3)
+dnl 	 __(b 1b)
+dnl 9:
+dnl 	 __(uuo_interr(error_object_not_unsigned_byte_24,arg_y))
+dnl         __endif
+dnl         
+dnl /* almost exactly as above, but "swap exception handling info" */
+dnl /* on exit and return  */
+dnl /* Deprecated */        
+dnl _spentry(poweropen_ffcallX)
+dnl         .long 0x7c800008        /* debug trap */
+dnl 
+dnl 
+dnl /* Destructuring-bind, macro-bind.  */
+dnl    
+dnl /* OK to use arg_x, arg_y for whatever (tagged) purpose;  */
+dnl /* likewise immX regs.  */
+dnl /* arg_z preserved, nothing else in particular defined on exit.  */
+dnl /* nargs contains req count (0-255) in PPC bits mask_req_start/mask_req_width,  */
+dnl /* opt count (0-255) in PPC bits mask_opt_start/mask_opt_width,  */
+dnl /* key count (0-255) in PPC bits mask_key_start/mask_key_width,  */
+dnl /* opt-supplied-p flag in PPC bit mask_initopt,  */
+dnl /* keyp flag in PPC bit mask_keyp,  */
+dnl /* &allow-other-keys flag in PPC bit mask_aok,  */
+dnl /* &rest flag in PPC bit mask_restp.  */
+dnl /* When mask_keyp bit is set, keyvect contains vector of keyword symbols,  */
+dnl /* length key count.  */
+dnl 
+dnl _spentry(macro_bind)
+dnl         __ifdef(`PPC64')
+dnl  	 __(mov whole_reg,arg_reg)
+dnl 	 __(extract_fulltag(imm0,arg_reg))
+dnl          __(cmpri(cr1,arg_reg,nil_value))
+dnl 	 __(cmpri(cr0,imm0,fulltag_cons))
+dnl          __(beq cr1,0f)
+dnl 	 __(bne- cr0,1f)
+dnl 0:             
+dnl 	 __(_cdr(arg_reg,arg_reg))
+dnl 	 __(b local_label(destbind1))
+dnl         __else
+dnl 	 __(mov whole_reg,arg_reg)
+dnl 	 __(extract_lisptag(imm0,arg_reg))
+dnl 	 __(cmpri(cr0,imm0,tag_list))
+dnl 	 __(bne- cr0,1f)
+dnl 	 __(_cdr(arg_reg,arg_reg))
+dnl 	 __(b (local_label(destbind1)))
+dnl         __endif
+dnl 1:
+dnl 	__(mov arg_y,#XCALLNOMATCH)
+dnl 	__(mov arg_z,whole_reg)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl 
+dnl 
+dnl _spentry(destructuring_bind)
+dnl 	__(mov whole_reg,arg_reg)
+dnl         __(b local_label(destbind1))
+dnl 	
+dnl _spentry(destructuring_bind_inner)
+dnl 	__(mov whole_reg,arg_z)
+dnl local_label(destbind1): 
+dnl 	/* Extract required arg count.  */
+dnl 	/* A bug in gas: can't handle shift count of "32" (= 0  */
+dnl 	ifelse(eval(mask_req_width+mask_req_start),eval(32),`
+dnl 	__(clrlwi. imm0,nargs,mask_req_start)
+dnl 	',`
+dnl 	__(extrwi. imm0,nargs,mask_req_width,mask_req_start)
+dnl 	')
+dnl 	__(extrwi imm1,nargs,mask_opt_width,mask_opt_start)
+dnl 	__(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)
+dnl 	__(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)
+dnl 	__(cmpri(cr4,imm4,0))
+dnl 	__(rlwinm imm4,nargs,0,mask_restp,mask_restp)
+dnl 	__(cmpri(cr5,imm4,0))
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(cmpri(cr2,imm2,0))
+dnl 	/* Save entry vsp in case of error.  */
+dnl 	__(mov imm4,vsp)
+dnl 	__(beq cr0,2f)
+dnl 1:
+dnl 	__(cmpri(cr7,arg_reg,nil_value))
+dnl         __ifdef(`PPC64')
+dnl          __(extract_fulltag(imm3,arg_reg))
+dnl          __(cmpri(cr3,imm3,fulltag_cons))
+dnl         __else       
+dnl 	 __(extract_lisptag(imm3,arg_reg))
+dnl 	 __(cmpri(cr3,imm3,tag_list))
+dnl         __endif
+dnl 	__(subi imm0,imm0,1)
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(beq cr7,toofew)
+dnl 	__(bne cr3,badlist)
+dnl 	__(ldr arg_x,[arg_reg,#cons.car])
+dnl 	__(ldr arg_reg,[arg_reg,#cons.cdr])
+dnl 	__(vpush1(arg_x))
+dnl 	__(bne cr0,1b)
+dnl 2:
+dnl 	__(beq cr1,rest_keys)
+dnl 	__(bne cr2,opt_supp)
+dnl 	/* 'simple' &optionals:	 no supplied-p, default to nil.  */
+dnl simple_opt_loop:
+dnl 	__(cmpri(cr0,arg_reg,nil_value))
+dnl         __ifdef(`PPC64')
+dnl          __(extract_fulltag(imm3,arg_reg))
+dnl          __(cmpri(cr3,imm3,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_lisptag(imm3,arg_reg))
+dnl 	 __(cmpri(cr3,imm3,tag_list))
+dnl         __endif
+dnl 	__(subi imm1,imm1,1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(mov imm5,#nil_value)
+dnl 	__(beq cr0,default_simple_opt)
+dnl 	__(bne cr3,badlist)
+dnl 	__(ldr arg_x,[arg_reg,#cons.car])
+dnl 	__(ldr arg_reg,[arg_reg,#cons.cdr])
+dnl 	__(vpush1(arg_x))
+dnl 	__(bne cr1,simple_opt_loop)
+dnl 	__(b rest_keys)
+dnl default_simple_opt_loop:
+dnl 	__(subi imm1,imm1,1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl default_simple_opt:
+dnl 	__(vpush1(imm5))
+dnl 	__(bne cr1,default_simple_opt_loop)
+dnl 	__(b rest_keys)
+dnl 	/* Provide supplied-p vars for the &optionals.  */
+dnl opt_supp:
+dnl 	__(mov arg_y,#t_value)
+dnl opt_supp_loop:
+dnl 	__(cmpri(cr0,arg_reg,nil_value))
+dnl         __ifdef(`PPC64')
+dnl          __(extract_fulltag(imm3,arg_reg))
+dnl          __(cmpri(cr3,imm3,fulltag_cons))
+dnl         __else        
+dnl 	 __(extract_lisptag(imm3,arg_reg))
+dnl 	 __(cmpri(cr3,imm3,tag_list))
+dnl         __endif
+dnl 	__(subi imm1,imm1,1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(beq cr0,default_hard_opt)
+dnl 	__(bne cr3,badlist)
+dnl 	__(ldr arg_x,[arg_reg,#cons.car])
+dnl 	__(ldr arg_reg,[arg_reg,#cons.cdr])
+dnl 	__(vpush1(arg_x))
+dnl 	__(vpush1(arg_y))
+dnl 	__(bne cr1,opt_supp_loop)
+dnl 	__(b rest_keys)
+dnl default_hard_opt_loop:
+dnl 	__(subi imm1,imm1,1)
+dnl 	__(cmpri(cr1,imm1,0))
+dnl default_hard_opt:
+dnl 	__(vpush1(imm5))
+dnl 	__(vpush1(imm5))
+dnl 	__(bne cr1,default_hard_opt_loop)
+dnl rest_keys:
+dnl 	__(cmpri(cr0,arg_reg,nil_value))
+dnl 	__(bne cr5,have_rest)
+dnl 	__(bne cr4,have_keys)
+dnl 	__(bne cr0,toomany)
+dnl 	__(bx lr)
+dnl have_rest:
+dnl 	__(vpush1(arg_reg))
+dnl 	__(beqlr cr4)
+dnl have_keys:
+dnl 	/* Ensure that arg_reg contains a proper,even-length list.  */
+dnl 	/* Insist that its length is <= 512 (as a cheap circularity check.)  */
+dnl 	__(mov imm0,#256)
+dnl 	__(mov arg_x,arg_reg)
+dnl count_keys_loop:
+dnl         __ifdef(`PPC64')
+dnl          __(extract_fulltag(imm3,arg_x))
+dnl          __(cmpri(cr3,imm3,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_lisptag(imm3,arg_x))
+dnl 	 __(cmpri(cr3,imm3,tag_list))
+dnl         __endif
+dnl 	__(cmpri(cr0,arg_x,nil_value))
+dnl 	__(subi imm0,imm0,1)
+dnl 	__(cmpri(cr4,imm0,0))
+dnl 	__(beq cr0,counted_keys)
+dnl 	__(bne cr3,badlist)
+dnl 	__(ldr arg_x,[arg_x,#cons.cdr])
+dnl         __ifdef(`PPC64')
+dnl          __(extract_fulltag(imm3,arg_x))
+dnl          __(cmpri(cr3,imm3,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_lisptag(imm3,arg_x))
+dnl 	 __(cmpri(cr3,imm3,tag_list))
+dnl         __endif
+dnl 	__(blt cr4,toomany)
+dnl 	__(cmpri(cr0,arg_x,nil_value))
+dnl 	__(beq cr0,db_badkeys)
+dnl 	__(bne cr3,badlist)
+dnl 	__(ldr arg_x,[arg_x,#cons.cdr])
+dnl 	__(b count_keys_loop)
+dnl counted_keys:
+dnl 	/* We've got a proper, even-length list of key/value pairs in */
+dnl 	/* arg_reg. For each keyword var in the lambda-list, push a pair */
+dnl 	/* of NILs on the vstack.  */
+dnl 	__(extrwi. imm0,nargs,mask_key_width,mask_key_start )
+dnl 	__(mov imm2,imm0) 	/* save number of keys  */
+dnl 	__(mov imm5,#nil_value)
+dnl 	__(b push_pair_test)
+dnl push_pair_loop:
+dnl 	__(cmpri(cr0,imm0,1))
+dnl 	__(subi imm0,imm0,1)
+dnl 	__(vpush1(imm5))
+dnl 	__(vpush1(imm5))
+dnl push_pair_test:
+dnl 	__(bne cr0,push_pair_loop)
+dnl 	__(slwi imm2,imm2,dnode_shift)  /* pairs -> bytes  */
+dnl 	__(add imm2,vsp,imm2)		/* imm2 points below pairs  */
+dnl 	__(mov imm0,#0)			/* count unknown keywords so far  */
+dnl 	__(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed  */
+dnl 	__(extrwi nargs,nargs,mask_key_width,mask_key_start)
+dnl 	/* Now, for each keyword/value pair in the list  */
+dnl 	/*  a) if the keyword is found in the keyword vector, set the  */
+dnl 	/*     corresponding entry on the vstack to the value and the  */
+dnl 	/*     associated supplied-p var to T.  */
+dnl 	/*  b) Regardless of whether or not the keyword is found,  */
+dnl         /*     if :ALLOW-OTHER-KEYS is provided with a non-nil value, */
+dnl 	/*     set the low bit of imm1 to indicate that unknown keywords  */
+dnl 	/*     are acceptable. (This bit is pre-set above to the value */
+dnl         /*     the encoded value of &allow_other_keys.) */
+dnl 	/*  c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment  */
+dnl 	/*     the count of unknown keywords in the high bits of imm1*/
+dnl 	/* At the end of the list, signal an error if any unknown keywords were seen  */
+dnl 	/* but not allowed.  Otherwise, return.  */
+dnl 
+dnl match_keys_loop:
+dnl 	__(cmpri(cr0,arg_reg,nil_value))
+dnl 	__(mov imm0,#0)
+dnl 	__(mov imm3,#misc_data_offset)
+dnl 	__(beq cr0,matched_keys)
+dnl 	__(ldr arg_x,[arg_reg,#cons.car])
+dnl 	__(mov arg_y,#nrs.kallowotherkeys)
+dnl 	__(cmpr(cr3,arg_x,arg_y))	/* :ALLOW-OTHER-KEYS ?  */
+dnl 	__(ldr arg_reg,[arg_reg,#cons.cdr])
+dnl 	__(ldr arg_y,[arg_reg,#cons.car])
+dnl 	__(cmpr(cr4,imm0,nargs))
+dnl 	__(ldr arg_reg,[arg_reg,#cons.cdr])
+dnl 	__(b match_test)
+dnl match_loop:
+dnl 	__(ldrx(temp0,keyvect_reg,imm3))
+dnl 	__(cmpr(cr0,arg_x,temp0))
+dnl 	__(addi imm0,imm0,1)
+dnl 	__(cmpr(cr4,imm0,nargs))
+dnl 	__(addi imm3,imm3,node_size)
+dnl 	__(bne cr0,match_test)
+dnl 	/* Got a hit.  Unless this keyword's been seen already, set it.  */
+dnl 	__(slwi imm0,imm0,dnode_shift)
+dnl 	__(subf imm0,imm0,imm2)
+dnl 	__(ldr temp0,[imm0,#0])
+dnl 	__(cmpri(cr0,temp0,nil_value))
+dnl 	__(mov temp0,#t_value)
+dnl 	__(bne cr0,match_keys_loop)	/* already saw this  */
+dnl 	__(str(arg_y,node_size*1(imm0)))
+dnl 	__(str(temp0,node_size*0(imm0)))
+dnl         __(bne cr3,match_keys_loop)
+dnl 	__(b match_keys_check_aok)
+dnl match_test:
+dnl 	__(bne cr4,match_loop)
+dnl         __(beq cr3,match_keys_check_aok)
+dnl         __(addi imm1,imm1,node_size)
+dnl         __(b match_keys_loop)
+dnl match_keys_check_aok:
+dnl         __(andi. imm0,imm1,2)  /* check "seen-aok" bit in imm1 */
+dnl         __(cmpri cr1,arg_y,nil_value) /* check value */
+dnl         __(ori imm1,imm1,2)
+dnl         __(bne cr0,match_keys_loop) /* duplicate aok */
+dnl         __(beq cr1,match_keys_loop)
+dnl         __(ori imm1,imm1,1)
+dnl 	__(b match_keys_loop)
+dnl matched_keys:
+dnl         __(clrrwi. imm0,imm1,2)
+dnl         __(beqlr)
+dnl         __(andi. imm1,imm1,1)
+dnl         __(bnelr)
+dnl 	/* Some unrecognized keywords.  Complain generically about  */
+dnl 	/* invalid keywords.  */
+dnl db_badkeys:
+dnl 	__(mov arg_y,#XBADKEYS)
+dnl 	__(b destructure_error)
+dnl toomany:
+dnl 	__(mov arg_y,#XCALLTOOMANY)
+dnl 	__(b destructure_error)
+dnl toofew:
+dnl 	__(mov arg_y,#XCALLTOOFEW)
+dnl 	__(b destructure_error)
+dnl badlist:
+dnl 	__(mov arg_y,#XCALLNOMATCH)
+dnl 	/* b destructure_error  */
+dnl destructure_error:
+dnl 	__(mov vsp,imm4)		/* undo everything done to the stack  */
+dnl 	__(mov arg_z,whole_reg)
+dnl 	__(set_nargs(2))
+dnl 	__(b _SPksignalerr)
+dnl         
+dnl /* vpush the values in the value set atop the vsp, incrementing nargs.  */
+dnl /* Discard the tsp frame; leave values atop the vsp.  */
+dnl 
+dnl _spentry(recover_values)
+dnl 
+dnl /* First, walk the segments reversing the pointer to previous segment pointers  */
+dnl /* Can tell the end because that previous segment pointer is the prev tsp pointer  */
+dnl 	__(ldr imm0,[tsp,#tsp_frame.backlink]) /* previous tsp  */
+dnl 	__(mov imm1,tsp) /* current segment  */
+dnl 	__(mov imm2,tsp) /* last segment  */
+dnl local_label(walkloop):
+dnl 	__(ldr imm3,[imm1,#tsp_frame.fixed_overhead+node_size]) /* next segment  */
+dnl 	__(cmpr(cr0,imm0,imm3)) /* last segment?  */
+dnl 	__(str(imm2,tsp_frame.fixed_overhead+node_size(imm1))) /* reverse pointer  */
+dnl 	__(mov imm2,imm1) /* last segment <- current segment  */
+dnl 	__(mov imm1,imm3) /* current segment <- next segment  */
+dnl 	__(bne cr0,local_label(walkloop))
+dnl 
+dnl         /* the final segment ptr is now in imm2  */
+dnl         /* walk backwards, pushing values on VSP and incrementing NARGS  */
+dnl local_label(pushloop):
+dnl 	__(ldr imm0,[imm2,#tsp_frame.data_offset]) /* nargs in segment  */
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(cmpr(cr1,imm2,tsp))
+dnl 	__(la imm3,tsp_frame.data_offset+(2*node_size)(imm2))
+dnl 	__(add imm3,imm3,imm0)
+dnl 	__(add nargs,nargs,imm0)
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(ldru(arg_z,-node_size(imm3)))
+dnl 	__(cmpri(cr0,imm0,fixnum_one))
+dnl 	__(subi imm0,imm0,fixnum_one)
+dnl 	__(vpush1(arg_z))
+dnl 2:
+dnl 	__(bne cr0,1b)
+dnl 	__(ldr imm2,[imm2,#tsp_frame.data_offset+node_size]) /* previous segment  */
+dnl 	__(bne cr1,local_label(pushloop))
+dnl 	__(unlink(tsp))
+dnl 	__(bx lr)
+dnl 
+dnl 	
+dnl /* Go out of line to do this.  Sheesh.  */
+dnl 
+dnl _spentry(vpopargregs)
+dnl 	__(cmpri(cr0,nargs,0))
+dnl 	__(cmpri(cr1,nargs,2<<fixnumshift))
+dnl 	__(beqlr cr0)
+dnl 	__(beq cr1,local_label(yz))
+dnl 	__(blt cr1,local_label(z))
+dnl 	__(ldr arg_z,[vsp,#node_size*0])
+dnl 	__(ldr arg_y,[vsp,#node_size*1])
+dnl 	__(ldr arg_x,[vsp,#node_size*2])
+dnl 	__(la vsp,node_size*3(vsp))
+dnl 	__(bx lr)
+dnl local_label(yz):
+dnl 	__(ldr arg_z,[vsp,#node_size*0])
+dnl 	__(ldr arg_y,[vsp,#node_size*1])
+dnl 	__(la vsp,node_size*2(vsp))
+dnl 	__(bx lr)
+dnl local_label(z):
+dnl 	__(ldr arg_z,[vsp,#node_size*0])
+dnl 	__(la vsp,node_size*1(vsp))
+dnl 	__(bx lr)
+dnl 
+dnl /* If arg_z is an integer, return in imm0 something whose sign  */
+dnl /* is the same as arg_z's.  If not an integer, error.  */
+dnl _spentry(integer_sign)
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr1,imm0,tag_fixnum))
+dnl 	__(cmpri(cr0,imm0,subtag_bignum))
+dnl 	__(mov imm0,arg_z)
+dnl 	__(beqlr+ cr1)
+dnl 	__(bne- cr0,1f)
+dnl 	__(getvheader(imm0,arg_z))
+dnl         __ifdef(`PPC64')
+dnl          __(header_size(imm0,imm0))
+dnl          __(sldi imm0,imm0,2)
+dnl         __else
+dnl          __(header_length(imm0,imm0)) /* boxed length = scaled size  */
+dnl         __endif
+dnl         __(addi imm0,imm0,misc_data_offset-4) /* bias, less 1 element  */
+dnl 	__(lwzx imm0,arg_z,imm0)
+dnl 	__(cmpwi cr0,imm0,0)
+dnl 	__(mov imm0,#1)
+dnl 	__(bgelr cr0)
+dnl 	__(mov imm0,#-1)
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(uuo_interr(error_object_not_integer,arg_z))
+dnl 
+dnl /* like misc_set, only pass the (boxed) subtag in temp0  */
+dnl _spentry(subtag_misc_set)
+dnl 	__(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
+dnl 	__(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl 	__(vector_length(imm0,arg_x,imm1))
+dnl 	__(trlge(arg_y,imm0))
+dnl 	__(unbox_fixnum(imm1,temp0))
+dnl local_label(misc_set_common):
+dnl         __ifdef(`PPC64')
+dnl          __(slwi imm1,imm1,3)
+dnl          __(mov imm0,#LO(local_label(misc_set_jmp)))
+dnl          __(addis imm0,imm0,HA(local_label(misc_set_jmp)))
+dnl          __(ldx imm0,imm0,imm1)
+dnl          __(mtctr imm0)
+dnl          __(bctr)
+dnl local_label(misc_set_jmp):              
+dnl         /* 00-0f  */
+dnl          .quad local_label(misc_set_invalid) /* 00 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 01 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 02 immheader_0  */
+dnl          .quad _SPgvset /* 03 function  */
+dnl          .quad local_label(misc_set_invalid) /* 04 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 05 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 06 immheader_1  */
+dnl          .quad _SPgvset /* 07 catch_frame  */
+dnl          .quad local_label(misc_set_invalid) /* 08 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 09 imm_2  */
+dnl          .quad local_label(misc_set_u32) /* 0a code_vector  */
+dnl          .quad _SPgvset /* 0b slot_vector  */
+dnl          .quad local_label(misc_set_invalid) /* 0c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 0d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 0e immheader_3  */
+dnl          .quad _SPgvset /* 0f ratio  */
+dnl         /* 10-1f  */
+dnl          .quad local_label(misc_set_invalid) /* 10 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 11 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 12 immheader_0  */
+dnl          .quad _SPgvset /* 13 symbol_0  */
+dnl          .quad local_label(misc_set_invalid) /* 14 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 15 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 16 immheader_1  */
+dnl          .quad _SPgvset /* 17 lisp_tread  */
+dnl          .quad local_label(misc_set_invalid) /* 18 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 19 imm_2  */
+dnl          .quad local_label(misc_set_u32) /* 1a xcode_vector  */
+dnl          .quad _SPgvset /* 1b instance  */
+dnl          .quad local_label(misc_set_invalid) /* 1c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 1d imm3  */
+dnl          .quad local_label(misc_set_u64) /* 1e macptr  */
+dnl          .quad _SPgvset /* 1f complex  */
+dnl         /* 20-2f  */
+dnl          .quad local_label(misc_set_invalid) /* 20 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 21 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 22 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 23 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 24 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 25 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 26 immheader_1  */
+dnl          .quad _SPgvset /* 27 lock  */
+dnl          .quad local_label(misc_set_invalid) /* 28 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 29 imm_2  */
+dnl          .quad local_label(misc_set_u32) /* 2a bignum  */
+dnl          .quad _SPgvset /* 2b struct  */
+dnl          .quad local_label(misc_set_invalid) /* 2c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 2d imm3  */
+dnl          .quad local_label(misc_set_u64) /* 2e dead_macptr  */
+dnl          .quad local_label(misc_set_invalid) /* 2f nodeheader_3  */
+dnl         /* 30-3f  */
+dnl          .quad local_label(misc_set_invalid) /* 30 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 31 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 32 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 33 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 34 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 35 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 36 immheader_1  */
+dnl          .quad _SPgvset /* 37 hash_vector  */
+dnl          .quad local_label(misc_set_invalid) /* 38 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 39 imm_2  */
+dnl          .quad local_label(misc_set_u32) /* 3a double_float  */
+dnl          .quad _SPgvset /* 3b istruct  */
+dnl          .quad local_label(misc_set_invalid) /* 3c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 3d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 3e immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* 3f nodeheader_3  */
+dnl         /* 40-4f  */
+dnl          .quad local_label(misc_set_invalid) /* 40 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 41 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 42 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 43 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 44 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 45 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 46 immheader_1  */
+dnl          .quad _SPgvset /* 47 pool  */
+dnl          .quad local_label(misc_set_invalid) /* 48 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 49 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* 4a immheader_2  */
+dnl          .quad _SPgvset /* 4b value_cell_2  */
+dnl          .quad local_label(misc_set_invalid) /* 4c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 4d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 4e immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* 4f nodeheader_3  */
+dnl         /* 50-5f  */
+dnl          .quad local_label(misc_set_invalid) /* 50 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 51 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 52 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 53 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 54 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 55 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 56 immheader_1  */
+dnl          .quad _SPgvset /* 57 weak  */
+dnl          .quad local_label(misc_set_invalid) /* 58 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 59 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* 5a immheader_2  */
+dnl          .quad _SPgvset /* 5b xfunction  */
+dnl          .quad local_label(misc_set_invalid) /* 5c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 5d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 5e immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* 5f nodeheader_3  */
+dnl         /* 60-6f  */
+dnl          .quad local_label(misc_set_invalid) /* 60 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 61 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 62 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 63 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 64 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 65 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 66 immheader_1  */
+dnl          .quad _SPgvset /* 67 package  */
+dnl          .quad local_label(misc_set_invalid) /* 68 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 69 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* 6a immheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* 6b nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* 6c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 6d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 6e immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* 6f nodeheader_3  */
+dnl         /* 70-7f  */
+dnl          .quad local_label(misc_set_invalid) /* 70 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 71 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 72 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 73 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 74 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 75 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 76 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* 77 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* 78 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 79 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* 7a immheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* 7b nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* 7c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 7d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 7e immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* 7f nodeheader_3  */
+dnl         /* 80-8f  */
+dnl          .quad local_label(misc_set_invalid) /* 80 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 81 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* 82 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 83 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 84 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 85 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* 86 immheader_1  */
+dnl          .quad _SPgvset /* 87 arrayH  */
+dnl          .quad local_label(misc_set_invalid) /* 88 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 89 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* 8a immheader_2  */
+dnl          .quad _SPgvset /* 8b vectorH  */
+dnl          .quad local_label(misc_set_invalid) /* 8c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 8d imm3  */
+dnl          .quad local_label(misc_set_invalid) /* 8e immheader_3  */
+dnl          .quad _SPgvset /* 8f simple_vector  */
+dnl         /* 90-9f  */
+dnl          .quad local_label(misc_set_invalid) /* 90 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 91 imm_0  */
+dnl          .quad local_label(misc_set_s8) /* 92 s8  */
+dnl          .quad local_label(misc_set_invalid) /* 93 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* 94 cons  */
+dnl          .quad local_label(misc_set_invalid) /* 95 imm_1  */
+dnl          .quad local_label(misc_set_s16) /* 96 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* 97 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* 98 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* 99 imm_2  */
+dnl          .quad local_label(misc_set_s32) /* 9a s32  */
+dnl          .quad local_label(misc_set_invalid) /* 9b nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* 9c misc  */
+dnl          .quad local_label(misc_set_invalid) /* 9d imm3  */
+dnl          .quad local_label(misc_set_s64) /* 9e s64  */
+dnl          .quad local_label(misc_set_invalid) /* 9f nodeheader_3  */
+dnl         /* a0-af  */
+dnl          .quad local_label(misc_set_invalid) /* a0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* a1 imm_0  */
+dnl          .quad local_label(misc_set_u8) /* a2 u8  */
+dnl          .quad local_label(misc_set_invalid) /* a3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* a4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* a5 imm_1  */
+dnl          .quad local_label(misc_set_u16) /* a6 u16  */
+dnl          .quad local_label(misc_set_invalid) /* a7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* a8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* a9 imm_2  */
+dnl          .quad local_label(misc_set_u32) /* aa u32  */
+dnl          .quad local_label(misc_set_invalid) /* ab nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* ac misc  */
+dnl          .quad local_label(misc_set_invalid) /* ad imm3  */
+dnl          .quad local_label(misc_set_u64) /* ae u64  */
+dnl          .quad local_label(misc_set_invalid) /* af nodeheader_3  */
+dnl         /* b0-bf  */
+dnl          .quad local_label(misc_set_invalid) /* b0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* b1 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* b2 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* b3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* b4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* b5 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* b6 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* b7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* b8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* b9 imm_2  */
+dnl          .quad local_label(misc_set_single_float_vector) /* ba sf vector  */
+dnl          .quad local_label(misc_set_invalid) /* bb nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* bc misc  */
+dnl          .quad local_label(misc_set_invalid) /* bd imm3  */
+dnl          .quad local_label(misc_set_fixnum_vector) /* be fixnum_vector  */
+dnl          .quad local_label(misc_set_invalid) /* bf nodeheader_3  */
+dnl         /* c0-cf  */
+dnl          .quad local_label(misc_set_invalid) /* c0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* c1 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* c2 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* c3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* c4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* c5 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* c6 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* c7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* c8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* c9 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* ca immheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* cb nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* cc misc  */
+dnl          .quad local_label(misc_set_invalid) /* cd imm3  */
+dnl          .quad local_label(misc_set_double_float_vector) /* ce double-float vector  */
+dnl          .quad local_label(misc_set_invalid) /* cf nodeheader_3  */
+dnl         /* d0-df  */
+dnl          .quad local_label(misc_set_invalid) /* d0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* d1 imm_0  */
+dnl          .quad local_label(misc_set_string) /* d2 string  */
+dnl          .quad local_label(misc_set_invalid) /* d3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* d4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* d5 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* d6 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* d7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* d8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* d9 imm_2  */
+dnl          .quad local_label(misc_set_new_string) /* da new_string  */
+dnl          .quad local_label(misc_set_invalid) /* db nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* dc misc  */
+dnl          .quad local_label(misc_set_invalid) /* dd imm3  */
+dnl          .quad local_label(misc_set_invalid) /* de immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* df nodeheader_3  */
+dnl         /* e0-ef  */
+dnl          .quad local_label(misc_set_invalid) /* e0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* e1 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* e2 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* e3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* e4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* e5 imm_1  */
+dnl          .quad local_label(misc_set_invalid) /* e6 immheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* e7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* e8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* e9 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* ea immheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* eb nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* ec misc  */
+dnl          .quad local_label(misc_set_invalid) /* ed imm3  */
+dnl          .quad local_label(misc_set_invalid) /* ee immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* ef nodeheader_3  */
+dnl         /* f0-ff  */
+dnl          .quad local_label(misc_set_invalid) /* f0 even_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* f1 imm_0  */
+dnl          .quad local_label(misc_set_invalid) /* f2 immheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* f3 nodeheader_0  */
+dnl          .quad local_label(misc_set_invalid) /* f4 cons  */
+dnl          .quad local_label(misc_set_invalid) /* f5 imm_1  */
+dnl          .quad local_label(misc_set_bit_vector) /* f6 bit_vector  */
+dnl          .quad local_label(misc_set_invalid) /* f7 nodeheader_1  */
+dnl          .quad local_label(misc_set_invalid) /* f8 odd_fixnum  */
+dnl          .quad local_label(misc_set_invalid) /* f9 imm_2  */
+dnl          .quad local_label(misc_set_invalid) /* fa immheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* fb nodeheader_2  */
+dnl          .quad local_label(misc_set_invalid) /* fc misc  */
+dnl          .quad local_label(misc_set_invalid) /* fd imm3  */
+dnl          .quad local_label(misc_set_invalid) /* fe immheader_3  */
+dnl          .quad local_label(misc_set_invalid) /* ff nodeheader_3  */
+dnl 
+dnl local_label(misc_set_bit_vector):               
+dnl          __(lis imm3,0x8000)
+dnl          __(extract_unsigned_byte_bits_(imm0,arg_z,1))
+dnl 	 __(extrwi imm1,arg_y,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
+dnl          __(srdi imm0,arg_y,5+fixnumshift)
+dnl 	 __(srw imm3,imm3,imm1)
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(cmpdi cr0,arg_z,0)
+dnl          __(sldi imm0,imm0,2)
+dnl 	 __(la imm0,misc_data_offset(imm0))
+dnl 	 __(lwzx imm2,arg_x,imm0)
+dnl          __(beq 1f)
+dnl          __(or imm2,imm3,imm2)
+dnl          __(stwx imm2,arg_x,imm0)
+dnl          __(bx lr)
+dnl 1:       __(andc imm2,imm2,imm3)
+dnl          __(stwx imm2,arg_x,imm0)
+dnl          __(bx lr)
+dnl local_label(misc_set_s16):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(sldi imm0,arg_z,64-(16+fixnumshift))
+dnl          __(srdi imm1,arg_y,2)
+dnl          __(cmpdi cr7,imm2,tag_fixnum)
+dnl          __(sradi imm0,imm0,64-(16+fixnumshift))
+dnl          __(cmpd imm0,arg_z)
+dnl          __(la imm1,misc_data_offset(imm1))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(bne cr7,local_label(misc_set_bad))
+dnl          __(sthx imm0,arg_x,imm1)
+dnl          __(bx lr)
+dnl local_label(misc_set_u16):
+dnl          __(extract_unsigned_byte_bits_(imm0,arg_z,16))
+dnl          __(srdi imm1,arg_y,2)                
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(la imm1,misc_data_offset(imm1))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(sthx imm0,arg_x,imm1)
+dnl          __(bx lr)
+dnl local_label(misc_set_single_float_vector):
+dnl          __(extract_fulltag(imm3,arg_z))
+dnl          __(srdi imm4,arg_y,1)
+dnl          __(cmpdi cr3,imm3,subtag_single_float)
+dnl          __(la imm4,misc_data_offset(imm4))
+dnl          __(bne cr3,local_label(misc_set_bad))
+dnl          __(srdi imm0,arg_z,32)
+dnl          __(stwx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_s32):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(srdi imm4,arg_y,1)
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(cmpdi imm2,tag_fixnum)
+dnl          __(sldi imm1,imm0,32)
+dnl          __(sradi imm1,imm1,32)
+dnl          __(la imm4,misc_data_offset(imm4))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(cmpd imm1,imm0)
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(stwx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_u32):              
+dnl          __(extract_unsigned_byte_bits_(imm0,arg_z,32))
+dnl          __(srdi imm4,arg_y,1)
+dnl 	 __(la imm4,misc_data_offset(imm4))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(stwx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_new_string):
+dnl          __(extract_lowbyte(imm0,arg_z))
+dnl          __(srdi imm4,arg_y,1)
+dnl          __(cmpdi imm0,subtag_character)
+dnl 	 __(la imm4,misc_data_offset(imm4))
+dnl          __(srwi imm0,arg_z,charcode_shift)
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(stwx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_string):      
+dnl          __(extract_lowbyte(imm0,arg_z))                
+dnl          __(srdi imm4,arg_y,3)
+dnl          __(cmpdi imm0,subtag_character)
+dnl          __(la imm4,misc_data_offset(imm4))
+dnl          __(bne cr0,local_label(misc_set_bad))
+dnl          __(srwi imm0,arg_z,charcode_shift)
+dnl          __(stbx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_s8):     
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(cmpdi cr2,imm2,tag_fixnum)
+dnl          __(srdi imm4,arg_y,3)
+dnl          __(sldi imm1,imm0,56)
+dnl          __(sradi imm1,imm1,56)
+dnl          __(cmpd imm1,imm0)
+dnl          __(bne cr2,local_label(misc_set_bad))
+dnl          __(la imm4,misc_data_offset(imm4))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(stbx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_u8):     
+dnl          __(extract_unsigned_byte_bits_(imm0,arg_z,8))
+dnl          __(srdi imm4,arg_y,3)
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(la imm4,misc_data_offset(imm4))
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(stbx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_u64):
+dnl          __(extract_lisptag(imm0,arg_z))
+dnl          __(extract_fulltag(imm2,arg_z))
+dnl          __(cmpdi cr0,arg_z,0)
+dnl          __(cmpdi cr7,imm0,0)
+dnl          __(cmpdi cr6,imm2,fulltag_misc)
+dnl          __(la imm4,misc_data_offset(arg_y))
+dnl          __(bne cr7,local_label(setu64_maybe_bignum))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(blt cr0,local_label(misc_set_bad))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(setu64_maybe_bignum):
+dnl          __(bne cr6,local_label(misc_set_bad))
+dnl          __(getvheader(imm1,arg_z))
+dnl          __(ld imm0,misc_data_offset(arg_z))
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(cmpdi cr2,imm1,two_digit_bignum_header)
+dnl          __(cmpdi cr3,imm1,three_digit_bignum_header)
+dnl          __(cmpdi cr0,imm0,0)
+dnl          __(beq cr2,1f)
+dnl          __(bne cr3,local_label(misc_set_bad))
+dnl          __(lwz imm3,misc_data_offset+8(arg_z))
+dnl          __(cmpwi cr0,imm3,0)
+dnl          __(bne cr0,local_label(misc_set_bad))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl 1:       __(blt cr0,local_label(misc_set_bad))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_double_float_vector):
+dnl          __(extract_typecode(imm0,arg_z))
+dnl          __(la imm4,misc_data_offset(arg_y))
+dnl          __(cmpdi imm0,subtag_double_float)
+dnl          __(bne local_label(misc_set_bad))
+dnl          __(ld imm0,misc_dfloat_offset(arg_z))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_fixnum_vector):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(cmpdi cr2,imm2,tag_fixnum)
+dnl          __(la imm4,misc_data_offset(arg_y))
+dnl          __(bne cr2,local_label(misc_set_bad))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_s64):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(extract_fulltag(imm3,arg_z))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl          __(cmpdi cr2,imm2,tag_fixnum)
+dnl          __(cmpdi cr6,imm3,fulltag_misc) 
+dnl          __(la imm4,misc_data_offset(arg_y))
+dnl          __(bne cr2,local_label(sets64_maybe_bignum))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(sets64_maybe_bignum):       
+dnl          __(bne cr6,local_label(misc_set_bad))
+dnl          __(getvheader(imm1,arg_z))
+dnl          __(ld imm0,misc_data_offset(arg_z))
+dnl          __(cmpdi cr1,imm1,two_digit_bignum_header)
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(bne cr1,local_label(misc_set_bad))
+dnl          __(stdx imm0,arg_x,imm4)
+dnl          __(bx lr)
+dnl local_label(misc_set_bad):
+dnl 	 __(mov arg_y,arg_z)
+dnl 	 __(mov arg_z,arg_x)
+dnl 	 __(mov arg_x,#XNOTELT)
+dnl 	 __(set_nargs(3))
+dnl 	 __(b _SPksignalerr)
+dnl local_label(misc_set_invalid):  
+dnl          __(mov temp0,#XSETBADVEC)        
+dnl          __(set_nargs(4))
+dnl          __(vpush1(temp0))
+dnl          __(b _SPksignalerr)        
+dnl         __else
+dnl          __(slwi imm1,imm1,2)
+dnl          __(mov imm0,#LO(local_label(misc_set_jmp)))
+dnl          __(addis imm0,imm0,HA(local_label(misc_set_jmp)))
+dnl          __(lwzx imm0,imm0,imm1)
+dnl          __(mtctr imm0)
+dnl          __(bctr)
+dnl local_label(misc_set_jmp):             
+dnl         /* 00-0f  */
+dnl          .long local_label(misc_set_invalid) /* 00 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 01 cons  */
+dnl          .long local_label(misc_set_invalid) /* 02 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* 03 imm  */
+dnl          .long local_label(misc_set_invalid) /* 04 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 05 nil  */
+dnl          .long local_label(misc_set_invalid) /* 06 misc  */
+dnl          .long local_label(misc_set_u32) /* 07 bignum  */
+dnl          .long local_label(misc_set_invalid) /* 08 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 09 cons  */
+dnl          .long _SPgvset /* 0a ratio  */
+dnl          .long local_label(misc_set_invalid) /* 0b imm  */
+dnl          .long local_label(misc_set_invalid) /* 0c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 0d nil  */
+dnl          .long local_label(misc_set_invalid) /* 0e misc  */
+dnl          .long local_label(misc_set_u32) /* 0f single_float  */
+dnl         /* 10-1f  */
+dnl          .long local_label(misc_set_invalid) /* 10 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 11 cons  */
+dnl          .long local_label(misc_set_invalid) /* 12 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* 13 imm  */
+dnl          .long local_label(misc_set_invalid) /* 14 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 15 nil  */
+dnl          .long local_label(misc_set_invalid) /* 16 misc  */
+dnl          .long local_label(misc_set_u32) /* 17 double_float  */
+dnl          .long local_label(misc_set_invalid) /* 18 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 19 cons  */
+dnl          .long _SPgvset /* 1a complex  */
+dnl          .long local_label(misc_set_invalid) /* 1b imm  */
+dnl          .long local_label(misc_set_invalid) /* 1c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 1d nil  */
+dnl          .long local_label(misc_set_invalid) /* 1e misc  */
+dnl          .long local_label(misc_set_u32) /* 1f macptr  */
+dnl         /* 20-2f  */
+dnl          .long local_label(misc_set_invalid) /* 20 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 21 cons  */
+dnl          .long _SPgvset /* 22 catch_frame  */
+dnl          .long local_label(misc_set_invalid) /* 23 imm  */
+dnl          .long local_label(misc_set_invalid) /* 24 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 25 nil  */
+dnl          .long local_label(misc_set_invalid) /* 26 misc  */
+dnl          .long local_label(misc_set_u32) /* 27 dead_macptr  */
+dnl          .long local_label(misc_set_invalid) /* 28 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 29 cons  */
+dnl          .long _SPgvset /* 2a function  */
+dnl          .long local_label(misc_set_invalid) /* 2b imm  */
+dnl          .long local_label(misc_set_invalid) /* 2c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 2d nil  */
+dnl          .long local_label(misc_set_invalid) /* 2e misc  */
+dnl          .long local_label(misc_set_u32) /* 2f code_vector  */
+dnl         /* 30-3f  */
+dnl          .long local_label(misc_set_invalid) /* 30 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 31 cons  */
+dnl          .long _SPgvset /* 32 lisp_thread  */
+dnl          .long local_label(misc_set_invalid) /* 33 imm  */
+dnl          .long local_label(misc_set_invalid) /* 34 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 35 nil  */
+dnl          .long local_label(misc_set_invalid) /* 36 misc  */
+dnl          .long local_label(misc_set_u32) /* 37 creole  */
+dnl          .long local_label(misc_set_invalid) /* 38 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 39 cons  */
+dnl          .long _SPgvset /* 3a symbol  */
+dnl          .long local_label(misc_set_invalid) /* 3b imm  */
+dnl          .long local_label(misc_set_invalid) /* 3c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 3d nil  */
+dnl          .long local_label(misc_set_invalid) /* 3e misc  */
+dnl          .long local_label(misc_set_u32) /* 3f xcode_vector  */
+dnl         /* 40-4f  */
+dnl          .long local_label(misc_set_invalid) /* 40 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 41 cons  */
+dnl          .long _SPgvset /* 42 lock  */
+dnl          .long local_label(misc_set_invalid) /* 43 imm  */
+dnl          .long local_label(misc_set_invalid) /* 44 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 45 nil  */
+dnl          .long local_label(misc_set_invalid) /* 46 misc  */
+dnl          .long local_label(misc_set_invalid) /* 47 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 48 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 49 cons  */
+dnl          .long _SPgvset /* 4a hash_vector  */
+dnl          .long local_label(misc_set_invalid) /* 4b imm  */
+dnl          .long local_label(misc_set_invalid) /* 4c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 4d nil  */
+dnl          .long local_label(misc_set_invalid) /* 4e misc  */
+dnl          .long local_label(misc_set_invalid) /* 4f immheader  */
+dnl         /* 50-5f  */
+dnl          .long local_label(misc_set_invalid) /* 50 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 51 cons  */
+dnl          .long _SPgvset /* 52 pool  */
+dnl          .long local_label(misc_set_invalid) /* 53 imm  */
+dnl          .long local_label(misc_set_invalid) /* 54 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 55 nil  */
+dnl          .long local_label(misc_set_invalid) /* 56 misc  */
+dnl          .long local_label(misc_set_invalid) /* 57 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 58 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 59 cons  */
+dnl          .long _SPgvset /* 5a weak  */
+dnl          .long local_label(misc_set_invalid) /* 5b imm  */
+dnl          .long local_label(misc_set_invalid) /* 5c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 5d nil  */
+dnl          .long local_label(misc_set_invalid) /* 5e misc  */
+dnl          .long local_label(misc_set_invalid) /* 5f immheader  */
+dnl         /* 60-6f  */
+dnl          .long local_label(misc_set_invalid) /* 60 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 61 cons  */
+dnl          .long _SPgvset /* 62 package  */
+dnl          .long local_label(misc_set_invalid) /* 63 imm  */
+dnl          .long local_label(misc_set_invalid) /* 64 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 65 nil  */
+dnl          .long local_label(misc_set_invalid) /* 66 misc  */
+dnl          .long local_label(misc_set_invalid) /* 67 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 68 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 69 cons  */
+dnl          .long _SPgvset /* 6a slot_vector  */
+dnl          .long local_label(misc_set_invalid) /* 6b imm  */
+dnl          .long local_label(misc_set_invalid) /* 6c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 6d nil  */
+dnl          .long local_label(misc_set_invalid) /* 6e misc  */
+dnl          .long local_label(misc_set_invalid) /* 6f immheader  */
+dnl         /* 70-7f  */
+dnl          .long local_label(misc_set_invalid) /* 70 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 71 cons  */
+dnl          .long _SPgvset /* 72 instance  */
+dnl          .long local_label(misc_set_invalid) /* 73 imm  */
+dnl          .long local_label(misc_set_invalid) /* 74 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 75 nil  */
+dnl          .long local_label(misc_set_invalid) /* 76 misc  */
+dnl          .long local_label(misc_set_invalid) /* 77 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 78 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 79 cons  */
+dnl          .long _SPgvset /* 7a struct  */
+dnl          .long local_label(misc_set_invalid) /* 7b imm  */
+dnl          .long local_label(misc_set_invalid) /* 7c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 7d nil  */
+dnl          .long local_label(misc_set_invalid) /* 7e misc  */
+dnl          .long local_label(misc_set_invalid) /* 7f immheader  */
+dnl         /* 80-8f  */
+dnl          .long local_label(misc_set_invalid) /* 80 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 81 cons  */
+dnl          .long _SPgvset /* 82 istruct  */
+dnl          .long local_label(misc_set_invalid) /* 83 imm  */
+dnl          .long local_label(misc_set_invalid) /* 84 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 85 nil  */
+dnl          .long local_label(misc_set_invalid) /* 86 misc  */
+dnl          .long local_label(misc_set_invalid) /* 87 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 88 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 89 cons  */
+dnl          .long _SPgvset /* 8a value_cell  */
+dnl          .long local_label(misc_set_invalid) /* 8b imm  */
+dnl          .long local_label(misc_set_invalid) /* 8c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 8d nil  */
+dnl          .long local_label(misc_set_invalid) /* 8e misc  */
+dnl          .long local_label(misc_set_invalid) /* 8f immheader  */
+dnl         /* 90-9f  */
+dnl          .long local_label(misc_set_invalid) /* 90 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 91 cons  */
+dnl          .long _SPgvset /* 92 xfunction  */
+dnl          .long local_label(misc_set_invalid) /* 93 imm  */
+dnl          .long local_label(misc_set_invalid) /* 94 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 95 nil  */
+dnl          .long local_label(misc_set_invalid) /* 96 misc  */
+dnl          .long local_label(misc_set_invalid) /* 97 immheader  */
+dnl          .long local_label(misc_set_invalid) /* 98 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 99 cons  */
+dnl          .long _SPgvset /* 9a arrayH  */
+dnl          .long local_label(misc_set_invalid) /* 9b imm  */
+dnl          .long local_label(misc_set_invalid) /* 9c odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* 9d nil  */
+dnl          .long local_label(misc_set_invalid) /* 9e misc  */
+dnl          .long local_label(misc_set_invalid) /* 9f immheader  */
+dnl         /* a0-af  */
+dnl          .long local_label(misc_set_invalid) /* a0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* a1 cons  */
+dnl          .long _SPgvset /* a2 vectorH  */
+dnl          .long local_label(misc_set_invalid) /* a3 imm  */
+dnl          .long local_label(misc_set_invalid) /* a4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* a5 nil  */
+dnl          .long local_label(misc_set_invalid) /* a6 misc  */
+dnl          .long local_label(misc_set_single_float_vector) /* a7 sf vector  */
+dnl          .long local_label(misc_set_invalid) /* a8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* a9 cons  */
+dnl          .long _SPgvset /* aa vectorH  */
+dnl          .long local_label(misc_set_invalid) /* ab imm  */
+dnl          .long local_label(misc_set_invalid) /* ac odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* ad nil  */
+dnl          .long local_label(misc_set_invalid) /* ae misc  */
+dnl          .long local_label(misc_set_u32) /* af u32  */
+dnl         /* b0-bf  */
+dnl          .long local_label(misc_set_invalid) /* b0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* b1 cons  */
+dnl          .long local_label(misc_set_invalid) /* b2 node  */
+dnl          .long local_label(misc_set_invalid) /* b3 imm  */
+dnl          .long local_label(misc_set_invalid) /* b4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* b5 nil  */
+dnl          .long local_label(misc_set_invalid) /* b6 misc  */
+dnl          .long local_label(misc_set_s32) /* b7 s32  */
+dnl          .long local_label(misc_set_invalid) /* b8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* b9 cons  */
+dnl          .long local_label(misc_set_invalid) /* ba nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* bb imm  */
+dnl          .long local_label(misc_set_invalid) /* bc odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* bd nil  */
+dnl          .long local_label(misc_set_invalid) /* be misc  */
+dnl          .long local_label(misc_set_fixnum_vector) /* bf fixnum_vector  */
+dnl         /* c0-cf  */
+dnl          .long local_label(misc_set_invalid) /* c0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* c1 cons  */
+dnl          .long local_label(misc_set_invalid) /* c2 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* c3 imm  */
+dnl          .long local_label(misc_set_invalid) /* c4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* c5 nil  */
+dnl          .long local_label(misc_set_invalid) /* c6 misc  */
+dnl          .long local_label(misc_set_new_string) /* c7 new_string  */
+dnl          .long local_label(misc_set_invalid) /* c8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* c9 cons  */
+dnl          .long local_label(misc_set_invalid) /* ca nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* cb imm  */
+dnl          .long local_label(misc_set_invalid) /* cc odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* cd nil  */
+dnl          .long local_label(misc_set_invalid) /* ce misc  */
+dnl          .long local_label(misc_set_u8) /* cf u8  */
+dnl         /* d0-df  */
+dnl          .long local_label(misc_set_invalid) /* d0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* d1 cons  */
+dnl          .long local_label(misc_set_invalid) /* d2 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* d3 imm  */
+dnl          .long local_label(misc_set_invalid) /* d4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* d5 nil  */
+dnl          .long local_label(misc_set_invalid) /* d6 misc  */
+dnl          .long local_label(misc_set_s8) /* d7 s8  */
+dnl          .long local_label(misc_set_invalid) /* d8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* d9 cons  */
+dnl          .long local_label(misc_set_invalid) /* da nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* db imm  */
+dnl          .long local_label(misc_set_invalid) /* dc odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* dd nil  */
+dnl          .long local_label(misc_set_invalid) /* de misc  */
+dnl          .long local_label(misc_set_old_string) /* df (old) simple_base_string  */
+dnl         /* e0-ef  */
+dnl          .long local_label(misc_set_invalid) /* e0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* e1 cons  */
+dnl          .long local_label(misc_set_invalid) /* e2 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* e3 imm  */
+dnl          .long local_label(misc_set_invalid) /* e4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* e5 nil  */
+dnl          .long local_label(misc_set_invalid) /* e6 misc  */
+dnl          .long local_label(misc_set_u16) /* e7 u16  */
+dnl          .long local_label(misc_set_invalid) /* e8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* e9 cons  */
+dnl          .long local_label(misc_set_invalid) /* ea nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* eb imm  */
+dnl          .long local_label(misc_set_invalid) /* ec odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* ed nil  */
+dnl          .long local_label(misc_set_invalid) /* ee misc  */
+dnl          .long local_label(misc_set_s16) /* ef s16  */
+dnl         /* f0-ff  */
+dnl          .long local_label(misc_set_invalid) /* f0 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* f1 cons  */
+dnl          .long local_label(misc_set_invalid) /* f2 nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* f3 imm  */
+dnl          .long local_label(misc_set_invalid) /* f4 odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* f5 nil  */
+dnl          .long local_label(misc_set_invalid) /* f6 misc  */
+dnl          .long local_label(misc_set_double_float_vector) /* f7 df vector  */
+dnl          .long local_label(misc_set_invalid) /* f8 even_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* f9 cons  */
+dnl          .long local_label(misc_set_invalid) /* fa nodeheader  */
+dnl          .long local_label(misc_set_invalid) /* fb imm  */
+dnl          .long local_label(misc_set_invalid) /* fc odd_fixnum  */
+dnl          .long local_label(misc_set_invalid) /* fd nil  */
+dnl          .long local_label(misc_set_invalid) /* fe misc  */
+dnl          .long local_label(misc_set_bit_vector) /* ff bit_vector  */
+dnl 
+dnl local_label(misc_set_u32):        
+dnl 	/* Either a non-negative fixnum, a positiveone-digit bignum, */
+dnl 	/* or a two-digit bignum whose sign-digit is 0 is ok.  */
+dnl 	 __(extract_lisptag(imm2,arg_z))
+dnl 	 __(srawi. imm1,arg_z,fixnum_shift)
+dnl          __(cmpwi cr5,imm2,tag_fixnum)         
+dnl          __(la imm0,misc_data_offset(arg_y))
+dnl          __(cmpwi cr7,imm2,tag_misc)
+dnl 	 __(bne cr5,local_label(set_not_fixnum_u32))
+dnl 	 __(blt- cr0,local_label(set_bad))
+dnl local_label(set_set32):         
+dnl 	 __(stwx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(set_not_fixnum_u32):
+dnl 	 __(bne cr7,local_label(set_bad))
+dnl 	 __(extract_header(imm2,arg_z))
+dnl 	 __(cmpri(cr0,imm2,one_digit_bignum_header))
+dnl 	 __(cmpri(cr1,imm2,two_digit_bignum_header))
+dnl 	 __(vrefr(imm1,arg_z,0))
+dnl 	 __(cmpri(cr2,imm1,0))
+dnl 	 __(bne cr0,local_label(set_not_1_digit_u32))
+dnl 	 __(bge cr2,local_label(set_set32))
+dnl 	 __(b local_label(set_bad))
+dnl local_label(set_not_1_digit_u32):
+dnl 	 __(bne- cr1,local_label(set_bad))
+dnl 	 __(vrefr(imm2,arg_z,1))
+dnl 	 __(cmpri(cr0,imm2,0))
+dnl 	 __(bne- cr1,local_label(set_bad))
+dnl 	 __(beq cr0,local_label(set_set32))
+dnl local_label(set_bad):
+dnl 	/* arg_z does not match the array-element-type of arg_x.  */
+dnl 	 __(mov arg_y,arg_z)
+dnl 	 __(mov arg_z,arg_x)
+dnl 	 __(mov arg_x,#XNOTELT)
+dnl 	 __(set_nargs(3))
+dnl 	 __(b _SPksignalerr)
+dnl local_label(misc_set_fixnum_vector):   
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(la imm0,misc_data_offset(arg_y))
+dnl          __(cmpwi cr5,imm2,tag_fixnum)
+dnl          __(unbox_fixnum(imm1,arg_z))
+dnl          __(bne cr5,local_label(set_bad))
+dnl          __(stwx imm1,arg_x,imm0)
+dnl          __(bx lr)
+dnl local_label(misc_set_new_string):   
+dnl          __(clrlwi imm2,arg_z,ncharcodebits)
+dnl          __(la imm0,misc_data_offset(arg_y))
+dnl          __(cmpwi cr5,imm2,subtag_character)
+dnl          __(srwi imm1,arg_z,charcode_shift)
+dnl          __(bne cr5,local_label(set_bad))
+dnl          __(stwx imm1,arg_x,imm0)
+dnl          __(bx lr)
+dnl local_label(misc_set_s32):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(cmpwi cr5,imm2,tag_fixnum)
+dnl          __(cmpwi cr7,imm2,tag_misc)
+dnl          __(la imm0,misc_data_offset(arg_y))
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl 	 __(beq cr5,local_label(set_set32))
+dnl 	 __(bne cr7,local_label(set_bad))
+dnl 	 __(extract_header(imm2,arg_z))
+dnl 	 __(cmpri(cr0,imm2,one_digit_bignum_header))
+dnl 	 __(vrefr(imm1,arg_z,0))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(str imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_single_float_vector):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(cmpwi cr7,imm2,tag_misc)
+dnl          __(la imm0,misc_data_offset(arg_y))
+dnl 	 __(bne- cr7,local_label(set_bad))
+dnl 	 __(extract_header(imm2,arg_z))
+dnl 	 __(cmpri(cr0,imm2,single_float_header))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(ldr imm1,[arg_z,#single_float.value])
+dnl 	 __(str imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_u8):               
+dnl 	 __(extract_lisptag(imm2,arg_z))
+dnl 	 __(srwi imm0,arg_y,2)
+dnl 	 __(la imm0,misc_data_offset(imm0))
+dnl 	 __(extract_unsigned_byte_bits_(imm1,arg_z,8))
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(stbx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_old_string):
+dnl 	 __(srwi imm0,arg_y,2)
+dnl 	 __(extract_lowbyte(imm2,arg_z))
+dnl 	 __(cmpri(cr2,imm2,subtag_character))
+dnl 	 __(la imm0,misc_data_offset(imm0))
+dnl 	 __(srwi imm1,arg_z,charcode_shift)
+dnl 	 __(bne- cr2,local_label(set_bad))
+dnl 	 __(stbx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_s8):
+dnl 	 __(extract_lisptag(imm2,arg_z))
+dnl          __(srwi imm0,arg_y,2)
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl          __(la imm0,misc_data_offset(imm0))
+dnl          __(cmpwi cr5,imm2,tag_fixnum)
+dnl 	 __(extsb imm2,imm1)
+dnl 	 __(cmpw cr0,imm2,imm1)
+dnl 	 __(bne- cr5,local_label(set_bad))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(stbx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_u16):         
+dnl 	 __(srwi imm0,arg_y,1)
+dnl 	 __(extract_unsigned_byte_bits_(imm1,arg_z,16))
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl 	 __(la imm0,misc_data_offset(imm0))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(sthx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_s16):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl          __(srwi imm0,arg_y,1)
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl          __(cmpwi cr5,imm2,tag_fixnum)
+dnl          __(la imm0,misc_data_offset(imm0))
+dnl 	 __(extsh imm2,imm1)
+dnl 	 __(cmpw cr0,imm2,imm1)
+dnl 	 __(bne- cr5,local_label(set_bad))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(sthx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_bit_vector):	
+dnl 	 __(cmplwi cr2,arg_z,fixnumone)   /* nothing not a (boxed) bit   */
+dnl 	 __(extrwi imm1,arg_y,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
+dnl 	 __(extlwi imm2,arg_z,1,31-fixnumshift)
+dnl 	 __(srw imm2,imm2,imm1)
+dnl 	 __(lis imm3,0x8000)
+dnl 	 __(rlwinm imm0,arg_y,32-5,5,31-fixnumshift)
+dnl 	 __(la imm0,misc_data_offset(imm0))
+dnl 	 __(srw imm3,imm3,imm1)
+dnl 	 __(bgt- cr2,local_label(set_bad))
+dnl 	 __(lwzx imm1,arg_x,imm0)
+dnl 	 __(andc imm1,imm1,imm3)
+dnl 	 __(or imm1,imm1,imm2)
+dnl 	 __(stwx imm1,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl 
+dnl local_label(misc_set_double_float_vector):
+dnl          __(extract_lisptag(imm2,arg_z))
+dnl 	 __(slwi imm0,arg_y,1)
+dnl          __(cmpwi cr7,imm2,tag_misc)
+dnl 	 __(la imm0,misc_dfloat_offset(imm0))
+dnl          __(bne- cr7,local_label(set_bad))
+dnl 	 __(extract_header(imm2,arg_z))
+dnl 	 __(cmpri(cr0,imm2,double_float_header))
+dnl 	 __(bne- cr0,local_label(set_bad))
+dnl 	 __(lwz imm1,double_float.value(arg_z))
+dnl 	 __(lwz imm2,double_float.value+4(arg_z))
+dnl 	 __(stwx imm1,arg_x,imm0)
+dnl 	 __(la imm0,4(imm0))
+dnl 	 __(stwx imm2,arg_x,imm0)
+dnl 	 __(bx lr)
+dnl local_label(misc_set_invalid):  
+dnl          __(mov temp0,#XSETBADVEC)        
+dnl          __(set_nargs(4))
+dnl          __(vpush1(temp0))
+dnl          __(b _SPksignalerr)                
+dnl         __endif
+dnl 
+dnl /* misc_set (vector index newval).  Pretty damned similar to  */
+dnl /* misc_ref, as one might imagine.  */
+dnl 
+dnl _spentry(misc_set)
+dnl 	__(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
+dnl 	__(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl 	__(vector_length(imm0,arg_x,imm1))
+dnl 	__(trlge(arg_y,imm0))
+dnl 	__(extract_lowbyte(imm1,imm1))
+dnl         __(b local_label(misc_set_common))
+dnl         
+dnl /* "spread" the lexpr in arg_z.  */
+dnl /* ppc2-invoke-fn assumes that temp1 is preserved here.  */
+dnl _spentry(spread_lexprz)
+dnl 	__(ldr imm0,[arg_z,#0])
+dnl 	__(cmpri(cr3,imm0,3<<fixnumshift))
+dnl 	__(cmpri(cr4,imm0,2<<fixnumshift))
+dnl 	__(add imm1,arg_z,imm0)
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(add nargs,nargs,imm0)
+dnl 	__(cmpri(cr1,nargs,0))
+dnl 	__(cmpri(cr2,nargs,2<<fixnumshift))
+dnl 	__(la imm1,node_size(imm1))
+dnl 	__(bge cr3,9f)
+dnl 	__(beq cr4,2f)
+dnl 	__(bne cr0,1f)
+dnl 	/* lexpr count was 0; vpop the arg regs that  */
+dnl 	/* were vpushed by the caller  */
+dnl 	__(beqlr cr1)
+dnl 	__(vpop(arg_z))
+dnl 	__(bltlr cr2)
+dnl 	__(vpop(arg_y))
+dnl 	__(beqlr cr2)
+dnl 	__(vpop(arg_x))
+dnl 	__(bx lr)
+dnl 
+dnl 	/* vpush args from the lexpr until we have only  */
+dnl 	/* three left, then assign them to arg_x, arg_y,  */
+dnl 	/* and arg_z.  */
+dnl 8:
+dnl 	__(cmpri(cr3,imm0,4<<fixnumshift))
+dnl 	__(subi imm0,imm0,fixnumone)
+dnl 	__(ldru(arg_z,-node_size(imm1)))
+dnl 	__(vpush1(arg_z))
+dnl 9:
+dnl 	__(bne cr3,8b)
+dnl 	__(ldr arg_x,[imm1,#-node_size*1])
+dnl 	__(ldr arg_y,[imm1,#-node_size*2])
+dnl 	__(ldr arg_z,[imm1,#-node_size*3])
+dnl 	__(bx lr)
+dnl 
+dnl 	/* lexpr count is two: set arg_y, arg_z from the  */
+dnl 	/* lexpr, maybe vpop arg_x  */
+dnl 2:	
+dnl 	__(ldr arg_y,[imm1,#-node_size*1])
+dnl 	__(ldr arg_z,[imm1,#-node_size*2])
+dnl 	__(beqlr cr2)		/* return if (new) nargs = 2  */
+dnl 	__(vpop(arg_x))
+dnl 	__(bx lr)
+dnl 
+dnl 	/* lexpr count is one: set arg_z from the lexpr,  */
+dnl 	/* maybe vpop arg_y, arg_x  */
+dnl 1:	
+dnl 	__(ldr arg_z,[imm1,#-node_size])
+dnl 	__(bltlr cr2)		/* return if (new) nargs < 2  */
+dnl 	__(vpop(arg_y))
+dnl 	__(beqlr cr2)		/* return if (new) nargs = 2  */
+dnl 	__(vpop(arg_x))
+dnl 	__(bx lr)
+dnl         
+dnl 		
+dnl _spentry(reset)
+dnl 	.globl _SPthrow
+dnl 	__(nop)
+dnl 	__(ref_nrs_value(temp0,toplcatch))
+dnl 	__(mov temp1,#XSTKOVER)
+dnl 	__(vpush1(temp0))
+dnl 	__(vpush1(temp1))
+dnl 	__(set_nargs(1))
+dnl 	__(b _SPthrow)
+dnl 
+dnl 	
+dnl /* "slide" nargs worth of values up the vstack.  IMM0 contains  */
+dnl /* the difference between the current VSP and the target.  */
+dnl _spentry(mvslide)
+dnl 	__(cmpri(cr0,nargs,0))
+dnl 	__(mov imm3,nargs)
+dnl 	__(add imm2,vsp,nargs)
+dnl 	__(add imm2,imm2,imm0)
+dnl 	__(add imm0,vsp,nargs)
+dnl 	__(beq 2f)
+dnl 1:
+dnl 	__(cmpri(cr0,imm3,1<<fixnumshift))
+dnl 	__(subi imm3,imm3,1<<fixnumshift)
+dnl 	__(ldru(temp0,-node_size(imm0)))
+dnl 	__(stru(temp0,-node_size(imm2)))
+dnl 	__(bne cr0,1b)
+dnl 2:
+dnl 	__(mov vsp,imm2)
+dnl 	__(bx lr)
+dnl 
+dnl /* Build a new TSP area to hold nargs worth of multiple-values.  */
+dnl /* Pop the multiple values off of the vstack.  */
+dnl /* The new TSP frame will look like this:  */
+dnl /*  */
+dnl /*+--------+-------+-------+---------+--------+--------+--------+======+----------+ */
+dnl /*| ptr to | zero  | nargs | ptr to  | valn-1 | valn-2 | val-0  | ???? | prev TSP |  */
+dnl /*|  prev  |       |       |  prev   |        |        |        | fill |          |  */
+dnl /*| TSP    |       |       | segment |        |        |        |      |          | */
+dnl /*+--------+-------+-------+---------+--------+--------+--------+------+----------+  */
+dnl /*  */
+dnl /* e.g., the first multiple value goes in the last cell in the frame, the  */
+dnl /* count of values goes in the first word, and the word after the value count  */
+dnl /* is 0 if the number of values is even (for alignment).  */
+dnl /* Subsequent calls to .SPadd_values preserve this alignment.  */
+dnl /* .SPrecover_values is therefore pretty simple.  */
+dnl 
+dnl _spentry(save_values)
+dnl 	__(mov imm1,tsp)
+dnl 
+dnl         /* common exit: nargs = values in this set, imm1 = ptr to tsp before  */
+dnl         /* call to save_values  */
+dnl local_label(save_values_to_tsp):
+dnl 	__(mov imm2,tsp)
+dnl 	__(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* count, link  */
+dnl 	__(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
+dnl 	__(str(imm1,tsp_frame.backlink(tsp))) /* keep one tsp "frame" as far as rest of lisp is concerned  */
+dnl 	__(str(nargs,tsp_frame.data_offset(tsp)))
+dnl 	__(str(imm2,tsp_frame.data_offset+node_size(tsp))) /* previous tsp  */
+dnl 	__(la imm3,tsp_frame.data_offset+node_size*2(tsp))
+dnl 	__(add imm3,imm3,nargs)
+dnl 	__(add imm0,vsp,nargs)
+dnl 	__(cmpr(cr0,imm0,vsp))
+dnl 	__(b 2f)
+dnl 1:
+dnl 	__(ldru(arg_z,-node_size(imm0)))
+dnl 	__(cmpr(cr0,imm0,vsp))
+dnl 	__(stru(arg_z,-node_size(imm3)))
+dnl 2:
+dnl 	__(bne cr0,1b)
+dnl 	__(add vsp,vsp,nargs) /*  discard values  */
+dnl 	__(bx lr)
+dnl 	
+dnl 
+dnl /* Add the multiple values that are on top of the vstack to the set  */
+dnl /* saved in the top tsp frame, popping them off of the vstack in the  */
+dnl /* process.  It is an error (a bad one) if the TSP contains something  */
+dnl /* other than a previously saved set of multiple-values.  */
+dnl /* Since adding to the TSP may cause a new TSP segment to be allocated,  */
+dnl /* each add_values call adds another linked element to the list of  */
+dnl /* values. This makes recover_values harder.  */
+dnl 
+dnl _spentry(add_values)
+dnl 	__(cmpri(cr0,nargs,0))
+dnl 	__(ldr imm1,[tsp,#0])
+dnl 	__(bne cr0,local_label(save_values_to_tsp))
+dnl 	__(bx lr)
+dnl         
+dnl /* On entry, R11->callback-index  */
+dnl /* Restore lisp context, then funcall #'%pascal-functions% with  */
+dnl /* two args: callback-index, args-ptr (a macptr pointing to the args on the stack)  */
+dnl _spentry(poweropen_callback)
+dnl         __ifdef(`rTOC')
+dnl          __(mov r11,rTOC)
+dnl         __endif
+dnl 	/* Save C argument registers  */
+dnl 	__(str(r3,c_frame.param0(sp)))
+dnl 	__(str(r4,c_frame.param1(sp)))
+dnl 	__(str(r5,c_frame.param2(sp)))
+dnl 	__(str(r6,c_frame.param3(sp)))
+dnl 	__(str(r7,c_frame.param4(sp)))
+dnl 	__(str(r8,c_frame.param5(sp)))
+dnl 	__(str(r9,c_frame.param6(sp)))
+dnl 	__(str(r10,c_frame.param7(sp)))
+dnl 	__(mflr imm3)
+dnl 	__(str(imm3,c_frame.savelr(sp)))
+dnl 	__(mfcr imm0)
+dnl 	__(str(imm0,c_frame.crsave(sp)))
+dnl 
+dnl 	/* Save the non-volatile registers on the sp stack  */
+dnl 	/* This is a non-standard stack frame, but noone will ever see it,  */
+dnl         /* so it doesn't matter. It will look like more of the stack frame pushed below.  */
+dnl 	__(stru(sp,-(stack_align(c_reg_save.size))(sp)))
+dnl         __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp)))
+dnl         __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
+dnl         __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
+dnl         __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
+dnl         __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
+dnl         __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
+dnl         __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
+dnl         __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
+dnl         __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
+dnl         __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
+dnl         __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
+dnl         __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
+dnl         __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
+dnl         __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
+dnl         __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
+dnl         __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
+dnl         __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
+dnl         __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
+dnl         __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
+dnl         __(stfd f1,c_reg_save.save_fprs+(0*8)(sp))
+dnl         __(stfd f2,c_reg_save.save_fprs+(1*8)(sp))
+dnl         __(stfd f3,c_reg_save.save_fprs+(2*8)(sp))
+dnl         __(stfd f4,c_reg_save.save_fprs+(3*8)(sp))
+dnl         __(stfd f5,c_reg_save.save_fprs+(4*8)(sp))
+dnl         __(stfd f6,c_reg_save.save_fprs+(5*8)(sp))
+dnl         __(stfd f7,c_reg_save.save_fprs+(6*8)(sp))
+dnl         __(stfd f8,c_reg_save.save_fprs+(7*8)(sp))
+dnl         __(stfd f9,c_reg_save.save_fprs+(8*8)(sp))
+dnl         __(stfd f10,c_reg_save.save_fprs+(9*8)(sp))
+dnl         __(stfd f11,c_reg_save.save_fprs+(10*8)(sp))
+dnl         __(stfd f12,c_reg_save.save_fprs+(11*8)(sp))
+dnl         __(stfd f13,c_reg_save.save_fprs+(12*8)(sp))
+dnl 	__(check_stack_alignment(r0))
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,c_reg_save.save_fp_zero(sp))
+dnl 	__(lwz r31,c_reg_save.save_fp_zero+4(sp))	/* recover FPSCR image  */
+dnl 	__(stw r31,c_reg_save.save_fpscr(sp))
+dnl 	__(mov r30,#0x43300000)
+dnl 	__(mov r31,#0x80000000)
+dnl 	__(stw r30,c_reg_save.save_fp_zero(sp))
+dnl 	__(stw r31,c_reg_save.save_fp_zero+4(sp))
+dnl 	__(stfd fp_s32conv,c_reg_save.save_fps32conv(sp))
+dnl 	__(lfd fp_s32conv,c_reg_save.save_fp_zero(sp))
+dnl 	__(stfd fp_zero,c_reg_save.save_fp_zero(sp))
+dnl 	__(lfs fp_zero,lisp_globals.short_float_zero(0))	/* ensure that fp_zero contains 0.0  */
+dnl 
+dnl /* Restore rest of Lisp context.  */
+dnl /* Could spread out the memory references here to gain a little speed  */
+dnl 
+dnl 	__(mov loc_pc,#0)
+dnl 	__(mov fn,#0)                     /* subprim, not a lisp function  */
+dnl 	__(mov temp3,#0)
+dnl 	__(mov temp2,#0)
+dnl 	__(mov temp1,#0)
+dnl 	__(mov temp0,#0)
+dnl 	__(mov arg_x,#0)
+dnl 	__(box_fixnum(arg_y,r11))	/* callback-index  */
+dnl         __(la arg_z,c_reg_save.save_fprs(sp))
+dnl         __(str(arg_z,stack_align(c_reg_save.size)+c_frame.unused(sp)))
+dnl 	__(la arg_z,stack_align(c_reg_save.size)+c_frame.param0(sp))	/* parameters (tagged as a fixnum)  */
+dnl 
+dnl 	/* Recover lisp thread context. Have to call C code to do so.  */
+dnl 	__(ref_global(r12,get_tcr))
+dnl         __ifdef(`rTOC')
+dnl          __(ld rTOC,8(r12))
+dnl          __(ld r12,0(r12))
+dnl         __endif
+dnl 	__(mtctr r12)
+dnl         __(mov r3,#1)
+dnl 	__(stru(sp,-(stack_align(c_frame.minsiz))(sp)))
+dnl 	__(bctrl)
+dnl 	__(la rcontext,TCR_BIAS(r3))
+dnl 	__(la sp,(stack_align(c_frame.minsiz))(sp))
+dnl 
+dnl 	__(ldr vsp,[rcontext,#tcr.save_vsp])
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])		
+dnl 	__(mov rzero,#0)
+dnl 	__(mov imm0,#TCR_STATE_LISP)
+dnl 	__(mtxer rzero) /* lisp wants the overflow bit being clear  */
+dnl         __(mtctr rzero)
+dnl 	__(mov save0,#0)
+dnl 	__(mov save1,#0)
+dnl 	__(mov save2,#0)
+dnl 	__(mov save3,#0)
+dnl 	__(mov save4,#0)
+dnl 	__(mov save5,#0)
+dnl 	__(mov save6,#0)
+dnl 	__(mov save7,#0)
+dnl 	__(lfd f0,tcr.lisp_fpscr(rcontext))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(mov allocbase,#0)
+dnl 	__(mov allocptr,#0)	
+dnl 	__(str(imm0,tcr.valence(rcontext)))
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	
+dnl         __(restore_saveregs(vsp))
+dnl 
+dnl 	/* load nargs and callback to the lisp  */
+dnl 	__(set_nargs(2))
+dnl 	__(ldr imm2,[rcontext,#tcr.cs_area])
+dnl 	__(ldr imm4,[imm2,#area.active])
+dnl 	__(stru(imm4,-lisp_frame.size(sp)))
+dnl 	__(str(imm3,lisp_frame.savelr(sp)))
+dnl 	__(mov fname,#nrs.callbacks)	/* %pascal-functions%  */
+dnl 	__(call_fname)
+dnl 	__(ldr imm2,[sp,#lisp_frame.backlink])
+dnl 	__(ldr imm3,[rcontext,#tcr.cs_area])
+dnl 	__(str(imm2,area.active(imm3)))
+dnl 	__(discard_lisp_frame())
+dnl 	/* save_vsp will be restored from ff_call's stack frame, but  */
+dnl 	/* I included it here for consistency.  */
+dnl 	/* save_tsp is set below after we exit Lisp context.  */
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	/* Exit lisp context  */
+dnl 	__(mov imm1,#TCR_STATE_FOREIGN)
+dnl 	__(str(imm1,tcr.valence(rcontext)))
+dnl 	/* Restore the non-volatile registers & fpscr  */
+dnl 	__(lfd fp_zero,c_reg_save.save_fp_zero(sp))
+dnl 	__(lwz r31,c_reg_save.save_fpscr(sp))
+dnl 	__(stw r31,c_reg_save.save_fp_zero+4(sp))
+dnl 	__(lfd f0,c_reg_save.save_fp_zero(sp))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(ldr r13,c_reg_save.save_gprs+(0*node_size)(sp)))
+dnl 	__(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
+dnl 	__(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
+dnl 	__(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
+dnl 	__(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
+dnl 	__(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
+dnl 	__(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
+dnl 	__(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
+dnl 	__(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
+dnl 	__(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
+dnl 	__(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
+dnl 	__(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
+dnl 	__(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
+dnl 	__(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
+dnl 	__(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
+dnl 	__(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
+dnl 	__(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
+dnl 	__(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
+dnl 	__(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
+dnl         __(lfd f1,c_reg_save.save_fprs+(0*8)(sp))
+dnl         __(lfd f2,c_reg_save.save_fprs+(1*8)(sp))
+dnl         __(lfd f3,c_reg_save.save_fprs+(2*8)(sp))
+dnl         __(lfd f4,c_reg_save.save_fprs+(3*8)(sp))
+dnl         __(lfd f5,c_reg_save.save_fprs+(4*8)(sp))
+dnl         __(lfd f6,c_reg_save.save_fprs+(5*8)(sp))
+dnl         __(lfd f7,c_reg_save.save_fprs+(6*8)(sp))
+dnl         __(lfd f8,c_reg_save.save_fprs+(7*8)(sp))
+dnl         __(lfd f9,c_reg_save.save_fprs+(8*8)(sp))
+dnl         __(lfd f10,c_reg_save.save_fprs+(9*8)(sp))
+dnl         __(lfd f11,c_reg_save.save_fprs+(10*8)(sp))
+dnl         __(lfd f12,c_reg_save.save_fprs+(11*8)(sp))
+dnl         __(lfd f13,c_reg_save.save_fprs+(12*8)(sp))
+dnl 	__(lfd fp_s32conv,c_reg_save.save_fps32conv(sp))
+dnl 	__(ldr(sp,0(sp)))
+dnl 	__(ldr r3,[sp,#c_frame.param0])
+dnl 	__(ldr r4,[sp,#c_frame.param1])
+dnl 	__(ldr r5,[sp,#c_frame.param2])
+dnl 	__(ldr r6,[sp,#c_frame.param3])
+dnl 	__(ldr r7,[sp,#c_frame.param4])
+dnl 	__(ldr r8,[sp,#c_frame.param5])
+dnl 	__(ldr r9,[sp,#c_frame.param6])
+dnl 	__(ldr r10,[sp,#c_frame.param7])
+dnl 	__(ldr r11,[sp,#c_frame.savelr])
+dnl 	__(mtlr r11)
+dnl 	__(ldr r11,[sp,#c_frame.crsave])
+dnl 	__(mtcr r11)
+dnl 	__(bx lr)
+dnl         
+dnl /* Like misc_alloc (a LOT like it, since it does most of the work), but takes  */
+dnl /* an initial-value arg in arg_z, element_count in arg_x, subtag in arg_y.  */
+dnl /* Calls out to %init-misc, which does the rest of the work.  */
+dnl 
+dnl _spentry(misc_alloc_init)
+dnl 	__(mflr loc_pc)
+dnl 	__(build_lisp_frame(fn,loc_pc,vsp))
+dnl 	__(mov fn,#0)
+dnl 	__(mov temp0,arg_z)		/* initval  */
+dnl 	__(mov arg_z,arg_y)		/* subtag  */
+dnl 	__(mov arg_y,arg_x)		/* element-count  */
+dnl 	__(bl _SPmisc_alloc)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp]) 
+dnl 	__(discard_lisp_frame())
+dnl 	__(mov fname,#nrs.init_misc)
+dnl 	__(set_nargs(2))
+dnl 	__(mov arg_y,temp0)
+dnl 	__(jump_fname())
+dnl 
+dnl /* As in stack_misc_alloc above, only with a non-default initial-value.  */
+dnl 
+dnl _spentry(stack_misc_alloc_init)
+dnl 	__(mflr loc_pc)
+dnl 	__(build_lisp_frame(fn,loc_pc,vsp))
+dnl 	__(mov fn,#0)
+dnl 	__(mov temp0,arg_z) /* initval  */
+dnl 	__(mov arg_z,arg_y) /* subtag  */
+dnl 	__(mov arg_y,arg_x) /* element-count  */
+dnl 	__(bl _SPstack_misc_alloc)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(discard_lisp_frame())
+dnl 	__(mov fname,#nrs.init_misc)
+dnl 	__(set_nargs(2))
+dnl 	__(mov arg_y,temp0)
+dnl 	__(jump_fname())
+dnl 
+dnl 	
+dnl _spentry(callbuiltin)
+dnl 	__(ref_nrs_value(fname,builtin_functions))
+dnl 	__(la imm0,misc_data_offset(imm0))
+dnl 	__(ldrx(fname,fname,imm0))
+dnl 	__(jump_fname())
+dnl 
+dnl /* the value of the nilreg-relative symbol %builtin-functions% should be  */
+dnl /* a vector of symbols.  Call the symbol indexed by imm0 (boxed) and  */
+dnl /* return a single value.  */
+dnl 
+dnl _spentry(callbuiltin0)
+dnl 	__(set_nargs(0))
+dnl 	__(ref_nrs_value(fname,builtin_functions))
+dnl 	__(la imm0,misc_data_offset(imm0))
+dnl 	__(ldrx(fname,fname,imm0))
+dnl 	__(jump_fname())
+dnl 
+dnl _spentry(callbuiltin1)
+dnl 	__(ref_nrs_value(fname,builtin_functions))
+dnl 	__(set_nargs(1))
+dnl 	__(la imm0,misc_data_offset(imm0))
+dnl 	__(ldrx(fname,fname,imm0))
+dnl 	__(jump_fname())
+dnl 
+dnl _spentry(callbuiltin2)
+dnl 	__(set_nargs(2))
+dnl 	__(ref_nrs_value(fname,builtin_functions))
+dnl 	__(la imm0,misc_data_offset(imm0))
+dnl 	__(ldrx(fname,fname,imm0))
+dnl 	__(jump_fname())
+dnl 
+dnl 
+dnl _spentry(callbuiltin3)
+dnl 	__(set_nargs(3))
+dnl 	__(ref_nrs_value(fname,builtin_functions))
+dnl 	__(la imm0,misc_data_offset(imm0))
+dnl 	__(ldrx(fname,fname,imm0))
+dnl 	__(jump_fname())
+dnl 	
+dnl 
+dnl _spentry(popj)
+dnl 	.globl C(popj)
+dnl C(popj):
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(discard_lisp_frame())
+dnl 	__(bx lr)
+dnl 
+dnl _spentry(restorefullcontext)
+dnl 	__(mflr loc_pc)
+dnl 	__(mtctr loc_pc)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(discard_lisp_frame())
+dnl 	__(bctr)
+dnl 
+dnl _spentry(savecontextvsp)
+dnl 	__(ldr imm0,[rcontext,#tcr.cs_limit])
+dnl 	__(build_lisp_frame(fn,loc_pc,vsp))
+dnl 	__(mov fn,nfn)
+dnl 	__(trllt(sp,imm0))
+dnl 	__(bx lr)
+dnl 
+dnl _spentry(savecontext0)
+dnl 	__(add imm0,vsp,imm0)
+dnl 	__(build_lisp_frame(fn,loc_pc,imm0))
+dnl 	__(ldr imm0,[rcontext,#tcr.cs_limit])
+dnl 	__(mov fn,nfn)
+dnl 	__(trllt(sp,imm0))
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl /* Like .SPrestorefullcontext, only the saved return address  */
+dnl /* winds up in loc-pc instead of getting thrashed around ...  */
+dnl _spentry(restorecontext)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(discard_lisp_frame())
+dnl 	__(bx lr)
+dnl 
+dnl         
+dnl /* Nargs is valid; all arg regs, lexpr-count pushed by caller.  */
+dnl /* imm0 = vsp to restore.  */
+dnl /* Return all values returned by caller to its caller, hiding  */
+dnl /* the variable-length arglist.  */
+dnl /* If we can detect that the caller's caller didn't expect  */
+dnl /* multiple values, then things are even simpler.  */
+dnl _spentry(lexpr_entry)
+dnl 	__(ref_global(imm1,ret1val_addr))
+dnl 	__(cmpr(cr0,imm1,loc_pc))
+dnl 	__(build_lisp_frame(fn,loc_pc,imm0))
+dnl 	__(bne cr0,1f)
+dnl 	__(ref_global(imm0,lexpr_return))
+dnl 	__(build_lisp_frame(rzero,imm0,vsp))
+dnl 	__(mov loc_pc,imm1)
+dnl 	__(ldr imm0,[rcontext,#tcr.cs_limit])
+dnl 	__(trllt(sp,imm0))
+dnl 	__(mov fn,#0)
+dnl 	__(bx lr)
+dnl 
+dnl         /* The single-value case just needs to return to something that'll pop  */
+dnl         /* the variable-length frame off of the vstack.  */
+dnl 1:
+dnl 	__(ref_global(loc_pc,lexpr_return1v))
+dnl 	__(ldr imm0,[rcontext,#tcr.cs_limit])
+dnl 	__(trllt(sp,imm0))
+dnl 	__(mov fn,#0)
+dnl 	__(bx lr)
+dnl 
+dnl /* */
+dnl /* Do a system call in Darwin.  The stack is set up much as it would be */
+dnl /* for a PowerOpen ABI ff-call:	register parameters are in the stack */
+dnl /* frame, and there are 4 extra words at the bottom of the frame that */
+dnl /* we can carve a lisp frame out of. */
+dnl /*  */
+dnl /* System call return conventions are a little funky in Darwin: if "@sc" */
+dnl /* is the address of the "sc" instruction, errors return to @sc+4 and */
+dnl /* non-error cases return to @sc+8.  Error values are returned as */
+dnl /* positive values in r3; this is true even if the system call returns */
+dnl /* a doubleword (64-bit) result.  Since r3 would ordinarily contain */
+dnl /* the high half of a doubleword result, this has to be special-cased. */
+dnl /*  */
+dnl /* The caller should set the c_frame.crsave field of the stack frame */
+dnl /* to 0 if the result is to be interpreted as anything but a doubleword */
+dnl /* and to non-zero otherwise.  (This only matters on an error return.) */
+dnl 
+dnl         
+dnl _spentry(poweropen_syscall)
+dnl 	__(mflr loc_pc)
+dnl 	__(vpush_saveregs())
+dnl 	__(ldr imm1,[sp,#0])
+dnl 	__(la imm2,-lisp_frame.size(imm1))
+dnl         __(zero_doublewords imm2,0,lisp_frame.size)
+dnl 	__(str(imm1,lisp_frame.backlink(imm2)))
+dnl 	__(str(imm2,c_frame.backlink(sp)))
+dnl 	__(str(fn,lisp_frame.savefn(imm2)))
+dnl 	__(str(loc_pc,lisp_frame.savelr(imm2)))
+dnl 	__(str(vsp,lisp_frame.savevsp(imm2)))
+dnl 	__(ldr imm3,[rcontext,#tcr.cs_area])
+dnl 	__(str(imm2,area.active(imm3)))
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(rzero,tcr.ffi_exception(rcontext)))
+dnl 	__(mov save0,rcontext)
+dnl 	__(mov r3,#TCR_STATE_FOREIGN)
+dnl 	__(str(r3,tcr.valence(rcontext)))
+dnl 	__(mov rcontext,#0)
+dnl 	__(ldr r3,[sp,#c_frame.param0])
+dnl 	__(ldr r4,[sp,#c_frame.param1])
+dnl 	__(ldr r5,[sp,#c_frame.param2])
+dnl 	__(ldr r6,[sp,#c_frame.param3])
+dnl 	__(ldr r7,[sp,#c_frame.param4])
+dnl 	__(ldr r8,[sp,#c_frame.param5])
+dnl 	__(ldr r9,[sp,#c_frame.param6])
+dnl 	__(ldr r10,[sp,#c_frame.param7])
+dnl 	__(unbox_fixnum(r0,arg_z))
+dnl 	__(sc)
+dnl         __ifdef(`LINUX')
+dnl          __(bns+ 9f)
+dnl         __else
+dnl 	 __(b 1f)
+dnl 	 __(b 9f)
+dnl         __endif
+dnl 1:
+dnl         __ifdef(`PPC64')
+dnl          __(neg r3,r3)
+dnl         __else
+dnl 	 __(ldr imm2,[sp,#c_frame.crsave])
+dnl 	 __(cmpri(cr0,imm2,0))
+dnl 	 __(bne cr0,2f)
+dnl 	 /* 32-bit result  */
+dnl 	 __(neg r3,r3)
+dnl 	 __(b 9f)
+dnl 2:
+dnl 	 /* 64-bit result  */
+dnl 	 __(neg r4,r3)
+dnl 	 __(mov r3,#-1)
+dnl         __endif
+dnl 9:
+dnl 	__(mov imm2,save0)	/* recover context  */
+dnl 	__(ldr sp,[sp,#c_frame.backlink])
+dnl 	__(mov imm4,#TCR_STATE_LISP)
+dnl 	__(mov rzero,#0)
+dnl 	__(mov loc_pc,#0)
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov arg_y,#nil_value)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(mov temp0,#nil_value)
+dnl 	__(mov temp1,#nil_value)
+dnl 	__(mov temp2,#nil_value)
+dnl 	__(mov temp3,#nil_value)
+dnl 	__(mov fn,#nil_value)
+dnl 	__(mov rcontext,imm2)
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])
+dnl         __(mov save0,#0)
+dnl         __(mov save1,#0)
+dnl         __(mov save2,#0)
+dnl         __(mov save3,#0)
+dnl         __(mov save4,#0)
+dnl         __(mov save5,#0)
+dnl         __(mov save6,#0)
+dnl         __(mov save7,#0)        
+dnl 	__(str(imm4,tcr.valence(rcontext)))
+dnl 	__(vpop_saveregs)
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(discard_lisp_frame)
+dnl         __(mtxer rzero)
+dnl 	__(check_pending_interrupt(`cr1'))
+dnl 	__(bx lr)
+dnl         
+dnl         
+dnl 
+dnl _spentry(builtin_div)
+dnl 	__(jump_builtin(_builtin_div,2))
+dnl 
+dnl 
+dnl 
+dnl _spentry(builtin_eql)
+dnl         __(cmpr(cr1,arg_y,arg_z))
+dnl         __(extract_fulltag(imm2,arg_y))
+dnl         __(extract_fulltag(imm3,arg_z))
+dnl         __(beq cr1,1f)
+dnl         __(cmpri(cr1,imm2,fulltag_misc))
+dnl         __(cmpri(cr0,imm3,fulltag_misc))
+dnl         __(bne cr1,2f)
+dnl         __(extract_subtag(imm0,arg_y))
+dnl         __(bne cr0,2f)
+dnl         __(extract_subtag(imm1,arg_z))
+dnl         __(cmpr(cr0,imm0,imm1))
+dnl         __(bne cr0,2f)
+dnl 	__(jump_builtin(_builtin_eql,2))
+dnl 1:	__(mov arg_z,#t_value)
+dnl 	__(bx lr)
+dnl 2:	__(mov arg_z,#nil_value)
+dnl 	__(bx lr)
+dnl         
+dnl _spentry(builtin_length)
+dnl         __(cmpri(cr1,arg_z,nil_value))
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr0,imm0,min_vector_subtag))
+dnl         __(beq cr1,1f)
+dnl         __ifdef(`PPC64')
+dnl          __(cmpdi cr2,imm0,fulltag_cons)
+dnl         __else
+dnl 	 __(cmpwi cr2,imm0,tag_list)
+dnl         __endif
+dnl 	__(beq- cr0,2f)
+dnl 	__(blt- cr0,3f)
+dnl 	/* (simple-array * (*))  */
+dnl 	__(vector_length(arg_z,arg_z,imm0))
+dnl 	__(bx lr)
+dnl 1:      __(mov arg_z,#0)
+dnl         __(bx lr)
+dnl 2:
+dnl 	__(ldr arg_z,[arg_z,#vectorH.logsize])
+dnl 	__(bx lr)        
+dnl 3:	__(bne cr2,8f)
+dnl 	__(mov temp2,#-1<<fixnum_shift)
+dnl 	__(mov temp0,arg_z)	/* fast pointer  */
+dnl 	__(mov temp1,arg_z)	/* slow pointer  */
+dnl         __ifdef(`PPC64')
+dnl 4:       __(extract_fulltag(imm0,temp0))
+dnl          __(cmpdi cr7,temp0,nil_value)
+dnl          __(cmpdi cr1,imm0,fulltag_cons)
+dnl          __(addi temp2,temp2,fixnum_one)
+dnl          __(beq cr7,9f)
+dnl          __(andi. imm0,temp2,1<<fixnum_shift)
+dnl          __(bne cr1,8f)
+dnl          __(extract_fulltag(imm1,temp1))
+dnl          __(_cdr(temp0,temp0))
+dnl          __(cmpdi cr1,imm1,fulltag_cons)
+dnl 	 __(beq cr0,4b)
+dnl 	 __(bne cr1,8f)
+dnl 	 __(_cdr(temp1,temp1))
+dnl 	 __(cmpd cr0,temp0,temp1)
+dnl 	 __(bne cr0,4b)
+dnl         __else
+dnl 4:	 __(extract_lisptag(imm0,temp0))
+dnl 	 __(cmpri(cr7,temp0,nil_value))
+dnl 	 __(cmpri(cr1,imm0,tag_list))
+dnl 	 __(addi temp2,temp2,fixnum_one)
+dnl 	 __(beq cr7,9f)
+dnl 	 __(andi. imm0,temp2,1<<fixnum_shift)
+dnl 	 __(bne cr1,8f)
+dnl 	 __(extract_lisptag(imm1,temp1))	
+dnl 	 __(_cdr(temp0,temp0))
+dnl 	 __(cmpri(cr1,imm1,tag_list))
+dnl 	 __(beq cr0,4b)
+dnl 	 __(bne cr1,8f)
+dnl 	 __(_cdr(temp1,temp1))
+dnl 	 __(cmpr(cr0,temp0,temp1))
+dnl 	 __(bne cr0,4b)
+dnl         __endif
+dnl 8:	
+dnl 	__(jump_builtin(_builtin_length,1))
+dnl 9:	
+dnl 	__(mov arg_z,temp2)
+dnl 	__(bx lr)
+dnl         
+dnl _spentry(builtin_seqtype)
+dnl         __ifdef(`PPC64')
+dnl          __(cmpdi cr2,arg_z,nil_value)
+dnl          __(extract_typecode(imm0,arg_z))
+dnl          __(beq cr2,1f)
+dnl 	 __(cmpri(cr0,imm0,fulltag_cons))
+dnl         __else
+dnl 	 __(extract_typecode(imm0,arg_z))
+dnl  	 __(cmpri(cr0,imm0,tag_list))
+dnl         __endif
+dnl 	__(cmpri(cr1,imm0,min_vector_subtag))
+dnl 	__(beq cr0,1f)
+dnl 	__(blt- cr1,2f)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(bx lr)
+dnl 1:	__(mov arg_z,#t_value)
+dnl 	__(bx lr)
+dnl 2:
+dnl 	__(jump_builtin(_builtin_seqtype,1))
+dnl         
+dnl _spentry(builtin_assq)
+dnl 	__(cmpri(arg_z,nil_value))
+dnl 	__(beqlr)
+dnl 1:	__(trap_unless_list(arg_z,imm0))
+dnl 	__(_car(arg_x,arg_z))
+dnl 	__(_cdr(arg_z,arg_z))
+dnl 	__(cmpri(cr2,arg_x,nil_value))
+dnl 	__(cmpri(cr1,arg_z,nil_value))
+dnl 	__(beq cr2,2f)
+dnl 	__(trap_unless_list(arg_x,imm0))
+dnl 	__(_car(temp0,arg_x))
+dnl 	__(cmpr(temp0,arg_y))
+dnl 	__(bne cr0,2f)
+dnl 	__(mov arg_z,arg_x)
+dnl 	__(bx lr)
+dnl 2:	__(bne cr1,1b)
+dnl 	__(bx lr)
+dnl 
+dnl _spentry(builtin_memq)
+dnl 	__(cmpri(cr1,arg_z,nil_value))
+dnl 	__(b 2f)
+dnl 1:	__(trap_unless_list(arg_z,imm0))
+dnl 	__(_car(arg_x,arg_z))
+dnl 	__(_cdr(temp0,arg_z))
+dnl 	__(cmpr(arg_x,arg_y))
+dnl 	__(cmpri(cr1,temp0,nil_value))
+dnl 	__(beqlr)
+dnl 	__(mov arg_z,temp0)
+dnl 2:	__(bne cr1,1b)
+dnl 	__(bx lr)
+dnl 
+dnl logbitp_max_bit = 30
+dnl         
+dnl _spentry(builtin_logbitp)
+dnl 	/* Call out unless both fixnums,0 <=  arg_y < logbitp_max_bit  */
+dnl         __(cmplri(cr2,arg_y,logbitp_max_bit<<fixnum_shift))
+dnl         __(extract_lisptag(imm0,arg_y))
+dnl         __(extract_lisptag(imm1,arg_z))
+dnl         __(cmpri(cr0,imm0,tag_fixnum))
+dnl         __(cmpri(cr1,imm1,tag_fixnum))
+dnl 	__(unbox_fixnum(imm0,arg_y))
+dnl 	__(subfic imm0,imm0,logbitp_max_bit)
+dnl         __ifdef(`PPC64')
+dnl          __(rldcl imm0,arg_z,imm0,63)
+dnl          __(mulli imm0,imm0,t_offset)
+dnl         __else
+dnl   	 __(rlwnm imm0,arg_z,imm0,31,31)
+dnl 	 __(rlwimi imm0,imm0,4,27,27)
+dnl         __endif
+dnl 	__(bnl cr2,1f)
+dnl 	__(bne cr0,1f)
+dnl         __(bne cr1,1f)
+dnl 	__(addi arg_z,imm0,nil_value)
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(jump_builtin(_builtin_logbitp,2))
+dnl 
+dnl _spentry(builtin_logior)
+dnl         __(orr imm0,arg_y,arg_z)
+dnl         __(test_fixnum(imm0))
+dnl         __(moveq arg_z,imm0)
+dnl         __(bxeq lr)
+dnl 1:
+dnl 	__(jump_builtin(_builtin_logior,2))
+dnl 
+dnl _spentry(builtin_logand)
+dnl         __(orr imm0,arg_y,arg_z)
+dnl         __(test_fixnum(imm0))
+dnl 	__(andeq arg_z,arg_y,arg_z)
+dnl 	__(bxeq lr)
+dnl 	__(jump_builtin(_builtin_logand,2))
+dnl 	
+dnl _spentry(builtin_ash)
+dnl         __ifdef(`PPC64')
+dnl 	 __(cmpdi cr1,arg_z,0)
+dnl          __(extract_lisptag(imm0,arg_y))
+dnl          __(extract_lisptag(imm1,arg_z))
+dnl          __(cmpdi cr0,imm0,tag_fixnum)
+dnl          __(cmpdi cr3,imm1,tag_fixnum)
+dnl 	 __(cmpdi cr2,arg_z,-(63<<3))	/* !! 3 =  fixnumshift  */
+dnl 	 __(bne- cr0,9f)
+dnl          __(bne- cr3,9f)
+dnl 	 __(bne cr1,0f)
+dnl 	 __(mov arg_z,arg_y)	/* (ash n 0) => n  */
+dnl 	 __(bx lr)
+dnl 0:		
+dnl 	 __(unbox_fixnum(imm1,arg_y))
+dnl 	 __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(bgt cr1,2f)
+dnl 	 /* (ash n -count) => fixnum  */
+dnl 	 __(neg imm2,imm0)
+dnl 	 __(bgt cr2,1f)
+dnl 	 __(mov imm2,#63)
+dnl 1:	
+dnl 	 __(srad imm0,imm1,imm2)
+dnl 	 __(box_fixnum(arg_z,imm0))
+dnl 	 __(bx lr)
+dnl 	 /* Integer-length of arg_y/imm1 to imm2  */
+dnl 2:		
+dnl 	 __(cntlzd. imm2,imm1)
+dnl 	 __(bne 3f)		/* cr0`eq' set if negative  */
+dnl 	 __(not imm2,imm1)
+dnl 	 __(cntlzd imm2,imm2)
+dnl 3:
+dnl 	 __(subfic imm2,imm2,64)
+dnl 	 __(add imm2,imm2,imm0)	 /* imm2 <- integer-length(imm1) + count  */
+dnl 	 __(cmpdi cr1,imm2,63-fixnumshift)
+dnl 	 __(cmpdi cr2,imm0,64)
+dnl 	 __(sld imm2,imm1,imm0)
+dnl 	 __(bgt cr1,6f)
+dnl 	 __(box_fixnum(arg_z,imm2))
+dnl 	 __(bx lr)	
+dnl 6:
+dnl 	 __(bgt cr2,9f)
+dnl 	 __(bne cr2,7f)
+dnl 	 /* Shift left by 64 bits exactly  */
+dnl 	 __(mov imm0,imm1)
+dnl 	 __(mov imm1,#0)
+dnl 	 __(beq _SPmakes128)
+dnl 	 __(b _SPmakeu128)
+dnl 7:
+dnl 	 /* Shift left by fewer than 64 bits, result not a fixnum  */
+dnl 	 __(subfic imm0,imm0,64)
+dnl 	 __(beq 8f)
+dnl 	 __(srd imm0,imm1,imm0)
+dnl 	 __(mov imm1,imm2)
+dnl 	 __(b _SPmakeu128)
+dnl 8:	
+dnl 	 __(srad imm0,imm1,imm0)
+dnl 	 __(mov imm1,imm2)
+dnl 	 __(b _SPmakes128)
+dnl         __else
+dnl 	 __(cmpri(cr1,arg_z,0))
+dnl          __(extract_lisptag(imm0,arg_y))
+dnl          __(extract_lisptag(imm1,arg_z))
+dnl          __(cmpri(cr0,imm0,tag_fixnum))
+dnl          __(cmpri(cr3,imm1,tag_fixnum))
+dnl 	 __(cmpri(cr2,arg_z,-(29<<2)))	/* !! 2 =  fixnumshift  */
+dnl 	 __(bne- cr0,9f)
+dnl          __(bne- cr3,9f)
+dnl 	 __(bne cr1,0f)
+dnl 	 __(mov arg_z,arg_y)	/* (ash n 0) => n  */
+dnl 	 __(bx lr)
+dnl 0:		
+dnl 	 __(unbox_fixnum(imm1,arg_y))
+dnl 	 __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(bgt cr1,2f)
+dnl 	 /* (ash n -count) => fixnum  */
+dnl 	 __(neg imm2,imm0)
+dnl 	 __(bgt cr2,1f)
+dnl 	 __(mov imm2,#31)
+dnl 1:	
+dnl 	 __(sraw imm0,imm1,imm2)
+dnl 	 __(box_fixnum(arg_z,imm0))
+dnl 	 __(bx lr)
+dnl 	 /* Integer-length of arg_y/imm1 to imm2  */
+dnl 2:		
+dnl 	 __(cntlzw. imm2,imm1)
+dnl 	 __(bne 3f)		/* cr0`eq' set if negative  */
+dnl 	 __(not imm2,imm1)
+dnl 	 __(cntlzw imm2,imm2)
+dnl 3:
+dnl 	 __(subfic imm2,imm2,32)
+dnl 	 __(add imm2,imm2,imm0)	 /* imm2 <- integer-length(imm1) + count  */
+dnl 	 __(cmpri(cr1,imm2,31-fixnumshift))
+dnl 	 __(cmpri(cr2,imm0,32))
+dnl 	 __(slw imm2,imm1,imm0)
+dnl 	 __(bgt cr1,6f)
+dnl 	 __(box_fixnum(arg_z,imm2))
+dnl 	 __(bx lr)	
+dnl 6:
+dnl 	 __(bgt cr2,9f)
+dnl 	 __(bne cr2,7f)
+dnl 	 /* Shift left by 32 bits exactly  */
+dnl 	 __(mov imm0,imm1)
+dnl 	 __(mov imm1,#0)
+dnl 	 __(beq _SPmakes64)
+dnl 	 __(b _SPmakeu64)
+dnl 7:
+dnl 	 /* Shift left by fewer than 32 bits, result not a fixnum  */
+dnl 	 __(subfic imm0,imm0,32)
+dnl 	 __(beq 8f)
+dnl 	 __(srw imm0,imm1,imm0)
+dnl 	 __(mov imm1,imm2)
+dnl 	 __(b _SPmakeu64)
+dnl 8:	
+dnl 	 __(sraw imm0,imm1,imm0)
+dnl 	 __(mov imm1,imm2)
+dnl 	 __(b _SPmakes64)
+dnl         __endif
+dnl 9:		
+dnl 	__(jump_builtin(_builtin_ash,2))
+dnl 
+dnl _spentry(builtin_negate)
+dnl         __(test_fixnum(arg_z))
+dnl         __(bne 1f)
+dnl         __(rsbs arg_z,arg_z,#0)
+dnl         __(bxvc lr)
+dnl 	__(unbox_fixnum(imm1,arg_z))
+dnl         __ifdef(`PPC64')
+dnl 	 __(mov imm0,#two_digit_bignum_header)
+dnl          __(rotldi imm1,imm1,32)
+dnl 	 __(xoris imm1,imm1,0xe000)
+dnl 	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2)))
+dnl 	 __(str(imm1,misc_data_offset(arg_z)))
+dnl         __else
+dnl 	 __(mov imm0,#one_digit_bignum_header)
+dnl 	 __(xoris imm1,imm1,0xc000)
+dnl 	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1)))
+dnl 	 __(str(imm1,misc_data_offset(arg_z)))
+dnl         __endif
+dnl 	__(bx lr)
+dnl 1:
+dnl 	__(jump_builtin(_builtin_negate,1))
+dnl 
+dnl _spentry(builtin_logxor)
+dnl         __(extract_lisptag(imm0,arg_y))
+dnl         __(extract_lisptag(imm1,arg_z))
+dnl         __(ands imm0,imm0,imm1)
+dnl 	__(eoreq arg_z,arg_y,arg_z)
+dnl 	__(bxeq lr)
+dnl 	__(jump_builtin(_builtin_logxor,2))
+dnl 
+dnl 
+dnl 
+dnl         
+dnl _spentry(builtin_aset1)
+dnl 	__(extract_typecode(imm0,arg_x))
+dnl 	__(cmpri(cr0,imm0,min_vector_subtag))
+dnl 	__(box_fixnum(temp0,imm0))
+dnl 	__(bgt cr0,1f)
+dnl 	__(jump_builtin(_builtin_aset1,3))
+dnl 1:
+dnl 	__(b _SPsubtag_misc_set)
+dnl 
+dnl /* Enter the debugger  */
+dnl _spentry(breakpoint)
+dnl 	__(mov r3,#0)
+dnl 	__(tw 28,sp,sp)	/* 28 = lt|gt|eq (assembler bug for the latter)  */
+dnl 	__(bx lr)		/* if handler didn't  */
+dnl 
+dnl /* */
+dnl /* We're entered with an eabi_c_frame on the C stack.  There's a */
+dnl /* lisp_frame reserved underneath it; we'll link it in in a minute. */
+dnl /* Load the outgoing GPR arguments from eabi_c_frame.param`0-7', */
+dnl /* then shrink the eabi_c_frame. */
+dnl /*  */
+dnl 	
+dnl _spentry(eabi_ff_call)
+dnl 	__(mflr loc_pc)
+dnl 	__(str(sp,eabi_c_frame.savelr(sp)))
+dnl 	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
+dnl 	__(mov save0,rcontext)	/* or address globals.  */
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(imm0,subtag_macptr))
+dnl 	__(ldr save1,[sp,#0])	/* bottom of reserved lisp frame  */
+dnl 	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
+dnl         __(zero_doublewords save2,0,lisp_frame.size)
+dnl 	__(str(save1,lisp_frame.backlink(save2)))
+dnl 	__(str(save2,c_frame.backlink(sp)))
+dnl 	__(str(fn,lisp_frame.savefn(save2)))
+dnl 	__(str(loc_pc,lisp_frame.savelr(save2)))
+dnl 	__(str(vsp,lisp_frame.savevsp(save2)))
+dnl 	__(bne 1f)
+dnl 	__(ldr arg_z,[arg_z,#macptr.address])
+dnl 1:
+dnl 	__(ldr save3,[rcontext,#tcr.cs_area])
+dnl 	__(str(save2,area.active(save3)))
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(mtctr arg_z)
+dnl 	__(str(rzero,tcr.ffi_exception(rcontext)))
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
+dnl 	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
+dnl 	__(mov imm1,#TCR_STATE_FOREIGN)
+dnl 	__(str(imm1,tcr.valence(rcontext)))
+dnl 	__(ldr r2,[rcontext,#tcr.native_thread_info])
+dnl 	__(ldr r13,[0,#lisp_globals.saveR13])
+dnl 	__(ldr r3,[sp,#eabi_c_frame.param0])
+dnl 	__(ldr r4,[sp,#eabi_c_frame.param1])
+dnl 	__(ldr r5,[sp,#eabi_c_frame.param2])
+dnl 	__(ldr r6,[sp,#eabi_c_frame.param3])
+dnl 	__(ldr r7,[sp,#eabi_c_frame.param4])
+dnl 	__(ldr r8,[sp,#eabi_c_frame.param5])
+dnl 	__(ldr r9,[sp,#eabi_c_frame.param6])
+dnl 	__(ldr r10,[sp,#eabi_c_frame.param7])
+dnl 	__(la save1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))
+dnl 	__(str(rzero,eabi_c_frame.savelr(save1)))
+dnl 	__(str(save2,eabi_c_frame.backlink(save1)))
+dnl 	__(mov sp,save1)
+dnl 	/* If we're calling a varargs C function, it'll want to */
+dnl 	/* know whether or not we've passed any args in FP regs. */
+dnl 	/* Better to say that we did (and force callee to save FP */
+dnl 	/* arg regs on entry) than to say that we didn't and get */
+dnl 	/* garbage results  */
+dnl 	__(crset 6)
+dnl 	__(bctrl)
+dnl 	/* C should have preserved save0 (= rcontext) for us.  */
+dnl 	__(ldr sp,[sp,#0])
+dnl 	__(mov imm2,save0)
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mov rzero,#0)
+dnl 	__(mov loc_pc,rzero)
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov arg_y,#nil_value)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(mov temp0,#nil_value)
+dnl 	__(mov temp1,#nil_value)
+dnl 	__(mov temp2,#nil_value)
+dnl 	__(mov temp3,#nil_value)
+dnl 	__(mov fn,#nil_value)
+dnl 	__(mov rcontext,imm2)
+dnl 	__(mov imm2,#TCR_STATE_LISP)
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])
+dnl         __(mov save0,#0)
+dnl         __(mov save1,#0)
+dnl         __(mov save2,#0)
+dnl         __(mov save3,#0)
+dnl         __(mov save4,#0)
+dnl         __(mov save5,#0)
+dnl         __(mov save6,#0)
+dnl         __(mov save7,#0)
+dnl         __(mov allocptr,#-dnode_size)
+dnl         __(mov allocbase,#-dnode_size)
+dnl 	__(str(imm2,tcr.valence(rcontext)))	
+dnl 	__(vpop_saveregs())
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,8(sp))
+dnl 	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
+dnl         __(clrrwi imm2,imm3,8)
+dnl 	__(discard_lisp_frame())
+dnl 	__(str(imm2,tcr.ffi_exception(rcontext)))
+dnl 	__(lfd f0,tcr.lisp_fpscr(rcontext))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(check_pending_interrupt(`cr1'))
+dnl         __(mtxer rzero)
+dnl         __(mtctr rzero)
+dnl 	__(bx lr)
+dnl         
+dnl /*  */
+dnl /* This gets called with R11 holding the unboxed callback index. */
+dnl /* */
+dnl         
+dnl _spentry(eabi_callback)
+dnl 	/* First, we extend the C frame so that it has room for */
+dnl         /* incoming arg regs.  */
+dnl 	__(ldr r0,[sp,#eabi_c_frame.backlink])
+dnl 	__(stru(r0,eabi_c_frame.param0-varargs_eabi_c_frame.incoming_stack_args(sp)))
+dnl 	__(mflr r0)
+dnl 	__(str(r0,varargs_eabi_c_frame.savelr(sp)))
+dnl 	__(str(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp)))
+dnl 	__(str(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp)))
+dnl 	__(str(r5,varargs_eabi_c_frame.gp_save+(2*4)(sp)))
+dnl 	__(str(r6,varargs_eabi_c_frame.gp_save+(3*4)(sp)))
+dnl 	__(str(r7,varargs_eabi_c_frame.gp_save+(4*4)(sp)))
+dnl 	__(str(r8,varargs_eabi_c_frame.gp_save+(5*4)(sp)))
+dnl 	__(str(r9,varargs_eabi_c_frame.gp_save+(6*4)(sp)))
+dnl 	__(str(r10,varargs_eabi_c_frame.gp_save+(7*4)(sp)))
+dnl 	/* Could check the appropriate CR bit and skip saving FP regs here  */
+dnl 	__(stfd f1,varargs_eabi_c_frame.fp_save+(0*8)(sp))
+dnl 	__(stfd f2,varargs_eabi_c_frame.fp_save+(1*8)(sp))
+dnl 	__(stfd f3,varargs_eabi_c_frame.fp_save+(2*8)(sp))
+dnl 	__(stfd f4,varargs_eabi_c_frame.fp_save+(3*8)(sp))
+dnl 	__(stfd f5,varargs_eabi_c_frame.fp_save+(4*8)(sp))
+dnl 	__(stfd f6,varargs_eabi_c_frame.fp_save+(5*8)(sp))
+dnl 	__(stfd f7,varargs_eabi_c_frame.fp_save+(6*8)(sp))
+dnl 	__(stfd f8,varargs_eabi_c_frame.fp_save+(7*8)(sp))
+dnl 	__(la r0,varargs_eabi_c_frame.incoming_stack_args(sp))
+dnl 	__(str(r0,varargs_eabi_c_frame.overflow_arg_area(sp)))
+dnl 	__(la r0,varargs_eabi_c_frame.regsave(sp))
+dnl 	__(str(r0,varargs_eabi_c_frame.reg_save_area(sp)))
+dnl 	__(mov r0,#0)
+dnl 	__(str(r0,varargs_eabi_c_frame.flags(sp)))
+dnl 
+dnl 	/* Save the non-volatile registers on the sp stack  */
+dnl 	/* This is a non-standard stack frame, but noone will ever see it,  */
+dnl         /* so it doesn't matter. It will look like more of the stack frame pushed below.  */
+dnl 	__(stru(sp,-(c_reg_save.size)(sp)))
+dnl         __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp)))
+dnl         __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
+dnl         __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
+dnl         __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
+dnl         __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
+dnl         __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
+dnl         __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
+dnl         __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
+dnl         __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
+dnl         __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
+dnl         __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
+dnl         __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
+dnl         __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
+dnl         __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
+dnl         __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
+dnl         __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
+dnl         __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
+dnl         __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
+dnl         __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
+dnl 	__(mffs f0)
+dnl 	__(stfd f0,c_reg_save.save_fp_zero(sp))
+dnl 	__(ldr r31,[sp,#c_reg_save.save_fp_zero+4])	/* recover FPSCR image  */
+dnl 	__(str(r31,c_reg_save.save_fpscr(sp)))
+dnl 	__(mov r30,#0x43300000)
+dnl 	__(mov r31,#0x80000000)
+dnl 	__(str(r30,c_reg_save.save_fp_zero(sp)))
+dnl 	__(str(r31,c_reg_save.save_fp_zero+4(sp)))
+dnl 	__(stfd fp_s32conv,c_reg_save.save_fps32conv(sp))
+dnl 	__(lfd fp_s32conv,c_reg_save.save_fp_zero(sp))
+dnl 	__(stfd fp_zero,c_reg_save.save_fp_zero(sp))
+dnl 	__(lfs fp_zero,lisp_globals.short_float_zero(0))	/* ensure that fp_zero contains 0.0  */
+dnl 
+dnl 	
+dnl /* Restore rest of Lisp context.  */
+dnl /* Could spread out the memory references here to gain a little speed  */
+dnl 	__(mov loc_pc,#0)
+dnl 	__(mov fn,#0)                     /* subprim, not a lisp function  */
+dnl 	__(mov temp3,#0)
+dnl 	__(mov temp2,#0)
+dnl 	__(mov temp1,#0)
+dnl 	__(mov temp0,#0)
+dnl 	__(mov arg_x,#0)
+dnl 	__(box_fixnum(arg_y,r11))	/* callback-index  */
+dnl 	__(la arg_z,c_reg_save.size+varargs_eabi_c_frame.gp_save(sp))	/* parameters (tagged as a fixnum)  */
+dnl 
+dnl 	/* Recover lisp thread context. Have to call C code to do so.  */
+dnl 	__(ref_global(r12,get_tcr))
+dnl 	__(mtctr r12)
+dnl         __(mov r3,#1)
+dnl 	__(stru(sp,-(stack_align(eabi_c_frame.minsiz))(sp)))
+dnl 	__(bctrl)
+dnl 	__(la sp,(stack_align(eabi_c_frame.minsiz))(sp))
+dnl 	__(la rcontext,TCR_BIAS(r3))
+dnl 	__(mov allocptr,#0)
+dnl 	__(mov allocbase,#0)
+dnl 	__(ldr vsp,[rcontext,#tcr.save_vsp])
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])		
+dnl 	__(mov rzero,#0)
+dnl 	__(mtxer rzero) /* lisp wants the overflow bit clear  */
+dnl 	__(mov imm0,#TCR_STATE_LISP)
+dnl 	__(mov save0,#0)
+dnl 	__(mov save1,#0)
+dnl 	__(mov save2,#0)
+dnl 	__(mov save3,#0)
+dnl 	__(mov save4,#0)
+dnl 	__(mov save5,#0)
+dnl 	__(mov save6,#0)
+dnl 	__(mov save7,#0)
+dnl         __(mtctr rzero)
+dnl 	__(str(imm0,tcr.valence(rcontext)))
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(lfd f0,tcr.lisp_fpscr(rcontext))
+dnl 	__(mtfsf 0xff,f0)
+dnl 
+dnl         __(restore_saveregs(vsp))        
+dnl 	/* load nargs and callback to the lisp  */
+dnl 	__(set_nargs(2))
+dnl 	__(ldr imm2,[rcontext,#tcr.cs_area])
+dnl 	__(ldr imm4,[imm2,#area.active])
+dnl 	__(stru(imm4,-lisp_frame.size(sp)))
+dnl 	__(str(imm3,lisp_frame.savelr(sp)))
+dnl 	__(str(vsp,lisp_frame.savevsp(sp)))	/* for stack overflow code  */
+dnl 	__(mov fname,#nrs.callbacks)	/* %pascal-functions%  */
+dnl 	__(call_fname)
+dnl 	__(ldr imm2,[sp,#lisp_frame.backlink])
+dnl 	__(ldr imm3,[rcontext,#tcr.cs_area])
+dnl 	__(str(imm2,area.active(imm3)))
+dnl 	__(discard_lisp_frame())
+dnl 	/* save_vsp will be restored from ff_call's stack frame, but  */
+dnl 	/* I included it here for consistency.  */
+dnl 	/* save_tsp is set below after we exit Lisp context.  */
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	/* Exit lisp context  */
+dnl 	/* This is not necessary yet, but will be once we can be interrupted  */
+dnl 	__(mov imm1,#TCR_STATE_FOREIGN)
+dnl 	__(str(imm1,tcr.valence(rcontext)))
+dnl 	/* Restore the non-volatile registers & fpscr  */
+dnl 	__(lfd fp_zero,c_reg_save.save_fp_zero(sp))
+dnl 	__(ldr r31,[sp,#c_reg_save.save_fpscr])
+dnl 	__(str(r31,c_reg_save.save_fp_zero+4(sp)))
+dnl 	__(lfd f0,c_reg_save.save_fp_zero(sp))
+dnl 	__(mtfsf 0xff,f0)
+dnl 	__(ldr r13,c_reg_save.save_gprs+(0*node_size)(sp)))
+dnl 	__(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
+dnl 	__(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
+dnl 	__(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
+dnl 	__(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
+dnl 	__(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
+dnl 	__(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
+dnl 	__(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
+dnl 	__(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
+dnl 	__(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
+dnl 	__(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
+dnl 	__(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
+dnl 	__(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
+dnl 	__(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
+dnl 	__(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
+dnl 	__(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
+dnl 	__(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
+dnl 	__(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
+dnl 	__(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
+dnl 	__(lfd fp_s32conv,c_reg_save.save_fps32conv(sp))
+dnl 	__(ldr(sp,0(sp)))
+dnl 
+dnl 	__(ldr(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp)))
+dnl 	__(ldr(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp)))
+dnl 	__(lfd f1,varargs_eabi_c_frame.gp_save+(2*4)(sp))
+dnl 	__(ldr(r5,varargs_eabi_c_frame.savelr(sp)))
+dnl 	__(str(r5,varargs_eabi_c_frame.old_savelr(sp)))
+dnl 	__(mtlr r5)
+dnl 	__(ldr(r5,varargs_eabi_c_frame.backlink(sp)))
+dnl 	__(str(r5,varargs_eabi_c_frame.old_backlink(sp)))
+dnl 	__(la sp,varargs_eabi_c_frame.old_backlink(sp))
+dnl 	__(bx lr)
+dnl 	
+dnl 
+dnl /*	Do a linux system call:	 the system call index is (boxed) */
+dnl /*	in arg_z, and other arguments are in an eabi_c_frame on */
+dnl /*	the C stack.  As is the case with an eabi_ff_call, there's */
+dnl /*	a lisp frame reserved underneath the eabi_c_frame. */
+dnl 
+dnl /*	This is a little simpler than eabi_ff_call, because we */
+dnl /*	can assume that there are no synchronous callbacks to */
+dnl /*	lisp (that might cause a GC.)  It's also simpler for the */
+dnl /*	caller, since we return error status atomically. */
+dnl 
+dnl /*	A system call can clobber any or all of r9-r12, so we need */
+dnl /*	to save and restore allocptr, allocbase, and tsp. */
+dnl 	
+dnl _spentry(eabi_syscall)
+dnl /*	We're entered with an eabi_c_frame on the C stack.  There's a */
+dnl /*	lisp_frame reserved underneath it; we'll link it in in a minute. */
+dnl /*	Load the outgoing GPR arguments from eabi_c_frame.param`0-7', */
+dnl /*	then shrink the eabi_c_frame. */
+dnl 
+dnl 	__(mflr loc_pc)
+dnl         __(vpush_saveregs())
+dnl 	__(str(sp,eabi_c_frame.savelr(sp)))
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov temp0,rcontext)
+dnl 	__(ldr temp1,[sp,#c_frame.backlink])	/* bottom of reserved lisp frame  */
+dnl 	__(la temp2,-lisp_frame.size(temp1))	/* top of lisp frame  */
+dnl         __(zero_doublewords temp2,0,lisp_frame.size)
+dnl 	__(str(temp1,lisp_frame.backlink(temp2)))
+dnl 	__(str(temp2,c_frame.backlink(sp)))
+dnl 	__(str(fn,lisp_frame.savefn(temp2)))
+dnl 	__(str(loc_pc,lisp_frame.savelr(temp2)))
+dnl 	__(str(vsp,lisp_frame.savevsp(temp2)))
+dnl 	__(ldr temp3,[rcontext,#tcr.cs_area])
+dnl 	__(str(temp2,area.active(temp3)))
+dnl 	__(str(allocptr,tcr.save_allocptr(rcontext)))
+dnl 	__(str(allocbase,tcr.save_allocbase(rcontext)))
+dnl 	__(str(tsp,tcr.save_tsp(rcontext)))
+dnl 	__(str(vsp,tcr.save_vsp(rcontext)))
+dnl 	__(str(rzero,tcr.ffi_exception(rcontext)))
+dnl 	__(mov imm1,#TCR_STATE_FOREIGN)
+dnl 	__(str(imm1,tcr.valence(rcontext)))
+dnl 	__(ldr r13,[0,#lisp_globals.saveR13])
+dnl 	__(ldr r3,[sp,#eabi_c_frame.param0])
+dnl 	__(ldr r4,[sp,#eabi_c_frame.param1])
+dnl 	__(ldr r5,[sp,#eabi_c_frame.param2])
+dnl 	__(ldr r6,[sp,#eabi_c_frame.param3])
+dnl 	__(ldr r7,[sp,#eabi_c_frame.param4])
+dnl 	__(ldr r8,[sp,#eabi_c_frame.param5])
+dnl 	__(ldr r9,[sp,#eabi_c_frame.param6])
+dnl 	__(ldr r10,[sp,#eabi_c_frame.param7])
+dnl 	__(la temp1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))
+dnl 	__(str(rzero,eabi_c_frame.savelr(temp1)))
+dnl 	__(str(temp2,eabi_c_frame.backlink(temp1)))
+dnl 	__(mov sp,temp1)
+dnl 	__(unbox_fixnum(r0,arg_z))
+dnl 	__(sc)
+dnl 	__(nop)
+dnl 	/* C should have preserved temp0 (= rcontext) for us.  */
+dnl 	__(ldr sp,[sp,#0])
+dnl 	__(mov imm2,temp0)
+dnl 	__(ldr vsp,[sp,#lisp_frame.savevsp])
+dnl 	__(mov rzero,#0)
+dnl 	__(mov loc_pc,rzero)
+dnl 	__(mov fn,rzero)
+dnl 	__(mov arg_x,#nil_value)
+dnl 	__(mov arg_y,#nil_value)
+dnl 	__(mov arg_z,#nil_value)
+dnl 	__(mov temp0,#nil_value)
+dnl 	__(mov temp1,#nil_value)
+dnl 	__(mov temp2,#nil_value)
+dnl 	__(mov temp3,#nil_value)
+dnl 	__(mov fn,#nil_value)
+dnl         
+dnl 	__(mov imm3,#TCR_STATE_LISP)
+dnl 	__(mov rcontext,imm2)
+dnl         __(mov save0,#0)
+dnl         __(mov save1,#0)
+dnl         __(mov save2,#0)
+dnl         __(mov save3,#0)
+dnl         __(mov save4,#0)
+dnl         __(mov save5,#0)
+dnl         __(mov save6,#0)
+dnl         __(mov save7,#0)        
+dnl 	__(str(imm3,tcr.valence(rcontext)))
+dnl 	__(vpop_saveregs)
+dnl 	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
+dnl 	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
+dnl 	__(ldr tsp,[rcontext,#tcr.save_tsp])
+dnl 	__(ldr loc_pc,[sp,#lisp_frame.savelr])
+dnl 	__(mtlr loc_pc)
+dnl 	__(ldr fn,[sp,#lisp_frame.savefn])
+dnl 	__(discard_lisp_frame())
+dnl 	__(bns 1f)
+dnl 	__(neg r3,r3)
+dnl 1:      
+dnl 	__(check_pending_interrupt(`cr1'))                
+dnl 	__(mtxer rzero)
+dnl 	__(bx lr)
+dnl         
+dnl /* arg_z should be of type (UNSIGNED-BYTE 64);  */
+dnl /* On PPC32, return high 32 bits in imm0, low 32 bits in imm1 */
+dnl /* On PPC64, return unboxed value in imm0  */
+dnl 
+dnl _spentry(getu64)
+dnl         __ifdef(`PPC64')
+dnl         __(extract_typecode(imm0,arg_z))
+dnl         __(cmpdi cr0,imm0,tag_fixnum)
+dnl         __(cmpdi cr2,arg_z,0)
+dnl         __(cmpdi cr1,imm0,subtag_bignum)
+dnl         __(bne cr0,1f)
+dnl         __(unbox_fixnum(imm0,arg_z))
+dnl         __(bgelr cr2)
+dnl 0:             
+dnl 	__(uuo_interr(error_object_not_u64,arg_z))
+dnl         
+dnl 1:      __(bne cr1,0b)
+dnl         __(getvheader(imm1,arg_z))
+dnl         __(ld imm0,misc_data_offset(arg_z))
+dnl         __(cmpdi cr2,imm1,two_digit_bignum_header)
+dnl         __(rotldi imm0,imm0,32)
+dnl         __(cmpdi cr1,imm1,three_digit_bignum_header)
+dnl         __(cmpdi cr0,imm0,0)
+dnl         __(beq cr2,2f)
+dnl         __(lwz imm1,misc_data_offset+8(arg_z))
+dnl         __(bne cr1,0b)
+dnl         __(cmpwi imm1,0)
+dnl         __(bne 0b)
+dnl         __(bx lr)
+dnl 2:      __(blt 0b)
+dnl         __(bx lr)        
+dnl         __else
+dnl 	__(extract_typecode(imm0,arg_z))
+dnl 	__(cmpri(cr0,imm0,tag_fixnum))
+dnl 	__(cmpri(cr1,arg_z,0))
+dnl 	__(cmpri(cr2,imm0,subtag_bignum))
+dnl 	__(unbox_fixnum(imm1,arg_z))
+dnl 	__(bne cr0,8f)
+dnl 	__(bgelr cr1)
+dnl 9:
+dnl 	__(uuo_interr(error_object_not_u64,arg_z))
+dnl 8:
+dnl 	__(bne- cr2,9b)
+dnl 	__(getvheader(imm2,arg_z))
+dnl 	__(cmpri(cr2,imm2,two_digit_bignum_header))
+dnl 	__(vrefr(imm1,arg_z,0))
+dnl 	__(cmpri(cr1,imm1,0))
+dnl 	__(mov imm0,#0)
+dnl 	__(bge cr2,2f)
+dnl 	__(blt- cr1,9b)
+dnl 	__(bx lr)
+dnl 2:
+dnl 	__(cmpri(cr0,imm2,three_digit_bignum_header))
+dnl 	__(vrefr(imm0,arg_z,1))
+dnl 	__(cmpri(cr1,imm0,0))
+dnl 	__(bne cr2,3f)
+dnl 	__(blt- cr1,9b)
+dnl 	__(bx lr)
+dnl 3:
+dnl 	__(vrefr(imm2,arg_z,2))
+dnl 	__(cmpri(cr1,imm2,0))
+dnl 	__(bne- cr0,9b)
+dnl 	__(bne- cr1,9b)
+dnl 	__(bx lr)
+dnl         __endif
+dnl         
+dnl /* arg_z should be of type (SIGNED-BYTE 64);  */
+dnl /* PPC32:   return high 32 bits  in imm0, low 32 bits in imm1  */
+dnl /* PPC64:   return unboxed value in imm0  */
+dnl 
+dnl _spentry(gets64)
+dnl         __ifdef(`PPC64')
+dnl 	 __(extract_typecode(imm1,arg_z))
+dnl          __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(cmpri(cr0,imm1,tag_fixnum))
+dnl 	 __(cmpri(cr2,imm1,subtag_bignum))
+dnl          __(beqlr cr0)
+dnl          __(bne cr2,9f)
+dnl          __(ld imm1,misc_header_offset(arg_z))
+dnl          __(ld imm0,misc_data_offset(arg_z))
+dnl          __(cmpdi imm1,two_digit_bignum_header)
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(beqlr)
+dnl         __else
+dnl 	 __(extract_typecode(imm0,arg_z))
+dnl 	 __(cmpri(cr0,imm0,tag_fixnum))
+dnl 	 __(cmpri(cr2,imm0,subtag_bignum))
+dnl 	 __(unbox_fixnum(imm1,arg_z))
+dnl 	 __(srawi imm0,imm1,31)
+dnl 	 __(beqlr cr0)
+dnl 	 __(bne cr2,9f)
+dnl 	 __(getvheader(imm2,arg_z))
+dnl 	 __(cmpri(cr2,imm2,two_digit_bignum_header))
+dnl 	 __(vrefr(imm1,arg_z,0))
+dnl 	 __(srawi imm0,imm1,31)
+dnl 	 __(bltlr cr2)
+dnl 	 __(vrefr(imm0,arg_z,1))
+dnl 	 __(beqlr cr2)
+dnl         __endif
+dnl 9:
+dnl 	__(uuo_interr(error_object_not_s64,arg_z))
+dnl 
+dnl 
+dnl 
+dnl 	
+dnl 
+dnl 
+dnl 
+dnl 
+dnl 
+dnl /* imm0:imm1 constitute an unsigned integer, almost certainly a bignum. */
+dnl /* Make a lisp integer out of those 128 bits ..  */
+dnl _spentry(makeu128)
+dnl         __ifdef(`PPC64')
+dnl          __(cmpdi imm0,0)
+dnl          __(cmpdi cr1,imm1,0)
+dnl          __(srdi imm3,imm0,32)
+dnl          __(srawi imm4,imm0,31)
+dnl          __(cmpdi cr3,imm3,0)
+dnl          __(cmpdi cr4,imm4,0)
+dnl          __(mov imm2,#five_digit_bignum_header)
+dnl          __(blt cr1,0f)
+dnl          __(beq 3f)
+dnl 0:              
+dnl          __(bge 1f)
+dnl          /* All 128 bits are significant, and the most significant */
+dnl          /* bit is set.  Allocate a 5-digit bignum (with a zero */
+dnl          /* sign digit  */
+dnl          __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(5)))
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(rotldi imm1,imm1,32)
+dnl          __(std imm1,misc_data_offset(arg_z))
+dnl          __(std imm0,misc_data_offset+8(arg_z))
+dnl          __(bx lr)
+dnl 1:       /* If the high word of imm0 is a zero-extension of the low */
+dnl          /* word, we only need 3 digits ; otherwise, we need 4.  */
+dnl          __(mov imm2,#three_digit_bignum_header)
+dnl          __(rotldi imm1,imm1,32)
+dnl          __(bne cr3,2f) /* high word of imm0 is non-zero  */
+dnl          __(bne cr4,2f) /* sign bit is on in low word of imm0  */
+dnl          __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
+dnl          __(std imm1,misc_data_offset(arg_z))
+dnl          __(stw imm0,misc_data_offset+8(arg_z))
+dnl          __(bx lr)
+dnl 2:       __(mov imm2,#four_digit_bignum_header)
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4)))
+dnl          __(std imm1,misc_data_offset(arg_z))
+dnl          __(std imm0,misc_data_offset+8(arg_z))
+dnl          __(bx lr)
+dnl 3:       __(mov imm0,imm1)
+dnl          __(b _SPmakeu64)              
+dnl         __else
+dnl          __(twgei r0,r0)
+dnl         __endif
+dnl 
+dnl /* imm0:imm1 constitute a signed integer, almost certainly a bignum. */
+dnl /* Make a lisp integer out of those 128 bits ..  */
+dnl _spentry(makes128)
+dnl         __ifdef(`PPC64')
+dnl          /* Is imm0 just a sign-extension of imm1 ?  */
+dnl          __(sradi imm2,imm1,63)
+dnl          /* Is the high word of imm0 just a sign-extension of the low word ?  */
+dnl          __(extsw imm3,imm0)
+dnl          __(cmpd imm2,imm0)
+dnl          __(cmpd cr1,imm3,imm0)
+dnl          __(beq 2f)
+dnl          __(rotldi imm0,imm0,32)
+dnl          __(rotldi imm1,imm1,32)
+dnl          __(beq cr1,1f)
+dnl          __(mov imm2,#four_digit_bignum_header)
+dnl          __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4)))
+dnl          __(std imm1,misc_data_offset(arg_z))
+dnl          __(std imm0,misc_data_offset+8(arg_z))
+dnl          __(bx lr)
+dnl 1:       __(mov imm2,#three_digit_bignum_header)
+dnl          __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
+dnl          __(std imm1,misc_data_offset(arg_z))
+dnl          __(stw imm3,misc_data_offset+8(arg_z))
+dnl          __(bx lr)
+dnl 2:       __(mov imm0,imm1)
+dnl          __(b _SPmakes64)        
+dnl         __else
+dnl          __(twgei r0,r0)
+dnl         __endif        
+dnl                         
+dnl /* on entry: arg_z = symbol.  On exit, arg_z = value (possibly */
+dnl /* unbound_marker), arg_y = symbol, imm3 = symbol.binding-index  */
+dnl _spentry(specref)
+dnl         __(ldr imm1,[arg_z,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(cmp imm1,imm0)
+dnl         __(ldr temp0,[rcontext,#tcr.tlb_pointer])
+dnl         __(mov arg_y,arg_z)
+dnl         __(movhs imm1,#0)
+dnl         __(ldr arg_z,[temp0,imm1])
+dnl         __(cmp arg_z,#no_thread_local_binding_marker)
+dnl      	__(ldreq arg_z,[arg_y,#symbol.vcell])
+dnl         __(bx lr)
+dnl 
+dnl 
+dnl _spentry(specrefcheck)
+dnl         __(ldr imm1,[arg_z,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(cmp imm1,imm0)
+dnl         __(movhs imm1,#0)
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_pointer])
+dnl         __(mov arg_y,arg_z)
+dnl         __(ldrx arg_z,[imm0,imm1])
+dnl         __(cmp arg_z,#no_thread_local_binding_marker)
+dnl      	__(ldreq arg_z,[arg_y,#symbol.vcell])
+dnl         __(cmp arg_z,#unbound_marker)
+dnl         __(uuo_error_unbound(eq,arg_y)
+dnl         __(bx lr)
+dnl 	
+dnl /* arg_y = special symbol, arg_z = new value.          */
+dnl _spentry(specset)
+dnl         __(ldr imm3,[arg_y,#symbol.binding_index])
+dnl         __(ldr imm0,[rcontext,#tcr.tlb_limit])
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl         __(cmpr(imm3,imm0))
+dnl         __(bge 1f)
+dnl         __(ldrx(temp1,imm2,imm3))
+dnl         __(cmpri(temp1,no_thread_local_binding_marker))
+dnl         __(beq 1f)
+dnl         __(str arg_z,imm2,imm3)
+dnl         __(bx lr)
+dnl 1:     	__(mov arg_x,arg_y)
+dnl         __(mov arg_y,#symbol.vcell-misc_data_offset)
+dnl         __(b _SPgvset)
+dnl 
+dnl /* Restore current thread's interrupt level to arg_z, */
+dnl /* noting whether the tcr's interrupt_pending flag was set.  */
+dnl _spentry(restoreintlevel)
+dnl 	__(cmpri(cr1,arg_z,0))
+dnl 	__(ldr imm0,[rcontext,#tcr.interrupt_pending])
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(bne cr1,1f)
+dnl 	__(beq cr0,1f)
+dnl 	__(str(rzero,tcr.interrupt_pending(rcontext)))
+dnl 	__(mov nargs,#fixnum_one)
+dnl 	__(trgti(nargs,0))
+dnl 	__(bx lr)
+dnl 1:
+dnl         __(ldr nargs,[rcontext,#tcr.tlb_pointer])
+dnl 	__(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
+dnl 	__(bx lr)
+dnl 
+dnl 
+dnl /* Construct a lisp integer out of the 32-bit signed value in imm0 */
+dnl 
+dnl         
+dnl 
+dnl 
+dnl 
+dnl /*  */
+dnl /* arg_z should be of type (SIGNED-BYTE 32); return unboxed result in imm0 */
+dnl /*  */
+dnl _spentry(gets32)
+dnl         __ifdef(`PPC64')
+dnl          __(sldi imm1,arg_z,32-fixnumshift)
+dnl          __(extract_lisptag_(imm0,arg_z))
+dnl          __(sradi imm1,imm1,32-fixnumshift)
+dnl          __(box_fixnum(imm0,arg_z))
+dnl          __(cmpd cr1,imm1,arg_z)
+dnl          __(bne cr0,9f)
+dnl          __(beqlr cr1)
+dnl          __(b 9f)
+dnl         __else
+dnl 	 __(extract_typecode(imm1,arg_z))
+dnl 	 __(cmpri(cr0,imm1,tag_fixnum))
+dnl 	 __(cmpri(cr2,imm1,subtag_bignum))
+dnl 	 __(unbox_fixnum(imm0,arg_z))
+dnl 	 __(beqlr+ cr0)
+dnl 	 __(bne cr2,9f)
+dnl 	 __(getvheader(imm1,arg_z))
+dnl 	 __(cmpri(cr1,imm1,one_digit_bignum_header))
+dnl 	 __(vrefr(imm0,arg_z,0))
+dnl 	 __(beqlr+ cr1)
+dnl         __endif
+dnl 9:
+dnl 	__(uuo_interr(error_object_not_signed_byte_32,arg_z))
+dnl 
+dnl /*  */
+dnl /* arg_z should be of type (UNSIGNED-BYTE 32); return unboxed result in imm0 */
+dnl /*  */
+dnl 
+dnl _spentry(getu32)
+dnl 	__(extract_typecode(imm1,arg_z))
+dnl 	__(cmpri(cr0,imm1,tag_fixnum))
+dnl 	__(cmpri(cr1,arg_z,0))
+dnl 	__(cmpri(cr2,imm1,subtag_bignum))
+dnl 	__(unbox_fixnum(imm0,arg_z))
+dnl 	__(bne cr0,8f)
+dnl 	__(bgelr cr1)
+dnl 8:
+dnl 	__(bne- cr2,9f)
+dnl 	__(getvheader(imm2,arg_z))
+dnl 	__(cmpri(cr2,imm2,two_digit_bignum_header))
+dnl 	__(vrefr(imm0,arg_z,0))
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(bgt cr2,9f)
+dnl 	__(beq cr2,2f)
+dnl 	__(blt cr0,9f)
+dnl 	__(bx lr)
+dnl 2:
+dnl 	__(vrefr(imm1,arg_z,1))
+dnl 	__(cmpri(cr0,imm1,0))
+dnl 	__(beqlr+ cr0)
+dnl 
+dnl 9:
+dnl 	__(uuo_interr(error_object_not_unsigned_byte_32,arg_z))
+dnl 
+dnl 		
+dnl 
+dnl 
+dnl /* */
+dnl /* As per mvpass above, but in this case fname is known to be a */
+dnl /* symbol. */
+dnl 
+dnl _spentry(mvpasssym)
+dnl 	__(cmpri(cr0,nargs,node_size*nargregs))
+dnl 	__(mflr loc_pc)
+dnl 	__(mov imm0,vsp)
+dnl 	__(ble+ cr0,1f)
+dnl 	 __(subi imm0,imm0,node_size*nargregs)
+dnl 	 __(add imm0,imm0,nargs)
+dnl 1:            
+dnl 	__(build_lisp_frame(fn,loc_pc,imm0))
+dnl 	__(ref_global(loc_pc,ret1val_addr))
+dnl 	__(mov fn,#0)
+dnl 	__(mtlr loc_pc)
+dnl 	__(jump_fname())
+dnl 
+dnl 
+dnl 
+dnl _spentry(unbind)
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])   
+dnl         __(ldr imm3,[imm1,#binding.sym])
+dnl         __(ldr temp1,[imm1,#binding.val])
+dnl         __(ldr imm1,[imm1,#binding.link])
+dnl         __(str temp1,imm2,imm3)
+dnl         __(str(imm1,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 
+dnl _spentry(unbind_n)
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])   
+dnl 1:      __(subi imm0,imm0,1)
+dnl         __(ldr imm3,[imm1,#binding.sym])
+dnl         __(ldr temp1,[imm1,#binding.val])
+dnl         __(cmpri(imm0,0))
+dnl         __(ldr imm1,[imm1,#binding.link])
+dnl         __(str temp1,imm2,imm3)
+dnl         __(bne 1b)
+dnl         __(str(imm1,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 
+dnl /* */
+dnl /* Clobbers imm1,imm2,imm5,arg_x, arg_y */
+dnl 
+dnl _spentry(unbind_to)
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl 1:      __(ldr imm5,[imm1,#binding.sym])
+dnl         __(ldr arg_y,[imm1,#binding.val])
+dnl         __(ldr imm1,[imm1,#binding.link])
+dnl         __(cmpr(imm0,imm1))
+dnl         __(str arg_y,imm2,imm5)
+dnl         __(bne 1b)
+dnl         __(str(imm1,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 	
+dnl 
+dnl 
+dnl /* */
+dnl /* Restore the special bindings from the top of the tstack,  */
+dnl /* leaving the tstack frame allocated.  */
+dnl /* Note that there might be 0 saved bindings, in which case  */
+dnl /* do nothing.  */
+dnl /* Note also that this is -only- called from an unwind-protect  */
+dnl /* cleanup form, and that .SPnthrowXXX is keeping one or more  */
+dnl /* values in a frame on top of the tstack.  */
+dnl /*  */
+dnl                         
+dnl _spentry(progvrestore)
+dnl 	__(ldr imm0,[tsp,#tsp_frame.backlink])	/* ignore .SPnthrowXXX values frame  */
+dnl 	__(ldr imm0,[imm0,#tsp_frame.data_offset])
+dnl 	__(cmpri(cr0,imm0,0))
+dnl 	__(unbox_fixnum(imm0,imm0))
+dnl 	__(bne+ cr0,_SPunbind_n)
+dnl 	__(bx lr)
+dnl 
+dnl /* Bind CCL::*INTERRUPT-LEVEL* to 0.  If its value had been negative, check  */
+dnl /* for pending interrupts after doing so.  "nargs" can be freely used for an */
+dnl /* interrupt trap in this context.  */
+dnl _spentry(bind_interrupt_level_0)
+dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(cmpri(temp0,0))
+dnl         __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
+dnl         __(vpush1(temp0))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str(rzero,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(beqlr)
+dnl         __(mov nargs,temp0)
+dnl         __(bgt 1f)
+dnl         __(ldr nargs,[rcontext,#tcr.interrupt_pending])
+dnl 1:      __(trgti(nargs,0))        
+dnl         __(bx lr)
+dnl 
+dnl /* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1.  (This has the effect */
+dnl /* of disabling interrupts.)  */
+dnl _spentry(bind_interrupt_level_m1)
+dnl         __(mov imm2,#-fixnumone)
+dnl         __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
+dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(vpush1(temp0))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 
+dnl         
+dnl /* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z.  If that value's 0, */
+dnl /* do what _SPbind_interrupt_level_0 does  */
+dnl _spentry(bind_interrupt_level)
+dnl         __(cmpri(arg_z,0))
+dnl         __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
+dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(beq _SPbind_interrupt_level_0)
+dnl         __(vpush1(temp0))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl         __(bx lr)
+dnl 
+dnl /* Unbind CCL::*INTERRUPT-LEVEL*.  If the value changes from negative to */
+dnl /* non-negative, check for pending interrupts.  This is often called in */
+dnl /* a context where nargs is significant, so save and restore nargs around */
+dnl /* any interrupt polling  */
+dnl         
+dnl _spentry(unbind_interrupt_level)
+dnl         __(ldr imm0,[rcontext,#tcr.flags])
+dnl         __(ldr imm2,[rcontext,#tcr.tlb_pointer])
+dnl         __(andi. imm0,imm0,1<<TCR_FLAG_BIT_PENDING_SUSPEND)
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(ldr temp1,[imm2,#INTERRUPT_LEVEL_BINDING_INDEX])
+dnl         __(bne 5f)
+dnl 0:      __(cmpri(cr1,temp1,0))
+dnl         __(ldr temp1,[imm1,#binding.val])
+dnl         __(ldr imm1,[imm1,#binding.link])
+dnl         __(cmpri(cr0,temp1,0))
+dnl         __(str(temp1,INTERRUPT_LEVEL_BINDING_INDEX(imm2)))
+dnl         __(str(imm1,tcr.db_link(rcontext)))
+dnl         __(bgelr cr1)
+dnl         __(bltlr cr0)
+dnl         __(mov imm2,nargs)
+dnl         __(check_pending_interrupt(`cr1'))
+dnl         __(mov nargs,imm2)
+dnl         __(bx lr)
+dnl 5:       /* Missed a suspend request; force suspend now if we're restoring
+dnl           interrupt level to -1 or greater */
+dnl         __(cmpri(temp1,-2<<fixnumshift))
+dnl         __(bne 0b)
+dnl         __(ldr imm0,[imm1,#binding.val])
+dnl         __(cmpr(imm0,temp1))
+dnl         __(beq 0b)
+dnl         __(mov imm0,#1<<fixnumshift)
+dnl         __(str(imm0,INTERRUPT_LEVEL_BINDING_INDEX(imm2)))
+dnl         __(suspend_now())
+dnl         __(b 0b)
+dnl 
+dnl 
+dnl /* arg_x = array, arg_y = i, arg_z = j. Typecheck everything.
+dnl    We don't know whether the array is alleged to be simple or
+dnl    not, and don't know anythng about the element type.  */
+dnl _spentry(aref2)
+dnl         __(extract_typecode(imm2,arg_x))
+dnl         __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl         __(cmpri(cr2,imm2,subtag_arrayH))
+dnl         __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
+dnl         __(bne cr2,1f)
+dnl         __(ldr imm1,[arg_x,#arrayH.rank])
+dnl         __(cmpri(imm1,2<<fixnumshift))
+dnl         __(bne 1f)
+dnl         /* It's a 2-dimensional array.  Check bounds */
+dnl         __(ldr imm0,[arg_x,#arrayH.dim0])
+dnl         __(trlge(arg_y,imm0))
+dnl         __(ldr imm0,[arg_x,#arrayH.dim0+node_size])
+dnl         __(trlge(arg_z,imm0))
+dnl         __(unbox_fixnum(imm0,imm0))
+dnl         __(mullr(arg_y,arg_y,imm0))
+dnl         __(add arg_z,arg_z,arg_y)
+dnl         /* arg_z is now row-major-index; get data vector and
+dnl            add in possible offset */
+dnl         __(mov arg_y,arg_x)
+dnl 0:      __(ldr imm0,[arg_y,#arrayH.displacement])
+dnl         __(ldr arg_y,[arg_y,#arrayH.data_vector])
+dnl         __(extract_subtag(imm1,arg_y))
+dnl         __(cmpri(imm1,subtag_vectorH))
+dnl         __(add arg_z,arg_z,imm0)
+dnl         __(bgt local_label(misc_ref_common))
+dnl         __(b 0b)
+dnl 1:              
+dnl         __(uuo_interr(error_object_not_array_2d,arg_x))
+dnl 
+dnl /* temp0 = array, arg_x = i, arg_y = j, arg_z = k */
+dnl _spentry(aref3)
+dnl         __(extract_typecode(imm2,temp0))
+dnl         __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
+dnl         __(cmpri(cr2,imm2,subtag_arrayH))
+dnl         __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl         __(bne cr2,1f)
+dnl         __(ldr imm1,[temp0,#arrayH.rank])
+dnl         __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
+dnl         __(cmpri(imm1,3<<fixnumshift))
+dnl         __(bne 1f)
+dnl         /* It's a 3-dimensional array.  Check bounds */
+dnl         __(ldr imm2,arrayH.dim0+(node_size*2)(temp0)))
+dnl         __(ldr imm1,[temp0,#arrayH.dim0+node_size])
+dnl         __(ldr imm0,[temp0,#arrayH.dim0])
+dnl         __(trlge(arg_z,imm2))
+dnl         __(unbox_fixnum(imm2,imm2))
+dnl         __(trlge(arg_y,imm1))
+dnl         __(unbox_fixnum(imm1,imm1))
+dnl         __(trlge(arg_x,imm0))
+dnl         __(mullr(arg_y,arg_y,imm2))
+dnl         __(mullr(imm1,imm2,imm1))
+dnl         __(mullr(arg_x,imm1,arg_x))
+dnl         __(add arg_z,arg_z,arg_y)
+dnl         __(add arg_z,arg_z,arg_x)
+dnl         __(mov arg_y,temp0)
+dnl 0:      __(ldr arg_x,[arg_y,#arrayH.displacement])
+dnl         __(ldr arg_y,[arg_y,#arrayH.data_vector])
+dnl         __(extract_subtag(imm1,arg_y))
+dnl         __(cmpri(imm1,subtag_vectorH))
+dnl         __(add arg_z,arg_x,arg_z)
+dnl         __(bgt local_label(misc_ref_common))
+dnl         __(b 0b)
+dnl 1:              
+dnl         __(uuo_interr(error_object_not_array_3d,temp0))
+dnl 
+dnl         
+dnl         
+dnl 
+dnl /* As for aref2 above, but temp = array, arg_x = i, arg_y = j, arg_z = newval */
+dnl _spentry(aset2)
+dnl         __(extract_typecode(imm2,temp0))
+dnl         __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
+dnl         __(cmpri(cr2,imm2,subtag_arrayH))
+dnl         __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl         __(bne cr2,1f)
+dnl         __(ldr imm1,[temp0,#arrayH.rank])
+dnl         __(cmpri(imm1,2<<fixnumshift))
+dnl         __(bne 1f)
+dnl         /* It's a 2-dimensional array.  Check bounds */
+dnl         __(ldr imm0,[temp0,#arrayH.dim0])
+dnl         __(trlge(arg_x,imm0))
+dnl         __(ldr imm0,[temp0,#arrayH.dim0+node_size])
+dnl         __(trlge(arg_y,imm0))
+dnl         __(unbox_fixnum(imm0,imm0))
+dnl         __(mullr(arg_x,arg_x,imm0))
+dnl         __(add arg_y,arg_y,arg_x)
+dnl         /* arg_y is now row-major-index; get data vector and
+dnl            add in possible offset */
+dnl         __(mov arg_x,temp0)
+dnl 0:      __(ldr imm0,[arg_x,#arrayH.displacement])
+dnl         __(ldr arg_x,[arg_x,#arrayH.data_vector])
+dnl         __(extract_subtag(imm1,arg_x))
+dnl         __(cmpri(imm1,subtag_vectorH))
+dnl         __(add arg_y,arg_y,imm0)
+dnl         __(bgt local_label(misc_set_common))
+dnl         __(b 0b)
+dnl 1:              
+dnl         __(uuo_interr(error_object_not_array_2d,temp0))        
+dnl                 
+dnl /* temp1 = array, temp0 = i, arg_x = j, arg_y = k, arg_z = new */        
+dnl _spentry(aset3)
+dnl         __(extract_typecode(imm2,temp1))
+dnl         __(trap_unless_lisptag_equal(temp0,tag_fixnum,imm0))
+dnl         __(cmpri(cr2,imm2,subtag_arrayH))
+dnl         __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
+dnl         __(bne cr2,1f)
+dnl         __(ldr imm1,[temp1,#arrayH.rank])
+dnl         __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
+dnl         __(cmpri(imm1,3<<fixnumshift))
+dnl         __(bne 1f)
+dnl         /* It's a 3-dimensional array.  Check bounds */
+dnl         __(ldr imm2,arrayH.dim0+(node_size*2)(temp1)))
+dnl         __(ldr imm1,[temp1,#arrayH.dim0+node_size])
+dnl         __(ldr imm0,[temp1,#arrayH.dim0])
+dnl         __(trlge(arg_y,imm2))
+dnl         __(unbox_fixnum(imm2,imm2))
+dnl         __(trlge(arg_x,imm1))
+dnl         __(unbox_fixnum(imm1,imm1))
+dnl         __(trlge(temp0,imm0))
+dnl         __(mullr(arg_x,arg_x,imm2))
+dnl         __(mullr(imm1,imm2,imm1))
+dnl         __(mullr(temp0,imm1,temp0))
+dnl         __(add arg_y,arg_y,arg_x)
+dnl         __(add arg_y,arg_y,temp0)
+dnl         __(mov arg_x,temp1)
+dnl 0:      __(ldr temp0,[arg_x,#arrayH.displacement])
+dnl         __(ldr arg_x,[arg_x,#arrayH.data_vector])
+dnl         __(extract_subtag(imm1,arg_x))
+dnl         __(cmpri(imm1,subtag_vectorH))
+dnl         __(add arg_y,arg_y,temp0)
+dnl         __(bgt local_label(misc_set_common))
+dnl         __(b 0b)
+dnl 1:              
+dnl         __(uuo_interr(error_object_not_array_3d,temp1))
+dnl 
+dnl 
+dnl         
+dnl 
+dnl _spentry(nmkunwind)
+dnl         __(mov imm2,#-fixnumone)
+dnl         __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
+dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer])
+dnl         __(ldr arg_y,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX])
+dnl         __(ldr imm1,[rcontext,#tcr.db_link])
+dnl         __(vpush1(arg_y))
+dnl         __(vpush1(imm3))
+dnl         __(vpush1(imm1))
+dnl         __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
+dnl         __(str(vsp,tcr.db_link(rcontext)))
+dnl 	__(mov arg_z,#unbound_marker)
+dnl 	__(mov imm2,#fixnum_one)
+dnl 	__(mkcatch())
+dnl         __(mov arg_z,arg_y)
+dnl         __(b _SPbind_interrupt_level)
+dnl 
+dnl 
+dnl                                 
+dnl /*  EOF, basically  */
+dnl         .globl _SPsp_end
+dnl         b _SPsp_end
+dnl 	
+ local_label(misc_ref_common):   
+         __(adr imm0,(local_label(misc_ref_jmp)))
+         __(ldr pc,[imm0,imm1,lsl #2])        
+ 
+ local_label(misc_ref_jmp):          
+         /* 00-0f  */
          .long local_label(misc_ref_invalid) /* 00 even_fixnum  */
+ 	
          .long local_label(misc_ref_invalid) /* 01 cons  */
          .long local_label(misc_ref_invalid) /* 02 nodeheader  */
@@ -2704,5 +6032,5 @@
          .long local_label(misc_ref_invalid) /* 0e misc  */
          .long local_label(misc_ref_u32) /* 0f single_float  */
-        /* 10-1f  */
+         /* 10-1f  */
          .long local_label(misc_ref_invalid) /* 10 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 11 cons  */
@@ -2721,5 +6049,5 @@
          .long local_label(misc_ref_invalid) /* 1e misc  */
          .long local_label(misc_ref_u32) /* 1f macptr  */
-        /* 20-2f  */
+         /* 20-2f  */
          .long local_label(misc_ref_invalid) /* 20 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 21 cons  */
@@ -2738,5 +6066,5 @@
          .long local_label(misc_ref_invalid) /* 2e misc  */
          .long local_label(misc_ref_u32) /* 2f code_vector  */
-        /* 30-3f  */
+         /* 30-3f  */
          .long local_label(misc_ref_invalid) /* 30 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 31 cons  */
@@ -2755,5 +6083,5 @@
          .long local_label(misc_ref_invalid) /* 3e misc  */
          .long local_label(misc_ref_u32) /* 3f xcode_vector  */
-        /* 40-4f  */
+         /* 40-4f  */
          .long local_label(misc_ref_invalid) /* 40 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 41 cons  */
@@ -2772,5 +6100,5 @@
          .long local_label(misc_ref_invalid) /* 4e misc  */
          .long local_label(misc_ref_invalid) /* 4f immheader  */
-        /* 50-5f  */
+         /* 50-5f  */
          .long local_label(misc_ref_invalid) /* 50 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 51 cons  */
@@ -2789,5 +6117,5 @@
          .long local_label(misc_ref_invalid) /* 5e misc  */
          .long local_label(misc_ref_invalid) /* 5f immheader  */
-        /* 60-6f  */
+         /* 60-6f  */
          .long local_label(misc_ref_invalid) /* 60 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 61 cons  */
@@ -2806,5 +6134,5 @@
          .long local_label(misc_ref_invalid) /* 6e misc  */
          .long local_label(misc_ref_invalid) /* 6f immheader  */
-        /* 70-7f  */
+         /* 70-7f  */
          .long local_label(misc_ref_invalid) /* 70 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 71 cons  */
@@ -2823,5 +6151,5 @@
          .long local_label(misc_ref_invalid) /* 7e misc  */
          .long local_label(misc_ref_invalid) /* 7f immheader  */
-        /* 80-8f  */
+         /* 80-8f  */
          .long local_label(misc_ref_invalid) /* 80 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 81 cons  */
@@ -2840,5 +6168,5 @@
          .long local_label(misc_ref_invalid) /* 8e misc  */
          .long local_label(misc_ref_invalid) /* 8f immheader  */
-        /* 90-9f  */
+         /* 90-9f  */
          .long local_label(misc_ref_invalid) /* 90 even_fixnum  */
          .long local_label(misc_ref_invalid) /* 91 cons  */
@@ -2857,5 +6185,5 @@
          .long local_label(misc_ref_invalid) /* 9e misc  */
          .long local_label(misc_ref_invalid) /* 9f immheader  */
-        /* a0-af  */
+         /* a0-af  */
          .long local_label(misc_ref_invalid) /* a0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* a1 cons  */
@@ -2874,5 +6202,5 @@
          .long local_label(misc_ref_invalid) /* ae misc  */
          .long local_label(misc_ref_u32) /* af u32  */
-        /* b0-bf  */
+         /* b0-bf  */
          .long local_label(misc_ref_invalid) /* b0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* b1 cons  */
@@ -2891,5 +6219,5 @@
          .long local_label(misc_ref_invalid) /* be misc  */
          .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector  */
-        /* c0-cf  */
+         /* c0-cf  */
          .long local_label(misc_ref_invalid) /* c0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* c1 cons  */
@@ -2908,5 +6236,5 @@
          .long local_label(misc_ref_invalid) /* ce misc  */
          .long local_label(misc_ref_u8) /* cf u8  */
-        /* d0-df  */
+         /* d0-df  */
          .long local_label(misc_ref_invalid) /* d0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* d1 cons  */
@@ -2925,5 +6253,5 @@
          .long local_label(misc_ref_invalid) /* de misc  */
          .long local_label(misc_ref_old_string) /* df (old)subtag_simple_base_string  */
-        /* e0-ef  */
+         /* e0-ef  */
          .long local_label(misc_ref_invalid) /* e0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* e1 cons  */
@@ -2942,5 +6270,5 @@
          .long local_label(misc_ref_invalid) /* ee misc  */
          .long local_label(misc_ref_s16) /* ef s16  */
-        /* f0-ff  */
+         /* f0-ff  */
          .long local_label(misc_ref_invalid) /* f0 even_fixnum  */
          .long local_label(misc_ref_invalid) /* f1 cons  */
@@ -2960,4108 +6288,92 @@
          .long local_label(misc_ref_bit_vector) /* ff bit_vector  */
                 
-local_label(misc_ref_node):         
-	 /* A node vector.  */
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(ldrx(arg_z,arg_y,imm0))
-	 __(bx lr)
-local_label(misc_ref_single_float_vector):        
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(mov imm1,#single_float_header)
-	 __(ldrx(imm0,arg_y,imm0))
-	 __(Misc_Alloc_Fixed(arg_z,imm1,single_float.size))
-	 __(str(imm0,single_float.value(arg_z)))
-	 __(bx lr)
-local_label(misc_ref_new_string):        
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(ldrx(imm0,arg_y,imm0))
-         __(slwi arg_z,imm0,charcode_shift)
-         __(ori arg_z,arg_z,subtag_character)
+ local_label(misc_ref_node):        
+ 	/* A node vector.  */
+ 	__(add imm0,arg_z,#misc_data_offset)
+ 	__(ldr  arg_z,[arg_y,imm0])
+ 	__(bx lr)
+ local_label(misc_ref_single_float_vector):        
+ 	__(add imm0,arg_z,misc_data_offset)
+ 	__(movc16(imm1,single_float_header))
+ 	__(ldr imm0,[arg_y,imm0])
+ 	__(Misc_Alloc_Fixed(arg_z,imm1,single_float.size))
+ 	__(str imm0,[arg_z,#single_float.value])
+ 	__(bx lr)
+ local_label(misc_ref_new_string):        
+ 	__(add imm0,arg_z,#misc_data_offset)
+ 	__(ldr imm0,[arg_y,imm0])
+         __(mov arg_z,imm0,lsl #charcode_shift)
+         __(orr arg_z,arg_z,#subtag_character)
          __(bx lr)
-local_label(misc_ref_s32):        
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(ldrx(imm0,arg_y,imm0))
+ local_label(misc_ref_s32):        
+ 	__(add imm0,arg_z,#misc_data_offset)
+ 	__(ldr imm0,[arg_y,imm0])
          __(b _SPmakes32)
-local_label(misc_ref_fixnum_vector):    
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(ldrx(imm0,arg_y,imm0))
+ local_label(misc_ref_fixnum_vector):    
+ 	__(add imm0,arg_z,#misc_data_offset)
+ 	__(ldr imm0,[arg_y,imm0])
          __(box_fixnum(arg_z,imm0))
          __(bx lr)        
-local_label(misc_ref_u32):        
-	 __(addi imm0,arg_z,misc_data_offset)
-	 __(ldrx(imm0,arg_y,imm0))
+ local_label(misc_ref_u32):        
+ 	__(add imm0,arg_z,#misc_data_offset)
+ 	__(ldr imm0,[arg_y,imm0])
          __(b _SPmakeu32)
-local_label(misc_ref_double_float_vector):      
-         __(slwi imm0,arg_z,1)
-	 __(la imm0,misc_dfloat_offset(imm0))
-         __(lfdx f0,arg_y,imm0)
-	 __(mov imm2,#double_float_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,double_float.size))
-	 __(stfd f0,double_float.value(arg_z))
-	 __(bx lr)
-local_label(misc_ref_bit_vector):       
-	 __(extrwi imm1,arg_z,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
-	 __(la imm1,1+fixnumshift(imm1))
-	 __(rlwinm imm0,arg_z,32-5,5,31-fixnumshift)
-	 __(la imm0,misc_data_offset(imm0))
-	 __(ldrx(imm0,arg_y,imm0))
-	 __(rlwnm arg_z,imm0,imm1,31-fixnumshift,31-fixnumshift)
-	 __(bx lr)
-local_label(misc_ref_s8):       
-         __(srwi imm0,arg_z,2)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
-         __(extsb imm0,imm0)
+ local_label(misc_ref_double_float_vector):      
+         __(mov imm0,arg_z,lsl #1)
+ 	__(add imm0,imm0,#misc_dfloat_offset)
+         __(ldrd imm0,imm1,[arg_y,imm0])
+ 	__(movc16(imm2,double_float_header))
+ 	__(Misc_Alloc_Fixed(arg_z,imm2,double_float.size))
+ 	__(strd imm0,imm1,[arg_z,#double_float.value])
+ 	__(bx lr)
+ local_label(misc_ref_bit_vector):
+         __(mov imm1,#nbits_in_word-1)
+         __(and imm1,imm1,arg_z,lsr #2)
+         __(mov imm2,#1)
+         __(mov imm2,imm2,lsl imm1)
+         __(mov imm0,arg_z,lsr #5+fixnumshift)
+         __(mov imm0,imm0,lsl #2)
+         __(add imm0,imm0,#misc_data_offset)
+         __(mov arg_z,#0)
+         __(ldr imm0,[arg_y,imm0])
+         __(tst imm0,imm2)
+         __(addne arg_z,arg_z,#fixnumone)
+ 	__(bx lr)
+ local_label(misc_ref_s8):       
+         __(mov imm0,arg_z,lsr #2)
+         __(add imm0,imm0,#misc_data_offset)
+         __(ldsb imm0,[arg_y,imm0])
          __(box_fixnum(arg_z,imm0))
          __(bx lr)
-local_label(misc_ref_u8):       
-         __(srwi imm0,arg_z,2)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
+ local_label(misc_ref_u8):       
+         __(mov imm0,arg_z,lsr #2)
+         __(add imm0,imm0,#misc_data_offset)
+         __(ldrb imm0,[arg_y,imm0])
          __(box_fixnum(arg_z,imm0))
          __(bx lr)
-local_label(misc_ref_old_string):           
-         __(srwi imm0,arg_z,2)
-         __(la imm0,misc_data_offset(imm0))
-         __(lbzx imm0,arg_y,imm0)
-	 __(slwi arg_z,imm0,charcode_shift)
-	 __(ori arg_z,arg_z,subtag_character)
-	 __(bx lr)
-local_label(misc_ref_u16):              
-         __(srwi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lhzx imm0,arg_y,imm0)
+ local_label(misc_ref_old_string):          
+         __(mov imm0,arg_z,lsr #2)
+         __(add imm0,imm0,#misc_data_offset)
+         __(ldrb imm0,[arg_y,imm0])
+ 	__(mov arg_z,imm0,lsl #charcode_shift)
+ 	__(orr arg_z,arg_z,#subtag_character)
+         __(bx lr)
+ local_label(misc_ref_u16):        
+         __(mov imm0,arg_z,lsr #1)     
+         __(add imm0,imm0,#misc_data_offset)
+         __(ldrh imm0,[arg_y,imm0])
          __(box_fixnum(arg_z,imm0))
          __(bx lr)
-local_label(misc_ref_s16):              
-         __(srwi imm0,arg_z,1)
-         __(la imm0,misc_data_offset(imm0))
-         __(lhax imm0,arg_y,imm0)
+ local_label(misc_ref_s16):             
+         __(mov imm0,arg_z,lsr #1)     
+         __(add imm0,imm0,#misc_data_offset)
+         __(ldrsh imm0,[arg_y,imm0])
          __(box_fixnum(arg_z,imm0))
          __(bx lr)
-local_label(misc_ref_invalid):
+ local_label(misc_ref_invalid):
          __(mov arg_x,#XBADVEC)
          __(set_nargs(3))
          __(b _SPksignalerr)        
-
-        __endif
-        
-/* like misc_ref, only the boxed subtag is in arg_x.  */
-
-_spentry(subtag_misc_ref)
-	__(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))
-        __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
-	__(vector_length(imm0,arg_y,imm1))
-	__(trlge(arg_z,imm0))
-	__(unbox_fixnum(imm1,arg_x))
-        __(b local_label(misc_ref_common))
-
-_spentry(builtin_aref1)
-	__(extract_typecode(imm0,arg_y))
-	__(cmpri(cr0,imm0,min_vector_subtag))
-	__(box_fixnum(arg_x,imm0))
-	__(bgt cr0,_SPsubtag_misc_ref)
-	__(jump_builtin(_builtin_aref1,2))
-        	
-	
-/* Make a cons cell on the vstack.  Always push 3 words, 'cause we're   */
-/* not sure how the vstack will be aligned.  */
-_spentry(stkconsyz)
-	__(mov imm0,#nil_value)
-	__(vpush1(imm0))
-	__(vpush1(imm0))
-	__(vpush1(imm0))
-	__(andi. imm0,vsp,1<<word_shift) /* (oddp vsp ?)  */
-	__(beq cr0,1f)
-	__(str(arg_y,node_size*2(vsp))) /* car  */
-	__(str(arg_z,node_size(vsp))) /* cdr  */
-	__(la arg_z,fulltag_cons+node_size(vsp))
-	__(bx lr)
-1:
-	__(str(arg_y,node_size(vsp))) /* car, again  */
-	__(str(arg_z,0(vsp)))
-	__(la arg_z,fulltag_cons(vsp))
-	__(bx lr)
-
-/* Make a stack-consed value cell.  Much like the case of */
-/* stack-allocating a cons cell.  Imm0 points to the closed-over value */
-/* (already vpushed).  Replace that locative with the vcell.  */
-_spentry(stkvcell0)
-	__(sub imm1,imm0,vsp) /* imm1 = delta from vsp to value cell loc  */
-	__(mov arg_z,#nil_value)
-	__(vpush1(arg_z))
-	__(vpush1(arg_z))
-	__(vpush1(arg_z))
-	__(addi imm1,imm1,node_size*3)
-	__(add imm0,vsp,imm1) /* in case stack overflowed  */
-	__(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
-	__(mov imm1,#value_cell_header)
-	__(ldr arg_z,[imm0,#0])
-	__(beq cr0,1f)
-	__(str(arg_z,node_size*2(vsp)))
-	__(str(imm1,node_size(vsp)))
-	__(la arg_z,fulltag_misc+node_size(vsp))
-	__(str(arg_z,0(imm0)))
-	__(bx lr)
-1:
-	__(str(arg_z,node_size(vsp)))
-	__(str(imm1,0(vsp)))
-	__(la arg_z,fulltag_misc(vsp))
-	__(str(arg_z,0(imm0)))
-	__(bx lr)
-
-        
-_spentry(stkvcellvsp)      
-	__(mov arg_z,#nil_value)
-	__(vpush1(arg_z))
-	__(vpush1(arg_z))
-	__(vpush1(arg_z))
-	__(mov imm1,#node_size*3)
-	__(add imm0,vsp,imm1) /* in case stack overflowed  */
-	__(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
-	__(mov imm1,#value_cell_header)
-	__(ldr arg_z,[imm0,#0])
-	__(beq cr0,1f)
-	__(str(arg_z,node_size*2(vsp)))
-	__(str(imm1,node_size(vsp)))
-	__(la arg_z,fulltag_misc+node_size(vsp))
-	__(str(arg_z,0(imm0)))
-	__(bx lr)
-1:
-	__(str(arg_z,node_size(vsp)))
-	__(str(imm1,0(vsp)))
-	__(la arg_z,fulltag_misc(vsp))
-	__(str(arg_z,0(imm0)))
-	__(bx lr)
-
-/* Make a "raw" area on the temp stack, stack-cons a macptr to point to it,  */
-/* and return the macptr.  Size (in bytes, boxed) is in arg_z on entry; macptr */
-/* in arg_z on exit.  */
-_spentry(makestackblock)
-	__(unbox_fixnum(imm0,arg_z))
-        __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size))
-	__(cmplri(cr0,imm0,tstack_alloc_limit))
-	__(bge cr0,1f)
-	__(TSP_Alloc_Var_Unboxed(imm0))
-	__(mov imm0,#macptr_header)
-	__(la imm1,tsp_frame.data_offset+macptr.size(tsp))
-	__(str(imm0,tsp_frame.data_offset(tsp)))
-	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
-	__(str(imm1,macptr.address(arg_z)))
-        __ifdef(`PPC64')
-         __(std rzero,macptr.domain(arg_z))
-         __(std rzero,macptr.type(arg_z))
-        __else
-	 __(stfd fp_zero,macptr.domain(arg_z))
-        __endif
-	__(bx lr)
-
-        /* Too big. Heap cons a gcable macptr  */
-1:
-	__(TSP_Alloc_Fixed_Unboxed(0))
-	__(set_nargs(1))
-	__(mov fname,#nrs.new_gcable_ptr)
-	__(jump_fname())
-
-/* As above, only set the block's contents to 0.  */
-_spentry(makestackblock0)
-	__(unbox_fixnum(imm0,arg_z))
-        __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size))
-	__(cmplri(cr0,imm0,tstack_alloc_limit))
-	__(bge cr0,3f)
-	__(TSP_Alloc_Var_Unboxed(imm0))
-	__(Zero_TSP_Frame(imm0,imm1))
-	__(mov imm0,#macptr_header)
-	__(la imm1,tsp_frame.data_offset+macptr.size(tsp))
-	__(str(imm0,tsp_frame.data_offset(tsp)))
-	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
-	__(str(imm1,macptr.address(arg_z))) /* makestackblock0 expects the address to be in imm1  */
-	__(stfd fp_zero,macptr.domain(arg_z))
-	__(bx lr)
-
-        /* Too big. Heap cons a gcable macptr  */
-3:
-	__(TSP_Alloc_Fixed_Unboxed(0)) /* "raw" block to make the compiler happy  */
-
-	__(mov arg_y,arg_z) /* save block size  */
-	__(mov arg_z,#t_value) /* clear-p arg to %new-gcable-ptr  */
-	__(set_nargs(2))
-	__(mov fname,#nrs.new_gcable_ptr)
-	__(jump_fname())
-
-/* Make a list of length arg_y (boxed), initial-element arg_z (boxed) on  */
-/* the tstack.  Return the list in arg_z.  */
-_spentry(makestacklist)
-	__(add imm0,arg_y,arg_y)
-	__(cmplri(cr1,imm0,((tstack_alloc_limit+1)-cons.size)))
-	__(addi imm0,imm0,tsp_frame.fixed_overhead)
-	__(bge cr1,3f)
-	__(TSP_Alloc_Var_Boxed(imm0,imm1))
-	__(mov imm1,arg_y)
-	__(cmpri(cr1,imm1,0))
-	__(mov arg_y,arg_z)
-	__(mov arg_z,#nil_value)
-	__(ldr imm2,[tsp,#tsp_frame.backlink])
-	__(la imm2,-tsp_frame.fixed_overhead+fulltag_cons(imm2))
-	__(b 2f)
-1:
-	__(subi imm1,imm1,fixnum1)
-	__(cmpri(cr1,imm1,0))
-	__(_rplacd(imm2,arg_z))
-	__(_rplaca(imm2,arg_y))
-	__(mov arg_z,imm2)
-	__(subi imm2,imm2,cons.size)
-2:
-	__(bne cr1,1b)
-	__(bx lr)
-
-3:
-	__(cmpri(cr1,arg_y,0))
-	__(TSP_Alloc_Fixed_Boxed(0))  /* make the compiler happy  */
-	__(mov imm1,arg_y) /* count  */
-	__(mov arg_y,arg_z) /* initial value  */
-	__(mov arg_z,#nil_value) /* result  */
-	__(b 5f)
-4:
-	__(subi imm1,imm1,fixnum1)
-	__(cmpri(cr1,imm1,0))
-	__(Cons(arg_z,arg_y,arg_z))
-5:
-	__(bne cr1,4b)
-	__(bx lr)
-
-/* subtype (boxed) vpushed before initial values. (Had better be a  */
-/* node header subtag.) Nargs set to count of things vpushed.  */
-
-_spentry(stkgvector)
-	__(la imm0,-fixnum_one(nargs))
-	__(cmpri(cr1,imm0,0))
-	__(add imm1,vsp,nargs)
-	__(ldru(temp0,-node_size(imm1)))
-	__(slri(imm2,imm0,num_subtag_bits-fixnumshift))
-        __ifdef(`PPC64')
-         __(unbox_fixnum(imm3,temp0))
-         __(or imm2,imm3,imm2)
-        __else
-	 __(rlwimi imm2,temp0,32-fixnumshift,32-num_subtag_bits,31)
-        __endif
-        __(dnode_align(imm0,imm0,node_size+tsp_frame.fixed_overhead))
-	__(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
-	__(str(imm2,tsp_frame.data_offset(tsp)))
-	__(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
-	__(la imm3,misc_header_offset(arg_z))
-	__(mov imm0,#fixnum1)
-	__(b 2f)
-1:
-	__(addi imm0,imm0,fixnum1)
-	__(cmpr(cr1,imm0,nargs))
-	__(ldru(temp0,-node_size(imm1)))
-	__(stru(temp0,node_size(imm3)))
-2:
-	__(bne cr1,1b)
-	__(add vsp,vsp,nargs)
-	__(bx lr)
-
-/* Allocate a "fulltag_misc" object.  On entry, arg_y contains the element  */
-/* count (boxed) and  arg_z contains the subtag (boxed).  Both of these   */
-/* parameters must be "reasonable" (the  subtag must be valid, the element  */
-/* count must be of type (unsigned-byte 24)/(unsigned-byte 56).   */
-/* On exit, arg_z contains the (properly tagged) misc object; it'll have a  */
-/* proper header on it and its contents will be 0.   imm0 contains   */
-/* the object's header (fulltag = fulltag_immheader or fulltag_nodeheader.)  */
-/* This is intended for things like "make-array" and "%make-bignum" and the   */
-/* like.  Things that involve creating small objects of known size can usually  */
-/* do so inline with less hair.  */
-
-/* If this has to go out-of-line (to GC or whatever), it should do so via a   */
-/* trap (or should otherwise ensure that both the LR and CTR are preserved   */
-/* where the GC can find them.)  */
-
-
-_spentry(misc_alloc)
-        __ifdef(`PPC64')
-         __(extract_unsigned_byte_bits_(imm2,arg_y,56))
-         __(unbox_fixnum(imm0,arg_z))
-         __(sldi imm2,arg_y,num_subtag_bits-fixnumshift)
-         __(clrldi imm1,imm0,64-nlowtagbits)
-         __(or imm0,imm2,imm0)
-         __(extract_fulltag(imm2,imm0))
-         __(cmpdi cr1,imm1,lowtag_nodeheader)
-         __(cmpdi cr2,imm2,ivector_class_64_bit)
-         __(bne- cr0,9f)
-         __(cmpdi cr3,imm2,ivector_class_32_bit)
-         __(cmpdi cr4,imm2,ivector_class_8_bit)
-         __(mov imm2,arg_y)
-         __(cmpdi cr5,imm1,subtag_bit_vector)
-         __(beq cr1,1f)
-         __(beq cr2,1f)
-         __(srdi imm2,imm2,1)
-         __(beq cr3,1f)
-         __(beq cr5,2f)
-         __(srdi imm2,imm2,1)
-         __(bne cr4,1f)
-         __(srdi imm2,imm2,1)
-/* imm2 now = byte count.  Add 8 for header, 15 to align, then clear */
-/* low four bits. */
-1:
-         __(dnode_align(imm2,imm2,node_size))
-
-	 __(Misc_Alloc(arg_z,imm0,imm2))
-	 __(bx lr)
-2:      /* bit-vector case  */
-         __(addi imm2,arg_y,7<<fixnumshift)
-         __(srdi imm2,imm2,3+fixnumshift)
-         __(b 1b)
-9:                      
-	 __(uuo_interr(error_object_not_unsigned_byte_56,arg_y))
-        __else
-	 __(extract_unsigned_byte_bits_(imm2,arg_y,24))
-	 __(unbox_fixnum(imm0,arg_z))
-	 __(extract_fulltag(imm1,imm0))
-	 __(bne- cr0,9f)
-	 __(cmpri(cr0,imm1,fulltag_nodeheader))
-	 __(mov imm3,imm0)
-	 __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))
-	 __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits	)/* imm0 now = header  */
-	 __(mov imm2,arg_y)
-	 __(beq cr0,1f)	/* do probe if node object (fixnum element count = byte count).  */
-	 __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))
-	 __(bng cr1,1f)	/* do probe if 32-bit imm object  */
-	 __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))
-	 __(srwi imm2,imm2,1)
-	 __(bgt cr0,2f)
-	 __(bgt cr1,1f)
-	 __(srwi imm2,imm2,1)
-        /* imm2 now = byte count.  Add 4 for header, 7 to align, then clear */
-        /* low three bits.  */
-1:
-         __(dnode_align(imm2,imm2,node_size))
-
-	 __(Misc_Alloc(arg_z,imm0,imm2))
-	 __(bx lr)
-2:
-	 __(cmplri(imm3,subtag_double_float_vector))
-	 __(slwi imm2,arg_y,1)
-	 __(beq 1b)
-	 __(addi imm2,arg_y,7<<fixnumshift)
-	 __(srwi imm2,imm2,fixnumshift+3)
-	 __(b 1b)
-9:
-	 __(uuo_interr(error_object_not_unsigned_byte_24,arg_y))
-        __endif
-        
-/* almost exactly as above, but "swap exception handling info" */
-/* on exit and return  */
-/* Deprecated */        
-_spentry(poweropen_ffcallX)
-        .long 0x7c800008        /* debug trap */
-
-
-/* Destructuring-bind, macro-bind.  */
-   
-/* OK to use arg_x, arg_y for whatever (tagged) purpose;  */
-/* likewise immX regs.  */
-/* arg_z preserved, nothing else in particular defined on exit.  */
-/* nargs contains req count (0-255) in PPC bits mask_req_start/mask_req_width,  */
-/* opt count (0-255) in PPC bits mask_opt_start/mask_opt_width,  */
-/* key count (0-255) in PPC bits mask_key_start/mask_key_width,  */
-/* opt-supplied-p flag in PPC bit mask_initopt,  */
-/* keyp flag in PPC bit mask_keyp,  */
-/* &allow-other-keys flag in PPC bit mask_aok,  */
-/* &rest flag in PPC bit mask_restp.  */
-/* When mask_keyp bit is set, keyvect contains vector of keyword symbols,  */
-/* length key count.  */
-
-_spentry(macro_bind)
-        __ifdef(`PPC64')
- 	 __(mov whole_reg,arg_reg)
-	 __(extract_fulltag(imm0,arg_reg))
-         __(cmpri(cr1,arg_reg,nil_value))
-	 __(cmpri(cr0,imm0,fulltag_cons))
-         __(beq cr1,0f)
-	 __(bne- cr0,1f)
-0:             
-	 __(_cdr(arg_reg,arg_reg))
-	 __(b local_label(destbind1))
-        __else
-	 __(mov whole_reg,arg_reg)
-	 __(extract_lisptag(imm0,arg_reg))
-	 __(cmpri(cr0,imm0,tag_list))
-	 __(bne- cr0,1f)
-	 __(_cdr(arg_reg,arg_reg))
-	 __(b (local_label(destbind1)))
-        __endif
-1:
-	__(mov arg_y,#XCALLNOMATCH)
-	__(mov arg_z,whole_reg)
-	__(set_nargs(2))
-	__(b _SPksignalerr)
-
-
-_spentry(destructuring_bind)
-	__(mov whole_reg,arg_reg)
-        __(b local_label(destbind1))
-	
-_spentry(destructuring_bind_inner)
-	__(mov whole_reg,arg_z)
-local_label(destbind1): 
-	/* Extract required arg count.  */
-	/* A bug in gas: can't handle shift count of "32" (= 0  */
-	ifelse(eval(mask_req_width+mask_req_start),eval(32),`
-	__(clrlwi. imm0,nargs,mask_req_start)
-	',`
-	__(extrwi. imm0,nargs,mask_req_width,mask_req_start)
-	')
-	__(extrwi imm1,nargs,mask_opt_width,mask_opt_start)
-	__(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)
-	__(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)
-	__(cmpri(cr4,imm4,0))
-	__(rlwinm imm4,nargs,0,mask_restp,mask_restp)
-	__(cmpri(cr5,imm4,0))
-	__(cmpri(cr1,imm1,0))
-	__(cmpri(cr2,imm2,0))
-	/* Save entry vsp in case of error.  */
-	__(mov imm4,vsp)
-	__(beq cr0,2f)
-1:
-	__(cmpri(cr7,arg_reg,nil_value))
-        __ifdef(`PPC64')
-         __(extract_fulltag(imm3,arg_reg))
-         __(cmpri(cr3,imm3,fulltag_cons))
-        __else       
-	 __(extract_lisptag(imm3,arg_reg))
-	 __(cmpri(cr3,imm3,tag_list))
-        __endif
-	__(subi imm0,imm0,1)
-	__(cmpri(cr0,imm0,0))
-	__(beq cr7,toofew)
-	__(bne cr3,badlist)
-	__(ldr arg_x,[arg_reg,#cons.car])
-	__(ldr arg_reg,[arg_reg,#cons.cdr])
-	__(vpush1(arg_x))
-	__(bne cr0,1b)
-2:
-	__(beq cr1,rest_keys)
-	__(bne cr2,opt_supp)
-	/* 'simple' &optionals:	 no supplied-p, default to nil.  */
-simple_opt_loop:
-	__(cmpri(cr0,arg_reg,nil_value))
-        __ifdef(`PPC64')
-         __(extract_fulltag(imm3,arg_reg))
-         __(cmpri(cr3,imm3,fulltag_cons))
-        __else
-	 __(extract_lisptag(imm3,arg_reg))
-	 __(cmpri(cr3,imm3,tag_list))
-        __endif
-	__(subi imm1,imm1,1)
-	__(cmpri(cr1,imm1,0))
-	__(mov imm5,#nil_value)
-	__(beq cr0,default_simple_opt)
-	__(bne cr3,badlist)
-	__(ldr arg_x,[arg_reg,#cons.car])
-	__(ldr arg_reg,[arg_reg,#cons.cdr])
-	__(vpush1(arg_x))
-	__(bne cr1,simple_opt_loop)
-	__(b rest_keys)
-default_simple_opt_loop:
-	__(subi imm1,imm1,1)
-	__(cmpri(cr1,imm1,0))
-default_simple_opt:
-	__(vpush1(imm5))
-	__(bne cr1,default_simple_opt_loop)
-	__(b rest_keys)
-	/* Provide supplied-p vars for the &optionals.  */
-opt_supp:
-	__(mov arg_y,#t_value)
-opt_supp_loop:
-	__(cmpri(cr0,arg_reg,nil_value))
-        __ifdef(`PPC64')
-         __(extract_fulltag(imm3,arg_reg))
-         __(cmpri(cr3,imm3,fulltag_cons))
-        __else        
-	 __(extract_lisptag(imm3,arg_reg))
-	 __(cmpri(cr3,imm3,tag_list))
-        __endif
-	__(subi imm1,imm1,1)
-	__(cmpri(cr1,imm1,0))
-	__(beq cr0,default_hard_opt)
-	__(bne cr3,badlist)
-	__(ldr arg_x,[arg_reg,#cons.car])
-	__(ldr arg_reg,[arg_reg,#cons.cdr])
-	__(vpush1(arg_x))
-	__(vpush1(arg_y))
-	__(bne cr1,opt_supp_loop)
-	__(b rest_keys)
-default_hard_opt_loop:
-	__(subi imm1,imm1,1)
-	__(cmpri(cr1,imm1,0))
-default_hard_opt:
-	__(vpush1(imm5))
-	__(vpush1(imm5))
-	__(bne cr1,default_hard_opt_loop)
-rest_keys:
-	__(cmpri(cr0,arg_reg,nil_value))
-	__(bne cr5,have_rest)
-	__(bne cr4,have_keys)
-	__(bne cr0,toomany)
-	__(bx lr)
-have_rest:
-	__(vpush1(arg_reg))
-	__(beqlr cr4)
-have_keys:
-	/* Ensure that arg_reg contains a proper,even-length list.  */
-	/* Insist that its length is <= 512 (as a cheap circularity check.)  */
-	__(mov imm0,#256)
-	__(mov arg_x,arg_reg)
-count_keys_loop:
-        __ifdef(`PPC64')
-         __(extract_fulltag(imm3,arg_x))
-         __(cmpri(cr3,imm3,fulltag_cons))
-        __else
-	 __(extract_lisptag(imm3,arg_x))
-	 __(cmpri(cr3,imm3,tag_list))
-        __endif
-	__(cmpri(cr0,arg_x,nil_value))
-	__(subi imm0,imm0,1)
-	__(cmpri(cr4,imm0,0))
-	__(beq cr0,counted_keys)
-	__(bne cr3,badlist)
-	__(ldr arg_x,[arg_x,#cons.cdr])
-        __ifdef(`PPC64')
-         __(extract_fulltag(imm3,arg_x))
-         __(cmpri(cr3,imm3,fulltag_cons))
-        __else
-	 __(extract_lisptag(imm3,arg_x))
-	 __(cmpri(cr3,imm3,tag_list))
-        __endif
-	__(blt cr4,toomany)
-	__(cmpri(cr0,arg_x,nil_value))
-	__(beq cr0,db_badkeys)
-	__(bne cr3,badlist)
-	__(ldr arg_x,[arg_x,#cons.cdr])
-	__(b count_keys_loop)
-counted_keys:
-	/* We've got a proper, even-length list of key/value pairs in */
-	/* arg_reg. For each keyword var in the lambda-list, push a pair */
-	/* of NILs on the vstack.  */
-	__(extrwi. imm0,nargs,mask_key_width,mask_key_start )
-	__(mov imm2,imm0) 	/* save number of keys  */
-	__(mov imm5,#nil_value)
-	__(b push_pair_test)
-push_pair_loop:
-	__(cmpri(cr0,imm0,1))
-	__(subi imm0,imm0,1)
-	__(vpush1(imm5))
-	__(vpush1(imm5))
-push_pair_test:
-	__(bne cr0,push_pair_loop)
-	__(slwi imm2,imm2,dnode_shift)  /* pairs -> bytes  */
-	__(add imm2,vsp,imm2)		/* imm2 points below pairs  */
-	__(mov imm0,#0)			/* count unknown keywords so far  */
-	__(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed  */
-	__(extrwi nargs,nargs,mask_key_width,mask_key_start)
-	/* Now, for each keyword/value pair in the list  */
-	/*  a) if the keyword is found in the keyword vector, set the  */
-	/*     corresponding entry on the vstack to the value and the  */
-	/*     associated supplied-p var to T.  */
-	/*  b) Regardless of whether or not the keyword is found,  */
-        /*     if :ALLOW-OTHER-KEYS is provided with a non-nil value, */
-	/*     set the low bit of imm1 to indicate that unknown keywords  */
-	/*     are acceptable. (This bit is pre-set above to the value */
-        /*     the encoded value of &allow_other_keys.) */
-	/*  c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment  */
-	/*     the count of unknown keywords in the high bits of imm1*/
-	/* At the end of the list, signal an error if any unknown keywords were seen  */
-	/* but not allowed.  Otherwise, return.  */
-
-match_keys_loop:
-	__(cmpri(cr0,arg_reg,nil_value))
-	__(mov imm0,#0)
-	__(mov imm3,#misc_data_offset)
-	__(beq cr0,matched_keys)
-	__(ldr arg_x,[arg_reg,#cons.car])
-	__(mov arg_y,#nrs.kallowotherkeys)
-	__(cmpr(cr3,arg_x,arg_y))	/* :ALLOW-OTHER-KEYS ?  */
-	__(ldr arg_reg,[arg_reg,#cons.cdr])
-	__(ldr arg_y,[arg_reg,#cons.car])
-	__(cmpr(cr4,imm0,nargs))
-	__(ldr arg_reg,[arg_reg,#cons.cdr])
-	__(b match_test)
-match_loop:
-	__(ldrx(temp0,keyvect_reg,imm3))
-	__(cmpr(cr0,arg_x,temp0))
-	__(addi imm0,imm0,1)
-	__(cmpr(cr4,imm0,nargs))
-	__(addi imm3,imm3,node_size)
-	__(bne cr0,match_test)
-	/* Got a hit.  Unless this keyword's been seen already, set it.  */
-	__(slwi imm0,imm0,dnode_shift)
-	__(subf imm0,imm0,imm2)
-	__(ldr temp0,[imm0,#0])
-	__(cmpri(cr0,temp0,nil_value))
-	__(mov temp0,#t_value)
-	__(bne cr0,match_keys_loop)	/* already saw this  */
-	__(str(arg_y,node_size*1(imm0)))
-	__(str(temp0,node_size*0(imm0)))
-        __(bne cr3,match_keys_loop)
-	__(b match_keys_check_aok)
-match_test:
-	__(bne cr4,match_loop)
-        __(beq cr3,match_keys_check_aok)
-        __(addi imm1,imm1,node_size)
-        __(b match_keys_loop)
-match_keys_check_aok:
-        __(andi. imm0,imm1,2)  /* check "seen-aok" bit in imm1 */
-        __(cmpri cr1,arg_y,nil_value) /* check value */
-        __(ori imm1,imm1,2)
-        __(bne cr0,match_keys_loop) /* duplicate aok */
-        __(beq cr1,match_keys_loop)
-        __(ori imm1,imm1,1)
-	__(b match_keys_loop)
-matched_keys:
-        __(clrrwi. imm0,imm1,2)
-        __(beqlr)
-        __(andi. imm1,imm1,1)
-        __(bnelr)
-	/* Some unrecognized keywords.  Complain generically about  */
-	/* invalid keywords.  */
-db_badkeys:
-	__(mov arg_y,#XBADKEYS)
-	__(b destructure_error)
-toomany:
-	__(mov arg_y,#XCALLTOOMANY)
-	__(b destructure_error)
-toofew:
-	__(mov arg_y,#XCALLTOOFEW)
-	__(b destructure_error)
-badlist:
-	__(mov arg_y,#XCALLNOMATCH)
-	/* b destructure_error  */
-destructure_error:
-	__(mov vsp,imm4)		/* undo everything done to the stack  */
-	__(mov arg_z,whole_reg)
-	__(set_nargs(2))
-	__(b _SPksignalerr)
-        
-/* vpush the values in the value set atop the vsp, incrementing nargs.  */
-/* Discard the tsp frame; leave values atop the vsp.  */
-
-_spentry(recover_values)
-
-/* First, walk the segments reversing the pointer to previous segment pointers  */
-/* Can tell the end because that previous segment pointer is the prev tsp pointer  */
-	__(ldr imm0,[tsp,#tsp_frame.backlink]) /* previous tsp  */
-	__(mov imm1,tsp) /* current segment  */
-	__(mov imm2,tsp) /* last segment  */
-local_label(walkloop):
-	__(ldr imm3,[imm1,#tsp_frame.fixed_overhead+node_size]) /* next segment  */
-	__(cmpr(cr0,imm0,imm3)) /* last segment?  */
-	__(str(imm2,tsp_frame.fixed_overhead+node_size(imm1))) /* reverse pointer  */
-	__(mov imm2,imm1) /* last segment <- current segment  */
-	__(mov imm1,imm3) /* current segment <- next segment  */
-	__(bne cr0,local_label(walkloop))
-
-        /* the final segment ptr is now in imm2  */
-        /* walk backwards, pushing values on VSP and incrementing NARGS  */
-local_label(pushloop):
-	__(ldr imm0,[imm2,#tsp_frame.data_offset]) /* nargs in segment  */
-	__(cmpri(cr0,imm0,0))
-	__(cmpr(cr1,imm2,tsp))
-	__(la imm3,tsp_frame.data_offset+(2*node_size)(imm2))
-	__(add imm3,imm3,imm0)
-	__(add nargs,nargs,imm0)
-	__(b 2f)
-1:
-	__(ldru(arg_z,-node_size(imm3)))
-	__(cmpri(cr0,imm0,fixnum_one))
-	__(subi imm0,imm0,fixnum_one)
-	__(vpush1(arg_z))
-2:
-	__(bne cr0,1b)
-	__(ldr imm2,[imm2,#tsp_frame.data_offset+node_size]) /* previous segment  */
-	__(bne cr1,local_label(pushloop))
-	__(unlink(tsp))
-	__(bx lr)
-
-	
-/* Go out of line to do this.  Sheesh.  */
-
-_spentry(vpopargregs)
-	__(cmpri(cr0,nargs,0))
-	__(cmpri(cr1,nargs,2<<fixnumshift))
-	__(beqlr cr0)
-	__(beq cr1,local_label(yz))
-	__(blt cr1,local_label(z))
-	__(ldr arg_z,[vsp,#node_size*0])
-	__(ldr arg_y,[vsp,#node_size*1])
-	__(ldr arg_x,[vsp,#node_size*2])
-	__(la vsp,node_size*3(vsp))
-	__(bx lr)
-local_label(yz):
-	__(ldr arg_z,[vsp,#node_size*0])
-	__(ldr arg_y,[vsp,#node_size*1])
-	__(la vsp,node_size*2(vsp))
-	__(bx lr)
-local_label(z):
-	__(ldr arg_z,[vsp,#node_size*0])
-	__(la vsp,node_size*1(vsp))
-	__(bx lr)
-
-/* If arg_z is an integer, return in imm0 something whose sign  */
-/* is the same as arg_z's.  If not an integer, error.  */
-_spentry(integer_sign)
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(cr1,imm0,tag_fixnum))
-	__(cmpri(cr0,imm0,subtag_bignum))
-	__(mov imm0,arg_z)
-	__(beqlr+ cr1)
-	__(bne- cr0,1f)
-	__(getvheader(imm0,arg_z))
-        __ifdef(`PPC64')
-         __(header_size(imm0,imm0))
-         __(sldi imm0,imm0,2)
-        __else
-         __(header_length(imm0,imm0)) /* boxed length = scaled size  */
-        __endif
-        __(addi imm0,imm0,misc_data_offset-4) /* bias, less 1 element  */
-	__(lwzx imm0,arg_z,imm0)
-	__(cmpwi cr0,imm0,0)
-	__(mov imm0,#1)
-	__(bgelr cr0)
-	__(mov imm0,#-1)
-	__(bx lr)
-1:
-	__(uuo_interr(error_object_not_integer,arg_z))
-
-/* like misc_set, only pass the (boxed) subtag in temp0  */
-_spentry(subtag_misc_set)
-	__(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
-	__(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-	__(vector_length(imm0,arg_x,imm1))
-	__(trlge(arg_y,imm0))
-	__(unbox_fixnum(imm1,temp0))
-local_label(misc_set_common):
-        __ifdef(`PPC64')
-         __(slwi imm1,imm1,3)
-         __(mov imm0,#LO(local_label(misc_set_jmp)))
-         __(addis imm0,imm0,HA(local_label(misc_set_jmp)))
-         __(ldx imm0,imm0,imm1)
-         __(mtctr imm0)
-         __(bctr)
-local_label(misc_set_jmp):              
-        /* 00-0f  */
-         .quad local_label(misc_set_invalid) /* 00 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 01 imm_0  */
-         .quad local_label(misc_set_invalid) /* 02 immheader_0  */
-         .quad _SPgvset /* 03 function  */
-         .quad local_label(misc_set_invalid) /* 04 cons  */
-         .quad local_label(misc_set_invalid) /* 05 imm_1  */
-         .quad local_label(misc_set_invalid) /* 06 immheader_1  */
-         .quad _SPgvset /* 07 catch_frame  */
-         .quad local_label(misc_set_invalid) /* 08 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 09 imm_2  */
-         .quad local_label(misc_set_u32) /* 0a code_vector  */
-         .quad _SPgvset /* 0b slot_vector  */
-         .quad local_label(misc_set_invalid) /* 0c misc  */
-         .quad local_label(misc_set_invalid) /* 0d imm3  */
-         .quad local_label(misc_set_invalid) /* 0e immheader_3  */
-         .quad _SPgvset /* 0f ratio  */
-        /* 10-1f  */
-         .quad local_label(misc_set_invalid) /* 10 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 11 imm_0  */
-         .quad local_label(misc_set_invalid) /* 12 immheader_0  */
-         .quad _SPgvset /* 13 symbol_0  */
-         .quad local_label(misc_set_invalid) /* 14 cons  */
-         .quad local_label(misc_set_invalid) /* 15 imm_1  */
-         .quad local_label(misc_set_invalid) /* 16 immheader_1  */
-         .quad _SPgvset /* 17 lisp_tread  */
-         .quad local_label(misc_set_invalid) /* 18 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 19 imm_2  */
-         .quad local_label(misc_set_u32) /* 1a xcode_vector  */
-         .quad _SPgvset /* 1b instance  */
-         .quad local_label(misc_set_invalid) /* 1c misc  */
-         .quad local_label(misc_set_invalid) /* 1d imm3  */
-         .quad local_label(misc_set_u64) /* 1e macptr  */
-         .quad _SPgvset /* 1f complex  */
-        /* 20-2f  */
-         .quad local_label(misc_set_invalid) /* 20 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 21 imm_0  */
-         .quad local_label(misc_set_invalid) /* 22 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 23 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 24 cons  */
-         .quad local_label(misc_set_invalid) /* 25 imm_1  */
-         .quad local_label(misc_set_invalid) /* 26 immheader_1  */
-         .quad _SPgvset /* 27 lock  */
-         .quad local_label(misc_set_invalid) /* 28 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 29 imm_2  */
-         .quad local_label(misc_set_u32) /* 2a bignum  */
-         .quad _SPgvset /* 2b struct  */
-         .quad local_label(misc_set_invalid) /* 2c misc  */
-         .quad local_label(misc_set_invalid) /* 2d imm3  */
-         .quad local_label(misc_set_u64) /* 2e dead_macptr  */
-         .quad local_label(misc_set_invalid) /* 2f nodeheader_3  */
-        /* 30-3f  */
-         .quad local_label(misc_set_invalid) /* 30 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 31 imm_0  */
-         .quad local_label(misc_set_invalid) /* 32 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 33 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 34 cons  */
-         .quad local_label(misc_set_invalid) /* 35 imm_1  */
-         .quad local_label(misc_set_invalid) /* 36 immheader_1  */
-         .quad _SPgvset /* 37 hash_vector  */
-         .quad local_label(misc_set_invalid) /* 38 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 39 imm_2  */
-         .quad local_label(misc_set_u32) /* 3a double_float  */
-         .quad _SPgvset /* 3b istruct  */
-         .quad local_label(misc_set_invalid) /* 3c misc  */
-         .quad local_label(misc_set_invalid) /* 3d imm3  */
-         .quad local_label(misc_set_invalid) /* 3e immheader_3  */
-         .quad local_label(misc_set_invalid) /* 3f nodeheader_3  */
-        /* 40-4f  */
-         .quad local_label(misc_set_invalid) /* 40 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 41 imm_0  */
-         .quad local_label(misc_set_invalid) /* 42 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 43 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 44 cons  */
-         .quad local_label(misc_set_invalid) /* 45 imm_1  */
-         .quad local_label(misc_set_invalid) /* 46 immheader_1  */
-         .quad _SPgvset /* 47 pool  */
-         .quad local_label(misc_set_invalid) /* 48 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 49 imm_2  */
-         .quad local_label(misc_set_invalid) /* 4a immheader_2  */
-         .quad _SPgvset /* 4b value_cell_2  */
-         .quad local_label(misc_set_invalid) /* 4c misc  */
-         .quad local_label(misc_set_invalid) /* 4d imm3  */
-         .quad local_label(misc_set_invalid) /* 4e immheader_3  */
-         .quad local_label(misc_set_invalid) /* 4f nodeheader_3  */
-        /* 50-5f  */
-         .quad local_label(misc_set_invalid) /* 50 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 51 imm_0  */
-         .quad local_label(misc_set_invalid) /* 52 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 53 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 54 cons  */
-         .quad local_label(misc_set_invalid) /* 55 imm_1  */
-         .quad local_label(misc_set_invalid) /* 56 immheader_1  */
-         .quad _SPgvset /* 57 weak  */
-         .quad local_label(misc_set_invalid) /* 58 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 59 imm_2  */
-         .quad local_label(misc_set_invalid) /* 5a immheader_2  */
-         .quad _SPgvset /* 5b xfunction  */
-         .quad local_label(misc_set_invalid) /* 5c misc  */
-         .quad local_label(misc_set_invalid) /* 5d imm3  */
-         .quad local_label(misc_set_invalid) /* 5e immheader_3  */
-         .quad local_label(misc_set_invalid) /* 5f nodeheader_3  */
-        /* 60-6f  */
-         .quad local_label(misc_set_invalid) /* 60 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 61 imm_0  */
-         .quad local_label(misc_set_invalid) /* 62 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 63 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 64 cons  */
-         .quad local_label(misc_set_invalid) /* 65 imm_1  */
-         .quad local_label(misc_set_invalid) /* 66 immheader_1  */
-         .quad _SPgvset /* 67 package  */
-         .quad local_label(misc_set_invalid) /* 68 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 69 imm_2  */
-         .quad local_label(misc_set_invalid) /* 6a immheader_2  */
-         .quad local_label(misc_set_invalid) /* 6b nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* 6c misc  */
-         .quad local_label(misc_set_invalid) /* 6d imm3  */
-         .quad local_label(misc_set_invalid) /* 6e immheader_3  */
-         .quad local_label(misc_set_invalid) /* 6f nodeheader_3  */
-        /* 70-7f  */
-         .quad local_label(misc_set_invalid) /* 70 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 71 imm_0  */
-         .quad local_label(misc_set_invalid) /* 72 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 73 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 74 cons  */
-         .quad local_label(misc_set_invalid) /* 75 imm_1  */
-         .quad local_label(misc_set_invalid) /* 76 immheader_1  */
-         .quad local_label(misc_set_invalid) /* 77 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* 78 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 79 imm_2  */
-         .quad local_label(misc_set_invalid) /* 7a immheader_2  */
-         .quad local_label(misc_set_invalid) /* 7b nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* 7c misc  */
-         .quad local_label(misc_set_invalid) /* 7d imm3  */
-         .quad local_label(misc_set_invalid) /* 7e immheader_3  */
-         .quad local_label(misc_set_invalid) /* 7f nodeheader_3  */
-        /* 80-8f  */
-         .quad local_label(misc_set_invalid) /* 80 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 81 imm_0  */
-         .quad local_label(misc_set_invalid) /* 82 immheader_0  */
-         .quad local_label(misc_set_invalid) /* 83 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 84 cons  */
-         .quad local_label(misc_set_invalid) /* 85 imm_1  */
-         .quad local_label(misc_set_invalid) /* 86 immheader_1  */
-         .quad _SPgvset /* 87 arrayH  */
-         .quad local_label(misc_set_invalid) /* 88 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 89 imm_2  */
-         .quad local_label(misc_set_invalid) /* 8a immheader_2  */
-         .quad _SPgvset /* 8b vectorH  */
-         .quad local_label(misc_set_invalid) /* 8c misc  */
-         .quad local_label(misc_set_invalid) /* 8d imm3  */
-         .quad local_label(misc_set_invalid) /* 8e immheader_3  */
-         .quad _SPgvset /* 8f simple_vector  */
-        /* 90-9f  */
-         .quad local_label(misc_set_invalid) /* 90 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* 91 imm_0  */
-         .quad local_label(misc_set_s8) /* 92 s8  */
-         .quad local_label(misc_set_invalid) /* 93 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* 94 cons  */
-         .quad local_label(misc_set_invalid) /* 95 imm_1  */
-         .quad local_label(misc_set_s16) /* 96 immheader_1  */
-         .quad local_label(misc_set_invalid) /* 97 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* 98 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* 99 imm_2  */
-         .quad local_label(misc_set_s32) /* 9a s32  */
-         .quad local_label(misc_set_invalid) /* 9b nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* 9c misc  */
-         .quad local_label(misc_set_invalid) /* 9d imm3  */
-         .quad local_label(misc_set_s64) /* 9e s64  */
-         .quad local_label(misc_set_invalid) /* 9f nodeheader_3  */
-        /* a0-af  */
-         .quad local_label(misc_set_invalid) /* a0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* a1 imm_0  */
-         .quad local_label(misc_set_u8) /* a2 u8  */
-         .quad local_label(misc_set_invalid) /* a3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* a4 cons  */
-         .quad local_label(misc_set_invalid) /* a5 imm_1  */
-         .quad local_label(misc_set_u16) /* a6 u16  */
-         .quad local_label(misc_set_invalid) /* a7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* a8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* a9 imm_2  */
-         .quad local_label(misc_set_u32) /* aa u32  */
-         .quad local_label(misc_set_invalid) /* ab nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* ac misc  */
-         .quad local_label(misc_set_invalid) /* ad imm3  */
-         .quad local_label(misc_set_u64) /* ae u64  */
-         .quad local_label(misc_set_invalid) /* af nodeheader_3  */
-        /* b0-bf  */
-         .quad local_label(misc_set_invalid) /* b0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* b1 imm_0  */
-         .quad local_label(misc_set_invalid) /* b2 immheader_0  */
-         .quad local_label(misc_set_invalid) /* b3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* b4 cons  */
-         .quad local_label(misc_set_invalid) /* b5 imm_1  */
-         .quad local_label(misc_set_invalid) /* b6 immheader_1  */
-         .quad local_label(misc_set_invalid) /* b7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* b8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* b9 imm_2  */
-         .quad local_label(misc_set_single_float_vector) /* ba sf vector  */
-         .quad local_label(misc_set_invalid) /* bb nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* bc misc  */
-         .quad local_label(misc_set_invalid) /* bd imm3  */
-         .quad local_label(misc_set_fixnum_vector) /* be fixnum_vector  */
-         .quad local_label(misc_set_invalid) /* bf nodeheader_3  */
-        /* c0-cf  */
-         .quad local_label(misc_set_invalid) /* c0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* c1 imm_0  */
-         .quad local_label(misc_set_invalid) /* c2 immheader_0  */
-         .quad local_label(misc_set_invalid) /* c3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* c4 cons  */
-         .quad local_label(misc_set_invalid) /* c5 imm_1  */
-         .quad local_label(misc_set_invalid) /* c6 immheader_1  */
-         .quad local_label(misc_set_invalid) /* c7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* c8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* c9 imm_2  */
-         .quad local_label(misc_set_invalid) /* ca immheader_2  */
-         .quad local_label(misc_set_invalid) /* cb nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* cc misc  */
-         .quad local_label(misc_set_invalid) /* cd imm3  */
-         .quad local_label(misc_set_double_float_vector) /* ce double-float vector  */
-         .quad local_label(misc_set_invalid) /* cf nodeheader_3  */
-        /* d0-df  */
-         .quad local_label(misc_set_invalid) /* d0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* d1 imm_0  */
-         .quad local_label(misc_set_string) /* d2 string  */
-         .quad local_label(misc_set_invalid) /* d3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* d4 cons  */
-         .quad local_label(misc_set_invalid) /* d5 imm_1  */
-         .quad local_label(misc_set_invalid) /* d6 immheader_1  */
-         .quad local_label(misc_set_invalid) /* d7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* d8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* d9 imm_2  */
-         .quad local_label(misc_set_new_string) /* da new_string  */
-         .quad local_label(misc_set_invalid) /* db nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* dc misc  */
-         .quad local_label(misc_set_invalid) /* dd imm3  */
-         .quad local_label(misc_set_invalid) /* de immheader_3  */
-         .quad local_label(misc_set_invalid) /* df nodeheader_3  */
-        /* e0-ef  */
-         .quad local_label(misc_set_invalid) /* e0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* e1 imm_0  */
-         .quad local_label(misc_set_invalid) /* e2 immheader_0  */
-         .quad local_label(misc_set_invalid) /* e3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* e4 cons  */
-         .quad local_label(misc_set_invalid) /* e5 imm_1  */
-         .quad local_label(misc_set_invalid) /* e6 immheader_1  */
-         .quad local_label(misc_set_invalid) /* e7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* e8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* e9 imm_2  */
-         .quad local_label(misc_set_invalid) /* ea immheader_2  */
-         .quad local_label(misc_set_invalid) /* eb nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* ec misc  */
-         .quad local_label(misc_set_invalid) /* ed imm3  */
-         .quad local_label(misc_set_invalid) /* ee immheader_3  */
-         .quad local_label(misc_set_invalid) /* ef nodeheader_3  */
-        /* f0-ff  */
-         .quad local_label(misc_set_invalid) /* f0 even_fixnum  */
-         .quad local_label(misc_set_invalid) /* f1 imm_0  */
-         .quad local_label(misc_set_invalid) /* f2 immheader_0  */
-         .quad local_label(misc_set_invalid) /* f3 nodeheader_0  */
-         .quad local_label(misc_set_invalid) /* f4 cons  */
-         .quad local_label(misc_set_invalid) /* f5 imm_1  */
-         .quad local_label(misc_set_bit_vector) /* f6 bit_vector  */
-         .quad local_label(misc_set_invalid) /* f7 nodeheader_1  */
-         .quad local_label(misc_set_invalid) /* f8 odd_fixnum  */
-         .quad local_label(misc_set_invalid) /* f9 imm_2  */
-         .quad local_label(misc_set_invalid) /* fa immheader_2  */
-         .quad local_label(misc_set_invalid) /* fb nodeheader_2  */
-         .quad local_label(misc_set_invalid) /* fc misc  */
-         .quad local_label(misc_set_invalid) /* fd imm3  */
-         .quad local_label(misc_set_invalid) /* fe immheader_3  */
-         .quad local_label(misc_set_invalid) /* ff nodeheader_3  */
-
-local_label(misc_set_bit_vector):               
-         __(lis imm3,0x8000)
-         __(extract_unsigned_byte_bits_(imm0,arg_z,1))
-	 __(extrwi imm1,arg_y,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
-         __(srdi imm0,arg_y,5+fixnumshift)
-	 __(srw imm3,imm3,imm1)
-         __(bne local_label(misc_set_bad))
-         __(cmpdi cr0,arg_z,0)
-         __(sldi imm0,imm0,2)
-	 __(la imm0,misc_data_offset(imm0))
-	 __(lwzx imm2,arg_x,imm0)
-         __(beq 1f)
-         __(or imm2,imm3,imm2)
-         __(stwx imm2,arg_x,imm0)
-         __(bx lr)
-1:       __(andc imm2,imm2,imm3)
-         __(stwx imm2,arg_x,imm0)
-         __(bx lr)
-local_label(misc_set_s16):
-         __(extract_lisptag(imm2,arg_z))
-         __(sldi imm0,arg_z,64-(16+fixnumshift))
-         __(srdi imm1,arg_y,2)
-         __(cmpdi cr7,imm2,tag_fixnum)
-         __(sradi imm0,imm0,64-(16+fixnumshift))
-         __(cmpd imm0,arg_z)
-         __(la imm1,misc_data_offset(imm1))
-         __(unbox_fixnum(imm0,arg_z))
-         __(bne local_label(misc_set_bad))
-         __(bne cr7,local_label(misc_set_bad))
-         __(sthx imm0,arg_x,imm1)
-         __(bx lr)
-local_label(misc_set_u16):
-         __(extract_unsigned_byte_bits_(imm0,arg_z,16))
-         __(srdi imm1,arg_y,2)                
-         __(unbox_fixnum(imm0,arg_z))
-         __(la imm1,misc_data_offset(imm1))
-         __(bne local_label(misc_set_bad))
-         __(sthx imm0,arg_x,imm1)
-         __(bx lr)
-local_label(misc_set_single_float_vector):
-         __(extract_fulltag(imm3,arg_z))
-         __(srdi imm4,arg_y,1)
-         __(cmpdi cr3,imm3,subtag_single_float)
-         __(la imm4,misc_data_offset(imm4))
-         __(bne cr3,local_label(misc_set_bad))
-         __(srdi imm0,arg_z,32)
-         __(stwx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_s32):
-         __(extract_lisptag(imm2,arg_z))
-         __(srdi imm4,arg_y,1)
-         __(unbox_fixnum(imm0,arg_z))
-         __(cmpdi imm2,tag_fixnum)
-         __(sldi imm1,imm0,32)
-         __(sradi imm1,imm1,32)
-         __(la imm4,misc_data_offset(imm4))
-         __(bne local_label(misc_set_bad))
-         __(cmpd imm1,imm0)
-         __(bne local_label(misc_set_bad))
-         __(stwx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_u32):              
-         __(extract_unsigned_byte_bits_(imm0,arg_z,32))
-         __(srdi imm4,arg_y,1)
-	 __(la imm4,misc_data_offset(imm4))
-         __(unbox_fixnum(imm0,arg_z))
-         __(bne local_label(misc_set_bad))
-         __(stwx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_new_string):
-         __(extract_lowbyte(imm0,arg_z))
-         __(srdi imm4,arg_y,1)
-         __(cmpdi imm0,subtag_character)
-	 __(la imm4,misc_data_offset(imm4))
-         __(srwi imm0,arg_z,charcode_shift)
-         __(bne local_label(misc_set_bad))
-         __(stwx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_string):      
-         __(extract_lowbyte(imm0,arg_z))                
-         __(srdi imm4,arg_y,3)
-         __(cmpdi imm0,subtag_character)
-         __(la imm4,misc_data_offset(imm4))
-         __(bne cr0,local_label(misc_set_bad))
-         __(srwi imm0,arg_z,charcode_shift)
-         __(stbx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_s8):     
-         __(extract_lisptag(imm2,arg_z))
-         __(unbox_fixnum(imm0,arg_z))
-         __(cmpdi cr2,imm2,tag_fixnum)
-         __(srdi imm4,arg_y,3)
-         __(sldi imm1,imm0,56)
-         __(sradi imm1,imm1,56)
-         __(cmpd imm1,imm0)
-         __(bne cr2,local_label(misc_set_bad))
-         __(la imm4,misc_data_offset(imm4))
-         __(bne local_label(misc_set_bad))
-         __(stbx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_u8):     
-         __(extract_unsigned_byte_bits_(imm0,arg_z,8))
-         __(srdi imm4,arg_y,3)
-         __(unbox_fixnum(imm0,arg_z))
-         __(la imm4,misc_data_offset(imm4))
-         __(bne local_label(misc_set_bad))
-         __(stbx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_u64):
-         __(extract_lisptag(imm0,arg_z))
-         __(extract_fulltag(imm2,arg_z))
-         __(cmpdi cr0,arg_z,0)
-         __(cmpdi cr7,imm0,0)
-         __(cmpdi cr6,imm2,fulltag_misc)
-         __(la imm4,misc_data_offset(arg_y))
-         __(bne cr7,local_label(setu64_maybe_bignum))
-         __(unbox_fixnum(imm0,arg_z))
-         __(blt cr0,local_label(misc_set_bad))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(setu64_maybe_bignum):
-         __(bne cr6,local_label(misc_set_bad))
-         __(getvheader(imm1,arg_z))
-         __(ld imm0,misc_data_offset(arg_z))
-         __(rotldi imm0,imm0,32)
-         __(cmpdi cr2,imm1,two_digit_bignum_header)
-         __(cmpdi cr3,imm1,three_digit_bignum_header)
-         __(cmpdi cr0,imm0,0)
-         __(beq cr2,1f)
-         __(bne cr3,local_label(misc_set_bad))
-         __(lwz imm3,misc_data_offset+8(arg_z))
-         __(cmpwi cr0,imm3,0)
-         __(bne cr0,local_label(misc_set_bad))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-1:       __(blt cr0,local_label(misc_set_bad))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_double_float_vector):
-         __(extract_typecode(imm0,arg_z))
-         __(la imm4,misc_data_offset(arg_y))
-         __(cmpdi imm0,subtag_double_float)
-         __(bne local_label(misc_set_bad))
-         __(ld imm0,misc_dfloat_offset(arg_z))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_fixnum_vector):
-         __(extract_lisptag(imm2,arg_z))
-         __(unbox_fixnum(imm0,arg_z))
-         __(cmpdi cr2,imm2,tag_fixnum)
-         __(la imm4,misc_data_offset(arg_y))
-         __(bne cr2,local_label(misc_set_bad))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_s64):
-         __(extract_lisptag(imm2,arg_z))
-         __(extract_fulltag(imm3,arg_z))
-         __(unbox_fixnum(imm0,arg_z))
-         __(cmpdi cr2,imm2,tag_fixnum)
-         __(cmpdi cr6,imm3,fulltag_misc) 
-         __(la imm4,misc_data_offset(arg_y))
-         __(bne cr2,local_label(sets64_maybe_bignum))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(sets64_maybe_bignum):       
-         __(bne cr6,local_label(misc_set_bad))
-         __(getvheader(imm1,arg_z))
-         __(ld imm0,misc_data_offset(arg_z))
-         __(cmpdi cr1,imm1,two_digit_bignum_header)
-         __(rotldi imm0,imm0,32)
-         __(bne cr1,local_label(misc_set_bad))
-         __(stdx imm0,arg_x,imm4)
-         __(bx lr)
-local_label(misc_set_bad):
-	 __(mov arg_y,arg_z)
-	 __(mov arg_z,arg_x)
-	 __(mov arg_x,#XNOTELT)
-	 __(set_nargs(3))
-	 __(b _SPksignalerr)
-local_label(misc_set_invalid):  
-         __(mov temp0,#XSETBADVEC)        
-         __(set_nargs(4))
-         __(vpush1(temp0))
-         __(b _SPksignalerr)        
-        __else
-         __(slwi imm1,imm1,2)
-         __(mov imm0,#LO(local_label(misc_set_jmp)))
-         __(addis imm0,imm0,HA(local_label(misc_set_jmp)))
-         __(lwzx imm0,imm0,imm1)
-         __(mtctr imm0)
-         __(bctr)
-local_label(misc_set_jmp):             
-        /* 00-0f  */
-         .long local_label(misc_set_invalid) /* 00 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 01 cons  */
-         .long local_label(misc_set_invalid) /* 02 nodeheader  */
-         .long local_label(misc_set_invalid) /* 03 imm  */
-         .long local_label(misc_set_invalid) /* 04 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 05 nil  */
-         .long local_label(misc_set_invalid) /* 06 misc  */
-         .long local_label(misc_set_u32) /* 07 bignum  */
-         .long local_label(misc_set_invalid) /* 08 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 09 cons  */
-         .long _SPgvset /* 0a ratio  */
-         .long local_label(misc_set_invalid) /* 0b imm  */
-         .long local_label(misc_set_invalid) /* 0c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 0d nil  */
-         .long local_label(misc_set_invalid) /* 0e misc  */
-         .long local_label(misc_set_u32) /* 0f single_float  */
-        /* 10-1f  */
-         .long local_label(misc_set_invalid) /* 10 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 11 cons  */
-         .long local_label(misc_set_invalid) /* 12 nodeheader  */
-         .long local_label(misc_set_invalid) /* 13 imm  */
-         .long local_label(misc_set_invalid) /* 14 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 15 nil  */
-         .long local_label(misc_set_invalid) /* 16 misc  */
-         .long local_label(misc_set_u32) /* 17 double_float  */
-         .long local_label(misc_set_invalid) /* 18 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 19 cons  */
-         .long _SPgvset /* 1a complex  */
-         .long local_label(misc_set_invalid) /* 1b imm  */
-         .long local_label(misc_set_invalid) /* 1c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 1d nil  */
-         .long local_label(misc_set_invalid) /* 1e misc  */
-         .long local_label(misc_set_u32) /* 1f macptr  */
-        /* 20-2f  */
-         .long local_label(misc_set_invalid) /* 20 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 21 cons  */
-         .long _SPgvset /* 22 catch_frame  */
-         .long local_label(misc_set_invalid) /* 23 imm  */
-         .long local_label(misc_set_invalid) /* 24 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 25 nil  */
-         .long local_label(misc_set_invalid) /* 26 misc  */
-         .long local_label(misc_set_u32) /* 27 dead_macptr  */
-         .long local_label(misc_set_invalid) /* 28 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 29 cons  */
-         .long _SPgvset /* 2a function  */
-         .long local_label(misc_set_invalid) /* 2b imm  */
-         .long local_label(misc_set_invalid) /* 2c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 2d nil  */
-         .long local_label(misc_set_invalid) /* 2e misc  */
-         .long local_label(misc_set_u32) /* 2f code_vector  */
-        /* 30-3f  */
-         .long local_label(misc_set_invalid) /* 30 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 31 cons  */
-         .long _SPgvset /* 32 lisp_thread  */
-         .long local_label(misc_set_invalid) /* 33 imm  */
-         .long local_label(misc_set_invalid) /* 34 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 35 nil  */
-         .long local_label(misc_set_invalid) /* 36 misc  */
-         .long local_label(misc_set_u32) /* 37 creole  */
-         .long local_label(misc_set_invalid) /* 38 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 39 cons  */
-         .long _SPgvset /* 3a symbol  */
-         .long local_label(misc_set_invalid) /* 3b imm  */
-         .long local_label(misc_set_invalid) /* 3c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 3d nil  */
-         .long local_label(misc_set_invalid) /* 3e misc  */
-         .long local_label(misc_set_u32) /* 3f xcode_vector  */
-        /* 40-4f  */
-         .long local_label(misc_set_invalid) /* 40 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 41 cons  */
-         .long _SPgvset /* 42 lock  */
-         .long local_label(misc_set_invalid) /* 43 imm  */
-         .long local_label(misc_set_invalid) /* 44 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 45 nil  */
-         .long local_label(misc_set_invalid) /* 46 misc  */
-         .long local_label(misc_set_invalid) /* 47 immheader  */
-         .long local_label(misc_set_invalid) /* 48 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 49 cons  */
-         .long _SPgvset /* 4a hash_vector  */
-         .long local_label(misc_set_invalid) /* 4b imm  */
-         .long local_label(misc_set_invalid) /* 4c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 4d nil  */
-         .long local_label(misc_set_invalid) /* 4e misc  */
-         .long local_label(misc_set_invalid) /* 4f immheader  */
-        /* 50-5f  */
-         .long local_label(misc_set_invalid) /* 50 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 51 cons  */
-         .long _SPgvset /* 52 pool  */
-         .long local_label(misc_set_invalid) /* 53 imm  */
-         .long local_label(misc_set_invalid) /* 54 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 55 nil  */
-         .long local_label(misc_set_invalid) /* 56 misc  */
-         .long local_label(misc_set_invalid) /* 57 immheader  */
-         .long local_label(misc_set_invalid) /* 58 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 59 cons  */
-         .long _SPgvset /* 5a weak  */
-         .long local_label(misc_set_invalid) /* 5b imm  */
-         .long local_label(misc_set_invalid) /* 5c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 5d nil  */
-         .long local_label(misc_set_invalid) /* 5e misc  */
-         .long local_label(misc_set_invalid) /* 5f immheader  */
-        /* 60-6f  */
-         .long local_label(misc_set_invalid) /* 60 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 61 cons  */
-         .long _SPgvset /* 62 package  */
-         .long local_label(misc_set_invalid) /* 63 imm  */
-         .long local_label(misc_set_invalid) /* 64 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 65 nil  */
-         .long local_label(misc_set_invalid) /* 66 misc  */
-         .long local_label(misc_set_invalid) /* 67 immheader  */
-         .long local_label(misc_set_invalid) /* 68 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 69 cons  */
-         .long _SPgvset /* 6a slot_vector  */
-         .long local_label(misc_set_invalid) /* 6b imm  */
-         .long local_label(misc_set_invalid) /* 6c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 6d nil  */
-         .long local_label(misc_set_invalid) /* 6e misc  */
-         .long local_label(misc_set_invalid) /* 6f immheader  */
-        /* 70-7f  */
-         .long local_label(misc_set_invalid) /* 70 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 71 cons  */
-         .long _SPgvset /* 72 instance  */
-         .long local_label(misc_set_invalid) /* 73 imm  */
-         .long local_label(misc_set_invalid) /* 74 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 75 nil  */
-         .long local_label(misc_set_invalid) /* 76 misc  */
-         .long local_label(misc_set_invalid) /* 77 immheader  */
-         .long local_label(misc_set_invalid) /* 78 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 79 cons  */
-         .long _SPgvset /* 7a struct  */
-         .long local_label(misc_set_invalid) /* 7b imm  */
-         .long local_label(misc_set_invalid) /* 7c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 7d nil  */
-         .long local_label(misc_set_invalid) /* 7e misc  */
-         .long local_label(misc_set_invalid) /* 7f immheader  */
-        /* 80-8f  */
-         .long local_label(misc_set_invalid) /* 80 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 81 cons  */
-         .long _SPgvset /* 82 istruct  */
-         .long local_label(misc_set_invalid) /* 83 imm  */
-         .long local_label(misc_set_invalid) /* 84 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 85 nil  */
-         .long local_label(misc_set_invalid) /* 86 misc  */
-         .long local_label(misc_set_invalid) /* 87 immheader  */
-         .long local_label(misc_set_invalid) /* 88 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 89 cons  */
-         .long _SPgvset /* 8a value_cell  */
-         .long local_label(misc_set_invalid) /* 8b imm  */
-         .long local_label(misc_set_invalid) /* 8c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 8d nil  */
-         .long local_label(misc_set_invalid) /* 8e misc  */
-         .long local_label(misc_set_invalid) /* 8f immheader  */
-        /* 90-9f  */
-         .long local_label(misc_set_invalid) /* 90 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 91 cons  */
-         .long _SPgvset /* 92 xfunction  */
-         .long local_label(misc_set_invalid) /* 93 imm  */
-         .long local_label(misc_set_invalid) /* 94 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 95 nil  */
-         .long local_label(misc_set_invalid) /* 96 misc  */
-         .long local_label(misc_set_invalid) /* 97 immheader  */
-         .long local_label(misc_set_invalid) /* 98 even_fixnum  */
-         .long local_label(misc_set_invalid) /* 99 cons  */
-         .long _SPgvset /* 9a arrayH  */
-         .long local_label(misc_set_invalid) /* 9b imm  */
-         .long local_label(misc_set_invalid) /* 9c odd_fixnum  */
-         .long local_label(misc_set_invalid) /* 9d nil  */
-         .long local_label(misc_set_invalid) /* 9e misc  */
-         .long local_label(misc_set_invalid) /* 9f immheader  */
-        /* a0-af  */
-         .long local_label(misc_set_invalid) /* a0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* a1 cons  */
-         .long _SPgvset /* a2 vectorH  */
-         .long local_label(misc_set_invalid) /* a3 imm  */
-         .long local_label(misc_set_invalid) /* a4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* a5 nil  */
-         .long local_label(misc_set_invalid) /* a6 misc  */
-         .long local_label(misc_set_single_float_vector) /* a7 sf vector  */
-         .long local_label(misc_set_invalid) /* a8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* a9 cons  */
-         .long _SPgvset /* aa vectorH  */
-         .long local_label(misc_set_invalid) /* ab imm  */
-         .long local_label(misc_set_invalid) /* ac odd_fixnum  */
-         .long local_label(misc_set_invalid) /* ad nil  */
-         .long local_label(misc_set_invalid) /* ae misc  */
-         .long local_label(misc_set_u32) /* af u32  */
-        /* b0-bf  */
-         .long local_label(misc_set_invalid) /* b0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* b1 cons  */
-         .long local_label(misc_set_invalid) /* b2 node  */
-         .long local_label(misc_set_invalid) /* b3 imm  */
-         .long local_label(misc_set_invalid) /* b4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* b5 nil  */
-         .long local_label(misc_set_invalid) /* b6 misc  */
-         .long local_label(misc_set_s32) /* b7 s32  */
-         .long local_label(misc_set_invalid) /* b8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* b9 cons  */
-         .long local_label(misc_set_invalid) /* ba nodeheader  */
-         .long local_label(misc_set_invalid) /* bb imm  */
-         .long local_label(misc_set_invalid) /* bc odd_fixnum  */
-         .long local_label(misc_set_invalid) /* bd nil  */
-         .long local_label(misc_set_invalid) /* be misc  */
-         .long local_label(misc_set_fixnum_vector) /* bf fixnum_vector  */
-        /* c0-cf  */
-         .long local_label(misc_set_invalid) /* c0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* c1 cons  */
-         .long local_label(misc_set_invalid) /* c2 nodeheader  */
-         .long local_label(misc_set_invalid) /* c3 imm  */
-         .long local_label(misc_set_invalid) /* c4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* c5 nil  */
-         .long local_label(misc_set_invalid) /* c6 misc  */
-         .long local_label(misc_set_new_string) /* c7 new_string  */
-         .long local_label(misc_set_invalid) /* c8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* c9 cons  */
-         .long local_label(misc_set_invalid) /* ca nodeheader  */
-         .long local_label(misc_set_invalid) /* cb imm  */
-         .long local_label(misc_set_invalid) /* cc odd_fixnum  */
-         .long local_label(misc_set_invalid) /* cd nil  */
-         .long local_label(misc_set_invalid) /* ce misc  */
-         .long local_label(misc_set_u8) /* cf u8  */
-        /* d0-df  */
-         .long local_label(misc_set_invalid) /* d0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* d1 cons  */
-         .long local_label(misc_set_invalid) /* d2 nodeheader  */
-         .long local_label(misc_set_invalid) /* d3 imm  */
-         .long local_label(misc_set_invalid) /* d4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* d5 nil  */
-         .long local_label(misc_set_invalid) /* d6 misc  */
-         .long local_label(misc_set_s8) /* d7 s8  */
-         .long local_label(misc_set_invalid) /* d8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* d9 cons  */
-         .long local_label(misc_set_invalid) /* da nodeheader  */
-         .long local_label(misc_set_invalid) /* db imm  */
-         .long local_label(misc_set_invalid) /* dc odd_fixnum  */
-         .long local_label(misc_set_invalid) /* dd nil  */
-         .long local_label(misc_set_invalid) /* de misc  */
-         .long local_label(misc_set_old_string) /* df (old) simple_base_string  */
-        /* e0-ef  */
-         .long local_label(misc_set_invalid) /* e0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* e1 cons  */
-         .long local_label(misc_set_invalid) /* e2 nodeheader  */
-         .long local_label(misc_set_invalid) /* e3 imm  */
-         .long local_label(misc_set_invalid) /* e4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* e5 nil  */
-         .long local_label(misc_set_invalid) /* e6 misc  */
-         .long local_label(misc_set_u16) /* e7 u16  */
-         .long local_label(misc_set_invalid) /* e8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* e9 cons  */
-         .long local_label(misc_set_invalid) /* ea nodeheader  */
-         .long local_label(misc_set_invalid) /* eb imm  */
-         .long local_label(misc_set_invalid) /* ec odd_fixnum  */
-         .long local_label(misc_set_invalid) /* ed nil  */
-         .long local_label(misc_set_invalid) /* ee misc  */
-         .long local_label(misc_set_s16) /* ef s16  */
-        /* f0-ff  */
-         .long local_label(misc_set_invalid) /* f0 even_fixnum  */
-         .long local_label(misc_set_invalid) /* f1 cons  */
-         .long local_label(misc_set_invalid) /* f2 nodeheader  */
-         .long local_label(misc_set_invalid) /* f3 imm  */
-         .long local_label(misc_set_invalid) /* f4 odd_fixnum  */
-         .long local_label(misc_set_invalid) /* f5 nil  */
-         .long local_label(misc_set_invalid) /* f6 misc  */
-         .long local_label(misc_set_double_float_vector) /* f7 df vector  */
-         .long local_label(misc_set_invalid) /* f8 even_fixnum  */
-         .long local_label(misc_set_invalid) /* f9 cons  */
-         .long local_label(misc_set_invalid) /* fa nodeheader  */
-         .long local_label(misc_set_invalid) /* fb imm  */
-         .long local_label(misc_set_invalid) /* fc odd_fixnum  */
-         .long local_label(misc_set_invalid) /* fd nil  */
-         .long local_label(misc_set_invalid) /* fe misc  */
-         .long local_label(misc_set_bit_vector) /* ff bit_vector  */
-
-local_label(misc_set_u32):        
-	/* Either a non-negative fixnum, a positiveone-digit bignum, */
-	/* or a two-digit bignum whose sign-digit is 0 is ok.  */
-	 __(extract_lisptag(imm2,arg_z))
-	 __(srawi. imm1,arg_z,fixnum_shift)
-         __(cmpwi cr5,imm2,tag_fixnum)         
-         __(la imm0,misc_data_offset(arg_y))
-         __(cmpwi cr7,imm2,tag_misc)
-	 __(bne cr5,local_label(set_not_fixnum_u32))
-	 __(blt- cr0,local_label(set_bad))
-local_label(set_set32):         
-	 __(stwx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(set_not_fixnum_u32):
-	 __(bne cr7,local_label(set_bad))
-	 __(extract_header(imm2,arg_z))
-	 __(cmpri(cr0,imm2,one_digit_bignum_header))
-	 __(cmpri(cr1,imm2,two_digit_bignum_header))
-	 __(vrefr(imm1,arg_z,0))
-	 __(cmpri(cr2,imm1,0))
-	 __(bne cr0,local_label(set_not_1_digit_u32))
-	 __(bge cr2,local_label(set_set32))
-	 __(b local_label(set_bad))
-local_label(set_not_1_digit_u32):
-	 __(bne- cr1,local_label(set_bad))
-	 __(vrefr(imm2,arg_z,1))
-	 __(cmpri(cr0,imm2,0))
-	 __(bne- cr1,local_label(set_bad))
-	 __(beq cr0,local_label(set_set32))
-local_label(set_bad):
-	/* arg_z does not match the array-element-type of arg_x.  */
-	 __(mov arg_y,arg_z)
-	 __(mov arg_z,arg_x)
-	 __(mov arg_x,#XNOTELT)
-	 __(set_nargs(3))
-	 __(b _SPksignalerr)
-local_label(misc_set_fixnum_vector):   
-         __(extract_lisptag(imm2,arg_z))
-         __(la imm0,misc_data_offset(arg_y))
-         __(cmpwi cr5,imm2,tag_fixnum)
-         __(unbox_fixnum(imm1,arg_z))
-         __(bne cr5,local_label(set_bad))
-         __(stwx imm1,arg_x,imm0)
-         __(bx lr)
-local_label(misc_set_new_string):   
-         __(clrlwi imm2,arg_z,ncharcodebits)
-         __(la imm0,misc_data_offset(arg_y))
-         __(cmpwi cr5,imm2,subtag_character)
-         __(srwi imm1,arg_z,charcode_shift)
-         __(bne cr5,local_label(set_bad))
-         __(stwx imm1,arg_x,imm0)
-         __(bx lr)
-local_label(misc_set_s32):
-         __(extract_lisptag(imm2,arg_z))
-         __(cmpwi cr5,imm2,tag_fixnum)
-         __(cmpwi cr7,imm2,tag_misc)
-         __(la imm0,misc_data_offset(arg_y))
-	 __(unbox_fixnum(imm1,arg_z))
-	 __(beq cr5,local_label(set_set32))
-	 __(bne cr7,local_label(set_bad))
-	 __(extract_header(imm2,arg_z))
-	 __(cmpri(cr0,imm2,one_digit_bignum_header))
-	 __(vrefr(imm1,arg_z,0))
-	 __(bne- cr0,local_label(set_bad))
-	 __(strx(imm1,arg_x,imm0))
-	 __(bx lr)
-local_label(misc_set_single_float_vector):
-         __(extract_lisptag(imm2,arg_z))
-         __(cmpwi cr7,imm2,tag_misc)
-         __(la imm0,misc_data_offset(arg_y))
-	 __(bne- cr7,local_label(set_bad))
-	 __(extract_header(imm2,arg_z))
-	 __(cmpri(cr0,imm2,single_float_header))
-	 __(bne- cr0,local_label(set_bad))
-	 __(ldr imm1,[arg_z,#single_float.value])
-	 __(strx(imm1,arg_x,imm0))
-	 __(bx lr)
-local_label(misc_set_u8):               
-	 __(extract_lisptag(imm2,arg_z))
-	 __(srwi imm0,arg_y,2)
-	 __(la imm0,misc_data_offset(imm0))
-	 __(extract_unsigned_byte_bits_(imm1,arg_z,8))
-	 __(unbox_fixnum(imm1,arg_z))
-	 __(bne- cr0,local_label(set_bad))
-	 __(stbx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_old_string):
-	 __(srwi imm0,arg_y,2)
-	 __(extract_lowbyte(imm2,arg_z))
-	 __(cmpri(cr2,imm2,subtag_character))
-	 __(la imm0,misc_data_offset(imm0))
-	 __(srwi imm1,arg_z,charcode_shift)
-	 __(bne- cr2,local_label(set_bad))
-	 __(stbx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_s8):
-	 __(extract_lisptag(imm2,arg_z))
-         __(srwi imm0,arg_y,2)
-	 __(unbox_fixnum(imm1,arg_z))
-         __(la imm0,misc_data_offset(imm0))
-         __(cmpwi cr5,imm2,tag_fixnum)
-	 __(extsb imm2,imm1)
-	 __(cmpw cr0,imm2,imm1)
-	 __(bne- cr5,local_label(set_bad))
-	 __(bne- cr0,local_label(set_bad))
-	 __(stbx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_u16):         
-	 __(srwi imm0,arg_y,1)
-	 __(extract_unsigned_byte_bits_(imm1,arg_z,16))
-	 __(unbox_fixnum(imm1,arg_z))
-	 __(la imm0,misc_data_offset(imm0))
-	 __(bne- cr0,local_label(set_bad))
-	 __(sthx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_s16):
-         __(extract_lisptag(imm2,arg_z))
-         __(srwi imm0,arg_y,1)
-	 __(unbox_fixnum(imm1,arg_z))
-         __(cmpwi cr5,imm2,tag_fixnum)
-         __(la imm0,misc_data_offset(imm0))
-	 __(extsh imm2,imm1)
-	 __(cmpw cr0,imm2,imm1)
-	 __(bne- cr5,local_label(set_bad))
-	 __(bne- cr0,local_label(set_bad))
-	 __(sthx imm1,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_bit_vector):	
-	 __(cmplwi cr2,arg_z,fixnumone)   /* nothing not a (boxed) bit   */
-	 __(extrwi imm1,arg_y,5,32-(fixnumshift+5))	/* imm1 = bitnum  */
-	 __(extlwi imm2,arg_z,1,31-fixnumshift)
-	 __(srw imm2,imm2,imm1)
-	 __(lis imm3,0x8000)
-	 __(rlwinm imm0,arg_y,32-5,5,31-fixnumshift)
-	 __(la imm0,misc_data_offset(imm0))
-	 __(srw imm3,imm3,imm1)
-	 __(bgt- cr2,local_label(set_bad))
-	 __(lwzx imm1,arg_x,imm0)
-	 __(andc imm1,imm1,imm3)
-	 __(or imm1,imm1,imm2)
-	 __(stwx imm1,arg_x,imm0)
-	 __(bx lr)
-
-local_label(misc_set_double_float_vector):
-         __(extract_lisptag(imm2,arg_z))
-	 __(slwi imm0,arg_y,1)
-         __(cmpwi cr7,imm2,tag_misc)
-	 __(la imm0,misc_dfloat_offset(imm0))
-         __(bne- cr7,local_label(set_bad))
-	 __(extract_header(imm2,arg_z))
-	 __(cmpri(cr0,imm2,double_float_header))
-	 __(bne- cr0,local_label(set_bad))
-	 __(lwz imm1,double_float.value(arg_z))
-	 __(lwz imm2,double_float.value+4(arg_z))
-	 __(stwx imm1,arg_x,imm0)
-	 __(la imm0,4(imm0))
-	 __(stwx imm2,arg_x,imm0)
-	 __(bx lr)
-local_label(misc_set_invalid):  
-         __(mov temp0,#XSETBADVEC)        
-         __(set_nargs(4))
-         __(vpush1(temp0))
-         __(b _SPksignalerr)                
-        __endif
-
-/* misc_set (vector index newval).  Pretty damned similar to  */
-/* misc_ref, as one might imagine.  */
-
-_spentry(misc_set)
-	__(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
-	__(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-	__(vector_length(imm0,arg_x,imm1))
-	__(trlge(arg_y,imm0))
-	__(extract_lowbyte(imm1,imm1))
-        __(b local_label(misc_set_common))
-        
-/* "spread" the lexpr in arg_z.  */
-/* ppc2-invoke-fn assumes that temp1 is preserved here.  */
-_spentry(spread_lexprz)
-	__(ldr imm0,[arg_z,#0])
-	__(cmpri(cr3,imm0,3<<fixnumshift))
-	__(cmpri(cr4,imm0,2<<fixnumshift))
-	__(add imm1,arg_z,imm0)
-	__(cmpri(cr0,imm0,0))
-	__(add nargs,nargs,imm0)
-	__(cmpri(cr1,nargs,0))
-	__(cmpri(cr2,nargs,2<<fixnumshift))
-	__(la imm1,node_size(imm1))
-	__(bge cr3,9f)
-	__(beq cr4,2f)
-	__(bne cr0,1f)
-	/* lexpr count was 0; vpop the arg regs that  */
-	/* were vpushed by the caller  */
-	__(beqlr cr1)
-	__(vpop(arg_z))
-	__(bltlr cr2)
-	__(vpop(arg_y))
-	__(beqlr cr2)
-	__(vpop(arg_x))
-	__(bx lr)
-
-	/* vpush args from the lexpr until we have only  */
-	/* three left, then assign them to arg_x, arg_y,  */
-	/* and arg_z.  */
-8:
-	__(cmpri(cr3,imm0,4<<fixnumshift))
-	__(subi imm0,imm0,fixnumone)
-	__(ldru(arg_z,-node_size(imm1)))
-	__(vpush1(arg_z))
-9:
-	__(bne cr3,8b)
-	__(ldr arg_x,[imm1,#-node_size*1])
-	__(ldr arg_y,[imm1,#-node_size*2])
-	__(ldr arg_z,[imm1,#-node_size*3])
-	__(bx lr)
-
-	/* lexpr count is two: set arg_y, arg_z from the  */
-	/* lexpr, maybe vpop arg_x  */
-2:	
-	__(ldr arg_y,[imm1,#-node_size*1])
-	__(ldr arg_z,[imm1,#-node_size*2])
-	__(beqlr cr2)		/* return if (new) nargs = 2  */
-	__(vpop(arg_x))
-	__(bx lr)
-
-	/* lexpr count is one: set arg_z from the lexpr,  */
-	/* maybe vpop arg_y, arg_x  */
-1:	
-	__(ldr arg_z,[imm1,#-node_size])
-	__(bltlr cr2)		/* return if (new) nargs < 2  */
-	__(vpop(arg_y))
-	__(beqlr cr2)		/* return if (new) nargs = 2  */
-	__(vpop(arg_x))
-	__(bx lr)
-        
-		
-_spentry(reset)
-	.globl _SPthrow
-	__(nop)
-	__(ref_nrs_value(temp0,toplcatch))
-	__(mov temp1,#XSTKOVER)
-	__(vpush1(temp0))
-	__(vpush1(temp1))
-	__(set_nargs(1))
-	__(b _SPthrow)
-
-	
-/* "slide" nargs worth of values up the vstack.  IMM0 contains  */
-/* the difference between the current VSP and the target.  */
-_spentry(mvslide)
-	__(cmpri(cr0,nargs,0))
-	__(mov imm3,nargs)
-	__(add imm2,vsp,nargs)
-	__(add imm2,imm2,imm0)
-	__(add imm0,vsp,nargs)
-	__(beq 2f)
-1:
-	__(cmpri(cr0,imm3,1<<fixnumshift))
-	__(subi imm3,imm3,1<<fixnumshift)
-	__(ldru(temp0,-node_size(imm0)))
-	__(stru(temp0,-node_size(imm2)))
-	__(bne cr0,1b)
-2:
-	__(mov vsp,imm2)
-	__(bx lr)
-
-/* Build a new TSP area to hold nargs worth of multiple-values.  */
-/* Pop the multiple values off of the vstack.  */
-/* The new TSP frame will look like this:  */
-/*  */
-/*+--------+-------+-------+---------+--------+--------+--------+======+----------+ */
-/*| ptr to | zero  | nargs | ptr to  | valn-1 | valn-2 | val-0  | ???? | prev TSP |  */
-/*|  prev  |       |       |  prev   |        |        |        | fill |          |  */
-/*| TSP    |       |       | segment |        |        |        |      |          | */
-/*+--------+-------+-------+---------+--------+--------+--------+------+----------+  */
-/*  */
-/* e.g., the first multiple value goes in the last cell in the frame, the  */
-/* count of values goes in the first word, and the word after the value count  */
-/* is 0 if the number of values is even (for alignment).  */
-/* Subsequent calls to .SPadd_values preserve this alignment.  */
-/* .SPrecover_values is therefore pretty simple.  */
-
-_spentry(save_values)
-	__(mov imm1,tsp)
-
-        /* common exit: nargs = values in this set, imm1 = ptr to tsp before  */
-        /* call to save_values  */
-local_label(save_values_to_tsp):
-	__(mov imm2,tsp)
-	__(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* count, link  */
-	__(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
-	__(str(imm1,tsp_frame.backlink(tsp))) /* keep one tsp "frame" as far as rest of lisp is concerned  */
-	__(str(nargs,tsp_frame.data_offset(tsp)))
-	__(str(imm2,tsp_frame.data_offset+node_size(tsp))) /* previous tsp  */
-	__(la imm3,tsp_frame.data_offset+node_size*2(tsp))
-	__(add imm3,imm3,nargs)
-	__(add imm0,vsp,nargs)
-	__(cmpr(cr0,imm0,vsp))
-	__(b 2f)
-1:
-	__(ldru(arg_z,-node_size(imm0)))
-	__(cmpr(cr0,imm0,vsp))
-	__(stru(arg_z,-node_size(imm3)))
-2:
-	__(bne cr0,1b)
-	__(add vsp,vsp,nargs) /*  discard values  */
-	__(bx lr)
-	
-
-/* Add the multiple values that are on top of the vstack to the set  */
-/* saved in the top tsp frame, popping them off of the vstack in the  */
-/* process.  It is an error (a bad one) if the TSP contains something  */
-/* other than a previously saved set of multiple-values.  */
-/* Since adding to the TSP may cause a new TSP segment to be allocated,  */
-/* each add_values call adds another linked element to the list of  */
-/* values. This makes recover_values harder.  */
-
-_spentry(add_values)
-	__(cmpri(cr0,nargs,0))
-	__(ldr imm1,[tsp,#0])
-	__(bne cr0,local_label(save_values_to_tsp))
-	__(bx lr)
-        
-/* On entry, R11->callback-index  */
-/* Restore lisp context, then funcall #'%pascal-functions% with  */
-/* two args: callback-index, args-ptr (a macptr pointing to the args on the stack)  */
-_spentry(poweropen_callback)
-        __ifdef(`rTOC')
-         __(mov r11,rTOC)
-        __endif
-	/* Save C argument registers  */
-	__(str(r3,c_frame.param0(sp)))
-	__(str(r4,c_frame.param1(sp)))
-	__(str(r5,c_frame.param2(sp)))
-	__(str(r6,c_frame.param3(sp)))
-	__(str(r7,c_frame.param4(sp)))
-	__(str(r8,c_frame.param5(sp)))
-	__(str(r9,c_frame.param6(sp)))
-	__(str(r10,c_frame.param7(sp)))
-	__(mflr imm3)
-	__(str(imm3,c_frame.savelr(sp)))
-	__(mfcr imm0)
-	__(str(imm0,c_frame.crsave(sp)))
-
-	/* Save the non-volatile registers on the sp stack  */
-	/* This is a non-standard stack frame, but noone will ever see it,  */
-        /* so it doesn't matter. It will look like more of the stack frame pushed below.  */
-	__(stru(sp,-(stack_align(c_reg_save.size))(sp)))
-        __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp)))
-        __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
-        __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
-        __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
-        __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
-        __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
-        __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
-        __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
-        __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
-        __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
-        __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
-        __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
-        __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
-        __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
-        __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
-        __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
-        __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
-        __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
-        __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
-        __(stfd f1,c_reg_save.save_fprs+(0*8)(sp))
-        __(stfd f2,c_reg_save.save_fprs+(1*8)(sp))
-        __(stfd f3,c_reg_save.save_fprs+(2*8)(sp))
-        __(stfd f4,c_reg_save.save_fprs+(3*8)(sp))
-        __(stfd f5,c_reg_save.save_fprs+(4*8)(sp))
-        __(stfd f6,c_reg_save.save_fprs+(5*8)(sp))
-        __(stfd f7,c_reg_save.save_fprs+(6*8)(sp))
-        __(stfd f8,c_reg_save.save_fprs+(7*8)(sp))
-        __(stfd f9,c_reg_save.save_fprs+(8*8)(sp))
-        __(stfd f10,c_reg_save.save_fprs+(9*8)(sp))
-        __(stfd f11,c_reg_save.save_fprs+(10*8)(sp))
-        __(stfd f12,c_reg_save.save_fprs+(11*8)(sp))
-        __(stfd f13,c_reg_save.save_fprs+(12*8)(sp))
-	__(check_stack_alignment(r0))
-	__(mffs f0)
-	__(stfd f0,c_reg_save.save_fp_zero(sp))
-	__(lwz r31,c_reg_save.save_fp_zero+4(sp))	/* recover FPSCR image  */
-	__(stw r31,c_reg_save.save_fpscr(sp))
-	__(lwi(r30,0x43300000))
-	__(lwi(r31,0x80000000))
-	__(stw r30,c_reg_save.save_fp_zero(sp))
-	__(stw r31,c_reg_save.save_fp_zero+4(sp))
-	__(stfd fp_s32conv,c_reg_save.save_fps32conv(sp))
-	__(lfd fp_s32conv,c_reg_save.save_fp_zero(sp))
-	__(stfd fp_zero,c_reg_save.save_fp_zero(sp))
-	__(lfs fp_zero,lisp_globals.short_float_zero(0))	/* ensure that fp_zero contains 0.0  */
-
-/* Restore rest of Lisp context.  */
-/* Could spread out the memory references here to gain a little speed  */
-
-	__(mov loc_pc,#0)
-	__(mov fn,#0)                     /* subprim, not a lisp function  */
-	__(mov temp3,#0)
-	__(mov temp2,#0)
-	__(mov temp1,#0)
-	__(mov temp0,#0)
-	__(mov arg_x,#0)
-	__(box_fixnum(arg_y,r11))	/* callback-index  */
-        __(la arg_z,c_reg_save.save_fprs(sp))
-        __(str(arg_z,stack_align(c_reg_save.size)+c_frame.unused(sp)))
-	__(la arg_z,stack_align(c_reg_save.size)+c_frame.param0(sp))	/* parameters (tagged as a fixnum)  */
-
-	/* Recover lisp thread context. Have to call C code to do so.  */
-	__(ref_global(r12,get_tcr))
-        __ifdef(`rTOC')
-         __(ld rTOC,8(r12))
-         __(ld r12,0(r12))
-        __endif
-	__(mtctr r12)
-        __(mov r3,#1)
-	__(stru(sp,-(stack_align(c_frame.minsiz))(sp)))
-	__(bctrl)
-	__(la rcontext,TCR_BIAS(r3))
-	__(la sp,(stack_align(c_frame.minsiz))(sp))
-
-	__(ldr vsp,[rcontext,#tcr.save_vsp])
-	__(ldr tsp,[rcontext,#tcr.save_tsp])		
-	__(mov rzero,#0)
-	__(mov imm0,#TCR_STATE_LISP)
-	__(mtxer rzero) /* lisp wants the overflow bit being clear  */
-        __(mtctr rzero)
-	__(mov save0,#0)
-	__(mov save1,#0)
-	__(mov save2,#0)
-	__(mov save3,#0)
-	__(mov save4,#0)
-	__(mov save5,#0)
-	__(mov save6,#0)
-	__(mov save7,#0)
-	__(lfd f0,tcr.lisp_fpscr(rcontext))
-	__(mtfsf 0xff,f0)
-	__(mov allocbase,#0)
-	__(mov allocptr,#0)	
-	__(str(imm0,tcr.valence(rcontext)))
-	__(ldr allocptr,[rcontext,#tcr.save_allocptr])
-	__(ldr allocbase,[rcontext,#tcr.save_allocbase])
-	
-        __(restore_saveregs(vsp))
-
-	/* load nargs and callback to the lisp  */
-	__(set_nargs(2))
-	__(ldr imm2,[rcontext,#tcr.cs_area])
-	__(ldr imm4,[imm2,#area.active])
-	__(stru(imm4,-lisp_frame.size(sp)))
-	__(str(imm3,lisp_frame.savelr(sp)))
-	__(mov fname,#nrs.callbacks)	/* %pascal-functions%  */
-	__(call_fname)
-	__(ldr imm2,[sp,#lisp_frame.backlink])
-	__(ldr imm3,[rcontext,#tcr.cs_area])
-	__(str(imm2,area.active(imm3)))
-	__(discard_lisp_frame())
-	/* save_vsp will be restored from ff_call's stack frame, but  */
-	/* I included it here for consistency.  */
-	/* save_tsp is set below after we exit Lisp context.  */
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	/* Exit lisp context  */
-	__(mov imm1,#TCR_STATE_FOREIGN)
-	__(str(imm1,tcr.valence(rcontext)))
-	/* Restore the non-volatile registers & fpscr  */
-	__(lfd fp_zero,c_reg_save.save_fp_zero(sp))
-	__(lwz r31,c_reg_save.save_fpscr(sp))
-	__(stw r31,c_reg_save.save_fp_zero+4(sp))
-	__(lfd f0,c_reg_save.save_fp_zero(sp))
-	__(mtfsf 0xff,f0)
-	__(ldr r13,c_reg_save.save_gprs+(0*node_size)(sp)))
-	__(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
-	__(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
-	__(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
-	__(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
-	__(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
-	__(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
-	__(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
-	__(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
-	__(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
-	__(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
-	__(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
-	__(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
-	__(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
-	__(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
-	__(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
-	__(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
-	__(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
-	__(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
-        __(lfd f1,c_reg_save.save_fprs+(0*8)(sp))
-        __(lfd f2,c_reg_save.save_fprs+(1*8)(sp))
-        __(lfd f3,c_reg_save.save_fprs+(2*8)(sp))
-        __(lfd f4,c_reg_save.save_fprs+(3*8)(sp))
-        __(lfd f5,c_reg_save.save_fprs+(4*8)(sp))
-        __(lfd f6,c_reg_save.save_fprs+(5*8)(sp))
-        __(lfd f7,c_reg_save.save_fprs+(6*8)(sp))
-        __(lfd f8,c_reg_save.save_fprs+(7*8)(sp))
-        __(lfd f9,c_reg_save.save_fprs+(8*8)(sp))
-        __(lfd f10,c_reg_save.save_fprs+(9*8)(sp))
-        __(lfd f11,c_reg_save.save_fprs+(10*8)(sp))
-        __(lfd f12,c_reg_save.save_fprs+(11*8)(sp))
-        __(lfd f13,c_reg_save.save_fprs+(12*8)(sp))
-	__(lfd fp_s32conv,c_reg_save.save_fps32conv(sp))
-	__(ldr(sp,0(sp)))
-	__(ldr r3,[sp,#c_frame.param0])
-	__(ldr r4,[sp,#c_frame.param1])
-	__(ldr r5,[sp,#c_frame.param2])
-	__(ldr r6,[sp,#c_frame.param3])
-	__(ldr r7,[sp,#c_frame.param4])
-	__(ldr r8,[sp,#c_frame.param5])
-	__(ldr r9,[sp,#c_frame.param6])
-	__(ldr r10,[sp,#c_frame.param7])
-	__(ldr r11,[sp,#c_frame.savelr])
-	__(mtlr r11)
-	__(ldr r11,[sp,#c_frame.crsave])
-	__(mtcr r11)
-	__(bx lr)
-        
-/* Like misc_alloc (a LOT like it, since it does most of the work), but takes  */
-/* an initial-value arg in arg_z, element_count in arg_x, subtag in arg_y.  */
-/* Calls out to %init-misc, which does the rest of the work.  */
-
-_spentry(misc_alloc_init)
-	__(mflr loc_pc)
-	__(build_lisp_frame(fn,loc_pc,vsp))
-	__(mov fn,#0)
-	__(mov temp0,arg_z)		/* initval  */
-	__(mov arg_z,arg_y)		/* subtag  */
-	__(mov arg_y,arg_x)		/* element-count  */
-	__(bl _SPmisc_alloc)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr vsp,[sp,#lisp_frame.savevsp]) 
-	__(discard_lisp_frame())
-	__(mov fname,#nrs.init_misc)
-	__(set_nargs(2))
-	__(mov arg_y,temp0)
-	__(jump_fname())
-
-/* As in stack_misc_alloc above, only with a non-default initial-value.  */
-
-_spentry(stack_misc_alloc_init)
-	__(mflr loc_pc)
-	__(build_lisp_frame(fn,loc_pc,vsp))
-	__(mov fn,#0)
-	__(mov temp0,arg_z) /* initval  */
-	__(mov arg_z,arg_y) /* subtag  */
-	__(mov arg_y,arg_x) /* element-count  */
-	__(bl _SPstack_misc_alloc)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(discard_lisp_frame())
-	__(mov fname,#nrs.init_misc)
-	__(set_nargs(2))
-	__(mov arg_y,temp0)
-	__(jump_fname())
-
-	
-_spentry(callbuiltin)
-	__(ref_nrs_value(fname,builtin_functions))
-	__(la imm0,misc_data_offset(imm0))
-	__(ldrx(fname,fname,imm0))
-	__(jump_fname())
-
-/* the value of the nilreg-relative symbol %builtin-functions% should be  */
-/* a vector of symbols.  Call the symbol indexed by imm0 (boxed) and  */
-/* return a single value.  */
-
-_spentry(callbuiltin0)
-	__(set_nargs(0))
-	__(ref_nrs_value(fname,builtin_functions))
-	__(la imm0,misc_data_offset(imm0))
-	__(ldrx(fname,fname,imm0))
-	__(jump_fname())
-
-_spentry(callbuiltin1)
-	__(ref_nrs_value(fname,builtin_functions))
-	__(set_nargs(1))
-	__(la imm0,misc_data_offset(imm0))
-	__(ldrx(fname,fname,imm0))
-	__(jump_fname())
-
-_spentry(callbuiltin2)
-	__(set_nargs(2))
-	__(ref_nrs_value(fname,builtin_functions))
-	__(la imm0,misc_data_offset(imm0))
-	__(ldrx(fname,fname,imm0))
-	__(jump_fname())
-
-
-_spentry(callbuiltin3)
-	__(set_nargs(3))
-	__(ref_nrs_value(fname,builtin_functions))
-	__(la imm0,misc_data_offset(imm0))
-	__(ldrx(fname,fname,imm0))
-	__(jump_fname())
-	
-
-_spentry(popj)
-	.globl C(popj)
-C(popj):
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(mtlr loc_pc)
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(discard_lisp_frame())
-	__(bx lr)
-
-_spentry(restorefullcontext)
-	__(mflr loc_pc)
-	__(mtctr loc_pc)
-	__(ldr loc_pc,[sp,#lisp_frame.savelr])
-	__(mtlr loc_pc)
-	__(ldr vsp,[sp,#lisp_frame.savevsp])
-	__(ldr fn,[sp,#lisp_frame.savefn])
-	__(discard_lisp_frame())
-	__(bctr)
-
-_spentry(savecontextvsp)
-	__(ldr(imm0,tcr.cs_limit(rcontext)))
-	__(build_lisp_frame(fn,loc_pc,vsp))
-	__(mov fn,nfn)
-	__(trllt(sp,imm0))
-	__(bx lr)
-
-_spentry(savecontext0)
-	__(add imm0,vsp,imm0)
-	__(build_lisp_frame(fn,loc_pc,imm0))
-	__(ldr(imm0,tcr.cs_limit(rcontext)))
-	__(mov fn,nfn)
-	__(trllt(sp,imm0))
-	__(bx lr)
-
-
-/* Like .SPrestorefullcontext, only the saved return address  */
-/* winds up in loc-pc instead of getting thrashed around ...  */
-_spentry(restorecontext)
-	__(ldr(loc_pc,lisp_frame.savelr(sp)))
-	__(ldr(vsp,lisp_frame.savevsp(sp)))
-	__(ldr(fn,lisp_frame.savefn(sp)))
-	__(discard_lisp_frame())
-	__(bx lr)
-
-        
-/* Nargs is valid; all arg regs, lexpr-count pushed by caller.  */
-/* imm0 = vsp to restore.  */
-/* Return all values returned by caller to its caller, hiding  */
-/* the variable-length arglist.  */
-/* If we can detect that the caller's caller didn't expect  */
-/* multiple values, then things are even simpler.  */
-_spentry(lexpr_entry)
-	__(ref_global(imm1,ret1val_addr))
-	__(cmpr(cr0,imm1,loc_pc))
-	__(build_lisp_frame(fn,loc_pc,imm0))
-	__(bne cr0,1f)
-	__(ref_global(imm0,lexpr_return))
-	__(build_lisp_frame(rzero,imm0,vsp))
-	__(mov loc_pc,imm1)
-	__(ldr(imm0,tcr.cs_limit(rcontext)))
-	__(trllt(sp,imm0))
-	__(mov fn,#0)
-	__(bx lr)
-
-        /* The single-value case just needs to return to something that'll pop  */
-        /* the variable-length frame off of the vstack.  */
-1:
-	__(ref_global(loc_pc,lexpr_return1v))
-	__(ldr(imm0,tcr.cs_limit(rcontext)))
-	__(trllt(sp,imm0))
-	__(mov fn,#0)
-	__(bx lr)
-
-/* */
-/* Do a system call in Darwin.  The stack is set up much as it would be */
-/* for a PowerOpen ABI ff-call:	register parameters are in the stack */
-/* frame, and there are 4 extra words at the bottom of the frame that */
-/* we can carve a lisp frame out of. */
-/*  */
-/* System call return conventions are a little funky in Darwin: if "@sc" */
-/* is the address of the "sc" instruction, errors return to @sc+4 and */
-/* non-error cases return to @sc+8.  Error values are returned as */
-/* positive values in r3; this is true even if the system call returns */
-/* a doubleword (64-bit) result.  Since r3 would ordinarily contain */
-/* the high half of a doubleword result, this has to be special-cased. */
-/*  */
-/* The caller should set the c_frame.crsave field of the stack frame */
-/* to 0 if the result is to be interpreted as anything but a doubleword */
-/* and to non-zero otherwise.  (This only matters on an error return.) */
-
-        
-_spentry(poweropen_syscall)
-	__(mflr loc_pc)
-	__(vpush_saveregs())
-	__(ldr(imm1,0(sp)))
-	__(la imm2,-lisp_frame.size(imm1))
-        __(zero_doublewords imm2,0,lisp_frame.size)
-	__(str(imm1,lisp_frame.backlink(imm2)))
-	__(str(imm2,c_frame.backlink(sp)))
-	__(str(fn,lisp_frame.savefn(imm2)))
-	__(str(loc_pc,lisp_frame.savelr(imm2)))
-	__(str(vsp,lisp_frame.savevsp(imm2)))
-	__(ldr(imm3,tcr.cs_area(rcontext)))
-	__(str(imm2,area.active(imm3)))
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(rzero,tcr.ffi_exception(rcontext)))
-	__(mov save0,rcontext)
-	__(mov r3,#TCR_STATE_FOREIGN)
-	__(str(r3,tcr.valence(rcontext)))
-	__(mov rcontext,#0)
-	__(ldr(r3,c_frame.param0(sp)))
-	__(ldr(r4,c_frame.param1(sp)))
-	__(ldr(r5,c_frame.param2(sp)))
-	__(ldr(r6,c_frame.param3(sp)))
-	__(ldr(r7,c_frame.param4(sp)))
-	__(ldr(r8,c_frame.param5(sp)))
-	__(ldr(r9,c_frame.param6(sp)))
-	__(ldr(r10,c_frame.param7(sp)))
-	__(unbox_fixnum(r0,arg_z))
-	__(sc)
-        __ifdef(`LINUX')
-         __(bns+ 9f)
-        __else
-	 __(b 1f)
-	 __(b 9f)
-        __endif
-1:
-        __ifdef(`PPC64')
-         __(neg r3,r3)
-        __else
-	 __(ldr(imm2,c_frame.crsave(sp)))
-	 __(cmpri(cr0,imm2,0))
-	 __(bne cr0,2f)
-	 /* 32-bit result  */
-	 __(neg r3,r3)
-	 __(b 9f)
-2:
-	 /* 64-bit result  */
-	 __(neg r4,r3)
-	 __(mov r3,#-1)
-        __endif
-9:
-	__(mov imm2,save0)	/* recover context  */
-	__(ldr(sp,c_frame.backlink(sp)))
-	__(mov imm4,#TCR_STATE_LISP)
-	__(mov rzero,#0)
-	__(mov loc_pc,#0)
-	__(mov arg_x,#nil_value)
-	__(mov arg_y,#nil_value)
-	__(mov arg_z,#nil_value)
-	__(mov temp0,#nil_value)
-	__(mov temp1,#nil_value)
-	__(mov temp2,#nil_value)
-	__(mov temp3,#nil_value)
-	__(mov fn,#nil_value)
-	__(mov rcontext,imm2)
-	__(ldr(allocptr,tcr.save_allocptr(rcontext)))
-	__(ldr(allocbase,tcr.save_allocbase(rcontext)))
-	__(ldr(tsp,tcr.save_tsp(rcontext)))
-        __(mov save0,#0)
-        __(mov save1,#0)
-        __(mov save2,#0)
-        __(mov save3,#0)
-        __(mov save4,#0)
-        __(mov save5,#0)
-        __(mov save6,#0)
-        __(mov save7,#0)        
-	__(str(imm4,tcr.valence(rcontext)))
-	__(vpop_saveregs)
-	__(ldr(loc_pc,lisp_frame.savelr(sp)))
-	__(mtlr loc_pc)
-	__(ldr(fn,lisp_frame.savefn(sp)))
-	__(discard_lisp_frame)
-        __(mtxer rzero)
-	__(check_pending_interrupt(`cr1'))
-	__(bx lr)
-        
-        
-_spentry(builtin_plus)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(addo. arg_z,arg_y,arg_z)
-	__(bnslr+)
-	__(mtxer rzero)
-	__(unbox_fixnum(imm1,arg_z))
-        __ifdef(`PPC64')
-	 __(mov imm0,#two_digit_bignum_header)
-         __(rotldi imm1,imm1,32)
-	 __(xoris imm1,imm1,0xe000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __else
-	 __(mov imm0,#one_digit_bignum_header)
-	 __(xoris imm1,imm1,0xc000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __endif
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_plus,2))
-_spentry(builtin_minus)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(subo. arg_z,arg_y,arg_z)
-	__(bnslr+)
-	__(mtxer rzero)
-	__(unbox_fixnum(imm1,arg_z))
-        __ifdef(`PPC64')
-	 __(mov imm0,#two_digit_bignum_header)
-         __(rotldi imm1,imm1,32)
-	 __(xoris imm1,imm1,0xe000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __else
-	 __(mov imm0,#one_digit_bignum_header)
-	 __(xoris imm1,imm1,0xc000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __endif
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_minus,2))
-_spentry(builtin_times)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(unbox_fixnum(imm2,arg_y))
-	__(bne cr0,1f)
-        __(bne cr1,1f)
-        __ifdef(`PPC64')
-         __(mulldo. imm3,arg_z,imm2)
-         __(bso 2f)
-         __(mov arg_z,imm3)
-         __(bx lr)
-	 /* Args are fixnums; result can't be  */
-2:	 __(mtxer rzero)
-	 __(unbox_fixnum(imm3,arg_z))
-	 __(mulld imm1,imm3,imm2) /* imm1 = low  64 bits  */
-	 __(mulhd imm0,imm3,imm2) /* imm0 = high 64 bits  */
-	 __(b _SPmakes128)
-        __else
-	 __(mullwo. imm3,arg_z,imm2)
-	 __(bso 2f)		/*  SO set if result would overflow a fixnum  */
-	 __(mov arg_z,imm3)
-	 __(bx lr)
-	 /* Args are fixnums; result can't be  */
-2:	 __(mtxer rzero)
-	 __(unbox_fixnum(imm3,arg_z))
-	 __(mullw imm1,imm3,imm2) /* imm1 = low  32 bits  */
-	 __(mulhw imm0,imm3,imm2) /* imm0 = high 32 bits  */
-	 __(b _SPmakes64)
-        __endif
-
-1:	__(jump_builtin(_builtin_times,2))
-
-_spentry(builtin_div)
-	__(jump_builtin(_builtin_div,2))
-
-_spentry(builtin_eq)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(bnelr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_eq,2))
-
-_spentry(builtin_ne)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(beqlr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_ne,2))
-
-_spentry(builtin_gt)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(bnglr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_gt,2))
-
-_spentry(builtin_ge)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(bltlr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_ge,2))
-
-_spentry(builtin_lt)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(bnllr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_lt,2))
-
-_spentry(builtin_le)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(cmpr(cr2,arg_y,arg_z))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(mov arg_z,#nil_value)
-	__(bgtlr cr2)
-	__(mov arg_z,#t_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_le,2))
-
-
-_spentry(builtin_eql)
-        __(cmpr(cr1,arg_y,arg_z))
-        __(extract_fulltag(imm2,arg_y))
-        __(extract_fulltag(imm3,arg_z))
-        __(beq cr1,1f)
-        __(cmpri(cr1,imm2,fulltag_misc))
-        __(cmpri(cr0,imm3,fulltag_misc))
-        __(bne cr1,2f)
-        __(extract_subtag(imm0,arg_y))
-        __(bne cr0,2f)
-        __(extract_subtag(imm1,arg_z))
-        __(cmpr(cr0,imm0,imm1))
-        __(bne cr0,2f)
-	__(jump_builtin(_builtin_eql,2))
-1:	__(mov arg_z,#t_value)
-	__(bx lr)
-2:	__(mov arg_z,#nil_value)
-	__(bx lr)
-        
-_spentry(builtin_length)
-        __(cmpri(cr1,arg_z,nil_value))
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(cr0,imm0,min_vector_subtag))
-        __(beq cr1,1f)
-        __ifdef(`PPC64')
-         __(cmpdi cr2,imm0,fulltag_cons)
-        __else
-	 __(cmpwi cr2,imm0,tag_list)
-        __endif
-	__(beq- cr0,2f)
-	__(blt- cr0,3f)
-	/* (simple-array * (*))  */
-	__(vector_length(arg_z,arg_z,imm0))
-	__(bx lr)
-1:      __(mov arg_z,#0)
-        __(bx lr)
-2:
-	__(ldr(arg_z,vectorH.logsize(arg_z)))
-	__(bx lr)        
-3:	__(bne cr2,8f)
-	__(mov temp2,#-1<<fixnum_shift)
-	__(mov temp0,arg_z)	/* fast pointer  */
-	__(mov temp1,arg_z)	/* slow pointer  */
-        __ifdef(`PPC64')
-4:       __(extract_fulltag(imm0,temp0))
-         __(cmpdi cr7,temp0,nil_value)
-         __(cmpdi cr1,imm0,fulltag_cons)
-         __(addi temp2,temp2,fixnum_one)
-         __(beq cr7,9f)
-         __(andi. imm0,temp2,1<<fixnum_shift)
-         __(bne cr1,8f)
-         __(extract_fulltag(imm1,temp1))
-         __(_cdr(temp0,temp0))
-         __(cmpdi cr1,imm1,fulltag_cons)
-	 __(beq cr0,4b)
-	 __(bne cr1,8f)
-	 __(_cdr(temp1,temp1))
-	 __(cmpd cr0,temp0,temp1)
-	 __(bne cr0,4b)
-        __else
-4:	 __(extract_lisptag(imm0,temp0))
-	 __(cmpri(cr7,temp0,nil_value))
-	 __(cmpri(cr1,imm0,tag_list))
-	 __(addi temp2,temp2,fixnum_one)
-	 __(beq cr7,9f)
-	 __(andi. imm0,temp2,1<<fixnum_shift)
-	 __(bne cr1,8f)
-	 __(extract_lisptag(imm1,temp1))	
-	 __(_cdr(temp0,temp0))
-	 __(cmpri(cr1,imm1,tag_list))
-	 __(beq cr0,4b)
-	 __(bne cr1,8f)
-	 __(_cdr(temp1,temp1))
-	 __(cmpr(cr0,temp0,temp1))
-	 __(bne cr0,4b)
-        __endif
-8:	
-	__(jump_builtin(_builtin_length,1))
-9:	
-	__(mov arg_z,temp2)
-	__(bx lr)
-        
-_spentry(builtin_seqtype)
-        __ifdef(`PPC64')
-         __(cmpdi cr2,arg_z,nil_value)
-         __(extract_typecode(imm0,arg_z))
-         __(beq cr2,1f)
-	 __(cmpri(cr0,imm0,fulltag_cons))
-        __else
-	 __(extract_typecode(imm0,arg_z))
- 	 __(cmpri(cr0,imm0,tag_list))
-        __endif
-	__(cmpri(cr1,imm0,min_vector_subtag))
-	__(beq cr0,1f)
-	__(blt- cr1,2f)
-	__(mov arg_z,#nil_value)
-	__(bx lr)
-1:	__(mov arg_z,#t_value)
-	__(bx lr)
-2:
-	__(jump_builtin(_builtin_seqtype,1))
-        
-_spentry(builtin_assq)
-	__(cmpri(arg_z,nil_value))
-	__(beqlr)
-1:	__(trap_unless_list(arg_z,imm0))
-	__(_car(arg_x,arg_z))
-	__(_cdr(arg_z,arg_z))
-	__(cmpri(cr2,arg_x,nil_value))
-	__(cmpri(cr1,arg_z,nil_value))
-	__(beq cr2,2f)
-	__(trap_unless_list(arg_x,imm0))
-	__(_car(temp0,arg_x))
-	__(cmpr(temp0,arg_y))
-	__(bne cr0,2f)
-	__(mov arg_z,arg_x)
-	__(bx lr)
-2:	__(bne cr1,1b)
-	__(bx lr)
-
-_spentry(builtin_memq)
-	__(cmpri(cr1,arg_z,nil_value))
-	__(b 2f)
-1:	__(trap_unless_list(arg_z,imm0))
-	__(_car(arg_x,arg_z))
-	__(_cdr(temp0,arg_z))
-	__(cmpr(arg_x,arg_y))
-	__(cmpri(cr1,temp0,nil_value))
-	__(beqlr)
-	__(mov arg_z,temp0)
-2:	__(bne cr1,1b)
-	__(bx lr)
-
-        __ifdef(`PPC64')
-logbitp_max_bit = 61
-        __else
-logbitp_max_bit = 30
-        __endif
-        
-_spentry(builtin_logbitp)
-	/* Call out unless both fixnums,0 <=  arg_y < logbitp_max_bit  */
-        __(cmplri(cr2,arg_y,logbitp_max_bit<<fixnum_shift))
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(unbox_fixnum(imm0,arg_y))
-	__(subfic imm0,imm0,logbitp_max_bit)
-        __ifdef(`PPC64')
-         __(rldcl imm0,arg_z,imm0,63)
-         __(mulli imm0,imm0,t_offset)
-        __else
-  	 __(rlwnm imm0,arg_z,imm0,31,31)
-	 __(rlwimi imm0,imm0,4,27,27)
-        __endif
-	__(bnl cr2,1f)
-	__(bne cr0,1f)
-        __(bne cr1,1f)
-	__(addi arg_z,imm0,nil_value)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_logbitp,2))
-
-_spentry(builtin_logior)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(or arg_z,arg_y,arg_z)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_logior,2))
-
-_spentry(builtin_logand)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(and arg_z,arg_y,arg_z)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_logand,2))
-	
-_spentry(builtin_ash)
-        __ifdef(`PPC64')
-	 __(cmpdi cr1,arg_z,0)
-         __(extract_lisptag(imm0,arg_y))
-         __(extract_lisptag(imm1,arg_z))
-         __(cmpdi cr0,imm0,tag_fixnum)
-         __(cmpdi cr3,imm1,tag_fixnum)
-	 __(cmpdi cr2,arg_z,-(63<<3))	/* !! 3 =  fixnumshift  */
-	 __(bne- cr0,9f)
-         __(bne- cr3,9f)
-	 __(bne cr1,0f)
-	 __(mov arg_z,arg_y)	/* (ash n 0) => n  */
-	 __(bx lr)
-0:		
-	 __(unbox_fixnum(imm1,arg_y))
-	 __(unbox_fixnum(imm0,arg_z))
-	 __(bgt cr1,2f)
-	 /* (ash n -count) => fixnum  */
-	 __(neg imm2,imm0)
-	 __(bgt cr2,1f)
-	 __(mov imm2,#63)
-1:	
-	 __(srad imm0,imm1,imm2)
-	 __(box_fixnum(arg_z,imm0))
-	 __(bx lr)
-	 /* Integer-length of arg_y/imm1 to imm2  */
-2:		
-	 __(cntlzd. imm2,imm1)
-	 __(bne 3f)		/* cr0`eq' set if negative  */
-	 __(not imm2,imm1)
-	 __(cntlzd imm2,imm2)
-3:
-	 __(subfic imm2,imm2,64)
-	 __(add imm2,imm2,imm0)	 /* imm2 <- integer-length(imm1) + count  */
-	 __(cmpdi cr1,imm2,63-fixnumshift)
-	 __(cmpdi cr2,imm0,64)
-	 __(sld imm2,imm1,imm0)
-	 __(bgt cr1,6f)
-	 __(box_fixnum(arg_z,imm2))
-	 __(bx lr)	
-6:
-	 __(bgt cr2,9f)
-	 __(bne cr2,7f)
-	 /* Shift left by 64 bits exactly  */
-	 __(mov imm0,imm1)
-	 __(mov imm1,#0)
-	 __(beq _SPmakes128)
-	 __(b _SPmakeu128)
-7:
-	 /* Shift left by fewer than 64 bits, result not a fixnum  */
-	 __(subfic imm0,imm0,64)
-	 __(beq 8f)
-	 __(srd imm0,imm1,imm0)
-	 __(mov imm1,imm2)
-	 __(b _SPmakeu128)
-8:	
-	 __(srad imm0,imm1,imm0)
-	 __(mov imm1,imm2)
-	 __(b _SPmakes128)
-        __else
-	 __(cmpri(cr1,arg_z,0))
-         __(extract_lisptag(imm0,arg_y))
-         __(extract_lisptag(imm1,arg_z))
-         __(cmpri(cr0,imm0,tag_fixnum))
-         __(cmpri(cr3,imm1,tag_fixnum))
-	 __(cmpri(cr2,arg_z,-(29<<2)))	/* !! 2 =  fixnumshift  */
-	 __(bne- cr0,9f)
-         __(bne- cr3,9f)
-	 __(bne cr1,0f)
-	 __(mov arg_z,arg_y)	/* (ash n 0) => n  */
-	 __(bx lr)
-0:		
-	 __(unbox_fixnum(imm1,arg_y))
-	 __(unbox_fixnum(imm0,arg_z))
-	 __(bgt cr1,2f)
-	 /* (ash n -count) => fixnum  */
-	 __(neg imm2,imm0)
-	 __(bgt cr2,1f)
-	 __(mov imm2,#31)
-1:	
-	 __(sraw imm0,imm1,imm2)
-	 __(box_fixnum(arg_z,imm0))
-	 __(bx lr)
-	 /* Integer-length of arg_y/imm1 to imm2  */
-2:		
-	 __(cntlzw. imm2,imm1)
-	 __(bne 3f)		/* cr0`eq' set if negative  */
-	 __(not imm2,imm1)
-	 __(cntlzw imm2,imm2)
-3:
-	 __(subfic imm2,imm2,32)
-	 __(add imm2,imm2,imm0)	 /* imm2 <- integer-length(imm1) + count  */
-	 __(cmpri(cr1,imm2,31-fixnumshift))
-	 __(cmpri(cr2,imm0,32))
-	 __(slw imm2,imm1,imm0)
-	 __(bgt cr1,6f)
-	 __(box_fixnum(arg_z,imm2))
-	 __(bx lr)	
-6:
-	 __(bgt cr2,9f)
-	 __(bne cr2,7f)
-	 /* Shift left by 32 bits exactly  */
-	 __(mov imm0,imm1)
-	 __(mov imm1,#0)
-	 __(beq _SPmakes64)
-	 __(b _SPmakeu64)
-7:
-	 /* Shift left by fewer than 32 bits, result not a fixnum  */
-	 __(subfic imm0,imm0,32)
-	 __(beq 8f)
-	 __(srw imm0,imm1,imm0)
-	 __(mov imm1,imm2)
-	 __(b _SPmakeu64)
-8:	
-	 __(sraw imm0,imm1,imm0)
-	 __(mov imm1,imm2)
-	 __(b _SPmakes64)
-        __endif
-9:		
-	__(jump_builtin(_builtin_ash,2))
-
-_spentry(builtin_negate)
-	__(extract_lisptag_(imm0,arg_z))
-	__(bne- cr0,1f)
-	__(nego. arg_z,arg_z)
-	__(bnslr+)
-	__(mtxer rzero)
-	__(unbox_fixnum(imm1,arg_z))
-        __ifdef(`PPC64')
-	 __(mov imm0,#two_digit_bignum_header)
-         __(rotldi imm1,imm1,32)
-	 __(xoris imm1,imm1,0xe000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __else
-	 __(mov imm0,#one_digit_bignum_header)
-	 __(xoris imm1,imm1,0xc000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __endif
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_negate,1))
-
-_spentry(builtin_logxor)
-        __(extract_lisptag(imm0,arg_y))
-        __(extract_lisptag(imm1,arg_z))
-        __(cmpri(cr0,imm0,tag_fixnum))
-        __(cmpri(cr1,imm1,tag_fixnum))
-	__(bne- cr0,1f)
-        __(bne- cr1,1f)
-	__(xor arg_z,arg_y,arg_z)
-	__(bx lr)
-1:
-	__(jump_builtin(_builtin_logxor,2))
-
-
-
-        
-_spentry(builtin_aset1)
-	__(extract_typecode(imm0,arg_x))
-	__(cmpri(cr0,imm0,min_vector_subtag))
-	__(box_fixnum(temp0,imm0))
-	__(bgt cr0,1f)
-	__(jump_builtin(_builtin_aset1,3))
-1:
-	__(b _SPsubtag_misc_set)
-
-/* Enter the debugger  */
-_spentry(breakpoint)
-	__(mov r3,#0)
-	__(tw 28,sp,sp)	/* 28 = lt|gt|eq (assembler bug for the latter)  */
-	__(bx lr)		/* if handler didn't  */
-
-/* */
-/* We're entered with an eabi_c_frame on the C stack.  There's a */
-/* lisp_frame reserved underneath it; we'll link it in in a minute. */
-/* Load the outgoing GPR arguments from eabi_c_frame.param`0-7', */
-/* then shrink the eabi_c_frame. */
-/*  */
-	
-_spentry(eabi_ff_call)
-	__(mflr loc_pc)
-	__(str(sp,eabi_c_frame.savelr(sp)))
-	__(vpush_saveregs())		/* Now we can use save0-save7 to point to stacks  */
-	__(mov save0,rcontext)	/* or address globals.  */
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(imm0,subtag_macptr))
-	__(ldr(save1,0(sp)))	/* bottom of reserved lisp frame  */
-	__(la save2,-lisp_frame.size(save1))	/* top of lisp frame */
-        __(zero_doublewords save2,0,lisp_frame.size)
-	__(str(save1,lisp_frame.backlink(save2)))
-	__(str(save2,c_frame.backlink(sp)))
-	__(str(fn,lisp_frame.savefn(save2)))
-	__(str(loc_pc,lisp_frame.savelr(save2)))
-	__(str(vsp,lisp_frame.savevsp(save2)))
-	__(bne 1f)
-	__(ldr(arg_z,macptr.address(arg_z)))
-1:
-	__(ldr(save3,tcr.cs_area(rcontext)))
-	__(str(save2,area.active(save3)))
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(mtctr arg_z)
-	__(str(rzero,tcr.ffi_exception(rcontext)))
-	__(mffs f0)
-	__(stfd f0,tcr.lisp_fpscr(rcontext))	/* remember lisp's fpscr  */
-	__(mtfsf 0xff,fp_zero)	/* zero foreign fpscr  */
-	__(mov imm1,#TCR_STATE_FOREIGN)
-	__(str(imm1,tcr.valence(rcontext)))
-	__(ldr(r2,tcr.native_thread_info(rcontext)))
-	__(ldr(r13,lisp_globals.saveR13(0)))
-	__(ldr(r3,eabi_c_frame.param0(sp)))
-	__(ldr(r4,eabi_c_frame.param1(sp)))
-	__(ldr(r5,eabi_c_frame.param2(sp)))
-	__(ldr(r6,eabi_c_frame.param3(sp)))
-	__(ldr(r7,eabi_c_frame.param4(sp)))
-	__(ldr(r8,eabi_c_frame.param5(sp)))
-	__(ldr(r9,eabi_c_frame.param6(sp)))
-	__(ldr(r10,eabi_c_frame.param7(sp)))
-	__(la save1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))
-	__(str(rzero,eabi_c_frame.savelr(save1)))
-	__(str(save2,eabi_c_frame.backlink(save1)))
-	__(mov sp,save1)
-	/* If we're calling a varargs C function, it'll want to */
-	/* know whether or not we've passed any args in FP regs. */
-	/* Better to say that we did (and force callee to save FP */
-	/* arg regs on entry) than to say that we didn't and get */
-	/* garbage results  */
-	__(crset 6)
-	__(bctrl)
-	/* C should have preserved save0 (= rcontext) for us.  */
-	__(ldr(sp,0(sp)))
-	__(mov imm2,save0)
-	__(ldr(vsp,lisp_frame.savevsp(sp)))
-	__(mov rzero,#0)
-	__(mov loc_pc,rzero)
-	__(mov arg_x,#nil_value)
-	__(mov arg_y,#nil_value)
-	__(mov arg_z,#nil_value)
-	__(mov temp0,#nil_value)
-	__(mov temp1,#nil_value)
-	__(mov temp2,#nil_value)
-	__(mov temp3,#nil_value)
-	__(mov fn,#nil_value)
-	__(mov rcontext,imm2)
-	__(mov imm2,#TCR_STATE_LISP)
-	__(ldr(tsp,tcr.save_tsp(rcontext)))
-        __(mov save0,#0)
-        __(mov save1,#0)
-        __(mov save2,#0)
-        __(mov save3,#0)
-        __(mov save4,#0)
-        __(mov save5,#0)
-        __(mov save6,#0)
-        __(mov save7,#0)
-        __(mov allocptr,#-dnode_size)
-        __(mov allocbase,#-dnode_size)
-	__(str(imm2,tcr.valence(rcontext)))	
-	__(vpop_saveregs())
-	__(ldr(allocptr,tcr.save_allocptr(rcontext)))
-	__(ldr(allocbase,tcr.save_allocbase(rcontext)))
-	__(ldr(loc_pc,lisp_frame.savelr(sp)))
-	__(mtlr loc_pc)
-	__(ldr(fn,lisp_frame.savefn(sp)))
-	__(mffs f0)
-	__(stfd f0,8(sp))
-	__(lwz imm3,12(sp))	/* imm3 = FPSCR after call  */
-        __(clrrwi imm2,imm3,8)
-	__(discard_lisp_frame())
-	__(str(imm2,tcr.ffi_exception(rcontext)))
-	__(lfd f0,tcr.lisp_fpscr(rcontext))
-	__(mtfsf 0xff,f0)
-	__(check_pending_interrupt(`cr1'))
-        __(mtxer rzero)
-        __(mtctr rzero)
-	__(bx lr)
-        
-/*  */
-/* This gets called with R11 holding the unboxed callback index. */
-/* */
-        
-_spentry(eabi_callback)
-	/* First, we extend the C frame so that it has room for */
-        /* incoming arg regs.  */
-	__(ldr(r0,eabi_c_frame.backlink(sp)))
-	__(stru(r0,eabi_c_frame.param0-varargs_eabi_c_frame.incoming_stack_args(sp)))
-	__(mflr r0)
-	__(str(r0,varargs_eabi_c_frame.savelr(sp)))
-	__(str(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp)))
-	__(str(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp)))
-	__(str(r5,varargs_eabi_c_frame.gp_save+(2*4)(sp)))
-	__(str(r6,varargs_eabi_c_frame.gp_save+(3*4)(sp)))
-	__(str(r7,varargs_eabi_c_frame.gp_save+(4*4)(sp)))
-	__(str(r8,varargs_eabi_c_frame.gp_save+(5*4)(sp)))
-	__(str(r9,varargs_eabi_c_frame.gp_save+(6*4)(sp)))
-	__(str(r10,varargs_eabi_c_frame.gp_save+(7*4)(sp)))
-	/* Could check the appropriate CR bit and skip saving FP regs here  */
-	__(stfd f1,varargs_eabi_c_frame.fp_save+(0*8)(sp))
-	__(stfd f2,varargs_eabi_c_frame.fp_save+(1*8)(sp))
-	__(stfd f3,varargs_eabi_c_frame.fp_save+(2*8)(sp))
-	__(stfd f4,varargs_eabi_c_frame.fp_save+(3*8)(sp))
-	__(stfd f5,varargs_eabi_c_frame.fp_save+(4*8)(sp))
-	__(stfd f6,varargs_eabi_c_frame.fp_save+(5*8)(sp))
-	__(stfd f7,varargs_eabi_c_frame.fp_save+(6*8)(sp))
-	__(stfd f8,varargs_eabi_c_frame.fp_save+(7*8)(sp))
-	__(la r0,varargs_eabi_c_frame.incoming_stack_args(sp))
-	__(str(r0,varargs_eabi_c_frame.overflow_arg_area(sp)))
-	__(la r0,varargs_eabi_c_frame.regsave(sp))
-	__(str(r0,varargs_eabi_c_frame.reg_save_area(sp)))
-	__(mov r0,#0)
-	__(str(r0,varargs_eabi_c_frame.flags(sp)))
-
-	/* Save the non-volatile registers on the sp stack  */
-	/* This is a non-standard stack frame, but noone will ever see it,  */
-        /* so it doesn't matter. It will look like more of the stack frame pushed below.  */
-	__(stru(sp,-(c_reg_save.size)(sp)))
-        __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp)))
-        __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
-        __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
-        __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
-        __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
-        __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
-        __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
-        __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
-        __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
-        __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
-        __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
-        __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
-        __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
-        __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
-        __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
-        __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
-        __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
-        __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
-        __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
-	__(mffs f0)
-	__(stfd f0,c_reg_save.save_fp_zero(sp))
-	__(ldr(r31,c_reg_save.save_fp_zero+4(sp)))	/* recover FPSCR image  */
-	__(str(r31,c_reg_save.save_fpscr(sp)))
-	__(lwi(r30,0x43300000))
-	__(lwi(r31,0x80000000))
-	__(str(r30,c_reg_save.save_fp_zero(sp)))
-	__(str(r31,c_reg_save.save_fp_zero+4(sp)))
-	__(stfd fp_s32conv,c_reg_save.save_fps32conv(sp))
-	__(lfd fp_s32conv,c_reg_save.save_fp_zero(sp))
-	__(stfd fp_zero,c_reg_save.save_fp_zero(sp))
-	__(lfs fp_zero,lisp_globals.short_float_zero(0))	/* ensure that fp_zero contains 0.0  */
-
-	
-/* Restore rest of Lisp context.  */
-/* Could spread out the memory references here to gain a little speed  */
-	__(mov loc_pc,#0)
-	__(mov fn,#0)                     /* subprim, not a lisp function  */
-	__(mov temp3,#0)
-	__(mov temp2,#0)
-	__(mov temp1,#0)
-	__(mov temp0,#0)
-	__(mov arg_x,#0)
-	__(box_fixnum(arg_y,r11))	/* callback-index  */
-	__(la arg_z,c_reg_save.size+varargs_eabi_c_frame.gp_save(sp))	/* parameters (tagged as a fixnum)  */
-
-	/* Recover lisp thread context. Have to call C code to do so.  */
-	__(ref_global(r12,get_tcr))
-	__(mtctr r12)
-        __(mov r3,#1)
-	__(stru(sp,-(stack_align(eabi_c_frame.minsiz))(sp)))
-	__(bctrl)
-	__(la sp,(stack_align(eabi_c_frame.minsiz))(sp))
-	__(la rcontext,TCR_BIAS(r3))
-	__(mov allocptr,#0)
-	__(mov allocbase,#0)
-	__(ldr(vsp,tcr.save_vsp(rcontext)))
-	__(ldr(tsp,tcr.save_tsp(rcontext)))		
-	__(mov rzero,#0)
-	__(mtxer rzero) /* lisp wants the overflow bit clear  */
-	__(mov imm0,#TCR_STATE_LISP)
-	__(mov save0,#0)
-	__(mov save1,#0)
-	__(mov save2,#0)
-	__(mov save3,#0)
-	__(mov save4,#0)
-	__(mov save5,#0)
-	__(mov save6,#0)
-	__(mov save7,#0)
-        __(mtctr rzero)
-	__(str(imm0,tcr.valence(rcontext)))
-	__(ldr(allocptr,tcr.save_allocptr(rcontext)))
-	__(ldr(allocbase,tcr.save_allocbase(rcontext)))
-	__(lfd f0,tcr.lisp_fpscr(rcontext))
-	__(mtfsf 0xff,f0)
-
-        __(restore_saveregs(vsp))        
-	/* load nargs and callback to the lisp  */
-	__(set_nargs(2))
-	__(ldr(imm2,tcr.cs_area(rcontext)))
-	__(ldr(imm4,area.active(imm2)))
-	__(stru(imm4,-lisp_frame.size(sp)))
-	__(str(imm3,lisp_frame.savelr(sp)))
-	__(str(vsp,lisp_frame.savevsp(sp)))	/* for stack overflow code  */
-	__(mov fname,#nrs.callbacks)	/* %pascal-functions%  */
-	__(call_fname)
-	__(ldr(imm2,lisp_frame.backlink(sp)))
-	__(ldr(imm3,tcr.cs_area(rcontext)))
-	__(str(imm2,area.active(imm3)))
-	__(discard_lisp_frame())
-	/* save_vsp will be restored from ff_call's stack frame, but  */
-	/* I included it here for consistency.  */
-	/* save_tsp is set below after we exit Lisp context.  */
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	/* Exit lisp context  */
-	/* This is not necessary yet, but will be once we can be interrupted  */
-	__(mov imm1,#TCR_STATE_FOREIGN)
-	__(str(imm1,tcr.valence(rcontext)))
-	/* Restore the non-volatile registers & fpscr  */
-	__(lfd fp_zero,c_reg_save.save_fp_zero(sp))
-	__(ldr(r31,c_reg_save.save_fpscr(sp)))
-	__(str(r31,c_reg_save.save_fp_zero+4(sp)))
-	__(lfd f0,c_reg_save.save_fp_zero(sp))
-	__(mtfsf 0xff,f0)
-	__(ldr(r13,c_reg_save.save_gprs+(0*node_size)(sp)))
-	__(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp)))
-	__(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp)))
-	__(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp)))
-	__(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp)))
-	__(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp)))
-	__(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp)))
-	__(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp)))
-	__(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp)))
-	__(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp)))
-	__(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp)))
-	__(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp)))
-	__(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp)))
-	__(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp)))
-	__(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp)))
-	__(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp)))
-	__(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp)))
-	__(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp)))
-	__(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp)))
-	__(lfd fp_s32conv,c_reg_save.save_fps32conv(sp))
-	__(ldr(sp,0(sp)))
-
-	__(ldr(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp)))
-	__(ldr(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp)))
-	__(lfd f1,varargs_eabi_c_frame.gp_save+(2*4)(sp))
-	__(ldr(r5,varargs_eabi_c_frame.savelr(sp)))
-	__(str(r5,varargs_eabi_c_frame.old_savelr(sp)))
-	__(mtlr r5)
-	__(ldr(r5,varargs_eabi_c_frame.backlink(sp)))
-	__(str(r5,varargs_eabi_c_frame.old_backlink(sp)))
-	__(la sp,varargs_eabi_c_frame.old_backlink(sp))
-	__(bx lr)
-	
-
-/*	Do a linux system call:	 the system call index is (boxed) */
-/*	in arg_z, and other arguments are in an eabi_c_frame on */
-/*	the C stack.  As is the case with an eabi_ff_call, there's */
-/*	a lisp frame reserved underneath the eabi_c_frame. */
-
-/*	This is a little simpler than eabi_ff_call, because we */
-/*	can assume that there are no synchronous callbacks to */
-/*	lisp (that might cause a GC.)  It's also simpler for the */
-/*	caller, since we return error status atomically. */
-
-/*	A system call can clobber any or all of r9-r12, so we need */
-/*	to save and restore allocptr, allocbase, and tsp. */
-	
-_spentry(eabi_syscall)
-/*	We're entered with an eabi_c_frame on the C stack.  There's a */
-/*	lisp_frame reserved underneath it; we'll link it in in a minute. */
-/*	Load the outgoing GPR arguments from eabi_c_frame.param`0-7', */
-/*	then shrink the eabi_c_frame. */
-
-	__(mflr loc_pc)
-        __(vpush_saveregs())
-	__(str(sp,eabi_c_frame.savelr(sp)))
-	__(mov arg_x,#nil_value)
-	__(mov temp0,rcontext)
-	__(ldr(temp1,c_frame.backlink(sp)))	/* bottom of reserved lisp frame  */
-	__(la temp2,-lisp_frame.size(temp1))	/* top of lisp frame  */
-        __(zero_doublewords temp2,0,lisp_frame.size)
-	__(str(temp1,lisp_frame.backlink(temp2)))
-	__(str(temp2,c_frame.backlink(sp)))
-	__(str(fn,lisp_frame.savefn(temp2)))
-	__(str(loc_pc,lisp_frame.savelr(temp2)))
-	__(str(vsp,lisp_frame.savevsp(temp2)))
-	__(ldr(temp3,tcr.cs_area(rcontext)))
-	__(str(temp2,area.active(temp3)))
-	__(str(allocptr,tcr.save_allocptr(rcontext)))
-	__(str(allocbase,tcr.save_allocbase(rcontext)))
-	__(str(tsp,tcr.save_tsp(rcontext)))
-	__(str(vsp,tcr.save_vsp(rcontext)))
-	__(str(rzero,tcr.ffi_exception(rcontext)))
-	__(mov imm1,#TCR_STATE_FOREIGN)
-	__(str(imm1,tcr.valence(rcontext)))
-	__(ldr(r13,lisp_globals.saveR13(0)))
-	__(ldr(r3,eabi_c_frame.param0(sp)))
-	__(ldr(r4,eabi_c_frame.param1(sp)))
-	__(ldr(r5,eabi_c_frame.param2(sp)))
-	__(ldr(r6,eabi_c_frame.param3(sp)))
-	__(ldr(r7,eabi_c_frame.param4(sp)))
-	__(ldr(r8,eabi_c_frame.param5(sp)))
-	__(ldr(r9,eabi_c_frame.param6(sp)))
-	__(ldr(r10,eabi_c_frame.param7(sp)))
-	__(la temp1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))
-	__(str(rzero,eabi_c_frame.savelr(temp1)))
-	__(str(temp2,eabi_c_frame.backlink(temp1)))
-	__(mov sp,temp1)
-	__(unbox_fixnum(r0,arg_z))
-	__(sc)
-	__(nop)
-	/* C should have preserved temp0 (= rcontext) for us.  */
-	__(ldr(sp,0(sp)))
-	__(mov imm2,temp0)
-	__(ldr(vsp,lisp_frame.savevsp(sp)))
-	__(mov rzero,#0)
-	__(mov loc_pc,rzero)
-	__(mov fn,rzero)
-	__(mov arg_x,#nil_value)
-	__(mov arg_y,#nil_value)
-	__(mov arg_z,#nil_value)
-	__(mov temp0,#nil_value)
-	__(mov temp1,#nil_value)
-	__(mov temp2,#nil_value)
-	__(mov temp3,#nil_value)
-	__(mov fn,#nil_value)
-        
-	__(mov imm3,#TCR_STATE_LISP)
-	__(mov rcontext,imm2)
-        __(mov save0,#0)
-        __(mov save1,#0)
-        __(mov save2,#0)
-        __(mov save3,#0)
-        __(mov save4,#0)
-        __(mov save5,#0)
-        __(mov save6,#0)
-        __(mov save7,#0)        
-	__(str(imm3,tcr.valence(rcontext)))
-	__(vpop_saveregs)
-	__(ldr(allocptr,tcr.save_allocptr(rcontext)))
-	__(ldr(allocbase,tcr.save_allocbase(rcontext)))
-	__(ldr(tsp,tcr.save_tsp(rcontext)))
-	__(ldr(loc_pc,lisp_frame.savelr(sp)))
-	__(mtlr loc_pc)
-	__(ldr(fn,lisp_frame.savefn(sp)))
-	__(discard_lisp_frame())
-	__(bns 1f)
-	__(neg r3,r3)
-1:      
-	__(check_pending_interrupt(`cr1'))                
-	__(mtxer rzero)
-	__(bx lr)
-        
-/* arg_z should be of type (UNSIGNED-BYTE 64);  */
-/* On PPC32, return high 32 bits in imm0, low 32 bits in imm1 */
-/* On PPC64, return unboxed value in imm0  */
-
-_spentry(getu64)
-        __ifdef(`PPC64')
-        __(extract_typecode(imm0,arg_z))
-        __(cmpdi cr0,imm0,tag_fixnum)
-        __(cmpdi cr2,arg_z,0)
-        __(cmpdi cr1,imm0,subtag_bignum)
-        __(bne cr0,1f)
-        __(unbox_fixnum(imm0,arg_z))
-        __(bgelr cr2)
-0:             
-	__(uuo_interr(error_object_not_u64,arg_z))
-        
-1:      __(bne cr1,0b)
-        __(getvheader(imm1,arg_z))
-        __(ld imm0,misc_data_offset(arg_z))
-        __(cmpdi cr2,imm1,two_digit_bignum_header)
-        __(rotldi imm0,imm0,32)
-        __(cmpdi cr1,imm1,three_digit_bignum_header)
-        __(cmpdi cr0,imm0,0)
-        __(beq cr2,2f)
-        __(lwz imm1,misc_data_offset+8(arg_z))
-        __(bne cr1,0b)
-        __(cmpwi imm1,0)
-        __(bne 0b)
-        __(bx lr)
-2:      __(blt 0b)
-        __(bx lr)        
-        __else
-	__(extract_typecode(imm0,arg_z))
-	__(cmpri(cr0,imm0,tag_fixnum))
-	__(cmpri(cr1,arg_z,0))
-	__(cmpri(cr2,imm0,subtag_bignum))
-	__(unbox_fixnum(imm1,arg_z))
-	__(bne cr0,8f)
-	__(bgelr cr1)
-9:
-	__(uuo_interr(error_object_not_u64,arg_z))
-8:
-	__(bne- cr2,9b)
-	__(getvheader(imm2,arg_z))
-	__(cmpri(cr2,imm2,two_digit_bignum_header))
-	__(vrefr(imm1,arg_z,0))
-	__(cmpri(cr1,imm1,0))
-	__(mov imm0,#0)
-	__(bge cr2,2f)
-	__(blt- cr1,9b)
-	__(bx lr)
-2:
-	__(cmpri(cr0,imm2,three_digit_bignum_header))
-	__(vrefr(imm0,arg_z,1))
-	__(cmpri(cr1,imm0,0))
-	__(bne cr2,3f)
-	__(blt- cr1,9b)
-	__(bx lr)
-3:
-	__(vrefr(imm2,arg_z,2))
-	__(cmpri(cr1,imm2,0))
-	__(bne- cr0,9b)
-	__(bne- cr1,9b)
-	__(bx lr)
-        __endif
-        
-/* arg_z should be of type (SIGNED-BYTE 64);  */
-/* PPC32:   return high 32 bits  in imm0, low 32 bits in imm1  */
-/* PPC64:   return unboxed value in imm0  */
-
-_spentry(gets64)
-        __ifdef(`PPC64')
-	 __(extract_typecode(imm1,arg_z))
-         __(unbox_fixnum(imm0,arg_z))
-	 __(cmpri(cr0,imm1,tag_fixnum))
-	 __(cmpri(cr2,imm1,subtag_bignum))
-         __(beqlr cr0)
-         __(bne cr2,9f)
-         __(ld imm1,misc_header_offset(arg_z))
-         __(ld imm0,misc_data_offset(arg_z))
-         __(cmpdi imm1,two_digit_bignum_header)
-         __(rotldi imm0,imm0,32)
-         __(beqlr)
-        __else
-	 __(extract_typecode(imm0,arg_z))
-	 __(cmpri(cr0,imm0,tag_fixnum))
-	 __(cmpri(cr2,imm0,subtag_bignum))
-	 __(unbox_fixnum(imm1,arg_z))
-	 __(srawi imm0,imm1,31)
-	 __(beqlr cr0)
-	 __(bne cr2,9f)
-	 __(getvheader(imm2,arg_z))
-	 __(cmpri(cr2,imm2,two_digit_bignum_header))
-	 __(vrefr(imm1,arg_z,0))
-	 __(srawi imm0,imm1,31)
-	 __(bltlr cr2)
-	 __(vrefr(imm0,arg_z,1))
-	 __(beqlr cr2)
-        __endif
-9:
-	__(uuo_interr(error_object_not_s64,arg_z))
-
-
-/*  Construct a lisp integer out of the 64-bit unsigned value in */
-/*        ppc32:    imm0 (high 32 bits) and imm1 (low 32 bits) */
-/*        ppc64:    imm0 (64 bits) .  */
-_spentry(makeu64)
-        __ifdef(`PPC64')
-	 __(clrrdi. imm1,imm0,63-nfixnumtagbits)
-	 __(cmpri(cr1,imm0,0))
-	 __(box_fixnum(arg_z,imm0))
-	 __(beqlr cr0) /* A fixnum  */
-         __(rotldi imm1,imm0,32)
-	 __(mov imm2,#two_digit_bignum_header)
-	 __(blt cr1,2f)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(bx lr)
-2:
-	 __(mov imm2,#three_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(bx lr)
-        __else        
- 	 __(cmpri(cr1,imm0,0))
-	 __(rlwinm. imm2,imm1,0,0,fixnum_shift)
-	 __(mov imm2,#three_digit_bignum_header)
-	 __(box_fixnum(arg_z,imm1))
-	 __(blt cr1,3f)
-	 __(bne cr1,2f)
-	 __(beqlr cr0) /* A fixnum  */
-	 __(blt cr0,2f)
-	 __(mov imm2,#one_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(bx lr)
-2:
-	 __(mov imm2,#two_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(str(imm0,misc_data_offset+4(arg_z)))
-	 __(bx lr)
-3:
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(str(imm0,misc_data_offset+4(arg_z)))
-	 __(bx lr)
-        __endif
-
-
-
-/*  Construct a lisp integer out of the 64-bit signed value in */
-/*        ppc32:    imm0 (high 32 bits) and imm1 (low 32 bits). */
-/*        ppc64:    imm0  */
-_spentry(makes64)
-        __ifdef(`PPC64')
-	 __(addo imm1,imm0,imm0)
-         __(addo imm1,imm1,imm1)
-	 __(addo. arg_z,imm1,imm1)
-	 __(bnslr+)
-	 __(mtxer rzero)
-	 __(mov imm1,#two_digit_bignum_header)
-         __(rotldi imm0,imm0,32)
-	 __(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(2)))
-	 __(str(imm0,misc_data_offset(arg_z)))
-         __(bx lr)
-        __else
-	 __(srawi imm2,imm1,31)
-	 __(cmpr(cr1,imm2,imm0))
-	 __(addo imm2,imm1,imm1)
-	 __(addo. arg_z,imm2,imm2)
-	 __(bne cr1,2f) /* High word is significant  */
-	 __(mov imm2,#one_digit_bignum_header)
-	 __(bnslr cr0) /* No overflow:	 fixnum  */
-	 __(mtxer rzero)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(bx lr)
-2:
-	 __(mtxer rzero)
-	 __(mov imm2,#two_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-	 __(str(imm0,misc_data_offset+4(arg_z)))
-	 __(bx lr)
-        __endif
-
-/* imm0:imm1 constitute an unsigned integer, almost certainly a bignum. */
-/* Make a lisp integer out of those 128 bits ..  */
-_spentry(makeu128)
-        __ifdef(`PPC64')
-         __(cmpdi imm0,0)
-         __(cmpdi cr1,imm1,0)
-         __(srdi imm3,imm0,32)
-         __(srawi imm4,imm0,31)
-         __(cmpdi cr3,imm3,0)
-         __(cmpdi cr4,imm4,0)
-         __(mov imm2,#five_digit_bignum_header)
-         __(blt cr1,0f)
-         __(beq 3f)
-0:              
-         __(bge 1f)
-         /* All 128 bits are significant, and the most significant */
-         /* bit is set.  Allocate a 5-digit bignum (with a zero */
-         /* sign digit  */
-         __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(5)))
-         __(rotldi imm0,imm0,32)
-         __(rotldi imm1,imm1,32)
-         __(std imm1,misc_data_offset(arg_z))
-         __(std imm0,misc_data_offset+8(arg_z))
-         __(bx lr)
-1:       /* If the high word of imm0 is a zero-extension of the low */
-         /* word, we only need 3 digits ; otherwise, we need 4.  */
-         __(mov imm2,#three_digit_bignum_header)
-         __(rotldi imm1,imm1,32)
-         __(bne cr3,2f) /* high word of imm0 is non-zero  */
-         __(bne cr4,2f) /* sign bit is on in low word of imm0  */
-         __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
-         __(std imm1,misc_data_offset(arg_z))
-         __(stw imm0,misc_data_offset+8(arg_z))
-         __(bx lr)
-2:       __(mov imm2,#four_digit_bignum_header)
-         __(rotldi imm0,imm0,32)
-         __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4)))
-         __(std imm1,misc_data_offset(arg_z))
-         __(std imm0,misc_data_offset+8(arg_z))
-         __(bx lr)
-3:       __(mov imm0,imm1)
-         __(b _SPmakeu64)              
-        __else
-         __(twgei r0,r0)
-        __endif
-
-/* imm0:imm1 constitute a signed integer, almost certainly a bignum. */
-/* Make a lisp integer out of those 128 bits ..  */
-_spentry(makes128)
-        __ifdef(`PPC64')
-         /* Is imm0 just a sign-extension of imm1 ?  */
-         __(sradi imm2,imm1,63)
-         /* Is the high word of imm0 just a sign-extension of the low word ?  */
-         __(extsw imm3,imm0)
-         __(cmpd imm2,imm0)
-         __(cmpd cr1,imm3,imm0)
-         __(beq 2f)
-         __(rotldi imm0,imm0,32)
-         __(rotldi imm1,imm1,32)
-         __(beq cr1,1f)
-         __(mov imm2,#four_digit_bignum_header)
-         __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4)))
-         __(std imm1,misc_data_offset(arg_z))
-         __(std imm0,misc_data_offset+8(arg_z))
-         __(bx lr)
-1:       __(mov imm2,#three_digit_bignum_header)
-         __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
-         __(std imm1,misc_data_offset(arg_z))
-         __(stw imm3,misc_data_offset+8(arg_z))
-         __(bx lr)
-2:       __(mov imm0,imm1)
-         __(b _SPmakes64)        
-        __else
-         __(twgei r0,r0)
-        __endif        
-                        
-/* on entry: arg_z = symbol.  On exit, arg_z = value (possibly */
-/* unbound_marker), arg_y = symbol, imm3 = symbol.binding-index  */
-_spentry(specref)
-        __(ldr(imm3,symbol.binding_index(arg_z)))
-        __(ldr(imm0,tcr.tlb_limit(rcontext)))
-        __(cmpr(imm3,imm0))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))
-        __(mov arg_y,arg_z)
-        __(bge 1f)
-        __(ldrx(arg_z,imm2,imm3))
-        __(cmpri(arg_z,no_thread_local_binding_marker))
-        __(bnelr)
-1:     	__(ldr(arg_z,symbol.vcell(arg_y)))
-        __(bx lr)
-
-
-_spentry(specrefcheck)
-        __(ldr(imm3,symbol.binding_index(arg_z)))
-        __(ldr(imm0,tcr.tlb_limit(rcontext)))
-        __(cmpr(imm3,imm0))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))
-        __(mov arg_y,arg_z)
-        __(bge 1f)
-        __(ldrx(arg_z,imm2,imm3))
-        __(cmpri(arg_z,no_thread_local_binding_marker))
-        __(bne 2f)
-1:     	__(ldr(arg_z,symbol.vcell(arg_y)))
-2:      __(treqi(arg_z,unbound_marker))
-        __(bx lr)
-	
-/* arg_y = special symbol, arg_z = new value.          */
-_spentry(specset)
-        __(ldr(imm3,symbol.binding_index(arg_y)))
-        __(ldr(imm0,tcr.tlb_limit(rcontext)))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))
-        __(cmpr(imm3,imm0))
-        __(bge 1f)
-        __(ldrx(temp1,imm2,imm3))
-        __(cmpri(temp1,no_thread_local_binding_marker))
-        __(beq 1f)
-        __(strx(arg_z,imm2,imm3))
-        __(bx lr)
-1:     	__(mov arg_x,arg_y)
-        __(mov arg_y,#symbol.vcell-misc_data_offset)
-        __(b _SPgvset)
-
-/* Restore current thread's interrupt level to arg_z, */
-/* noting whether the tcr's interrupt_pending flag was set.  */
-_spentry(restoreintlevel)
-	__(cmpri(cr1,arg_z,0))
-	__(ldr(imm0,tcr.interrupt_pending(rcontext)))
-	__(cmpri(cr0,imm0,0))
-	__(bne cr1,1f)
-	__(beq cr0,1f)
-	__(str(rzero,tcr.interrupt_pending(rcontext)))
-	__(mov nargs,#fixnum_one)
-	__(trgti(nargs,0))
-	__(bx lr)
-1:
-        __(ldr(nargs,tcr.tlb_pointer(rcontext)))
-	__(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
-	__(bx lr)
-
-
-/* Construct a lisp integer out of the 32-bit signed value in imm0 */
-
-        
-_spentry(makes32)
-        __ifdef(`PPC64')
-         __(box_fixnum(arg_z,imm0))
-        __else
-	 __(addo imm1,imm0,imm0)
-	 __(addo. arg_z,imm1,imm1)
-	 __(bnslr+)
-	 __(mtxer rzero)
-	 __(mov imm1,#one_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(1)))
-	 __(str(imm0,misc_data_offset(arg_z)))
-        __endif
-	 __(bx lr)
-
-
-/* Construct a lisp integer out of the 32-bit unsigned value in imm0 */
-
-        
-_spentry(makeu32)
-        __ifdef(`PPC64')
-         __(box_fixnum(arg_z,imm0))
-         __(bx lr)
-        __else
-	 __(clrrwi. imm1,imm0,31-nfixnumtagbits)
-	 __(cmpri(cr1,imm0,0))
-	 __(box_fixnum(arg_z,imm0))
-	 __(beqlr cr0) /* A fixnum  */
-	 __(blt cr1,2f)
-	 __(mov imm2,#one_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(1)))
-	 __(str(imm0,misc_data_offset(arg_z)))
-	 __(bx lr)
-2:
-	 __(mov imm2,#two_digit_bignum_header)
-	 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
-	 __(str(imm0,misc_data_offset(arg_z)))
-	 __(bx lr)
-        __endif
-
-/*  */
-/* arg_z should be of type (SIGNED-BYTE 32); return unboxed result in imm0 */
-/*  */
-_spentry(gets32)
-        __ifdef(`PPC64')
-         __(sldi imm1,arg_z,32-fixnumshift)
-         __(extract_lisptag_(imm0,arg_z))
-         __(sradi imm1,imm1,32-fixnumshift)
-         __(box_fixnum(imm0,arg_z))
-         __(cmpd cr1,imm1,arg_z)
-         __(bne cr0,9f)
-         __(beqlr cr1)
-         __(b 9f)
-        __else
-	 __(extract_typecode(imm1,arg_z))
-	 __(cmpri(cr0,imm1,tag_fixnum))
-	 __(cmpri(cr2,imm1,subtag_bignum))
-	 __(unbox_fixnum(imm0,arg_z))
-	 __(beqlr+ cr0)
-	 __(bne cr2,9f)
-	 __(getvheader(imm1,arg_z))
-	 __(cmpri(cr1,imm1,one_digit_bignum_header))
-	 __(vrefr(imm0,arg_z,0))
-	 __(beqlr+ cr1)
-        __endif
-9:
-	__(uuo_interr(error_object_not_signed_byte_32,arg_z))
-
-/*  */
-/* arg_z should be of type (UNSIGNED-BYTE 32); return unboxed result in imm0 */
-/*  */
-
-_spentry(getu32)
-	__(extract_typecode(imm1,arg_z))
-	__(cmpri(cr0,imm1,tag_fixnum))
-	__(cmpri(cr1,arg_z,0))
-	__(cmpri(cr2,imm1,subtag_bignum))
-	__(unbox_fixnum(imm0,arg_z))
-	__(bne cr0,8f)
-	__(bgelr cr1)
-8:
-	__(bne- cr2,9f)
-	__(getvheader(imm2,arg_z))
-	__(cmpri(cr2,imm2,two_digit_bignum_header))
-	__(vrefr(imm0,arg_z,0))
-	__(cmpri(cr0,imm0,0))
-	__(bgt cr2,9f)
-	__(beq cr2,2f)
-	__(blt cr0,9f)
-	__(bx lr)
-2:
-	__(vrefr(imm1,arg_z,1))
-	__(cmpri(cr0,imm1,0))
-	__(beqlr+ cr0)
-
-9:
-	__(uuo_interr(error_object_not_unsigned_byte_32,arg_z))
-
-/* */
-/* arg_z has overflowed (by one bit) as the result of an addition or subtraction. */
-/* Make a bignum out of it. */
-
-_spentry(fix_overflow)
-	__(mtxer rzero)
-	__(unbox_fixnum(imm1,arg_z))
-        __ifdef(`PPC64')
-	 __(mov imm0,#two_digit_bignum_header)
-         __(rotldi imm1,imm1,32)
-	 __(xoris imm1,imm1,0xe000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __else
-	 __(mov imm0,#one_digit_bignum_header)
-	 __(xoris imm1,imm1,0xc000)
-	 __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1)))
-	 __(str(imm1,misc_data_offset(arg_z)))
-        __endif
-	__(bx lr)
-		
-
-
-/* */
-/* As per mvpass above, but in this case fname is known to be a */
-/* symbol. */
-
-_spentry(mvpasssym)
-	__(cmpri(cr0,nargs,node_size*nargregs))
-	__(mflr loc_pc)
-	__(mov imm0,vsp)
-	__(ble+ cr0,1f)
-	 __(subi imm0,imm0,node_size*nargregs)
-	 __(add imm0,imm0,nargs)
-1:            
-	__(build_lisp_frame(fn,loc_pc,imm0))
-	__(ref_global(loc_pc,ret1val_addr))
-	__(mov fn,#0)
-	__(mtlr loc_pc)
-	__(jump_fname())
-
-
-
-_spentry(unbind)
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))   
-        __(ldr(imm3,binding.sym(imm1)))
-        __(ldr(temp1,binding.val(imm1)))
-        __(ldr(imm1,binding.link(imm1)))
-        __(strx(temp1,imm2,imm3))
-        __(str(imm1,tcr.db_link(rcontext)))
-        __(bx lr)
-
-_spentry(unbind_n)
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))   
-1:      __(subi imm0,imm0,1)
-        __(ldr(imm3,binding.sym(imm1)))
-        __(ldr(temp1,binding.val(imm1)))
-        __(cmpri(imm0,0))
-        __(ldr(imm1,binding.link(imm1)))
-        __(strx(temp1,imm2,imm3))
-        __(bne 1b)
-        __(str(imm1,tcr.db_link(rcontext)))
-        __(bx lr)
-
-/* */
-/* Clobbers imm1,imm2,imm5,arg_x, arg_y */
-
-_spentry(unbind_to)
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))
-1:      __(ldr(imm5,binding.sym(imm1)))
-        __(ldr(arg_y,binding.val(imm1)))
-        __(ldr(imm1,binding.link(imm1)))
-        __(cmpr(imm0,imm1))
-        __(strx(arg_y,imm2,imm5))
-        __(bne 1b)
-        __(str(imm1,tcr.db_link(rcontext)))
-        __(bx lr)
-	
-
-
-/* */
-/* Restore the special bindings from the top of the tstack,  */
-/* leaving the tstack frame allocated.  */
-/* Note that there might be 0 saved bindings, in which case  */
-/* do nothing.  */
-/* Note also that this is -only- called from an unwind-protect  */
-/* cleanup form, and that .SPnthrowXXX is keeping one or more  */
-/* values in a frame on top of the tstack.  */
-/*  */
-                        
-_spentry(progvrestore)
-	__(ldr(imm0,tsp_frame.backlink(tsp)))	/* ignore .SPnthrowXXX values frame  */
-	__(ldr(imm0,tsp_frame.data_offset(imm0)))
-	__(cmpri(cr0,imm0,0))
-	__(unbox_fixnum(imm0,imm0))
-	__(bne+ cr0,_SPunbind_n)
-	__(bx lr)
-
-/* Bind CCL::*INTERRUPT-LEVEL* to 0.  If its value had been negative, check  */
-/* for pending interrupts after doing so.  "nargs" can be freely used for an */
-/* interrupt trap in this context.  */
-_spentry(bind_interrupt_level_0)
-        __(ldr(imm4,tcr.tlb_pointer(rcontext)))
-        __(ldr(temp0,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(cmpri(temp0,0))
-        __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
-        __(vpush1(temp0))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(str(rzero,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(beqlr)
-        __(mov nargs,temp0)
-        __(bgt 1f)
-        __(ldr(nargs,tcr.interrupt_pending(rcontext)))
-1:      __(trgti(nargs,0))        
-        __(bx lr)
-
-/* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1.  (This has the effect */
-/* of disabling interrupts.)  */
-_spentry(bind_interrupt_level_m1)
-        __(mov imm2,#-fixnumone)
-        __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
-        __(ldr(imm4,tcr.tlb_pointer(rcontext)))
-        __(ldr(temp0,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(vpush1(temp0))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(bx lr)
-
-        
-/* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z.  If that value's 0, */
-/* do what _SPbind_interrupt_level_0 does  */
-_spentry(bind_interrupt_level)
-        __(cmpri(arg_z,0))
-        __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
-        __(ldr(imm4,tcr.tlb_pointer(rcontext)))
-        __(ldr(temp0,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(beq _SPbind_interrupt_level_0)
-        __(vpush1(temp0))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(str(vsp,tcr.db_link(rcontext)))
-        __(bx lr)
-
-/* Unbind CCL::*INTERRUPT-LEVEL*.  If the value changes from negative to */
-/* non-negative, check for pending interrupts.  This is often called in */
-/* a context where nargs is significant, so save and restore nargs around */
-/* any interrupt polling  */
-        
-_spentry(unbind_interrupt_level)
-        __(ldr(imm0,tcr.flags(rcontext)))
-        __(ldr(imm2,tcr.tlb_pointer(rcontext)))
-        __(andi. imm0,imm0,1<<TCR_FLAG_BIT_PENDING_SUSPEND)
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(ldr(temp1,INTERRUPT_LEVEL_BINDING_INDEX(imm2)))
-        __(bne 5f)
-0:      __(cmpri(cr1,temp1,0))
-        __(ldr(temp1,binding.val(imm1)))
-        __(ldr(imm1,binding.link(imm1)))
-        __(cmpri(cr0,temp1,0))
-        __(str(temp1,INTERRUPT_LEVEL_BINDING_INDEX(imm2)))
-        __(str(imm1,tcr.db_link(rcontext)))
-        __(bgelr cr1)
-        __(bltlr cr0)
-        __(mov imm2,nargs)
-        __(check_pending_interrupt(`cr1'))
-        __(mov nargs,imm2)
-        __(bx lr)
-5:       /* Missed a suspend request; force suspend now if we're restoring
-          interrupt level to -1 or greater */
-        __(cmpri(temp1,-2<<fixnumshift))
-        __(bne 0b)
-        __(ldr(imm0,binding.val(imm1)))
-        __(cmpr(imm0,temp1))
-        __(beq 0b)
-        __(mov imm0,#1<<fixnumshift)
-        __(str(imm0,INTERRUPT_LEVEL_BINDING_INDEX(imm2)))
-        __(suspend_now())
-        __(b 0b)
-
-
-/* arg_x = array, arg_y = i, arg_z = j. Typecheck everything.
-   We don't know whether the array is alleged to be simple or
-   not, and don't know anythng about the element type.  */
-_spentry(aref2)
-        __(extract_typecode(imm2,arg_x))
-        __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-        __(cmpri(cr2,imm2,subtag_arrayH))
-        __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
-        __(bne cr2,1f)
-        __(ldr(imm1,arrayH.rank(arg_x)))
-        __(cmpri(imm1,2<<fixnumshift))
-        __(bne 1f)
-        /* It's a 2-dimensional array.  Check bounds */
-        __(ldr(imm0,arrayH.dim0(arg_x)))
-        __(trlge(arg_y,imm0))
-        __(ldr(imm0,arrayH.dim0+node_size(arg_x)))
-        __(trlge(arg_z,imm0))
-        __(unbox_fixnum(imm0,imm0))
-        __(mullr(arg_y,arg_y,imm0))
-        __(add arg_z,arg_z,arg_y)
-        /* arg_z is now row-major-index; get data vector and
-           add in possible offset */
-        __(mov arg_y,arg_x)
-0:      __(ldr(imm0,arrayH.displacement(arg_y)))
-        __(ldr(arg_y,arrayH.data_vector(arg_y)))
-        __(extract_subtag(imm1,arg_y))
-        __(cmpri(imm1,subtag_vectorH))
-        __(add arg_z,arg_z,imm0)
-        __(bgt local_label(misc_ref_common))
-        __(b 0b)
-1:              
-        __(uuo_interr(error_object_not_array_2d,arg_x))
-
-/* temp0 = array, arg_x = i, arg_y = j, arg_z = k */
-_spentry(aref3)
-        __(extract_typecode(imm2,temp0))
-        __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
-        __(cmpri(cr2,imm2,subtag_arrayH))
-        __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-        __(bne cr2,1f)
-        __(ldr(imm1,arrayH.rank(temp0)))
-        __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))
-        __(cmpri(imm1,3<<fixnumshift))
-        __(bne 1f)
-        /* It's a 3-dimensional array.  Check bounds */
-        __(ldr(imm2,arrayH.dim0+(node_size*2)(temp0)))
-        __(ldr(imm1,arrayH.dim0+node_size(temp0)))
-        __(ldr(imm0,arrayH.dim0(temp0)))
-        __(trlge(arg_z,imm2))
-        __(unbox_fixnum(imm2,imm2))
-        __(trlge(arg_y,imm1))
-        __(unbox_fixnum(imm1,imm1))
-        __(trlge(arg_x,imm0))
-        __(mullr(arg_y,arg_y,imm2))
-        __(mullr(imm1,imm2,imm1))
-        __(mullr(arg_x,imm1,arg_x))
-        __(add arg_z,arg_z,arg_y)
-        __(add arg_z,arg_z,arg_x)
-        __(mov arg_y,temp0)
-0:      __(ldr(arg_x,arrayH.displacement(arg_y)))
-        __(ldr(arg_y,arrayH.data_vector(arg_y)))
-        __(extract_subtag(imm1,arg_y))
-        __(cmpri(imm1,subtag_vectorH))
-        __(add arg_z,arg_x,arg_z)
-        __(bgt local_label(misc_ref_common))
-        __(b 0b)
-1:              
-        __(uuo_interr(error_object_not_array_3d,temp0))
-
-        
-        
-
-/* As for aref2 above, but temp = array, arg_x = i, arg_y = j, arg_z = newval */
-_spentry(aset2)
-        __(extract_typecode(imm2,temp0))
-        __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
-        __(cmpri(cr2,imm2,subtag_arrayH))
-        __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-        __(bne cr2,1f)
-        __(ldr(imm1,arrayH.rank(temp0)))
-        __(cmpri(imm1,2<<fixnumshift))
-        __(bne 1f)
-        /* It's a 2-dimensional array.  Check bounds */
-        __(ldr(imm0,arrayH.dim0(temp0)))
-        __(trlge(arg_x,imm0))
-        __(ldr(imm0,arrayH.dim0+node_size(temp0)))
-        __(trlge(arg_y,imm0))
-        __(unbox_fixnum(imm0,imm0))
-        __(mullr(arg_x,arg_x,imm0))
-        __(add arg_y,arg_y,arg_x)
-        /* arg_y is now row-major-index; get data vector and
-           add in possible offset */
-        __(mov arg_x,temp0)
-0:      __(ldr(imm0,arrayH.displacement(arg_x)))
-        __(ldr(arg_x,arrayH.data_vector(arg_x)))
-        __(extract_subtag(imm1,arg_x))
-        __(cmpri(imm1,subtag_vectorH))
-        __(add arg_y,arg_y,imm0)
-        __(bgt local_label(misc_set_common))
-        __(b 0b)
-1:              
-        __(uuo_interr(error_object_not_array_2d,temp0))        
-                
-/* temp1 = array, temp0 = i, arg_x = j, arg_y = k, arg_z = new */        
-_spentry(aset3)
-        __(extract_typecode(imm2,temp1))
-        __(trap_unless_lisptag_equal(temp0,tag_fixnum,imm0))
-        __(cmpri(cr2,imm2,subtag_arrayH))
-        __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0))
-        __(bne cr2,1f)
-        __(ldr(imm1,arrayH.rank(temp1)))
-        __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
-        __(cmpri(imm1,3<<fixnumshift))
-        __(bne 1f)
-        /* It's a 3-dimensional array.  Check bounds */
-        __(ldr(imm2,arrayH.dim0+(node_size*2)(temp1)))
-        __(ldr(imm1,arrayH.dim0+node_size(temp1)))
-        __(ldr(imm0,arrayH.dim0(temp1)))
-        __(trlge(arg_y,imm2))
-        __(unbox_fixnum(imm2,imm2))
-        __(trlge(arg_x,imm1))
-        __(unbox_fixnum(imm1,imm1))
-        __(trlge(temp0,imm0))
-        __(mullr(arg_x,arg_x,imm2))
-        __(mullr(imm1,imm2,imm1))
-        __(mullr(temp0,imm1,temp0))
-        __(add arg_y,arg_y,arg_x)
-        __(add arg_y,arg_y,temp0)
-        __(mov arg_x,temp1)
-0:      __(ldr(temp0,arrayH.displacement(arg_x)))
-        __(ldr(arg_x,arrayH.data_vector(arg_x)))
-        __(extract_subtag(imm1,arg_x))
-        __(cmpri(imm1,subtag_vectorH))
-        __(add arg_y,arg_y,temp0)
-        __(bgt local_label(misc_set_common))
-        __(b 0b)
-1:              
-        __(uuo_interr(error_object_not_array_3d,temp1))
-
-
-        
-
-_spentry(nmkunwind)
-        __(mov imm2,#-fixnumone)
-        __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX)
-        __(ldr(imm4,tcr.tlb_pointer(rcontext)))
-        __(ldr(arg_y,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(ldr(imm1,tcr.db_link(rcontext)))
-        __(vpush1(arg_y))
-        __(vpush1(imm3))
-        __(vpush1(imm1))
-        __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4)))
-        __(str(vsp,tcr.db_link(rcontext)))
-	__(lwi(arg_z,unbound_marker))
-	__(mov imm2,#fixnum_one)
-	__(mkcatch())
-        __(mov arg_z,arg_y)
-        __(b _SPbind_interrupt_level)
-
-        .if 1
-        __ifdef(`DARWIN')
-         __ifdef(`PPC64')
-L_lisp_objc2_personality:       
-        __(ref_global(r12,objc_2_personality))
-        __(mtctr r12)
-        __(bctr)
-        .data
-        .globl _lisp_objc2_personality
-_lisp_objc2_personality: 
-        .quad L_lisp_objc2_personality
-	
-	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EH_frame1:
-	.set L$set$12,LECIE1-LSCIE1
-	.long L$set$12	/* Length of Common Information Entry */
-LSCIE1:
-	.long	0x0	/* CIE Identifier Tag */
-	.byte	0x1	/* CIE Version */
-	.ascii "zPLR\0"	/* CIE Augmentation */
-	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
-	.byte	0x78	/* sleb128 -8; CIE Data Alignment Factor */
-	.byte	0x41	/* CIE RA Column */
-	.byte	0x7
-	.byte	0x9b
-	.long   _lisp_objc2_personality-.
-	.byte	0x10	/* LSDA Encoding (pcrel) */
-	.byte	0x10	/* FDE Encoding (pcrel) */
-	.byte	0xc
-	.byte	0x1
-	.byte	0x0
-	.align 3
-LECIE1:
-        .globl _SPffcall.eh
-_SPffcall.eh:
-        .set assembler_nonsense,LEFDEffcall-LSFDEffcall
-        .long assembler_nonsense
-LSFDEffcall:      
-        .long LSFDEffcall-EH_frame1 /* FDE CIE offset */
-        .quad Lffcall-. /* FDE Initial Location */
-        .quad Lffcall_end-Lffcall /* FDE address range */
-        .byte 8 /* uleb128 0x8; Augmentation size */
-        .quad LLSDA1-.           /* Language Specific Data Area */
-	.byte DW_CFA_def_cfa_offset 
-	.byte 0xc0,0x1 /* uleb128 0xc0.  A lie:  the frame is variable-length */
-	.byte DW_CFA_offset_extended_sf
-	.byte	0x41	
-	.byte	0x7e	/* sleb128 -2 */
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_setup-Lffcall
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_setup_end-Lffcall_setup
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_call_end-Lffcall_call
-	.align 3
-LEFDEffcall:
-	
-        .globl _SPffcall_return_registers.eh
-_SPffcall_return_registers.eh:
-        .set Lfmh,LEFDEffcall_return_registers-LSFDEffcall_return_registers
-        .long Lfmh
-LSFDEffcall_return_registers:      
-        .long LSFDEffcall_return_registers-EH_frame1 /* FDE CIE offset */
-        .quad Lffcall_return_registers-. /* FDE Initial Location */
-        .quad Lffcall_return_registers_end-Lffcall_return_registers /* FDE address range */
-        .byte 8 /* uleb128 0x8; Augmentation size */
-        .quad LLSDA2-.           /* Language Specific Data Area */
-	.byte DW_CFA_def_cfa_offset 
-	.byte 0xc0,0x1 /* uleb128 0xc0.  A lie:  the frame is variable-length */
-	.byte DW_CFA_offset_extended_sf
-	.byte 0x41	
-	.byte 0x7e	/* sleb128 -2 */
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_return_registers_setup-Lffcall_return_registers
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup
-	.byte DW_CFA_advance_loc4
-	.long Lffcall_return_registers_call_end-Lffcall_return_registers_call
-	.align 3
-LEFDEffcall_return_registers:
-        .text
-         __endif
-        __endif
-        .endif
-
-                                
-/*  EOF, basically  */
-        .globl _SPsp_end
-        b _SPsp_end
-	_endfile
+         
+ 	_endfile
+ 
