Index: /branches/ia32/lisp-kernel/x86-constants32.h
===================================================================
--- /branches/ia32/lisp-kernel/x86-constants32.h	(revision 8390)
+++ /branches/ia32/lisp-kernel/x86-constants32.h	(revision 8391)
@@ -28,5 +28,5 @@
 #define Iallocptr Itemp0
 #define Ira0 Itemp0
-#define Inargs Iimm0
+#define Inargs Itemp1
 #define Ixfn Itemp1
 
Index: /branches/ia32/lisp-kernel/x86-constants32.s
===================================================================
--- /branches/ia32/lisp-kernel/x86-constants32.s	(revision 8390)
+++ /branches/ia32/lisp-kernel/x86-constants32.s	(revision 8391)
@@ -45,7 +45,5 @@
 define([allocptr],[temp0])
 
-define([nargs_b],[imm0_b])
-define([nargs_w],[imm0_w])
-define([nargs],[imm0])
+define([nargs],[temp1])
 
 define([ra0],[temp0])
Index: /branches/ia32/lisp-kernel/x86-macros.s
===================================================================
--- /branches/ia32/lisp-kernel/x86-macros.s	(revision 8390)
+++ /branches/ia32/lisp-kernel/x86-macros.s	(revision 8391)
@@ -468,8 +468,6 @@
 define([do_funcall],[
 	new_macro_labels()
-	__(movl %imm0,%temp1) /* preserve nargs */
 	extract_fulltag(%temp0,%imm0)
 	__(cmpb $fulltag_misc,%imm0_b)
-	__(movl %temp1,%imm0)
 	__(jne macro_label(bad))
 	__(cmpb $subtag_function,misc_subtag_offset(%temp0))
Index: /branches/ia32/lisp-kernel/x86-spentry32.s
===================================================================
--- /branches/ia32/lisp-kernel/x86-spentry32.s	(revision 8390)
+++ /branches/ia32/lisp-kernel/x86-spentry32.s	(revision 8391)
@@ -942,5 +942,27 @@
 
 _spentry(tcallsymslide)
-	__(int $3)
+	__(movl %ebp,%imm0)
+	__(subl %nargs,%imm0)	/* new tos */
+	__(push %imm0)
+	__(push %arg_y)
+	__(push %arg_z)
+	__(push %nargs)
+	__(lea (4-nargregs)*node_size(%esp,%nargs),%arg_y) /* src ptr */
+	__(movl %ebp,%imm0) /* dst ptr */
+	__(subl $fixnumone*nargregs,%nargs)
+	__(jmp 1f)
+0:	__(subl $node_size,%arg_y)
+	__(movl (%arg_y),%arg_z)
+	__(subl $node_size,%imm0)
+	__(movl %arg_z,(%imm0))
+1:	__(subl $fixnumone,%nargs)
+	__(jge 0b)
+	__(pop %nargs)
+	__(pop %arg_z)
+	__(pop %arg_y)
+	__(pop %esp)
+	__(push -node_size(%ebp))
+	__(movl 0(%ebp),%ebp)
+	__(jump_fname)
 _endsubp(tcallsymslide)
 
@@ -964,6 +986,30 @@
 _endsubp(tcallnfnvsp)
 
+/* Make a "raw" area on the foreign 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)
-	__(int $3)
+	__(unbox_fixnum(%arg_z,%imm0))
+	__(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0))
+	__(cmpl $tstack_alloc_limit,%imm0)
+	__(jae 1f)
+	__(movd %rcontext:tcr.foreign_sp,%mm0)
+	__(subl %imm0,%rcontext:tcr.foreign_sp)
+	__(movl %rcontext:tcr.foreign_sp,%arg_z)
+	__(movd %mm0,(%arg_z))
+	__(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0)
+	__(movl $macptr_header,tsp_frame.fixed_overhead(%arg_z))
+	__(addl $fulltag_misc+tsp_frame.fixed_overhead,%arg_z)
+	__(movl %imm0,macptr.address(%arg_z))
+	__(movss %fpzero,macptr.domain(%arg_z))
+	__(movss %fpzero,macptr.type(%arg_z))
+	__(ret)
+1:	__(movd %rcontext:tcr.foreign_sp,%mm0)
+	__(subl $dnode_size,%rcontext:tcr.foreign_sp)
+	__(movl %rcontext:tcr.foreign_sp,%imm0)
+	__(movd %mm0,(%imm0))
+	__(set_nargs(1))
+	__(movl $nrs.new_gcable_ptr,%fname)
+	__(jump_fname())
 _endsubp(makestackblock)
 	
