64-bit integer comparison.
[kopensolaris-gnu/glibc.git] / sysdeps / wordsize-32 / cmpdi2.c
1 /* 64-bit integer comparison.
2    Copyright (C) 1989, 1992-2001, 2002 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <endian.h>
21 #include <stdlib.h>
22 #include <bits/wordsize.h>
23
24 #if __WORDSIZE != 32
25 #error This is for 32-bit targets only
26 #endif
27
28 typedef unsigned int UQItype    __attribute__ ((mode (QI)));
29 typedef          int SItype     __attribute__ ((mode (SI)));
30 typedef unsigned int USItype    __attribute__ ((mode (SI)));
31 typedef          int DItype     __attribute__ ((mode (DI)));
32 typedef unsigned int UDItype    __attribute__ ((mode (DI)));
33 #define Wtype SItype
34 #define HWtype SItype
35 #define DWtype DItype
36 #define UWtype USItype
37 #define UHWtype USItype
38 #define UDWtype UDItype
39 #define W_TYPE_SIZE 32
40
41 #include <stdlib/longlong.h>
42
43 #if __BYTE_ORDER == __BIG_ENDIAN
44 struct DWstruct { Wtype high, low;};
45 #elif __BYTE_ORDER == __LITTLE_ENDIAN
46 struct DWstruct { Wtype low, high;};
47 #else
48 #error Unhandled endianity
49 #endif
50 typedef union { struct DWstruct s; DWtype ll; } DWunion;
51
52
53 Wtype
54 __cmpdi2 (DWtype a, DWtype b)
55 {
56   DWunion au, bu;
57
58   au.ll = a, bu.ll = b;
59
60   if (au.s.high < bu.s.high)
61     return 0;
62   else if (au.s.high > bu.s.high)
63     return 2;
64   if ((UWtype) au.s.low < (UWtype) bu.s.low)
65     return 0;
66   else if ((UWtype) au.s.low > (UWtype) bu.s.low)
67     return 2;
68   return 1;
69 }
70
71
72 Wtype
73 __ucmpdi2 (DWtype a, DWtype b)
74 {
75   DWunion au, bu;
76
77   au.ll = a, bu.ll = b;
78
79   if ((UWtype) au.s.high < (UWtype) bu.s.high)
80     return 0;
81   else if ((UWtype) au.s.high > (UWtype) bu.s.high)
82     return 2;
83   if ((UWtype) au.s.low < (UWtype) bu.s.low)
84     return 0;
85   else if ((UWtype) au.s.low > (UWtype) bu.s.low)
86     return 2;
87   return 1;
88 }