diff options
Diffstat (limited to 'arch/mips/math-emu/sp_cmp.c')
-rw-r--r-- | arch/mips/math-emu/sp_cmp.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/mips/math-emu/sp_cmp.c b/arch/mips/math-emu/sp_cmp.c new file mode 100644 index 000000000..64a37362a --- /dev/null +++ b/arch/mips/math-emu/sp_cmp.c | |||
@@ -0,0 +1,47 @@ | |||
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 | } | ||