(define_mode_iterator X87MODEFH [HF SF DF XF])
;; All SSE floating point modes
-(define_mode_iterator SSEMODEF [SF DF TF])
-(define_mode_attr ssevecmodef [(SF "V4SF") (DF "V2DF") (TF "TF")])
+(define_mode_iterator SSEMODEF [HF SF DF TF])
+(define_mode_attr ssevecmodef [(HF "V8HF") (SF "V4SF") (DF "V2DF") (TF "TF")])
;; SSE instruction suffix for various modes
(define_mode_attr ssemodesuffix
}
[(set_attr "isa" "noavx,noavx,avx,avx")])
+(define_expand "<code>hf2"
+ [(set (match_operand:HF 0 "register_operand")
+ (absneg:HF (match_operand:HF 1 "register_operand")))]
+ "TARGET_AVX512FP16"
+ "ix86_expand_fp_absneg_operator (<CODE>, HFmode, operands); DONE;")
+
(define_expand "<code><mode>2"
[(set (match_operand:X87MODEF 0 "register_operand")
(absneg:X87MODEF (match_operand:X87MODEF 1 "register_operand")))]
[(const_int 0)]
"ix86_split_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
+(define_insn_and_split "*<code>hf2_1"
+ [(set (match_operand:HF 0 "register_operand" "=Yv")
+ (absneg:HF
+ (match_operand:HF 1 "register_operand" "Yv")))
+ (use (match_operand:V8HF 2 "vector_operand" "Yvm"))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_AVX512FP16"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0)
+ (<absneg_op>:V8HF (match_dup 1) (match_dup 2)))]
+{
+ operands[0] = lowpart_subreg (V8HFmode, operands[0], HFmode);
+ operands[1] = lowpart_subreg (V8HFmode, operands[1], HFmode);
+})
+
(define_insn "*<code><mode>2_1"
[(set (match_operand:MODEF 0 "register_operand" "=x,x,Yv,f,!r")
(absneg:MODEF
(match_operand:SSEMODEF 1 "nonmemory_operand")
(match_operand:SSEMODEF 2 "register_operand")]
"(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
- || (TARGET_SSE && (<MODE>mode == TFmode))"
+ || (TARGET_SSE && (<MODE>mode == TFmode))
+ || (TARGET_AVX512FP16 && (<MODE>mode ==HFmode))"
"ix86_expand_copysign (operands); DONE;")
(define_expand "xorsign<mode>3"
- [(match_operand:MODEF 0 "register_operand")
- (match_operand:MODEF 1 "register_operand")
- (match_operand:MODEF 2 "register_operand")]
- "SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH"
+ [(match_operand:MODEFH 0 "register_operand")
+ (match_operand:MODEFH 1 "register_operand")
+ (match_operand:MODEFH 2 "register_operand")]
+ "(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+ || <MODE>mode == HFmode"
{
if (rtx_equal_p (operands[1], operands[2]))
emit_insn (gen_abs<mode>2 (operands[0], operands[1]));
(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
+;; 128-, 256- and 512-bit float vector modes for bitwise operations
+(define_mode_iterator VFB
+ [(V32HF "TARGET_AVX512FP16")
+ (V16HF "TARGET_AVX512FP16")
+ (V8HF "TARGET_AVX512FP16")
+ (V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
+ (V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
+
;; 128- and 256-bit float vector modes
(define_mode_iterator VF_128_256
[(V8SF "TARGET_AVX") V4SF
(V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
+;; 128- and 256-bit float vector modes for bitwise operations
+(define_mode_iterator VFB_128_256
+ [(V16HF "TARGET_AVX512FP16")
+ (V8HF "TARGET_AVX512FP16")
+ (V8SF "TARGET_AVX") V4SF
+ (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")])
+
;; All SFmode vector float modes
(define_mode_iterator VF1
[(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF])
(define_mode_iterator VF_512
[V16SF V8DF])
+;; All 512bit vector float modes for bitwise operations
+(define_mode_iterator VFB_512
+ [(V32HF "TARGET_AVX512FP16") V16SF V8DF])
+
(define_mode_iterator VI48_AVX512VL
[V16SI (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
V8DI (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
(define_mode_attr sseintvecmode2
[(V8DF "XI") (V4DF "OI") (V2DF "TI")
- (V8SF "OI") (V4SF "TI")])
+ (V8SF "OI") (V4SF "TI")
+ (V16HF "OI") (V8HF "TI")])
(define_mode_attr sseintvecmodelower
[(V16SF "v16si") (V8DF "v8di")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define_expand "<code><mode>2"
- [(set (match_operand:VF 0 "register_operand")
- (absneg:VF
- (match_operand:VF 1 "register_operand")))]
+ [(set (match_operand:VFB 0 "register_operand")
+ (absneg:VFB
+ (match_operand:VFB 1 "register_operand")))]
"TARGET_SSE"
"ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
(define_insn_and_split "*<code><mode>2"
- [(set (match_operand:VF 0 "register_operand" "=x,x,v,v")
- (absneg:VF
- (match_operand:VF 1 "vector_operand" "0,xBm,v,m")))
- (use (match_operand:VF 2 "vector_operand" "xBm,0,vm,v"))]
+ [(set (match_operand:VFB 0 "register_operand" "=x,x,v,v")
+ (absneg:VFB
+ (match_operand:VFB 1 "vector_operand" "0,xBm,v,m")))
+ (use (match_operand:VFB 2 "vector_operand" "xBm,0,vm,v"))]
"TARGET_SSE"
"#"
"&& reload_completed"
[(set (match_dup 0)
- (<absneg_op>:VF (match_dup 1) (match_dup 2)))]
+ (<absneg_op>:VFB (match_dup 1) (match_dup 2)))]
{
if (TARGET_AVX)
{
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define_insn "<sse>_andnot<mode>3<mask_name>"
- [(set (match_operand:VF_128_256 0 "register_operand" "=x,x,v,v")
- (and:VF_128_256
- (not:VF_128_256
- (match_operand:VF_128_256 1 "register_operand" "0,x,v,v"))
- (match_operand:VF_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
+ [(set (match_operand:VFB_128_256 0 "register_operand" "=x,x,v,v")
+ (and:VFB_128_256
+ (not:VFB_128_256
+ (match_operand:VFB_128_256 1 "register_operand" "0,x,v,v"))
+ (match_operand:VFB_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
"TARGET_SSE && <mask_avx512vl_condition>"
{
char buf[128];
switch (get_attr_mode (insn))
{
+ case MODE_V16HF:
+ case MODE_V8HF:
case MODE_V8SF:
case MODE_V4SF:
suffix = "ps";
(const_string "<MODE>")))])
(define_insn "<sse>_andnot<mode>3<mask_name>"
- [(set (match_operand:VF_512 0 "register_operand" "=v")
- (and:VF_512
- (not:VF_512
- (match_operand:VF_512 1 "register_operand" "v"))
- (match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
+ [(set (match_operand:VFB_512 0 "register_operand" "=v")
+ (and:VFB_512
+ (not:VFB_512
+ (match_operand:VFB_512 1 "register_operand" "v"))
+ (match_operand:VFB_512 2 "nonimmediate_operand" "vm")))]
"TARGET_AVX512F"
{
char buf[128];
suffix = "<ssemodesuffix>";
ops = "";
- /* There is no vandnp[sd] in avx512f. Use vpandn[qd]. */
- if (!TARGET_AVX512DQ)
+ /* Since there are no vandnp[sd] without AVX512DQ nor vandnph,
+ use vp<logic>[dq]. */
+ if (!TARGET_AVX512DQ || <MODE>mode == V32HFmode)
{
suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
ops = "p";
(const_string "XI")))])
(define_expand "<code><mode>3<mask_name>"
- [(set (match_operand:VF_128_256 0 "register_operand")
- (any_logic:VF_128_256
- (match_operand:VF_128_256 1 "vector_operand")
- (match_operand:VF_128_256 2 "vector_operand")))]
+ [(set (match_operand:VFB_128_256 0 "register_operand")
+ (any_logic:VFB_128_256
+ (match_operand:VFB_128_256 1 "vector_operand")
+ (match_operand:VFB_128_256 2 "vector_operand")))]
"TARGET_SSE && <mask_avx512vl_condition>"
"ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
(define_expand "<code><mode>3<mask_name>"
- [(set (match_operand:VF_512 0 "register_operand")
- (any_logic:VF_512
- (match_operand:VF_512 1 "nonimmediate_operand")
- (match_operand:VF_512 2 "nonimmediate_operand")))]
+ [(set (match_operand:VFB_512 0 "register_operand")
+ (any_logic:VFB_512
+ (match_operand:VFB_512 1 "nonimmediate_operand")
+ (match_operand:VFB_512 2 "nonimmediate_operand")))]
"TARGET_AVX512F"
"ix86_fixup_binary_operands_no_copy (<CODE>, <MODE>mode, operands);")
(define_insn "*<code><mode>3<mask_name>"
- [(set (match_operand:VF_128_256 0 "register_operand" "=x,x,v,v")
- (any_logic:VF_128_256
- (match_operand:VF_128_256 1 "vector_operand" "%0,x,v,v")
- (match_operand:VF_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
+ [(set (match_operand:VFB_128_256 0 "register_operand" "=x,x,v,v")
+ (any_logic:VFB_128_256
+ (match_operand:VFB_128_256 1 "vector_operand" "%0,x,v,v")
+ (match_operand:VFB_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
"TARGET_SSE && <mask_avx512vl_condition>
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
switch (get_attr_mode (insn))
{
+ case MODE_V16HF:
+ case MODE_V8HF:
case MODE_V8SF:
case MODE_V4SF:
suffix = "ps";
(const_string "<MODE>")))])
(define_insn "*<code><mode>3<mask_name>"
- [(set (match_operand:VF_512 0 "register_operand" "=v")
- (any_logic:VF_512
- (match_operand:VF_512 1 "nonimmediate_operand" "%v")
- (match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
+ [(set (match_operand:VFB_512 0 "register_operand" "=v")
+ (any_logic:VFB_512
+ (match_operand:VFB_512 1 "nonimmediate_operand" "%v")
+ (match_operand:VFB_512 2 "nonimmediate_operand" "vm")))]
"TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
char buf[128];
suffix = "<ssemodesuffix>";
ops = "";
- /* There is no v<logic>p[sd] in avx512f. Use vp<logic>[dq]. */
- if (!TARGET_AVX512DQ)
+ /* Since there are no v<logic>p[sd] without AVX512DQ nor v<logic>ph,
+ use vp<logic>[dq]. */
+ if (!TARGET_AVX512DQ || <MODE>mode == V32HFmode)
{
suffix = GET_MODE_INNER (<MODE>mode) == DFmode ? "q" : "d";
ops = "p";
(define_expand "copysign<mode>3"
[(set (match_dup 4)
- (and:VF
- (not:VF (match_dup 3))
- (match_operand:VF 1 "vector_operand")))
+ (and:VFB
+ (not:VFB (match_dup 3))
+ (match_operand:VFB 1 "vector_operand")))
(set (match_dup 5)
- (and:VF (match_dup 3)
- (match_operand:VF 2 "vector_operand")))
- (set (match_operand:VF 0 "register_operand")
- (ior:VF (match_dup 4) (match_dup 5)))]
+ (and:VFB (match_dup 3)
+ (match_operand:VFB 2 "vector_operand")))
+ (set (match_operand:VFB 0 "register_operand")
+ (ior:VFB (match_dup 4) (match_dup 5)))]
"TARGET_SSE"
{
operands[3] = ix86_build_signbit_mask (<MODE>mode, 1, 0);
(define_expand "xorsign<mode>3"
[(set (match_dup 4)
- (and:VF (match_dup 3)
- (match_operand:VF 2 "vector_operand")))
- (set (match_operand:VF 0 "register_operand")
- (xor:VF (match_dup 4)
- (match_operand:VF 1 "vector_operand")))]
+ (and:VFB (match_dup 3)
+ (match_operand:VFB 2 "vector_operand")))
+ (set (match_operand:VFB 0 "register_operand")
+ (xor:VFB (match_dup 4)
+ (match_operand:VFB 1 "vector_operand")))]
"TARGET_SSE"
{
operands[3] = ix86_build_signbit_mask (<MODE>mode, 1, 0);