x86: Add 'V' register operand modifier

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/

	Backport from mainline
	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.

gcc/testsuite/

	Backport from mainline
	2018-01-14  H.J. Lu  <hongjiu.lu@intel.com>

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

From-SVN: r256736
This commit is contained in:
H.J. Lu 2018-01-16 11:19:51 +00:00 committed by H.J. Lu
parent fedde6d3b9
commit 3a205fe54c
5 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2018-01-16 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline
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-16 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline

View File

@ -17941,6 +17941,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
@ -17951,7 +17952,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)
@ -17999,6 +18000,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)
@ -18118,6 +18127,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.
@ -18342,6 +18352,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
case 'X':
case 'P':
case 'p':
case 'V':
break;
case 's':

View File

@ -8778,6 +8778,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

View File

@ -1,3 +1,10 @@
2018-01-16 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/indirect-thunk-register-4.c: New test.
2018-01-16 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline

View File

@ -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 } } } } */