summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorandrew <andrew@FreeBSD.org>2014-12-14 16:28:53 +0000
committerandrew <andrew@FreeBSD.org>2014-12-14 16:28:53 +0000
commit90fc0dee7a26d23d867362739d7b6e6e0dbe0373 (patch)
tree9b4054152142c6af30b2bb73b6c1b80cf305d9f7 /sys/arm
parent041226eb036d08804fe0e5cb72da0876281e63f3 (diff)
downloadFreeBSD-src-90fc0dee7a26d23d867362739d7b6e6e0dbe0373.zip
FreeBSD-src-90fc0dee7a26d23d867362739d7b6e6e0dbe0373.tar.gz
Clean up our ARM assembly:
MFC 275256: Switch to the ARM unified assembly language as the clang integrated as only supports it. Binutils supports it when the ".syntax unified" directive is set. Sponsored by: ABT Systems Ltd MFC 275264: Update _ENTRY to use _EENTRY to reduce the common code. MFC 275321: Remove extra labels, ENTRY_NP already provides them. Sponsored by: ABT Systems Ltd MFC 275322: Correctly a few incorrect uses of ENTRY/EENTRY and END/EEND Sponsored by: ABT Systems Ltd MFC 275416: Fix the name of the coprocessor to include the "p" prefix, the clang integrated assembler expects this. Sponsored by: ABT Systems Ltd MFC 275418: Switch to unified syntax so these can be built with clang 3.5. Sponsored by: ABT Systems Ltd MFC 275519: Add missing END macros to some of the xscale functions. Sponsored by: ABT Systems Ltd MFC 275520: Use the unified syntax in a few more assembly files Sponsored by: ABT Systems Ltd MFC 275521: Set the alignment to 4-bytes after a string as clang 3.5 can switch to thumb mode if this is incorrect. Sponsored by: ABT Systems Ltd MFC 275522: Place the literal pool after a RET otherwise clang 3.5 tries to put it too far away from a ldr psuedo instruction. With this clang will place the literal value here where it's close enough to be loaded. Sponsored by: ABT Systems Ltd MFC 275523: Switch to an armv6k cpu, without this clang 3.5 complains "bx lr" is unsupported as it needs a newer cpu. Sponsored by: ABT Systems Ltd MFC 275524: Switch to a .cpu directive. These will work when clang 3.5 is imported where the .arch directive is a nop. Sponsored by: ABT Systems Ltd
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/bcopyinout_xscale.S53
-rw-r--r--sys/arm/arm/blockio.S38
-rw-r--r--sys/arm/arm/cpufunc_asm_arm11x6.S2
-rw-r--r--sys/arm/arm/cpufunc_asm_armv5.S1
-rw-r--r--sys/arm/arm/cpufunc_asm_xscale_c3.S1
-rw-r--r--sys/arm/arm/fusu.S10
-rw-r--r--sys/arm/arm/in_cksum_arm.S13
-rw-r--r--sys/arm/arm/locore.S4
-rw-r--r--sys/arm/arm/support.S257
-rw-r--r--sys/arm/include/asm.h28
-rw-r--r--sys/arm/ti/ti_smc.S2
-rw-r--r--sys/arm/xscale/ixp425/ixp425_a4x_io.S10
-rw-r--r--sys/arm/xscale/ixp425/ixp425_pci_asm.S6
13 files changed, 225 insertions, 200 deletions
diff --git a/sys/arm/arm/bcopyinout_xscale.S b/sys/arm/arm/bcopyinout_xscale.S
index 45cfe70..5c1026f 100644
--- a/sys/arm/arm/bcopyinout_xscale.S
+++ b/sys/arm/arm/bcopyinout_xscale.S
@@ -38,6 +38,7 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+ .syntax unified
.text
.align 0
@@ -104,8 +105,8 @@ ENTRY(copyin)
ldr r0, =EFAULT
str r11, [r10, #PCB_ONFAULT]
cmp r3, #0x00
- ldmgtfd sp!, {r4-r7} /* r3 > 0 Restore r4-r7 */
- ldmltfd sp!, {r4-r9} /* r3 < 0 Restore r4-r9 */
+ ldmfdgt sp!, {r4-r7} /* r3 > 0 Restore r4-r7 */
+ ldmfdlt sp!, {r4-r9} /* r3 < 0 Restore r4-r9 */
ldmfd sp!, {r10-r11, pc}
.Lcopyin_guts:
@@ -138,7 +139,7 @@ ENTRY(copyin)
/* Quad-align the destination buffer */
tst r1, #0x07 /* Already quad aligned? */
- ldrnet ip, [r0], #0x04
+ ldrtne ip, [r0], #0x04
strne ip, [r1], #0x04
subne r2, r2, #0x04
stmfd sp!, {r4-r9} /* Free up some registers */
@@ -207,7 +208,7 @@ ENTRY(copyin)
.Lcopyin_w_lessthan128:
adds r2, r2, #0x80 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq
subs r2, r2, #0x20
blt .Lcopyin_w_lessthan32
@@ -232,7 +233,7 @@ ENTRY(copyin)
.Lcopyin_w_lessthan32:
adds r2, r2, #0x20 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq /* Return now if done */
and r4, r2, #0x18
@@ -266,17 +267,17 @@ ENTRY(copyin)
.Lcopyin_w_less_than8:
subs r2, r2, #0x04
- ldrget ip, [r0], #0x04
+ ldrtge ip, [r0], #0x04
strge ip, [r1], #0x04
RETeq /* Return now if done */
addlt r2, r2, #0x04
ldrbt ip, [r0], #0x01
cmp r2, #0x02
- ldrgebt r2, [r0], #0x01
+ ldrbtge r2, [r0], #0x01
strb ip, [r1], #0x01
- ldrgtbt ip, [r0]
- strgeb r2, [r1], #0x01
- strgtb ip, [r1]
+ ldrbtgt ip, [r0]
+ strbge r2, [r1], #0x01
+ strbgt ip, [r1]
RET
/*
@@ -331,7 +332,7 @@ ENTRY(copyin)
bge .Lcopyin_bad1_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x03
@@ -392,7 +393,7 @@ ENTRY(copyin)
bge .Lcopyin_bad2_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x02
@@ -453,7 +454,7 @@ ENTRY(copyin)
bge .Lcopyin_bad3_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x01
@@ -546,8 +547,8 @@ ENTRY(copyout)
ldr r0, =EFAULT
str r11, [r10, #PCB_ONFAULT]
cmp r3, #0x00
- ldmgtfd sp!, {r4-r7} /* r3 > 0 Restore r4-r7 */
- ldmltfd sp!, {r4-r9} /* r3 < 0 Restore r4-r9 */
+ ldmfdgt sp!, {r4-r7} /* r3 > 0 Restore r4-r7 */
+ ldmfdlt sp!, {r4-r9} /* r3 < 0 Restore r4-r9 */
ldmfd sp!, {r10-r11, pc}
.Lcopyout_guts:
@@ -582,7 +583,7 @@ ENTRY(copyout)
tst r0, #0x07 /* Already quad aligned? */
ldrne ip, [r0], #0x04
subne r2, r2, #0x04
- strnet ip, [r1], #0x04
+ strtne ip, [r1], #0x04
stmfd sp!, {r4-r9} /* Free up some registers */
mov r3, #-1 /* Signal restore r4-r9 */
@@ -650,7 +651,7 @@ ENTRY(copyout)
.Lcopyout_w_lessthan128:
adds r2, r2, #0x80 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq /* Return now if done */
subs r2, r2, #0x20
blt .Lcopyout_w_lessthan32
@@ -675,7 +676,7 @@ ENTRY(copyout)
.Lcopyout_w_lessthan32:
adds r2, r2, #0x20 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq /* Return now if done */
and r4, r2, #0x18
@@ -710,16 +711,16 @@ ENTRY(copyout)
.Lcopyout_w_less_than8:
subs r2, r2, #0x04
ldrge ip, [r0], #0x04
- strget ip, [r1], #0x04
+ strtge ip, [r1], #0x04
RETeq /* Return now if done */
addlt r2, r2, #0x04
ldrb ip, [r0], #0x01
cmp r2, #0x02
- ldrgeb r2, [r0], #0x01
+ ldrbge r2, [r0], #0x01
strbt ip, [r1], #0x01
- ldrgtb ip, [r0]
- strgebt r2, [r1], #0x01
- strgtbt ip, [r1]
+ ldrbgt ip, [r0]
+ strbtge r2, [r1], #0x01
+ strbtgt ip, [r1]
RET
/*
@@ -774,7 +775,7 @@ ENTRY(copyout)
bge .Lcopyout_bad1_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x03
@@ -835,7 +836,7 @@ ENTRY(copyout)
bge .Lcopyout_bad2_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x02
@@ -896,7 +897,7 @@ ENTRY(copyout)
bge .Lcopyout_bad3_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r0, r0, #0x01
diff --git a/sys/arm/arm/blockio.S b/sys/arm/arm/blockio.S
index d121f2c..28f502b 100644
--- a/sys/arm/arm/blockio.S
+++ b/sys/arm/arm/blockio.S
@@ -50,6 +50,8 @@
__FBSDID("$FreeBSD$");
+ .syntax unified
+
/*
* Read bytes from an I/O address into a block of memory
*
@@ -71,10 +73,10 @@ ENTRY(read_multi_1)
cmp r12, #2
ldrb r3, [r0]
strb r3, [r1], #1
- ldrgeb r3, [r0]
- strgeb r3, [r1], #1
- ldrgtb r3, [r0]
- strgtb r3, [r1], #1
+ ldrbge r3, [r0]
+ strbge r3, [r1], #1
+ ldrbgt r3, [r0]
+ strbgt r3, [r1], #1
subs r2, r2, r12
blt .Lrm1_l4
.Lrm1_main:
@@ -91,15 +93,15 @@ ENTRY(read_multi_1)
bge .Lrm1loop
.Lrm1_l4:
adds r2, r2, #4 /* r2 = length again */
- ldmeqdb fp, {fp, sp, pc}
+ ldmdbeq fp, {fp, sp, pc}
RETeq
cmp r2, #2
ldrb r3, [r0]
strb r3, [r1], #1
- ldrgeb r3, [r0]
- strgeb r3, [r1], #1
- ldrgtb r3, [r0]
- strgtb r3, [r1], #1
+ ldrbge r3, [r0]
+ strbge r3, [r1], #1
+ ldrbgt r3, [r0]
+ strbgt r3, [r1], #1
ldmdb fp, {fp, sp, pc}
END(read_multi_1)
@@ -124,10 +126,10 @@ ENTRY(write_multi_1)
cmp r12, #2
ldrb r3, [r1], #1
strb r3, [r0]
- ldrgeb r3, [r1], #1
- strgeb r3, [r0]
- ldrgtb r3, [r1], #1
- strgtb r3, [r0]
+ ldrbge r3, [r1], #1
+ strbge r3, [r0]
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0]
subs r2, r2, r12
blt .Lwm1_l4
.Lwm1_main:
@@ -144,14 +146,14 @@ ENTRY(write_multi_1)
bge .Lwm1loop
.Lwm1_l4:
adds r2, r2, #4 /* r2 = length again */
- ldmeqdb fp, {fp, sp, pc}
+ ldmdbeq fp, {fp, sp, pc}
cmp r2, #2
ldrb r3, [r1], #1
strb r3, [r0]
- ldrgeb r3, [r1], #1
- strgeb r3, [r0]
- ldrgtb r3, [r1], #1
- strgtb r3, [r0]
+ ldrbge r3, [r1], #1
+ strbge r3, [r0]
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0]
ldmdb fp, {fp, sp, pc}
END(write_multi_1)
diff --git a/sys/arm/arm/cpufunc_asm_arm11x6.S b/sys/arm/arm/cpufunc_asm_arm11x6.S
index 63fda9e..4d2697a 100644
--- a/sys/arm/arm/cpufunc_asm_arm11x6.S
+++ b/sys/arm/arm/cpufunc_asm_arm11x6.S
@@ -62,7 +62,7 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
- .cpu arm1136js
+ .cpu arm1176jz-s
#if 0
#define Invalidate_I_cache(Rtmp1, Rtmp2) \
diff --git a/sys/arm/arm/cpufunc_asm_armv5.S b/sys/arm/arm/cpufunc_asm_armv5.S
index 7435b46..582ea50 100644
--- a/sys/arm/arm/cpufunc_asm_armv5.S
+++ b/sys/arm/arm/cpufunc_asm_armv5.S
@@ -194,7 +194,6 @@ ENTRY(armv5_idcache_wbinv_range)
END(armv5_idcache_wbinv_range)
ENTRY_NP(armv5_idcache_wbinv_all)
-armv5_idcache_wbinv_all:
.Larmv5_idcache_wbinv_all:
/*
* We assume that the code here can never be out of sync with the
diff --git a/sys/arm/arm/cpufunc_asm_xscale_c3.S b/sys/arm/arm/cpufunc_asm_xscale_c3.S
index 0fdb39c..bc4a8d5 100644
--- a/sys/arm/arm/cpufunc_asm_xscale_c3.S
+++ b/sys/arm/arm/cpufunc_asm_xscale_c3.S
@@ -143,7 +143,6 @@ __FBSDID("$FreeBSD$");
ENTRY_NP(xscalec3_cache_syncI)
-xscalec3_cache_purgeID:
EENTRY_NP(xscalec3_cache_purgeID)
mcr p15, 0, r0, c7, c5, 0 /* flush I cache (D cleaned below) */
EENTRY_NP(xscalec3_cache_cleanID)
diff --git a/sys/arm/arm/fusu.S b/sys/arm/arm/fusu.S
index c70215c..3d2716a 100644
--- a/sys/arm/arm/fusu.S
+++ b/sys/arm/arm/fusu.S
@@ -38,6 +38,8 @@
#include "assym.s"
__FBSDID("$FreeBSD$");
+ .syntax unified
+
#ifdef _ARM_ARCH_6
#define GET_PCB(tmp) \
mrc p15, 0, tmp, c13, c0, 4; \
@@ -83,7 +85,7 @@ EENTRY_NP(casuword32)
ldrt r5, [r0]
cmp r5, r1
movne r0, r5
- streqt r2, [r0]
+ strteq r2, [r0]
#endif
moveq r0, r1
2:
@@ -129,7 +131,7 @@ EENTRY_NP(fuword32)
str r1, [r2, #PCB_ONFAULT]
mov r0, r3
RET
-END(fuword32)
+EEND(fuword32)
END(fuword)
/*
@@ -269,7 +271,7 @@ _C_LABEL(fusubailout):
fusupcbfaulttext:
.asciz "Yikes - no valid PCB during fusuxxx() addr=%08x\n"
- .align 0
+ .align 2
#endif
/*
@@ -295,7 +297,7 @@ EENTRY_NP(suword32)
mov r0, #0x00000000
str r0, [r2, #PCB_ONFAULT]
RET
-END(suword32)
+EEND(suword32)
END(suword)
/*
diff --git a/sys/arm/arm/in_cksum_arm.S b/sys/arm/arm/in_cksum_arm.S
index 6305caf..5f121d5 100644
--- a/sys/arm/arm/in_cksum_arm.S
+++ b/sys/arm/arm/in_cksum_arm.S
@@ -46,6 +46,7 @@
#include "assym.s"
__FBSDID("$FreeBSD$");
+ .syntax unified
/*
* int in_cksum(struct mbuf *m, int len)
*
@@ -128,9 +129,9 @@ ASENTRY_NP(L_cksumdata)
blt .Lcksumdata_endgame
cmp r7, #0x02
ldrb r4, [r0], #0x01 /* Fetch 1st byte */
- ldrgeb r5, [r0], #0x01 /* Fetch 2nd byte */
+ ldrbge r5, [r0], #0x01 /* Fetch 2nd byte */
movlt r5, #0x00
- ldrgtb r6, [r0], #0x01 /* Fetch 3rd byte */
+ ldrbgt r6, [r0], #0x01 /* Fetch 3rd byte */
movle r6, #0x00
/* Combine the three bytes depending on endianness and alignment */
#ifdef __ARMEB__
@@ -196,7 +197,7 @@ ASENTRY_NP(L_cksumdata)
adcs r2, r2, r5
adc r2, r2, #0x00
subs r1, r1, #0x40
- ldrged r4, [r0], #0x08
+ ldrdge r4, [r0], #0x08
bge .Lcksumdata_bigloop
adds r2, r2, r6 /* r6/r7 still need summing */
@@ -241,7 +242,7 @@ ASENTRY_NP(L_cksumdata)
cmp r1, #0x20
#ifdef _ARM_ARCH_5E
- ldrged r4, [r0], #0x08 /* Avoid stalling pld and result */
+ ldrdge r4, [r0], #0x08 /* Avoid stalling pld and result */
blt .Lcksumdata_less_than_32
pld [r0, #0x18]
ldrd r6, [r0], #0x08
@@ -319,9 +320,9 @@ ASENTRY_NP(L_cksumdata)
.Lcksumdata_endgame:
ldrb r3, [r0] /* Fetch first byte */
cmp r1, #0x02
- ldrgeb r4, [r0, #0x01] /* Fetch 2nd and 3rd as necessary */
+ ldrbge r4, [r0, #0x01] /* Fetch 2nd and 3rd as necessary */
movlt r4, #0x00
- ldrgtb r5, [r0, #0x02]
+ ldrbgt r5, [r0, #0x02]
movle r5, #0x00
/* Combine the three bytes depending on endianness and alignment */
tst r0, #0x01
diff --git a/sys/arm/arm/locore.S b/sys/arm/arm/locore.S
index ce56efd..2835e17 100644
--- a/sys/arm/arm/locore.S
+++ b/sys/arm/arm/locore.S
@@ -474,8 +474,8 @@ ENTRY_NP(cpu_halt)
* Hurl ourselves into the ROM
*/
mov r0, #(CPU_CONTROL_32BP_ENABLE | CPU_CONTROL_32BD_ENABLE)
- mcr 15, 0, r0, c1, c0, 0
- mcrne 15, 0, r2, c8, c7, 0 /* nail I+D TLB on ARMv4 and greater */
+ mcr p15, 0, r0, c1, c0, 0
+ mcrne p15, 0, r2, c8, c7, 0 /* nail I+D TLB on ARMv4 and greater */
mov pc, r4
/*
diff --git a/sys/arm/arm/support.S b/sys/arm/arm/support.S
index 2a6eec9..b095aed 100644
--- a/sys/arm/arm/support.S
+++ b/sys/arm/arm/support.S
@@ -91,6 +91,8 @@ __FBSDID("$FreeBSD$");
#include "assym.s"
+ .syntax unified
+
.L_arm_memcpy:
.word _C_LABEL(_arm_memcpy)
.L_arm_bzero:
@@ -130,7 +132,7 @@ ENTRY(bzero)
.Lnormal0:
mov r3, #0x00
b do_memset
-EEND(bzero)
+END(bzero)
/* LINTSTUB: Func: void *memset(void *, int, size_t) */
ENTRY(memset)
and r3, r1, #0xff /* We deal with bytes */
@@ -167,39 +169,39 @@ do_memset:
.Lmemset_loop128:
subs r1, r1, #0x80
#ifdef _ARM_ARCH_5E
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
-#else
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+#else
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
#endif
bgt .Lmemset_loop128
RETeq /* Zero length so just exit */
@@ -210,15 +212,15 @@ do_memset:
.Lmemset_loop32:
subs r1, r1, #0x20
#ifdef _ARM_ARCH_5E
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
#else
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
#endif
bgt .Lmemset_loop32
RETeq /* Zero length so just exit */
@@ -227,11 +229,11 @@ do_memset:
/* Deal with 16 bytes or more */
#ifdef _ARM_ARCH_5E
- strged r2, [ip], #0x08
- strged r2, [ip], #0x08
+ strdge r2, [ip], #0x08
+ strdge r2, [ip], #0x08
#else
- stmgeia ip!, {r2-r3}
- stmgeia ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
+ stmiage ip!, {r2-r3}
#endif
RETeq /* Zero length so just exit */
@@ -254,17 +256,17 @@ do_memset:
#endif
strb r3, [ip], #0x01 /* Set 1 byte */
- strgeb r3, [ip], #0x01 /* Set another byte */
- strgtb r3, [ip] /* and a third */
+ strbge r3, [ip], #0x01 /* Set another byte */
+ strbgt r3, [ip] /* and a third */
RET /* Exit */
.Lmemset_wordunaligned:
rsb r2, r2, #0x004
strb r3, [ip], #0x01 /* Set 1 byte */
cmp r2, #0x02
- strgeb r3, [ip], #0x01 /* Set another byte */
+ strbge r3, [ip], #0x01 /* Set another byte */
sub r1, r1, r2
- strgtb r3, [ip], #0x01 /* and a third */
+ strbgt r3, [ip], #0x01 /* and a third */
cmp r1, #0x04 /* More than 4 bytes left? */
bge .Lmemset_wordaligned /* Yup */
@@ -273,10 +275,11 @@ do_memset:
RETeq /* Zero length so exit */
strb r3, [ip], #0x01 /* Set 1 byte */
cmp r1, #0x02
- strgeb r3, [ip], #0x01 /* Set another byte */
- strgtb r3, [ip] /* and a third */
+ strbge r3, [ip], #0x01 /* Set another byte */
+ strbgt r3, [ip] /* and a third */
RET /* Exit */
-END(memset)
+EEND(memset)
+END(bzero)
ENTRY(bcmp)
mov ip, r0
@@ -286,7 +289,7 @@ ENTRY(bcmp)
/* Are both addresses aligned the same way? */
cmp r2, #0x00
- eornes r3, ip, r1
+ eorsne r3, ip, r1
RETeq /* len == 0, or same addresses! */
tst r3, #0x03
subne r2, r2, #0x01
@@ -366,23 +369,23 @@ ENTRY(bcmp)
ldrb r0, [ip, #0x00] /* r0 = b1#0 */
ldrb r2, [r1, #0x01] /* r2 = b2#1 */
subs r0, r0, r3 /* r0 = b1#0 - b2#0 */
- ldreqb r3, [ip, #0x01] /* r3 = b1#1 */
+ ldrbeq r3, [ip, #0x01] /* r3 = b1#1 */
RETne /* Return if mismatch on #0 */
subs r0, r3, r2 /* r0 = b1#1 - b2#1 */
- ldreqb r3, [r1, #0x02] /* r3 = b2#2 */
- ldreqb r0, [ip, #0x02] /* r0 = b1#2 */
+ ldrbeq r3, [r1, #0x02] /* r3 = b2#2 */
+ ldrbeq r0, [ip, #0x02] /* r0 = b1#2 */
RETne /* Return if mismatch on #1 */
ldrb r2, [r1, #0x03] /* r2 = b2#3 */
subs r0, r0, r3 /* r0 = b1#2 - b2#2 */
- ldreqb r3, [ip, #0x03] /* r3 = b1#3 */
+ ldrbeq r3, [ip, #0x03] /* r3 = b1#3 */
RETne /* Return if mismatch on #2 */
subs r0, r3, r2 /* r0 = b1#3 - b2#3 */
- ldreqb r3, [r1, #0x04] /* r3 = b2#4 */
- ldreqb r0, [ip, #0x04] /* r0 = b1#4 */
+ ldrbeq r3, [r1, #0x04] /* r3 = b2#4 */
+ ldrbeq r0, [ip, #0x04] /* r0 = b1#4 */
RETne /* Return if mismatch on #3 */
ldrb r2, [r1, #0x05] /* r2 = b2#5 */
subs r0, r0, r3 /* r0 = b1#4 - b2#4 */
- ldreqb r3, [ip, #0x05] /* r3 = b1#5 */
+ ldrbeq r3, [ip, #0x05] /* r3 = b1#5 */
RETne /* Return if mismatch on #4 */
sub r0, r3, r2 /* r0 = b1#5 - b2#5 */
RET
@@ -436,8 +439,8 @@ EENTRY(memmove)
bge .Lmemmove_floop32
cmn r2, #0x10
- ldmgeia r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
- stmgeia r0!, {r3, r4, r12, lr}
+ ldmiage r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
+ stmiage r0!, {r3, r4, r12, lr}
subge r2, r2, #0x10
ldmia sp!, {r4} /* return r4 */
@@ -446,9 +449,9 @@ EENTRY(memmove)
/* blat 12 bytes at a time */
.Lmemmove_floop12:
- ldmgeia r1!, {r3, r12, lr}
- stmgeia r0!, {r3, r12, lr}
- subges r2, r2, #0x0c
+ ldmiage r1!, {r3, r12, lr}
+ stmiage r0!, {r3, r12, lr}
+ subsge r2, r2, #0x0c
bge .Lmemmove_floop12
.Lmemmove_fl12:
@@ -458,23 +461,23 @@ EENTRY(memmove)
subs r2, r2, #4
ldrlt r3, [r1], #4
strlt r3, [r0], #4
- ldmgeia r1!, {r3, r12}
- stmgeia r0!, {r3, r12}
+ ldmiage r1!, {r3, r12}
+ stmiage r0!, {r3, r12}
subge r2, r2, #4
.Lmemmove_fl4:
/* less than 4 bytes to go */
adds r2, r2, #4
- ldmeqia sp!, {r0, pc} /* done */
+ ldmiaeq sp!, {r0, pc} /* done */
/* copy the crud byte at a time */
cmp r2, #2
ldrb r3, [r1], #1
strb r3, [r0], #1
- ldrgeb r3, [r1], #1
- strgeb r3, [r0], #1
- ldrgtb r3, [r1], #1
- strgtb r3, [r0], #1
+ ldrbge r3, [r1], #1
+ strbge r3, [r0], #1
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0], #1
ldmia sp!, {r0, pc}
/* erg - unaligned destination */
@@ -485,10 +488,10 @@ EENTRY(memmove)
/* align destination with byte copies */
ldrb r3, [r1], #1
strb r3, [r0], #1
- ldrgeb r3, [r1], #1
- strgeb r3, [r0], #1
- ldrgtb r3, [r1], #1
- strgtb r3, [r0], #1
+ ldrbge r3, [r1], #1
+ strbge r3, [r0], #1
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0], #1
subs r2, r2, r12
blt .Lmemmove_fl4 /* less the 4 bytes */
@@ -703,12 +706,12 @@ EENTRY(memmove)
.Lmemmove_bl32:
cmn r2, #0x10
- ldmgedb r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
- stmgedb r0!, {r3, r4, r12, lr}
+ ldmdbge r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
+ stmdbge r0!, {r3, r4, r12, lr}
subge r2, r2, #0x10
adds r2, r2, #0x14
- ldmgedb r1!, {r3, r12, lr} /* blat a remaining 12 bytes */
- stmgedb r0!, {r3, r12, lr}
+ ldmdbge r1!, {r3, r12, lr} /* blat a remaining 12 bytes */
+ stmdbge r0!, {r3, r12, lr}
subge r2, r2, #0x0c
ldmia sp!, {r4, lr}
@@ -718,8 +721,8 @@ EENTRY(memmove)
subs r2, r2, #4
ldrlt r3, [r1, #-4]!
strlt r3, [r0, #-4]!
- ldmgedb r1!, {r3, r12}
- stmgedb r0!, {r3, r12}
+ ldmdbge r1!, {r3, r12}
+ stmdbge r0!, {r3, r12}
subge r2, r2, #4
.Lmemmove_bl4:
@@ -731,10 +734,10 @@ EENTRY(memmove)
cmp r2, #2
ldrb r3, [r1, #-1]!
strb r3, [r0, #-1]!
- ldrgeb r3, [r1, #-1]!
- strgeb r3, [r0, #-1]!
- ldrgtb r3, [r1, #-1]!
- strgtb r3, [r0, #-1]!
+ ldrbge r3, [r1, #-1]!
+ strbge r3, [r0, #-1]!
+ ldrbgt r3, [r1, #-1]!
+ strbgt r3, [r0, #-1]!
RET
/* erg - unaligned destination */
@@ -744,10 +747,10 @@ EENTRY(memmove)
/* align destination with byte copies */
ldrb r3, [r1, #-1]!
strb r3, [r0, #-1]!
- ldrgeb r3, [r1, #-1]!
- strgeb r3, [r0, #-1]!
- ldrgtb r3, [r1, #-1]!
- strgtb r3, [r0, #-1]!
+ ldrbge r3, [r1, #-1]!
+ strbge r3, [r0, #-1]!
+ ldrbgt r3, [r1, #-1]!
+ strbgt r3, [r0, #-1]!
subs r2, r2, r12
blt .Lmemmove_bl4 /* less than 4 bytes to go */
ands r12, r1, #3
@@ -994,8 +997,8 @@ ENTRY(memcpy)
bge .Lmemcpy_loop32
cmn r2, #0x10
- ldmgeia r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
- stmgeia r0!, {r3, r4, r12, lr}
+ ldmiage r1!, {r3, r4, r12, lr} /* blat a remaining 16 bytes */
+ stmiage r0!, {r3, r4, r12, lr}
subge r2, r2, #0x10
ldmia sp!, {r4} /* return r4 */
@@ -1004,9 +1007,9 @@ ENTRY(memcpy)
/* blat 12 bytes at a time */
.Lmemcpy_loop12:
- ldmgeia r1!, {r3, r12, lr}
- stmgeia r0!, {r3, r12, lr}
- subges r2, r2, #0x0c
+ ldmiage r1!, {r3, r12, lr}
+ stmiage r0!, {r3, r12, lr}
+ subsge r2, r2, #0x0c
bge .Lmemcpy_loop12
.Lmemcpy_l12:
@@ -1016,26 +1019,26 @@ ENTRY(memcpy)
subs r2, r2, #4
ldrlt r3, [r1], #4
strlt r3, [r0], #4
- ldmgeia r1!, {r3, r12}
- stmgeia r0!, {r3, r12}
+ ldmiage r1!, {r3, r12}
+ stmiage r0!, {r3, r12}
subge r2, r2, #4
.Lmemcpy_l4:
/* less than 4 bytes to go */
adds r2, r2, #4
#ifdef __APCS_26_
- ldmeqia sp!, {r0, pc}^ /* done */
+ ldmiaeq sp!, {r0, pc}^ /* done */
#else
- ldmeqia sp!, {r0, pc} /* done */
+ ldmiaeq sp!, {r0, pc} /* done */
#endif
/* copy the crud byte at a time */
cmp r2, #2
ldrb r3, [r1], #1
strb r3, [r0], #1
- ldrgeb r3, [r1], #1
- strgeb r3, [r0], #1
- ldrgtb r3, [r1], #1
- strgtb r3, [r0], #1
+ ldrbge r3, [r1], #1
+ strbge r3, [r0], #1
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0], #1
ldmia sp!, {r0, pc}
/* erg - unaligned destination */
@@ -1046,10 +1049,10 @@ ENTRY(memcpy)
/* align destination with byte copies */
ldrb r3, [r1], #1
strb r3, [r0], #1
- ldrgeb r3, [r1], #1
- strgeb r3, [r0], #1
- ldrgtb r3, [r1], #1
- strgtb r3, [r0], #1
+ ldrbge r3, [r1], #1
+ strbge r3, [r0], #1
+ ldrbgt r3, [r1], #1
+ strbgt r3, [r0], #1
subs r2, r2, r12
blt .Lmemcpy_l4 /* less the 4 bytes */
@@ -1212,12 +1215,12 @@ ENTRY(memcpy)
ldrb ip, [r1], #0x01
sub r2, r2, #0x01
strb ip, [r3], #0x01
- ldrleb ip, [r1], #0x01
+ ldrble ip, [r1], #0x01
suble r2, r2, #0x01
- strleb ip, [r3], #0x01
- ldrltb ip, [r1], #0x01
+ strble ip, [r3], #0x01
+ ldrblt ip, [r1], #0x01
sublt r2, r2, #0x01
- strltb ip, [r3], #0x01
+ strblt ip, [r3], #0x01
/* Destination buffer is now word aligned */
.Lmemcpy_wordaligned:
@@ -1294,7 +1297,7 @@ ENTRY(memcpy)
.Lmemcpy_w_lessthan128:
adds r2, r2, #0x80 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq /* Return now if done */
subs r2, r2, #0x20
blt .Lmemcpy_w_lessthan32
@@ -1319,7 +1322,7 @@ ENTRY(memcpy)
.Lmemcpy_w_lessthan32:
adds r2, r2, #0x20 /* Adjust for extra sub */
- ldmeqfd sp!, {r4-r9}
+ ldmfdeq sp!, {r4-r9}
RETeq /* Return now if done */
and r4, r2, #0x18
@@ -1355,12 +1358,14 @@ ENTRY(memcpy)
addlt r2, r2, #0x04
ldrb ip, [r1], #0x01
cmp r2, #0x02
- ldrgeb r2, [r1], #0x01
+ ldrbge r2, [r1], #0x01
strb ip, [r3], #0x01
- ldrgtb ip, [r1]
- strgeb r2, [r3], #0x01
- strgtb ip, [r3]
+ ldrbgt ip, [r1]
+ strbge r2, [r3], #0x01
+ strbgt ip, [r3]
RET
+/* Place a literal pool here for the above ldr instructions to use */
+.ltorg
/*
@@ -1413,7 +1418,7 @@ ENTRY(memcpy)
bge .Lmemcpy_bad1_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r1, r1, #0x03
@@ -1474,7 +1479,7 @@ ENTRY(memcpy)
bge .Lmemcpy_bad2_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r1, r1, #0x02
@@ -1535,7 +1540,7 @@ ENTRY(memcpy)
bge .Lmemcpy_bad3_loop16
adds r2, r2, #0x10
- ldmeqfd sp!, {r4-r7}
+ ldmfdeq sp!, {r4-r7}
RETeq /* Return now if done */
subs r2, r2, #0x04
sublt r1, r1, #0x01
@@ -1564,11 +1569,11 @@ ENTRY(memcpy)
RETeq
ldrb ip, [r1], #0x01
cmp r2, #0x02
- ldrgeb r2, [r1], #0x01
+ ldrbge r2, [r1], #0x01
strb ip, [r3], #0x01
- ldrgtb ip, [r1]
- strgeb r2, [r3], #0x01
- strgtb ip, [r3]
+ ldrbgt ip, [r1]
+ strbge r2, [r3], #0x01
+ strbgt ip, [r3]
RET
@@ -1598,7 +1603,7 @@ ENTRY(memcpy)
ldrb ip, [r1], #0x01
1: subs r2, r2, #0x01
strb ip, [r3], #0x01
- ldrneb ip, [r1], #0x01
+ ldrbne ip, [r1], #0x01
bne 1b
RET
diff --git a/sys/arm/include/asm.h b/sys/arm/include/asm.h
index 231d559..e5f06e7 100644
--- a/sys/arm/include/asm.h
+++ b/sys/arm/include/asm.h
@@ -64,6 +64,18 @@
#endif
/*
+ * EENTRY()/EEND() mark "extra" entry/exit points from a function.
+ * The unwind info cannot handle the concept of a nested function, or a function
+ * with multiple .fnstart directives, but some of our assembler code is written
+ * with multiple labels to allow entry at several points. The EENTRY() macro
+ * defines such an extra entry point without a new .fnstart, so that it's
+ * basically just a label that you can jump to. The EEND() macro does nothing
+ * at all, except document the exit point associated with the same-named entry.
+ */
+#define _EENTRY(x) .globl x; .type x,_ASM_TYPE_FUNCTION; x:
+#define _EEND(x) /* nothing */
+
+/*
* gas/arm uses @ as a single comment character and thus cannot be used here
* Instead it recognised the # instead of an @ symbols in .type directives
* We define a couple of macros so that assembly code will not be dependent
@@ -72,22 +84,10 @@
#define _ASM_TYPE_FUNCTION #function
#define _ASM_TYPE_OBJECT #object
#define GLOBAL(X) .globl x
-#define _ENTRY(x) \
- .text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x: _FNSTART
+#define _ENTRY(x) \
+ .text; _ALIGN_TEXT; _EENTRY(x) _FNSTART
#define _END(x) .size x, . - x; _FNEND
-/*
- * EENTRY()/EEND() mark "extra" entry/exit points from a function.
- * The unwind info cannot handle the concept of a nested function, or a function
- * with multiple .fnstart directives, but some of our assembler code is written
- * with multiple labels to allow entry at several points. The EENTRY() macro
- * defines such an extra entry point without a new .fnstart, so that it's
- * basically just a label that you can jump to. The EEND() macro does nothing
- * at all, except document the exit point associated with the same-named entry.
- */
-#define _EENTRY(x) .globl x; .type x,_ASM_TYPE_FUNCTION; x:
-#define _EEND(x) /* nothing */
-
#ifdef GPROF
# define _PROF_PROLOGUE \
mov ip, lr; bl __mcount
diff --git a/sys/arm/ti/ti_smc.S b/sys/arm/ti/ti_smc.S
index 208e3a0..931ad52 100644
--- a/sys/arm/ti/ti_smc.S
+++ b/sys/arm/ti/ti_smc.S
@@ -26,7 +26,7 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
- .arch armv7a
+ .cpu cortex-a8
.arch_extension sec
/* Issue a smc #0 call */
diff --git a/sys/arm/xscale/ixp425/ixp425_a4x_io.S b/sys/arm/xscale/ixp425/ixp425_a4x_io.S
index 22ab1b3..bccd19b 100644
--- a/sys/arm/xscale/ixp425/ixp425_a4x_io.S
+++ b/sys/arm/xscale/ixp425/ixp425_a4x_io.S
@@ -56,6 +56,7 @@ ENTRY(a4x_bs_r_1)
ldr r0, [r1, r2, LSL #2]
and r0, r0, #0xff
mov pc, lr
+END(a4x_bs_r_1)
ENTRY(a4x_bs_r_2)
ldr r0, [r1, r2, LSL #2]
@@ -63,10 +64,12 @@ ENTRY(a4x_bs_r_2)
orr r1, r1, r1, lsl #8
and r0, r0, r1
mov pc, lr
+END(a4x_bs_r_2)
ENTRY(a4x_bs_r_4)
ldr r0, [r1, r2, LSL #2]
mov pc, lr
+END(a4x_bs_r_4)
/*
* Write single
@@ -75,6 +78,7 @@ ENTRY(a4x_bs_w_1)
and r3, r3, #0xff
str r3, [r1, r2, LSL #2]
mov pc, lr
+END(a4x_bs_w_1)
ENTRY(a4x_bs_w_2)
mov r0, #0xff
@@ -82,10 +86,12 @@ ENTRY(a4x_bs_w_2)
and r3, r3, r0
str r3, [r1, r2, LSL #2]
mov pc, lr
+END(a4x_bs_w_2)
ENTRY(a4x_bs_w_4)
str r3, [r1, r2, LSL #2]
mov pc, lr
+END(a4x_bs_w_4)
/*
* Read multiple
@@ -101,6 +107,7 @@ ENTRY(a4x_bs_rm_1)
strb r3, [r1], #1
bne 1b
mov pc, lr
+END(a4x_bs_rm_1)
ENTRY(a4x_bs_rm_2)
add r0, r1, r2, lsl #2
@@ -113,6 +120,7 @@ ENTRY(a4x_bs_rm_2)
strh r3, [r1], #2
bne 1b
mov pc, lr
+END(a4x_bs_rm_2)
/*
* Write multiple
@@ -128,6 +136,7 @@ ENTRY(a4x_bs_wm_1)
str r3, [r0]
bne 1b
mov pc, lr
+END(a4x_bs_wm_1)
ENTRY(a4x_bs_wm_2)
add r0, r1, r2, lsl #2
@@ -140,3 +149,4 @@ ENTRY(a4x_bs_wm_2)
str r3, [r0]
bne 1b
mov pc, lr
+END(a4x_bs_wm_2)
diff --git a/sys/arm/xscale/ixp425/ixp425_pci_asm.S b/sys/arm/xscale/ixp425/ixp425_pci_asm.S
index f686d65..ce668a3 100644
--- a/sys/arm/xscale/ixp425/ixp425_pci_asm.S
+++ b/sys/arm/xscale/ixp425/ixp425_pci_asm.S
@@ -58,6 +58,7 @@ ENTRY(ixp425_pci_mem_bs_r_1)
ldrb r0, [r1, r2]
#endif /* __ARMEB__ */
mov pc, lr
+END(ixp425_pci_mem_bs_r_1)
ENTRY(ixp425_pci_mem_bs_r_2)
#ifdef __ARMEB__
@@ -68,10 +69,12 @@ ENTRY(ixp425_pci_mem_bs_r_2)
ldrh r0, [r1, r2]
#endif /* __ARMEB__ */
mov pc, lr
+END(ixp425_pci_mem_bs_r_2)
ENTRY(ixp425_pci_mem_bs_r_4)
ldr r0, [r1, r2]
mov pc, lr
+END(ixp425_pci_mem_bs_r_4)
/*
* write single
@@ -86,6 +89,7 @@ ENTRY(ixp425_pci_mem_bs_w_1)
strb r3, [r1, r2]
#endif /* __ARMEB__ */
mov pc, lr
+END(ixp425_pci_mem_bs_w_1)
ENTRY(ixp425_pci_mem_bs_w_2)
#ifdef __ARMEB__
@@ -96,7 +100,9 @@ ENTRY(ixp425_pci_mem_bs_w_2)
strh r3, [r1, r2]
#endif /* __ARMEB__ */
mov pc, lr
+END(ixp425_pci_mem_bs_w_2)
ENTRY(ixp425_pci_mem_bs_w_4)
str r3, [r1, r2]
mov pc, lr
+END(ixp425_pci_mem_bs_w_4)
OpenPOWER on IntegriCloud