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_ciint ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cmp, int sig)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	s64 vx;
1562306a36Sopenharmony_ci	s64 vy;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	COMPXDP;
1862306a36Sopenharmony_ci	COMPYDP;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	EXPLODEXDP;
2162306a36Sopenharmony_ci	EXPLODEYDP;
2262306a36Sopenharmony_ci	FLUSHXDP;
2362306a36Sopenharmony_ci	FLUSHYDP;
2462306a36Sopenharmony_ci	ieee754_clearcx();	/* Even clear inexact flag here */
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (ieee754_class_nan(xc) || ieee754_class_nan(yc)) {
2762306a36Sopenharmony_ci		if (sig ||
2862306a36Sopenharmony_ci		    xc == IEEE754_CLASS_SNAN || yc == IEEE754_CLASS_SNAN)
2962306a36Sopenharmony_ci			ieee754_setcx(IEEE754_INVALID_OPERATION);
3062306a36Sopenharmony_ci		return (cmp & IEEE754_CUN) != 0;
3162306a36Sopenharmony_ci	} else {
3262306a36Sopenharmony_ci		vx = x.bits;
3362306a36Sopenharmony_ci		vy = y.bits;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci		if (vx < 0)
3662306a36Sopenharmony_ci			vx = -vx ^ DP_SIGN_BIT;
3762306a36Sopenharmony_ci		if (vy < 0)
3862306a36Sopenharmony_ci			vy = -vy ^ DP_SIGN_BIT;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		if (vx < vy)
4162306a36Sopenharmony_ci			return (cmp & IEEE754_CLT) != 0;
4262306a36Sopenharmony_ci		else if (vx == vy)
4362306a36Sopenharmony_ci			return (cmp & IEEE754_CEQ) != 0;
4462306a36Sopenharmony_ci		else
4562306a36Sopenharmony_ci			return (cmp & IEEE754_CGT) != 0;
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci}
48