From 209ac43b76f78e50093e37844fb56ef9bc990f5f Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Sat, 3 Jul 2010 00:12:47 +0000 Subject: [PATCH] ARM before armv6 did not supprt 'rev' instruction llvm-svn: 107548 --- compiler-rt/lib/arm/bswapdi2.S | 20 ++++++++++++++++++++ compiler-rt/lib/arm/bswapsi2.S | 11 +++++++++++ 2 files changed, 31 insertions(+) diff --git a/compiler-rt/lib/arm/bswapdi2.S b/compiler-rt/lib/arm/bswapdi2.S index 262171e76ca2..d5d65d77252e 100644 --- a/compiler-rt/lib/arm/bswapdi2.S +++ b/compiler-rt/lib/arm/bswapdi2.S @@ -16,8 +16,28 @@ // .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} +#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 +#endif diff --git a/compiler-rt/lib/arm/bswapsi2.S b/compiler-rt/lib/arm/bswapsi2.S index 74c25b86ae5e..309b202c06db 100644 --- a/compiler-rt/lib/arm/bswapsi2.S +++ b/compiler-rt/lib/arm/bswapsi2.S @@ -16,5 +16,16 @@ // .align 2 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 +#else rev r0, r0 // reverse bytes in parameter and put into result register +#endif bx lr