diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-01-23 15:29:57 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-01-23 15:29:57 -0600 |
commit | 18c3e49898b4680f86859e8b21c7fd64303dd45d (patch) | |
tree | 700fa6ef8e6a3e2f097737fcaf0054e2cfca0a42 | |
parent | 0f41a4f53d274cecef9b85652e2e916cf8bb6eeb (diff) | |
download | px4-nuttx-18c3e49898b4680f86859e8b21c7fd64303dd45d.tar.gz px4-nuttx-18c3e49898b4680f86859e8b21c7fd64303dd45d.tar.bz2 px4-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/ChangeLog | 4 | ||||
-rw-r--r-- | nuttx/arch/arm/src/armv7-m/up_memcpy.S | 32 |
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 |