OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [avr32/] [lib/] [csum_partial_copy_generic.S] - Rev 3

Compare with Previous | Blame | View Log

/*
 * Copyright (C) 2004-2006 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <asm/errno.h>
#include <asm/asm.h>

        /*
         * unsigned int csum_partial_copy_generic(const char *src, char *dst, int len
         *                                        int sum, int *src_err_ptr,
         *                                        int *dst_err_ptr)
         *
         * Copy src to dst while checksumming, otherwise like csum_partial.
         */

        .macro ld_src size, reg, ptr
9999:   ld.\size \reg, \ptr
        .section __ex_table, "a"
        .long   9999b, fixup_ld_src
        .previous
        .endm

        .macro st_dst size, ptr, reg
9999:   st.\size \ptr, \reg
        .section __ex_table, "a"
        .long   9999b, fixup_st_dst
        .previous
        .endm

        .text
        .global csum_partial_copy_generic
        .type   csum_partial_copy_generic,"function"
        .align  1
csum_partial_copy_generic:
        pushm   r4-r7,lr

        /* The inner loop */
1:      sub     r10, 4
        brlt    5f
2:      ld_src  w, r5, r12++
        st_dst  w, r11++, r5
        add     r9, r5
        acr     r9
        sub     r10, 4
        brge    2b

        /* return if we had a whole number of words */
5:      sub     r10, -4
        brne    7f

6:      mov     r12, r9
        popm    r4-r7,pc

        /* handle additional bytes at the tail */
7:      mov     r5, 0
        mov     r4, 32
8:      ld_src  ub, r6, r12++
        st_dst  b, r11++, r6
        lsl     r5, 8
        sub     r4, 8
        bfins   r5, r6, 0, 8
        sub     r10, 1
        brne    8b

        lsl     r5, r5, r4
        add     r9, r5
        acr     r9
        rjmp    6b

        /* Exception handler */
        .section .fixup,"ax"
        .align  1
fixup_ld_src:
        mov     r9, -EFAULT
        cp.w    r8, 0
        breq    1f
        st.w    r8[0], r9

1:      /*
         * TODO: zero the complete destination - computing the rest
         * is too much work
         */

        mov     r9, 0
        rjmp    6b

fixup_st_dst:
        mov     r9, -EFAULT
        lddsp   r8, sp[20]
        cp.w    r8, 0
        breq    1f
        st.w    r8[0], r9
1:      mov     r9, 0
        rjmp    6b

        .previous

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.