invoke.texi (RS/6000 and PowerPC Options): Add -mcmpb and -mdfp.

* doc/invoke.texi (RS/6000 and PowerPC Options): Add -mcmpb and -mdfp.
	* configure.ac (HAVE_GAS_CMPB): Check for assembler support of the
	cmpb instruction.
	(HAVE_GAS_DFP): Check for assembler support of decimal floating
	point instructions.
	* configure: Regenerate.
	* config.in: Regenerate.
	* config/rs6000/rs6000.opt (mcmpb, mdfp): New.
	* config/rs6000/rs6000.c (rs6000_override_options): Add CMPB and DFP
	masks to power6 and power6x and to POWERPC_MASKS.
	* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
	_ARCH_PWR6.
	* config/rs6000/rs6000.h: Check assembler support for CMPB and DFP.
	* config/rs6000/sysv4.opt (mprototype): Use variable, not mask.
	* config/rs6000/linux64.h (SUBSUBTARGET_OVERRIDE_OPTIONS):
	Access PROTOTYPE as variable, not mask.

From-SVN: r122179
This commit is contained in:
Janis Johnson 2007-02-20 23:11:43 +00:00 committed by Janis Johnson
parent 7cd689bcf0
commit b639c3c245
11 changed files with 291 additions and 114 deletions

View File

@ -1,3 +1,22 @@
2007-02-20 Janis Johnson <janis187@us.ibm.com>
* doc/invoke.texi (RS/6000 and PowerPC Options): Add -mcmpb and -mdfp.
* configure.ac (HAVE_GAS_CMPB): Check for assembler support of the
cmpb instruction.
(HAVE_GAS_DFP): Check for assembler support of decimal floating
point instructions.
* configure: Regenerate.
* config.in: Regenerate.
* config/rs6000/rs6000.opt (mcmpb, mdfp): New.
* config/rs6000/rs6000.c (rs6000_override_options): Add CMPB and DFP
masks to power6 and power6x and to POWERPC_MASKS.
* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
_ARCH_PWR6.
* config/rs6000/rs6000.h: Check assembler support for CMPB and DFP.
* config/rs6000/sysv4.opt (mprototype): Use variable, not mask.
* config/rs6000/linux64.h (SUBSUBTARGET_OVERRIDE_OPTIONS):
Access PROTOTYPE as variable, not mask.
2007-02-20 Steven Bosscher <steven@gcc.gnu.org>
* rtl.h (remove_reg_equal_equiv_notes): New prototype.

View File

@ -160,6 +160,18 @@
#endif
/* Define if your assembler supports cmpb. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_CMPB
#endif
/* Define if your assembler supports DFP instructions. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_DFP
#endif
/* Define if your assembler supports dwarf2 .file/.loc directives, and
preserves file table indices exactly as given. */
#ifndef USED_FOR_TARGET

View File

@ -98,9 +98,9 @@ extern int dot_symbols;
target_flags &= ~MASK_EABI; \
error (INVALID_64BIT, "eabi"); \
} \
if (target_flags & MASK_PROTOTYPE) \
if (TARGET_PROTOTYPE) \
{ \
target_flags &= ~MASK_PROTOTYPE; \
TARGET_PROTOTYPE = 0; \
error (INVALID_64BIT, "prototype"); \
} \
if ((target_flags & MASK_POWERPC64) == 0) \

View File

@ -106,6 +106,8 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
builtin_define ("_ARCH_PWR5");
if (TARGET_FPRND)
builtin_define ("_ARCH_PWR5X");
if (TARGET_CMPB)
builtin_define ("_ARCH_PWR6");
if (TARGET_MFPGPR)
builtin_define ("_ARCH_PWR6X");
if (! TARGET_POWER && ! TARGET_POWER2 && ! TARGET_POWERPC)

View File

