1/* Optimized version of the standard strncmp() function. 2 This file is part of the GNU C Library. 3 Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. 4 Contributed by Dan Pop <Dan.Pop@cern.ch>. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <http://www.gnu.org/licenses/>. */ 19 20/* Return: the result of the comparison 21 22 Inputs: 23 in0: s1 24 in1: s2 25 in2: n 26 27 Unlike memcmp(), this function is optimized for mismatches within the 28 first few characters. */ 29 30#include <sysdep.h> 31#undef ret 32 33#define s1 in0 34#define s2 in1 35#define n in2 36 37#define val1 r15 38#define val2 r16 39 40 41ENTRY(strncmp) 42 alloc r2 = ar.pfs, 3, 0, 0, 0 43 mov ret0 = r0 44 cmp.eq p6, p0 = r0, r0 /* set p6 */ 45 cmp.eq p7, p0 = n, r0 /* return immediately if n == 0 */ 46(p7) br.cond.spnt .restore_and_exit ;; 47.loop: 48 ld1 val1 = [s1], 1 49 ld1 val2 = [s2], 1 50 adds n = -1, n /* n-- */ 51 ;; 52 cmp.ne.and p6, p0 = val1, r0 53 cmp.ne.and p6, p0 = val2, r0 54 cmp.ne.and p6, p0 = n, r0 55 cmp.eq.and p6, p0 = val1, val2 56(p6) br.cond.sptk .loop 57 sub ret0 = val1, val2 58.restore_and_exit: 59 br.ret.sptk.many b0 60END(strncmp) 61libc_hidden_weak (strncmp) 62