invoke.texi (RS/6000 and PowerPC Options): Add -mmfcrf, -mpopcntb, -mfprnd.

* doc/invoke.texi (RS/6000 and PowerPC Options): Add -mmfcrf,
        -mpopcntb, -mfprnd. Add -mcpu=power5+.
        * configure.ac: Add test for FP rounding instructions.
        * configure: Regenerate.
        * config.in: Regenerate.
        * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
        _ARCH_PPCSQ, _ARCH_PPCGR, _ARCH_PWR4, _ARCH_PWR5, _ARCH_PWR5X if
        features enabled.
        * config/rs6000/rs6000.opt (mfprnd): New.
        * config/rs6000/rs6000.c (processor_target_table): Add power5+.
        (POWERPC_MASKS): Add MASK_POPCNTB and MASK_FPRND.
        * config/rs6000/aix52.h (ASM_CPU_SPEC): Add -mpower5+.
        * config/rs6000/rs6000.h (ASM_CPU_SPEC): Add -mpower5+.
        (TARGET_FPRND): New.
        * config/rs6000/rs6000.md (UNSPEC_FRIM, UNSPEC_FRIN, UNSPEC_FRIP,
        UNSPEC_FRIZ): New.
        (btrunc<mode>2): New.
        (ceil<mode>2): New.
        (floor<mode>2): New.
        (round<mode>2): New.

From-SVN: r106938
This commit is contained in:
David Edelsohn 2005-11-15 05:00:40 +00:00 committed by David Edelsohn
parent f47bddec0c
commit 9719f3b792
11 changed files with 222 additions and 18 deletions

View File

@ -1,3 +1,26 @@
2005-11-14 David Edelsohn <edelsohn@gnu.org>
* doc/invoke.texi (RS/6000 and PowerPC Options): Add -mmfcrf,
-mpopcntb, -mfprnd. Add -mcpu=power5+.
* configure.ac: Add test for FP rounding instructions.
* configure: Regenerate.
* config.in: Regenerate.
* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
_ARCH_PPCSQ, _ARCH_PPCGR, _ARCH_PWR4, _ARCH_PWR5, _ARCH_PWR5X if
features enabled.
* config/rs6000/rs6000.opt (mfprnd): New.
* config/rs6000/rs6000.c (processor_target_table): Add power5+.
(POWERPC_MASKS): Add MASK_POPCNTB and MASK_FPRND.
* config/rs6000/aix52.h (ASM_CPU_SPEC): Add -mpower5+.
* config/rs6000/rs6000.h (ASM_CPU_SPEC): Add -mpower5+.
(TARGET_FPRND): New.
* config/rs6000/rs6000.md (UNSPEC_FRIM, UNSPEC_FRIN, UNSPEC_FRIP,
UNSPEC_FRIZ): New.
(btrunc<mode>2): New.
(ceil<mode>2): New.
(floor<mode>2): New.
(round<mode>2): New.
2005-11-14 Geoffrey Keating <geoffk@apple.com>
* gcc.c (version_compare_spec_function): Use fatal() rather than

View File

