1*0b57cec5SDimitry Andric//===------- bswapsi2 - Implement bswapsi2 --------------------------------===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric#include "../assembly.h" 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric .syntax unified 12*0b57cec5SDimitry Andric .text 13*0b57cec5SDimitry Andric DEFINE_CODE_STATE 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric// 16*0b57cec5SDimitry Andric// extern uint32_t __bswapsi2(uint32_t); 17*0b57cec5SDimitry Andric// 18*0b57cec5SDimitry Andric// Reverse all the bytes in a 32-bit integer. 19*0b57cec5SDimitry Andric// 20*0b57cec5SDimitry Andric .p2align 2 21*0b57cec5SDimitry AndricDEFINE_COMPILERRT_FUNCTION(__bswapsi2) 22*0b57cec5SDimitry Andric#if __ARM_ARCH < 6 23*0b57cec5SDimitry Andric // before armv6 does not have "rev" instruction 24*0b57cec5SDimitry Andric eor r1, r0, r0, ror #16 25*0b57cec5SDimitry Andric bic r1, r1, #0xff0000 26*0b57cec5SDimitry Andric mov r1, r1, lsr #8 27*0b57cec5SDimitry Andric eor r0, r1, r0, ror #8 28*0b57cec5SDimitry Andric#else 29*0b57cec5SDimitry Andric rev r0, r0 30*0b57cec5SDimitry Andric#endif 31*0b57cec5SDimitry Andric JMP(lr) 32*0b57cec5SDimitry AndricEND_COMPILERRT_FUNCTION(__bswapsi2) 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry AndricNO_EXEC_STACK_DIRECTIVE 35*0b57cec5SDimitry Andric 36