1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-05 19:35:52 +03:00
2003-11-14 David Mosberger   <davidm@hpl.hp.com>

	* sysdeps/unix/sysv/linux/ia64/sysdep.h
	(GAS_ALIGN_BREAKS_UNWIND_INFO): Define this macro to indicate
	that all existing GAS versions have a problem with .align inside
	a function.
	* sysdeps/ia64/memccpy.S: Work around GAS_ALIGN_BREAKS_UNWIND_INFO bug.
	* sysdeps/ia64/memcpy.S: Likewise.
	* sysdeps/ia64/memset.S: Likewise.
	* sysdeps/ia64/memmove.S: Likewise.  Also move the jump-table to
	out of .text into .rodata, where it belongs.

	* sysdeps/unix/sysv/linux/ia64/pipe.S: There is no need to
	save/restore input-arguments, because they're necessarily
	preserved by the kernel to support syscall-restart.
This commit is contained in:
Ulrich Drepper
2003-11-19 06:12:51 +00:00
parent ad7f28c29d
commit c9002c1b7a
7 changed files with 74 additions and 14 deletions

View File

@@ -1,3 +1,19 @@
2003-11-14 David Mosberger <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/sysdep.h
(GAS_ALIGN_BREAKS_UNWIND_INFO): Define this macro to indicate
that all existing GAS versions have a problem with .align inside
a function.
* sysdeps/ia64/memccpy.S: Work around GAS_ALIGN_BREAKS_UNWIND_INFO bug.
* sysdeps/ia64/memcpy.S: Likewise.
* sysdeps/ia64/memset.S: Likewise.
* sysdeps/ia64/memmove.S: Likewise. Also move the jump-table to
out of .text into .rodata, where it belongs.
* sysdeps/unix/sysv/linux/ia64/pipe.S: There is no need to
save/restore input-arguments, because they're necessarily
preserved by the kernel to support syscall-restart.
2003-11-18 Jakub Jelinek <jakub@redhat.com> 2003-11-18 Jakub Jelinek <jakub@redhat.com>
* posix/regex_internal.h (re_token_type_t): Remove unused ALT, * posix/regex_internal.h (re_token_type_t): Remove unused ALT,

View File

@@ -52,6 +52,15 @@
#define loopcnt r30 #define loopcnt r30
#define value r31 #define value r31
#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
/* Manually force proper loop-alignment. Note: be sure to
double-check the code-layout after making any changes to
this routine! */
# define ALIGN(n) { nop 0 }
#else
# define ALIGN(n) .align n
#endif
ENTRY(memccpy) ENTRY(memccpy)
.prologue .prologue
alloc r2 = ar.pfs, 4, 40 - 4, 0, 40 alloc r2 = ar.pfs, 4, 40 - 4, 0, 40
@@ -110,7 +119,7 @@ ENTRY(memccpy)
mov ar.ec = MEMLAT + 6 + 1 // six more passes needed mov ar.ec = MEMLAT + 6 + 1 // six more passes needed
ld8 r[1] = [asrc], 8 // r[1] = w0 ld8 r[1] = [asrc], 8 // r[1] = w0
cmp.ne p6, p0 = r0, r0 ;; // clear p6 cmp.ne p6, p0 = r0, r0 ;; // clear p6
.align 32 ALIGN(32)
.l2: .l2:
(p[0]) ld8.s r[0] = [asrc], 8 // r[0] = w1 (p[0]) ld8.s r[0] = [asrc], 8 // r[0] = w1
(p[MEMLAT]) shr.u tmp1[0] = r[1 + MEMLAT], sh1 // tmp1 = w0 >> sh1 (p[MEMLAT]) shr.u tmp1[0] = r[1 + MEMLAT], sh1 // tmp1 = w0 >> sh1

View File

