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:
parent
fedde6d3b9
commit
3a205fe54c
|
@ -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>
|
2018-01-16 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
Backport from mainline
|
Backport from mainline
|
||||||
|
|
|
@ -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 '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 '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 'd', duplicate the operand for AVX instruction.
|
||||||
|
If CODE is 'V', print naked full integer register name without %.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -17951,7 +17952,7 @@ print_reg (rtx x, int code, FILE *file)
|
||||||
unsigned int regno;
|
unsigned int regno;
|
||||||
bool duplicated;
|
bool duplicated;
|
||||||
|
|
||||||
if (ASSEMBLER_DIALECT == ASM_ATT)
|
if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
|
||||||
putc ('%', file);
|
putc ('%', file);
|
||||||
|
|
||||||
if (x == pc_rtx)
|
if (x == pc_rtx)
|
||||||
|
@ -17999,6 +18000,14 @@ print_reg (rtx x, int code, FILE *file)
|
||||||
return;
|
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;
|
duplicated = code == 'd' && TARGET_AVX;
|
||||||
|
|
||||||
switch (msize)
|
switch (msize)
|
||||||
|
@ -18118,6 +18127,7 @@ print_reg (rtx x, int code, FILE *file)
|
||||||
& -- print some in-use local-dynamic symbol name.
|
& -- print some in-use local-dynamic symbol name.
|
||||||
H -- print a memory address offset by 8; used for sse high-parts
|
H -- print a memory address offset by 8; used for sse high-parts
|
||||||
Y -- print condition for XOP pcom* instruction.
|
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 branch hint as 'cs' or 'ds' prefix
|
||||||
; -- print a semicolon (after prefixes due to bug in older gas).
|
; -- print a semicolon (after prefixes due to bug in older gas).
|
||||||
~ -- print "i" if TARGET_AVX2, "f" otherwise.
|
~ -- print "i" if TARGET_AVX2, "f" otherwise.
|
||||||
|
@ -18342,6 +18352,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
|
||||||
case 'X':
|
case 'X':
|
||||||
case 'P':
|
case 'P':
|
||||||
case 'p':
|
case 'p':
|
||||||
|
case 'V':
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
|
|
|
@ -8778,6 +8778,9 @@ The table below shows the list of supported modifiers and their effects.
|
||||||
@tab @code{2}
|
@tab @code{2}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
|
@code{V} is a special modifier which prints the name of the full integer
|
||||||
|
register without @code{%}.
|
||||||
|
|
||||||
@anchor{x86floatingpointasmoperands}
|
@anchor{x86floatingpointasmoperands}
|
||||||
@subsubsection x86 Floating-Point @code{asm} Operands
|
@subsubsection x86 Floating-Point @code{asm} Operands
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2018-01-16 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
Backport from mainline
|
Backport from mainline
|
||||||
|
|
|
@ -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 } } } } */
|
Loading…
Reference in New Issue