From a5ed5ae3b775b3455df47dc1ad29f2e66e58cb65 Mon Sep 17 00:00:00 2001
From: "mostang.com!davidm" <mostang.com!davidm>
Date: Thu, 19 Feb 2004 08:05:27 +0000
Subject: [PATCH] (LOAD_VAL): New macro. (save_static_to_stacked): Use
 LOAD_VAL. (save_static_to_fr): Rename from save_static_to_fpreg().
 (save_static_to_br): New function. (save_static_to_mem): Likewise.

(Logical change 1.175)
---
 tests/ia64-test-nat-asm.S | 110 +++++++++++++++++++++++++++++++-------
 1 file changed, 92 insertions(+), 18 deletions(-)

diff --git a/tests/ia64-test-nat-asm.S b/tests/ia64-test-nat-asm.S
index ba3ba7c5..ca2625d5 100644
--- a/tests/ia64-test-nat-asm.S
+++ b/tests/ia64-test-nat-asm.S
@@ -37,6 +37,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 	br.call.sptk.many rp = b6;;					\
 	mov gp = gp_save_reg
 
+#define LOAD_VAL(reg)				\
+	ld8 reg = [in1], 8;;			\
+	tbit.nz p6, p0 = reg, 0;;		\
+(p6)	ld8.s reg = [r0]
+
 
 	/* Save r4-r7 into stacked registers, load them up with the
 	   values passed via the pointer in in1 and then call the
@@ -60,19 +65,10 @@ save_static_to_stacked:
 	.spillreg r7, loc5
 	mov loc5 = r7
 	.body
-	ld8 r4 = [in1], 8;;
-	ld8 r5 = [in1], 8;;
-	ld8 r6 = [in1], 8;;
-	ld8 r7 = [in1], 8;;
-	tbit.nz p6, p0 = r4, 0
-	tbit.nz p7, p0 = r5, 0
-	tbit.nz p8, p0 = r6, 0
-	tbit.nz p9, p0 = r7, 0;;
-(p6)	ld8.s r4 = [r0]
-(p7)	ld8.s r5 = [r0]
-(p8)	ld8.s r6 = [r0]
-(p9)	ld8.s r7 = [r0]
-
+	LOAD_VAL(r4)
+	LOAD_VAL(r5)
+	LOAD_VAL(r6)
+	LOAD_VAL(r7)
 	CALL_NEXT(loc6)
 
 	mov r4 = loc2
@@ -89,9 +85,9 @@ save_static_to_stacked:
 	   r4 with the value passed via in1 and call the function
 	   passed via in0.  */
 
-	.global save_static_to_fpreg
-	.proc save_static_to_fpreg
-save_static_to_fpreg:
+	.global save_static_to_fr
+	.proc save_static_to_fr
+save_static_to_fr:
 	.prologue
 	.regstk 2, 3, 2, 0
 	.save ar.pfs, loc0
@@ -113,9 +109,87 @@ save_static_to_fpreg:
 	CALL_NEXT(loc2)
 
 	getf.sig r4 = f2		// restore r4
-	ldf.fill f2 = [sp], 16		// restore r2
+	.restore sp
+	add sp = 16, sp;;
+	ldf.fill f2 = [sp]		// restore r2
 
 	mov ar.pfs = loc0
 	mov rp = loc1
 	br.ret.sptk.many rp
-	.endp save_static_to_fpreg
+	.endp save_static_to_fr
+
+	/* If r4 is not a NaT, save b3 to a stacked register and
+	   then save r4 in b3.  The non-NaTness of r4 is saved in
+	   p1.  */
+
+	.global save_static_to_br
+	.proc save_static_to_br
+save_static_to_br:
+	.prologue
+	.regstk 2, 5, 2, 0
+	.save ar.pfs, loc0
+	alloc loc0 = ar.pfs, 2, 5, 2, 0
+	.save rp, loc1
+	mov loc1 = rp
+
+	.save pr, loc2
+	mov loc2 = pr			// save predicates
+
+	.spillreg b3, loc3
+	mov loc3 = b3
+
+	tnat.z p1, p2 = r4;;
+	.spillreg.p p1, r4, b3
+(p1)	mov b3 = r4
+
+	.body
+
+	LOAD_VAL(r4)
+	CALL_NEXT(loc4)
+
+(p1)	mov r4 = b3			// restore r4
+
+	mov ar.pfs = loc0
+	mov rp = loc1
+	mov pr = loc2, -1
+	mov b3 = loc3			// restore b3
+	br.ret.sptk.many rp
+	.endp save_static_to_br
+
+	/* Spill r4 into memory and then save r5 in r4.  */
+
+	.global save_static_to_mem
+	.proc save_static_to_mem
+save_static_to_mem:
+	.prologue
+	.regstk 2, 4, 2, 0
+	.save ar.pfs, loc0
+	alloc loc0 = ar.pfs, 2, 4, 2, 0
+	.save rp, loc1
+	mov loc1 = rp
+	.save ar.unat, loc2
+	mov loc2 = ar.unat
+
+	.fframe 16
+	.spillpsp r4, 16
+	st8.spill [sp] = r4, -16
+
+	.spillreg r5, r4
+	mov r4 = r5
+
+	.body
+
+	LOAD_VAL(r5)
+	CALL_NEXT(loc3)
+
+	mov r5 = r4			// restore r5
+	.restore sp
+	add sp = 16, sp;;
+	ld8.fill r4 = [sp]		// restore r4
+
+	mov ar.pfs = loc0
+	mov rp = loc1
+	mov ar.unat = loc2		// restore ar.unat
+	br.ret.sptk.many rp
+
+	.endp save_static_to_mem