OSDN Git Service

2000-10-23 Diego Novillo <dnovillo@cygnus.com>
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Oct 2000 17:26:27 +0000 (17:26 +0000)
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Oct 2000 17:26:27 +0000 (17:26 +0000)
* i386.c (print_operand): Handle new 'A' formatting code.
387 opcodes need suffixes even with -mintel-syntax.
Check for explicit size override (codes 'b', 'w' and 'k').
(print_operand_address): Check if register prefix is needed when
emitting `ds' segment override.
* i386.h: Add comment about new 'A' formatting code.
* i386.md (jump and call patterns): Emit absolute references using %A.

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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md

index f40ab8e..c605f67 100644 (file)
@@ -67,6 +67,16 @@ Wed Oct 25 01:02:44 EDT 2000  John Wehle  (john@feith.com)
        otherwise leave empty.
        * configure: Regenerate.
 
+2000-10-23  Diego Novillo  <dnovillo@cygnus.com>
+
+       * i386.c (print_operand): Handle new 'A' formatting code.
+       387 opcodes need suffixes even with -mintel-syntax.
+       Check for explicit size override (codes 'b', 'w' and 'k').
+       (print_operand_address): Check if register prefix is needed when
+       emitting `ds' segment override.
+       * i386.h: Add comment about new 'A' formatting code.
+       * i386.md (jump and call patterns): Emit absolute references using %A.
+
 2000-10-23  Richard Henderson  <rth@cygnus.com>
 
        * config/ia64/ia64.c (ia64_expand_prologue): Mark extra 
index b9bd81c..fa5d758 100644 (file)
@@ -3250,6 +3250,7 @@ print_reg (x, code, file)
    R -- print the prefix for register names.
    z -- print the opcode suffix for the size of the current operand.
    * -- print a star (in certain assembler syntax)
+   A -- print an absolute memory reference.
    w -- print the operand as if it's a "word" (HImode) even if it isn't.
    s -- print a shift double count, followed by the assemblers argument
        delimiter.
@@ -3276,6 +3277,26 @@ print_operand (file, x, code)
            putc ('*', file);
          return;
 
+       case 'A':
+         if (ASSEMBLER_DIALECT == 0)
+           putc ('*', file);
+         else if (ASSEMBLER_DIALECT == 1)
+           {
+             /* Intel syntax. For absolute addresses, registers should not
+                be surrounded by braces.  */
+             if (GET_CODE (x) != REG)
+               {
+                 putc ('[', file);
+                 PRINT_OPERAND (file, x, 0);
+                 putc (']', file);
+                 return;
+               }
+           }
+
+         PRINT_OPERAND (file, x, 0);
+         return;
+
+
        case 'L':
          if (ASSEMBLER_DIALECT == 0)
            putc ('l', file);
@@ -3313,10 +3334,6 @@ print_operand (file, x, code)
          if (STACK_REG_P (x))
            return;
 
-         /* Intel syntax has no truck with instruction suffixes.  */
-         if (ASSEMBLER_DIALECT != 0)
-           return;
-
          /* this is the size of op from size of operand */
          switch (GET_MODE_SIZE (GET_MODE (x)))
            {
@@ -3422,6 +3439,15 @@ print_operand (file, x, code)
            default:
              abort ();
            }
+
+         /* Check for explicit size override (codes 'b', 'w' and 'k')  */
+         if (code == 'b')
+           size = "BYTE";
+         else if (code == 'w')
+           size = "WORD";
+         else if (code == 'k')
+           size = "DWORD";
+
          fputs (size, file);
          fputs (" PTR ", file);
        }
@@ -3519,7 +3545,11 @@ print_operand_address (file, addr)
       if (GET_CODE (disp) == CONST_INT)
        {
          if (ASSEMBLER_DIALECT != 0)
-           fputs ("ds:", file);
+           {
+             if (USER_LABEL_PREFIX[0] == 0)
+               putc ('%', file);
+             fputs ("ds:", file);
+           }
          fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
        }
       else if (flag_pic)
index 10ef1e1..f0223bc 100644 (file)
@@ -2723,6 +2723,7 @@ do { long l;                                              \
    R -- print the prefix for register names.
    z -- print the opcode suffix for the size of the current operand.
    * -- print a star (in certain assembler syntax)
+   A -- print an absolute memory reference.
    P -- if PIC, print an @PLT suffix.
    X -- don't print any sort of PIC '@' suffix for a symbol.
    s -- ??? something to do with double shifts.  not actually used, afaik.
index 3d908ea..90b1482 100644 (file)
 (define_insn "indirect_jump"
   [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))]
   ""
-  "jmp\\t%*%0"
+  "jmp\\t%A0"
   [(set_attr "type" "ibr")
    (set_attr "length_immediate" "0")])
 
   [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
    (use (label_ref (match_operand 1 "" "")))]
   "! flag_pic"
-  "jmp\\t%*%0"
+  "jmp\\t%A0"
   [(set_attr "type" "ibr")
    (set_attr "length_immediate" "0")])
 
   [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
    (use (label_ref (match_operand 1 "" "")))]
   ""
-  "jmp\\t%*%0"
+  "jmp\\t%A0"
   [(set_attr "type" "ibr")
    (set_attr "length_immediate" "0")])
 \f
        return \"call\\t%P0\";
     }
   if (SIBLING_CALL_P (insn))
-    return \"jmp\\t%*%0\";
+    return \"jmp\\t%A0\";
   else
-    return \"call\\t%*%0\";
+    return \"call\\t%A0\";
 }"
   [(set_attr "type" "call")])
 
        return \"call\\t%P0\";
     }
   if (SIBLING_CALL_P (insn))
-    return \"jmp\\t%*%0\";
+    return \"jmp\\t%A0\";
   else
-    return \"call\\t%*%0\";
+    return \"call\\t%A0\";
 }"
   [(set_attr "type" "call")])
 
   [(return)
    (use (match_operand:SI 0 "register_operand" "r"))]
   "reload_completed"
-  "jmp\\t%*%0"
+  "jmp\\t%A0"
   [(set_attr "type" "ibr")
    (set_attr "length_immediate" "0")])
 
        return \"call\\t%P1\";
     }
   if (SIBLING_CALL_P (insn))
-    return \"jmp\\t%*%1\";
+    return \"jmp\\t%A1\";
   else
-    return \"call\\t%*%1\";
+    return \"call\\t%A1\";
 }"
   [(set_attr "type" "callv")])
 
        return \"call\\t%P1\";
     }
   if (SIBLING_CALL_P (insn))
-    return \"jmp\\t%*%1\";
+    return \"jmp\\t%A1\";
   else
-    return \"call\\t%*%1\";
+    return \"call\\t%A1\";
 }"
   [(set_attr "type" "callv")])
 \f