1 /* RX C ABI functions
2 Copyright (C) 2009-2018 Free Software Foundation, Inc.
3 Contributed by Red Hat.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
20
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3. If not see
23 <http://www.gnu.org/licenses/>. */
24
25
26 /* The RX C ABI includes the specification of a set of compiler support
27 functions. Libgcc2 includes some of them, although the names have to
28 be changed (see rx-abi.h), and the rest are defined here.
29
30 FIXME: Given that FINE_GRAINED_LIBRARIES is defined we ought to consider
31 compiling this file multiple times with one function per iteration being
32 compiled. */
33
34 #ifdef __RX_64BIT_DOUBLES__
35
_COM_CMPLTd(double a,double b)36 int _COM_CMPLTd (double a, double b) { return __ltdf2 (a, b) == -1; }
_COM_CMPGTd(double a,double b)37 int _COM_CMPGTd (double a, double b) { return __gtdf2 (a, b) == 1; }
_COM_CMPLEd(double a,double b)38 int _COM_CMPLEd (double a, double b) { return __ledf2 (a, b) != 1; }
_COM_CMPGEd(double a,double b)39 int _COM_CMPGEd (double a, double b) { return __gedf2 (a, b) != -1; }
_COM_CMPEQd(double a,double b)40 int _COM_CMPEQd (double a, double b) { return __eqdf2 (a, b) == 0; }
_COM_CMPNEd(double a,double b)41 int _COM_CMPNEd (double a, double b) { return __nedf2 (a, b) != 0; }
42
43 int _COM_CMPLTf (double, double) __attribute__ ((weak, alias ("_COM_CMPLTd")));
44 int _COM_CMPGTf (double, double) __attribute__ ((weak, alias ("_COM_CMPGTd")));
45 int _COM_CMPLEf (double, double) __attribute__ ((weak, alias ("_COM_CMPLEd")));
46 int _COM_CMPGEf (double, double) __attribute__ ((weak, alias ("_COM_CMPGEd")));
47 int _COM_CMPEQf (double, double) __attribute__ ((weak, alias ("_COM_CMPEQd")));
48 int _COM_CMPNEf (double, double) __attribute__ ((weak, alias ("_COM_CMPNEd")));
49
50 #else /* 32-bit doubles. */
51
_COM_CONVfd(float a)52 double _COM_CONVfd (float a) { return a; }
_COM_CONVdf(double a)53 float _COM_CONVdf (double a) { return a; }
54
55 int _COM_CMPLTd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPLTf")));
56 int _COM_CMPGTd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPGTf")));
57 int _COM_CMPLEd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPLEf")));
58 int _COM_CMPGEd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPGEf")));
59 int _COM_CMPEQd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPEQf")));
60 int _COM_CMPNEd (double a, double b) __attribute__ ((weak, alias ("_COM_CMPNEf")));
61
_COM_CONVd64s(double a)62 signed long long _COM_CONVd64s (double a) { return (signed long long) a; }
_COM_CONVd64u(double a)63 unsigned long long _COM_CONVd64u (double a) { return (unsigned long long) a; }
64
_COM_CMPLTf(float a,float b)65 int _COM_CMPLTf (float a, float b) { return __ltsf2 (a, b) == -1; }
_COM_CMPGTf(float a,float b)66 int _COM_CMPGTf (float a, float b) { return __gtsf2 (a, b) == 1; }
_COM_CMPLEf(float a,float b)67 int _COM_CMPLEf (float a, float b) { return __lesf2 (a, b) != 1; }
_COM_CMPGEf(float a,float b)68 int _COM_CMPGEf (float a, float b) { return __gesf2 (a, b) != -1; }
_COM_CMPEQf(float a,float b)69 int _COM_CMPEQf (float a, float b) { return __eqsf2 (a, b) == 0; }
_COM_CMPNEf(float a,float b)70 int _COM_CMPNEf (float a, float b) { return __nesf2 (a, b) != 0; }
71
72 #endif /* 64-bit vs 32-bit doubles. */
73
_COM_CONV64sd(signed long long a)74 double _COM_CONV64sd (signed long long a) { return (double) a; }
_COM_CONV64ud(unsigned long long a)75 double _COM_CONV64ud (unsigned long long a) { return (double) a; }
76
77 extern int __cmpdi2 (long long, long long);
78 extern int __ucmpdi2 (long long, long long);
79
_COM_CMPLT64s(long long a,long long b)80 int _COM_CMPLT64s (long long a, long long b) { return __cmpdi2 (a, b) == 0; }
_COM_CMPLT64u(long long a,long long b)81 int _COM_CMPLT64u (long long a, long long b) { return __ucmpdi2 (a, b) == 0; }
_COM_CMPGT64s(long long a,long long b)82 int _COM_CMPGT64s (long long a, long long b) { return __cmpdi2 (a, b) == 2; }
_COM_CMPGT64u(long long a,long long b)83 int _COM_CMPGT64u (long long a, long long b) { return __ucmpdi2 (a, b) == 2; }
_COM_CMPLE64s(long long a,long long b)84 int _COM_CMPLE64s (long long a, long long b) { return __cmpdi2 (a, b) != 2; }
_COM_CMPLE64u(long long a,long long b)85 int _COM_CMPLE64u (long long a, long long b) { return __ucmpdi2 (a, b) != 2; }
_COM_CMPGE64s(long long a,long long b)86 int _COM_CMPGE64s (long long a, long long b) { return __cmpdi2 (a, b) != 0; }
_COM_CMPGE64u(long long a,long long b)87 int _COM_CMPGE64u (long long a, long long b) { return __ucmpdi2 (a, b) != 0; }
_COM_CMPEQ64(long long a,long long b)88 int _COM_CMPEQ64 (long long a, long long b) { return __cmpdi2 (a, b) == 1; }
_COM_CMPNE64(long long a,long long b)89 int _COM_CMPNE64 (long long a, long long b) { return __cmpdi2 (a, b) != 1; }
90
91