@ -1323,10 +1323,10 @@ rs6000_override_options (const char *default_cpu)
| MASK_MFCRF | MASK_POPCNTB | MASK_FPRND},
{"power6", PROCESSOR_POWER6,
POWERPC_7400_MASK | MASK_POWERPC64 | MASK_MFCRF | MASK_POPCNTB
| MASK_FPRND},
| MASK_FPRND | MASK_CMPB | MASK_DFP },
{"power6x", PROCESSOR_POWER6,
POWERPC_7400_MASK | MASK_POWERPC64 | MASK_MFCRF | MASK_POPCNTB
| MASK_FPRND | MASK_MFPGPR},
| MASK_FPRND | MASK_CMPB | MASK_MFPGPR | MASK_DFP },
{"powerpc", PROCESSOR_POWERPC, POWERPC_BASE_MASK},
{"powerpc64", PROCESSOR_POWERPC64,
POWERPC_BASE_MASK | MASK_PPC_GFXOPT | MASK_POWERPC64},
@ -1353,7 +1353,7 @@ rs6000_override_options (const char *default_cpu)
POWERPC_MASKS = (POWERPC_BASE_MASK | MASK_PPC_GPOPT | MASK_STRICT_ALIGN
| MASK_PPC_GFXOPT | MASK_POWERPC64 | MASK_ALTIVEC
| MASK_MFCRF | MASK_POPCNTB | MASK_FPRND | MASK_MULHW
| MASK_DLMZB | MASK_MFPGPR)
| MASK_DLMZB | MASK_CMPB | MASK_MFPGPR | MASK_DFP)
};
rs6000_init_hard_regno_mode_ok ();

View File

@ -164,6 +164,14 @@
#define TARGET_FPRND 0
#endif
/* Define TARGET_CMPB if the target assembler does not support the
cmpb instruction. */
#ifndef HAVE_AS_CMPB
#undef TARGET_CMPB
#define TARGET_CMPB 0
#endif
/* Define TARGET_MFPGPR if the target assembler does not support the
mffpr and mftgpr instructions. */
@ -172,6 +180,13 @@
#define TARGET_MFPGPR 0
#endif
/* Define TARGET_DFP if the target assembler does not support decimal
floating point instructions. */
#ifndef HAVE_AS_DFP
#undef TARGET_DFP
#define TARGET_DFP 0
#endif
#ifndef TARGET_SECURE_PLT
#define TARGET_SECURE_PLT 0
#endif

View File

@ -1,6 +1,6 @@
; Options for the rs6000 port of the compiler
;
; Copyright (C) 2005 Free Software Foundation, Inc.
; Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
; Contributed by Aldy Hernandez <aldy@quesejoda.com>.
;
; This file is part of GCC.
@ -64,6 +64,10 @@ mfprnd
Target Report Mask(FPRND)
Use PowerPC V2.02 floating point rounding instructions
mcmpb
Target Report Mask(CMPB)
Use PowerPC V2.05 compare bytes instruction
mmfpgpr
Target Report Mask(MFPGPR)
Use extended PowerPC V2.05 move floating point to/from GPR instructions
@ -72,6 +76,10 @@ maltivec
Target Report Mask(ALTIVEC)
Use AltiVec instructions
mdfp
Target Report Mask(DFP)
Use decimal floating point instructions
mmulhw
Target Report Mask(MULHW)
Use 4xx half-word multiply instructions

View File

@ -75,7 +75,7 @@ Target RejectNegative
no description yet
mprototype
Target Mask(PROTOTYPE)
Target Var(TARGET_PROTOTYPE)
Assume all variable arg functions are prototyped
;; FIXME: Does nothing.

290
gcc/configure vendored
View File

