summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-01-23 15:29:57 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-01-23 15:29:57 -0600
commit18c3e49898b4680f86859e8b21c7fd64303dd45d (patch)
tree700fa6ef8e6a3e2f097737fcaf0054e2cfca0a42
parent0f41a4f53d274cecef9b85652e2e916cf8bb6eeb (diff)
downloadnuttx-18c3e49898b4680f86859e8b21c7fd64303dd45d.tar.gz
nuttx-18c3e49898b4680f86859e8b21c7fd64303dd45d.tar.bz2
nuttx-18c3e49898b4680f86859e8b21c7fd64303dd45d.zip
Assembler changes with the gcc-47 distribution from ARM mean that we need to be explicit about branch one or more of the wide branch opcodes results in bad table branching. From Mike Smith
-rw-r--r--nuttx/ChangeLog4
-rw-r--r--nuttx/arch/arm/src/armv7-m/up_memcpy.S32
2 files changed, 20 insertions, 16 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 0fee2b7c0..13f84f038 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -6505,3 +6505,7 @@
* configs/efm32-dk3650: This is Energy Micro's development kit for
the Leopard Gecko MCU, which is an ARM Cortex-M3 device. From Richard
Cochran (2014-1-23).
+ * arch/arm/src/armv7-m/up_memcpy.S: Assembler changes with the gcc-47
+ distribution from ARM mean that we need to be explicit about branch
+ sizes; one or more of the wide branch opcodes results in bad table
+ branching. From Mike Smith (2014-1-23).
diff --git a/nuttx/arch/arm/src/armv7-m/up_memcpy.S b/nuttx/arch/arm/src/armv7-m/up_memcpy.S
index a154cab61..ea267f78f 100644
--- a/nuttx/arch/arm/src/armv7-m/up_memcpy.S
+++ b/nuttx/arch/arm/src/armv7-m/up_memcpy.S
@@ -152,7 +152,7 @@ memcpy:
/* Quickly check for very short copies */
cmp r2, #4
- blt MEM_DataCopyBytes
+ blt.n MEM_DataCopyBytes
and r14, r0, #3 /* Get destination alignment bits */
bfi r14, r1, #2, #2 /* Get source alignment bits */
@@ -199,7 +199,7 @@ MEM_DataCopy0:
/* Check for short word-aligned copy */
cmp r2, #0x28
- blt MEM_DataCopy0_2
+ blt.n MEM_DataCopy0_2
/* Bulk copy loop */
@@ -208,7 +208,7 @@ MEM_DataCopy0_1:
stmia r0!, {r3-r12}
sub r2, r2, #0x28
cmp r2, #0x28
- bge MEM_DataCopy0_1
+ bge.n MEM_DataCopy0_1
/* Copy remaining long words */
@@ -224,28 +224,28 @@ MEM_DataCopy0_2:
MEM_LongCopyJump:
ldr.w r3, [r1], #0x04 /* 4 bytes remain */
str.w r3, [r0], #0x04
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r4} /* 8 bytes remain */
stmia.w r0!, {r3-r4}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r5} /* 12 bytes remain */
stmia.w r0!, {r3-r5}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r6} /* 16 bytes remain */
stmia.w r0!, {r3-r6}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r7} /* 20 bytes remain */
stmia.w r0!, {r3-r7}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r8} /* 24 bytes remain */
stmia.w r0!, {r3-r8}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r9} /* 28 bytes remain */
stmia.w r0!, {r3-r9}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r10} /* 32 bytes remain */
stmia.w r0!, {r3-r10}
- b MEM_LongCopyEnd
+ b.n MEM_LongCopyEnd
ldmia.w r1!, {r3-r11} /* 36 bytes remain */
stmia.w r0!, {r3-r11}
@@ -308,7 +308,7 @@ MEM_DataCopy13:
MEM_DataCopy2:
cmp r2, #0x28
- blt MEM_DataCopy2_1
+ blt.n MEM_DataCopy2_1
/* Save regs */
@@ -345,18 +345,18 @@ MEM_DataCopy2_2:
sub r2, r2, #0x28
cmp r2, #0x28
- bge MEM_DataCopy2_2
+ bge.n MEM_DataCopy2_2
pop {r4-r12}
MEM_DataCopy2_1: /* Read longs and write 2 x half words */
cmp r2, #4
- blt MEM_DataCopyBytes
+ blt.n MEM_DataCopyBytes
ldr r3, [r1], #0x04
strh r3, [r0], #0x02
lsr r3, r3, #0x10
strh r3, [r0], #0x02
sub r2, r2, #0x04
- b MEM_DataCopy2
+ b.n MEM_DataCopy2
/* Bits: Src=01, Dst=00 - Byte before half word to long
* Bits: Src=01, Dst=10 - Byte before half word to half word
@@ -410,7 +410,7 @@ MEM_DataCopy3:
lsr r3, r3, #0x10
strb r3, [r0], #0x01
sub r2, r2, #0x04
- b MEM_DataCopy3
+ b.n MEM_DataCopy3
.size memcpy, .-memcpy
.end