aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/alpha
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-08-08 00:35:28 +0000
committerUlrich Drepper <drepper@redhat.com>1996-08-08 00:35:28 +0000
commitb870eeda1d1292ae2c803d74d274f6a290a30978 (patch)
tree7d0cd138a39aa57bf174d7d496f8139d0b7ad916 /sysdeps/alpha
parentad1a0a0a648eac6ea60d65d0bb2f0e433c43ff3f (diff)
downloadglibc-b870eeda1d1292ae2c803d74d274f6a290a30978.tar
glibc-b870eeda1d1292ae2c803d74d274f6a290a30978.tar.gz
glibc-b870eeda1d1292ae2c803d74d274f6a290a30978.tar.bz2
glibc-b870eeda1d1292ae2c803d74d274f6a290a30978.zip
update from main archive 960807
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)