Index: /branches/arm/lisp-kernel/arm-spentry.s
===================================================================
--- /branches/arm/lisp-kernel/arm-spentry.s	(revision 13693)
+++ /branches/arm/lisp-kernel/arm-spentry.s	(revision 13694)
@@ -2169,95 +2169,90 @@
         __(extract_lowbyte(imm1,imm1))
         __(b C(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(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 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(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(imm3,1<<fixnumshift))
-dnl  __(subi imm3,imm3,1<<fixnumshift)
-dnl  __(ldru(temp0,-node_size(imm0)))
-dnl  __(stru(temp0,-node_size(imm2)))
-dnl  __(bne 1b)
-dnl 2:
-dnl  __(mov vsp,imm2)
-dnl  __(bx lr)
-dnl 
+
+/* "spread" the lexpr in arg_z.  */
+/* ppc2-invoke-fn assumes that temp1 is preserved here.  */
+_spentry(spread_lexprz)
+        __(ldr imm0,[arg_z,#0])
+        __(add imm1,arg_z,imm0)
+        __(add nargs,nargs,imm0)
+        __(add imm1,imm1,#node_size)
+        __(cmp imm0,#3<<fixnumshift)
+        __(bge 9f)
+        __(cmp imm0,#2<<fixnumshift)
+        __(beq 2f)
+        __(cmp imm0,#0)
+        __(bne 1f)
+/* lexpr count was 0; vpop the arg regs that  */
+/* were vpushed by the caller  */
+        __(cmp nargs,#0)
+        __(bxeq lr)
+        __(vpop_argregs_nz)
+        __(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:
+        __(cmp imm0,#4<<fixnumshift)
+        __(sub imm0,imm0,#fixnumone)
+        __(ldr arg_z,[imm1,#-node_size]!)
+        __(vpush1(arg_z))
+9:
+        __(bne 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:
+        __(cmp nargs,#2<<fixnumshift)
+        __(ldr arg_y,[imm1,#-node_size*1])
+        __(ldr arg_z,[imm1,#-node_size*2])
+        __(bxeq lr)  /* return if (new) nargs = 2  */
+        __(vpop1(arg_x))
+        __(bx lr)
+
+/* lexpr count is one: set arg_z from the lexpr,  */
+/* maybe vpop arg_y, arg_x  */
+1: 
+        __(cmp nargs,#2<<fixnumshift)
+        __(ldr arg_z,[imm1,#-node_size])
+        __(bxlt lr)  /* return if (new) nargs < 2  */
+        __(vpop1(arg_y))
+        __(bxeq lr)  /* return if (new) nargs = 2  */
+        __(vpop1(arg_x))
+        __(bx lr)
+
+
+_spentry(reset)
+        __(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)
+        __(cmp nargs,#0)
+        __(mov temp1,nargs)
+        __(add imm1,vsp,nargs)
+        __(add imm1,imm1,imm0)
+        __(add imm0,vsp,nargs)
+        __(beq 2f)
+1:
+        __(subs temp1,temp1,#1<<fixnumshift)
+        __(ldr temp0,[imm0,#-node_size]!)
+        __(str temp0,[imm1,#-node_size]!)
+        __(bne 1b)
+        2:
+        __(mov vsp,imm1)
+        __(bx lr)
+
 dnl /* Build a new TSP area to hold nargs worth of multiple-values.  */
 dnl /* Pop the multiple values off of the vstack.  */
@@ -2416,11 +2411,4 @@
 
 
-
-
- 
-                 
-
-
-
 /* Enter the debugger  */
 _spentry(breakpoint)
@@ -2529,20 +2517,4 @@
         __(b _SPgvset)
 
-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(imm0,0))
-dnl  __(bne cr1,1f)
-dnl  __(beq 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)
 
 	
