Index: kernel/arch/ia64/Makefile.inc
===================================================================
--- kernel/arch/ia64/Makefile.inc	(revision 9b3f77caf735cbb001a4f81f1d9cebabfb684dd7)
+++ kernel/arch/ia64/Makefile.inc	(revision 75751db6c5c6834a6695072a6087289dd2c538f6)
@@ -72,2 +72,6 @@
 	BFD = binary
 endif
+
+ARCH_AUTOGENS_AG = \
+	arch/$(KARCH)/include/arch/istate_struct.ag
+
Index: kernel/arch/ia64/include/arch/istate.h
===================================================================
--- kernel/arch/ia64/include/arch/istate.h	(revision 9b3f77caf735cbb001a4f81f1d9cebabfb684dd7)
+++ kernel/arch/ia64/include/arch/istate.h	(revision 75751db6c5c6834a6695072a6087289dd2c538f6)
@@ -40,73 +40,13 @@
 #ifdef KERNEL
 
+#include <arch/istate_struct.h>
 #include <arch/register.h>
 
 #else /* KERNEL */
 
+#include <libarch/istate_struct.h>
 #include <libarch/register.h>
 
 #endif /* KERNEL */
-
-typedef struct istate {
-	uint128_t f2;
-	uint128_t f3;
-	uint128_t f4;
-	uint128_t f5;
-	uint128_t f6;
-	uint128_t f7;
-	uint128_t f8;
-	uint128_t f9;
-	uint128_t f10;
-	uint128_t f11;
-	uint128_t f12;
-	uint128_t f13;
-	uint128_t f14;
-	uint128_t f15;
-	uint128_t f16;
-	uint128_t f17;
-	uint128_t f18;
-	uint128_t f19;
-	uint128_t f20;
-	uint128_t f21;
-	uint128_t f22;
-	uint128_t f23;
-	uint128_t f24;
-	uint128_t f25;
-	uint128_t f26;
-	uint128_t f27;
-	uint128_t f28;
-	uint128_t f29;
-	uint128_t f30;
-	uint128_t f31;
-	
-	uintptr_t ar_bsp;
-	uintptr_t ar_bspstore;
-	uintptr_t ar_bspstore_new;
-	uint64_t ar_rnat;
-	uint64_t ar_ifs;
-	uint64_t ar_pfs;
-	uint64_t ar_rsc;
-	uintptr_t cr_ifa;
-	cr_isr_t cr_isr;
-	uintptr_t cr_iipa;
-	psr_t cr_ipsr;
-	uintptr_t cr_iip;
-	uint64_t pr;
-	uintptr_t sp;
-	
-	/*
-	 * The following variables are defined only for break_instruction
-	 * handler.
-	 */
-	uint64_t in0;
-	uint64_t in1;
-	uint64_t in2;
-	uint64_t in3;
-	uint64_t in4;
-	uint64_t in5;
-	uint64_t in6;
-
-	uint64_t alignment;
-} istate_t;
 
 NO_TRACE static inline void istate_set_retaddr(istate_t *istate,
Index: kernel/arch/ia64/include/arch/istate_struct.ag
===================================================================
--- kernel/arch/ia64/include/arch/istate_struct.ag	(revision 75751db6c5c6834a6695072a6087289dd2c538f6)
+++ kernel/arch/ia64/include/arch/istate_struct.ag	(revision 75751db6c5c6834a6695072a6087289dd2c538f6)
@@ -0,0 +1,263 @@
+# Copyright (c) 2014 Jakub Jermar 
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+{
+        name : istate,
+
+        includes : [
+                {
+                        guard : KERNEL,
+                        include : <typedefs.h>
+                },
+                {
+                        guard : KERNEL,
+                        include : <arch/register.h>
+                },
+                {
+                        negative-guard : KERNEL,
+                        include : <sys/types.h>
+                },
+                {
+                        negative-guard : KERNEL,
+                        include : <libarch/register.h>
+                }
+        ],
+
+        members : [
+                {
+                        name : f2,
+                        type : uint128_t
+                },
+                {
+                        name : f3,
+                        type : uint128_t
+                },
+                {
+                        name : f4,
+                        type : uint128_t
+                },
+                {
+                        name : f5,
+                        type : uint128_t
+                },
+                {
+                        name : f6,
+                        type : uint128_t
+                },
+                {
+                        name : f7,
+                        type : uint128_t
+                },
+                {
+                        name : f8,
+                        type : uint128_t
+                },
+                {
+                        name : f9,
+                        type : uint128_t
+                },
+                {
+                        name : f10,
+                        type : uint128_t
+                },
+                {
+                        name : f11,
+                        type : uint128_t
+                },
+                {
+                        name : f12,
+                        type : uint128_t
+                },
+                {
+                        name : f13,
+                        type : uint128_t
+                },
+                {
+                        name : f14,
+                        type : uint128_t
+                },
+                {
+                        name : f15,
+                        type : uint128_t
+                },
+                {
+                        name : f16,
+                        type : uint128_t
+                },
+                {
+                        name : f17,
+                        type : uint128_t
+                },
+                {
+                        name : f18,
+                        type : uint128_t
+                },
+                {
+                        name : f19,
+                        type : uint128_t
+                },
+                {
+                        name : f20,
+                        type : uint128_t
+                },
+                {
+                        name : f21,
+                        type : uint128_t
+                },
+                {
+                        name : f22,
+                        type : uint128_t
+                },
+                {
+                        name : f23,
+                        type : uint128_t
+                },
+                {
+                        name : f24,
+                        type : uint128_t
+                },
+                {
+                        name : f25,
+                        type : uint128_t
+                },
+                {
+                        name : f26,
+                        type : uint128_t
+                },
+                {
+                        name : f27,
+                        type : uint128_t
+                },
+                {
+                        name : f28,
+                        type : uint128_t
+                },
+                {
+                        name : f29,
+                        type : uint128_t
+                },
+                {
+                        name : f30,
+                        type : uint128_t
+                },
+                {
+                        name : f31,
+                        type : uint128_t
+                },
+
+                {
+                        name : ar_bsp,
+                        type : uintptr_t
+                },
+                {
+                        name : ar_bspstore,
+                        type : uintptr_t
+                },
+                {
+                        name : ar_bspstore_new,
+                        type : uintptr_t
+                },
+                {
+                        name : ar_rnat,
+                        type : uint64_t
+                },
+                {
+                        name : ar_ifs,
+                        type : uint64_t
+                },
+                {
+                        name : ar_pfs,
+                        type : uint64_t
+                },
+                {
+                        name : ar_rsc,
+                        type : uint64_t
+                },
+                {
+                        name : cr_ifa,
+                        type : uintptr_t
+                },
+                {
+                        name : cr_isr,
+                        type : cr_isr_t
+                },
+                {
+                        name : cr_iipa,
+                        type : uintptr_t
+                },
+                {
+                        name : cr_ipsr,
+                        type : psr_t
+                },
+                {
+                        name : cr_iip,
+                        type : uintptr_t
+                },
+                {
+                        name : pr,
+                        type : uint64_t
+                },
+                {
+                        name : sp,
+                        type : uintptr_t
+                },
+
+                #
+                # The following variables are defined only for break_instruction
+                # handler.
+                #
+                {
+                        name : in0,
+                        type : uint64_t
+                },
+                {
+                        name : in1,
+                        type : uint64_t
+                },
+                {
+                        name : in2,
+                        type : uint64_t
+                },
+                {
+                        name : in3,
+                        type : uint64_t
+                },
+                {
+                        name : in4,
+                        type : uint64_t
+                },
+                {
+                        name : in5,
+                        type : uint64_t
+                },
+                {
+                        name : in6,
+                        type : uint64_t
+                }
+        ]
+}
+
Index: kernel/arch/ia64/src/ivt.S
===================================================================
--- kernel/arch/ia64/src/ivt.S	(revision 9b3f77caf735cbb001a4f81f1d9cebabfb684dd7)
+++ kernel/arch/ia64/src/ivt.S	(revision 75751db6c5c6834a6695072a6087289dd2c538f6)
@@ -31,15 +31,10 @@
 #include <arch/register.h>
 #include <arch/mm/page.h>
+#include <arch/istate_struct.h>
 #include <align.h>
 
-#define FRS_TO_SAVE 30
-#define STACK_ITEMS		(21 + FRS_TO_SAVE * 2)
-#define STACK_FRAME_SIZE	ALIGN_UP((STACK_ITEMS * STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT)
-
-#if (STACK_ITEMS % 2 == 0)
-#	define STACK_FRAME_BIAS	8
-#else
-#	define STACK_FRAME_BIAS 16
-#endif
+#define STACK_FRAME_SIZE	ALIGN_UP(ISTATE_SIZE + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT)
+
+#define FLOAT_ITEM_SIZE		(STACK_ITEM_SIZE * 2)
 
 /** Partitioning of bank 0 registers. */
@@ -120,9 +115,9 @@
 	mov r27 = ~PSR_DFH_MASK ;;
 	and r26 = r25, r26
-	and r24 = r24, r27;;
-	or r24 = r24, r26;;
-	mov psr.l = r24;;
+	and r24 = r24, r27 ;;
+	or r24 = r24, r26 ;;
+	mov psr.l = r24 ;;
 	srlz.i
-	srlz.d;;
+	srlz.d ;;
 
 	mov r24 = cr.iip
@@ -161,6 +156,6 @@
 (p4)	mov r12 = R_KSTACK ;;
 	
-	add r31 = -STACK_FRAME_BIAS, r12 ;;
-	add r12 = -STACK_FRAME_SIZE, r12
+	add r12 = -STACK_FRAME_SIZE, r12 ;;
+	add r31 = STACK_SCRATCH_AREA_SIZE + ISTATE_OFFSET_IN6, r12
 
     /* 4. save registers in bank 0 into memory stack */
@@ -179,22 +174,22 @@
 	 */
 
-(p6)	st8 [r31] = r38, -8 ;;		/* save in6 */
-(p6)	st8 [r31] = r37, -8 ;;		/* save in5 */
-(p6)	st8 [r31] = r36, -8 ;;		/* save in4 */	
-(p6)	st8 [r31] = r35, -8 ;;		/* save in3 */
-(p6) 	st8 [r31] = r34, -8 ;;		/* save in2 */
-(p6)	st8 [r31] = r33, -8 ;;		/* save in1 */
-(p6)	st8 [r31] = r32, -8 ;;		/* save in0 */
-(p5)	add r31 = -56, r31 ;;
+(p6)	st8 [r31] = r38, -STACK_ITEM_SIZE ;;	/* save in6 */
+(p6)	st8 [r31] = r37, -STACK_ITEM_SIZE ;;	/* save in5 */
+(p6)	st8 [r31] = r36, -STACK_ITEM_SIZE ;;	/* save in4 */	
+(p6)	st8 [r31] = r35, -STACK_ITEM_SIZE ;;	/* save in3 */
+(p6) 	st8 [r31] = r34, -STACK_ITEM_SIZE ;;	/* save in2 */
+(p6)	st8 [r31] = r33, -STACK_ITEM_SIZE ;;	/* save in1 */
+(p6)	st8 [r31] = r32, -STACK_ITEM_SIZE ;;	/* save in0 */
+(p5)	add r31 = -(7 * STACK_ITEM_SIZE), r31 ;;
     
-	st8 [r31] = r30, -8 ;;		/* save old stack pointer */ 
-	
-	st8 [r31] = r29, -8 ;;		/* save predicate registers */
-
-	st8 [r31] = r24, -8 ;;		/* save cr.iip */
-	st8 [r31] = r25, -8 ;;		/* save cr.ipsr */
-	st8 [r31] = r26, -8 ;;		/* save cr.iipa */
-	st8 [r31] = r27, -8 ;;		/* save cr.isr */
-	st8 [r31] = r28, -8 ;;		/* save cr.ifa */
+	st8 [r31] = r30, -STACK_ITEM_SIZE ;;	/* save old stack pointer */ 
+	
+	st8 [r31] = r29, -STACK_ITEM_SIZE ;;	/* save predicate registers */
+
+	st8 [r31] = r24, -STACK_ITEM_SIZE ;;	/* save cr.iip */
+	st8 [r31] = r25, -STACK_ITEM_SIZE ;;	/* save cr.ipsr */
+	st8 [r31] = r26, -STACK_ITEM_SIZE ;;	/* save cr.iipa */
+	st8 [r31] = r27, -STACK_ITEM_SIZE ;;	/* save cr.isr */
+	st8 [r31] = r28, -STACK_ITEM_SIZE ;;	/* save cr.ifa */
 
     /* 5. RSE switch from interrupted context */
@@ -204,7 +199,7 @@
 	mov r26 = cr.ifs
 	
-	st8 [r31] = r24, -8 ;;		/* save ar.rsc */
-	st8 [r31] = r25, -8 ;;		/* save ar.pfs */
-	st8 [r31] = r26, -8		/* save ar.ifs */
+	st8 [r31] = r24, -STACK_ITEM_SIZE ;;	/* save ar.rsc */
+	st8 [r31] = r25, -STACK_ITEM_SIZE ;;	/* save ar.pfs */
+	st8 [r31] = r26, -STACK_ITEM_SIZE	/* save ar.ifs */
 	
 	and r24 = ~(RSC_PL_MASK), r24 ;;
@@ -231,8 +226,8 @@
 	mov r29 = ar.bsp
 	
-	st8 [r31] = r27, -8 ;;		/* save ar.rnat */
-	st8 [r31] = r30, -8 ;;		/* save new value written to ar.bspstore */
-	st8 [r31] = r28, -8 ;;		/* save ar.bspstore */
-	st8 [r31] = r29, -8 		/* save ar.bsp */
+	st8 [r31] = r27, -STACK_ITEM_SIZE ;;	/* save ar.rnat */
+	st8 [r31] = r30, -STACK_ITEM_SIZE ;;	/* save new value written to ar.bspstore */
+	st8 [r31] = r28, -STACK_ITEM_SIZE ;;	/* save ar.bspstore */
+	st8 [r31] = r29, -STACK_ITEM_SIZE 	/* save ar.bsp */
 	
 	mov ar.rsc = r24		/* restore RSE's setting + kernel privileges */
@@ -246,9 +241,9 @@
 	cover				/* allocate zero size frame (step 1 (from Intel Docs)) */
 
-	add r31 = (STACK_SCRATCH_AREA_SIZE + (FRS_TO_SAVE * 2 * 8)), r12 ;;
-
-	ld8 r30 = [r31], +8 ;;		/* load ar.bsp */
-	ld8 r29 = [r31], +8 ;;   	/* load ar.bspstore */
-	ld8 r28 = [r31], +8 ;;   	/* load ar.bspstore_new */
+	add r31 = STACK_SCRATCH_AREA_SIZE + ISTATE_OFFSET_AR_BSP, r12 ;;
+
+	ld8 r30 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.bsp */
+	ld8 r29 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.bspstore */
+	ld8 r28 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.bspstore_new */
 	sub r27 = r30 , r28 ;;		/* calculate loadrs (step 2) */
 	shl r27 = r27, 16
@@ -261,8 +256,8 @@
 	loadrs 				/* (step 3) */
 
-	ld8 r27 = [r31], +8 ;;		/* load ar.rnat */
-	ld8 r26 = [r31], +8 ;;		/* load cr.ifs */
-	ld8 r25 = [r31], +8 ;;		/* load ar.pfs */
-	ld8 r24 = [r31], +8 ;;		/* load ar.rsc */
+	ld8 r27 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.rnat */
+	ld8 r26 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.ifs */
+	ld8 r25 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.pfs */
+	ld8 r24 = [r31], +STACK_ITEM_SIZE ;;	/* load ar.rsc */
 
 	mov ar.bspstore = r29 ;;	/* (step 4) */
@@ -275,9 +270,9 @@
 
     /* 17. restore interruption state from memory stack */
-	ld8 r28 = [r31], +8 ;;		/* load cr.ifa */		
-	ld8 r27 = [r31], +8 ;;		/* load cr.isr */
-	ld8 r26 = [r31], +8 ;;		/* load cr.iipa */
-	ld8 r25 = [r31], +8 ;;		/* load cr.ipsr */
-	ld8 r24 = [r31], +8 ;;		/* load cr.iip */
+	ld8 r28 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.ifa */		
+	ld8 r27 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.isr */
+	ld8 r26 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.iipa */
+	ld8 r25 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.ipsr */
+	ld8 r24 = [r31], +STACK_ITEM_SIZE ;;	/* load cr.iip */
 
 	mov cr.iip = r24;;
@@ -292,13 +287,13 @@
 	and r25 = r25, r27
 	and r24 = r24, r26 ;;
-	or r25 = r25, r24;;
+	or r25 = r25, r24 ;;
 	mov cr.ipsr = r25
 
     /* 18. restore predicate registers from memory stack */
-	ld8 r29 = [r31], +8 ;;		/* load predicate registers */
+	ld8 r29 = [r31], +STACK_ITEM_SIZE ;;	/* load predicate registers */
 	mov pr = r29
 	
     /* 19. return from interruption */
-    	ld8 r12 = [r31]			/* load stack pointer */ 
+    	ld8 r12 = [r31]				/* load stack pointer */ 
 	rfi ;;
 
@@ -373,46 +368,46 @@
 	mov loc46 = r31
 
-	add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12
-	add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12
-	add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12
-	add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12
-	add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12
-	add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12
-	add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12
-	add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;;
-	
-	stf.spill [r26] = f2, 0x80
-	stf.spill [r27] = f3, 0x80
-	stf.spill [r28] = f4, 0x80
-	stf.spill [r29] = f5, 0x80
-	stf.spill [r30] = f6, 0x80
-	stf.spill [r31] = f7, 0x80 ;;
-
-	stf.spill [r24] = f8, 0x80
-	stf.spill [r25] = f9, 0x80
-	stf.spill [r26] = f10, 0x80
-	stf.spill [r27] = f11, 0x80
-	stf.spill [r28] = f12, 0x80
-	stf.spill [r29] = f13, 0x80
-	stf.spill [r30] = f14, 0x80
-	stf.spill [r31] = f15, 0x80 ;;
-
-	stf.spill [r24] = f16, 0x80
-	stf.spill [r25] = f17, 0x80
-	stf.spill [r26] = f18, 0x80
-	stf.spill [r27] = f19, 0x80
-	stf.spill [r28] = f20, 0x80
-	stf.spill [r29] = f21, 0x80
-	stf.spill [r30] = f22, 0x80
-	stf.spill [r31] = f23, 0x80 ;;
-
-	stf.spill [r24] = f24, 0x80
-	stf.spill [r25] = f25, 0x80
-	stf.spill [r26] = f26, 0x80
-	stf.spill [r27] = f27, 0x80
-	stf.spill [r28] = f28, 0x80
-	stf.spill [r29] = f29, 0x80
-	stf.spill [r30] = f30, 0x80
-	stf.spill [r31] = f31, 0x80 ;;
+	add r24 = ISTATE_OFFSET_F8 + STACK_SCRATCH_AREA_SIZE, r12
+	add r25 = ISTATE_OFFSET_F9 + STACK_SCRATCH_AREA_SIZE, r12
+	add r26 = ISTATE_OFFSET_F2 + STACK_SCRATCH_AREA_SIZE, r12
+	add r27 = ISTATE_OFFSET_F3 + STACK_SCRATCH_AREA_SIZE, r12
+	add r28 = ISTATE_OFFSET_F4 + STACK_SCRATCH_AREA_SIZE, r12
+	add r29 = ISTATE_OFFSET_F5 + STACK_SCRATCH_AREA_SIZE, r12
+	add r30 = ISTATE_OFFSET_F6 + STACK_SCRATCH_AREA_SIZE, r12
+	add r31 = ISTATE_OFFSET_F7 + STACK_SCRATCH_AREA_SIZE, r12 ;;
+	
+	stf.spill [r26] = f2, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r27] = f3, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r28] = f4, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r29] = f5, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r30] = f6, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r31] = f7, 8 * FLOAT_ITEM_SIZE ;;
+
+	stf.spill [r24] = f8, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r25] = f9, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r26] = f10, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r27] = f11, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r28] = f12, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r29] = f13, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r30] = f14, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r31] = f15, 8 * FLOAT_ITEM_SIZE ;;
+
+	stf.spill [r24] = f16, 8 * FLOAT_ITEM_SIZE 
+	stf.spill [r25] = f17, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r26] = f18, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r27] = f19, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r28] = f20, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r29] = f21, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r30] = f22, 8 * FLOAT_ITEM_SIZE
+	stf.spill [r31] = f23, 8 * FLOAT_ITEM_SIZE ;;
+
+	stf.spill [r24] = f24
+	stf.spill [r25] = f25
+	stf.spill [r26] = f26
+	stf.spill [r27] = f27
+	stf.spill [r28] = f28
+	stf.spill [r29] = f29
+	stf.spill [r30] = f30
+	stf.spill [r31] = f31 ;;
 
 	mov loc47 = ar.fpsr	/* preserve floating point status register */
