forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIPS: math-emu: Add support for the MIPS R6 MAX{, A} FPU instruction
MIPS R6 introduced the following instruction: Scalar Floating-Point Maximum and Scalar Floating-Point argument with Maximum Absolute Value MAX.fmt writes the maximum value of the inputs fs and ft to the destination fd. MAXA.fmt takes input arguments fs and ft and writes the argument with the maximum absolute value to the destination fd. Signed-off-by: Markos Chandras <[email protected]> Cc: [email protected] Patchwork: https://patchwork.linux-mips.org/patch/10961/ Signed-off-by: Ralf Baechle <[email protected]>
- Loading branch information
1 parent
4e9561b
commit a79f5f9
Showing
5 changed files
with
480 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,213 @@ | ||
/* | ||
* IEEE754 floating point arithmetic | ||
* double precision: MIN{,A}.f | ||
* MIN : Scalar Floating-Point Minimum | ||
* MINA: Scalar Floating-Point argument with Minimum Absolute Value | ||
* | ||
* MIN.D : FPR[fd] = minNum(FPR[fs],FPR[ft]) | ||
* MINA.D: FPR[fd] = maxNumMag(FPR[fs],FPR[ft]) | ||
* | ||
* MIPS floating point support | ||
* Copyright (C) 2015 Imagination Technologies, Ltd. | ||
* Author: Markos Chandras <[email protected]> | ||
* | ||
* This program is free software; you can distribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; version 2 of the License. | ||
*/ | ||
|
||
#include "ieee754dp.h" | ||
|
||
union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y) | ||
{ | ||
COMPXDP; | ||
COMPYDP; | ||
|
||
EXPLODEXDP; | ||
EXPLODEYDP; | ||
|
||
FLUSHXDP; | ||
FLUSHYDP; | ||
|
||
ieee754_clearcx(); | ||
|
||
switch (CLPAIR(xc, yc)) { | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN): | ||
return ieee754dp_nanxcpt(y); | ||
|
||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | ||
return ieee754dp_nanxcpt(x); | ||
|
||
/* numbers are preferred to NaNs */ | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | ||
return x; | ||
|
||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF): | ||
return y; | ||
|
||
/* | ||
* Infinity and zero handling | ||
*/ | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | ||
return xs ? y : x; | ||
|
||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM): | ||
return ys ? x : y; | ||
|
||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO): | ||
if (xs == ys) | ||
return x; | ||
return ieee754dp_zero(1); | ||
|
||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM): | ||
DPDNORMX; | ||
|
||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM): | ||
DPDNORMY; | ||
break; | ||
|
||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM): | ||
DPDNORMX; | ||
} | ||
|
||
/* Finally get to do some computation */ | ||
|
||
assert(xm & DP_HIDDEN_BIT); | ||
assert(ym & DP_HIDDEN_BIT); | ||
|
||
/* Compare signs */ | ||
if (xs > ys) | ||
return y; | ||
else if (xs < ys) | ||
return x; | ||
|
||
/* Compare exponent */ | ||
if (xe > ye) | ||
return x; | ||
else if (xe < ye) | ||
return y; | ||
|
||
/* Compare mantissa */ | ||
if (xm <= ym) | ||
return y; | ||
return x; | ||
} | ||
|
||
union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y) | ||
{ | ||
COMPXDP; | ||
COMPYDP; | ||
|
||
EXPLODEXDP; | ||
EXPLODEYDP; | ||
|
||
FLUSHXDP; | ||
FLUSHYDP; | ||
|
||
ieee754_clearcx(); | ||
|
||
switch (CLPAIR(xc, yc)) { | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN): | ||
return ieee754dp_nanxcpt(y); | ||
|
||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF): | ||
return ieee754dp_nanxcpt(x); | ||
|
||
/* numbers are preferred to NaNs */ | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN): | ||
return x; | ||
|
||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF): | ||
return y; | ||
|
||
/* | ||
* Infinity and zero handling | ||
*/ | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO): | ||
return x; | ||
|
||
case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM): | ||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM): | ||
return y; | ||
|
||
case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO): | ||
if (xs == ys) | ||
return x; | ||
return ieee754dp_zero(1); | ||
|
||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM): | ||
DPDNORMX; | ||
|
||
case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM): | ||
DPDNORMY; | ||
break; | ||
|
||
case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM): | ||
DPDNORMX; | ||
} | ||
|
||
/* Finally get to do some computation */ | ||
|
||
assert(xm & DP_HIDDEN_BIT); | ||
assert(ym & DP_HIDDEN_BIT); | ||
|
||
/* Compare exponent */ | ||
if (xe > ye) | ||
return x; | ||
else if (xe < ye) | ||
return y; | ||
|
||
/* Compare mantissa */ | ||
if (xm <= ym) | ||
return y; | ||
return x; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.