Index: /trunk/source/lisp-kernel/arm-spentry.s
===================================================================
--- /trunk/source/lisp-kernel/arm-spentry.s	(revision 15081)
+++ /trunk/source/lisp-kernel/arm-spentry.s	(revision 15082)
@@ -1055,21 +1055,12 @@
         __(uuo_error_reg_not_xtype(al,arg_y,xtype_unsigned_byte_24))
 1:              
-        __(unbox_fixnum(imm0,arg_z))
-        __(extract_fulltag(imm1,imm0))
+        __(unbox_fixnum(imm2,arg_z))
+        __(extract_fulltag(imm1,imm2))
         __(cmp imm1,#fulltag_nodeheader)
         __(bne 1f)
         __(dnode_align(imm1,arg_y,node_size))
-        __(cmp imm1,#stack_alloc_limit)
-        __(bhs stack_misc_alloc_no_room)
         __(mov imm0,#subtag_u32_vector)
         __(orr imm0,imm0,arg_y,lsl #num_subtag_bits-fixnumshift)
-        __(mov temp0,#stack_alloc_marker)
-        __(mov temp1,sp)
-        __(stack_allocate_zeroed_ivector(imm0,imm1))
-        __(unbox_fixnum(imm0,arg_z))
-        __(strb imm0,[sp])
-        __(add arg_z,sp,#fulltag_misc)
-        __(stmdb sp!,{temp0,temp1})
-        __(bx lr)
+        __(b 9f)
 1:      __(mov imm0,arg_y,lsl #num_subtag_bits-fixnumshift)
         __(orr imm0,imm0,arg_z,lsr #fixnumshift)
@@ -1089,10 +1080,14 @@
         __(movne imm1,imm1,lsr#3+fixnumshift)
 8:      __(dnode_align(imm1,imm1,node_size))
-        __(cmp imm1,#stack_alloc_limit)
-        __(bhs stack_misc_alloc_no_room)
+9:      
+        __(ldr temp0,[rcontext,tcr.cs_limit])
+        __(sub temp1,sp,imm1)
+        __(cmp temp1,temp0)
+        __(bls stack_misc_alloc_no_room)
         __(mov temp0,#stack_alloc_marker)
         __(mov temp1,sp)
         __(stack_allocate_zeroed_ivector(imm0,imm1))
         __(add arg_z,sp,#fulltag_misc)
+        __(strb imm2,[sp])
         __(stmdb sp!,{temp0,temp1})
         __(bx lr)
@@ -1328,6 +1323,8 @@
         __(mov imm1,imm1,lsl #num_subtag_bits-fixnumshift)
         __(orr imm1,imm1,#subtag_u32_vector)
-        __(cmp imm0,#stack_alloc_limit)
-        __(bge 3f)
+        __(sub arg_x,sp,imm0)
+        __(ldr arg_y,[rcontext,#tcr.cs_limit])
+        __(cmp arg_x,arg_y)
+        __(blo 3f)
         __(stack_allocate_zeroed_ivector(imm1,imm0))
         __(mov imm0,#subtag_simple_vector)
@@ -1644,7 +1641,9 @@
         __(add imm1,imm1,#node_size)
         __(add imm0,imm1,#node_size)
-        __(cmp imm0,#stack_alloc_limit)
+        __(sub imm2,sp,imm0)
+        __(ldr temp0,[rcontext,#tcr.cs_limit])
+        __(cmp imm2,temp0)
         __(mov temp0,sp)
-        __(bhs 1f)
+        __(bls 1f)
         __(mov imm1,imm1,lsl #num_subtag_bits)
         __(orr imm1,imm1,#subtag_u8_vector)
@@ -1676,7 +1675,9 @@
         __(add imm1,imm1,#node_size)
         __(add imm0,imm1,#node_size)
-        __(cmp imm0,#stack_alloc_limit)
+        __(sub imm2,sp,imm0)
+        __(ldr temp0,[rcontext,#tcr.cs_limit])
+        __(cmp imm2,temp0)
         __(mov temp0,sp)
-        __(bhs 1f)
+        __(bls 1f)
         __(mov imm1,imm1,lsl #num_subtag_bits)
         __(orr imm1,imm1,#subtag_u8_vector)
@@ -1713,6 +1714,8 @@
         __(orr imm1,imm1,#subtag_u32_vector)
         __(add imm0,imm0,#dnode_size)
-        __(cmp imm0,#stack_alloc_limit)
-        __(bge 4f)
+        __(ldr temp0,[rcontext,#tcr.cs_limit])
+        __(sub imm2,sp,imm0)
+        __(cmp imm2,temp0)
+        __(bls 4f)
         __(stack_allocate_zeroed_ivector(imm1,imm0))
         __(mov imm0,#subtag_simple_vector)
@@ -1755,6 +1758,10 @@
         __(mov imm1,imm0,lsl #num_subtag_bits-fixnumshift)
         __(orr imm1,imm1,#subtag_u32_vector)
+        __(sub temp2,sp,imm1)
+        __(ldr arg_x,[rcontext,#tcr.cs_limit])
+        __(cmp temp2,arg_x)       
         __(mov temp2,sp)
         __(mov arg_x,#stack_alloc_marker)
+        __(bls 3f)
         __(stack_allocate_zeroed_ivector(imm1,temp1))
         __(unbox_fixnum(imm1,temp0))
@@ -1771,5 +1778,23 @@
         __(add vsp,vsp,#fixnumone)
         __(bx lr)
-
+3:      /* Have to heap-cons. */        
+        __(stmdb sp!,{arg_x,temp2})
+        __(vpush1(nargs))
+        __(mov arg_y,nargs)
+        __(mov arg_z,temp0)
+        __(build_lisp_frame(imm0))
+        __(bl _SPmisc_alloc)
+        __(restore_lisp_frame(imm0))
+        __(vpop1(nargs))
+        __(add imm0,nargs,#misc_data_offset)
+        __(b 5f)
+4:      __(vpop1(temp0))
+        __(subs imm0,imm0,#fixnumone)
+        __(str temp0,[arg_z,imm0])
+5:      __(subs nargs,nargs,#fixnumone)
+        __(bne 4b)
+        __(add vsp,vsp,#fixnumone)
+        __(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   */
@@ -2065,6 +2090,8 @@
         __(bne stack_misc_alloc_init_ivector)
         __(dnode_align(imm1,arg_x,node_size))
-        __(cmp imm1,#stack_alloc_limit)
-        __(bge stack_misc_alloc_init_no_room)
+        __(ldr temp1,[rcontext,#tcr.cs_limit])
+        __(sub temp0,sp,imm1)
+        __(cmp temp0,temp1)
+        __(bls stack_misc_alloc_init_no_room)
         __(mov imm0,#subtag_u32_vector)
         __(orr imm0,imm0,arg_x,lsl #num_subtag_bits-fixnumshift)
@@ -4304,6 +4331,8 @@
         __(movne imm1,imm1,lsr#3+fixnumshift)
 8:      __(dnode_align(imm1,imm1,node_size))
-        __(cmp imm1,#stack_alloc_limit)
-        __(bhs stack_misc_alloc_init_no_room)
+        __(ldr temp0,[rcontext,#tcr.cs_limit])
+        __(sub temp1,sp,imm1)
+        __(cmp temp1,temp0)
+        __(bls stack_misc_alloc_init_no_room)
         __(mov temp0,#stack_alloc_marker)
         __(mov temp1,sp)
