@@ -4932,6 +4932,7 @@ multiclass avx512_var_shift_mb<bits<8> opc, string OpcodeStr, SDNode OpNode,
4932
4932
SSE_INTSHIFT_ITINS_P.rm>, AVX5128IBase, EVEX_B,
4933
4933
EVEX_4V, EVEX_CD8<_.EltSize, CD8VF>;
4934
4934
}
4935
+
4935
4936
multiclass avx512_var_shift_sizes<bits<8> opc, string OpcodeStr, SDNode OpNode,
4936
4937
AVX512VLVectorVTInfo _> {
4937
4938
let Predicates = [HasAVX512] in
@@ -4955,26 +4956,26 @@ multiclass avx512_var_shift_types<bits<8> opc, string OpcodeStr,
4955
4956
}
4956
4957
4957
4958
// Use 512bit version to implement 128/256 bit in case NoVLX.
4958
- multiclass avx512_var_shift_w_lowering<AVX512VLVectorVTInfo _, SDNode OpNode> {
4959
- let Predicates = [HasBWI, NoVLX] in {
4959
+ multiclass avx512_var_shift_lowering<AVX512VLVectorVTInfo _, string OpcodeStr,
4960
+ SDNode OpNode, list<Predicate> p> {
4961
+ let Predicates = p in {
4960
4962
def : Pat<(_.info256.VT (OpNode (_.info256.VT _.info256.RC:$src1),
4961
4963
(_.info256.VT _.info256.RC:$src2))),
4962
4964
(EXTRACT_SUBREG
4963
- (!cast<Instruction>(NAME#"WZrr ")
4965
+ (!cast<Instruction>(OpcodeStr#"Zrr ")
4964
4966
(INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR256X:$src1, sub_ymm),
4965
4967
(INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR256X:$src2, sub_ymm)),
4966
4968
sub_ymm)>;
4967
4969
4968
4970
def : Pat<(_.info128.VT (OpNode (_.info128.VT _.info128.RC:$src1),
4969
4971
(_.info128.VT _.info128.RC:$src2))),
4970
4972
(EXTRACT_SUBREG
4971
- (!cast<Instruction>(NAME#"WZrr ")
4973
+ (!cast<Instruction>(OpcodeStr#"Zrr ")
4972
4974
(INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR128X:$src1, sub_xmm),
4973
4975
(INSERT_SUBREG (_.info512.VT (IMPLICIT_DEF)), VR128X:$src2, sub_xmm)),
4974
4976
sub_xmm)>;
4975
4977
}
4976
4978
}
4977
-
4978
4979
multiclass avx512_var_shift_w<bits<8> opc, string OpcodeStr,
4979
4980
SDNode OpNode> {
4980
4981
let Predicates = [HasBWI] in
@@ -4990,19 +4991,22 @@ multiclass avx512_var_shift_w<bits<8> opc, string OpcodeStr,
4990
4991
}
4991
4992
4992
4993
defm VPSLLV : avx512_var_shift_types<0x47, "vpsllv", shl>,
4993
- avx512_var_shift_w<0x12, "vpsllvw", shl>,
4994
- avx512_var_shift_w_lowering<avx512vl_i16_info, shl>;
4994
+ avx512_var_shift_w<0x12, "vpsllvw", shl>;
4995
4995
4996
4996
defm VPSRAV : avx512_var_shift_types<0x46, "vpsrav", sra>,
4997
- avx512_var_shift_w<0x11, "vpsravw", sra>,
4998
- avx512_var_shift_w_lowering<avx512vl_i16_info, sra>;
4997
+ avx512_var_shift_w<0x11, "vpsravw", sra>;
4999
4998
5000
4999
defm VPSRLV : avx512_var_shift_types<0x45, "vpsrlv", srl>,
5001
- avx512_var_shift_w<0x10, "vpsrlvw", srl>,
5002
- avx512_var_shift_w_lowering<avx512vl_i16_info, srl>;
5000
+ avx512_var_shift_w<0x10, "vpsrlvw", srl>;
5001
+
5003
5002
defm VPRORV : avx512_var_shift_types<0x14, "vprorv", rotr>;
5004
5003
defm VPROLV : avx512_var_shift_types<0x15, "vprolv", rotl>;
5005
5004
5005
+ defm : avx512_var_shift_lowering<avx512vl_i64_info, "VPSRAVQ", sra, [HasAVX512, NoVLX]>;
5006
+ defm : avx512_var_shift_lowering<avx512vl_i16_info, "VPSLLVW", shl, [HasBWI, NoVLX]>;
5007
+ defm : avx512_var_shift_lowering<avx512vl_i16_info, "VPSRAVW", sra, [HasBWI, NoVLX]>;
5008
+ defm : avx512_var_shift_lowering<avx512vl_i16_info, "VPSRLVW", srl, [HasBWI, NoVLX]>;
5009
+
5006
5010
// Special handing for handling VPSRAV intrinsics.
5007
5011
multiclass avx512_var_shift_int_lowering<string InstrStr, X86VectorVTInfo _,
5008
5012
list<Predicate> p> {
0 commit comments