Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

        TEXT    memcmp(SB), $0

/*
 * performance:
 *      (tba)
 */

        MOVW    R7, 0(FP)
        MOVW    n+8(FP), R9             /* R9 is count */
        MOVW    s1+0(FP), R10           /* R10 is pointer1 */
        MOVW    s2+4(FP), R11           /* R11 is pointer2 */
        ADD     R9,R10, R12             /* R12 is end pointer1 */

/*
 * if not at least 4 chars,
 * dont even mess around.
 * 3 chars to guarantee any
 * rounding up to a word
 * boundary and 4 characters
 * to get at least maybe one
 * full word cmp.
 */
        SUBCC   $4,R9, R0
        BL      out

/*
 * test if both pointers
 * are similarly word alligned
 */
        XOR     R10,R11, R7
        ANDCC   $3,R7, R0
        BNE     out

/*
 * byte at a time to word allign
 */
l1:
        ANDCC   $3,R10, R0
        BE      l2
        MOVBU   0(R10), R16
        MOVBU   0(R11), R17
        ADD     $1, R10
        SUBCC   R16,R17, R0
        BNE     ne
        ADD     $1, R11
        JMP     l1

/*
 * turn R9 into end pointer1-15
 * cmp 16 at a time while theres room
 */
l2:
        SUB     $15,R12, R9
l3:
        SUBCC   R10,R9, R0
        BLEU    l4
        MOVW    0(R10), R16
        MOVW    0(R11), R17
        MOVW    4(R10), R18
        SUBCC   R16,R17, R0
        BNE     ne
        MOVW    4(R11), R19
        MOVW    8(R10), R16
        SUBCC   R18,R19, R0
        BNE     ne
        MOVW    8(R11), R17
        MOVW    12(R10), R18
        SUBCC   R16,R17, R0
        BNE     ne
        MOVW    12(R11), R19
        ADD     $16, R10
        SUBCC   R18,R19, R0
        BNE     ne
        SUBCC   R16,R17, R0
        BNE     ne
        ADD     $16, R11
        JMP     l3

/*
 * turn R9 into end pointer1-3
 * cmp 4 at a time while theres room
 */
l4:
        SUB     $3,R12, R9
l5:
        SUBCC   R10,R9, R0
        BLEU    out
        MOVW    0(R10), R16
        MOVW    0(R11), R17
        ADD     $4, R10
        SUBCC   R16,R17, R0             /* only works because big endian */
        BNE     ne
        ADD     $4, R11
        JMP     l5

/*
 * last loop, cmp byte at a time
 */
out:
        SUBCC   R10,R12, R0
        BE      zero
        MOVBU   0(R10), R16
        MOVBU   0(R11), R17
        ADD     $1, R10
        SUBCC   R16,R17, R0
        BNE     ne
        ADD     $1, R11
        JMP     out

ne:
        BGU     plus
        MOVW    $1, R7
        RETURN
plus:
        MOVW    $-1, R7
        RETURN

zero:
        MOVW    R0, R7
        RETURN

Generated by GNU Enscript 1.6.6.