162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * IEEE754 floating point arithmetic
462306a36Sopenharmony_ci * double precision: CLASS.f
562306a36Sopenharmony_ci * FPR[fd] = class(FPR[fs])
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * MIPS floating point support
862306a36Sopenharmony_ci * Copyright (C) 2015 Imagination Technologies, Ltd.
962306a36Sopenharmony_ci * Author: Markos Chandras <markos.chandras@imgtec.com>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "ieee754dp.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciint ieee754dp_2008class(union ieee754dp x)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	COMPXDP;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	EXPLODEXDP;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	/*
2162306a36Sopenharmony_ci	 * 10 bit mask as follows:
2262306a36Sopenharmony_ci	 *
2362306a36Sopenharmony_ci	 * bit0 = SNAN
2462306a36Sopenharmony_ci	 * bit1 = QNAN
2562306a36Sopenharmony_ci	 * bit2 = -INF
2662306a36Sopenharmony_ci	 * bit3 = -NORM
2762306a36Sopenharmony_ci	 * bit4 = -DNORM
2862306a36Sopenharmony_ci	 * bit5 = -ZERO
2962306a36Sopenharmony_ci	 * bit6 = INF
3062306a36Sopenharmony_ci	 * bit7 = NORM
3162306a36Sopenharmony_ci	 * bit8 = DNORM
3262306a36Sopenharmony_ci	 * bit9 = ZERO
3362306a36Sopenharmony_ci	 */
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	switch(xc) {
3662306a36Sopenharmony_ci	case IEEE754_CLASS_SNAN:
3762306a36Sopenharmony_ci		return 0x01;
3862306a36Sopenharmony_ci	case IEEE754_CLASS_QNAN:
3962306a36Sopenharmony_ci		return 0x02;
4062306a36Sopenharmony_ci	case IEEE754_CLASS_INF:
4162306a36Sopenharmony_ci		return 0x04 << (xs ? 0 : 4);
4262306a36Sopenharmony_ci	case IEEE754_CLASS_NORM:
4362306a36Sopenharmony_ci		return 0x08 << (xs ? 0 : 4);
4462306a36Sopenharmony_ci	case IEEE754_CLASS_DNORM:
4562306a36Sopenharmony_ci		return 0x10 << (xs ? 0 : 4);
4662306a36Sopenharmony_ci	case IEEE754_CLASS_ZERO:
4762306a36Sopenharmony_ci		return 0x20 << (xs ? 0 : 4);
4862306a36Sopenharmony_ci	default:
4962306a36Sopenharmony_ci		pr_err("Unknown class: %d\n", xc);
5062306a36Sopenharmony_ci		return 0;
5162306a36Sopenharmony_ci	}
5262306a36Sopenharmony_ci}
53