From 57df9adf2d437e3c7f17a77c3e0f3c0d8e56aa40 Mon Sep 17 00:00:00 2001 From: Oleg Endo Date: Fri, 28 Nov 2014 19:39:39 +0400 Subject: 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. --- sim/sh/ChangeLog | 5 +++++ sim/sh/gencode.c | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'sim') diff --git a/sim/sh/ChangeLog b/sim/sh/ChangeLog index 08db573..7d6cf91 100644 --- a/sim/sh/ChangeLog +++ b/sim/sh/ChangeLog @@ -1,3 +1,8 @@ +2014-10-14 Oleg Endo (tiny patch) + + * gencode.c (fabs, fneg): Implement as integer operation + instead of using the FP_UNARY macro. + 2014-08-19 Alan Modra * configure: Regenerate. diff --git a/sim/sh/gencode.c b/sim/sh/gencode.c index 738b718..bc65604 100644 --- a/sim/sh/gencode.c +++ b/sim/sh/gencode.c @@ -429,8 +429,14 @@ op tab[] = /* sh2e */ { "", "", "fabs ", "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 ", "1111nnnn01001101", - "FP_UNARY (n, -);", + " union", + " {", + " unsigned int i;", + " float f;", + " } u;", + " u.f = FR (n);", + " u.i ^= 0x80000000;", + " SET_FR (n, u.f);", }, /* sh4a */ -- cgit v1.1