@@ -442,46 +437,46 @@
 
     /* 13. restore general and floating-point registers */
-	add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12
-	add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12
-	add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12
-	add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12
-	add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12
-	add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12
-	add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12
-	add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;;
-
-	ldf.fill f2 = [r26], 0x80
-	ldf.fill f3 = [r27], 0x80
-	ldf.fill f4 = [r28], 0x80
-	ldf.fill f5 = [r29], 0x80
-	ldf.fill f6 = [r30], 0x80
-	ldf.fill f7 = [r31], 0x80 ;;
-
-	ldf.fill f8 = [r24], 0x80
-	ldf.fill f9 = [r25], 0x80
-	ldf.fill f10 = [r26], 0x80
-	ldf.fill f11 = [r27], 0x80
-	ldf.fill f12 = [r28], 0x80
-	ldf.fill f13 = [r29], 0x80
-	ldf.fill f14 = [r30], 0x80
-	ldf.fill f15 = [r31], 0x80 ;;
-
-	ldf.fill f16 = [r24], 0x80
-	ldf.fill f17 = [r25], 0x80
-	ldf.fill f18 = [r26], 0x80
-	ldf.fill f19 = [r27], 0x80
-	ldf.fill f20 = [r28], 0x80
-	ldf.fill f21 = [r29], 0x80
-	ldf.fill f22 = [r30], 0x80
-	ldf.fill f23 = [r31], 0x80 ;;
-
-	ldf.fill f24 = [r24], 0x80
-	ldf.fill f25 = [r25], 0x80
-	ldf.fill f26 = [r26], 0x80
-	ldf.fill f27 = [r27], 0x80
-	ldf.fill f28 = [r28], 0x80
-	ldf.fill f29 = [r29], 0x80
-	ldf.fill f30 = [r30], 0x80
-	ldf.fill f31 = [r31], 0x80 ;;
+	add r24 = ISTATE_OFFSET_F8 + STACK_SCRATCH_AREA_SIZE, r12
+	add r25 = ISTATE_OFFSET_F9 + STACK_SCRATCH_AREA_SIZE, r12
+	add r26 = ISTATE_OFFSET_F2 + STACK_SCRATCH_AREA_SIZE, r12
+	add r27 = ISTATE_OFFSET_F3 + STACK_SCRATCH_AREA_SIZE, r12
+	add r28 = ISTATE_OFFSET_F4 + STACK_SCRATCH_AREA_SIZE, r12
+	add r29 = ISTATE_OFFSET_F5 + STACK_SCRATCH_AREA_SIZE, r12
+	add r30 = ISTATE_OFFSET_F6 + STACK_SCRATCH_AREA_SIZE, r12
+	add r31 = ISTATE_OFFSET_F7 + STACK_SCRATCH_AREA_SIZE, r12 ;;
+
+	ldf.fill f2 = [r26], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f3 = [r27], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f4 = [r28], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f5 = [r29], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f6 = [r30], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f7 = [r31], 8 * FLOAT_ITEM_SIZE ;;
+
+	ldf.fill f8 = [r24], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f9 = [r25], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f10 = [r26],8 * FLOAT_ITEM_SIZE
+	ldf.fill f11 = [r27], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f12 = [r28], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f13 = [r29], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f14 = [r30], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f15 = [r31], 8 * FLOAT_ITEM_SIZE ;;
+
+	ldf.fill f16 = [r24], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f17 = [r25], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f18 = [r26], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f19 = [r27], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f20 = [r28], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f21 = [r29], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f22 = [r30], 8 * FLOAT_ITEM_SIZE
+	ldf.fill f23 = [r31], 8 * FLOAT_ITEM_SIZE ;;
+
+	ldf.fill f24 = [r24]
+	ldf.fill f25 = [r25]
+	ldf.fill f26 = [r26]
+	ldf.fill f27 = [r27]
+	ldf.fill f28 = [r28]
+	ldf.fill f29 = [r29]
+	ldf.fill f30 = [r30]
+	ldf.fill f31 = [r31] ;;
 	
 	mov r1 = loc17
