Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / arch / mips / math-emu / sp_cmp.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* IEEE754 floating point arithmetic
3  * single precision
4  */
5 /*
6  * MIPS floating point support
7  * Copyright (C) 1994-2000 Algorithmics Ltd.
8  */
9
10 #include "ieee754sp.h"
11
12 int ieee754sp_cmp(union ieee754sp x, union ieee754sp y, int cmp, int sig)
13 {
14         int vx;
15         int vy;
16
17         COMPXSP;
18         COMPYSP;
19
20         EXPLODEXSP;
21         EXPLODEYSP;
22         FLUSHXSP;
23         FLUSHYSP;
24         ieee754_clearcx();      /* Even clear inexact flag here */
25
26         if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) {
27                 if (sig ||
28                     xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
29                         ieee754_setcx(IEEE754_INVALID_OPERATION);
30                 return (cmp & IEEE754_CUN) != 0;
31         } else {
32                 vx = x.bits;
33                 vy = y.bits;
34
35                 if (vx < 0)
36                         vx = -vx ^ SP_SIGN_BIT;
37                 if (vy < 0)
38                         vy = -vy ^ SP_SIGN_BIT;
39
40                 if (vx < vy)
41                         return (cmp & IEEE754_CLT) != 0;
42                 else if (vx == vy)
43                         return (cmp & IEEE754_CEQ) != 0;
44                 else
45                         return (cmp & IEEE754_CGT) != 0;
46         }
47 }