aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Endo <oleg.endo@t-online.de>2014-11-28 19:39:39 +0400
committerJoel Brobecker <brobecker@adacore.com>2014-11-28 19:44:03 +0400
commit57df9adf2d437e3c7f17a77c3e0f3c0d8e56aa40 (patch)
tree73a55ed62e5e2bde5d03fd54513570594f98b050
parentf7ca3fcfccd144c234370aa939e4f5f15f3b2a88 (diff)
downloadgdb-57df9adf2d437e3c7f17a77c3e0f3c0d8e56aa40.zip
gdb-57df9adf2d437e3c7f17a77c3e0f3c0d8e56aa40.tar.gz
gdb-57df9adf2d437e3c7f17a77c3e0f3c0d8e56aa40.tar.bz2
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.
-rw-r--r--sim/sh/ChangeLog5
-rw-r--r--sim/sh/gencode.c19
2 files changed, 21 insertions, 3 deletions
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 <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.
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 <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 */