@ -10559,9 +10559,19 @@ fi;
lib_includedir=UNSET
lib_libdir=UNSET
use_additional=yes
acl_save_prefix="$prefix"
prefix="$acl_final_prefix"
acl_save_exec_prefix="$exec_prefix"
exec_prefix="$acl_final_exec_prefix"
eval additional_includedir=\"$includedir\"
eval additional_libdir=\"$libdir\"
exec_prefix="$acl_save_exec_prefix"
prefix="$acl_save_prefix"
# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
@ -10569,8 +10579,7 @@ if test "${with_libiconv_prefix+set}" = set; then
withval="$with_libiconv_prefix"
if test "X$withval" = "Xno"; then
lib_includedir="NONE"
lib_libdir="NONE"
use_additional=no
else
if test "X$withval" = "X"; then
@ -10579,36 +10588,19 @@ if test "${with_libiconv_prefix+set}" = set; then
acl_save_exec_prefix="$exec_prefix"
exec_prefix="$acl_final_exec_prefix"
eval lib_includedir=\"$includedir\"
eval lib_libdir=\"$libdir\"
eval additional_includedir=\"$includedir\"
eval additional_libdir=\"$libdir\"
exec_prefix="$acl_save_exec_prefix"
prefix="$acl_save_prefix"
else
lib_includedir="$withval/include"
lib_libdir="$withval/lib"
additional_includedir="$withval/include"
additional_libdir="$withval/lib"
fi
fi
fi;
acl_save_prefix="$prefix"
prefix="$acl_final_prefix"
acl_save_exec_prefix="$exec_prefix"
exec_prefix="$acl_final_exec_prefix"
test $lib_includedir = UNSET && eval lib_includedir=\"$includedir\"
test $lib_libdir = UNSET && eval lib_libdir=\"$libdir\"
exec_prefix="$acl_save_exec_prefix"
prefix="$acl_save_prefix"
LIBICONV=
LTLIBICONV=
INCICONV=
@ -10645,19 +10637,19 @@ fi;
found_la=
found_so=
found_a=
if test "$lib_libdir" != NONE; then
if test -n "$shlibext" && test -f "$lib_libdir/lib$name.$shlibext"; then
found_dir="$lib_libdir"
found_so="$lib_libdir/lib$name.$shlibext"
if test -f "$lib_libdir/lib$name.la"; then
found_la="$lib_libdir/lib$name.la"
if test $use_additional = yes; then
if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
found_dir="$additional_libdir"
found_so="$additional_libdir/lib$name.$shlibext"
if test -f "$additional_libdir/lib$name.la"; then
found_la="$additional_libdir/lib$name.la"
fi
else
if test -f "$lib_libdir/lib$name.$libext"; then
found_dir="$lib_libdir"
found_a="$lib_libdir/lib$name.$libext"
if test -f "$lib_libdir/lib$name.la"; then
found_la="$lib_libdir/lib$name.la"
if test -f "$additional_libdir/lib$name.$libext"; then
found_dir="$additional_libdir"
found_a="$additional_libdir/lib$name.$libext"
if test -f "$additional_libdir/lib$name.la"; then
found_la="$additional_libdir/lib$name.la"
fi
fi
fi
@ -10766,11 +10758,6 @@ fi;
fi
additional_includedir=
case "$found_dir" in
"$lib_libdir")
if test "$lib_includedir" != NONE; then
additional_includedir="$lib_includedir"
fi
;;
*/lib | */lib/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
additional_includedir="$basedir/include"
@ -10955,7 +10942,6 @@ fi;
am_save_CPPFLAGS="$CPPFLAGS"
for element in $INCICONV; do
@ -15602,6 +15588,98 @@ LCF0:
addis 11,30,_GLOBAL_OFFSET_TABLE_-.LCF0@ha';;
esac
case $target in
*-*-aix*) conftest_s=' .machine "pwr6"
.csect .text[PR]
cmpb 3,4,5';;
*) conftest_s=' .machine power6
.text
cmpb 3,4,5';;
esac
echo "$as_me:$LINENO: checking assembler for compare bytes support" >&5
echo $ECHO_N "checking assembler for compare bytes support... $ECHO_C" >&6
if test "${gcc_cv_as_powerpc_cmpb+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
gcc_cv_as_powerpc_cmpb=no
if test $in_tree_gas = yes; then
if test $gcc_cv_gas_vers -ge `expr \( \( 9 \* 1000 \) + 99 \) \* 1000 + 0`
then gcc_cv_as_powerpc_cmpb=yes
fi
elif test x$gcc_cv_as != x; then
echo "$conftest_s" > conftest.s
if { ac_try='$gcc_cv_as -a32 -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_cmpb=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_cmpb" >&5
echo "${ECHO_T}$gcc_cv_as_powerpc_cmpb" >&6
if test $gcc_cv_as_powerpc_cmpb = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_CMPB 1
_ACEOF
fi
case $target in
*-*-aix*) conftest_s=' .machine "pwr6"
.csect .text[PR]
dadd 1,3';;
*) conftest_s=' .machine power6
.text
dadd 1,3';;
esac
echo "$as_me:$LINENO: checking assembler for decimal float support" >&5
echo $ECHO_N "checking assembler for decimal float support... $ECHO_C" >&6
if test "${gcc_cv_as_powerpc_dfp+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
gcc_cv_as_powerpc_dfp=no
if test $in_tree_gas = yes; then
if test $gcc_cv_gas_vers -ge `expr \( \( 9 \* 1000 \) + 99 \) \* 1000 + 0`
then gcc_cv_as_powerpc_dfp=yes
fi
elif test x$gcc_cv_as != x; then
echo "$conftest_s" > conftest.s
if { ac_try='$gcc_cv_as -a32 -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_dfp=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_dfp" >&5
echo "${ECHO_T}$gcc_cv_as_powerpc_dfp" >&6
if test $gcc_cv_as_powerpc_dfp = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AS_DFP 1
_ACEOF
fi
echo "$as_me:$LINENO: checking assembler for rel16 relocs" >&5
echo $ECHO_N "checking assembler for rel16 relocs... $ECHO_C" >&6
if test "${gcc_cv_as_powerpc_rel16+set}" = set; then
@ -16014,70 +16092,70 @@ echo "${ECHO_T}$gcc_cv_ld_pie" >&6
echo "$as_me:$LINENO: checking linker EH-compatible garbage collection of sections" >&5
echo $ECHO_N "checking linker EH-compatible garbage collection of sections... $ECHO_C" >&6
gcc_cv_ld_eh_gc_sections=no
#if test $in_tree_ld = yes ; then
# if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 17 -o "$gcc_cv_gld_major_version" -gt 2 \
# && test $in_tree_ld_is_elf = yes; then
# gcc_cv_ld_eh_gc_sections=yes
# fi
#elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x -a x$gcc_cv_objdump != x ; then
# cat > conftest.s <<EOF
# .section .text
#.globl _start
# .type _start, @function
#_start:
# .long foo
# .size _start, .-_start
# .section .text.foo,"ax",@progbits
# .type foo, @function
#foo:
# .long 0
# .size foo, .-foo
# .section .gcc_except_table.foo,"a",@progbits
#.L0:
# .long 0
# .section .eh_frame,"a",@progbits
# .long .L0
#EOF
# if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
# if $gcc_cv_ld -o conftest conftest.o --entry=_start --gc-sections 2>&1 \
# | grep "gc-sections option ignored" > /dev/null; then
# gcc_cv_ld_eh_gc_sections=no
# elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
# gcc_cv_ld_eh_gc_sections=yes
# # If no COMDAT groups, the compiler will emit .gnu.linkonce.t. sections.
# if test x$gcc_cv_as_comdat_group != xyes; then
# gcc_cv_ld_eh_gc_sections=no
# cat > conftest.s <<EOF
# .section .text
#.globl _start
# .type _start, @function
#_start:
# .long foo
# .size _start, .-_start
# .section .gnu.linkonce.t.foo,"ax",@progbits
# .type foo, @function
#foo:
# .long 0
# .size foo, .-foo
# .section .gcc_except_table.foo,"a",@progbits
#.L0:
# .long 0
# .section .eh_frame,"a",@progbits
# .long .L0
#EOF
# if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
# if $gcc_cv_ld -o conftest conftest.o --entry=_start --gc-sections 2>&1 \
# | grep "gc-sections option ignored" > /dev/null; then
# gcc_cv_ld_eh_gc_sections=no
# elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
# gcc_cv_ld_eh_gc_sections=yes
# fi
# fi
# fi
# fi
# fi
# rm -f conftest.s conftest.o conftest
#fi
if test $in_tree_ld = yes ; then
if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 17 -o "$gcc_cv_gld_major_version" -gt 2 \
&& test $in_tree_ld_is_elf = yes; then
gcc_cv_ld_eh_gc_sections=yes
fi
elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x -a x$gcc_cv_objdump != x ; then
cat > conftest.s <<EOF
.section .text
.globl _start
.type _start, @function
_start:
.long foo
.size _start, .-_start
.section .text.foo,"ax",@progbits
.type foo, @function
foo:
.long 0
.size foo, .-foo
.section .gcc_except_table.foo,"a",@progbits
.L0:
.long 0
.section .eh_frame,"a",@progbits
.long .L0
EOF
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
if $gcc_cv_ld -o conftest conftest.o --entry=_start --gc-sections 2>&1 \
| grep "gc-sections option ignored" > /dev/null; then
gcc_cv_ld_eh_gc_sections=no
elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
gcc_cv_ld_eh_gc_sections=yes
# If no COMDAT groups, the compiler will emit .gnu.linkonce.t. sections.
if test x$gcc_cv_as_comdat_group != xyes; then
gcc_cv_ld_eh_gc_sections=no
cat > conftest.s <<EOF
.section .text
.globl _start
.type _start, @function
_start:
.long foo
.size _start, .-_start
.section .gnu.linkonce.t.foo,"ax",@progbits
.type foo, @function
foo:
.long 0
.size foo, .-foo
.section .gcc_except_table.foo,"a",@progbits
.L0:
.long 0
.section .eh_frame,"a",@progbits
.long .L0
EOF
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
if $gcc_cv_ld -o conftest conftest.o --entry=_start --gc-sections 2>&1 \
| grep "gc-sections option ignored" > /dev/null; then
gcc_cv_ld_eh_gc_sections=no
elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
gcc_cv_ld_eh_gc_sections=yes
fi
fi
fi
fi
fi
rm -f conftest.s conftest.o conftest
fi
case "$target" in
hppa*-*-linux*)
# ??? This apparently exposes a binutils bug with PC-relative relocations.

