update from main archive 960807

This commit is contained in:
Ulrich Drepper 1996-08-08 00:35:28 +00:00
parent ad1a0a0a64
commit b870eeda1d
11 changed files with 92 additions and 87 deletions

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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
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
nop # helps dual issue last two insns
cmpbge zero, t0, t1
beq t1, loop
$loop: ldq t0, 8(v0)
addq v0, 8, v0 # addr += 8
cmpbge zero, t0, t1
beq t1, $loop
found: blbs t1, done # make aligned case fast
negq t1, t2
and t1, t2, t1
$found: negq t1, t2 # clear all but least set bit
and t1, t2, t1
and t1, 0x0f, t0
addq v0, 4, t2
cmoveq t0, t2, v0
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
and t1, 0x33, t0
addq v0, 2, t2
cmoveq t0, t2, v0
subq v0, a0, v0
ret
and t1, 0x55, t0
addq v0, 1, t2
cmoveq t0, t2, v0
done: subq v0, a0, v0
ret
END(strlen)
END(strlen)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
Contributed by Brendan Kehoe (brendan@zen.org).
The GNU C Library is free software; you can redistribute it and/or
@ -23,7 +23,16 @@ break value (instead of the new, requested one). */
#include <sysdep.h>
#include <errnos.h>
#ifdef PIC
.section .bss
.align 3
.globl __curbrk
__curbrk: .skip 8
.type __curbrk,@object
.size __curbrk,8
#else
.comm __curbrk, 8
#endif
.text
LEAF(__brk, 0)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992 Free Software Foundation, Inc.
/* Copyright (C) 1992, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger.
@ -92,6 +92,7 @@ static struct platform {
{"EB66", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
{"EB66P", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
{"Jensen", IOSYS_JENSEN, JENSEN_MEM},
{"Mikasa", IOSYS_APECS, APECS_DENSE_MEM},
{"Mustang", IOSYS_APECS, APECS_DENSE_MEM},
{"Noname", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
};