@@ -103,14 +103,22 @@
#define the_z z #define the_z z
#endif #endif
#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
/* Manually force proper loop-alignment. Note: be sure to
double-check the code-layout after making any changes to
this routine! */
# define ALIGN(n) { nop 0 }
#else
# define ALIGN(n) .align n
#endif
#if defined(USE_LFETCH) #if defined(USE_LFETCH)
#define LOOP(shift) \ #define LOOP(shift) \
.align 32 ; \ ALIGN(32); \
.loop##shift##: \ .loop##shift##: \
{ .mmb \ { .mmb \
(p[0]) ld8.nt1 r[0] = [asrc], 8 ; \ (p[0]) ld8.nt1 r[0] = [asrc], 8 ; \
(p[0]) lfetch.nt1 [ptr1], 16 ; \ (p[0]) lfetch.nt1 [ptr1], 16 ; \
nop.b 0 ; \ nop.b 0 ; \
} { .mib \ } { .mib \
(p[MEMLAT+1]) st8 [dest] = tmp3, 8 ; \ (p[MEMLAT+1]) st8 [dest] = tmp3, 8 ; \
@@ -118,7 +126,7 @@
nop.b 0 ;; \ nop.b 0 ;; \
} { .mmb \ } { .mmb \
(p[0]) ld8.nt1 s[0] = [asrc], 8 ; \ (p[0]) ld8.nt1 s[0] = [asrc], 8 ; \
(p[0]) lfetch.nt1 [ptr2], 16 ; \ (p[0]) lfetch.nt1 [ptr2], 16 ; \
nop.b 0 ; \ nop.b 0 ; \
} { .mib \ } { .mib \
(p[MEMLAT+1]) st8 [dest] = tmp4, 8 ; \ (p[MEMLAT+1]) st8 [dest] = tmp4, 8 ; \
@@ -130,7 +138,7 @@
} }
#else #else
#define LOOP(shift) \ #define LOOP(shift) \
.align 32 ; \ ALIGN(32); \
.loop##shift##: \ .loop##shift##: \
{ .mmb \ { .mmb \
(p[0]) ld8.nt1 r[0] = [asrc], 8 ; \ (p[0]) ld8.nt1 r[0] = [asrc], 8 ; \
@@ -254,7 +262,11 @@ ENTRY(memcpy)
movi0 ar.lc = loopcnt // set the loop counter movi0 ar.lc = loopcnt // set the loop counter
;; } ;; }
#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
{ nop 0 }
#else
.align 32 .align 32
#endif
#if defined(USE_FLP) #if defined(USE_FLP)
.l1: // ------------------------------- // L1: Everything a multiple of 8 .l1: // ------------------------------- // L1: Everything a multiple of 8
{ .mmi { .mmi

View File

@@ -56,12 +56,18 @@
#define loopcnt r30 #define loopcnt r30
#define value r31 #define value r31
#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
# define ALIGN(n) { nop 0 }
#else
# define ALIGN(n) .align n
#endif
#define LOOP(shift) \ #define LOOP(shift) \
.align 32 ; \ ALIGN(32); \
.loop##shift##: \ .loop##shift##: \
(p[0]) ld8 r[0] = [asrc], 8 ; /* w1 */ \ (p[0]) ld8 r[0] = [asrc], 8 ; /* w1 */ \
(p[MEMLAT+1]) st8 [dest] = value, 8 ; \ (p[MEMLAT+1]) st8 [dest] = value, 8 ; \
(p[MEMLAT]) shrp value = r[MEMLAT], r[MEMLAT+1], shift ; \ (p[MEMLAT]) shrp value = r[MEMLAT], r[MEMLAT+1], shift ; \
nop.b 0 ; \ nop.b 0 ; \
nop.b 0 ; \ nop.b 0 ; \
br.ctop.sptk .loop##shift ; \ br.ctop.sptk .loop##shift ; \
@@ -228,6 +234,10 @@ ENTRY(memmove)
(p[MEMLAT]) st1 [dest] = r[MEMLAT], -1 (p[MEMLAT]) st1 [dest] = r[MEMLAT], -1
br.ctop.dptk .l6 br.ctop.dptk .l6
br.cond.sptk .restore_and_exit br.cond.sptk .restore_and_exit
END(memmove)
.rodata
.align 8
.table: .table:
data8 0 // dummy entry data8 0 // dummy entry
data8 .loop56 - .loop8 data8 .loop56 - .loop8
@@ -238,5 +248,4 @@ ENTRY(memmove)
data8 .loop56 - .loop48 data8 .loop56 - .loop48
data8 .loop56 - .loop56 data8 .loop56 - .loop56
END(memmove)
libc_hidden_builtin_def (memmove) libc_hidden_builtin_def (memmove)

View File

@@ -153,7 +153,9 @@ ENTRY(memset)
(p_zr) br.cond.dptk.many .l1b // Jump to use stf.spill (p_zr) br.cond.dptk.many .l1b // Jump to use stf.spill
;; } ;; }
#ifndef GAS_ALIGN_BREAKS_UNWIND_INFO
.align 32 // -------- // L1A: store ahead into cache lines; fill later .align 32 // -------- // L1A: store ahead into cache lines; fill later
#endif
{ .mmi { .mmi
and tmp = -(LINE_SIZE), cnt // compute end of range and tmp = -(LINE_SIZE), cnt // compute end of range
mov ptr9 = ptr1 // used for prefetching mov ptr9 = ptr1 // used for prefetching
@@ -222,7 +224,11 @@ ENTRY(memset)
br.cond.dpnt.many .move_bytes_from_alignment // Branch no. 3 br.cond.dpnt.many .move_bytes_from_alignment // Branch no. 3
;; } ;; }
#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
{ nop 0 }
#else
.align 32 .align 32
#endif
.l1b: // ------------------ // L1B: store ahead into cache lines; fill later .l1b: // ------------------ // L1B: store ahead into cache lines; fill later
{ .mmi { .mmi
and tmp = -(LINE_SIZE), cnt // compute end of range and tmp = -(LINE_SIZE), cnt // compute end of range
@@ -283,13 +289,15 @@ ENTRY(memset)
{ .mib { .mib
cmp.eq p_scr, p0 = loopcnt, r0 cmp.eq p_scr, p0 = loopcnt, r0
add loopcnt = -1, loopcnt add loopcnt = -1, loopcnt
(p_scr) br.cond.dpnt.many .store_words (p_scr) br.cond.dpnt.many store_words
;; } ;; }
{ .mib { .mib
and cnt = 0x1f, cnt // compute the remaining cnt and cnt = 0x1f, cnt // compute the remaining cnt
movi0 ar.lc = loopcnt movi0 ar.lc = loopcnt
;; } ;; }
#ifndef GAS_ALIGN_BREAKS_UNWIND_INFO
.align 32 .align 32
#endif
.l2: // ---------------------------- // L2A: store 32B in 2 cycles .l2: // ---------------------------- // L2A: store 32B in 2 cycles
{ .mmb { .mmb
store [ptr1] = myval, 8 store [ptr1] = myval, 8
@@ -299,7 +307,7 @@ ENTRY(memset)
store [ptr2] = myval, 24 store [ptr2] = myval, 24
br.cloop.dptk.many .l2 br.cloop.dptk.many .l2
;; } ;; }
.store_words: store_words:
{ .mib { .mib
cmp.gt p_scr, p0 = 8, cnt // just a few bytes left ? cmp.gt p_scr, p0 = 8, cnt // just a few bytes left ?
(p_scr) br.cond.dpnt.many .move_bytes_from_alignment // Branch (p_scr) br.cond.dpnt.many .move_bytes_from_alignment // Branch

View File

@@ -22,15 +22,14 @@
#include <sysdep.h> #include <sysdep.h>
ENTRY(__pipe) ENTRY(__pipe)
st8 [sp]=r32 // save ptr across system call .regstk 1,0,0,0
DO_CALL (SYS_ify (pipe)) DO_CALL (SYS_ify (pipe))
ld8 r2=[sp]
cmp.ne p6,p0=-1,r10 cmp.ne p6,p0=-1,r10
;; ;;
(p6) st4 [r2]=r8,4 (p6) st4 [in0]=r8,4
(p6) mov ret0=0 (p6) mov ret0=0
;; ;;
(p6) st4 [r2]=r9 (p6) st4 [in0]=r9
(p6) ret (p6) ret
br.cond.spnt.few __syscall_error br.cond.spnt.few __syscall_error
PSEUDO_END(__pipe) PSEUDO_END(__pipe)

View File

@@ -24,6 +24,13 @@
#include <sysdeps/unix/sysdep.h> #include <sysdeps/unix/sysdep.h>
#include <sysdeps/ia64/sysdep.h> #include <sysdeps/ia64/sysdep.h>
/* As of GAS v2.4.90.0.7, including a ".align" directive inside a
function will cause bad unwind info to be emitted (GAS doesn't know
how to account for the padding introduced by the .align directive).
Turning on this macro will work around this bug by introducing the
necessary padding explicitly. */
#define GAS_ALIGN_BREAKS_UNWIND_INFO
/* For Linux we can use the system call table in the header file /* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h /usr/include/asm/unistd.h
of the kernel. But these symbols do not follow the SYS_* syntax of the kernel. But these symbols do not follow the SYS_* syntax