@ -161,6 +161,12 @@
#endif
/* Define if your assembler supports fprnd. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_FPRND
#endif
/* Define if your assembler supports the --gdwarf2 option. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_GDWARF2_DEBUG_FLAG

View File

@ -61,6 +61,7 @@ do { \
%{mcpu=power3: -m620} \
%{mcpu=power4: -m620} \
%{mcpu=power5: -m620} \
%{mcpu=power5+: -m620} \
%{mcpu=powerpc: -mppc} \
%{mcpu=rs64a: -mppc} \
%{mcpu=603: -m603} \

View File

@ -94,8 +94,18 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
builtin_define ("_ARCH_PWR");
if (TARGET_POWERPC)
builtin_define ("_ARCH_PPC");
if (TARGET_PPC_GPOPT)
builtin_define ("_ARCH_PPCSQ");
if (TARGET_PPC_GFXOPT)
builtin_define ("_ARCH_PPCGR");
if (TARGET_POWERPC64)
builtin_define ("_ARCH_PPC64");
if (TARGET_MFCRF)
builtin_define ("_ARCH_PWR4");
if (TARGET_POPCNTB)
builtin_define ("_ARCH_PWR5");
if (TARGET_FPRND)
builtin_define ("_ARCH_PWR5X");
if (! TARGET_POWER && ! TARGET_POWER2 && ! TARGET_POWERPC)
builtin_define ("_ARCH_COM");
if (TARGET_ALTIVEC)

View File

@ -1152,6 +1152,9 @@ rs6000_override_options (const char *default_cpu)
{"power5", PROCESSOR_POWER5,
POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
| MASK_MFCRF | MASK_POPCNTB},
{"power5+", PROCESSOR_POWER5,
POWERPC_BASE_MASK | MASK_POWERPC64 | MASK_PPC_GFXOPT
| MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
{"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
{"powerpc64", PROCESSOR_POWERPC64,
POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
@ -1177,7 +1180,7 @@ rs6000_override_options (const char *default_cpu)
POWER_MASKS = MASK_POWER | MASK_POWER2 | MASK_MULTIPLE | MASK_STRING,
POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT
| MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
| MASK_MFCRF)
| MASK_MFCRF | MASK_POPCNTB | MASK_FPRND)
};
rs6000_init_hard_regno_mode_ok ();

View File

@ -72,6 +72,7 @@
%{mcpu=power3: -mppc64} \
%{mcpu=power4: -mpower4} \
%{mcpu=power5: -mpower4} \
%{mcpu=power5+: -mpower4} \
%{mcpu=powerpc: -mppc} \
%{mcpu=rios: -mpwr} \
%{mcpu=rios1: -mpwr} \
@ -151,6 +152,14 @@
#define TARGET_POPCNTB 0
#endif
/* Define TARGET_FPRND if the target assembler does not support the
fp rounding instructions. */
#ifndef HAVE_AS_FPRND
#undef TARGET_FPRND
#define TARGET_FPRND 0
#endif
#ifndef TARGET_SECURE_PLT
#define TARGET_SECURE_PLT 0
#endif

View File

