root/arch/arc/lib/strcmp-archs.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
   4  */
   5 
   6 #include <linux/linkage.h>
   7 
   8 ENTRY_CFI(strcmp)
   9         or      r2, r0, r1
  10         bmsk_s  r2, r2, 1
  11         brne    r2, 0, @.Lcharloop
  12 
  13 ;;; s1 and s2 are word aligned
  14         ld.ab   r2, [r0, 4]
  15 
  16         mov_s   r12, 0x01010101
  17         ror     r11, r12
  18         .align  4
  19 .LwordLoop:
  20         ld.ab   r3, [r1, 4]
  21         ;; Detect NULL char in str1
  22         sub     r4, r2, r12
  23         ld.ab   r5, [r0, 4]
  24         bic     r4, r4, r2
  25         and     r4, r4, r11
  26         brne.d.nt       r4, 0, .LfoundNULL
  27         ;; Check if the read locations are the same
  28         cmp     r2, r3
  29         beq.d   .LwordLoop
  30         mov.eq  r2, r5
  31 
  32         ;; A match is found, spot it out
  33 #ifdef __LITTLE_ENDIAN__
  34         swape   r3, r3
  35         mov_s   r0, 1
  36         swape   r2, r2
  37 #else
  38         mov_s   r0, 1
  39 #endif
  40         cmp_s   r2, r3
  41         j_s.d   [blink]
  42         bset.lo r0, r0, 31
  43 
  44         .align 4
  45 .LfoundNULL:
  46 #ifdef __BIG_ENDIAN__
  47         swape   r4, r4
  48         swape   r2, r2
  49         swape   r3, r3
  50 #endif
  51         ;; Find null byte
  52         ffs     r0, r4
  53         bmsk    r2, r2, r0
  54         bmsk    r3, r3, r0
  55         swape   r2, r2
  56         swape   r3, r3
  57         ;; make the return value
  58         sub.f   r0, r2, r3
  59         mov.hi  r0, 1
  60         j_s.d   [blink]
  61         bset.lo r0, r0, 31
  62 
  63         .align 4
  64 .Lcharloop:
  65         ldb.ab  r2, [r0, 1]
  66         ldb.ab  r3, [r1, 1]
  67         nop
  68         breq    r2, 0, .Lcmpend
  69         breq    r2, r3, .Lcharloop
  70 
  71         .align 4
  72 .Lcmpend:
  73         j_s.d   [blink]
  74         sub     r0, r2, r3
  75 END_CFI(strcmp)

/* [<][>][^][v][top][bottom][index][help] */