PR middle-end/52940
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2012 14:20:39 +0000 (14:20 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2012 14:20:39 +0000 (14:20 +0000)
* machmode.h (CLASS_HAS_WIDER_MODES_P): True for MODE_PARTIAL_INT.
* expr.c (convert_move): Honor unsignedp when extending partial int
modes.
* genmodes.c (complete_mode): Don't clear component field of partial
int modes.
(emit_mode_inner): Don't emit it however.
(calc_wider_mode): Partial int modes widen to their component.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186877 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/genmodes.c
gcc/machmode.h

index 0515b9f..2ca14ff 100644 (file)
@@ -3,6 +3,15 @@
        * PR middle-end/52997
        * ira.c (find_moveable_pseudos): Call resize_reg_info.
 
+       PR middle-end/52940
+       * machmode.h (CLASS_HAS_WIDER_MODES_P): True for MODE_PARTIAL_INT.
+       * expr.c (convert_move): Honor unsignedp when extending partial int
+       modes.
+       * genmodes.c (complete_mode): Don't clear component field of partial
+       int modes.
+       (emit_mode_inner): Don't emit it however.
+       (calc_wider_mode): Partial int modes widen to their component.
+
 2012-04-26  David S. Miller  <davem@davemloft.net>
 
        * config/sparc/niagara4.md: New file.
index 81112da..3e8e004 100644 (file)
@@ -438,21 +438,20 @@ convert_move (rtx to, rtx from, int unsignedp)
       rtx new_from;
       enum machine_mode full_mode
        = smallest_mode_for_size (GET_MODE_BITSIZE (from_mode), MODE_INT);
+      convert_optab ctab = unsignedp ? zext_optab : sext_optab;
+      enum insn_code icode;
 
-      gcc_assert (convert_optab_handler (sext_optab, full_mode, from_mode)
-                 != CODE_FOR_nothing);
+      icode = convert_optab_handler (ctab, full_mode, from_mode);
+      gcc_assert (icode != CODE_FOR_nothing);
 
       if (to_mode == full_mode)
        {
-         emit_unop_insn (convert_optab_handler (sext_optab, full_mode,
-                                                from_mode),
-                         to, from, UNKNOWN);
+         emit_unop_insn (icode, to, from, UNKNOWN);
          return;
        }
 
       new_from = gen_reg_rtx (full_mode);
-      emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode),
-                     new_from, from, UNKNOWN);
+      emit_unop_insn (icode, new_from, from, UNKNOWN);
 
       /* else proceed to integer conversions below.  */
       from_mode = full_mode;
index 84517b9..d0095c3 100644 (file)
@@ -360,7 +360,6 @@ complete_mode (struct mode_data *m)
       m->bytesize = m->component->bytesize;
 
       m->ncomponents = 1;
-      m->component = 0;  /* ??? preserve this */
       break;
 
     case MODE_COMPLEX_INT:
@@ -821,7 +820,13 @@ calc_wider_mode (void)
 
          sortbuf[i] = 0;
          for (j = 0; j < i; j++)
-           sortbuf[j]->next = sortbuf[j]->wider = sortbuf[j + 1];
+           {
+             sortbuf[j]->next = sortbuf[j + 1];
+             if (c == MODE_PARTIAL_INT)
+               sortbuf[j]->wider = sortbuf[j]->component;
+             else
+               sortbuf[j]->wider = sortbuf[j]->next;
+           }
 
          modes[c] = sortbuf[0];
        }
@@ -1118,7 +1123,8 @@ emit_mode_inner (void)
 
   for_all_modes (c, m)
     tagged_printf ("%smode",
-                  m->component ? m->component->name : void_mode->name,
+                  c != MODE_PARTIAL_INT && m->component
+                  ? m->component->name : void_mode->name,
                   m->name);
 
   print_closer ();
index 4a3f6f5..6137c70 100644 (file)
@@ -166,6 +166,7 @@ extern const unsigned char mode_class[NUM_MACHINE_MODES];
 /* Nonzero if CLASS modes can be widened.  */
 #define CLASS_HAS_WIDER_MODES_P(CLASS)         \
   (CLASS == MODE_INT                           \
+   || CLASS == MODE_PARTIAL_INT                \
    || CLASS == MODE_FLOAT                      \
    || CLASS == MODE_DECIMAL_FLOAT              \
    || CLASS == MODE_COMPLEX_FLOAT              \