about summary refs log tree commit diff
path: root/sysdeps/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/alpha')
-rw-r--r--sysdeps/alpha/_mcount.S11
-rw-r--r--sysdeps/alpha/bb_init_func.S12
-rw-r--r--sysdeps/alpha/bsd-_setjmp.S7
-rw-r--r--sysdeps/alpha/bsd-setjmp.S7
-rw-r--r--sysdeps/alpha/divrem.h11
-rw-r--r--sysdeps/alpha/ffs.S4
-rw-r--r--sysdeps/alpha/memchr.S36
-rw-r--r--sysdeps/alpha/setjmp.S5
-rw-r--r--sysdeps/alpha/strlen.S82
9 files changed, 85 insertions, 90 deletions
diff --git a/sysdeps/alpha/_mcount.S b/sysdeps/alpha/_mcount.S
index e813ebdd58..6c4af3f233 100644
--- a/sysdeps/alpha/_mcount.S
+++ b/sysdeps/alpha/_mcount.S
@@ -28,20 +28,17 @@ compiler treats those calls as if they were instructions.  In
 particular, it doesn't save any of the temporary registers (caller
 saved registers).  It is therefore necessary to preserve all
 caller-saved registers as well
- 
+
 Upon entering _mcount, register $at holds the return address and ra
 holds the return address of the function's caller (selfpc and frompc,
 respectively in gmon.c language...). */
 
 #include <sysdep.h>
 
-#undef ret	/* discard `ret' as defined in sysdep.h */
-
 	.set	noat
 	.set	noreorder
 
 LEAF(_mcount, 0xb0)
-weak_alias (_mcount, mcount)
 	.prologue 0
 
 	subq	 sp, 0xb0, sp
@@ -69,8 +66,6 @@ weak_alias (_mcount, mcount)
 	stq	 t5, 0x70(sp)
 	stq	 t6, 0x78(sp)
 
-	lda	 pv, __mcount
-
 	stq	 t7, 0x80(sp)
 	stq	 t8, 0x88(sp)
 	stq	 t9, 0x90(sp)
@@ -78,7 +73,7 @@ weak_alias (_mcount, mcount)
 	stq	t11, 0xa0(sp)
 	stq	 v0, 0xa8(sp)
 
-	jsr	ra, (pv), __mcount
+	jsr	ra, __mcount
 
 	ldq	 a0, 0x00(sp)
 	ldq	 a1, 0x08(sp)
@@ -108,3 +103,5 @@ weak_alias (_mcount, mcount)
 	ret	zero,($at),1
 
 	END(_mcount)
+
+weak_alias (_mcount, mcount)
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
index 49be0b2bfe..dcd4eac231 100644
--- a/sysdeps/alpha/bb_init_func.S
+++ b/sysdeps/alpha/bb_init_func.S
@@ -40,10 +40,10 @@ ENTRY(__bb_init_func)
 	ldq	t0, ZERO_WORD(a0)	/* t0 <- blocks->zero_word */
 	beq	t0, init		/* not initialized yet -> */
 	ret
-	
+
 END(__bb_init_func)
 
-.ent init
+	.ent init
 init:
 	.frame	sp, 0x38, ra, 0
 	subq	sp, 0x38, sp
@@ -61,8 +61,8 @@ init:
 	stq	t0, ZERO_WORD(a0)	/* blocks->zero_word = 1 */
 	stq	t2, NEXT(a0)		/* blocks->next = __bb_head */
 	stq	a0, 0(t1)
-	bne	t2, leave
-	beq	t3, leave		/* t3 == GMON_PROF_ON? yes -> */
+	bne	t2, $leave
+	beq	t3, $leave		/* t3 == GMON_PROF_ON? yes -> */
 
 	/* also need to initialize destructor: */
 	stq	ra, 0x00(sp)
@@ -81,8 +81,8 @@ init:
 	ldq	a4, 0x20(sp)
 	ldq	a5, 0x28(sp)
 
-leave:	ldq	pv, 0x30(sp)
+$leave:	ldq	pv, 0x30(sp)
 	addq	sp, 0x38, sp
 	ret
 
