; Options for the rs6000 port of the compiler
;
; Copyright (C) 2005 Free Software Foundation, Inc.
; Contributed by Aldy Hernandez <aldy@quesejoda.com>.
;
; This file is part of GCC.
;
; GCC is free software; you can redistribute it and/or modify it under
; the terms of the GNU General Public License as published by the Free
; Software Foundation; either version 2, or (at your option) any later
; version.
;
; GCC is distributed in the hope that it will be useful, but WITHOUT
; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
; License for more details.
;
; You should have received a copy of the GNU General Public License
; along with GCC; see the file COPYING.  If not, write to the Free
; Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
; 02110-1301, USA.

mpower
Target Report RejectNegative Mask(POWER)
Use POWER instruction set

mno-power
Target Report RejectNegative
Do not use POWER instruction set

mpower2
Target Report Mask(POWER2)
Use POWER2 instruction set

mpowerpc
Target Report RejectNegative Mask(POWERPC)
Use PowerPC instruction set

mno-powerpc
Target Report RejectNegative
Do not use PowerPC instruction set

mpowerpc64
Target Report Mask(POWERPC64)
Use PowerPC-64 instruction set

mpowerpc-gpopt
Target Report Mask(PPC_GPOPT)
Use PowerPC General Purpose group optional instructions

mpowerpc-gfxopt
Target Report Mask(PPC_GFXOPT)
Use PowerPC Graphics group optional instructions

mmfcrf
Target Report Mask(MFCRF)
Use PowerPC V2.01 single field mfcr instruction

mpopcntb
Target Report Mask(POPCNTB)
Use PowerPC V2.02 popcntb instruction

mfprnd
Target Report Mask(FPRND)
Use PowerPC V2.02 floating point rounding instructions

maltivec
Target Report Mask(ALTIVEC)
Use AltiVec instructions

; APPLE LOCAL begin AltiVec
mpim-altivec
Target Report Var(rs6000_altivec_pim)
Enable use of Motorola AltiVec PIM operations and predicates

mmask-pim-altivec
Target Undocumented Mask(PIM_ALTIVEC)
; APPLE LOCAL end AltiVec

mmulhw
Target Report Mask(MULHW)
Use 4xx half-word multiply instructions

mdlmzb
Target Report Mask(DLMZB)
Use 4xx string-search dlmzb instruction

mmultiple
Target Report Mask(MULTIPLE)
Generate load/store multiple instructions

mstring
Target Report Mask(STRING)
Generate string instructions for block moves

mnew-mnemonics
Target Report RejectNegative Mask(NEW_MNEMONICS)
Use new mnemonics for PowerPC architecture

mold-mnemonics
Target Report RejectNegative InverseMask(NEW_MNEMONICS)
Use old mnemonics for PowerPC architecture

msoft-float
Target Report RejectNegative Mask(SOFT_FLOAT)
Do not use hardware floating point

mhard-float
Target Report RejectNegative InverseMask(SOFT_FLOAT, HARD_FLOAT)
Use hardware floating point

mno-update
Target Report RejectNegative Mask(NO_UPDATE)
Do not generate load/store with update instructions

mupdate
Target Report RejectNegative InverseMask(NO_UPDATE, UPDATE)
Generate load/store with update instructions

mno-fused-madd
Target Report RejectNegative Mask(NO_FUSED_MADD)
Do not generate fused multiply/add instructions

mfused-madd
Target Report RejectNegative InverseMask(NO_FUSED_MADD, FUSED_MADD)
Generate fused multiply/add instructions

msched-prolog
Target Report Var(TARGET_SCHED_PROLOG) Init(1)
Schedule the start and end of the procedure

msched-epilog
Target Undocumented Var(TARGET_SCHED_PROLOG) VarExists

maix-struct-return
Target Report RejectNegative Var(aix_struct_return)
Return all structures in memory (AIX default)

msvr4-struct-return
Target Report RejectNegative Var(aix_struct_return,0) VarExists
Return small structures in registers (SVR4 default)

mxl-compat
Target Report Var(TARGET_XL_COMPAT)
Conform more closely to IBM XLC semantics

mswdiv
Target Report Var(swdiv)
Generate software floating point divide for better throughput

mno-fp-in-toc
Target Report RejectNegative Var(TARGET_NO_FP_IN_TOC)
Do not place floating point constants in TOC

mfp-in-toc
Target Report RejectNegative Var(TARGET_NO_FP_IN_TOC,0)
Place floating point constants in TOC

mno-sum-in-toc
Target RejectNegative Var(TARGET_NO_SUM_IN_TOC)
Do not place symbol+offset constants in TOC

msum-in-toc
Target RejectNegative Var(TARGET_NO_SUM_IN_TOC,0) VarExists
Place symbol+offset constants in TOC

;  Output only one TOC entry per module.  Normally linking fails if
;   there are more than 16K unique variables/constants in an executable.  With
;   this option, linking fails only if there are more than 16K modules, or
;   if there are more than 16K unique variables/constant in a single module.
;
;   This is at the cost of having 2 extra loads and one extra store per
;   function, and one less allocable register.
mminimal-toc
Target Report Mask(MINIMAL_TOC)
Use only one TOC entry per procedure

mfull-toc
Target Report
Put everything in the regular TOC

mvrsave
Target Report Var(TARGET_ALTIVEC_VRSAVE)
Generate VRSAVE instructions when generating AltiVec code

mvrsave=
Target RejectNegative Joined
-mvrsave=yes/no	Deprecated option.  Use -mvrsave/-mno-vrsave instead

misel
Target Var(rs6000_isel)
Generate isel instructions

misel=
Target RejectNegative Joined
-misel=yes/no	Deprecated option.  Use -misel/-mno-isel instead

mspe
Target Var(rs6000_spe)
Generate SPE SIMD instructions on E500

mspe=
Target RejectNegative Joined
-mspe=yes/no	Deprecated option.  Use -mspe/-mno-spe instead

mdebug=
Target RejectNegative Joined
-mdebug=	Enable debug output

mabi=
Target RejectNegative Joined
-mabi=	Specify ABI to use

mcpu=
Target RejectNegative Joined
-mcpu=	Use features of and schedule code for given CPU

mtune=
Target RejectNegative Joined
-mtune=	Schedule code for given CPU

mtraceback=
Target RejectNegative Joined
-mtraceback=	Select full, part, or no traceback table

mlongcall
Target Report Var(rs6000_default_long_calls)
Avoid all range limits on call instructions

; APPLE LOCAL begin long-branch
mlong-branch
Target Report Var(rs6000_default_long_calls)
Deprecated option.  Use -mlongcall instead
; APPLE LOCAL end long-branch

mwarn-altivec-long
Target Var(rs6000_warn_altivec_long) Init(1)
Warn about deprecated 'vector long ...' AltiVec type usage

mfloat-gprs=
Target RejectNegative Joined
-mfloat-gprs=	Select GPR floating point method

mlong-double-
Target RejectNegative Joined UInteger
-mlong-double-<n>	Specify size of long double (64 or 128 bits)

msched-costly-dep=
Target RejectNegative Joined 
Determine which dependences between insns are considered costly

minsert-sched-nops=
Target RejectNegative Joined
Specify which post scheduling nop insertion scheme to apply

malign-
Target RejectNegative Joined
Specify alignment of structure fields default/natural

mprioritize-restricted-insns=
Target RejectNegative Joined UInteger Var(rs6000_sched_restricted_insns_priority)
Specify scheduling priority for dispatch slot restricted insns
