Skip to content

Commit

Permalink
AVX512FP16: Add expander for smin/maxhf3.
Browse files Browse the repository at this point in the history
gcc/ChangeLog:

	* config/i386/i386.md (<code>hf3): New expander.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/avx512fp16-builtin-minmax-1.c: New test.
  • Loading branch information
wwwhhhyyy authored and algebra84 committed Sep 23, 2021
1 parent 1041111 commit fccd885
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
11 changes: 11 additions & 0 deletions gcc/config/i386/i386.md
Expand Up @@ -19946,6 +19946,17 @@
(set_attr "type" "sseadd")
(set_attr "mode" "<MODE>")])

(define_insn "<code>hf3"
[(set (match_operand:HF 0 "register_operand" "=v")
(smaxmin:HF
(match_operand:HF 1 "nonimmediate_operand" "%v")
(match_operand:HF 2 "nonimmediate_operand" "vm")))]
"TARGET_AVX512FP16"
"v<maxmin_float>sh\t{%2, %1, %0|%0, %1, %2}"
[(set_attr "prefix" "evex")
(set_attr "type" "sseadd")
(set_attr "mode" "HF")])

;; These versions of the min/max patterns implement exactly the operations
;; min = (op1 < op2 ? op1 : op2)
;; max = (!(op1 < op2) ? op1 : op2)
Expand Down
35 changes: 35 additions & 0 deletions gcc/testsuite/gcc.target/i386/avx512fp16-builtin-minmax-1.c
@@ -0,0 +1,35 @@
/* { dg-do compile } */
/* { dg-options "-Ofast -mavx512fp16 -mprefer-vector-width=512" } */

_Float16
minf1 (_Float16 a, _Float16 b)
{
return __builtin_fminf16 (a, b);
}

void
minf2 (_Float16* __restrict psrc1, _Float16* __restrict psrc2,
_Float16* __restrict pdst)
{
for (int i = 0; i != 32; i++)
pdst[i] = __builtin_fminf16 (psrc1[i], psrc2[i]);
}

_Float16
maxf1 (_Float16 a, _Float16 b)
{
return __builtin_fmaxf16 (a, b);
}

void
maxf2 (_Float16* __restrict psrc1, _Float16* __restrict psrc2,
_Float16* __restrict pdst)
{
for (int i = 0; i != 32; i++)
pdst[i] = __builtin_fmaxf16 (psrc1[i], psrc2[i]);
}

/* { dg-final { scan-assembler-times "vmaxsh\[^\n\r\]*xmm\[0-9\]" 1 } } */
/* { dg-final { scan-assembler-times "vmaxph\[^\n\r\]*zmm\[0-9\]" 1 } } */
/* { dg-final { scan-assembler-times "vminsh\[^\n\r\]*xmm\[0-9\]" 1 } } */
/* { dg-final { scan-assembler-times "vminph\[^\n\r\]*zmm\[0-9\]" 1 } } */

0 comments on commit fccd885

Please sign in to comment.