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
9#include "../assembly.h"
10
11// int __aeabi_dcmp{eq,lt,le,ge,gt}(double a, double b) {
12// int result = __{eq,lt,le,ge,gt}df2(a, b);
13// if (result {==,<,<=,>=,>} 0) {
14// return 1;
15// } else {
16// return 0;
17// }
18// }
19
20#if defined(COMPILER_RT_ARMHF_TARGET)
21# define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
22 VMOV_TO_DOUBLE(d0, r0, r1) \
23 VMOV_TO_DOUBLE(d1, r2, r3)
24#else
25# define CONVERT_DCMP_ARGS_TO_DF2_ARGS
26#endif
27
28#if defined(__ARM_FEATURE_PAC_DEFAULT)
29# define PROLOGUE PACBTI_LANDING SEPARATOR \
30 push { r12, lr }
31# define EPILOGUE pop { r12, lr } SEPARATOR \
32 bxaut r12, lr, sp
33#elif defined(__ARM_FEATURE_BTI_DEFAULT)
34# define PROLOGUE PACBTI_LANDING SEPARATOR \
35 push { r4, lr }
36# define EPILOGUE pop { r4, pc }
37#else
38# define PROLOGUE push { r4, lr }
39# define EPILOGUE pop { r4, pc }
40#endif
41
42#define DEFINE_AEABI_DCMP(cond) \
43 .syntax unified SEPARATOR \
44 .p2align 2 SEPARATOR \
45DEFINE_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond) \
46 PROLOGUE SEPARATOR \
47 CONVERT_DCMP_ARGS_TO_DF2_ARGS SEPARATOR \
48 bl SYMBOL_NAME(__ ## cond ## df2) SEPARATOR \
49 cmp r0, #0 SEPARATOR \
50 b ## cond 1f SEPARATOR \
51 movs r0, #0 SEPARATOR \
52 EPILOGUE SEPARATOR \
531: SEPARATOR \
54 movs r0, #1 SEPARATOR \
55 EPILOGUE SEPARATOR \
56END_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond)
57
58DEFINE_AEABI_DCMP(eq)
59DEFINE_AEABI_DCMP(lt)
60DEFINE_AEABI_DCMP(le)
61DEFINE_AEABI_DCMP(ge)
62DEFINE_AEABI_DCMP(gt)
63
64NO_EXEC_STACK_DIRECTIVE
65
66

Provided by KDAB

Privacy Policy
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more

source code of compiler-rt/lib/builtins/arm/aeabi_dcmp.S