/*************************************************************************** * __________ __ ___. * 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: lea.l -28(%sp), %sp | save registers movem.l %d2-%d7/%a2, (%sp) | movem.l 32(%sp), %a0-%a2 | %a0 = buf1 | %a1 = buf2 | %a2 = len lea.l -15(%a0, %a2.l), %a2 | %a2 = end address - 15 cmp.l %a0, %a2 | end address <= buf1? bls.b .no_lines | not at least a line? leave .loop: | movem.l (%a0), %d0-%d3 | read four longwords from buf1 movem.l (%a1), %d4-%d7 | read four longwords from buf2 movem.l %d4-%d7, (%a0) | write buf2 data to buf1 movem.l %d0-%d3, (%a1) | write buf1 data to buf2 lea.l 16(%a0), %a0 | buf1 += 16 lea.l 16(%a1), %a1 | buf2 += 16 cmp.l %a0, %a2 | %a0 < %d0? bhi.b .loop | yes? keep exchanging .no_lines: | movem.l (%sp), %d2-%d7/%a2 | restore registers lea.l 28(%sp), %sp | rts | .end: .size memswap128, .end-memswap128