OSDN Git Service

Fix PR22599
authormeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jan 2009 22:40:34 +0000 (22:40 +0000)
committermeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jan 2009 22:40:34 +0000 (22:40 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143386 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c

index 1f67c45..dff3716 100644 (file)
@@ -1,3 +1,10 @@
+2009-01-14  Michael Meissner  <gnu@the-meissners.org>
+
+       PR target/22599
+       * i386.c (print_operand): Add tests for 'D', 'C', 'F', 'f' to make
+       sure the insn is a conditional test (bug 22599).  Reformat a few long
+       lines.
+
 2009-01-14  Sebastian Pop  <sebastian.pop@amd.com>
 
        PR middle-end/38431
index b5fea23..d02f5c1 100644 (file)
@@ -10834,7 +10834,8 @@ print_operand (FILE *file, rtx x, int code)
                  fputs ("ord", file);
                  break;
                default:
-                 gcc_unreachable ();
+                 output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
+                 return;
                }
            }
          else
@@ -10872,7 +10873,8 @@ print_operand (FILE *file, rtx x, int code)
                  fputs ("ord", file);
                  break;
                default:
-                 gcc_unreachable ();
+                 output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
+                 return;
                }
            }
          return;
@@ -10894,9 +10896,23 @@ print_operand (FILE *file, rtx x, int code)
 #endif
          return;
        case 'C':
+         if (!COMPARISON_P (x))
+           {
+             output_operand_lossage ("operand is neither a constant nor a "
+                                     "condition code, invalid operand code "
+                                     "'C'");
+             return;
+           }
          put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
          return;
        case 'F':
+         if (!COMPARISON_P (x))
+           {
+             output_operand_lossage ("operand is neither a constant nor a "
+                                     "condition code, invalid operand code "
+                                     "'F'");
+             return;
+           }
 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
          if (ASSEMBLER_DIALECT == ASM_ATT)
            putc ('.', file);
@@ -10909,13 +10925,22 @@ print_operand (FILE *file, rtx x, int code)
          /* Check to see if argument to %c is really a constant
             and not a condition code which needs to be reversed.  */
          if (!COMPARISON_P (x))
-         {
-           output_operand_lossage ("operand is neither a constant nor a condition code, invalid operand code 'c'");
-            return;
-         }
+           {
+             output_operand_lossage ("operand is neither a constant nor a "
+                                     "condition code, invalid operand "
+                                     "code 'c'");
+             return;
+           }
          put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
          return;
        case 'f':
+         if (!COMPARISON_P (x))
+           {
+             output_operand_lossage ("operand is neither a constant nor a "
+                                     "condition code, invalid operand "
+                                     "code 'f'");
+             return;
+           }
 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
          if (ASSEMBLER_DIALECT == ASM_ATT)
            putc ('.', file);
@@ -11022,7 +11047,8 @@ print_operand (FILE *file, rtx x, int code)
              fputs ("une", file);
              break;
            default:
-             gcc_unreachable ();
+             output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
+             return;
            }
          return;