@ -34,6 +34,10 @@
(UNSPEC_MOVSI_GOT 8)
(UNSPEC_MV_CR_OV 9) ; move_from_CR_ov_bit
(UNSPEC_FCTIWZ 10)
(UNSPEC_FRIM 11)
(UNSPEC_FRIN 12)
(UNSPEC_FRIP 13)
(UNSPEC_FRIZ 14)
(UNSPEC_LD_MPIC 15) ; load_macho_picbase
(UNSPEC_MPIC_CORRECT 16) ; macho_correct_pic
(UNSPEC_TLSGD 17)
@ -5317,6 +5321,62 @@
"{fcirz|fctiwz} %0,%1"
[(set_attr "type" "fp")])
(define_insn "btruncdf2"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIZ))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"friz %0,%1"
[(set_attr "type" "fp")])
(define_insn "btruncsf2"
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIZ))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frizs %0,%1"
[(set_attr "type" "fp")])
(define_insn "ceildf2"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIP))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frip %0,%1"
[(set_attr "type" "fp")])
(define_insn "ceilsf2"
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIP))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frips %0,%1"
[(set_attr "type" "fp")])
(define_insn "floordf2"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIM))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frim %0,%1"
[(set_attr "type" "fp")])
(define_insn "floorsf2"
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIM))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frims %0,%1"
[(set_attr "type" "fp")])
(define_insn "rounddf2"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
(unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRIN))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frin %0,%1"
[(set_attr "type" "fp")])
(define_insn "roundsf2"
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
(unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRIN))]
"TARGET_FPRND && TARGET_HARD_FLOAT && TARGET_FPRS"
"frins %0,%1"
[(set_attr "type" "fp")])
; An UNSPEC is used so we don't have to support SImode in FP registers.
(define_insn "stfiwx"
[(set (match_operand:SI 0 "memory_operand" "=Z")

View File

@ -54,11 +54,15 @@ Use PowerPC Graphics group optional instructions
mmfcrf
Target Report Mask(MFCRF)
Generate single field mfcr instruction
Use PowerPC V2.01 single field mfcr instruction
mpopcntb
Target Report Mask(POPCNTB)
Use PowerPC/AS popcntb instruction
Use PowerPC V2.02 popcntb instruction
mfprnd
Target Report Mask(FPRND)
Use PowerPC V2.02 floating point rounding instructions
maltivec
Target Report Mask(ALTIVEC)

46
gcc/configure vendored
View File

@ -15574,6 +15574,52 @@ cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_POPCNTB 1
_ACEOF
fi
case $target in
*-*-aix*) conftest_s=' .machine "pwr5x"
.csect .text[PR]
frin 1,1';;
*) conftest_s=' .machine power5x
.text
frin 1,1';;
esac
echo "$as_me:$LINENO: checking assembler for fp round support" >&5
echo $ECHO_N "checking assembler for fp round support... $ECHO_C" >&6
if test "${gcc_cv_as_powerpc_fprnd+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
gcc_cv_as_powerpc_fprnd=no
if test $in_tree_gas = yes; then
if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 17 \) \* 1000 + 0`
then gcc_cv_as_powerpc_fprnd=yes
fi
elif test x$gcc_cv_as != x; then
echo "$conftest_s" > conftest.s
if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }
then
gcc_cv_as_powerpc_fprnd=yes
else
echo "configure: failed program was" >&5
cat conftest.s >&5
fi
rm -f conftest.o conftest.s
fi
fi
echo "$as_me:$LINENO: result: $gcc_cv_as_powerpc_fprnd" >&5
echo "${ECHO_T}$gcc_cv_as_powerpc_fprnd" >&6
if test $gcc_cv_as_powerpc_fprnd = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_FPRND 1
_ACEOF
fi
case $target in

View File

@ -2762,6 +2762,21 @@ foo: nop
[AC_DEFINE(HAVE_AS_POPCNTB, 1,
[Define if your assembler supports popcntb field.])])
case $target in
*-*-aix*) conftest_s=' .machine "pwr5x"
.csect .text[[PR]]
frin 1,1';;
*) conftest_s=' .machine power5x
.text
frin 1,1';;
esac
gcc_GAS_CHECK_FEATURE([fp round support],
gcc_cv_as_powerpc_fprnd, [2,17,0],,
[$conftest_s],,
[AC_DEFINE(HAVE_AS_FPRND, 1,
[Define if your assembler supports fprnd.])])
case $target in
*-*-aix*) conftest_s=' .csect .text[[PR]]
LCF..0:

View File

@ -636,6 +636,7 @@ See RS/6000 and PowerPC Options.
-maltivec -mno-altivec @gol
-mpowerpc-gpopt -mno-powerpc-gpopt @gol
-mpowerpc-gfxopt -mno-powerpc-gfxopt @gol
-mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mfprnd -mno-fprnd @gol
-mnew-mnemonics -mold-mnemonics @gol
-mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc @gol
-m64 -m32 -mxl-compat -mno-xl-compat -mpe @gol
@ -10830,6 +10831,12 @@ These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
@itemx -mno-powerpc-gfxopt
@itemx -mpowerpc64
@itemx -mno-powerpc64
@itemx -mmfcrf
@itemx -mno-mfcrf
@itemx -mpopcntb
@itemx -mno-popcntb
@itemx -mfprnd
@itemx -mno-fprnd
@opindex mpower
@opindex mno-power
@opindex mpower2
@ -10842,12 +10849,18 @@ These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
@opindex mno-powerpc-gfxopt
@opindex mpowerpc64
@opindex mno-powerpc64
@opindex mmfcrf
@opindex mno-mfcrf
@opindex mpopcntb
@opindex mno-popcntb
@opindex mfprnd
@opindex mno-fprnd
GCC supports two related instruction set architectures for the
RS/6000 and PowerPC@. The @dfn{POWER} instruction set are those
instructions supported by the @samp{rios} chip set used in the original
RS/6000 systems and the @dfn{PowerPC} instruction set is the
architecture of the Motorola MPC5xx, MPC6xx, MPC8xx microprocessors, and
the IBM 4xx microprocessors.
architecture of the Freescale MPC5xx, MPC6xx, MPC8xx microprocessors, and
the IBM 4xx, 6xx, and follow-on microprocessors.
Neither architecture is a subset of the other. However there is a
large common subset of instructions supported by both. An MQ
@ -10875,6 +10888,18 @@ General Purpose group, including floating-point square root. Specifying
use the optional PowerPC architecture instructions in the Graphics
group, including floating-point select.
The @option{-mmfcrf} option allows GCC to generate the move from
condition register field instruction implemented on the POWER4
processor and other processors that support the PowerPC V2.01
architecture.
The @option{-mpopcntb} option allows GCC to generate the popcount and
double precision FP reciprocal estimate instruction implemented on the
POWER5 processor and other processors that support the PowerPC V2.02
architecture.
The @option{-mfprnd} option allows GCC to generate the FP round to
integer instructions implemented on the POWER5+ processor and other
processors that support the PowerPC V2.03 architecture.
The @option{-mpowerpc64} option allows GCC to generate the additional
64-bit instructions that are found in the full PowerPC64 architecture
and to treat GPRs as 64-bit, doubleword quantities. GCC defaults to
@ -10913,9 +10938,10 @@ Supported values for @var{cpu_type} are @samp{401}, @samp{403},
@samp{601}, @samp{602}, @samp{603}, @samp{603e}, @samp{604},
@samp{604e}, @samp{620}, @samp{630}, @samp{740}, @samp{7400},
@samp{7450}, @samp{750}, @samp{801}, @samp{821}, @samp{823},
@samp{860}, @samp{970}, @samp{8540}, @samp{common}, @samp{ec603e}, @samp{G3},
@samp{860}, @samp{970}, @samp{8540}, @samp{ec603e}, @samp{G3},
@samp{G4}, @samp{G5}, @samp{power}, @samp{power2}, @samp{power3},
@samp{power4}, @samp{power5}, @samp{powerpc}, @samp{powerpc64},
@samp{power4}, @samp{power5}, @samp{power5+},
@samp{common}, @samp{powerpc}, @samp{powerpc64},
@samp{rios}, @samp{rios1}, @samp{rios2}, @samp{rsc}, and @samp{rs64}.
@option{-mcpu=common} selects a completely generic processor. Code
@ -10935,19 +10961,20 @@ those options will run best on that processor, and may not run at all on
others.
The @option{-mcpu} options automatically enable or disable the
following options: @option{-maltivec}, @option{-mhard-float},
@option{-mmfcrf}, @option{-mmultiple}, @option{-mnew-mnemonics},
@option{-mpower}, @option{-mpower2}, @option{-mpowerpc64},
@option{-mpowerpc-gpopt}, @option{-mpowerpc-gfxopt},
@option{-mstring}. The particular options set for any particular CPU
will vary between compiler versions, depending on what setting seems
to produce optimal code for that CPU; it doesn't necessarily reflect
the actual hardware's capabilities. If you wish to set an individual
option to a particular value, you may specify it after the
@option{-mcpu} option, like @samp{-mcpu=970 -mno-altivec}.
following options: @option{-maltivec}, @option{-mfprnd},
@option{-mhard-float}, @option{-mmfcrf}, @option{-mmultiple},
@option{-mnew-mnemonics}, @option{-mpopcntb}, @option{-mpower},
@option{-mpower2}, @option{-mpowerpc64}, @option{-mpowerpc-gpopt},
@option{-mpowerpc-gfxopt}, @option{-mstring}. The particular options
set for any particular CPU will vary between compiler versions,
depending on what setting seems to produce optimal code for that CPU;
it doesn't necessarily reflect the actual hardware's capabilities. If
you wish to set an individual option to a particular value, you may
specify it after the @option{-mcpu} option, like @samp{-mcpu=970
-mno-altivec}.
On AIX, the @option{-maltivec} and @option{-mpowerpc64} options are
not enabled or disabled by the @option{-mcpu} option at present, since
not enabled or disabled by the @option{-mcpu} option at present because
AIX does not have full support for these options. You may still
enable or disable them individually if you're sure it'll work in your
environment.