linux/arch/avr32/lib/memcpy.S
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2004-2006 Atmel Corporation
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 */
   8
   9        /*
  10         * void *memcpy(void *to, const void *from, unsigned long n)
  11         *
  12         * This implementation does word-aligned loads in the main loop,
  13         * possibly sacrificing alignment of stores.
  14         *
  15         * Hopefully, in most cases, both "to" and "from" will be
  16         * word-aligned to begin with.
  17         */
  18        .text
  19        .global memcpy
  20        .type   memcpy, @function
  21memcpy:
  22        mov     r9, r11
  23        andl    r9, 3, COH
  24        brne    1f
  25
  26        /* At this point, "from" is word-aligned */
  272:      mov     r9, r12
  285:      sub     r10, 4
  29        brlt    4f
  30
  313:      ld.w    r8, r11++
  32        sub     r10, 4
  33        st.w    r12++, r8
  34        brge    3b
  35
  364:      neg     r10
  37        reteq   r9
  38
  39        /* Handle unaligned count */
  40        lsl     r10, 2
  41        add     pc, pc, r10
  42        ld.ub   r8, r11++
  43        st.b    r12++, r8
  44        ld.ub   r8, r11++
  45        st.b    r12++, r8
  46        ld.ub   r8, r11++
  47        st.b    r12++, r8
  48        retal   r9
  49
  50        /* Handle unaligned "from" pointer */
  511:      sub     r10, 4
  52        movlt   r9, r12
  53        brlt    4b
  54        add     r10, r9
  55        lsl     r9, 2
  56        add     pc, pc, r9
  57        ld.ub   r8, r11++
  58        st.b    r12++, r8
  59        ld.ub   r8, r11++
  60        st.b    r12++, r8
  61        ld.ub   r8, r11++
  62        st.b    r12++, r8
  63        mov     r8, r12
  64        add     pc, pc, r9
  65        sub     r8, 1
  66        nop
  67        sub     r8, 1
  68        nop
  69        sub     r8, 1
  70        nop
  71        mov     r9, r8
  72        rjmp    5b
  73