forked from Minki/linux
198f70589e
Implement IEEE Std 754-2008 non-arithmetic ABS.fmt and NEG.fmt emulation wired to the state of the FCSR.ABS2008 bit. In the non-arithmetic mode the sign bit is altered according to the operation requested regardless of the datum encoded in the input operand, no other bits are changed, the resulting bit pattern is written to the output operand and no exception is ever signalled. Signed-off-by: Maciej W. Rozycki <macro@imgtec.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Matthew Fortune <Matthew.Fortune@imgtec.com> Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/11476/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
/* IEEE754 floating point arithmetic
|
|
* single precision
|
|
*/
|
|
/*
|
|
* MIPS floating point support
|
|
* Copyright (C) 1994-2000 Algorithmics Ltd.
|
|
*
|
|
* This program is free software; you can distribute it and/or modify it
|
|
* under the terms of the GNU General Public License (Version 2) as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include "ieee754sp.h"
|
|
|
|
union ieee754sp ieee754sp_neg(union ieee754sp x)
|
|
{
|
|
union ieee754sp y;
|
|
|
|
if (ieee754_csr.abs2008) {
|
|
y = x;
|
|
SPSIGN(y) = !SPSIGN(x);
|
|
} else {
|
|
unsigned int oldrm;
|
|
|
|
oldrm = ieee754_csr.rm;
|
|
ieee754_csr.rm = FPU_CSR_RD;
|
|
y = ieee754sp_sub(ieee754sp_zero(0), x);
|
|
ieee754_csr.rm = oldrm;
|
|
}
|
|
return y;
|
|
}
|
|
|
|
union ieee754sp ieee754sp_abs(union ieee754sp x)
|
|
{
|
|
union ieee754sp y;
|
|
|
|
if (ieee754_csr.abs2008) {
|
|
y = x;
|
|
SPSIGN(y) = 0;
|
|
} else {
|
|
unsigned int oldrm;
|
|
|
|
oldrm = ieee754_csr.rm;
|
|
ieee754_csr.rm = FPU_CSR_RD;
|
|
if (SPSIGN(x))
|
|
y = ieee754sp_sub(ieee754sp_zero(0), x);
|
|
else
|
|
y = ieee754sp_add(ieee754sp_zero(0), x);
|
|
ieee754_csr.rm = oldrm;
|
|
}
|
|
return y;
|
|
}
|