summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Canon <scanon@apple.com>2010-07-03 21:47:50 +0000
committerStephen Canon <scanon@apple.com>2010-07-03 21:47:50 +0000
commite735b297d08ea30dee8828ce18bfbe6c3e72c0f7 (patch)
tree7aaa4093a431680464b2b8e434362bb8a1cb7ba4
parentfe22a3f1e1abddc4a512aa8f9bed64b3ada78094 (diff)
downloadcompiler-rt-e735b297d08ea30dee8828ce18bfbe6c3e72c0f7.tar.gz
Further cleanup of ARM bswap implementations, thanks to John Tytgat
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@107576 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/arm/bswapdi2.S32
-rw-r--r--lib/arm/bswapsi2.S18
2 files changed, 23 insertions, 27 deletions
diff --git a/lib/arm/bswapdi2.S b/lib/arm/bswapdi2.S
index 19311caad..d3ca33a34 100644
--- a/lib/arm/bswapdi2.S
+++ b/lib/arm/bswapdi2.S
@@ -14,25 +14,23 @@
//
// Reverse all the bytes in a 64-bit integer.
//
- .align 2
+.align 2
DEFINE_COMPILERRT_FUNCTION(__bswapdi2)
#if __ARM_ARCH_5TEJ__ || __ARM_ARCH_4T__
- 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)
+ // before armv6 does not have "rev" instruction
+ // r2 = rev(r0)
+ eor r2, r0, r0, ror #16
+ bic r2, r2, #0xff0000
+ mov r2, r2, lsr #8
+ eor r2, r2, r0, ror #8
+ // r0 = rev(r1)
+ eor r0, r1, r1, ror #16
+ bic r0, r0, #0xff0000
+ mov r0, r0, lsr #8
+ eor r0, r0, r1, ror #8
#else
- rev r2, r0 // r2 = rev(r0)
- rev r0, r1 // r0 = rev(r1)
+ rev r2, r0 // r2 = rev(r0)
+ rev r0, r1 // r0 = rev(r1)
#endif
- mov r1, r2 // r1 = r2 = rev(r0)
+ mov r1, r2 // r1 = r2 = rev(r0)
bx lr
diff --git a/lib/arm/bswapsi2.S b/lib/arm/bswapsi2.S
index 7e3ab7f48..0a0c07370 100644
--- a/lib/arm/bswapsi2.S
+++ b/lib/arm/bswapsi2.S
@@ -14,17 +14,15 @@
//
// Reverse all the bytes in a 32-bit integer.
//
- .align 2
+.align 2
DEFINE_COMPILERRT_FUNCTION(__bswapsi2)
#if __ARM_ARCH_5TEJ__ || __ARM_ARCH_4T__
- // before armv6 does not have "rev" instruction
- 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
+ // before armv6 does not have "rev" instruction
+ eor r1, r0, r0, ror #16
+ bic r1, r1, #0xff0000
+ mov r1, r1, lsr #8
+ eor r0, r1, r0, ror #8
#else
- rev r0, r0 // reverse bytes in parameter and put into result register
+ rev r0, r0
#endif
- bx lr
+ bx lr