summaryrefslogtreecommitdiff
path: root/lib/arm
diff options
context:
space:
mode:
authorStephen Canon <scanon@apple.com>2010-07-03 01:00:49 +0000
committerStephen Canon <scanon@apple.com>2010-07-03 01:00:49 +0000
commitfe22a3f1e1abddc4a512aa8f9bed64b3ada78094 (patch)
treece6db5f8ae533b0e9c6a7bf77d66ec5b263dc3a9 /lib/arm
parentb6d4e2e3a87eb3c9a6dec0ad21d4c1dec545c137 (diff)
downloadcompiler-rt-fe22a3f1e1abddc4a512aa8f9bed64b3ada78094.tar.gz
Marginally smaller implementations of bswap for ARMv4, ARMv5 that avoid the need to establish a frame
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@107555 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/arm')
-rw-r--r--lib/arm/bswapdi2.S43
-rw-r--r--lib/arm/bswapsi2.S15
2 files changed, 26 insertions, 32 deletions
diff --git a/lib/arm/bswapdi2.S b/lib/arm/bswapdi2.S
index d5d65d772..19311caad 100644
--- a/lib/arm/bswapdi2.S
+++ b/lib/arm/bswapdi2.S
@@ -1,4 +1,4 @@
-//===------- bswapdi2 - Implement bswapdi2 ---------------------------------===//
+//===------- bswapdi2 - Implement bswapdi2 --------------------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -14,30 +14,25 @@
//
// Reverse all the bytes in a 64-bit integer.
//
- .align 2
+ .align 2
DEFINE_COMPILERRT_FUNCTION(__bswapdi2)
#if __ARM_ARCH_5TEJ__ || __ARM_ARCH_4T__
- // before armv6 does not have "rev" instruction
- stmfd sp!, {r7, lr}
- mov r7, sp
- mov r2, #255, 24
- and r3, r2, r1, lsr #8
- mov r12, #255, 16
- and lr, r12, r1, lsl #8
- orr r3, r3, r1, lsr #24
- orr r1, lr, r1, lsl #24
- and r2, r2, r0, lsr #8
- orr r3, r1, r3
- orr r1, r2, r0, lsr #24
- and r2, r12, r0, lsl #8
- orr r0, r2, r0, lsl #24
- orr r1, r0, r1
- mov r0, r3
- ldmfd sp!, {r7, pc}
+ mov r12, #0xff00
+
+ and r3, r12, r0, lsr #8
+ and r2, r12, r0
+ orr r3, r3, r0, lsr #24
+ orr r3, r3, r0, lsl #24
+ orr r2, r3, r2, lsl #8 // r2 = rev(r0)
+
+ and r3, r12, r1, lsr #8
+ and r0, r12, r1
+ orr r3, r3, r1, lsr #24
+ orr r3, r3, r1, lsl #24
+ orr r0, r3, r0, lsl #8 // r0 = rev(r1)
#else
- rev r2, r1 // reverse bytes in high 32-bits into temp2
- rev r3, r0 // reverse bytes in low 32-bit into temp3
- mov r0, r2 // set low 32-bits of result to temp2
- mov r1, r3 // set high 32-bits of result to temp3
- bx lr
+ rev r2, r0 // r2 = rev(r0)
+ rev r0, r1 // r0 = rev(r1)
#endif
+ mov r1, r2 // r1 = r2 = rev(r0)
+ bx lr
diff --git a/lib/arm/bswapsi2.S b/lib/arm/bswapsi2.S
index 309b202c0..7e3ab7f48 100644
--- a/lib/arm/bswapsi2.S
+++ b/lib/arm/bswapsi2.S
@@ -1,4 +1,4 @@
-//===------- bswapsi2 - Implement bswapsi2 ---------------------------------===//
+//===------- bswapsi2 - Implement bswapsi2 --------------------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -18,13 +18,12 @@
DEFINE_COMPILERRT_FUNCTION(__bswapsi2)
#if __ARM_ARCH_5TEJ__ || __ARM_ARCH_4T__
// before armv6 does not have "rev" instruction
- mov r1, #255, 24
- mov r2, #255, 16
- and r1, r1, r0, lsr #8
- and r2, r2, r0, lsl #8
- orr r1, r1, r0, lsr #24
- orr r0, r2, r0, lsl #24
- orr r0, r0, r1
+ mov r1, #0xff00
+ and r2, r1, r0, lsr #8
+ and r1, r1, r0
+ orr r2, r2, r0, lsr #24
+ orr r2, r2, r0, lsl #24
+ orr r0, r2, r1, lsl #8
#else
rev r0, r0 // reverse bytes in parameter and put into result register
#endif