OSDN Git Service

PR target/56890
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 15 Apr 2013 08:33:56 +0000 (08:33 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 15 Apr 2013 08:33:56 +0000 (08:33 +0000)
* config/sparc/sparc.c (enum sparc_mode_class): Add H_MODE value.
(S_MODES): Set H_MODE bit.
(SF_MODES): Set only S_MODE and SF_MODE bits.
(DF_MODES): Set SF_MODES and only D_MODE and DF_MODE bits.
(sparc_init_modes) <MODE_INT>: Set H_MODE bit for sub-word modes.
<MODE_VECTOR_INT>: Do not set SF_MODE for sub-word modes.
<MODE_FLOAT>: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@197960 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr56890-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr56890-2.c [new file with mode: 0644]

index 70ec3eb..20e2840 100644 (file)
@@ -1,4 +1,15 @@
-2013-0413  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+2013-04-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR target/56890
+       * config/sparc/sparc.c (enum sparc_mode_class): Add H_MODE value.
+       (S_MODES): Set H_MODE bit.
+       (SF_MODES): Set only S_MODE and SF_MODE bits.
+       (DF_MODES): Set SF_MODES and only D_MODE and DF_MODE bits.
+       (sparc_init_modes) <MODE_INT>: Set H_MODE bit for sub-word modes.
+       <MODE_VECTOR_INT>: Do not set SF_MODE for sub-word modes.
+       <MODE_FLOAT>: Likewise.
+
+2013-04-13  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        Backport from mainline:
        2013-04-06  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
index 37fab67..4f8e96f 100644 (file)
@@ -4207,13 +4207,14 @@ mem_min_alignment (rtx mem, int desired)
    mapped into one sparc_mode_class mode.  */
 
 enum sparc_mode_class {
-  S_MODE, D_MODE, T_MODE, O_MODE,
+  H_MODE, S_MODE, D_MODE, T_MODE, O_MODE,
   SF_MODE, DF_MODE, TF_MODE, OF_MODE,
   CC_MODE, CCFP_MODE
 };
 
 /* Modes for single-word and smaller quantities.  */
-#define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
+#define S_MODES \
+  ((1 << (int) H_MODE) | (1 << (int) S_MODE) | (1 << (int) SF_MODE))
 
 /* Modes for double-word and smaller quantities.  */
 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
@@ -4224,13 +4225,11 @@ enum sparc_mode_class {
 /* Modes for 8-word and smaller quantities.  */
 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
 
-/* Modes for single-float quantities.  We must allow any single word or
-   smaller quantity.  This is because the fix/float conversion instructions
-   take integer inputs/outputs from the float registers.  */
-#define SF_MODES (S_MODES)
+/* Modes for single-float quantities.  */
+#define SF_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
 
 /* Modes for double-float and smaller quantities.  */
-#define DF_MODES (D_MODES)
+#define DF_MODES (SF_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
 
 /* Modes for quad-float and smaller quantities.  */
 #define TF_MODES (DF_MODES | (1 << (int) TF_MODE))
@@ -4326,7 +4325,9 @@ sparc_init_modes (void)
        case MODE_INT:
        case MODE_PARTIAL_INT:
        case MODE_COMPLEX_INT:
-         if (GET_MODE_SIZE (i) <= 4)
+         if (GET_MODE_SIZE (i) < 4)
+           sparc_mode_class[i] = 1 << (int) H_MODE;
+         else if (GET_MODE_SIZE (i) == 4)
            sparc_mode_class[i] = 1 << (int) S_MODE;
          else if (GET_MODE_SIZE (i) == 8)
            sparc_mode_class[i] = 1 << (int) D_MODE;
@@ -4338,14 +4339,16 @@ sparc_init_modes (void)
            sparc_mode_class[i] = 0;
          break;
        case MODE_VECTOR_INT:
-         if (GET_MODE_SIZE (i) <= 4)
-           sparc_mode_class[i] = 1 << (int)SF_MODE;
+         if (GET_MODE_SIZE (i) == 4)
+           sparc_mode_class[i] = 1 << (int) SF_MODE;
          else if (GET_MODE_SIZE (i) == 8)
-           sparc_mode_class[i] = 1 << (int)DF_MODE;
+           sparc_mode_class[i] = 1 << (int) DF_MODE;
+         else
+           sparc_mode_class[i] = 0;
          break;
        case MODE_FLOAT:
        case MODE_COMPLEX_FLOAT:
-         if (GET_MODE_SIZE (i) <= 4)
+         if (GET_MODE_SIZE (i) == 4)
            sparc_mode_class[i] = 1 << (int) SF_MODE;
          else if (GET_MODE_SIZE (i) == 8)
            sparc_mode_class[i] = 1 << (int) DF_MODE;
index 7f9145b..fc88fd8 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.dg/pr56890-1.c: New test.
+       * gcc.dg/pr56890-2.c: Likewise.
+
 2013-04-11  Release Manager
 
        * GCC 4.7.3 released.
diff --git a/gcc/testsuite/gcc.dg/pr56890-1.c b/gcc/testsuite/gcc.dg/pr56890-1.c
new file mode 100644 (file)
index 0000000..93b2134
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/56890 */
+/* Reported by Rainer Jung <rainer.jung@kippdata.de> */
+
+/* { dg-do assemble } */
+/* { dg-options "-O2" } */
+
+unsigned int buggy(unsigned int min, unsigned int max)
+{
+    if (max < 16384) {
+        unsigned short num16 = 0;
+        num16 = min + (long) ((double) (max - min + 1.0) * (num16 / (65535 + 1.0)));
+        return num16;
+    }
+    return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/pr56890-2.c b/gcc/testsuite/gcc.dg/pr56890-2.c
new file mode 100644 (file)
index 0000000..474327e
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR target/56890 */
+/* Reported by Rainer Jung <rainer.jung@kippdata.de> */
+
+/* { dg-do assemble } */
+/* { dg-options "-O" } */
+
+unsigned int buggy(unsigned int min, unsigned int max)
+{
+    unsigned int number;
+    if (max < 16384) {
+        unsigned short num16;
+        num16 = min + (long) ((double) (max - min + 1.0) * (num16 / (65535 + 1.0)));
+        return num16;
+    }
+    else {
+        (number) = min + (long) ((double) (max - min + 1.0) * (number / (4294967295U + 1.0)));
+    }
+    return number;
+}