(const_string "direct")))
(set_attr "mode" "<MODE>")])
+(define_insn "*imulhi<mode>zu"
+ [(set (match_operand:SWI48x 0 "register_operand" "=r,r")
+ (zero_extend:SWI48x
+ (mult:HI (match_operand:HI 1 "nonimmediate_operand" "%rm,rm")
+ (match_operand:HI 2 "immediate_operand" "K,n"))))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_APX_ZU"
+ "@
+ imulzu{w}\t{%2, %1, %w0|%w0, %1, %2}
+ imulzu{w}\t{%2, %1, %w0|%w0, %1, %2}"
+ [(set_attr "type" "imul")
+ (set_attr "mode" "HI")])
+
(define_insn "*mulsi3_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r,r,r")
(zero_extend:DI
;; For all sCOND expanders, also expand the compare or test insn that
;; generates cc0. Generate an equality comparison if `seq' or `sne'.
+(define_insn "*setcc_<mode>_zu"
+ [(set (match_operand:SWI248 0 "register_operand" "=r")
+ (match_operator:SWI248 1 "ix86_comparison_operator"
+ [(reg FLAGS_REG) (const_int 0)]))]
+ "TARGET_APX_ZU"
+ "setzu%C1\t%b0"
+ [(set_attr "type" "setcc")])
+
(define_insn_and_split "*setcc_di_1"
[(set (match_operand:DI 0 "register_operand" "=q")
(match_operator:DI 1 "ix86_comparison_operator"
[(reg FLAGS_REG) (const_int 0)]))]
- "TARGET_64BIT && !TARGET_PARTIAL_REG_STALL"
+ "!TARGET_APX_ZU && TARGET_64BIT && !TARGET_PARTIAL_REG_STALL"
"#"
"&& reload_completed"
[(set (match_dup 2) (match_dup 1))
[(set (match_operand:SWI24 0 "register_operand" "=q")
(match_operator:SWI24 1 "ix86_comparison_operator"
[(reg FLAGS_REG) (const_int 0)]))]
- "!TARGET_PARTIAL_REG_STALL
+ "!TARGET_APX_ZU && !TARGET_PARTIAL_REG_STALL
&& (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))"
"#"
"&& reload_completed"
--- /dev/null
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mapxf -march=x86-64 -O2" } */
+/* { dg-final { scan-assembler-not "setle"} } */
+/* { dg-final { scan-assembler-not "setge"} } */
+/* { dg-final { scan-assembler-not "sete"} } */
+/* { dg-final { scan-assembler-not "xor"} } */
+/* { dg-final { scan-assembler-times "setzune" 1} } */
+/* { dg-final { scan-assembler-times "setzule" 1} } */
+/* { dg-final { scan-assembler-times "setzue" 1} } */
+/* { dg-final { scan-assembler-times "setzuge" 1} } */
+/* { dg-final { scan-assembler "imulzu"} } */
+long long foo0 (int a)
+{
+ return a == 0 ? 0 : 1;
+}
+
+long foo1 (int a, int b)
+{
+ return a > b ? 0 : 1;
+}
+
+int foo2 (int a, int b)
+{
+ return a != b ? 0 : 1;
+}
+
+short foo3 (int a, int b)
+{
+ return a < b ? 0 : 1;
+}
+
+unsigned long
+f1(unsigned short x)
+{
+ unsigned short a;
+ a = x * 1000;
+ return a;
+}