Patch "MIPS: math-emu: <MADDF|MSUBF>.<D|S>: Fix some cases of infinite inputs" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
MIPS: math-emu: <MADDF|MSUBF>.<D|S>: Fix some cases of infinite inputs
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mips-math-emu-maddf-msubf-.-d-s-fix-some-cases-of-infinite-inputs.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0c64fe6348687f0e1cea9a608eae9d351124a73aMon Sep 17 00:00:00 2001
From: Aleksandar Markovic <[email protected]>
Date: Thu, 27 Jul 2017 18:08:55 +0200
Subject: MIPS: math-emu: <MADDF|MSUBF>.<D|S>: Fix some cases of infinite inputs
From: Aleksandar Markovic <[email protected]>
commit 0c64fe6348687f0e1cea9a608eae9d351124a73a upstream.
Fix the cases of <MADDF|MSUBF>.<D|S> when any of two multiplicands is infinity. The correct behavior in such cases is affected by the nature of third input. Cases of addition of infinities with opposite signs and subtraction of infinities with same signs may arise and must be handles separately. Also, the value od flags argument (that determines whether the instruction is MADDF or MSUBF) affects the outcome.
Relevant examples:
MADDF.S fd,fs,ft:
If fs contains +inf, ft contains +inf, and fd contains -inf, fd is going to contain indef (without this patch, it used to contain -inf).
MSUBF.S fd,fs,ft:
If fs contains +inf, ft contains 1.0, and fd contains +0.0, fd is going to contain -inf (without this patch, it used to contain +inf).
Patchwork: https://patchwork.linux-mips.org/patch/16887/
--- arch/mips/math-emu/dp_maddf.c | 22 +++++++++++++++++++++- arch/mips/math-emu/sp_maddf.c | 22 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-)
arch/mips/math-emu/dp_maddf.c +21 -1
@@ -84,7 +84,27 @@ static union ieee754dp _dp_maddf(union icase CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_NORM ):case CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_DNORM ):case CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_INF ): -return ieee754dp_inf (xs ^ ys); +if ((zc ==IEEE754_CLASS_INF ) && + ((!(flags & maddf_negate_product) && (zs != (xs ^ ys))) || + ((flags & maddf_negate_product) && (zs == (xs ^ ys))))) { +/* +* Cases of addition of infinities with opposite signs +* or subtraction of infinities with same signs. +*/ +ieee754_setcx (IEEE754_INVALID_OPERATION ); +return ieee754dp_indef (); + } +/* +* z is here either not an infinity, or an infinity having the +* same sign as product (x*y) (in case of MADDF.D instruction) +* or product -(x*y) (in MSUBF.D case). The result must be an +* infinity, and its sign is determined only by the value of +* (flags & maddf_negate_product) and the signs of x and y. +*/ +if (flags & maddf_negate_product) +return ieee754dp_inf (1 ^ (xs ^ ys)); +else +return ieee754dp_inf (xs ^ ys);case CLPAIR (IEEE754_CLASS_ZERO ,IEEE754_CLASS_ZERO ):case CLPAIR (IEEE754_CLASS_ZERO ,IEEE754_CLASS_NORM ):
arch/mips/math-emu/sp_maddf.c +21 -1
@@ -85,7 +85,27 @@ static union ieee754sp _sp_maddf(union icase CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_NORM ):case CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_DNORM ):case CLPAIR (IEEE754_CLASS_INF ,IEEE754_CLASS_INF ): -return ieee754sp_inf (xs ^ ys); +if ((zc ==IEEE754_CLASS_INF ) && + ((!(flags & maddf_negate_product) && (zs != (xs ^ ys))) || + ((flags & maddf_negate_product) && (zs == (xs ^ ys))))) { +/* +* Cases of addition of infinities with opposite signs +* or subtraction of infinities with same signs. +*/ +ieee754_setcx (IEEE754_INVALID_OPERATION ); +return ieee754sp_indef (); + } +/* +* z is here either not an infinity, or an infinity having the +* same sign as product (x*y) (in case of MADDF.D instruction) +* or product -(x*y) (in MSUBF.D case). The result must be an +* infinity, and its sign is determined only by the value of +* (flags & maddf_negate_product) and the signs of x and y. +*/ +if (flags & maddf_negate_product) +return ieee754sp_inf (1 ^ (xs ^ ys)); +else +return ieee754sp_inf (xs ^ ys);case CLPAIR (IEEE754_CLASS_ZERO ,IEEE754_CLASS_ZERO ):case CLPAIR (IEEE754_CLASS_ZERO ,IEEE754_CLASS_NORM ):
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/mips-math-emu-maddf-msubf-.-d-s-fix-nan-propagation.patch queue-4.13/mips-math-emu-max-maxa-min-mina-.-d-s-fix-cases-of-both-inputs-zero.patch queue-4.13/mips-math-emu-max-min-.-d-s-fix-cases-of-both-inputs-negative.patch queue-4.13/mips-math-emu-max-maxa-min-mina-.-d-s-fix-quiet-nan-propagation.patch queue-4.13/mips-math-emu-maddf-msubf-.d-fix-accuracy-64-bit-case.patch queue-4.13/mips-math-emu-maddf-msubf-.s-fix-accuracy-32-bit-case.patch queue-4.13/mips-math-emu-maxa-mina-.-d-s-fix-cases-of-input-values-with-opposite-signs.patch queue-4.13/mips-math-emu-maxa-mina-.-d-s-fix-cases-of-both-infinite-inputs.patch queue-4.13/mips-math-emu-mina.-d-s-fix-some-cases-of-infinity-and-zero-inputs.patch queue-4.13/mips-math-emu-maddf-msubf-.-d-s-fix-some-cases-of-zero-inputs.patch queue-4.13/mips-math-emu-maddf-msubf-.-d-s-clean-up-maddf_flags-enumeration.patch queue-4.13/mips-math-emu-maddf-msubf-.-d-s-fix-some-cases-of-infinite-inputs.patch