[BACK]Return to bcmp.S CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / arch / mips / string

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/arch/mips/string/bcmp.S between version 1.8 and 1.9

version 1.8, 2003/08/07 16:42:16 version 1.9, 2009/12/14 01:07:42
Line 37 
Line 37 
 #include <machine/endian.h>     /* LWLO/LWHI, SWLO/SWHI */  #include <machine/endian.h>     /* LWLO/LWHI, SWLO/SWHI */
   
 #if defined(LIBC_SCCS) && !defined(lint)  #if defined(LIBC_SCCS) && !defined(lint)
         ASMSTR("from: @(#)bcmp.s        8.1 (Berkeley) 6/4/93")  #if 0
         ASMSTR("$NetBSD$")          RCSID("from: @(#)bcmp.s 8.1 (Berkeley) 6/4/93")
 #endif /* LIBC_SCCS and not lint */  #else
           RCSID("$NetBSD$")
 #ifdef __ABICALLS__  
         .abicalls  
 #endif  #endif
   #endif /* LIBC_SCCS and not lint */
   
 /* bcmp(s1, s2, n) */  /* bcmp(s1, s2, n) */
   
   
 LEAF(bcmp)  LEAF(bcmp)
         .set    noreorder          .set    noreorder
         blt     a2, 16, small           # is it worth any trouble?          blt             a2, 16, small   # is it worth any trouble?
         xor     v0, a0, a1              # compare low two bits of addresses          xor             v0, a0, a1      # compare low two bits of addresses
         and     v0, v0, 3          and             v0, v0, 3
         subu    a3, zero, a1            # compute # bytes to word align address          PTR_SUBU        a3, zero, a1    # compute # bytes to word align address
         bne     v0, zero, unaligned     # not possible to align addresses          bne             v0, zero, unaligned # not possible to align addresses
         and     a3, a3, 3          and             a3, a3, 3
   
         beq     a3, zero, 1f          beq             a3, zero, 1f
         subu    a2, a2, a3              # subtract from remaining count          PTR_SUBU        a2, a2, a3      # subtract from remaining count
         move    v0, v1                  # init v0,v1 so unmodified bytes match          move            v0, v1          # init v0,v1 so unmodified bytes match
         LWHI    v0, 0(a0)               # read 1, 2, or 3 bytes          LWHI            v0, 0(a0)       # read 1, 2, or 3 bytes
         LWHI    v1, 0(a1)          LWHI            v1, 0(a1)
         addu    a1, a1, a3          PTR_ADDU        a1, a1, a3
         bne     v0, v1, nomatch          bne             v0, v1, nomatch
         addu    a0, a0, a3          PTR_ADDU        a0, a0, a3
 1:  1:
         and     a3, a2, ~3              # compute number of whole words left          and             a3, a2, ~3      # compute number of whole words left
         subu    a2, a2, a3              #   which has to be >= (16-3) & ~3          PTR_SUBU        a2, a2, a3      #   which has to be >= (16-3) & ~3
         addu    a3, a3, a0              # compute ending address          PTR_ADDU        a3, a3, a0      # compute ending address
 2:  2:
         lw      v0, 0(a0)               # compare words          lw              v0, 0(a0)       # compare words
         lw      v1, 0(a1)          lw              v1, 0(a1)
         addu    a0, a0, 4          PTR_ADDU        a0, a0, 4
         bne     v0, v1, nomatch          bne             v0, v1, nomatch
         addu    a1, a1, 4          PTR_ADDU        a1, a1, 4
         bne     a0, a3, 2b          bne             a0, a3, 2b
         nop          nop
         b       small                   # finish remainder          b               small           # finish remainder
         nop          nop
 unaligned:  unaligned:
         beq     a3, zero, 2f          beq             a3, zero, 2f
         subu    a2, a2, a3              # subtract from remaining count          PTR_SUBU        a2, a2, a3      # subtract from remaining count
         addu    a3, a3, a0              # compute ending address          PTR_ADDU        a3, a3, a0      # compute ending address
 1:  1:
         lbu     v0, 0(a0)               # compare bytes until a1 word aligned          lbu             v0, 0(a0)       # compare bytes until a1 word aligned
         lbu     v1, 0(a1)          lbu             v1, 0(a1)
         addu    a0, a0, 1          PTR_ADDU        a0, a0, 1
         bne     v0, v1, nomatch          bne             v0, v1, nomatch
         addu    a1, a1, 1          PTR_ADDU        a1, a1, 1
         bne     a0, a3, 1b          bne             a0, a3, 1b
         nop          nop
 2:  2:
         and     a3, a2, ~3              # compute number of whole words left          and             a3, a2, ~3      # compute number of whole words left
         subu    a2, a2, a3              #   which has to be >= (16-3) & ~3          PTR_SUBU        a2, a2, a3      #   which has to be >= (16-3) & ~3
         addu    a3, a3, a0              # compute ending address          PTR_ADDU        a3, a3, a0      # compute ending address
 3:  3:
         LWHI    v0, 0(a0)               # compare words a0 unaligned, a1 aligned          LWHI            v0, 0(a0)       # compare words a0 unaligned, a1 aligned
         LWLO    v0, 3(a0)          LWLO            v0, 3(a0)
         lw      v1, 0(a1)          lw              v1, 0(a1)
         addu    a0, a0, 4          PTR_ADDU        a0, a0, 4
         bne     v0, v1, nomatch          bne             v0, v1, nomatch
         addu    a1, a1, 4          PTR_ADDU        a1, a1, 4
         bne     a0, a3, 3b          bne             a0, a3, 3b
         nop          nop
 small:  small:
         ble     a2, zero, match          ble             a2, zero, match
         addu    a3, a2, a0              # compute ending address          PTR_ADDU        a3, a2, a0              # compute ending address
 1:  1:
         lbu     v0, 0(a0)          lbu             v0, 0(a0)
         lbu     v1, 0(a1)          lbu             v1, 0(a1)
         addu    a0, a0, 1          PTR_ADDU        a0, a0, 1
         bne     v0, v1, nomatch          bne             v0, v1, nomatch
         addu    a1, a1, 1          PTR_ADDU        a1, a1, 1
         bne     a0, a3, 1b          bne             a0, a3, 1b
         nop          nop
 match:  match:
         j       ra          j               ra
         move    v0, zero          move            v0, zero
 nomatch:  nomatch:
         j       ra          j               ra
         li      v0, 1          li              v0, 1
         .set    reorder          .set    reorder
 END(bcmp)  END(bcmp)

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

CVSweb <webmaster@jp.NetBSD.org>