x86: Add 'V' register operand modifier
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 14 Jan 2018 14:41:25 +0000 (14:41 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 14 Jan 2018 14:41:25 +0000 (06:41 -0800)
Add 'V', a special modifier which prints the name of the full integer
register without '%'.  For

extern void (*func_p) (void);

void
foo (void)
{
  asm ("call __x86_indirect_thunk_%V0" : : "a" (func_p));
}

it generates:

foo:
movq func_p(%rip), %rax
call __x86_indirect_thunk_rax
ret

gcc/

* config/i386/i386.c (print_reg): Print the name of the full
integer register without '%'.
(ix86_print_operand): Handle 'V'.
 * doc/extend.texi: Document 'V' modifier.

gcc/testsuite/

* gcc.target/i386/indirect-thunk-register-4.c: New test.

From-SVN: r256663

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c [new file with mode: 0644]

index 2fb1c5a8adfd09b4b66e8410d5e40a16d48f2ab3..75de1b7fcdc1d765d4349022dd3b78c6a7c06a22 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (print_reg): Print the name of the full
+       integer register without '%'.
+       (ix86_print_operand): Handle 'V'.
+        * doc/extend.texi: Document 'V' modifier.
+
 2018-01-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/constraints.md (Bs): Disallow memory operand for
index c6ffdd9ede5ab09e62b18ebef9b07f14a007d02d..4ae89017bdf6dc702449b3d509ea1bfda3382669 100644 (file)
@@ -17655,6 +17655,7 @@ put_condition_code (enum rtx_code code, machine_mode mode, bool reverse,
    If CODE is 'h', pretend the reg is the 'high' byte register.
    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
    If CODE is 'd', duplicate the operand for AVX instruction.
+   If CODE is 'V', print naked full integer register name without %.
  */
 
 void
@@ -17665,7 +17666,7 @@ print_reg (rtx x, int code, FILE *file)
   unsigned int regno;
   bool duplicated;
 
-  if (ASSEMBLER_DIALECT == ASM_ATT)
+  if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
     putc ('%', file);
 
   if (x == pc_rtx)
@@ -17717,6 +17718,14 @@ print_reg (rtx x, int code, FILE *file)
       return;
     }
 
+  if (code == 'V')
+    {
+      if (GENERAL_REGNO_P (regno))
+       msize = GET_MODE_SIZE (word_mode);
+      else
+       error ("'V' modifier on non-integer register");
+    }
+
   duplicated = code == 'd' && TARGET_AVX;
 
   switch (msize)
@@ -17836,6 +17845,7 @@ print_reg (rtx x, int code, FILE *file)
    & -- print some in-use local-dynamic symbol name.
    H -- print a memory address offset by 8; used for sse high-parts
    Y -- print condition for XOP pcom* instruction.
+   V -- print naked full integer register name without %.
    + -- print a branch hint as 'cs' or 'ds' prefix
    ; -- print a semicolon (after prefixes due to bug in older gas).
    ~ -- print "i" if TARGET_AVX2, "f" otherwise.
@@ -18059,6 +18069,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
        case 'X':
        case 'P':
        case 'p':
+       case 'V':
          break;
 
        case 's':
index f120b2a142923ffe50b633a94bd5e54faea730c7..dce808f1eab1ff734fb5acf97a2d8a6ea270a788 100644 (file)
@@ -9292,6 +9292,9 @@ The table below shows the list of supported modifiers and their effects.
 @tab @code{2}
 @end multitable
 
+@code{V} is a special modifier which prints the name of the full integer
+register without @code{%}.
+
 @anchor{x86floatingpointasmoperands}
 @subsubsection x86 Floating-Point @code{asm} Operands
 
index 796a32981101dba58c8ae15ba1de698b2c47785a..9e3aeaff0793b1ce7dc0124304485725990a3fdb 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gcc.target/i386/indirect-thunk-register-4.c: New test.
+
 2018-01-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/indirect-thunk-1.c (dg-options): Add
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
new file mode 100644 (file)
index 0000000..f0cd9b7
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mindirect-branch=keep -fno-pic" } */
+
+extern void (*func_p) (void);
+
+void
+foo (void)
+{
+  asm("call __x86_indirect_thunk_%V0" : : "a" (func_p));
+}
+
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_eax" { target ia32 } } } */
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_rax" { target { ! ia32 } } } } */