1//===-- aeabi_fcmp.S - EABI fcmp* 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_fcmp{eq,lt,le,ge,gt}(float a, float b) {
12//   int result = __{eq,lt,le,ge,gt}sf2(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_FCMP_ARGS_TO_SF2_ARGS                    \
22        vmov      s0, r0                         SEPARATOR \
23        vmov      s1, r1
24#else
25#  define CONVERT_FCMP_ARGS_TO_SF2_ARGS
26#endif
27
28#define DEFINE_AEABI_FCMP(cond)                            \
29        .syntax unified                          SEPARATOR \
30        .p2align 2                               SEPARATOR \
31DEFINE_COMPILERRT_FUNCTION(__aeabi_fcmp ## cond)           \
32        push      { r4, lr }                     SEPARATOR \
33        CONVERT_FCMP_ARGS_TO_SF2_ARGS            SEPARATOR \
34        bl        SYMBOL_NAME(__ ## cond ## sf2) SEPARATOR \
35        cmp       r0, #0                         SEPARATOR \
36        b ## cond 1f                             SEPARATOR \
37        movs      r0, #0                         SEPARATOR \
38        pop       { r4, pc }                     SEPARATOR \
391:                                               SEPARATOR \
40        movs      r0, #1                         SEPARATOR \
41        pop       { r4, pc }                     SEPARATOR \
42END_COMPILERRT_FUNCTION(__aeabi_fcmp ## cond)
43
44DEFINE_AEABI_FCMP(eq)
45DEFINE_AEABI_FCMP(lt)
46DEFINE_AEABI_FCMP(le)
47DEFINE_AEABI_FCMP(ge)
48DEFINE_AEABI_FCMP(gt)
49
50NO_EXEC_STACK_DIRECTIVE
51
52