aeabi_dcmp.S 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //===-- aeabi_dcmp.S - EABI dcmp* implementation ---------------------------===//
  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. // int __aeabi_dcmp{eq,lt,le,ge,gt}(double a, double b) {
  10. // int result = __{eq,lt,le,ge,gt}df2(a, b);
  11. // if (result {==,<,<=,>=,>} 0) {
  12. // return 1;
  13. // } else {
  14. // return 0;
  15. // }
  16. // }
  17. #if defined(COMPILER_RT_ARMHF_TARGET)
  18. # define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
  19. vmov d0, r0, r1 SEPARATOR \
  20. vmov d1, r2, r3
  21. #else
  22. # define CONVERT_DCMP_ARGS_TO_DF2_ARGS
  23. #endif
  24. #define DEFINE_AEABI_DCMP(cond) \
  25. .syntax unified SEPARATOR \
  26. .p2align 2 SEPARATOR \
  27. DEFINE_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond) \
  28. push { r4, lr } SEPARATOR \
  29. CONVERT_DCMP_ARGS_TO_DF2_ARGS SEPARATOR \
  30. bl SYMBOL_NAME(__ ## cond ## df2) SEPARATOR \
  31. cmp r0, #0 SEPARATOR \
  32. b ## cond 1f SEPARATOR \
  33. movs r0, #0 SEPARATOR \
  34. pop { r4, pc } SEPARATOR \
  35. 1: SEPARATOR \
  36. movs r0, #1 SEPARATOR \
  37. pop { r4, pc } SEPARATOR \
  38. END_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond)
  39. DEFINE_AEABI_DCMP(eq)
  40. DEFINE_AEABI_DCMP(lt)
  41. DEFINE_AEABI_DCMP(le)
  42. DEFINE_AEABI_DCMP(ge)
  43. DEFINE_AEABI_DCMP(gt)
  44. NO_EXEC_STACK_DIRECTIVE