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