2001-04-11  David Mosberger  <davidm@hpl.hp.com>

	* sysdeps/ia64/htonl.S: Drop superfluous "alloc".
	* sysdeps/ia64/htons.S: Likewise.

	* sysdeps/ia64/memset.S: Add unwind directives.
	* sysdeps/ia64/strncpy.S: Likewise.
	* sysdeps/ia64/strcat.S: Likewise.

	* sysdeps/ia64/memccpy.S: Add unwind directives.  Drop superfluous
	restore of ar.pfs.
	* sysdeps/ia64/strchr.S: Likewise.
	* sysdeps/ia64/memmove.S: Likewise.
	* sysdeps/ia64/memcpy.S: Likewise.
	* sysdeps/ia64/memcmp.S: Likewise.
	* sysdeps/ia64/memchr.S: Likewise.
	* sysdeps/ia64/strcmp.S: Likewise.
	* sysdeps/ia64/strlen.S: Likewise.
	* sysdeps/ia64/strcpy.S: Likewise.
	* sysdeps/ia64/strncmp.S: Likewise.
This commit is contained in:
Ulrich Drepper 2001-04-11 19:57:49 +00:00
parent 87d5c92d11
commit 8ee3551551
16 changed files with 95 additions and 64 deletions

View File

@ -1,3 +1,24 @@
2001-04-11 David Mosberger <davidm@hpl.hp.com>
* sysdeps/ia64/htonl.S: Drop superfluous "alloc".
* sysdeps/ia64/htons.S: Likewise.
* sysdeps/ia64/memset.S: Add unwind directives.
* sysdeps/ia64/strncpy.S: Likewise.
* sysdeps/ia64/strcat.S: Likewise.
* sysdeps/ia64/memccpy.S: Add unwind directives. Drop superfluous
restore of ar.pfs.
* sysdeps/ia64/strchr.S: Likewise.
* sysdeps/ia64/memmove.S: Likewise.
* sysdeps/ia64/memcpy.S: Likewise.
* sysdeps/ia64/memcmp.S: Likewise.
* sysdeps/ia64/memchr.S: Likewise.
* sysdeps/ia64/strcmp.S: Likewise.
* sysdeps/ia64/strlen.S: Likewise.
* sysdeps/ia64/strcpy.S: Likewise.
* sysdeps/ia64/strncmp.S: Likewise.
2001-04-11 Jakub Jelinek <jakub@redhat.com> 2001-04-11 Jakub Jelinek <jakub@redhat.com>
* wcsmbs/wchar.h (fgetwc, getwc, getwchar, fputwc, putwc, putwchar, * wcsmbs/wchar.h (fgetwc, getwc, getwchar, fputwc, putwc, putwchar,

View File

@ -1,5 +1,5 @@
/* Change byte order in 32-bit value. ia64 version. /* Change byte order in 32-bit value. ia64 version.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Dan Pop <Dan.Pop@cern.ch> Contributed by Dan Pop <Dan.Pop@cern.ch>
@ -20,14 +20,12 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret
ENTRY(htonl) ENTRY(htonl)
alloc ret0 = ar.pfs, 1, 0, 0, 0 shl ret0 = r32, 32
shl in0 = in0, 32
;; ;;
mux1 ret0 = in0, @rev mux1 ret0 = ret0, @rev
br.ret.sptk.many b0 ret
END(htonl) END(htonl)
weak_alias (htonl, ntohl) weak_alias (htonl, ntohl)

View File

@ -1,5 +1,5 @@
/* Change byte order in 16-bit value. ia64 version. /* Change byte order in 16-bit value. ia64 version.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Dan Pop <Dan.Pop@cern.ch> Contributed by Dan Pop <Dan.Pop@cern.ch>
@ -20,14 +20,12 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret
ENTRY(htons) ENTRY(htons)
alloc ret0 = ar.pfs, 1, 0, 0, 0 shl ret0 = r32, 48
shl in0 = in0, 48
;; ;;
mux1 ret0 = in0, @rev mux1 ret0 = ret0, @rev
br.ret.sptk.many b0 ret
END(htons) END(htons)
weak_alias (htons, ntohs) weak_alias (htons, ntohs)

View File

@ -1,6 +1,6 @@
/* Optimized version of the memccpy() function. /* Optimized version of the memccpy() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -37,7 +37,6 @@
#define OP_T_THRES 16 #define OP_T_THRES 16
#define OPSIZ 8 #define OPSIZ 8
#define saved_pfs r14
#define saved_pr r17 #define saved_pr r17
#define saved_lc r18 #define saved_lc r18
#define dest r19 #define dest r19
@ -53,15 +52,19 @@
#define value r31 #define value r31
ENTRY(memccpy) ENTRY(memccpy)
alloc saved_pfs = ar.pfs, 4, 40 - 4, 0, 40 .prologue
alloc r2 = ar.pfs, 4, 40 - 4, 0, 40
#include "softpipe.h" #include "softpipe.h"
.rotr r[MEMLAT + 3], tmp1[4], tmp2[4], val[4], tmp3[2], pos0[2] .rotr r[MEMLAT + 3], tmp1[4], tmp2[4], val[4], tmp3[2], pos0[2]
.rotp p[MEMLAT + 6 + 1] .rotp p[MEMLAT + 6 + 1]
mov ret0 = r0 // return NULL if no match mov ret0 = r0 // return NULL if no match
.save pr, saved_pr
mov saved_pr = pr // save the predicate registers mov saved_pr = pr // save the predicate registers
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
mov dest = in0 // dest mov dest = in0 // dest
mov src = in1 // src mov src = in1 // src
extr.u char = in2, 0, 8 // char extr.u char = in2, 0, 8 // char
@ -143,7 +146,6 @@ ENTRY(memccpy)
.foundit: .foundit:
(p6) mov ret0 = dest (p6) mov ret0 = dest
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
@ -158,7 +160,6 @@ ENTRY(memccpy)
shr.u value = value, 8 shr.u value = value, 8
br.cloop.sptk .l5 ;; br.cloop.sptk .l5 ;;
mov ret0 = dest mov ret0 = dest
mov ar.pfs = saved_pfs
mov pr = saved_pr, -1 mov pr = saved_pr, -1
mov ar.lc = saved_lc mov ar.lc = saved_lc
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard memchr() function. /* Optimized version of the standard memchr() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -43,7 +43,6 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret #undef ret
#define saved_pfs r14
#define saved_pr r15 #define saved_pr r15
#define saved_lc r16 #define saved_lc r16
#define chr r17 #define chr r17
@ -57,12 +56,16 @@
#define str in0 #define str in0
ENTRY(__memchr) ENTRY(__memchr)
alloc saved_pfs = ar.pfs, 3, 0, 29, 32 .prologue
alloc r2 = ar.pfs, 3, 0, 29, 32
#include "softpipe.h" #include "softpipe.h"
.rotr value[MEMLAT+1], addr[MEMLAT+3], aux[2], poschr[2] .rotr value[MEMLAT+1], addr[MEMLAT+3], aux[2], poschr[2]
.rotp p[MEMLAT+3] .rotp p[MEMLAT+3]
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.save pr, saved_pr
mov saved_pr = pr // save the predicates mov saved_pr = pr // save the predicates
.body
mov ret0 = str mov ret0 = str
and tmp = 7, str // tmp = str % 8 and tmp = 7, str // tmp = str % 8
cmp.ne p7, p0 = r0, r0 // clear p7 cmp.ne p7, p0 = r0, r0 // clear p7
@ -118,7 +121,6 @@ ENTRY(__memchr)
(p6) adds ret0 = -1, ret0 // if we got here from l1 or l3 (p6) adds ret0 = -1, ret0 // if we got here from l1 or l3
(p7) add ret0 = addr[MEMLAT+2], poschr[1] // if we got here from l2 (p7) add ret0 = addr[MEMLAT+2], poschr[1] // if we got here from l2
mov pr = saved_pr, -1 mov pr = saved_pr, -1
mov ar.pfs = saved_pfs
mov ar.lc = saved_lc mov ar.lc = saved_lc
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard memcmp() function. /* Optimized version of the standard memcmp() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -40,7 +40,6 @@
#define OPSIZ 8 #define OPSIZ 8
#define MEMLAT 2 #define MEMLAT 2
#define saved_pfs r14
#define start r15 #define start r15
#define saved_pr r17 #define saved_pr r17
#define saved_lc r18 #define saved_lc r18
@ -56,14 +55,18 @@
#define loopcnt r30 #define loopcnt r30
ENTRY(memcmp) ENTRY(memcmp)
alloc saved_pfs = ar.pfs, 3, 37, 0, 40 .prologue
alloc r2 = ar.pfs, 3, 37, 0, 40
.rotr r[MEMLAT + 2], q[MEMLAT + 5], tmp1[4], tmp2[4], val[2] .rotr r[MEMLAT + 2], q[MEMLAT + 5], tmp1[4], tmp2[4], val[2]
.rotp p[MEMLAT + 4 + 1] .rotp p[MEMLAT + 4 + 1]
mov ret0 = r0 // by default return value = 0 mov ret0 = r0 // by default return value = 0
.save pr, saved_pr
mov saved_pr = pr // save the predicate registers mov saved_pr = pr // save the predicate registers
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
mov dest = in0 // dest mov dest = in0 // dest
mov src = in1 // src mov src = in1 // src
mov len = in2 // len mov len = in2 // len
@ -126,7 +129,6 @@ ENTRY(memcmp)
cmp.ltu p6, p7 = value2, value1 ;; cmp.ltu p6, p7 = value2, value1 ;;
(p6) mov ret0 = -1 (p6) mov ret0 = -1
(p7) mov ret0 = 1 (p7) mov ret0 = 1
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
@ -154,7 +156,6 @@ ENTRY(memcmp)
.done: .done:
(p6) sub ret0 = value2, value1 // don't execute it if falling thru (p6) sub ret0 = value2, value1 // don't execute it if falling thru
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard memcpy() function. /* Optimized version of the standard memcpy() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -40,7 +40,6 @@
#define OP_T_THRES 16 #define OP_T_THRES 16
#define OPSIZ 8 #define OPSIZ 8
#define saved_pfs r14
#define adest r15 #define adest r15
#define saved_pr r17 #define saved_pr r17
#define saved_lc r18 #define saved_lc r18
@ -70,13 +69,17 @@
br.cond.sptk .cpyfew ; /* deal with the remaining bytes */ br.cond.sptk .cpyfew ; /* deal with the remaining bytes */
ENTRY(memcpy) ENTRY(memcpy)
alloc saved_pfs = ar.pfs, 3, 16 - 3, 0, 16 .prologue
alloc r2 = ar.pfs, 3, 16 - 3, 0, 16
#include "softpipe.h" #include "softpipe.h"
.rotr r[MEMLAT + 2], q[MEMLAT + 1] .rotr r[MEMLAT + 2], q[MEMLAT + 1]
.rotp p[MEMLAT + 2] .rotp p[MEMLAT + 2]
mov ret0 = in0 // return value = dest mov ret0 = in0 // return value = dest
.save pr, saved_pr
mov saved_pr = pr // save the predicate registers mov saved_pr = pr // save the predicate registers
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
or tmp3 = in0, in1 ;; // tmp3 = dest | src or tmp3 = in0, in1 ;; // tmp3 = dest | src
or tmp3 = tmp3, in2 // tmp3 = dest | src | len or tmp3 = tmp3, in2 // tmp3 = dest | src | len
mov dest = in0 // dest mov dest = in0 // dest
@ -112,7 +115,6 @@ ENTRY(memcpy)
(p[MEMLAT]) st8 [adest] = q[MEMLAT], 16 (p[MEMLAT]) st8 [adest] = q[MEMLAT], 16
br.ctop.dptk .l0 ;; br.ctop.dptk .l0 ;;
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
@ -182,7 +184,6 @@ ENTRY(memcpy)
st1 [dest] = value, 1 st1 [dest] = value, 1
br.cloop.dptk .l4 ;; br.cloop.dptk .l4 ;;
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard memmove() function. /* Optimized version of the standard memmove() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -39,7 +39,6 @@
#define OP_T_THRES 16 #define OP_T_THRES 16
#define OPSIZ 8 #define OPSIZ 8
#define saved_pfs r14
#define adest r15 #define adest r15
#define saved_pr r17 #define saved_pr r17
#define saved_lc r18 #define saved_lc r18
@ -69,13 +68,17 @@
br.cond.sptk .cpyfew ; /* deal with the remaining bytes */ br.cond.sptk .cpyfew ; /* deal with the remaining bytes */
ENTRY(memmove) ENTRY(memmove)
alloc saved_pfs = ar.pfs, 3, 29, 0, 32 .prologue
alloc r2 = ar.pfs, 3, 29, 0, 32
#include "softpipe.h" #include "softpipe.h"
.rotr r[MEMLAT + 2], q[MEMLAT + 1] .rotr r[MEMLAT + 2], q[MEMLAT + 1]
.rotp p[MEMLAT + 2] .rotp p[MEMLAT + 2]
mov ret0 = in0 // return value = dest mov ret0 = in0 // return value = dest
.save pr, saved_pr
mov saved_pr = pr // save the predicate registers mov saved_pr = pr // save the predicate registers
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
or tmp3 = in0, in1 ;; // tmp3 = dest | src or tmp3 = in0, in1 ;; // tmp3 = dest | src
or tmp3 = tmp3, in2 // tmp3 = dest | src | len or tmp3 = tmp3, in2 // tmp3 = dest | src | len
mov dest = in0 // dest mov dest = in0 // dest
@ -119,7 +122,6 @@ ENTRY(memmove)
(p[MEMLAT]) st8 [adest] = q[MEMLAT], 16 (p[MEMLAT]) st8 [adest] = q[MEMLAT], 16
br.ctop.dptk .l0 ;; br.ctop.dptk .l0 ;;
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
@ -189,7 +191,6 @@ ENTRY(memmove)
st1 [dest] = value, 1 st1 [dest] = value, 1
br.cloop.dptk .l4 ;; br.cloop.dptk .l4 ;;
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard memset() function. /* Optimized version of the standard memset() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -45,8 +45,11 @@
#define wordval loc6 #define wordval loc6
ENTRY(memset) ENTRY(memset)
.prologue
alloc save_pfs = ar.pfs, 3, 7, 0, 0 alloc save_pfs = ar.pfs, 3, 7, 0, 0
.save ar.lc, save_lc
mov save_lc = ar.lc mov save_lc = ar.lc
.body
mov ret0 = dest mov ret0 = dest
and tmp = 7, dest and tmp = 7, dest
cmp.eq p6, p0 = cnt, r0 cmp.eq p6, p0 = cnt, r0

View File

@ -1,6 +1,6 @@
/* IA-64 assembly version of the standard strcat() function. /* IA-64 assembly version of the standard strcat() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -37,14 +37,16 @@
#define src in1 #define src in1
#define dest in0 #define dest in0
#define save_pfs loc0 #define save_b0 loc0
#define save_b0 loc1 #define save_pfs loc1
#define tmp loc2 #define tmp loc2
#define rc ret0 #define rc ret0
ENTRY(strcat) ENTRY(strcat)
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
alloc save_pfs = ar.pfs, 2, 3, 2, 0 alloc save_pfs = ar.pfs, 2, 3, 2, 0
mov save_b0 = b0 mov save_b0 = b0
.body
mov out0 = dest mov out0 = dest
mov tmp = gp ;; mov tmp = gp ;;
br.call.sptk.many b0 = strlen# ;; // rc = strlen(dest); br.call.sptk.many b0 = strlen# ;; // rc = strlen(dest);

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strchr() function. /* Optimized version of the standard strchr() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,7 +33,6 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret #undef ret
#define saved_pfs r14
#define saved_lc r18 #define saved_lc r18
#define poschr r19 #define poschr r19
#define pos0 r20 #define pos0 r20
@ -47,8 +46,11 @@
#define chr in1 #define chr in1
ENTRY(strchr) ENTRY(strchr)
alloc saved_pfs = ar.pfs, 2, 0, 0, 0 .prologue
alloc r2 = ar.pfs, 2, 0, 0, 0
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
mov ret0 = str mov ret0 = str
and tmp = 7, str // tmp = str % 8 and tmp = 7, str // tmp = str % 8
mux1 chrx8 = chr, @brcst mux1 chrx8 = chr, @brcst
@ -94,12 +96,10 @@ ENTRY(strchr)
adds ret0 = -15, ret0 ;; // should be -16, but we decrement adds ret0 = -15, ret0 ;; // should be -16, but we decrement
.restore_and_exit: // ret0 in the next instruction .restore_and_exit: // ret0 in the next instruction
adds ret0 = -1, ret0 // ret0 was pointing 1 char too far adds ret0 = -1, ret0 // ret0 was pointing 1 char too far
mov ar.pfs = saved_pfs // restore the PFS
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
.notfound: .notfound:
mov ret0 = r0 // return NULL if null was found mov ret0 = r0 // return NULL if null was found
mov ar.pfs = saved_pfs // first
mov ar.lc = saved_lc mov ar.lc = saved_lc
br.ret.sptk.many b0 br.ret.sptk.many b0
.recovery: .recovery:

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strcmp() function. /* Optimized version of the standard strcmp() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,13 +33,12 @@
#define s1 in0 #define s1 in0
#define s2 in1 #define s2 in1
#define saved_pfs r14
#define val1 r15 #define val1 r15
#define val2 r16 #define val2 r16
ENTRY(strcmp) ENTRY(strcmp)
alloc saved_pfs = ar.pfs, 2, 0, 0, 0 alloc r2 = ar.pfs, 2, 0, 0, 0
.loop: .loop:
ld1 val1 = [s1], 1 ld1 val1 = [s1], 1
ld1 val2 = [s2], 1 ld1 val2 = [s2], 1
@ -50,6 +49,5 @@ ENTRY(strcmp)
cmp.eq.and p6, p0 = val1, val2 cmp.eq.and p6, p0 = val1, val2
(p6) br.cond.sptk .loop (p6) br.cond.sptk .loop
sub ret0 = val1, val2 sub ret0 = val1, val2
mov ar.pfs = saved_pfs
br.ret.sptk.many b0 br.ret.sptk.many b0
END(strcmp) END(strcmp)

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strcpy() function. /* Optimized version of the standard strcpy() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -34,7 +34,6 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret #undef ret
#define saved_pfs r14
#define saved_lc r15 #define saved_lc r15
#define saved_pr r16 #define saved_pr r16
#define thresh r17 #define thresh r17
@ -53,15 +52,19 @@
#define value r31 #define value r31
ENTRY(strcpy) ENTRY(strcpy)
alloc saved_pfs = ar.pfs, 2, 0, 30, 32 .prologue
alloc r2 = ar.pfs, 2, 0, 30, 32
#define MEMLAT 2 #define MEMLAT 2
.rotr r[MEMLAT + 2] .rotr r[MEMLAT + 2]
.rotp p[MEMLAT + 1] .rotp p[MEMLAT + 1]
mov ret0 = in0 // return value = dest mov ret0 = in0 // return value = dest
.save pr, saved_pr
mov saved_pr = pr // save the predicate registers mov saved_pr = pr // save the predicate registers
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
sub tmp = r0, in0 ;; // tmp = -dest sub tmp = r0, in0 ;; // tmp = -dest
mov dest = in0 // dest mov dest = in0 // dest
mov src = in1 // src mov src = in1 // src
@ -127,7 +130,6 @@ ENTRY(strcpy)
st1 [dest] = c, 1 st1 [dest] = c, 1
br.cloop.dptk .l4 ;; br.cloop.dptk .l4 ;;
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
mov pr = saved_pr, -1 // restore the predicate registers mov pr = saved_pr, -1 // restore the predicate registers
br.ret.sptk.many b0 br.ret.sptk.many b0

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strlen() function. /* Optimized version of the standard strlen() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -36,7 +36,6 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret #undef ret
#define saved_pfs r14
#define saved_lc r18 #define saved_lc r18
#define str r19 #define str r19
#define pos0 r20 #define pos0 r20
@ -48,8 +47,11 @@
#define len ret0 #define len ret0
ENTRY(strlen) ENTRY(strlen)
alloc saved_pfs = ar.pfs, 1, 0, 0, 0 .prologue
alloc r2 = ar.pfs, 1, 0, 0, 0
.save ar.lc, saved_lc
mov saved_lc = ar.lc // save the loop counter mov saved_lc = ar.lc // save the loop counter
.body
mov str = in0 mov str = in0
mov len = r0 // len = 0 mov len = r0 // len = 0
and tmp = 7, in0 // tmp = str % 8 and tmp = 7, in0 // tmp = str % 8
@ -86,7 +88,6 @@ l2: ld8.s val2 = [str], 8 // don't bomb out here
add len = len, tmp;; add len = len, tmp;;
adds len = -16, len adds len = -16, len
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs // restore the PFS
mov ar.lc = saved_lc // restore the loop counter mov ar.lc = saved_lc // restore the loop counter
br.ret.sptk.many b0 br.ret.sptk.many b0
.recovery: .recovery:

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strncmp() function. /* Optimized version of the standard strncmp() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -35,13 +35,12 @@
#define s2 in1 #define s2 in1
#define n in2 #define n in2
#define saved_pfs r14
#define val1 r15 #define val1 r15
#define val2 r16 #define val2 r16
ENTRY(strncmp) ENTRY(strncmp)
alloc saved_pfs = ar.pfs, 3, 0, 0, 0 alloc r2 = ar.pfs, 3, 0, 0, 0
mov ret0 = r0 mov ret0 = r0
cmp.eq p6, p0 = r0, r0 // set p6 cmp.eq p6, p0 = r0, r0 // set p6
cmp.eq p7, p0 = n, r0 // return immediately if n == 0 cmp.eq p7, p0 = n, r0 // return immediately if n == 0
@ -58,6 +57,5 @@ ENTRY(strncmp)
(p6) br.cond.sptk .loop (p6) br.cond.sptk .loop
sub ret0 = val1, val2 sub ret0 = val1, val2
.restore_and_exit: .restore_and_exit:
mov ar.pfs = saved_pfs
br.ret.sptk.many b0 br.ret.sptk.many b0
END(strncmp) END(strncmp)

View File

@ -1,6 +1,6 @@
/* Optimized version of the standard strncpy() function. /* Optimized version of the standard strncpy() function.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Dan Pop <Dan.Pop@cern.ch>. Contributed by Dan Pop <Dan.Pop@cern.ch>.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,8 +33,8 @@
#include <sysdep.h> #include <sysdep.h>
#undef ret #undef ret
#define saved_pfs loc0 #define saved_b0 loc0
#define saved_b0 loc1 #define saved_pfs loc1
#define saved_pr loc2 #define saved_pr loc2
#define saved_lc loc3 #define saved_lc loc3
#define tmp loc4 #define tmp loc4
@ -47,10 +47,14 @@
#define rc ret0 #define rc ret0
ENTRY(strncpy) ENTRY(strncpy)
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3)
alloc saved_pfs = ar.pfs, 3, 6, 3, 0 alloc saved_pfs = ar.pfs, 3, 6, 3, 0
mov saved_b0 = b0 mov saved_b0 = b0
.save pr, saved_pr
mov saved_pr = pr mov saved_pr = pr
.save ar.lc, saved_lc
mov saved_lc = ar.lc mov saved_lc = ar.lc
.body
cmp.gtu p6, p0 = 24, n cmp.gtu p6, p0 = 24, n
(p6) br.cond.spnt .cpyfew (p6) br.cond.spnt .cpyfew
mov out0 = src mov out0 = src