Commit bb664f09 by Uros Bizjak Committed by Uros Bizjak

re PR target/55712 (cpuinfo.c doesn't compile for x86-64 with medium memory model)

	PR target/55712
	* config/i386/i386-c.c (ix86_target_macros_internal): Depending on
	selected code model, define __code_mode_small__, __code_model_medium__,
	__code_model_large__, __code_model_32__ or __code_model_kernel__.
	* config/i386/cpuid.h (__cpuid, __cpuid_count) [__i386__]: Prefix
	xchg temporary register with %k.  Declare temporary register as
	early clobbered.
	[__x86_64__]: For medium and large code models, preserve %rbx register.

From-SVN: r194862
parent 49c01f87
2013-01-03 Uros Bizjak <ubizjak@gmail.com>
PR target/55712
* config/i386/i386-c.c (ix86_target_macros_internal): Depending on
selected code model, define __code_mode_small__, __code_model_medium__,
__code_model_large__, __code_model_32__ or __code_model_kernel__.
* config/i386/cpuid.h (__cpuid, __cpuid_count) [__i386__]: Prefix
xchg temporary register with %k. Declare temporary register as
early clobbered.
[__x86_64__]: For medium and large code models, preserve %rbx register.
2013-01-03 Richard Biener <rguenther@suse.de> 2013-01-03 Richard Biener <rguenther@suse.de>
* tree-data-ref.c (dump_conflict_function): Use less vertical * tree-data-ref.c (dump_conflict_function): Use less vertical
......
/* /*
* Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013
* Free Software Foundation, Inc. * Free Software Foundation, Inc.
* *
* This file is free software; you can redistribute it and/or modify it * This file is free software; you can redistribute it and/or modify it
...@@ -136,35 +136,50 @@ ...@@ -136,35 +136,50 @@
/* %ebx may be the PIC register. */ /* %ebx may be the PIC register. */
#if __GNUC__ >= 3 #if __GNUC__ >= 3
#define __cpuid(level, a, b, c, d) \ #define __cpuid(level, a, b, c, d) \
__asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \ __asm__ ("xchg{l}\t{%%}ebx, %k1\n\t" \
"cpuid\n\t" \ "cpuid\n\t" \
"xchg{l}\t{%%}ebx, %1\n\t" \ "xchg{l}\t{%%}ebx, %k1\n\t" \
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ : "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level)) : "0" (level))
#define __cpuid_count(level, count, a, b, c, d) \ #define __cpuid_count(level, count, a, b, c, d) \
__asm__ ("xchg{l}\t{%%}ebx, %1\n\t" \ __asm__ ("xchg{l}\t{%%}ebx, %k1\n\t" \
"cpuid\n\t" \ "cpuid\n\t" \
"xchg{l}\t{%%}ebx, %1\n\t" \ "xchg{l}\t{%%}ebx, %k1\n\t" \
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ : "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level), "2" (count)) : "0" (level), "2" (count))
#else #else
/* Host GCCs older than 3.0 weren't supporting Intel asm syntax /* Host GCCs older than 3.0 weren't supporting Intel asm syntax
nor alternatives in i386 code. */ nor alternatives in i386 code. */
#define __cpuid(level, a, b, c, d) \ #define __cpuid(level, a, b, c, d) \
__asm__ ("xchgl\t%%ebx, %1\n\t" \ __asm__ ("xchgl\t%%ebx, %k1\n\t" \
"cpuid\n\t" \ "cpuid\n\t" \
"xchgl\t%%ebx, %1\n\t" \ "xchgl\t%%ebx, %k1\n\t" \
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ : "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level)) : "0" (level))
#define __cpuid_count(level, count, a, b, c, d) \ #define __cpuid_count(level, count, a, b, c, d) \
__asm__ ("xchgl\t%%ebx, %1\n\t" \ __asm__ ("xchgl\t%%ebx, %k1\n\t" \
"cpuid\n\t" \ "cpuid\n\t" \
"xchgl\t%%ebx, %1\n\t" \ "xchgl\t%%ebx, %k1\n\t" \
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ : "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level), "2" (count)) : "0" (level), "2" (count))
#endif #endif
#elif defined(__x86_64__) && (defined(__code_model_medium__) || defined(__code_model_large__)) && defined(__PIC__)
/* %rbx may be the PIC register. */
#define __cpuid(level, a, b, c, d) \
__asm__ ("xchg{q}\t{%%}rbx, %q1\n\t" \
"cpuid\n\t" \
"xchg{q}\t{%%}rbx, %q1\n\t" \
: "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level))
#define __cpuid_count(level, count, a, b, c, d) \
__asm__ ("xchg{q}\t{%%}rbx, %q1\n\t" \
"cpuid\n\t" \
"xchg{q}\t{%%}rbx, %q1\n\t" \
: "=a" (a), "=&r" (b), "=c" (c), "=d" (d) \
: "0" (level), "2" (count))
#else #else
#define __cpuid(level, a, b, c, d) \ #define __cpuid(level, a, b, c, d) \
__asm__ ("cpuid\n\t" \ __asm__ ("cpuid\n\t" \
......
/* Subroutines used for macro/preprocessor support on the ia-32. /* Subroutines used for macro/preprocessor support on the ia-32.
Copyright (C) 2008, 2009, 2010, 2011, 2012 Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -243,6 +243,30 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag, ...@@ -243,6 +243,30 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
break; break;
} }
switch (ix86_cmodel)
{
case CM_SMALL:
case CM_SMALL_PIC:
def_or_undef (parse_in, "__code_model_small__");
break;
case CM_MEDIUM:
case CM_MEDIUM_PIC:
def_or_undef (parse_in, "__code_model_medium__");
break;
case CM_LARGE:
case CM_LARGE_PIC:
def_or_undef (parse_in, "__code_model_large__");
break;
case CM_32:
def_or_undef (parse_in, "__code_model_32__");
break;
case CM_KERNEL:
def_or_undef (parse_in, "__code_model_kernel__");
break;
default:
;
}
if (isa_flag & OPTION_MASK_ISA_MMX) if (isa_flag & OPTION_MASK_ISA_MMX)
def_or_undef (parse_in, "__MMX__"); def_or_undef (parse_in, "__MMX__");
if (isa_flag & OPTION_MASK_ISA_3DNOW) if (isa_flag & OPTION_MASK_ISA_3DNOW)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment