*ptarget_bool = target_bool;
}
+/* Convert a BFmode VAL to SFmode without signaling sNaNs.
+ This is done by returning SF SUBREG of ((HI SUBREG) (VAL)) << 16. */
+
+rtx
+ix86_expand_fast_convert_bf_to_sf (rtx val)
+{
+ rtx op = gen_lowpart (HImode, val), ret;
+ if (CONST_INT_P (op))
+ {
+ ret = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
+ val, BFmode);
+ if (ret)
+ return ret;
+ /* FLOAT_EXTEND simplification will fail if VAL is a sNaN. */
+ ret = gen_reg_rtx (SImode);
+ emit_move_insn (ret, GEN_INT (INTVAL (op) & 0xffff));
+ }
+ else
+ {
+ ret = gen_reg_rtx (SImode);
+ emit_insn (gen_zero_extendhisi2 (ret, op));
+ }
+ emit_insn (gen_ashlsi3 (ret, ret, GEN_INT (16)));
+ return gen_lowpart (SFmode, ret);
+}
+
#include "gt-i386-expand.h"
(pc)))]
""
{
- rtx op1 = gen_lowpart (HImode, operands[1]);
- if (CONST_INT_P (op1))
- op1 = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
- operands[1], BFmode);
- else
- {
- rtx t1 = gen_reg_rtx (SImode);
- emit_insn (gen_zero_extendhisi2 (t1, op1));
- emit_insn (gen_ashlsi3 (t1, t1, GEN_INT (16)));
- op1 = gen_lowpart (SFmode, t1);
- }
- rtx op2 = gen_lowpart (HImode, operands[2]);
- if (CONST_INT_P (op2))
- op2 = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
- operands[2], BFmode);
- else
- {
- rtx t2 = gen_reg_rtx (SImode);
- emit_insn (gen_zero_extendhisi2 (t2, op2));
- emit_insn (gen_ashlsi3 (t2, t2, GEN_INT (16)));
- op2 = gen_lowpart (SFmode, t2);
- }
+ rtx op1 = ix86_expand_fast_convert_bf_to_sf (operands[1]);
+ rtx op2 = ix86_expand_fast_convert_bf_to_sf (operands[2]);
do_compare_rtx_and_jump (op1, op2, GET_CODE (operands[0]), 0,
SFmode, NULL_RTX, NULL,
as_a <rtx_code_label *> (operands[3]),
(const_int 0)]))]
""
{
- rtx op1 = gen_lowpart (HImode, operands[2]);
- if (CONST_INT_P (op1))
- op1 = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
- operands[2], BFmode);
- else
- {
- rtx t1 = gen_reg_rtx (SImode);
- emit_insn (gen_zero_extendhisi2 (t1, op1));
- emit_insn (gen_ashlsi3 (t1, t1, GEN_INT (16)));
- op1 = gen_lowpart (SFmode, t1);
- }
- rtx op2 = gen_lowpart (HImode, operands[3]);
- if (CONST_INT_P (op2))
- op2 = simplify_const_unary_operation (FLOAT_EXTEND, SFmode,
- operands[3], BFmode);
- else
- {
- rtx t2 = gen_reg_rtx (SImode);
- emit_insn (gen_zero_extendhisi2 (t2, op2));
- emit_insn (gen_ashlsi3 (t2, t2, GEN_INT (16)));
- op2 = gen_lowpart (SFmode, t2);
- }
+ rtx op1 = ix86_expand_fast_convert_bf_to_sf (operands[2]);
+ rtx op2 = ix86_expand_fast_convert_bf_to_sf (operands[3]);
rtx res = emit_store_flag_force (operands[0], GET_CODE (operands[1]),
op1, op2, SFmode, 0, 1);
if (!rtx_equal_p (res, operands[0]))