| /*************************************************************************** |
| * __________ __ ___. |
| * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| * \/ \/ \/ \/ \/ |
| * $Id$ |
| * |
| * Copyright (C) 2007 by Michael Sevakis |
| * |
| * All files in this archive are subject to the GNU General Public License. |
| * See the file COPYING in the source tree root for full license agreement. |
| * |
| * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| * KIND, either express or implied. |
| * |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * void memswap128(void *buf1, void *buf2, size_t len) |
| */ |
| .section .icode, "ax", %progbits |
| .align 2 |
| .global memswap128 |
| .type memswap128, %function |
| memswap128: |
| @ r0 = buf1 |
| @ r1 = buf2 |
| @ r2 = len |
| movs r2, r2, lsr #4 @ bytes => lines, len == 0? |
| moveq pc, lr @ not at least a line? leave |
| stmdb sp!, { r4-r10, lr } @ save registers and return address |
| .loop: @ |
| ldmia r0, { r3-r6 } @ read four longwords from buf1 |
| ldmia r1, { r7-r10 } @ read four longwords from buf2 |
| stmia r0!, { r7-r10 } @ write buf2 data to buf1, buf1 += 16 |
| stmia r1!, { r3-r6 } @ write buf1 data to buf2, buf2 += 16 |
| subs r2, r2, #1 @ len -= 1, len > 0 ? |
| bhi .loop @ yes? keep exchanging |
| ldmia sp!, { r4-r10, pc } @ restore registers and return |
| .end: |
| .size memswap128, .end-memswap128 |
| |