1/* Optimized memcmp implementation for PowerPC476. 2 Copyright (C) 2010-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19#include <sysdep.h> 20 21/* memcmp 22 23 r3:source1 address, return equality 24 r4:source2 address 25 r5:byte count 26 27 Check 2 words from src1 and src2. If unequal jump to end and 28 return src1 > src2 or src1 < src2. 29 If count = zero check bytes before zero counter and then jump to end and 30 return src1 > src2, src1 < src2 or src1 = src2. 31 If src1 = src2 and no null, repeat. */ 32 33EALIGN (memcmp, 5, 0) 34 srwi. r6,r5,5 35 beq L(preword2_count_loop) 36 mtctr r6 37 clrlwi r5,r5,27 38 39L(word8_compare_loop): 40 lwz r10,0(r3) 41 lwz r6,4(r3) 42 lwz r8,0(r4) 43 lwz r9,4(r4) 44 cmplw cr5,r8,r10 45 cmplw cr1,r9,r6 46 bne cr5,L(st2) 47 bne cr1,L(st1) 48 lwz r10,8(r3) 49 lwz r6,12(r3) 50 lwz r8,8(r4) 51 lwz r9,12(r4) 52 cmplw cr5,r8,r10 53 cmplw cr1,r9,r6 54 bne cr5,L(st2) 55 bne cr1,L(st1) 56 lwz r10,16(r3) 57 lwz r6,20(r3) 58 lwz r8,16(r4) 59 lwz r9,20(r4) 60 cmplw cr5,r8,r10 61 cmplw cr1,r9,r6 62 bne cr5,L(st2) 63 bne cr1,L(st1) 64 lwz r10,24(r3) 65 lwz r6,28(r3) 66 addi r3,r3,0x20 67 lwz r8,24(r4) 68 lwz r9,28(r4) 69 addi r4,r4,0x20 70 cmplw cr5,r8,r10 71 cmplw cr1,r9,r6 72 bne cr5,L(st2) 73 bne cr1,L(st1) 74 bdnz L(word8_compare_loop) 75 76L(preword2_count_loop): 77 srwi. r6,r5,3 78 beq L(prebyte_count_loop) 79 mtctr r6 80 clrlwi r5,r5,29 81 82L(word2_count_loop): 83 lwz r10,0(r3) 84 lwz r6,4(r3) 85 addi r3,r3,0x08 86 lwz r8,0(r4) 87 lwz r9,4(r4) 88 addi r4,r4,0x08 89 cmplw cr5,r8,r10 90 cmplw cr1,r9,r6 91 bne cr5,L(st2) 92 bne cr1,L(st1) 93 bdnz L(word2_count_loop) 94 95L(prebyte_count_loop): 96 addi r5,r5,1 97 mtctr r5 98 bdz L(end_memcmp) 99 100L(byte_count_loop): 101 lbz r6,0(r3) 102 addi r3,r3,0x01 103 lbz r8,0(r4) 104 addi r4,r4,0x01 105 cmplw cr5,r8,r6 106 bne cr5,L(st2) 107 bdnz L(byte_count_loop) 108 109L(end_memcmp): 110 addi r3,r0,0 111 blr 112 113L(l_r): 114 addi r3,r0,1 115 blr 116 117L(st1): 118 blt cr1,L(l_r) 119 addi r3,r0,-1 120 blr 121 122L(st2): 123 blt cr5,L(l_r) 124 addi r3,r0,-1 125 blr 126END (memcmp) 127libc_hidden_builtin_def (memcmp) 128weak_alias (memcmp,bcmp) 129strong_alias (memcmp, __memcmpeq) 130libc_hidden_def (__memcmpeq) 131