[Bug target/81490] x86: Handling of symbol ranges for __seg_fs/__seg_gs
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Jul 31 15:47:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81490
--- Comment #15 from Uroš Bizjak <ubizjak at gmail dot com> ---
I'm testing the following patch:
--cut here--
Index: i386.c
===================================================================
--- i386.c (revision 250745)
+++ i386.c (working copy)
@@ -19421,8 +19421,10 @@ ix86_print_operand_address_as (FILE *file, rtx add
fputs (string, file);
}
- /* Use one byte shorter RIP relative addressing for 64bit mode. */
- if (TARGET_64BIT && !base && !index && !no_rip)
+ /* Use one byte shorter RIP relative addressing for
+ symbols in the generic address space. */
+ if (TARGET_64BIT && !base && !index
+ && ADDR_SPACE_GENERIC_P (as) && !no_rip)
{
rtx symbol = disp;
@@ -19442,7 +19444,7 @@ ix86_print_operand_address_as (FILE *file, rtx add
/* Displacement only requires special attention. */
if (CONST_INT_P (disp))
{
- if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg ==
ADDR_SPACE_GENERIC)
+ if (ASSEMBLER_DIALECT == ASM_INTEL && ADDR_SPACE_GENERIC_P (as))
fputs ("ds:", file);
fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
}
--cut here--
The patched compiler compiles following testcase:
--cut here--
int __seg_gs a;
void test_as (void)
{
a += 1;
}
__thread int b;
void test_thr (void)
{
b += 2;
}
--cut here--
to:
test_as:
addl $1, %gs:a
ret
test_thr:
addl $2, %fs:b@tpoff
ret
More information about the Gcc-bugs
mailing list