-.end init
+	.end init
diff --git a/sysdeps/alpha/bsd-_setjmp.S b/sysdeps/alpha/bsd-_setjmp.S
index da60442c23..a7bdbb5a61 100644
--- a/sysdeps/alpha/bsd-_setjmp.S
+++ b/sysdeps/alpha/bsd-_setjmp.S
@@ -1,5 +1,5 @@
 /* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'.  Alpha version.
-Copyright (C) 1994 Free Software Foundation, Inc.
+Copyright (C) 1994, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -24,7 +24,8 @@ Cambridge, MA 02139, USA.  */
 #include <sysdep.h>
 
 ENTRY(_setjmp)
-	lda	$27, __sigsetjmp	/* Load address to jump to.  */
+	ldgp	$29,0($27)
+	.prologue 1
 	bis	$31, $31, $17		/* Pass a second argument of zero.  */
-	jmp	$31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
+	jmp	$31, __sigsetjmp	/* Call __sigsetjmp.  */
 	END(_setjmp)
diff --git a/sysdeps/alpha/bsd-setjmp.S b/sysdeps/alpha/bsd-setjmp.S
index fc73815a84..c0ed691f40 100644
--- a/sysdeps/alpha/bsd-setjmp.S
+++ b/sysdeps/alpha/bsd-setjmp.S
@@ -1,5 +1,5 @@
 /* BSD `setjmp' entry point to `sigsetjmp (..., 1)'.  Alpha version.
-Copyright (C) 1994 Free Software Foundation, Inc.
+Copyright (C) 1994, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -24,7 +24,8 @@ Cambridge, MA 02139, USA.  */
 #include <sysdep.h>
 
 ENTRY(setjmp)
-	lda	$27, __sigsetjmp	/* Load address to jump to.  */
+	ldgp	$29, 0($27)
+	.prologue 1
 	bis	$31, 1, $17		/* Pass a second argument of one.  */
-	jmp	$31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
+	jmp	$31, __sigsetjmp	/* Call __sigsetjmp.  */
 	END(setjmp)
diff --git a/sysdeps/alpha/divrem.h b/sysdeps/alpha/divrem.h
index 2951335c49..b5b66ae10b 100644
--- a/sysdeps/alpha/divrem.h
+++ b/sysdeps/alpha/divrem.h
@@ -115,10 +115,9 @@ FUNC_NAME:
 
 	br	AT, 1f
 1:	ldgp	gp, 0(AT)
-	lda	AT, _mcount
 
 	mov	retaddr, ra
-	jsr	AT, (AT), _mcount
+	jsr	AT, _mcount
 
 	ldq	ra, 0x00(sp)
 	ldq	pv, 0x08(sp)
@@ -137,7 +136,7 @@ FUNC_NAME:
 	stq	tmp0,0x18(sp)
 	bis	zero,zero,quotient
 	stq	tmp1,0x20(sp)
-	beq	divisor,divbyzero
+	beq	divisor,$divbyzero
 	stq	sign,0x28(sp)
 	GETSIGN(dividend,divisor,sign)
 #if SIGNED
@@ -170,7 +169,7 @@ FUNC_NAME:
 
 	ldq	arg1,0x00(sp)
 	SETSIGN(sign,result,tmp0)
-done:	ldq	arg2,0x08(sp)
+$done:	ldq	arg2,0x08(sp)
 	ldq	mask,0x10(sp)
 	ldq	tmp0,0x18(sp)
 	ldq	tmp1,0x20(sp)
@@ -178,11 +177,11 @@ done:	ldq	arg2,0x08(sp)
 	lda	sp,FRAME_SIZE(sp)
 	ret	zero,(retaddr),0
 
-divbyzero:
+$divbyzero:
 	lda	a0,GEN_INTDIV(zero)
 	call_pal PAL_gentrap
 	bis	zero,zero,result	/* if trap returns, return 0 */
 	ldq	arg1,0x00(sp)
-	br	done
+	br	$done
 
 	END(FUNC_NAME)
diff --git a/sysdeps/alpha/ffs.S b/sysdeps/alpha/ffs.S
index e4dd87c9f1..b84a51d326 100644
--- a/sysdeps/alpha/ffs.S
+++ b/sysdeps/alpha/ffs.S
@@ -34,7 +34,7 @@ ENTRY(ffs)
         negq    a0, t0		# due to the srl instruction
         and     a0, t0, t0
 	clr	v0
