0001
0002
0003
0004
0005
0006 #include <linux/linkage.h>
0007 #include <asm/assembler.h>
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #define L(label) .L ## label
0021
0022 #define REP8_01 0x0101010101010101
0023 #define REP8_7f 0x7f7f7f7f7f7f7f7f
0024
0025 #define srcin x0
0026 #define chrin w1
0027 #define cntin x2
0028
0029 #define result x0
0030
0031 #define wordcnt x3
0032 #define rep01 x4
0033 #define repchr x5
0034 #define cur_word x6
0035 #define cur_byte w6
0036 #define tmp x7
0037 #define tmp2 x8
0038
0039 .p2align 4
0040 nop
0041 SYM_FUNC_START(__pi_memchr)
0042 and chrin, chrin, #0xff
0043 lsr wordcnt, cntin, #3
0044 cbz wordcnt, L(byte_loop)
0045 mov rep01, #REP8_01
0046 mul repchr, x1, rep01
0047 and cntin, cntin, #7
0048 L(word_loop):
0049 ldr cur_word, [srcin], #8
0050 sub wordcnt, wordcnt, #1
0051 eor cur_word, cur_word, repchr
0052 sub tmp, cur_word, rep01
0053 orr tmp2, cur_word, #REP8_7f
0054 bics tmp, tmp, tmp2
0055 b.ne L(found_word)
0056 cbnz wordcnt, L(word_loop)
0057 L(byte_loop):
0058 cbz cntin, L(not_found)
0059 ldrb cur_byte, [srcin], #1
0060 sub cntin, cntin, #1
0061 cmp cur_byte, chrin
0062 b.ne L(byte_loop)
0063 sub srcin, srcin, #1
0064 ret
0065 L(found_word):
0066 CPU_LE( rev tmp, tmp)
0067 clz tmp, tmp
0068 sub tmp, tmp, #64
0069 add result, srcin, tmp, asr #3
0070 ret
0071 L(not_found):
0072 mov result, #0
0073 ret
0074 SYM_FUNC_END(__pi_memchr)
0075 SYM_FUNC_ALIAS_WEAK(memchr, __pi_memchr)
0076 EXPORT_SYMBOL_NOKASAN(memchr)