162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* IEEE754 floating point arithmetic 362306a36Sopenharmony_ci * double precision: common utilities 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 "ieee754dp.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciunion ieee754dp ieee754dp_neg(union ieee754dp x) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci union ieee754dp y; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci if (ieee754_csr.abs2008) { 1762306a36Sopenharmony_ci y = x; 1862306a36Sopenharmony_ci DPSIGN(y) = !DPSIGN(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 = ieee754dp_sub(ieee754dp_zero(0), x); 2562306a36Sopenharmony_ci ieee754_csr.rm = oldrm; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci return y; 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciunion ieee754dp ieee754dp_abs(union ieee754dp x) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci union ieee754dp y; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci if (ieee754_csr.abs2008) { 3562306a36Sopenharmony_ci y = x; 3662306a36Sopenharmony_ci DPSIGN(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 (DPSIGN(x)) 4362306a36Sopenharmony_ci y = ieee754dp_sub(ieee754dp_zero(0), x); 4462306a36Sopenharmony_ci else 4562306a36Sopenharmony_ci y = ieee754dp_add(ieee754dp_zero(0), x); 4662306a36Sopenharmony_ci ieee754_csr.rm = oldrm; 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci return y; 4962306a36Sopenharmony_ci} 50