;; Since vpcmpd implicitly clear the upper bits of dest, transform
;; vpcmpd + zero_extend to vpcmpd since the instruction
-(define_insn_and_split "*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
- [(set (match_operand:SWI248x 0 "register_operand")
+(define_insn "*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
+ [(set (match_operand:SWI248x 0 "register_operand" "=k")
(zero_extend:SWI248x
(unspec:<V48H_AVX512VL:avx512fmaskmode>
- [(match_operand:V48H_AVX512VL 1 "nonimmediate_operand")
- (match_operand:V48H_AVX512VL 2 "nonimmediate_operand")
+ [(match_operand:V48H_AVX512VL 1 "nonimmediate_operand" "v")
+ (match_operand:V48H_AVX512VL 2 "nonimmediate_operand" "vm")
(match_operand:SI 3 "const_0_to_7_operand" "n")]
UNSPEC_PCMP)))]
"TARGET_AVX512F
&& (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
- && ix86_pre_reload_split ()
&& (GET_MODE_NUNITS (<V48H_AVX512VL:MODE>mode)
< GET_MODE_PRECISION (<SWI248x:MODE>mode))"
- "#"
- "&& 1"
- [(set (match_dup 0)
- (unspec:<V48H_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_PCMP))]
-{
- operands[1] = force_reg (<V48H_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<V48H_AVX512VL:avx512fmaskmode>mode,
- operands[0], <SWI248x:MODE>mode);
-}
+ "v<ssecmpintprefix>cmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
"#"
"&& 1"
[(set (match_dup 0)
- (unspec:<V48H_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_PCMP))
- (set (match_dup 4) (match_dup 0))]
+ (zero_extend:SWI248x
+ (unspec:<V48H_AVX512VL:avx512fmaskmode>
+ [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_PCMP)))
+ (set (match_dup 4) (match_dup 5))]
{
- operands[1] = force_reg (<V48H_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<V48H_AVX512VL:avx512fmaskmode>mode,
+ operands[5] = lowpart_subreg (<V48H_AVX512VL:avx512fmaskmode>mode,
operands[0], <SWI248x:MODE>mode);
-}
- [(set_attr "type" "ssecmp")
- (set_attr "length_immediate" "1")
- (set_attr "prefix" "evex")
- (set_attr "mode" "<V48H_AVX512VL:sseinsnmode>")])
+ if (SUBREG_P (operands[5]))
+ {
+ SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
+ SUBREG_PROMOTED_SET (operands[5], 1);
+ }
+})
(define_insn_and_split "*<avx512>_cmp<mode>3"
[(set (match_operand:<avx512fmaskmode> 0 "register_operand")
(set_attr "prefix" "evex")
(set_attr "mode" "<sseinsnmode>")])
-(define_insn_and_split "*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
- [(set (match_operand:SWI248x 0 "register_operand")
+(define_insn "*<avx512>_cmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
+ [(set (match_operand:SWI248x 0 "register_operand" "=k")
(zero_extend:SWI248x
(unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
- (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")
- (match_operand:SI 3 "const_0_to_7_operand")]
+ [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "v")
+ (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
+ (match_operand:SI 3 "const_0_to_7_operand" "n")]
UNSPEC_PCMP)))]
"TARGET_AVX512BW
- && ix86_pre_reload_split ()
- && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
- < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
- "#"
- "&& 1"
- [(set (match_dup 0)
- (unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_PCMP))]
-{
- operands[1] = force_reg (<VI12_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
- operands[0], <SWI248x:MODE>mode);
-}
+ && (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
+ < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
+ "vpcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
"#"
"&& 1"
[(set (match_dup 0)
- (unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_PCMP))
- (set (match_dup 4) (match_dup 0))]
+ (zero_extend:SWI248x
+ (unspec:<VI12_AVX512VL:avx512fmaskmode>
+ [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_PCMP)))
+ (set (match_dup 4) (match_dup 5))]
{
- operands[1] = force_reg (<VI12_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
+ operands[5] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
operands[0], <SWI248x:MODE>mode);
+ if (SUBREG_P (operands[5]))
+ {
+ SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
+ SUBREG_PROMOTED_SET (operands[5], 1);
+ }
}
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
(set_attr "mode" "<sseinsnmode>")])
-(define_insn_and_split "*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
- [(set (match_operand:SWI248x 0 "register_operand")
+(define_insn "*<avx512>_ucmp<VI12_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
+ [(set (match_operand:SWI248x 0 "register_operand" "=k")
(zero_extend:SWI248x
(unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand")
- (match_operand:VI12_AVX512VL 2 "nonimmediate_operand")
- (match_operand:SI 3 "const_0_to_7_operand")]
+ [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "v")
+ (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")
+ (match_operand:SI 3 "const_0_to_7_operand" "n")]
UNSPEC_UNSIGNED_PCMP)))]
"TARGET_AVX512BW
- && ix86_pre_reload_split ()
&& (GET_MODE_NUNITS (<VI12_AVX512VL:MODE>mode)
< GET_MODE_PRECISION (<SWI248x:MODE>mode))"
- "#"
- "&& 1"
- [(set (match_dup 0)
- (unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_UNSIGNED_PCMP))]
-{
- operands[1] = force_reg (<VI12_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
- operands[0], <SWI248x:MODE>mode);
-}
+ "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
"#"
"&& 1"
[(set (match_dup 0)
- (unspec:<VI12_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_UNSIGNED_PCMP))
- (set (match_dup 4) (match_dup 0))]
-{
- operands[1] = force_reg (<VI12_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
+ (zero_extend:SWI248x
+ (unspec:<VI12_AVX512VL:avx512fmaskmode>
+ [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_UNSIGNED_PCMP)))
+ (set (match_dup 4) (match_dup 5))]
+{
+ operands[5] = lowpart_subreg (<VI12_AVX512VL:avx512fmaskmode>mode,
operands[0], <SWI248x:MODE>mode);
+ if (SUBREG_P (operands[5]))
+ {
+ SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
+ SUBREG_PROMOTED_SET (operands[5], 1);
+ }
}
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
(set_attr "mode" "<sseinsnmode>")])
-(define_insn_and_split "*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
- [(set (match_operand:SWI248x 0 "register_operand")
+(define_insn "*<avx512>_ucmp<VI48_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
+ [(set (match_operand:SWI248x 0 "register_operand" "=k")
(zero_extend:SWI248x
(unspec:<VI48_AVX512VL:avx512fmaskmode>
- [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand")
- (match_operand:VI48_AVX512VL 2 "nonimmediate_operand")
- (match_operand:SI 3 "const_0_to_7_operand")]
+ [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "v")
+ (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")
+ (match_operand:SI 3 "const_0_to_7_operand" "n")]
UNSPEC_UNSIGNED_PCMP)))]
"TARGET_AVX512F
&& (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
- && ix86_pre_reload_split ()
&& (GET_MODE_NUNITS (<VI48_AVX512VL:MODE>mode)
< GET_MODE_PRECISION (<SWI248x:MODE>mode))"
- "#"
- "&& 1"
- [(set (match_dup 0)
- (unspec:<VI48_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_UNSIGNED_PCMP))]
-{
- operands[1] = force_reg (<VI48_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI48_AVX512VL:avx512fmaskmode>mode,
- operands[0], <SWI248x:MODE>mode);
-}
+ "vpcmpu<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")
(set_attr "prefix" "evex")
"#"
"&& 1"
[(set (match_dup 0)
- (unspec:<VI48_AVX512VL:avx512fmaskmode>
- [(match_dup 1)
- (match_dup 2)
- (match_dup 3)]
- UNSPEC_UNSIGNED_PCMP))
- (set (match_dup 4) (match_dup 0))]
-{
- operands[1] = force_reg (<VI48_AVX512VL:MODE>mode, operands[1]);
- operands[0] = lowpart_subreg (<VI48_AVX512VL:avx512fmaskmode>mode,
+ (zero_extend:SWI248x
+ (unspec:<VI48_AVX512VL:avx512fmaskmode>
+ [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_UNSIGNED_PCMP)))
+ (set (match_dup 4) (match_dup 5))]
+{
+ operands[5] = lowpart_subreg (<VI48_AVX512VL:avx512fmaskmode>mode,
operands[0], <SWI248x:MODE>mode);
+ if (SUBREG_P (operands[5]))
+ {
+ SUBREG_PROMOTED_VAR_P (operands[5]) = 1;
+ SUBREG_PROMOTED_SET (operands[5], 1);
+ }
}
[(set_attr "type" "ssecmp")
(set_attr "length_immediate" "1")