i86: fix the handling of mode-dependent register names
authorH. Peter Anvin <hpa@zytor.com>
Mon, 13 Aug 2007 22:12:40 +0000 (15:12 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 13 Aug 2007 22:12:40 +0000 (15:12 -0700)
Clean up and fix the handling of mode-dependent register names.

gcc/config/i86/i86.c
gcc/config/i86/i86.md

index a168f55..144133a 100644 (file)
@@ -36,7 +36,7 @@
 
 static void i86_file_start (void);
 static rtx  i86_function_value (tree, tree, bool);
-static void i86_print_operand_size(FILE *s, rtx x, int c);
+static void i86_print_mode(FILE *s, enum machine_mode mode, int c);
 
 const enum reg_class regclass_map[] = { AREG, AREG,  DREG, DREG,  CREG, CREG,
                                         BREG, BREG,  SIREG, SIREG,  DIREG, DIREG,
@@ -394,7 +394,7 @@ i86_notice_update_cc(rtx e ATTRIBUTE_UNUSED)
 
 /* Generate a "push" pattern for input ARG.  */
 static rtx
-gen_push (rtx arg, int mode)
+gen_push (rtx arg, enum machine_mode mode)
 {
   return gen_rtx_SET (VOIDmode,
                      gen_rtx_MEM (mode,
@@ -475,6 +475,8 @@ i86_expand_epilogue (int style)
 void
 i86_print_operand(FILE *s, rtx x, int c)
 {
+  enum machine_mode mode = GET_MODE (x);
+
 #if DEBUG
   printf("[i86_print_operand(%c)]\n", c?c:' ');
   print_rtl(stdout, x);
@@ -483,27 +485,44 @@ i86_print_operand(FILE *s, rtx x, int c)
   switch (GET_CODE (x))
   {
   case REG:
-    if (c < '0')
-      switch (GET_MODE (x)) {
-      case QImode: c = 'b'; break;     /* Byte */
-      case HImode: c = 'w'; break;     /* Word */
-      case SImode: c = 'd'; break;     /* Longword */
-      default: break;
-      }
-    
-    if ((c == 'L' || c == 'H') && REGNO(x) < REG_SI)
-      fprintf (s, "%%%c%c", register_names[REGNO(x)][0], c);
-    else if (c == 'd')
-      fprintf (s, "%%e%s", register_names[REGNO(x)]);
-    else if (c == 'w')
+    switch (c) {
+    case 'b':
+    case 'L':
+    case 'H':
+      mode = QImode;
+      break;
+    case 'w':
+      mode = HImode;
+      break;
+    case 'd':
+      mode = SImode;
+      break;
+    default:
+      break;
+    }
+
+    switch (mode) {
+    case QImode:
+      gcc_assert (REGNO(x) < REG_SI);
+      fprintf (s, "%%%c%c", register_names[REGNO(x)][0],
+              (c == 'H') ? 'h' : 'l');
+      break;
+    case HImode:
       fprintf (s, "%%%s", register_names[REGNO(x)]);
+      break;
+    case SImode:
+      fprintf (s, "%%e%s", register_names[REGNO(x)]);
+      break;
+    default:
+      gcc_unreachable ();
+    }
     break;
 
   case MEM:
     if (c == 'P')
       i86_print_operand(s, XEXP(x,0), 0);
     else {
-      i86_print_operand_size(s, x, c);
+      i86_print_mode(s, mode, c);
       i86_print_operand_address(s, x);
     }
     break;
@@ -526,7 +545,7 @@ i86_print_operand(FILE *s, rtx x, int c)
   case CONST:
   case CONST_INT:
   case CODE_LABEL:
-    i86_print_operand_size(s, x, c);
+    i86_print_mode(s, mode, c);
     output_addr_const(s, x);
     break;
   default:
@@ -536,10 +555,8 @@ i86_print_operand(FILE *s, rtx x, int c)
 }
 
 static void
-i86_print_operand_size(FILE *s, rtx x, int c)
+i86_print_mode(FILE *s, enum machine_mode mode, int c)
 {
-  int mode = GET_MODE (x);
-
   switch (c) {
   case 'b':
   case 'L':
index e07e9bd..ee45477 100644 (file)
@@ -61,7 +61,7 @@
 )
 
 (define_expand "movqi"
-  [(set (match_operand:QI 0 "general_operand" "")
+  [(set (match_operand:QI 0 "nonimmediate_operand" "")
        (match_operand:QI 1 "general_operand" ""))]
   ""
   "
@@ -77,7 +77,7 @@
 
 (define_insn ""
   [(set (match_operand:QI 0 "nonimmediate_operand" "=q,m,m")
-       (match_operand:QI 1 "general_operand" "g,q,n"))]
+       (match_operand:QI 1 "general_operand" "g,q,i"))]
   "(GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"
   "mov %0,%1"
   )
   )
 
 (define_expand "movsi"
-  [(set (match_operand:SI 0 "general_operand" "")
+  [(set (match_operand:SI 0 "nonimmediate_operand" "")
        (match_operand:SI 1 "general_operand" ""))]
   ""
   "