1fe22a3f1e1abddc4a512aa8f9bed64b3ada78094Stephen Canon//===------- bswapdi2 - Implement bswapdi2 --------------------------------===//
2e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
3e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//                     The LLVM Compiler Infrastructure
4e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
8e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//===----------------------------------------------------------------------===//
9e80e978d6aa211056beddf4582390e374d1935abNick Kledzik
1019336a2d6b9b375ac106125950f4ff09742d1aecDaniel Dunbar#include "../assembly.h"
11e80e978d6aa211056beddf4582390e374d1935abNick Kledzik
12e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
13e80e978d6aa211056beddf4582390e374d1935abNick Kledzik// extern uint64_t __bswapdi2(uint64_t);
14e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
15e80e978d6aa211056beddf4582390e374d1935abNick Kledzik// Reverse all the bytes in a 64-bit integer.
16e80e978d6aa211056beddf4582390e374d1935abNick Kledzik//
17e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon.align 2
18b4b1e8c5085cf83a50242057775a33ae4323d402Daniel DunbarDEFINE_COMPILERRT_FUNCTION(__bswapdi2)
19455c2633311fe29b036a53eb466f6d65af97de4fNick Kledzik#if __ARM_ARCH_5TEJ__ || __ARM_ARCH_4T__
20e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    // before armv6 does not have "rev" instruction
21e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    // r2 = rev(r0)
22e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    eor r2, r0, r0, ror #16
23e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    bic r2, r2, #0xff0000
24e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    mov r2, r2, lsr #8
25e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    eor r2, r2, r0, ror #8
26e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    // r0 = rev(r1)
27e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    eor r0, r1, r1, ror #16
28e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    bic r0, r0, #0xff0000
29e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    mov r0, r0, lsr #8
30e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    eor r0, r0, r1, ror #8
31455c2633311fe29b036a53eb466f6d65af97de4fNick Kledzik#else
32e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    rev r2, r0  // r2 = rev(r0)
33e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    rev r0, r1  // r0 = rev(r1)
34455c2633311fe29b036a53eb466f6d65af97de4fNick Kledzik#endif
35e735b297d08ea30dee8828ce18bfbe6c3e72c0f7Stephen Canon    mov r1, r2  // r1 = r2 = rev(r0)
36fe22a3f1e1abddc4a512aa8f9bed64b3ada78094Stephen Canon    bx  lr
37