bswapdi2.S 1.1 KB

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