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