diff options
author | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2009-05-22 20:28:34 +0000 |
---|---|---|
committer | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2009-05-22 20:28:34 +0000 |
commit | 6b946eeb50a57ee4ff8c50783d516bb03cf89b7a (patch) | |
tree | 19d7e79d38b73083f6786b448e2c148e04533b9a /libc/sysdeps/ia64/memchr.S | |
parent | 8394b52f4259c85b39e1114e6f239599f50fbcc2 (diff) |
Merge changes between r8463 and r8486 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@8487 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'libc/sysdeps/ia64/memchr.S')
-rw-r--r-- | libc/sysdeps/ia64/memchr.S | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libc/sysdeps/ia64/memchr.S b/libc/sysdeps/ia64/memchr.S index e9a7ba823..cd062b2dd 100644 --- a/libc/sysdeps/ia64/memchr.S +++ b/libc/sysdeps/ia64/memchr.S @@ -96,7 +96,8 @@ ENTRY(__memchr) mov pr.rot = 1 << 16 ;; .l2: (p[0]) mov addr[0] = ret0 -(p[0]) ld8 value[0] = [ret0], 8 +(p[0]) ld8.s value[0] = [ret0], 8 // speculative load +(p[MEMLAT]) chk.s value[MEMLAT], .recovery // check and recovery (p[MEMLAT]) xor aux[0] = value[MEMLAT], chrx8 (p[MEMLAT+1]) czx1.r poschr[0] = aux[1] (p[MEMLAT+2]) cmp.ne p7, p0 = 8, poschr[1] @@ -124,6 +125,20 @@ ENTRY(__memchr) mov ar.lc = saved_lc br.ret.sptk.many b0 +.recovery: + adds ret0 = -((MEMLAT + 1) * 8), ret0;; +(p[MEMLAT+1]) add ret0 = -8, ret0;; +(p[MEMLAT+2]) add ret0 = -8, ret0;; +.l4: + mov addr[MEMLAT+2] = ret0 + ld8 tmp = [ret0];; // load the first unchecked 8byte + xor aux[1] = tmp, chrx8;; + czx1.r poschr[1] = aux[1];; + cmp.ne p7, p0 = 8, poschr[1] +(p7) br.cond.spnt .foundit;; + adds ret0 = 8, ret0 // load the next unchecked 8byte + br.sptk .l4;; + END(__memchr) weak_alias (__memchr, memchr) |