1/* The assembly function for string compare. C-SKY ABIV2 version. 2 Copyright (C) 2018-2021 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 21ENTRY (strcmp) 22 mov a3, a0 23 /* Check if the s1 addr is aligned. */ 24 xor a2, a3, a1 25 andi a2, 0x3 26 bnez a2, 7f 27 andi t1, a0, 0x3 28 bnez t1, 5f 29 301: 31 /* If aligned, load word each time. */ 32 ldw t0, (a3, 0) 33 ldw t1, (a1, 0) 34 /* If s1[i] != s2[i], goto 2f. */ 35 cmpne t0, t1 36 bt 2f 37 /* If s1[i] == s2[i], check if s1 or s2 is at the end. */ 38 tstnbz t0 39 /* If at the end, goto 3f (finish comparing). */ 40 bf 3f 41 42 ldw t0, (a3, 4) 43 ldw t1, (a1, 4) 44 cmpne t0, t1 45 bt 2f 46 tstnbz t0 47 bf 3f 48 49 ldw t0, (a3, 8) 50 ldw t1, (a1, 8) 51 cmpne t0, t1 52 bt 2f 53 tstnbz t0 54 bf 3f 55 56 ldw t0, (a3, 12) 57 ldw t1, (a1, 12) 58 cmpne t0, t1 59 bt 2f 60 tstnbz t0 61 bf 3f 62 63 ldw t0, (a3, 16) 64 ldw t1, (a1, 16) 65 cmpne t0, t1 66 bt 2f 67 tstnbz t0 68 bf 3f 69 70 ldw t0, (a3, 20) 71 ldw t1, (a1, 20) 72 cmpne t0, t1 73 bt 2f 74 tstnbz t0 75 bf 3f 76 77 ldw t0, (a3, 24) 78 ldw t1, (a1, 24) 79 cmpne t0, t1 80 bt 2f 81 tstnbz t0 82 bf 3f 83 84 ldw t0, (a3, 28) 85 ldw t1, (a1, 28) 86 cmpne t0, t1 87 bt 2f 88 tstnbz t0 89 bf 3f 90 91 addi a3, 32 92 addi a1, 32 93 94 br 1b 95 96 /* s1[i] != s2[i] in word, so we check byte 3. */ 972: 98 xtrb3 a0, t0 99 xtrb3 a2, t1 100 subu a0, a2 101 bez a2, 4f 102 bnez a0, 4f 103 104 /* Check byte 2. */ 105 xtrb2 a0, t0 106 xtrb2 a2, t1 107 subu a0, a2 108 bez a2, 4f 109 bnez a0, 4f 110 111 /* Check byte 1. */ 112 xtrb1 a0, t0 113 xtrb1 a2, t1 114 subu a0, a2 115 bez a2, 4f 116 bnez a0, 4f 117 118 /* Check byte 0. */ 119 xtrb0 a0, t0 120 xtrb0 a2, t1 121 subu a0, a2 122 123 jmp lr 1243: 125 movi a0, 0 1264: 127 jmp lr 128 129 /* Compare when s1 or s2 is not aligned. */ 1305: 131 subi t1, 4 1326: 133 ldb a0, (a3, 0) 134 ldb a2, (a1, 0) 135 subu a0, a2 136 bnez a0, 4b 137 addi t1, 1 138 bez a2, 4b 139 addi a1, 1 140 addi a3, 1 141 bez t1, 1b 142 br 6b 143 1447: 145 ldb a0, (a3, 0) 146 addi a3, 1 147 ldb a2, (a1, 0) 148 addi a1, 1 149 subu a0, a2 150 bnez a0, 4b 151 bnez a2, 7b 152 jmp r15 153END (strcmp) 154 155libc_hidden_def (strcmp) 156.weak strcmp 157