[PATCH 4/4] x86: Add 'V' register operand modifier
Jan Hubicka
hubicka@ucw.cz
Fri Jan 12 18:02:00 GMT 2018
> 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.
Seems reasonable. Purpose of this is to make posible to call thunks
from asm statements, right?
Honza
>
> gcc/testsuite/
>
> * gcc.target/i386/indirect-thunk-register-4.c: New test.
> ---
> gcc/config/i386/i386.c | 13 ++++++++++++-
> gcc/doc/extend.texi | 3 +++
> gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++
> 3 files changed, 28 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 9ffcb69d6d7..e69135d7191 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -17617,6 +17617,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
> @@ -17627,7 +17628,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)
> @@ -17679,6 +17680,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)
> @@ -17798,6 +17807,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.
> @@ -18021,6 +18031,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
> case 'X':
> case 'P':
> case 'p':
> + case 'V':
> break;
>
> case 's':
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index f120b2a1429..dce808f1eab 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -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
>
> 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
> index 00000000000..f0cd9b75be8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
> @@ -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 } } } } */
> --
> 2.14.3
More information about the Gcc-patches
mailing list