Blame SOURCES/gcc48-rh1535655-5.patch

5ed81e
commit 6effbc703b711779a196e5dbaf6335f39fab71c2
5ed81e
Author: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
5ed81e
Date:   Tue Jan 16 11:19:51 2018 +0000
5ed81e
5ed81e
    HJ patch #4
5ed81e
5ed81e
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
5ed81e
index 9dffd02f..e73389b 100644
5ed81e
--- a/gcc/config/i386/i386.c
5ed81e
+++ b/gcc/config/i386/i386.c
5ed81e
@@ -14497,6 +14497,7 @@ put_condition_code (enum rtx_code code, enum machine_mode mode, bool reverse,
5ed81e
    If CODE is 'h', pretend the reg is the 'high' byte register.
5ed81e
    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
5ed81e
    If CODE is 'd', duplicate the operand for AVX instruction.
5ed81e
+   If CODE is 'V', print naked full integer register name without %.
5ed81e
  */
5ed81e
 
5ed81e
 void
5ed81e
@@ -14506,7 +14507,7 @@ print_reg (rtx x, int code, FILE *file)
5ed81e
   unsigned int regno;
5ed81e
   bool duplicated = code == 'd' && TARGET_AVX;
5ed81e
 
5ed81e
-  if (ASSEMBLER_DIALECT == ASM_ATT)
5ed81e
+  if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
5ed81e
     putc ('%', file);
5ed81e
 
5ed81e
   if (x == pc_rtx)
5ed81e
@@ -14542,6 +14543,14 @@ print_reg (rtx x, int code, FILE *file)
5ed81e
   else
5ed81e
     code = GET_MODE_SIZE (GET_MODE (x));
5ed81e
 
5ed81e
+  if (code == 'V')
5ed81e
+    {
5ed81e
+      if (GENERAL_REGNO_P (regno))
5ed81e
+	code = GET_MODE_SIZE (word_mode);
5ed81e
+      else
5ed81e
+	error ("'V' modifier on non-integer register");
5ed81e
+    }
5ed81e
+
5ed81e
   /* Irritatingly, AMD extended registers use different naming convention
5ed81e
      from the normal registers: "r%d[bwd]"  */
5ed81e
   if (REX_INT_REGNO_P (regno))
5ed81e
@@ -14695,6 +14704,7 @@ get_some_local_dynamic_name (void)
5ed81e
    & -- print some in-use local-dynamic symbol name.
5ed81e
    H -- print a memory address offset by 8; used for sse high-parts
5ed81e
    Y -- print condition for XOP pcom* instruction.
5ed81e
+   V -- print naked full integer register name without %.
5ed81e
    + -- print a branch hint as 'cs' or 'ds' prefix
5ed81e
    ; -- print a semicolon (after prefixes due to bug in older gas).
5ed81e
    ~ -- print "i" if TARGET_AVX2, "f" otherwise.
5ed81e
@@ -14919,6 +14929,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
5ed81e
 	case 'X':
5ed81e
 	case 'P':
5ed81e
 	case 'p':
5ed81e
+	case 'V':
5ed81e
 	  break;
5ed81e
 
5ed81e
 	case 's':
5ed81e
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
5ed81e
new file mode 100644
5ed81e
index 0000000..f0cd9b7
5ed81e
--- /dev/null
5ed81e
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
5ed81e
@@ -0,0 +1,13 @@
5ed81e
+/* { dg-do compile } */
5ed81e
+/* { dg-options "-O2 -mindirect-branch=keep -fno-pic" } */
5ed81e
+
5ed81e
+extern void (*func_p) (void);
5ed81e
+
5ed81e
+void
5ed81e
+foo (void)
5ed81e
+{
5ed81e
+  asm("call __x86_indirect_thunk_%V0" : : "a" (func_p));
5ed81e
+}
5ed81e
+
5ed81e
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_eax" { target ia32 } } } */
5ed81e
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_rax" { target { ! ia32 } } } } */