Home | History | Annotate | Line # | Download | only in arm
      1      1.1  joerg //===------- bswapdi2 - Implement bswapdi2 --------------------------------===//
      2      1.1  joerg //
      3      1.1  joerg //                     The LLVM Compiler Infrastructure
      4      1.1  joerg //
      5      1.1  joerg // This file is dual licensed under the MIT and the University of Illinois Open
      6      1.1  joerg // Source Licenses. See LICENSE.TXT for details.
      7      1.1  joerg //
      8      1.1  joerg //===----------------------------------------------------------------------===//
      9      1.1  joerg 
     10      1.1  joerg #include "../assembly.h"
     11      1.1  joerg 
     12  1.1.1.3  joerg 	.syntax unified
     13  1.1.1.3  joerg 	.text
     14  1.1.1.3  joerg #if __ARM_ARCH_ISA_THUMB == 2
     15  1.1.1.3  joerg 	.thumb
     16  1.1.1.3  joerg #endif
     17  1.1.1.3  joerg 
     18      1.1  joerg //
     19      1.1  joerg // extern uint64_t __bswapdi2(uint64_t);
     20      1.1  joerg //
     21      1.1  joerg // Reverse all the bytes in a 64-bit integer.
     22      1.1  joerg //
     23  1.1.1.3  joerg 	.p2align 2
     24  1.1.1.4  joerg #if __ARM_ARCH_ISA_THUMB == 2
     25  1.1.1.4  joerg DEFINE_COMPILERRT_THUMB_FUNCTION(__bswapdi2)
     26  1.1.1.4  joerg #else
     27      1.1  joerg DEFINE_COMPILERRT_FUNCTION(__bswapdi2)
     28  1.1.1.4  joerg #endif
     29      1.1  joerg #if __ARM_ARCH < 6
     30      1.1  joerg     // before armv6 does not have "rev" instruction
     31      1.1  joerg     // r2 = rev(r0)
     32      1.1  joerg     eor r2, r0, r0, ror #16
     33      1.1  joerg     bic r2, r2, #0xff0000
     34      1.1  joerg     mov r2, r2, lsr #8
     35      1.1  joerg     eor r2, r2, r0, ror #8
     36      1.1  joerg     // r0 = rev(r1)
     37      1.1  joerg     eor r0, r1, r1, ror #16
     38      1.1  joerg     bic r0, r0, #0xff0000
     39      1.1  joerg     mov r0, r0, lsr #8
     40      1.1  joerg     eor r0, r0, r1, ror #8
     41      1.1  joerg #else
     42      1.1  joerg     rev r2, r0  // r2 = rev(r0)
     43      1.1  joerg     rev r0, r1  // r0 = rev(r1)
     44      1.1  joerg #endif
     45      1.1  joerg     mov r1, r2  // r1 = r2 = rev(r0)
     46      1.1  joerg     JMP(lr)
     47      1.1  joerg END_COMPILERRT_FUNCTION(__bswapdi2)
     48