xref: /linux/arch/mips/math-emu/sp_simple.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic
31da177e4SLinus Torvalds  * single precision
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  * MIPS floating point support
71da177e4SLinus Torvalds  * Copyright (C) 1994-2000 Algorithmics Ltd.
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include "ieee754sp.h"
111da177e4SLinus Torvalds 
ieee754sp_neg(union ieee754sp x)122209bcb1SRalf Baechle union ieee754sp ieee754sp_neg(union ieee754sp x)
131da177e4SLinus Torvalds {
14232b6ec5SMaciej W. Rozycki 	union ieee754sp y;
151da177e4SLinus Torvalds 
16198f7058SMaciej W. Rozycki 	if (ieee754_csr.abs2008) {
17198f7058SMaciej W. Rozycki 		y = x;
18198f7058SMaciej W. Rozycki 		SPSIGN(y) = !SPSIGN(x);
19198f7058SMaciej W. Rozycki 	} else {
20198f7058SMaciej W. Rozycki 		unsigned int oldrm;
21198f7058SMaciej W. Rozycki 
22232b6ec5SMaciej W. Rozycki 		oldrm = ieee754_csr.rm;
23232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = FPU_CSR_RD;
24232b6ec5SMaciej W. Rozycki 		y = ieee754sp_sub(ieee754sp_zero(0), x);
25232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = oldrm;
26198f7058SMaciej W. Rozycki 	}
27232b6ec5SMaciej W. Rozycki 	return y;
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds 
ieee754sp_abs(union ieee754sp x)302209bcb1SRalf Baechle union ieee754sp ieee754sp_abs(union ieee754sp x)
311da177e4SLinus Torvalds {
32232b6ec5SMaciej W. Rozycki 	union ieee754sp y;
331da177e4SLinus Torvalds 
34198f7058SMaciej W. Rozycki 	if (ieee754_csr.abs2008) {
35198f7058SMaciej W. Rozycki 		y = x;
36198f7058SMaciej W. Rozycki 		SPSIGN(y) = 0;
37198f7058SMaciej W. Rozycki 	} else {
38198f7058SMaciej W. Rozycki 		unsigned int oldrm;
39198f7058SMaciej W. Rozycki 
40232b6ec5SMaciej W. Rozycki 		oldrm = ieee754_csr.rm;
41232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = FPU_CSR_RD;
42232b6ec5SMaciej W. Rozycki 		if (SPSIGN(x))
43232b6ec5SMaciej W. Rozycki 			y = ieee754sp_sub(ieee754sp_zero(0), x);
44232b6ec5SMaciej W. Rozycki 		else
45232b6ec5SMaciej W. Rozycki 			y = ieee754sp_add(ieee754sp_zero(0), x);
46232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = oldrm;
47198f7058SMaciej W. Rozycki 	}
48232b6ec5SMaciej W. Rozycki 	return y;
491da177e4SLinus Torvalds }
50