Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

TEXT    strcpy(SB), $0

        MOVW    s2+4(FP),R2             /* R2 is from pointer */
        MOVW    R1, R3                  /* R3 is to pointer */

/*
 * align 'from' pointer
 */
l1:
        AND     $3, R2, R5
        ADDU    $1, R2
        BEQ     R5, l2
        MOVB    -1(R2), R5
        ADDU    $1, R3
        MOVB    R5, -1(R3)
        BNE     R5, l1
        RET

/*
 * test if 'to' is also alligned
 */
l2:
        AND     $3,R3, R5
        BEQ     R5, l4

/*
 * copy 4 at a time, 'to' not aligned
 */
l3:
        MOVW    -1(R2), R4
        ADD     $4, R2
        ADD     $4, R3
        SRL     $24,R4, R5
        MOVB    R5, -4(R3)
        BEQ     R5, out

        SRL     $16,R4, R5
        AND     $0xff, R5
        MOVB    R5, -3(R3)
        BEQ     R5, out

        SRL     $8,R4, R5
        AND     $0xff, R5
        MOVB    R5, -2(R3)
        BEQ     R5, out

        AND     $0xff,R4, R5
        MOVB    R5, -1(R3)
        BNE     R5, l3

out:
        RET

/*
 * word at a time both aligned
 */
l4:
        MOVW    $0xff000000, R7
        MOVW    $0x00ff0000, R8

l5:
        ADDU    $4, R3
        MOVW    -1(R2), R4      /* fetch */

        ADDU    $4, R2
        AND     R7,R4, R5       /* is it byte 0 */
        AND     R8,R4, R6       /* is it byte 1 */
        BEQ     R5, b0

        AND     $0xff00,R4, R5  /* is it byte 2 */
        BEQ     R6, b1

        AND     $0xff,R4, R6    /* is it byte 3 */
        BEQ     R5, b2

        MOVW    R4, -4(R3)      /* store */
        BNE     R6, l5
        JMP     out

b0:
        MOVB    $0, -4(R3)
        JMP     out

b1:
        SRL     $24, R4
        MOVB    R4, -4(R3)
        MOVB    $0, -3(R3)
        JMP     out

b2:
        SRL     $24,R4, R5
        MOVB    R5, -4(R3)
        SRL     $16, R4
        MOVB    R4, -3(R3)
        MOVB    $0, -2(R3)
        JMP     out