re PR target/27968 (gcc emits (undefined) ffreep opcode which is not understood by Solaris' /usr/ccs/bin/as when tuning for Athlon or Opteron CPUs)
PR target/27968 * configure.ac (HAVE_AS_IX86_FFREEP): On x86 targets check whether the configured assembler supports the x87's ffreep mnemonic. * configure: Regenerate. * config.in: Regenerate. * config/i386/i386.c (output_387_ffreep): New function. (output_fp_compare): Use output_387_ffreep to emit ffreep insns. (output_387_reg_move): Likewise. From-SVN: r115237
This commit is contained in:
parent
33251a2dc3
commit
b6c03bcd80
|
@ -1,3 +1,15 @@
|
||||||
|
2006-07-06 Roger Sayle <roger@eyesopen.com>
|
||||||
|
|
||||||
|
PR target/27968
|
||||||
|
* configure.ac (HAVE_AS_IX86_FFREEP): On x86 targets check whether
|
||||||
|
the configured assembler supports the x87's ffreep mnemonic.
|
||||||
|
* configure: Regenerate.
|
||||||
|
* config.in: Regenerate.
|
||||||
|
|
||||||
|
* config/i386/i386.c (output_387_ffreep): New function.
|
||||||
|
(output_fp_compare): Use output_387_ffreep to emit ffreep insns.
|
||||||
|
(output_387_reg_move): Likewise.
|
||||||
|
|
||||||
2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
|
2006-07-06 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
Port to hosts whose 'sort' and 'tail' implementations
|
Port to hosts whose 'sort' and 'tail' implementations
|
||||||
|
@ -10,7 +22,8 @@
|
||||||
|
|
||||||
2006-07-06 Zdenek Dvorak <dvorakz@suse.cz>
|
2006-07-06 Zdenek Dvorak <dvorakz@suse.cz>
|
||||||
|
|
||||||
* tree-ssa-loop-niter.c (scev_probably_wraps_p): Fix typo in argument name.
|
* tree-ssa-loop-niter.c (scev_probably_wraps_p): Fix typo in
|
||||||
|
argument name.
|
||||||
|
|
||||||
2006-07-06 David Edelsohn <edelsohn@gnu.org>
|
2006-07-06 David Edelsohn <edelsohn@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Define if your assembler supports the ffreep mnemonic. */
|
||||||
|
#ifndef USED_FOR_TARGET
|
||||||
|
#undef HAVE_AS_IX86_FFREEP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define if your assembler supports the lituse_jsrdirect relocation. */
|
/* Define if your assembler supports the lituse_jsrdirect relocation. */
|
||||||
#ifndef USED_FOR_TARGET
|
#ifndef USED_FOR_TARGET
|
||||||
#undef HAVE_AS_JSRDIRECT_RELOCS
|
#undef HAVE_AS_JSRDIRECT_RELOCS
|
||||||
|
|
|
@ -8641,6 +8641,34 @@ output_fix_trunc (rtx insn, rtx *operands, int fisttp)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Output code for x87 ffreep insn. The OPNO argument, which may only
|
||||||
|
have the values zero or one, indicates the ffreep insn's operand
|
||||||
|
from the OPERANDS array. */
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
|
||||||
|
{
|
||||||
|
if (TARGET_USE_FFREEP)
|
||||||
|
#if HAVE_AS_IX86_FFREEP
|
||||||
|
return opno ? "ffreep\t%y1" : "ffreep\t%y0";
|
||||||
|
#else
|
||||||
|
switch (REGNO (operands[opno]))
|
||||||
|
{
|
||||||
|
case FIRST_STACK_REG + 0: return ".word\t0xc0df";
|
||||||
|
case FIRST_STACK_REG + 1: return ".word\t0xc1df";
|
||||||
|
case FIRST_STACK_REG + 2: return ".word\t0xc2df";
|
||||||
|
case FIRST_STACK_REG + 3: return ".word\t0xc3df";
|
||||||
|
case FIRST_STACK_REG + 4: return ".word\t0xc4df";
|
||||||
|
case FIRST_STACK_REG + 5: return ".word\t0xc5df";
|
||||||
|
case FIRST_STACK_REG + 6: return ".word\t0xc6df";
|
||||||
|
case FIRST_STACK_REG + 7: return ".word\t0xc7df";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return opno ? "fstp\t%y1" : "fstp\t%y0";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Output code for INSN to compare OPERANDS. EFLAGS_P is 1 when fcomi
|
/* Output code for INSN to compare OPERANDS. EFLAGS_P is 1 when fcomi
|
||||||
should be used. UNORDERED_P is true when fucom should be used. */
|
should be used. UNORDERED_P is true when fucom should be used. */
|
||||||
|
|
||||||
|
@ -8685,7 +8713,7 @@ output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
|
||||||
if (stack_top_dies)
|
if (stack_top_dies)
|
||||||
{
|
{
|
||||||
output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
|
output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
|
||||||
return TARGET_USE_FFREEP ? "ffreep\t%y1" : "fstp\t%y1";
|
return output_387_ffreep (operands, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return "ftst\n\tfnstsw\t%0";
|
return "ftst\n\tfnstsw\t%0";
|
||||||
|
@ -8708,7 +8736,7 @@ output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
|
||||||
output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
|
output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
|
||||||
else
|
else
|
||||||
output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
|
output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
|
||||||
return TARGET_USE_FFREEP ? "ffreep\t%y0" : "fstp\t%y0";
|
return output_387_ffreep (operands, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -18807,9 +18835,8 @@ output_387_reg_move (rtx insn, rtx *operands)
|
||||||
if (REG_P (operands[1])
|
if (REG_P (operands[1])
|
||||||
&& find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
&& find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
|
||||||
{
|
{
|
||||||
if (REGNO (operands[0]) == FIRST_STACK_REG
|
if (REGNO (operands[0]) == FIRST_STACK_REG)
|
||||||
&& TARGET_USE_FFREEP)
|
return output_387_ffreep (operands, 0);
|
||||||
return "ffreep\t%y0";
|
|
||||||
return "fstp\t%y0";
|
return "fstp\t%y0";
|
||||||
}
|
}
|
||||||
if (STACK_TOP_P (operands[0]))
|
if (STACK_TOP_P (operands[0]))
|
||||||
|
|
|
@ -15046,6 +15046,39 @@ cat >>confdefs.h <<\_ACEOF
|
||||||
#define HAVE_AS_IX86_CMOV_SUN_SYNTAX 1
|
#define HAVE_AS_IX86_CMOV_SUN_SYNTAX 1
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking assembler for ffreep mnemonic" >&5
|
||||||
|
echo $ECHO_N "checking assembler for ffreep mnemonic... $ECHO_C" >&6
|
||||||
|
if test "${gcc_cv_as_ix86_ffreep+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
gcc_cv_as_ix86_ffreep=no
|
||||||
|
if test x$gcc_cv_as != x; then
|
||||||
|
echo 'ffreep %st(1)' > 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_ix86_ffreep=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_ix86_ffreep" >&5
|
||||||
|
echo "${ECHO_T}$gcc_cv_as_ix86_ffreep" >&6
|
||||||
|
if test $gcc_cv_as_ix86_ffreep = yes; then
|
||||||
|
|
||||||
|
cat >>confdefs.h <<\_ACEOF
|
||||||
|
#define HAVE_AS_IX86_FFREEP 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# This one is used unconditionally by i386.[ch]; it is to be defined
|
# This one is used unconditionally by i386.[ch]; it is to be defined
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# configure.ac for GCC
|
# configure.ac for GCC
|
||||||
# Process this file with autoconf to generate a configuration script.
|
# Process this file with autoconf to generate a configuration script.
|
||||||
|
|
||||||
# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
# Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
#This file is part of GCC.
|
#This file is part of GCC.
|
||||||
|
@ -2815,6 +2815,12 @@ foo: nop
|
||||||
[AC_DEFINE(HAVE_AS_IX86_CMOV_SUN_SYNTAX, 1,
|
[AC_DEFINE(HAVE_AS_IX86_CMOV_SUN_SYNTAX, 1,
|
||||||
[Define if your assembler supports the Sun syntax for cmov.])])
|
[Define if your assembler supports the Sun syntax for cmov.])])
|
||||||
|
|
||||||
|
gcc_GAS_CHECK_FEATURE([ffreep mnemonic],
|
||||||
|
gcc_cv_as_ix86_ffreep,,,
|
||||||
|
[ffreep %st(1)],,
|
||||||
|
[AC_DEFINE(HAVE_AS_IX86_FFREEP, 1,
|
||||||
|
[Define if your assembler supports the ffreep mnemonic.])])
|
||||||
|
|
||||||
# This one is used unconditionally by i386.[ch]; it is to be defined
|
# This one is used unconditionally by i386.[ch]; it is to be defined
|
||||||
# to 1 if the feature is present, 0 otherwise.
|
# to 1 if the feature is present, 0 otherwise.
|
||||||
gcc_GAS_CHECK_FEATURE([GOTOFF in data],
|
gcc_GAS_CHECK_FEATURE([GOTOFF in data],
|
||||||
|
|
Loading…
Reference in New Issue