162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/* IEEE754 floating point arithmetic
362306a36Sopenharmony_ci * single precision
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * MIPS floating point support
762306a36Sopenharmony_ci * Copyright (C) 1994-2000 Algorithmics Ltd.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "ieee754sp.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciunion ieee754sp ieee754sp_neg(union ieee754sp x)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	union ieee754sp y;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	if (ieee754_csr.abs2008) {
1762306a36Sopenharmony_ci		y = x;
1862306a36Sopenharmony_ci		SPSIGN(y) = !SPSIGN(x);
1962306a36Sopenharmony_ci	} else {
2062306a36Sopenharmony_ci		unsigned int oldrm;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci		oldrm = ieee754_csr.rm;
2362306a36Sopenharmony_ci		ieee754_csr.rm = FPU_CSR_RD;
2462306a36Sopenharmony_ci		y = ieee754sp_sub(ieee754sp_zero(0), x);
2562306a36Sopenharmony_ci		ieee754_csr.rm = oldrm;
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci	return y;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciunion ieee754sp ieee754sp_abs(union ieee754sp x)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	union ieee754sp y;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (ieee754_csr.abs2008) {
3562306a36Sopenharmony_ci		y = x;
3662306a36Sopenharmony_ci		SPSIGN(y) = 0;
3762306a36Sopenharmony_ci	} else {
3862306a36Sopenharmony_ci		unsigned int oldrm;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		oldrm = ieee754_csr.rm;
4162306a36Sopenharmony_ci		ieee754_csr.rm = FPU_CSR_RD;
4262306a36Sopenharmony_ci		if (SPSIGN(x))
4362306a36Sopenharmony_ci			y = ieee754sp_sub(ieee754sp_zero(0), x);
4462306a36Sopenharmony_ci		else
4562306a36Sopenharmony_ci			y = ieee754sp_add(ieee754sp_zero(0), x);
4662306a36Sopenharmony_ci		ieee754_csr.rm = oldrm;
4762306a36Sopenharmony_ci	}
4862306a36Sopenharmony_ci	return y;
4962306a36Sopenharmony_ci}
50