1276789Sdim//===-- aeabi_dcmp.S - EABI dcmp* implementation ---------------------------===//
2276789Sdim//
3276789Sdim//                     The LLVM Compiler Infrastructure
4276789Sdim//
5276789Sdim// This file is dual licensed under the MIT and the University of Illinois Open
6276789Sdim// Source Licenses. See LICENSE.TXT for details.
7276789Sdim//
8276789Sdim//===----------------------------------------------------------------------===//
9276789Sdim
10276789Sdim#include "../assembly.h"
11276789Sdim
12276789Sdim// int __aeabi_dcmp{eq,lt,le,ge,gt}(double a, double b) {
13276789Sdim//   int result = __{eq,lt,le,ge,gt}df2(a, b);
14276789Sdim//   if (result {==,<,<=,>=,>} 0) {
15276789Sdim//     return 1;
16276789Sdim//   } else {
17276789Sdim//     return 0;
18276789Sdim//   }
19276789Sdim// }
20276789Sdim
21276789Sdim#define DEFINE_AEABI_DCMP(cond)                            \
22276789Sdim        .syntax unified                          SEPARATOR \
23276789Sdim        .p2align 2                               SEPARATOR \
24276789SdimDEFINE_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond)           \
25276789Sdim        push      { r4, lr }                     SEPARATOR \
26276789Sdim        bl        SYMBOL_NAME(__ ## cond ## df2) SEPARATOR \
27276789Sdim        cmp       r0, #0                         SEPARATOR \
28276789Sdim        b ## cond 1f                             SEPARATOR \
29276789Sdim        mov       r0, #0                         SEPARATOR \
30276789Sdim        pop       { r4, pc }                     SEPARATOR \
31276789Sdim1:                                               SEPARATOR \
32276789Sdim        mov       r0, #1                         SEPARATOR \
33276789Sdim        pop       { r4, pc }                     SEPARATOR \
34276789SdimEND_COMPILERRT_FUNCTION(__aeabi_dcmp ## cond)
35276789Sdim
36276789SdimDEFINE_AEABI_DCMP(eq)
37276789SdimDEFINE_AEABI_DCMP(lt)
38276789SdimDEFINE_AEABI_DCMP(le)
39276789SdimDEFINE_AEABI_DCMP(ge)
40276789SdimDEFINE_AEABI_DCMP(gt)
41