-	beq	a0, done
+	beq	a0, $done
 
 	# now do binary search for first non-zero bit
 
@@ -61,6 +61,6 @@ ENTRY(ffs)
         addq    v0, 1, t3
         cmoveq  t2, t3, v0
 
-done:   ret
+$done:	ret
 
         END(ffs)
diff --git a/sysdeps/alpha/memchr.S b/sysdeps/alpha/memchr.S
index 2d21247174..a47ac96e01 100644
--- a/sysdeps/alpha/memchr.S
+++ b/sysdeps/alpha/memchr.S
@@ -42,7 +42,7 @@ For correctness consider that:
 ENTRY(memchr)
 	.prologue 0
 
-	beq	a2, not_found
+	beq	a2, $not_found
         ldq_u   t0, 0(a0)       # load first quadword (a0 may be misaligned)
 	addq	a0, a2, t4
 	and	a1, 0xff, a1	# a1 = 00000000000000ch
@@ -57,7 +57,7 @@ ENTRY(memchr)
 	extql	t0, a0, t6
 	or	t1, a1, a1	# a1 = chchchchchchchch
 
-	beq	t3, first_quad
+	beq	t3, $first_quad
 
 	extqh	t5, a0, t5
 	mov	a0, v0
@@ -68,15 +68,15 @@ ENTRY(memchr)
 	# in t0.  E.g.:
 	#	a2 = 6
 	#	t0 = ????c6c5c4c3c2c1
-last_quad:
+$last_quad:
 	negq	a2, t5
 	srl	t2, t5, t5	# t5 = mask of a2 bits set
         xor	a1, t0, t0
         cmpbge  zero, t0, t1
 	and	t1, t5, t1
-        beq     t1, not_found
+        beq     t1, $not_found
 
-found_it:
+$found_it:
 	# now, determine which byte matched:
         negq    t1, t2
         and     t1, t2, t1
@@ -93,20 +93,20 @@ found_it:
         addq    v0, 1, t2
         cmoveq  t0, t2, v0
 
-done:	ret
+$done:	ret
 
 
 	#
 	# Deal with the case where a2 > 8 bytes remain to be
 	# searched.  a0 may not be aligned.
 	#
-first_quad:
+$first_quad:
 	andnot	a0, 0x7, v0
         insqh   t2, a0, t1	# t1 = 0000ffffffffffff (a0<0:2> ff bytes)
         xor	t0, a1, t0
 	or	t0, t1, t0	# t0 = ====ffffffffffff
         cmpbge  zero, t0, t1
-        bne     t1, found_it
+        bne     t1, $found_it
 
 	/* at least one byte left to process */
 
@@ -119,41 +119,41 @@ first_quad:
 	subq	t4, 1, a2
 	andnot	a2, 0x7, a2
 	cmpult	v0, a2, t1
-	beq	t1, final
+	beq	t1, $final
 
 	/* at least two quads remain to be accessed */
 
 	subq	a2, v0, t3	# t3 <- number of quads to be processed in loop
 	and	t3, 8, t3	# odd number of quads?
-	bne	t3, odd_quad_count
+	bne	t3, $odd_quad_count
 
 	/* at least three quads remain to be accessed */
 
 	mov	t0, t3		# move prefetched value into correct register
 
 	.align	3
-unrolled_loop:
+$unrolled_loop:
 	ldq	t0, 8(v0)	# prefetch t0
 	xor	a1, t3, t1
 	cmpbge	zero, t1, t1
-	bne	t1, found_it
+	bne	t1, $found_it
 
 	addq	v0, 8, v0
-odd_quad_count:
+$odd_quad_count:
 	xor	a1, t0, t1
 	ldq	t3, 8(v0)	# prefetch t3
 	cmpbge	zero, t1, t1
-	bne	t1, found_it
+	bne	t1, $found_it
 
 	addq	v0, 8, v0
 	cmpult	v0, a2, t5
-	bne	t5, unrolled_loop
+	bne	t5, $unrolled_loop
 
 	mov	t3, t0		# move prefetched value into t0
-final:	subq	t4, v0, a2	# a2 <- number of bytes left to do
-	bne	a2, last_quad
+$final:	subq	t4, v0, a2	# a2 <- number of bytes left to do
+	bne	a2, $last_quad
 
