blob: b9e91da7dfbf4e4d07037c34af0d3a954ce3e6e7 [file] [log] [blame]
Thomas Gleixner9d5a6342019-05-31 01:09:55 -07001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/* IEEE754 floating point arithmetic
3 * single precision
4 */
5/*
6 * MIPS floating point support
7 * Copyright (C) 1994-2000 Algorithmics Ltd.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 */
9
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include "ieee754sp.h"
11
Ralf Baechle2209bcb2014-04-16 01:31:11 +020012union ieee754sp ieee754sp_neg(union ieee754sp x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070013{
Maciej W. Rozycki232b6ec2015-04-03 23:27:43 +010014 union ieee754sp y;
Linus Torvalds1da177e2005-04-16 15:20:36 -070015
Maciej W. Rozycki198f7052015-11-13 00:47:08 +000016 if (ieee754_csr.abs2008) {
17 y = x;
18 SPSIGN(y) = !SPSIGN(x);
19 } else {
20 unsigned int oldrm;
21
22 oldrm = ieee754_csr.rm;
23 ieee754_csr.rm = FPU_CSR_RD;
24 y = ieee754sp_sub(ieee754sp_zero(0), x);
25 ieee754_csr.rm = oldrm;
26 }
Maciej W. Rozycki232b6ec2015-04-03 23:27:43 +010027 return y;
Linus Torvalds1da177e2005-04-16 15:20:36 -070028}
29
Ralf Baechle2209bcb2014-04-16 01:31:11 +020030union ieee754sp ieee754sp_abs(union ieee754sp x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070031{
Maciej W. Rozycki232b6ec2015-04-03 23:27:43 +010032 union ieee754sp y;
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Maciej W. Rozycki198f7052015-11-13 00:47:08 +000034 if (ieee754_csr.abs2008) {
35 y = x;
36 SPSIGN(y) = 0;
37 } else {
38 unsigned int oldrm;
39
40 oldrm = ieee754_csr.rm;
41 ieee754_csr.rm = FPU_CSR_RD;
42 if (SPSIGN(x))
43 y = ieee754sp_sub(ieee754sp_zero(0), x);
44 else
45 y = ieee754sp_add(ieee754sp_zero(0), x);
46 ieee754_csr.rm = oldrm;
47 }
Maciej W. Rozycki232b6ec2015-04-03 23:27:43 +010048 return y;
Linus Torvalds1da177e2005-04-16 15:20:36 -070049}