summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg White <gwhite@rockbox.org>2007-01-16 20:38:25 +0000
committerGreg White <gwhite@rockbox.org>2007-01-16 20:38:25 +0000
commit285aa1b0a633616bfb3b289535a60786390e4d59 (patch)
treeb5fc5844043647dd0e97a6bcd8980d5ee3243592
parent9ed3dca77920b34c26dce517cc6758d973c6eea1 (diff)
downloadrockbox-285aa1b0a633616bfb3b289535a60786390e4d59.zip
rockbox-285aa1b0a633616bfb3b289535a60786390e4d59.tar.gz
rockbox-285aa1b0a633616bfb3b289535a60786390e4d59.tar.bz2
rockbox-285aa1b0a633616bfb3b289535a60786390e4d59.tar.xz
Unroll loops
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12029 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c87
1 files changed, 77 insertions, 10 deletions
diff --git a/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c b/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c
index 8094ff8..615b04a 100644
--- a/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c
+++ b/firmware/target/arm/gigabeat/meg-fx/mmu-meg-fx.c
@@ -95,6 +95,27 @@ void invalidate_dcache_range(const void *base, unsigned int size) {
"mcr p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
"add %0, %0, #32 \n"
"cmp %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
+ "mcrne p15, 0, %0, c7, c14, 1 \n" /* Clean and invalidate this line */
+ "addne %0, %0, #32 \n"
+ "cmpne %0, %1 \n"
"bne inv_start \n"
"mov %0, #0\n"
"mcr p15,0,%0,c7,c10,4\n" /* Drain write buffer */
@@ -112,6 +133,27 @@ void clean_dcache_range(const void *base, unsigned int size) {
"mcr p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
"add %0, %0, #32 \n"
"cmp %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
+ "mcrlo p15, 0, %0, c7, c10, 1 \n" /* Clean this line */
+ "addlo %0, %0, #32 \n"
+ "cmplo %0, %1 \n"
"blo clean_start \n"
"mov %0, #0\n"
"mcr p15,0,%0,c7,c10,4 \n" /* Drain write buffer */
@@ -143,16 +185,41 @@ void dump_dcache_range(const void *base, unsigned int size) {
/* Cleans entire DCache */
void clean_dcache(void)
{
- unsigned int seg, index, addr;
-
- /* @@@ This is straight from the manual. It needs to be optimized. */
- for(seg = 0; seg <= 7; seg++) {
- for(index = 0; index <= 63; index++) {
- addr = (seg << 5) | (index << 26);
- asm volatile(
- "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
- : : "r" (addr));
- }
+ unsigned int index, addr;
+
+ for(index = 0; index <= 63; index++) {
+ addr = (0 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (1 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (2 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (3 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (4 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (5 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (6 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
+ addr = (7 << 5) | (index << 26);
+ asm volatile(
+ "mcr p15, 0, %0, c7, c10, 2 \n" /* Clean this entry by index */
+ : : "r" (addr));
}
}