-not_found:
+$not_found:
 	mov	zero, v0
 	ret
 
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
index da71a3292a..59929a0234 100644
--- a/sysdeps/alpha/setjmp.S
+++ b/sysdeps/alpha/setjmp.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -25,9 +25,8 @@ ENTRY (__sigsetjmp)
 	ldgp	$29, 0($27)
 	.prologue 1
 
-	lda	$27, __sigsetjmp_aux	/* Load address to jump to.  */
 	bis	$30, $30, $18		/* Pass SP as 3rd arg.  */
 	bis	$15, $15, $19		/* Pass FP as 4th arg.  */
-	jmp	$31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux.  */
+	jmp	$31, __sigsetjmp_aux	/* Call __sigsetjmp_aux.  */
 
 	END(__sigsetjmp)
diff --git a/sysdeps/alpha/strlen.S b/sysdeps/alpha/strlen.S
index 15c78cde64..9eab707388 100644
--- a/sysdeps/alpha/strlen.S
+++ b/sysdeps/alpha/strlen.S
@@ -19,52 +19,50 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 /* Finds length of a 0-terminated string.  Optimized for the Alpha
-architecture:
+   architecture:
 
       - memory accessed as aligned quadwords only
-      - uses bcmpge to compare 8 bytes in parallel
-      - does binary search to find 0 byte in last
-        quadword (HAKMEM needed 12 instructions to
-        do this instead of the 9 instructions that
-        binary search needs).  */
+      - uses cmpbge to compare 8 bytes in parallel
+      - does binary search to find 0 byte in last quadword (HAKMEM
+	needed 12 instructions to do this instead of the 8 instructions
+	that the binary search needs).
+*/
 
 #include <sysdep.h>
 
-        .set noreorder
-        .set noat
+	.set noreorder
+	.set noat
 
 ENTRY(strlen)
-        ldq_u   t0, 0(a0)       # load first quadword (a0 may be misaligned)
-        lda     t1, -1(zero)
-        insqh   t1, a0, t1
-        andnot  a0, 7, v0
-        or      t1, t0, t0
-        cmpbge  zero, t0, t1    # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
-        bne     t1, found
-
-loop:   ldq     t0, 8(v0)
-        addq    v0, 8, v0       # addr += 8
-        nop                     # helps dual issue last two insns
-        cmpbge  zero, t0, t1
-        beq     t1, loop
-
-found:  blbs    t1, done        # make aligned case fast
-        negq    t1, t2
-        and     t1, t2, t1
-
-        and     t1, 0x0f, t0
-        addq    v0, 4, t2
-        cmoveq  t0, t2, v0
-
-        and     t1, 0x33, t0
-        addq    v0, 2, t2
-        cmoveq  t0, t2, v0
-
-        and     t1, 0x55, t0
-        addq    v0, 1, t2
-        cmoveq  t0, t2, v0
-
-done:   subq    v0, a0, v0
-        ret
-
-        END(strlen)
+	ldq_u   t0, 0(a0)	# load first quadword (a0 may be misaligned)
+	lda     t1, -1(zero)
+	insqh   t1, a0, t1
+	andnot  a0, 7, v0
+	or      t1, t0, t0
+	nop			# dual issue the next two on ev5
+	cmpbge  zero, t0, t1	# t1 <- bitmask: bit i == 1 <==> i-th byte == 0
+	bne     t1, $found
+
+$loop:	ldq     t0, 8(v0)
+	addq    v0, 8, v0	# addr += 8
+	cmpbge  zero, t0, t1
+	beq     t1, $loop
+
+$found:	negq    t1, t2		# clear all but least set bit
+	and     t1, t2, t1
+
+	and     t1, 0xf0, t2	# binary search for that set bit
+	and	t1, 0xcc, t3
+	and	t1, 0xaa, t4
+	cmovne	t2, 4, t2
+	cmovne	t3, 2, t3
+	cmovne	t4, 1, t4
+	addq	t2, t3, t2
+	addq	v0, t4, v0
+	addq	v0, t2, v0
+	nop			# dual issue next two on ev4 and ev5
+
+	subq    v0, a0, v0
+	ret
+
+	END(strlen)