Skip to content

Commit

Permalink
Support vpcmov for V4HF/V4BF/V2HF/V2BF under TARGET_XOP.
Browse files Browse the repository at this point in the history
gcc/ChangeLog:

	PR target/112904
	* config/i386/mmx.md (*xop_pcmov_<mode>): New define_insn.

gcc/testsuite/ChangeLog:

	* g++.target/i386/pr112904.C: New test.
  • Loading branch information
algebra84 committed Dec 11, 2023
1 parent ae226cb commit 2c2df12
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
22 changes: 22 additions & 0 deletions gcc/config/i386/mmx.md
Original file line number Diff line number Diff line change
Expand Up @@ -4136,6 +4136,17 @@
[(set_attr "type" "sse4arg")
(set_attr "mode" "TI")])

(define_insn "*xop_pcmov_<mode>"
[(set (match_operand:V4F_64 0 "register_operand" "=x")
(if_then_else:V4F_64
(match_operand:V4F_64 3 "register_operand" "x")
(match_operand:V4F_64 1 "register_operand" "x")
(match_operand:V4F_64 2 "register_operand" "x")))]
"TARGET_XOP && TARGET_MMX_WITH_SSE"
"vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "sse4arg")
(set_attr "mode" "TI")])

(define_insn "*xop_pcmov_<mode>"
[(set (match_operand:VI_16_32 0 "register_operand" "=x")
(if_then_else:VI_16_32
Expand All @@ -4147,6 +4158,17 @@
[(set_attr "type" "sse4arg")
(set_attr "mode" "TI")])

(define_insn "*xop_pcmov_<mode>"
[(set (match_operand:V2F_32 0 "register_operand" "=x")
(if_then_else:V2F_32
(match_operand:V2F_32 3 "register_operand" "x")
(match_operand:V2F_32 1 "register_operand" "x")
(match_operand:V2F_32 2 "register_operand" "x")))]
"TARGET_XOP"
"vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "sse4arg")
(set_attr "mode" "TI")])

;; XOP permute instructions
(define_insn "mmx_ppermv64"
[(set (match_operand:V8QI 0 "register_operand" "=x")
Expand Down
27 changes: 27 additions & 0 deletions gcc/testsuite/g++.target/i386/pr112904.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
typedef _Float16 v4hf __attribute__((vector_size(8)));
typedef short v4hi __attribute__((vector_size(8)));
typedef _Float16 v2hf __attribute__((vector_size(4)));
typedef short v2hi __attribute__((vector_size(4)));

typedef __bf16 v4bf __attribute__((vector_size(8)));
typedef __bf16 v2bf __attribute__((vector_size(4)));

v4hf foo(v4hf a, v4hf b, v4hi c)
{
return c ? a : b;
}

v2hf foo1(v2hf a, v2hf b, v2hi c)
{
return c ? a : b;
}

v4bf foo(v4bf a, v4bf b, v4hi c)
{
return c ? a : b;
}

v2bf foo1(v2bf a, v2bf b, v2hi c)
{
return c ? a : b;
}

0 comments on commit 2c2df12

Please sign in to comment.