i386.h (X87_FLOAT_MODE_P): New.
2007-04-10 Eric Christopher <echristo@apple.com> * config/i386/i386.h (X87_FLOAT_MODE_P): New. * config/i386/i386.md (*cmpfp0): Use. (*cmpfp_u, *cmpfp_<mode>, *cmpfp_i_i387): Ditto. (*cmpfp_iu_387, fix_trunc<mode>_fisttp_i386_1): Ditto. (fix_trunc<mode>_i386_fisttp): Ditto. (fix_trunc<mode>_i387_fisttp_with_temp): Ditto. (*fix_trunc<mode>_i387_1, fix_truncdi_i387): Ditto. (fix_truncdi_i387_with_temp, fix_trunc<mode>_i387): Ditto. (fix_trunc<mode>_i387_with_temp, *fp_jcc_1_387): Ditto. (*fp_jcc_2_387, *fp_jcc_5_387, *fp_jcc_6_387): Ditto. (*fp_jcc_7_387, *fp_jcc_8<mode>_387): Ditto. (unnamed_splitters): Ditto. * config/i386/i386.c (output_fix_trunc): Assert that we're not being passed a TFmode operand. From-SVN: r123700
This commit is contained in:
parent
7c57be853d
commit
54a8809004
|
@ -1,3 +1,20 @@
|
||||||
|
2007-04-10 Eric Christopher <echristo@apple.com>
|
||||||
|
|
||||||
|
* config/i386/i386.h (X87_FLOAT_MODE_P): New.
|
||||||
|
* config/i386/i386.md (*cmpfp0): Use.
|
||||||
|
(*cmpfp_u, *cmpfp_<mode>, *cmpfp_i_i387): Ditto.
|
||||||
|
(*cmpfp_iu_387, fix_trunc<mode>_fisttp_i386_1): Ditto.
|
||||||
|
(fix_trunc<mode>_i386_fisttp): Ditto.
|
||||||
|
(fix_trunc<mode>_i387_fisttp_with_temp): Ditto.
|
||||||
|
(*fix_trunc<mode>_i387_1, fix_truncdi_i387): Ditto.
|
||||||
|
(fix_truncdi_i387_with_temp, fix_trunc<mode>_i387): Ditto.
|
||||||
|
(fix_trunc<mode>_i387_with_temp, *fp_jcc_1_387): Ditto.
|
||||||
|
(*fp_jcc_2_387, *fp_jcc_5_387, *fp_jcc_6_387): Ditto.
|
||||||
|
(*fp_jcc_7_387, *fp_jcc_8<mode>_387): Ditto.
|
||||||
|
(unnamed_splitters): Ditto.
|
||||||
|
* config/i386/i386.c (output_fix_trunc): Assert that
|
||||||
|
we're not being passed a TFmode operand.
|
||||||
|
|
||||||
2007-04-10 Zdenek Dvorak <dvorakz@suse.cz>
|
2007-04-10 Zdenek Dvorak <dvorakz@suse.cz>
|
||||||
|
|
||||||
PR tree-optimization/31526
|
PR tree-optimization/31526
|
||||||
|
@ -121,7 +138,7 @@
|
||||||
2007-04-07 Anatoly Sokolov <aesok@post.ru>
|
2007-04-07 Anatoly Sokolov <aesok@post.ru>
|
||||||
|
|
||||||
PR target/30289
|
PR target/30289
|
||||||
* config/avr/avr.md (*clrmemqi, *clrmemhi): Mark operand 4 as
|
* config/avr/avr.md (*clrmemqi, *clrmemhi): Mark operand 4 as
|
||||||
earlyclobber.
|
earlyclobber.
|
||||||
|
|
||||||
2007-04-07 Bruce Korb <bkorb@gnu.org>
|
2007-04-07 Bruce Korb <bkorb@gnu.org>
|
||||||
|
@ -199,7 +216,7 @@
|
||||||
* langhooks.h (lang_hooks): Remove safe_from_p.
|
* langhooks.h (lang_hooks): Remove safe_from_p.
|
||||||
(lhd_safe_from_p): Remove prototype.
|
(lhd_safe_from_p): Remove prototype.
|
||||||
* langhooks.c (lhd_safe_from_p): Remove.
|
* langhooks.c (lhd_safe_from_p): Remove.
|
||||||
|
|
||||||
2007-04-06 Jan Hubicka <jh@suse.cz>
|
2007-04-06 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* cgraphunit.c (decide_is_function_needed): Do not keep always_inline
|
* cgraphunit.c (decide_is_function_needed): Do not keep always_inline
|
||||||
|
@ -305,7 +322,7 @@
|
||||||
2007-04-05 Anatoly Sokolov <aesok@post.ru>
|
2007-04-05 Anatoly Sokolov <aesok@post.ru>
|
||||||
|
|
||||||
PR target/25448
|
PR target/25448
|
||||||
* config/avr/avr.c (avr_handle_fndecl_attribute): Use the
|
* config/avr/avr.c (avr_handle_fndecl_attribute): Use the
|
||||||
DECL_ASSEMBLER_NAME, not the DECL_NAME.
|
DECL_ASSEMBLER_NAME, not the DECL_NAME.
|
||||||
|
|
||||||
2007-04-05 H.J. Lu <hongjiu.lu@intel.com>
|
2007-04-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
|
@ -1037,7 +1037,7 @@ unsigned int ix86_tune_features[X86_TUNE_LAST] = {
|
||||||
|
|
||||||
/* X86_TUNE_DOUBLE_WITH_ADD */
|
/* X86_TUNE_DOUBLE_WITH_ADD */
|
||||||
~m_386,
|
~m_386,
|
||||||
|
|
||||||
/* X86_TUNE_USE_SAHF */
|
/* X86_TUNE_USE_SAHF */
|
||||||
m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
|
m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
|
||||||
| m_NOCONA | m_CORE2 | m_GENERIC,
|
| m_NOCONA | m_CORE2 | m_GENERIC,
|
||||||
|
@ -1059,7 +1059,7 @@ unsigned int ix86_tune_features[X86_TUNE_LAST] = {
|
||||||
|
|
||||||
/* X86_TUNE_PARTIAL_FLAG_REG_STALL */
|
/* X86_TUNE_PARTIAL_FLAG_REG_STALL */
|
||||||
m_CORE2 | m_GENERIC,
|
m_CORE2 | m_GENERIC,
|
||||||
|
|
||||||
/* X86_TUNE_USE_HIMODE_FIOP */
|
/* X86_TUNE_USE_HIMODE_FIOP */
|
||||||
m_386 | m_486 | m_K6_GEODE,
|
m_386 | m_486 | m_K6_GEODE,
|
||||||
|
|
||||||
|
@ -1068,7 +1068,7 @@ unsigned int ix86_tune_features[X86_TUNE_LAST] = {
|
||||||
|
|
||||||
/* X86_TUNE_USE_MOV0 */
|
/* X86_TUNE_USE_MOV0 */
|
||||||
m_K6,
|
m_K6,
|
||||||
|
|
||||||
/* X86_TUNE_USE_CLTD */
|
/* X86_TUNE_USE_CLTD */
|
||||||
~(m_PENT | m_K6 | m_CORE2 | m_GENERIC),
|
~(m_PENT | m_K6 | m_CORE2 | m_GENERIC),
|
||||||
|
|
||||||
|
@ -1093,10 +1093,10 @@ unsigned int ix86_tune_features[X86_TUNE_LAST] = {
|
||||||
|
|
||||||
/* X86_TUNE_SINGLE_STRINGOP */
|
/* X86_TUNE_SINGLE_STRINGOP */
|
||||||
m_386 | m_PENT4 | m_NOCONA,
|
m_386 | m_PENT4 | m_NOCONA,
|
||||||
|
|
||||||
/* X86_TUNE_QIMODE_MATH */
|
/* X86_TUNE_QIMODE_MATH */
|
||||||
~0,
|
~0,
|
||||||
|
|
||||||
/* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
|
/* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
|
||||||
register stalls. Just like X86_TUNE_PARTIAL_REG_STALL this option
|
register stalls. Just like X86_TUNE_PARTIAL_REG_STALL this option
|
||||||
might be considered for Generic32 if our scheme for avoiding partial
|
might be considered for Generic32 if our scheme for avoiding partial
|
||||||
|
@ -9261,6 +9261,7 @@ output_fix_trunc (rtx insn, rtx *operands, int fisttp)
|
||||||
|
|
||||||
gcc_assert (STACK_TOP_P (operands[1]));
|
gcc_assert (STACK_TOP_P (operands[1]));
|
||||||
gcc_assert (MEM_P (operands[0]));
|
gcc_assert (MEM_P (operands[0]));
|
||||||
|
gcc_assert (GET_MODE (operands[1]) != TFmode);
|
||||||
|
|
||||||
if (fisttp)
|
if (fisttp)
|
||||||
output_asm_insn ("fisttp%z0\t%0", operands);
|
output_asm_insn ("fisttp%z0\t%0", operands);
|
||||||
|
@ -9293,7 +9294,7 @@ output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
|
||||||
{
|
{
|
||||||
static char retval[] = ".word\t0xc_df";
|
static char retval[] = ".word\t0xc_df";
|
||||||
int regno = REGNO (operands[opno]);
|
int regno = REGNO (operands[opno]);
|
||||||
|
|
||||||
gcc_assert (FP_REGNO_P (regno));
|
gcc_assert (FP_REGNO_P (regno));
|
||||||
|
|
||||||
retval[9] = '0' + (regno - FIRST_STACK_REG);
|
retval[9] = '0' + (regno - FIRST_STACK_REG);
|
||||||
|
@ -9683,7 +9684,7 @@ ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
|
||||||
movlpd mem, reg (gas syntax)
|
movlpd mem, reg (gas syntax)
|
||||||
else
|
else
|
||||||
movsd mem, reg
|
movsd mem, reg
|
||||||
|
|
||||||
Code generation for unaligned packed loads of single precision data
|
Code generation for unaligned packed loads of single precision data
|
||||||
(x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
|
(x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
|
||||||
if (x86_sse_unaligned_move_optimal)
|
if (x86_sse_unaligned_move_optimal)
|
||||||
|
@ -9872,7 +9873,7 @@ ix86_expand_push (enum machine_mode mode, rtx x)
|
||||||
|
|
||||||
/* Helper function of ix86_fixup_binary_operands to canonicalize
|
/* Helper function of ix86_fixup_binary_operands to canonicalize
|
||||||
operand order. Returns true if the operands should be swapped. */
|
operand order. Returns true if the operands should be swapped. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
|
ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
|
||||||
rtx operands[])
|
rtx operands[])
|
||||||
|
@ -10267,7 +10268,7 @@ ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
|
||||||
{
|
{
|
||||||
REAL_VALUE_TYPE TWO32r;
|
REAL_VALUE_TYPE TWO32r;
|
||||||
rtx fp_lo, fp_hi, x;
|
rtx fp_lo, fp_hi, x;
|
||||||
|
|
||||||
fp_lo = gen_reg_rtx (DFmode);
|
fp_lo = gen_reg_rtx (DFmode);
|
||||||
fp_hi = gen_reg_rtx (DFmode);
|
fp_hi = gen_reg_rtx (DFmode);
|
||||||
|
|
||||||
|
@ -12686,11 +12687,11 @@ ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
|
||||||
case V4SImode:
|
case V4SImode:
|
||||||
if (high_p)
|
if (high_p)
|
||||||
unpack = gen_vec_interleave_highv4si;
|
unpack = gen_vec_interleave_highv4si;
|
||||||
else
|
else
|
||||||
unpack = gen_vec_interleave_lowv4si;
|
unpack = gen_vec_interleave_lowv4si;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = gen_lowpart (imode, operands[0]);
|
dest = gen_lowpart (imode, operands[0]);
|
||||||
|
@ -13566,7 +13567,7 @@ counter_mode (rtx count_exp)
|
||||||
|
|
||||||
The size is rounded down to whole number of chunk size moved at once.
|
The size is rounded down to whole number of chunk size moved at once.
|
||||||
SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info. */
|
SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info. */
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
|
expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
|
||||||
|
@ -13610,7 +13611,7 @@ expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
|
||||||
srcmem = change_address (srcmem, mode, y_addr);
|
srcmem = change_address (srcmem, mode, y_addr);
|
||||||
|
|
||||||
/* When unrolling for chips that reorder memory reads and writes,
|
/* When unrolling for chips that reorder memory reads and writes,
|
||||||
we can save registers by using single temporary.
|
we can save registers by using single temporary.
|
||||||
Also using 4 temporaries is overkill in 32bit mode. */
|
Also using 4 temporaries is overkill in 32bit mode. */
|
||||||
if (!TARGET_64BIT && 0)
|
if (!TARGET_64BIT && 0)
|
||||||
{
|
{
|
||||||
|
@ -13694,7 +13695,7 @@ expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
|
||||||
emit_label (out_label);
|
emit_label (out_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output "rep; mov" instruction.
|
/* Output "rep; mov" instruction.
|
||||||
Arguments have same meaning as for previous function */
|
Arguments have same meaning as for previous function */
|
||||||
static void
|
static void
|
||||||
expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
|
expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
|
||||||
|
@ -13734,7 +13735,7 @@ expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
|
||||||
destexp, srcexp));
|
destexp, srcexp));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output "rep; stos" instruction.
|
/* Output "rep; stos" instruction.
|
||||||
Arguments have same meaning as for previous function */
|
Arguments have same meaning as for previous function */
|
||||||
static void
|
static void
|
||||||
expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
|
expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
|
||||||
|
@ -14182,7 +14183,7 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
|
||||||
/* When asked to inline the call anyway, try to pick meaningful choice.
|
/* When asked to inline the call anyway, try to pick meaningful choice.
|
||||||
We look for maximal size of block that is faster to copy by hand and
|
We look for maximal size of block that is faster to copy by hand and
|
||||||
take blocks of at most of that size guessing that average size will
|
take blocks of at most of that size guessing that average size will
|
||||||
be roughly half of the block.
|
be roughly half of the block.
|
||||||
|
|
||||||
If this turns out to be bad, we might simply specify the preferred
|
If this turns out to be bad, we might simply specify the preferred
|
||||||
choice in ix86_costs. */
|
choice in ix86_costs. */
|
||||||
|
@ -14292,7 +14293,7 @@ smallest_pow2_greater_than (int val)
|
||||||
|
|
||||||
4) Epilogue: code copying tail of the block that is too small to be
|
4) Epilogue: code copying tail of the block that is too small to be
|
||||||
handled by main body (or up to size guarded by prologue guard). */
|
handled by main body (or up to size guarded by prologue guard). */
|
||||||
|
|
||||||
int
|
int
|
||||||
ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
|
ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
|
||||||
rtx expected_align_exp, rtx expected_size_exp)
|
rtx expected_align_exp, rtx expected_size_exp)
|
||||||
|
@ -14484,7 +14485,7 @@ ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
|
||||||
while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
|
while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
|
||||||
Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
|
Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
|
||||||
bytes. Compensate if needed. */
|
bytes. Compensate if needed. */
|
||||||
|
|
||||||
if (size_needed < epilogue_size_needed)
|
if (size_needed < epilogue_size_needed)
|
||||||
{
|
{
|
||||||
tmp =
|
tmp =
|
||||||
|
@ -14680,7 +14681,7 @@ ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
|
||||||
mode = DImode;
|
mode = DImode;
|
||||||
count_exp = force_reg (mode, count_exp);
|
count_exp = force_reg (mode, count_exp);
|
||||||
}
|
}
|
||||||
/* Do the cheap promotion to allow better CSE across the
|
/* Do the cheap promotion to allow better CSE across the
|
||||||
main loop and epilogue (ie one load of the big constant in the
|
main loop and epilogue (ie one load of the big constant in the
|
||||||
front of all code. */
|
front of all code. */
|
||||||
if (CONST_INT_P (val_exp))
|
if (CONST_INT_P (val_exp))
|
||||||
|
@ -17414,11 +17415,11 @@ ix86_init_mmx_sse_builtins (void)
|
||||||
IX86_BUILTIN_PALIGNR);
|
IX86_BUILTIN_PALIGNR);
|
||||||
|
|
||||||
/* AMDFAM10 SSE4A New built-ins */
|
/* AMDFAM10 SSE4A New built-ins */
|
||||||
def_builtin (MASK_SSE4A, "__builtin_ia32_movntsd",
|
def_builtin (MASK_SSE4A, "__builtin_ia32_movntsd",
|
||||||
void_ftype_pdouble_v2df, IX86_BUILTIN_MOVNTSD);
|
void_ftype_pdouble_v2df, IX86_BUILTIN_MOVNTSD);
|
||||||
def_builtin (MASK_SSE4A, "__builtin_ia32_movntss",
|
def_builtin (MASK_SSE4A, "__builtin_ia32_movntss",
|
||||||
void_ftype_pfloat_v4sf, IX86_BUILTIN_MOVNTSS);
|
void_ftype_pfloat_v4sf, IX86_BUILTIN_MOVNTSS);
|
||||||
def_builtin (MASK_SSE4A, "__builtin_ia32_extrqi",
|
def_builtin (MASK_SSE4A, "__builtin_ia32_extrqi",
|
||||||
v2di_ftype_v2di_unsigned_unsigned, IX86_BUILTIN_EXTRQI);
|
v2di_ftype_v2di_unsigned_unsigned, IX86_BUILTIN_EXTRQI);
|
||||||
def_builtin (MASK_SSE4A, "__builtin_ia32_extrq",
|
def_builtin (MASK_SSE4A, "__builtin_ia32_extrq",
|
||||||
v2di_ftype_v2di_v16qi, IX86_BUILTIN_EXTRQ);
|
v2di_ftype_v2di_v16qi, IX86_BUILTIN_EXTRQ);
|
||||||
|
@ -18647,7 +18648,7 @@ ix86_builtin_conversion (enum tree_code code, tree type)
|
||||||
{
|
{
|
||||||
if (TREE_CODE (type) != VECTOR_TYPE)
|
if (TREE_CODE (type) != VECTOR_TYPE)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
|
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case FLOAT_EXPR:
|
case FLOAT_EXPR:
|
||||||
|
|
|
@ -1362,6 +1362,11 @@ enum reg_class
|
||||||
#define ANY_FP_REG_P(X) (REG_P (X) && ANY_FP_REGNO_P (REGNO (X)))
|
#define ANY_FP_REG_P(X) (REG_P (X) && ANY_FP_REGNO_P (REGNO (X)))
|
||||||
#define ANY_FP_REGNO_P(N) (FP_REGNO_P (N) || SSE_REGNO_P (N))
|
#define ANY_FP_REGNO_P(N) (FP_REGNO_P (N) || SSE_REGNO_P (N))
|
||||||
|
|
||||||
|
#define X87_FLOAT_MODE_P(MODE) \
|
||||||
|
((MODE) == SFmode \
|
||||||
|
|| (MODE) == DFmode \
|
||||||
|
|| (MODE) == XFmode)
|
||||||
|
|
||||||
#define SSE_REG_P(N) (REG_P (N) && SSE_REGNO_P (REGNO (N)))
|
#define SSE_REG_P(N) (REG_P (N) && SSE_REGNO_P (REGNO (N)))
|
||||||
#define SSE_REGNO_P(N) \
|
#define SSE_REGNO_P(N) \
|
||||||
(IN_RANGE ((N), FIRST_SSE_REG, LAST_SSE_REG) \
|
(IN_RANGE ((N), FIRST_SSE_REG, LAST_SSE_REG) \
|
||||||
|
|
Loading…
Reference in New Issue