diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-14 22:20:17 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-14 22:20:17 +0000 |
commit | 676fcf5f531d68c1f99211e99feb35c980591ad2 (patch) | |
tree | 991376abc0fe468504e81788547fbf4380567847 | |
parent | c918563733503635c90b00b773ddf14ec0385867 (diff) | |
download | gcc-676fcf5f531d68c1f99211e99feb35c980591ad2.tar.gz |
Add -maddress-mode=short|long for x86
2012-03-14 H.J. Lu <hongjiu.lu@intel.com>
PR target/50797
* config/i386/i386-opts.h (pmode): New.
* config/i386/i386.c (ix86_option_override_internal): Properly
check and set ix86_pmode.
* config/i386/i386.h (Pmode): Check ix86_pmode instead of
TARGET_64BIT.
* config/i386/i386.opt (maddress-mode=): New.
* doc/invoke.texi: Document -maddress-mode=short|long for x86.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185396 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/config/i386/i386-opts.h | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 11 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 2 | ||||
-rw-r--r-- | gcc/config/i386/i386.opt | 14 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 14 |
6 files changed, 59 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6034f744657..5999104d6cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2012-03-14 H.J. Lu <hongjiu.lu@intel.com> + + PR target/50797 + * config/i386/i386-opts.h (pmode): New. + + * config/i386/i386.c (ix86_option_override_internal): Properly + check and set ix86_pmode. + + * config/i386/i386.h (Pmode): Check ix86_pmode instead of + TARGET_64BIT. + + * config/i386/i386.opt (maddress-mode=): New. + + * doc/invoke.texi: Document -maddress-mode=short|long for x86. + 2012-03-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * dwarf2cfi.c (def_cfa_0): Remove MIPS_DEBUGGING_INFO handling. diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h index 3cc2253c3c2..eea85fd8a26 100644 --- a/gcc/config/i386/i386-opts.h +++ b/gcc/config/i386/i386-opts.h @@ -71,6 +71,11 @@ enum cmodel { CM_LARGE_PIC /* No assumptions. */ }; +enum pmode { + PMODE_SI, /* Pmode == SImode. */ + PMODE_DI /* Pmode == DImode. */ +}; + enum asm_dialect { ASM_ATT, ASM_INTEL diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c5c16e59278..fec125a68b3 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3172,6 +3172,17 @@ ix86_option_override_internal (bool main_args_p) else ix86_arch_specified = 1; + if (global_options_set.x_ix86_pmode) + { + if ((TARGET_LP64 && ix86_pmode == PMODE_SI) + || (!TARGET_64BIT && ix86_pmode == PMODE_DI)) + error ("address mode %qs not supported in the %s bit mode", + TARGET_64BIT ? "short" : "long", + TARGET_64BIT ? "64" : "32"); + } + else + ix86_pmode = TARGET_LP64 ? PMODE_DI : PMODE_SI; + if (!global_options_set.x_ix86_abi) ix86_abi = DEFAULT_ABI; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index c7d645eef65..9e5ac00fb78 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1748,7 +1748,7 @@ do { \ /* Specify the machine mode that pointers have. After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */ -#define Pmode (TARGET_64BIT ? DImode : SImode) +#define Pmode (ix86_pmode == PMODE_DI ? DImode : SImode) /* A C expression whose value is zero if pointers that need to be extended from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index 1d8dc44e72f..29f1082b2d1 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -159,6 +159,20 @@ Enum(cmodel) String(32) Value(CM_32) EnumValue Enum(cmodel) String(kernel) Value(CM_KERNEL) +maddress-mode= +Target RejectNegative Joined Enum(pmode) Var(ix86_pmode) Init(PMODE_SI) +Use given address mode + +Enum +Name(pmode) Type(enum pmode) +Known address mode (for use with the -maddress-mode= option): + +EnumValue +Enum(pmode) String(short) Value(PMODE_SI) + +EnumValue +Enum(pmode) String(long) Value(PMODE_DI) + mcpu= Target RejectNegative Joined Undocumented Alias(mtune=) Warn(%<-mcpu=%> is deprecated; use %<-mtune=%> or %<-march=%> instead) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 94bfd239c04..cf23ced85c9 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -634,7 +634,7 @@ Objective-C and Objective-C++ Dialects}. -mveclibabi=@var{type} -mvect8-ret-in-mem @gol -mpc32 -mpc64 -mpc80 -mstackrealign @gol -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs @gol --mcmodel=@var{code-model} -mabi=@var{name} @gol +-mcmodel=@var{code-model} -mabi=@var{name} -maddress-mode=@var{mode} @gol -m32 -m64 -mx32 -mlarge-data-threshold=@var{num} @gol -msse2avx -mfentry -m8bit-idiv @gol -mavx256-split-unaligned-load -mavx256-split-unaligned-store} @@ -13929,6 +13929,18 @@ be statically or dynamically linked. @opindex mcmodel=large Generate code for the large model. This model makes no assumptions about addresses and sizes of sections. + +@item -maddress-mode=long +@opindex maddress-mode=long +Generate code for long address mode. This is only supported for 64-bit +and x32 environments. It is the default address mode for 64-bit +environments. + +@item -maddress-mode=short +@opindex maddress-mode=short +Generate code for short address mode. This is only supported for 32-bit +and x32 environments. It is the default address mode for 32-bit and +x32 environments. @end table @node i386 and x86-64 Windows Options |