===================================================================
@@ -16198,6 +16198,22 @@
DONE;
})
+(define_expand "signbittf2"
+ [(use (match_operand:SI 0 "register_operand"))
+ (use (match_operand:TF 1 "register_operand"))]
+ "TARGET_SSE4_1"
+{
+ rtx mask = ix86_build_signbit_mask (TFmode, 0, 0);
+ rtx scratch = gen_reg_rtx (QImode);
+
+ emit_insn (gen_ptesttf2 (operands[1], mask));
+ ix86_expand_setcc (scratch, NE,
+ gen_rtx_REG (CCZmode, FLAGS_REG), const0_rtx);
+
+ emit_insn (gen_zero_extendqisi2 (operands[0], scratch));
+ DONE;
+})
+
(define_expand "signbitxf2"
[(use (match_operand:SI 0 "register_operand"))
(use (match_operand:XF 1 "register_operand"))]
===================================================================
@@ -15212,6 +15212,19 @@
(const_string "*")))
(set_attr "mode" "<sseinsnmode>")])
+(define_insn "ptesttf2"
+ [(set (reg:CC FLAGS_REG)
+ (unspec:CC [(match_operand:TF 0 "register_operand" "Yr, *x, x")
+ (match_operand:TF 1 "vector_operand" "YrBm, *xBm, xm")]
+ UNSPEC_PTEST))]
+ "TARGET_SSE4_1"
+ "%vptest\t{%1, %0|%0, %1}"
+ [(set_attr "isa" "noavx,noavx,avx")
+ (set_attr "type" "ssecomi")
+ (set_attr "prefix_extra" "1")
+ (set_attr "prefix" "orig,orig,vex")
+ (set_attr "mode" "TI")])
+
(define_insn "<sse4_1>_round<ssemodesuffix><avxsizesuffix>"
[(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x,x")
(unspec:VF_128_256
===================================================================
@@ -0,0 +1,23 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -msse4.1" } */
+/* { dg-require-effective-target sse4 } */
+
+#include "sse4_1-check.h"
+
+int signbit (__float128);
+
+extern void abort (void);
+
+static void
+sse4_1_test (void)
+{
+ static volatile __float128 a;
+
+ a = -1.2q;
+ if (!signbit (a))
+ abort ();
+
+ a = 1.2q;
+ if (signbit (a))
+ abort ();
+}
===================================================================
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -msse2" } */
+/* { dg-options "-O2 -msse" } */
__float128 x, y;
@@ -18,4 +18,4 @@ __float128 test_3(void)
return __builtin_copysignq (x, y);
}
-/* { dg-final { scan-assembler-not "call.*(neg|fabs|copysign)" } } */
+/* { dg-final { scan-assembler-not "neg|fabs|copysign" } } */
===================================================================
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse4.1" } */
+
+int signbit (__float128);
+
+__float128 x;
+
+int __test_1(void)
+{
+ return signbit (x);
+}
+
+/* { dg-final { scan-assembler-not "signbit" } } */