| /* |
| * Copyright (C) 2004-2007 Atmel Corporation |
| * |
| * This file is subject to the terms and conditions of the GNU Lesser General |
| * Public License. See the file "COPYING.LIB" in the main directory of this |
| * archive for more details. |
| */ |
| |
| #include <features.h> |
| |
| #define s1 r12 |
| #define s2 r11 |
| #define len r10 |
| |
| .text |
| .global strcmp |
| .type strcmp, @function |
| .align 1 |
| strcmp: |
| mov r8, 3 |
| tst s1, r8 |
| brne .Lunaligned_s1 |
| tst s2, r8 |
| brne .Lunaligned_s2 |
| |
| 1: ld.w r8, s1++ |
| ld.w r9, s2++ |
| cp.w r8, r9 |
| brne 2f |
| tnbz r8 |
| brne 1b |
| retal 0 |
| |
| 2: bfextu r12, r8, 24, 8 |
| bfextu r11, r9, 24, 8 |
| sub r12, r11 |
| retne r12 |
| cp.w r11, 0 |
| reteq 0 |
| bfextu r12, r8, 16, 8 |
| bfextu r11, r9, 16, 8 |
| sub r12, r11 |
| retne r12 |
| cp.w r11, 0 |
| reteq 0 |
| bfextu r12, r8, 8, 8 |
| bfextu r11, r9, 8, 8 |
| sub r12, r11 |
| retne r12 |
| cp.w r11, 0 |
| reteq 0 |
| bfextu r12, r8, 0, 8 |
| bfextu r11, r9, 0, 8 |
| sub r12, r11 |
| retal r12 |
| |
| .Lunaligned_s1: |
| 3: tst s1, r8 |
| breq 4f |
| ld.ub r10, s1++ |
| ld.ub r9, s2++ |
| sub r10, r9 |
| retne r10 |
| cp.w r9, 0 |
| brne 3b |
| retal r10 |
| |
| 4: tst s2, r8 |
| breq 1b |
| |
| .Lunaligned_s2: |
| /* |
| * s1 and s2 can't both be aligned, and unaligned word loads |
| * can trigger spurious exceptions if we cross a page boundary. |
| * Do it the slow way... |
| */ |
| 1: ld.ub r8, s1++ |
| ld.ub r9, s2++ |
| sub r8, r9 |
| retne r8 |
| cp.w r9, 0 |
| brne 1b |
| retal 0 |
| |
| .size strcmp, . - strcmp |
| |
| libc_hidden_def(strcmp) |
| #ifndef __UCLIBC_HAS_LOCALE__ |
| strong_alias(strcmp, strcoll) |
| libc_hidden_def(strcoll) |
| #endif |