Correct fabs and fneg insns in simulator

It seems that the implementation of the SH fabs and fneg insns in the
simulator is not correct.  They use the FP_UNARY macro which checks the
FPSCR.PR setting and raises an exception if PR = 1 (double precision)
and the register number is not even (i.e. a valid DF reg number).
For normal unary FP insns this is fine.  However, fneg and fabs perform
the same (integer) operations regardless of the FPSCR.PR setting.

This issue initially popped up here
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63260

I've checked some of the failing tests mentioned in GCC PR 63260 above
with the patch applied and the failures go away.

sim/sh/ChangeLog (tiny patch):

	* gencode.c (fabs, fneg): Implement as integer operation
	instead of using the FP_UNARY macro.
This commit is contained in:
Oleg Endo 2014-11-28 19:39:39 +04:00 committed by Joel Brobecker
parent f7ca3fcfcc
commit 57df9adf2d
2 changed files with 21 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2014-10-14 Oleg Endo <olegendo@gcc.gnu.org> (tiny patch)
* gencode.c (fabs, fneg): Implement as integer operation
instead of using the FP_UNARY macro.
2014-08-19 Alan Modra <amodra@gmail.com>
* configure: Regenerate.

View File

@ -429,8 +429,14 @@ op tab[] =
/* sh2e */
{ "", "", "fabs <FREG_N>", "1111nnnn01011101",
"FP_UNARY (n, fabs);",
"/* FIXME: FR (n) &= 0x7fffffff; */",
" union",
" {",
" unsigned int i;",
" float f;",
" } u;",
" u.f = FR (n);",
" u.i &= 0x7fffffff;",
" SET_FR (n, u.f);",
},
/* sh2e */
@ -662,7 +668,14 @@ op tab[] =
/* sh2e */
{ "", "", "fneg <FREG_N>", "1111nnnn01001101",
"FP_UNARY (n, -);",
" union",
" {",
" unsigned int i;",
" float f;",
" } u;",
" u.f = FR (n);",
" u.i ^= 0x80000000;",
" SET_FR (n, u.f);",
},
/* sh4a */