xref: /linux/arch/mips/math-emu/dp_simple.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*9d5a6349SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /* IEEE754 floating point arithmetic
31da177e4SLinus Torvalds  * double precision: common utilities
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 "ieee754dp.h"
111da177e4SLinus Torvalds 
ieee754dp_neg(union ieee754dp x)122209bcb1SRalf Baechle union ieee754dp ieee754dp_neg(union ieee754dp x)
131da177e4SLinus Torvalds {
14232b6ec5SMaciej W. Rozycki 	union ieee754dp y;
151da177e4SLinus Torvalds 
16198f7058SMaciej W. Rozycki 	if (ieee754_csr.abs2008) {
17198f7058SMaciej W. Rozycki 		y = x;
18198f7058SMaciej W. Rozycki 		DPSIGN(y) = !DPSIGN(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 = ieee754dp_sub(ieee754dp_zero(0), x);
25232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = oldrm;
26198f7058SMaciej W. Rozycki 	}
27232b6ec5SMaciej W. Rozycki 	return y;
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds 
ieee754dp_abs(union ieee754dp x)302209bcb1SRalf Baechle union ieee754dp ieee754dp_abs(union ieee754dp x)
311da177e4SLinus Torvalds {
32232b6ec5SMaciej W. Rozycki 	union ieee754dp y;
331da177e4SLinus Torvalds 
34198f7058SMaciej W. Rozycki 	if (ieee754_csr.abs2008) {
35198f7058SMaciej W. Rozycki 		y = x;
36198f7058SMaciej W. Rozycki 		DPSIGN(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 (DPSIGN(x))
43232b6ec5SMaciej W. Rozycki 			y = ieee754dp_sub(ieee754dp_zero(0), x);
44232b6ec5SMaciej W. Rozycki 		else
45232b6ec5SMaciej W. Rozycki 			y = ieee754dp_add(ieee754dp_zero(0), x);
46232b6ec5SMaciej W. Rozycki 		ieee754_csr.rm = oldrm;
47198f7058SMaciej W. Rozycki 	}
48232b6ec5SMaciej W. Rozycki 	return y;
491da177e4SLinus Torvalds }
50