View File

@ -2925,6 +2925,36 @@ LCF0:
addis 11,30,_GLOBAL_OFFSET_TABLE_-.LCF0@ha';;
esac
case $target in
*-*-aix*) conftest_s=' .machine "pwr6"
.csect .text[[PR]]
cmpb 3,4,5';;
*) conftest_s=' .machine power6
.text
cmpb 3,4,5';;
esac
gcc_GAS_CHECK_FEATURE([compare bytes support],
gcc_cv_as_powerpc_cmpb, [9,99,0], -a32,
[$conftest_s],,
[AC_DEFINE(HAVE_AS_CMPB, 1,
[Define if your assembler supports cmpb.])])
case $target in
*-*-aix*) conftest_s=' .machine "pwr6"
.csect .text[[PR]]
dadd 1,3';;
*) conftest_s=' .machine power6
.text
dadd 1,3';;
esac
gcc_GAS_CHECK_FEATURE([decimal float support],
gcc_cv_as_powerpc_dfp, [9,99,0], -a32,
[$conftest_s],,
[AC_DEFINE(HAVE_AS_DFP, 1,
[Define if your assembler supports DFP instructions.])])
gcc_GAS_CHECK_FEATURE([rel16 relocs],
gcc_cv_as_powerpc_rel16, [2,17,0], -a32,
[$conftest_s],,

View File

@ -664,7 +664,7 @@ See RS/6000 and PowerPC Options.
-mpowerpc-gpopt -mno-powerpc-gpopt @gol
-mpowerpc-gfxopt -mno-powerpc-gfxopt @gol
-mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mfprnd -mno-fprnd @gol
-mmfpgpr -mno-mfpgpr @gol
-mcmpb -mno-cmpb -mmfpgpr -mno-mfpgpr -mdfp -mno-dfp @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
@ -11799,8 +11799,12 @@ These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
@itemx -mno-popcntb
@itemx -mfprnd
@itemx -mno-fprnd
@itemx -mcmpb
@itemx -mno-cmpb
@itemx -mmfpgpr
@itemx -mno-mfpgpr
@itemx -mdfp
@itemx -mno-dfp
@opindex mpower
@opindex mno-power
@opindex mpower2
@ -11819,8 +11823,12 @@ These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
@opindex mno-popcntb
@opindex mfprnd
@opindex mno-fprnd
@opindex mcmpb
@opindex mno-cmpb
@opindex mmfpgpr
@opindex mno-mfpgpr
@opindex mdfp
@opindex mno-dfp
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
@ -11865,10 +11873,15 @@ 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{-mcmpb} option allows GCC to generate the compare bytes
instruction implemented on the POWER6 processor and other processors
that support the PowerPC V2.05 architecture.
The @option{-mmfpgpr} option allows GCC to generate the FP move to/from
general purpose register instructions implemented on the POWER6X
processor and other processors that support the extended PowerPC V2.05
architecture.
The @option{-mdfp} option allows GCC to generate the decimal floating
point instructions implemented on some POWER processors.
The @option{-mpowerpc64} option allows GCC to generate the additional
64-bit instructions that are found in the full PowerPC64 architecture