diff options
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r-- | firmware/target/coldfire/memswap128-coldfire.S | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/firmware/target/coldfire/memswap128-coldfire.S b/firmware/target/coldfire/memswap128-coldfire.S new file mode 100644 index 0000000000..2509fd0e45 --- /dev/null +++ b/firmware/target/coldfire/memswap128-coldfire.S | |||
@@ -0,0 +1,50 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Michael Sevakis | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | /**************************************************************************** | ||
21 | * void memswap128(void *buf1, void *buf2, size_t len) | ||
22 | */ | ||
23 | .section .icode, "ax", @progbits | ||
24 | .align 2 | ||
25 | .global memswap128 | ||
26 | .type memswap128, @function | ||
27 | memswap128: | ||
28 | lea.l -28(%sp), %sp | save registers | ||
29 | movem.l %d2-%d7/%a2, (%sp) | | ||
30 | movem.l 32(%sp), %a0-%a2 | %a0 = buf1 | ||
31 | | %a1 = buf2 | ||
32 | | %a2 = len | ||
33 | lea.l -15(%a0, %a2.l), %a2 | %a2 = end address - 15 | ||
34 | cmp.l %a0, %a2 | end address <= buf1? | ||
35 | bls.b .no_lines | not at least a line? leave | ||
36 | .loop: | | ||
37 | movem.l (%a0), %d0-%d3 | read four longwords from buf1 | ||
38 | movem.l (%a1), %d4-%d7 | read four longwords from buf2 | ||
39 | movem.l %d4-%d7, (%a0) | write buf2 data to buf1 | ||
40 | movem.l %d0-%d3, (%a1) | write buf1 data to buf2 | ||
41 | lea.l 16(%a0), %a0 | buf1 += 16 | ||
42 | lea.l 16(%a1), %a1 | buf2 += 16 | ||
43 | cmp.l %a0, %a2 | %a0 < %d0? | ||
44 | bhi.b .loop | yes? keep exchanging | ||
45 | .no_lines: | | ||
46 | movem.l (%sp), %d2-%d7/%a2 | restore registers | ||
47 | lea.l 28(%sp), %sp | | ||
48 | rts | | ||
49 | .end: | ||
50 | .size memswap128, .end-memswap128 | ||