Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2021 Arm Ltd.
0004  */
0005 
0006 #include <linux/linkage.h>
0007 #include <asm/assembler.h>
0008 
0009 /*
0010  * Find a character in an area of memory.
0011  *
0012  * Parameters:
0013  *  x0 - buf
0014  *  x1 - c
0015  *  x2 - n
0016  * Returns:
0017  *  x0 - address of first occurrence of 'c' or 0
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)