diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 20efac7344a92fb36c35a4ab274710e2e2c218e3..fe3c64ca89c6d52f2d34992cefe183c33b9f2f44 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,938 @@
+2014-10-29  Alexander Ivchenko  <alexander.ivchenko@intel.com>
+	    Maxim Kuznetsov  <maxim.kuznetsov@intel.com>
+	    Anna Tikhonova  <anna.tikhonova@intel.com>
+	    Ilya Tocar  <ilya.tocar@intel.com>
+	    Andrey Turetskiy  <andrey.turetskiy@intel.com>
+	    Ilya Verbin  <ilya.verbin@intel.com>
+	    Kirill Yukhin  <kirill.yukhin@intel.com>
+	    Michael Zolotukhin  <michael.v.zolotukhin@intel.com>
+
+	* gcc.target/i386/avx512bw-check.h: New.
+	* gcc.target/i386/avx512bw-kunpckdq-1.c: Ditto.
+	* gcc.target/i386/avx512bw-kunpckwd-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vdbpsadbw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vdbpsadbw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vmovdqu16-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vmovdqu16-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vmovdqu8-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vmovdqu8-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpabsb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpabsb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpabsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpabsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackssdw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackssdw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpacksswb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpacksswb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackusdw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackusdw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackuswb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpackuswb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddsb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddsb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddusb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddusb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddusw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddusw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpaddw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpalignr-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpalignr-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpavgb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpavgb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpavgw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpavgw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpblendmb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpblendmb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpblendmw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpblendmw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpbroadcastb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpbroadcastb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpbroadcastw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpbroadcastw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpeqb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpeqb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpeqw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpeqw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpgtb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpgtb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpgtw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpgtw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpub-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpub-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpuw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpuw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpcmpw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermi2w-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermi2w-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermt2w-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermt2w-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpermw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaddubsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaddubsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaddwd-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaddwd-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxsb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxsb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxub-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxub-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxuw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmaxuw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminsb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminsb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminub-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminub-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminuw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpminuw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovb2m-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovb2m-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovm2b-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovm2b-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovm2w-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovm2w-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovswb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovswb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovsxbw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovsxbw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovuswb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovuswb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovw2m-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovw2m-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovwb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovwb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovzxbw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmovzxbw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhrsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhrsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhuw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhuw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmulhw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmullw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpmullw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshufb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshufb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshufhw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshufhw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshuflw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpshuflw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpslldq-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllvw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllvw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllwi-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsllwi-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsravw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsravw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsraw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsraw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrawi-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrawi-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrldq-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlvw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlvw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlwi-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsrlwi-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubsb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubsb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubsw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubsw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubusb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubusb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubusw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubusw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpsubw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestmb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestmb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestmw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestmw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestnmb-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestnmb-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestnmw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vptestnmw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpckhbw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpckhbw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpckhwd-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpckhwd-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpcklbw-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpcklbw-2.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpcklwd-1.c: Ditto.
+	* gcc.target/i386/avx512bw-vpunpcklwd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-check.h: Ditto.
+	* gcc.target/i386/avx512dq-vandnpd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vandnpd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vandnps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vandnps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vandpd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vandpd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vandps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vandps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf32x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf32x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf32x8-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcastf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti32x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti32x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti32x8-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vbroadcasti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtpd2qq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtpd2qq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtpd2uqq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtpd2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtps2qq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtps2qq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtps2uqq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtps2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtqq2pd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtqq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtqq2ps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtqq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttpd2qq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttpd2qq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttpd2uqq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttpd2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttps2qq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttps2qq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttps2uqq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvttps2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtuqq2pd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtuqq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtuqq2ps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vcvtuqq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vextractf32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vextractf64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vextractf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vextracti32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vextracti64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vextracti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclasspd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclasspd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclassps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclassps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclasssd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vfpclassss-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vinsertf32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vinsertf64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vinsertf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vinserti32x8-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vinserti64x2-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vinserti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vorpd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vorpd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vorps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vorps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovd2m-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovd2m-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovm2d-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovm2d-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovm2q-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovm2q-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovq2m-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmovq2m-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmullq-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vpmullq-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangepd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangepd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangeps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangeps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangesd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vrangess-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vreducepd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vreducepd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vreduceps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vreduceps-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vreducesd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vreducess-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vxorpd-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vxorpd-2.c: Ditto.
+	* gcc.target/i386/avx512dq-vxorps-1.c: Ditto.
+	* gcc.target/i386/avx512dq-vxorps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-check.h: Ditto.
+	* gcc.target/i386/avx512vl-gather-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32gatherd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32gatherpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32gatherps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32gatherq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32scatterd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32scatterpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32scatterps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i32scatterq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64gatherd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64gatherpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64gatherps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64gatherq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64scatterd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64scatterpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64scatterps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-i64scatterq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vaddpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vaddpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vaddps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vaddps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-valignd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-valignd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-valignq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-valignq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vandnpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vandnps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vandpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vandps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vblendmpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vblendmpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vblendmps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vblendmps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastf32x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastf32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastf32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcasti32x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcasti32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcasti32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcasti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastsd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastsd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastss-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vbroadcastss-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcmppd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcmppd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcmpps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcmpps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcompresspd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcompresspd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcompressps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcompressps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtdq2pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtdq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtdq2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtdq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2dq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2dq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2qq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2udq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2udq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtpd2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtph2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtph2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2dq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2dq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2ph-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2ph-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2qq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2udq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2udq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtps2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtqq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtqq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2dq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2dq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2qq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2udq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2udq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttpd2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2dq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2dq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2qq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2udq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2udq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvttps2uqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtudq2pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtudq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtudq2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtudq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtuqq2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vcvtuqq2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vdbpsadbw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vdivpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vdivpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vdivps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vdivps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vexpandpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vexpandpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vexpandps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vexpandps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vextractf32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vextractf32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vextractf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vextracti32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vextracti32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vextracti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfixupimmpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfixupimmpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfixupimmps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfixupimmps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddsubXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddsubXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddsubXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmaddsubXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubaddXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubaddXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubaddXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfmsubaddXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmaddXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmaddXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmaddXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmaddXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmsubXXXpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmsubXXXpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmsubXXXps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vfnmsubXXXps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfpclasspd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vfpclassps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetexppd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetexppd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetexpps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetexpps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetmantpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetmantpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetmantps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vgetmantps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vinsertf32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vinsertf32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vinsertf64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vinserti32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vinserti32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vinserti64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmaxpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmaxpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmaxps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmaxps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vminpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vminpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vminps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vminps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovapd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovapd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovaps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovaps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovddup-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovddup-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqa32-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqa32-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqa64-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqa64-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu16-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu32-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu32-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu64-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu64-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovdqu8-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovntdqa-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovshdup-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovshdup-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovsldup-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovsldup-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovupd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovupd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovups-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmovups-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmulpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmulpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vmulps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vmulps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vorpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vorps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpabsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpackssdw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpacksswb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpackusdw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpackuswb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddsb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddusb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddusw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpaddw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpalignr-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandnd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandnd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandnq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandnq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpandq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpavgb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpavgw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpblendmw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastmb2q-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastmw2d-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpbroadcastw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpeqw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpged-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgeq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgeud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgeuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpgtw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpled-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpleq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpleud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpleuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpltd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpltq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpltud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpltuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpneqd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpneqq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpnequd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpnequq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpub-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpud-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpuq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpuw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcmpw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcompressd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcompressd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcompressq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpcompressq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpconflictd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpconflictq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2d-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2d-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2q-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2q-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermi2w-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpdi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpdi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpsi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermilpsi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermpdi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermpdi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermq-imm-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermq-imm-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermq-var-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermq-var-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2d-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2d-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2q-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2q-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermt2w-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpermw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpexpandd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpexpandd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpexpandq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpexpandq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vplzcntd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vplzcntq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaddubsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaddwd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxub-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxud-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxuq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmaxuw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminub-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminud-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminud-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminuq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminuq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpminuw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovb2m-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovd2m-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovdb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovdb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovdw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovdw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovm2b-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovm2d-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovm2q-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovm2w-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovq2m-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovqw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsdb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsdb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsdw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsdw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsqw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovswb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxbd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxbd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxbq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxbq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxbw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxdq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxdq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxwd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxwd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxwq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovsxwq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusdb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusdb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusdw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusdw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqb-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovusqw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovuswb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovw2m-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovwb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxbd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxbd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxbq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxbq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxbw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxdq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxdq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxwd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxwd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxwq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmovzxwq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmuldq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmuldq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmulhrsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmulhuw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmulhw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmulld-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmulld-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmullq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmullw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmuludq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpmuludq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpord-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpord-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vporq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vporq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprold-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprold-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolvd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolvd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolvq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprolvq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprord-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprord-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorvd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorvd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorvq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vprorvq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsadbw-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpshufb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpshufd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpshufd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpshufhw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpshuflw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpslld-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpslld-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpslldi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpslldi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllqi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllqi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllvd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllvd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllvq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllvq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllvw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsllwi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrad-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrad-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsradi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsradi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsraq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsraq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsraqi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsraqi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsravd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsravd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsravq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsravq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsravw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsraw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrawi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrld-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrld-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrldi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrldi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlqi-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlqi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlvd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlvd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlvq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlvq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlvw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsrlwi-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubsb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubsw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubusb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubusw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpsubw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpternlogd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpternlogd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpternlogq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpternlogq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestmw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmb-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vptestnmw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhbw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhdq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhdq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhqdq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhqdq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckhwd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpcklbw-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckldq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpckldq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpcklqdq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpcklqdq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpunpcklwd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpxord-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpxord-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vpxorq-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vpxorq-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrangepd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrangeps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrcp14pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrcp14pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrcp14ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrcp14ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vreducepd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vreduceps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrndscalepd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrndscalepd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrndscaleps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrndscaleps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrsqrt14pd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrsqrt14pd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vrsqrt14ps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vrsqrt14ps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vscalefpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vscalefpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vscalefps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vscalefps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshuff32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshuff32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshuff64x2-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshuff64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufi32x4-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufi32x4-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufi64x2-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufi64x2-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vshufps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vsqrtpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vsqrtpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vsqrtps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vsqrtps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vsubpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vsubpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vsubps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vsubps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpckhpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpckhpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpckhps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpckhps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpcklpd-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpcklpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpcklps-1.c: Ditto.
+	* gcc.target/i386/avx512vl-vunpcklps-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vxorpd-2.c: Ditto.
+	* gcc.target/i386/avx512vl-vxorps-2.c: Ditto.
+	* gcc.target/i386/avx512f-helper.h: Make avx512vl friendly.
+	* gcc.target/i386/avx512f-mask-type.h: Ditto.
+	* gcc.target/i386/avx512f-vcmppd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcmpps-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcvtpd2ps-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcvtpd2udq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcvtph2ps-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcvtps2ph-2.c: Ditto.
+	* gcc.target/i386/avx512f-vcvttpd2udq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpandd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpandnd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpandnq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpandq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpbroadcastq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpcmpd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpcmpq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpcmpud-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpcmpuq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpermd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpermilpdi-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpermq-imm-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpermq-var-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovdb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovdw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovqb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovqd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovqw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovsdb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovsdw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovsqb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovsqd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovsqw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovusdb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovusdw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovusqb-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovusqd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpmovusqw-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpord-2.c: Ditto.
+	* gcc.target/i386/avx512f-vporq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpxord-2.c: Ditto.
+	* gcc.target/i386/avx512f-vpxorq-2.c: Ditto.
+	* gcc.target/i386/avx512f-vrndscalepd-2.c: Ditto.
+	* gcc.target/i386/avx512f-vrndscaleps-2.c: Ditto.
+	* gcc.target/i386/avx512f-vshuff32x4-2.c: Ditto.
+	* gcc.target/i386/avx512f-vshuff64x2-2.c: Ditto.
+	* gcc.target/i386/avx512f-vshufi32x4-2.c: Ditto.
+	* gcc.target/i386/avx512f-vshufi64x2-2.c: Ditto.
+	* gcc.target/i386/avx512f-vshufpd-2.c: Ditto.
+	* gcc.target/i386/i386.exp: Ditto.
+	* gcc.target/i386/m512-check.h: Ditto.
+
+2014-10-29  Alexander Ivchenko  <alexander.ivchenko@intel.com>
+	    Maxim Kuznetsov  <maxim.kuznetsov@intel.com>
+	    Anna Tikhonova  <anna.tikhonova@intel.com>
+	    Ilya Tocar  <ilya.tocar@intel.com>
+	    Andrey Turetskiy  <andrey.turetskiy@intel.com>
+	    Ilya Verbin  <ilya.verbin@intel.com>
+	    Kirill Yukhin  <kirill.yukhin@intel.com>
+	    Michael Zolotukhin  <michael.v.zolotukhin@intel.com>
+
+	* g++.dg/other/i386-2.C: Add new options.
+	* g++.dg/other/i386-3.C: Ditto.
+	* gcc.target/i386/sse-12.c: Ditto.
+	* gcc.target/i386/sse-14.c: Ditto.
+	* gcc.target/i386/sse-22.c: Ditto.
+	* gcc.target/i386/sse-13.c: Add new options and builtins.
+	* gcc.target/i386/sse-23.c: Ditto.
+	* gcc.target/i386/avx-1.c: Add new builtins.
+
 2014-10-28  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
         * gcc.misc-tests/godump.exp: New.
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-check.h b/gcc/testsuite/gcc.target/i386/avx512bw-check.h
new file mode 100644
index 0000000000000000000000000000000000000000..4cae3092fe7d8b1ee8b67b3897ee5559760b71d0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-check.h
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include "cpuid.h"
+#include "m512-check.h"
+#include "avx512f-os-support.h"
+
+static void avx512bw_test (void);
+
+static void __attribute__ ((noinline)) do_test (void)
+{
+  avx512bw_test ();
+}
+
+int
+main ()
+{
+  unsigned int eax, ebx, ecx, edx;
+
+  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+    return 0;
+
+  /* Run AVX512BW test only if host has AVX512BW support.  */
+  if ((ecx & bit_OSXSAVE) == (bit_OSXSAVE))
+    {
+      if (__get_cpuid_max (0, NULL) < 7)
+	return 0;
+
+      __cpuid_count (7, 0, eax, ebx, ecx, edx);
+
+      if ((avx512f_os_support ()) && ((ebx & bit_AVX512BW) == bit_AVX512BW))
+	{
+	  do_test ();
+#ifdef DEBUG
+	  printf ("PASSED\n");
+#endif
+	  return 0;
+	}
+#ifdef DEBUG
+      printf ("SKIPPED\n");
+#endif
+    }
+#ifdef DEBUG
+  else
+    printf ("SKIPPED\n");
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-kunpckdq-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-kunpckdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..16fce46f8e1105281884535635109584f569cb49
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-kunpckdq-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "kunpckdq\[ \\t\]+\[^\n\]*%k\[1-7\]" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512bw_test () {
+  __mmask64 k1, k2, k3;
+  volatile __m512i x;
+
+  __asm__( "kmovq %1, %0" : "=k" (k1) : "r" (1) );
+  __asm__( "kmovq %1, %0" : "=k" (k2) : "r" (2) );
+
+  k3 = _mm512_kunpackd (k1, k2);
+  x = _mm512_mask_avg_epu8 (x, k3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-kunpckwd-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-kunpckwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..eece5e8f2644edb11d65ab675f7ce0673df73c0c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-kunpckwd-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "kunpckwd\[ \\t\]+\[^\n\]*%k\[1-7\]" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512bw_test () {
+  volatile __mmask32 k1, k2, k3;
+  volatile __m256i x;
+
+  __asm__( "kmovd %1, %0" : "=k" (k1) : "r" (1) );
+  __asm__( "kmovd %1, %0" : "=k" (k2) : "r" (2) );
+
+  k3 = _mm512_kunpackw (k1, k2);
+  //x = _mm256_mask_avg_epu8 (x, k3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3a6522cbee73028a7d0d1331068e6b23de2dbb9d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdbpsadbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x, a;
+volatile __m256i y, b;
+volatile __m128i z, c;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_dbsad_epu8 (a, a, 0xaa);
+  x = _mm512_mask_dbsad_epu8 (x, m1, a, a, 0xaa);
+  x = _mm512_maskz_dbsad_epu8 (m1, a, a, 0xaa);
+  y = _mm256_dbsad_epu8 (b, b, 0xbb);
+  y = _mm256_mask_dbsad_epu8 (y, m2, b, b, 0xbb);
+  y = _mm256_maskz_dbsad_epu8 (m2, b, b, 0xbb);
+  z = _mm_dbsad_epu8 (c, c, 0xcc);
+  z = _mm_mask_dbsad_epu8 (z, m3, c, c, 0xcc);
+  z = _mm_maskz_dbsad_epu8 (m3, c, c, 0xcc);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cbd50d3a7ef6922241b4c411fa7d9668282de569
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vdbpsadbw-2.c
@@ -0,0 +1,80 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *dst, unsigned char *src1, unsigned char *src2,
+      int imm)
+{
+  int i, j, k, part, power;
+  unsigned char tmp[2 * SIZE];;
+
+  for (i = 0; i < 2 * SIZE; i += 16)
+    {
+      for (j = 0; j < 4; j++)
+	{
+	  power = 1;
+	  for (k = 0; k < j; k++)
+	    power *= 4;
+	  part = (imm & (3 * power)) >> (2 * j);
+	  for (k = 0; k < 4; k++)
+	    tmp[i + 4 * j + k] = src2[i + 4 * part + k];
+	}
+    }
+
+  for (i = 0; i < SIZE; i += 4)
+    {
+      dst[i] = dst[i + 1] = dst[i + 2] = dst[i + 3] = 0;
+      for (j = 0; j < 4; j++)
+	{
+	  dst[i] += abs (src1[2 * i + j] - tmp[2 * i + j]);
+	  dst[i + 1] += abs (src1[2 * i + j] - tmp[2 * i + j + 1]);
+	  dst[i + 2] += abs (src1[2 * i + j + 4] - tmp[2 * i + j + 2]);
+	  dst[i + 3] += abs (src1[2 * i + j + 4] - tmp[2 * i + j + 3]);
+	}
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+  int imm = 0x22;
+
+  sign = -1;
+  for (i = 0; i < 2*SIZE; i++)
+    {
+      src1.a[i] = 1 + 34 * i * sign;
+      src1.a[i] = 179 - i;
+      sign = sign * -1;
+    }
+
+  for (i = 0; i < SIZE; i++)
+      res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_dbsad_epu8) (src1.x, src2.x, imm);
+  res2.x = INTRINSIC (_mask_dbsad_epu8) (res2.x, mask, src1.x, src2.x, imm);
+  res3.x = INTRINSIC (_maskz_dbsad_epu8) (mask, src1.x, src2.x, imm);
+
+  CALC (res_ref, src1.a, src2.a, imm);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..96682a5611890ffd3f42fd32b5d1a23f55fab71f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+short *p;
+volatile __m512i x1, yy;
+volatile __m256i x2, y2;
+volatile __m128i x3, y3;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512bw_test (void)
+{
+  x1 = _mm512_mask_mov_epi16 (x1, m32, yy);
+  x2 = _mm256_mask_mov_epi16 (x2, m16, y2);
+  x3 = _mm_mask_mov_epi16 (x3, m8, y3);
+
+  x1 = _mm512_maskz_mov_epi16 (m32, yy);
+  x2 = _mm256_maskz_mov_epi16 (m16, y2);
+  x3 = _mm_maskz_mov_epi16 (m8, y3);
+
+  x1 = _mm512_mask_loadu_epi16 (x1, m32, p);
+  x2 = _mm256_mask_loadu_epi16 (x2, m16, p);
+  x3 = _mm_mask_loadu_epi16 (x3, m8, p);
+
+  x1 = _mm512_maskz_loadu_epi16 (m32, p);
+  x2 = _mm256_maskz_loadu_epi16 (m16, p);
+  x3 = _mm_maskz_loadu_epi16 (m8, p);
+
+  _mm512_mask_storeu_epi16 (p, m32, x1);
+  _mm256_mask_storeu_epi16 (p, m16, x2);
+  _mm_mask_storeu_epi16 (p, m8, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..48a59b8482433fb44cebd7f7b111493df7b4d03e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c
@@ -0,0 +1,60 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE ((AVX512F_LEN) / 16)
+#include "avx512f-mask-type.h"
+
+typedef struct
+{
+  char c;
+  short a[SIZE];
+} __attribute__ ((packed)) EVAL(unaligned_array, AVX512F_LEN,);
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s3, res1, res2, res3, res4;
+  EVAL(unaligned_array, AVX512F_LEN,) s2, res5;
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 123 * i * sign;
+      s2.a[i] = 456 * i * sign;
+      s3.a[i] = 789 * i * sign;
+      res1.a[i] = DEFAULT_VALUE;
+      res3.a[i] = DEFAULT_VALUE;
+      res5.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_mask_mov_epi16) (res1.x, mask, s1.x);
+  res2.x = INTRINSIC (_maskz_mov_epi16) (mask, s1.x);
+  res3.x = INTRINSIC (_mask_loadu_epi16) (res3.x, mask, s2.a);
+  res4.x = INTRINSIC (_maskz_loadu_epi16) (mask, s2.a);
+  INTRINSIC (_mask_storeu_epi16) (res5.a, mask, s3.x);
+
+  MASK_MERGE (i_w) (s1.a, mask, SIZE);
+  if (checkVs (res1.a, s1.a, SIZE))
+    abort ();
+
+  MASK_ZERO (i_w) (s1.a, mask, SIZE);
+  if (checkVs (res2.a, s1.a, SIZE))
+    abort ();
+
+  MASK_MERGE (i_w) (s2.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, s2.a))
+    abort ();
+
+  MASK_ZERO (i_w) (s2.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res4, s2.a))
+    abort ();
+
+  MASK_MERGE (i_w) (s3.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (s3, res5.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8856a21f12612dad5741ea83d187194000218628
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+char *p;
+volatile __m512i x1, yy;
+volatile __m256i x2, y2;
+volatile __m128i x3, y3;
+volatile __mmask64 m64;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+
+void extern
+avx512bw_test (void)
+{
+  x1 = _mm512_mask_mov_epi8 (x1, m64, yy);
+  x2 = _mm256_mask_mov_epi8 (x2, m32, y2);
+  x3 = _mm_mask_mov_epi8 (x3, m16, y3);
+
+  x1 = _mm512_maskz_mov_epi8 (m64, yy);
+  x2 = _mm256_maskz_mov_epi8 (m32, y2);
+  x3 = _mm_maskz_mov_epi8 (m16, y3);
+
+  x1 = _mm512_mask_loadu_epi8 (x1, m64, p);
+  x2 = _mm256_mask_loadu_epi8 (x2, m32, p);
+  x3 = _mm_mask_loadu_epi8 (x3, m16, p);
+
+  x1 = _mm512_maskz_loadu_epi8 (m64, p);
+  x2 = _mm256_maskz_loadu_epi8 (m32, p);
+  x3 = _mm_maskz_loadu_epi8 (m16, p);
+
+  _mm512_mask_storeu_epi8 (p, m64, x1);
+  _mm256_mask_storeu_epi8 (p, m32, x2);
+  _mm_mask_storeu_epi8 (p, m16, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c65cf54e43c611dba9b04370a6b7a42bb9e0062
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-2.c
@@ -0,0 +1,60 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE ((AVX512F_LEN) / 8)
+#include "avx512f-mask-type.h"
+
+typedef struct
+{
+  char c;
+  char a[SIZE];
+} __attribute__ ((packed)) EVAL(unaligned_array, AVX512F_LEN,);
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_b) s1, s3, res1, res2, res3, res4;
+  EVAL(unaligned_array, AVX512F_LEN,) s2, res5;
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = (i + 1) * sign;
+      s2.a[i] = (i + 2) * sign;
+      s3.a[i] = (i * 2) * sign;
+      res1.a[i] = DEFAULT_VALUE;
+      res3.a[i] = DEFAULT_VALUE;
+      res5.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_mask_mov_epi8) (res1.x, mask, s1.x);
+  res2.x = INTRINSIC (_maskz_mov_epi8) (mask, s1.x);
+  res3.x = INTRINSIC (_mask_loadu_epi8) (res3.x, mask, s2.a);
+  res4.x = INTRINSIC (_maskz_loadu_epi8) (mask, s2.a);
+  INTRINSIC (_mask_storeu_epi8) (res5.a, mask, s3.x);
+
+  MASK_MERGE (i_b) (s1.a, mask, SIZE);
+  if (checkVc (res1.a, s1.a, SIZE))
+    abort ();
+
+  MASK_ZERO (i_b) (s1.a, mask, SIZE);
+  if (checkVc (res2.a, s1.a, SIZE))
+    abort ();
+
+  MASK_MERGE (i_b) (s2.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, s2.a))
+    abort ();
+
+  MASK_ZERO (i_b) (s2.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res4, s2.a))
+    abort ();
+
+  MASK_MERGE (i_b) (s3.a, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (s3, res5.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..298b9ef2c083d5b3a23f1a1311277d9c8234e50a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_abs_epi8 (z);
+  z = _mm512_mask_abs_epi8 (z, m1, z);
+  z = _mm512_maskz_abs_epi8 (m1, z);
+  y = _mm256_mask_abs_epi8 (y, m2, y);
+  y = _mm256_maskz_abs_epi8 (m2, y);
+  x = _mm_mask_abs_epi8 (x, m3, x);
+  x = _mm_maskz_abs_epi8 (m3, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9cd6ce18b8e8fecc216f3f868d889572a32a38db
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *s, char *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    if (s[i] < 0)
+      r[i] = -s[i];
+    else
+      r[i] = s[i];
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_b) s, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = i * 7 + (i << 15) + 356;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  CALC (s.a, res_ref);
+
+  res1.x = INTRINSIC (_abs_epi8) (s.x);
+  res2.x = INTRINSIC (_mask_abs_epi8) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_abs_epi8) (mask, s.x);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..73a3af1eee5678de8faea457ca05ced3a871b8d5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_abs_epi16 (z);
+  z = _mm512_mask_abs_epi16 (z, m1, z);
+  z = _mm512_maskz_abs_epi16 (m1, z);
+  y = _mm256_mask_abs_epi16 (y, m2, y);
+  y = _mm256_maskz_abs_epi16 (m2, y);
+  x = _mm_mask_abs_epi16 (x, m3, x);
+  x = _mm_maskz_abs_epi16 (m3, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..07e9bfea64f8e9d47b21e5faca25f50904cbb6ae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    if (s[i] < 0)
+      r[i] = -s[i];
+    else
+      r[i] = s[i];
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = i * 7 + (i << 15) + 356;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  CALC (s.a, res_ref);
+
+  res1.x = INTRINSIC (_abs_epi16) (s.x);
+  res2.x = INTRINSIC (_mask_abs_epi16) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_abs_epi16) (mask, s.x);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..71ff18f881c75accc4d578544da79e2f912e3488
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask64 mx;
+volatile __mmask32 my;
+volatile __mmask16 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_packs_epi32 (x, x);
+  x = _mm512_mask_packs_epi32 (x, mx, x, x);
+  x = _mm512_maskz_packs_epi32 (mx, x, x);
+  y = _mm256_mask_packs_epi32 (y, my, y, y);
+  y = _mm256_maskz_packs_epi32 (my, y, y);
+  z = _mm_mask_packs_epi32 (z, mz, z, z);
+  z = _mm_maskz_packs_epi32 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3a9f5c0b4fbe4fdf96c5535fd0e7e9a7b551a5cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define DST_SIZE (AVX512F_LEN / 16)
+#define SRC_SIZE (AVX512F_LEN / 32)
+
+#include "limits.h"
+
+#include "avx512f-mask-type.h"
+
+static short
+EVAL(int_to_short, AVX512F_LEN,) (int iVal)
+{
+  short sVal;
+
+  if (iVal < SHRT_MIN)
+    sVal = SHRT_MIN;
+  else if (iVal > SHRT_MAX)
+    sVal = SHRT_MAX;
+  else
+    sVal = iVal;
+
+  return sVal;
+}
+
+void
+CALC (int *src1, int *src2, short *dst)
+{
+  int i;
+  int *ptr;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      ptr = (i / 4) % 2 ? src2 : src1;
+      dst[i] = EVAL(int_to_short, AVX512F_LEN,) (ptr[i % 4 + (i / 8) * 4]);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_d) s1, s2;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short dst_ref[DST_SIZE];
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s1.a[i] = i + 10;
+      s2.a[i] = i + 15;
+    }
+
+  res1.x = INTRINSIC (_packs_epi32) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_packs_epi32) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_packs_epi32) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, dst_ref))
+    abort ();
+
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..251867d45b35aef126eb338e9886ad70cad0aed2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask64 mx;
+volatile __mmask32 my;
+volatile __mmask16 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_packs_epi16 (x, x);
+  x = _mm512_mask_packs_epi16 (x, mx, x, x);
+  x = _mm512_maskz_packs_epi16 (mx, x, x);
+  y = _mm256_mask_packs_epi16 (y, my, y, y);
+  y = _mm256_maskz_packs_epi16 (my, y, y);
+  z = _mm_mask_packs_epi16 (z, mz, z, z);
+  z = _mm_maskz_packs_epi16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..734f3ffe0475eedcde5673acaa0614e847bce52a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define DST_SIZE (AVX512F_LEN / 8)
+#define SRC_SIZE (AVX512F_LEN / 16)
+
+#include "limits.h"
+
+#include "avx512f-mask-type.h"
+
+static char
+EVAL(short_to_char, AVX512F_LEN,) (short iVal)
+{
+  char sVal;
+
+  if (iVal < CHAR_MIN)
+    sVal = CHAR_MIN;
+  else if (iVal > CHAR_MAX)
+    sVal = CHAR_MAX;
+  else
+    sVal = iVal;
+
+  return sVal;
+}
+
+void
+CALC (short *src1, short *src2, char *dst)
+{
+  int i;
+  short *ptr;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      ptr = (i / 8) % 2 ? src2 : src1;
+      dst[i] = EVAL(short_to_char, AVX512F_LEN,) (ptr[i % 8 + (i / 16) * 8]);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char dst_ref[DST_SIZE];
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s1.a[i] = i + 10;
+      s2.a[i] = i + 15;
+    }
+
+  res1.x = INTRINSIC (_packs_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_packs_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_packs_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, dst_ref))
+    abort ();
+
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6d0166c0d1302d0fcc17f47cbbdf4f5dc7e54bf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask64 mx;
+volatile __mmask32 my;
+volatile __mmask16 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_packus_epi32 (x, x);
+  x = _mm512_mask_packus_epi32 (x, mx, x, x);
+  x = _mm512_maskz_packus_epi32 (mx, x, x);
+  y = _mm256_mask_packus_epi32 (y, my, y, y);
+  y = _mm256_maskz_packus_epi32 (my, y, y);
+  z = _mm_mask_packus_epi32 (z, mz, z, z);
+  z = _mm_maskz_packus_epi32 (mz, z, z);
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2083b59a837c4fa3b935589d1c4c68dd03274ed5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define DST_SIZE (AVX512F_LEN / 16)
+#define SRC_SIZE (AVX512F_LEN / 32)
+
+#include "limits.h"
+
+#include "avx512f-mask-type.h"
+
+static unsigned short
+EVAL(int_to_ushort, AVX512F_LEN,) (int iVal)
+{
+  unsigned short sVal;
+
+  if (iVal < 0)
+    sVal = 0;
+  else if (iVal > USHRT_MAX)
+    sVal = USHRT_MAX;
+  else
+    sVal = iVal;
+
+  return sVal;
+}
+
+void
+CALC (int *src1, int *src2, unsigned short *dst)
+{
+  int i;
+  int *ptr;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      ptr = (i / 4) % 2 ? src2 : src1;
+      dst[i] = EVAL(int_to_ushort, AVX512F_LEN,) (ptr[i % 4 + (i / 8) * 4]);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_d) s1, s2;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short dst_ref[DST_SIZE];
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s1.a[i] = i + 10;
+      s2.a[i] = i + 15;
+    }
+
+  res1.x = INTRINSIC (_packus_epi32) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_packus_epi32) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_packus_epi32) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, dst_ref))
+    abort ();
+
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..69135cb9bc560e4caec39320c924bbb11b653e31
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask64 mx;
+volatile __mmask32 my;
+volatile __mmask16 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_packus_epi16 (x, x);
+  x = _mm512_mask_packus_epi16 (x, mx, x, x);
+  x = _mm512_maskz_packus_epi16 (mx, x, x);
+  y = _mm256_mask_packus_epi16 (y, my, y, y);
+  y = _mm256_maskz_packus_epi16 (my, y, y);
+  z = _mm_mask_packus_epi16 (z, mz, z, z);
+  z = _mm_maskz_packus_epi16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5a8d796fd1c528c4c3918ef91a5c89a89eb2c670
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define DST_SIZE (AVX512F_LEN / 8)
+#define SRC_SIZE (AVX512F_LEN / 16)
+
+#include "limits.h"
+
+#include "avx512f-mask-type.h"
+
+static unsigned char
+EVAL(short_to_uchar, AVX512F_LEN,) (short iVal)
+{
+  unsigned char sVal;
+
+  if (iVal < 0)
+    sVal = 0;
+  else if (iVal > UCHAR_MAX)
+    sVal = UCHAR_MAX;
+  else
+    sVal = iVal;
+
+  return sVal;
+}
+
+void
+CALC (short *src1, short *src2, unsigned char *dst)
+{
+  int i;
+  short *ptr;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      ptr = (i / 8) % 2 ? src2 : src1;
+      dst[i] = EVAL(short_to_uchar, AVX512F_LEN,) (ptr[i % 8 + (i / 16) * 8]);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char dst_ref[DST_SIZE];
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s1.a[i] = i + 10;
+      s2.a[i] = i + 15;
+    }
+
+  res1.x = INTRINSIC (_packus_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_packus_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_packus_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (dst_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, dst_ref))
+    abort ();
+
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e106f2bc82475bbc8b86250ec3772fa5f003e71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_add_epi8 (x512, x512);
+  x512 = _mm512_mask_add_epi8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_add_epi8 (m512, x512, x512);
+  x256 = _mm256_mask_add_epi8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_add_epi8 (m256, x256, x256);
+  x128 = _mm_mask_add_epi8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_add_epi8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..92ab041857b730383bd77737b29c795ae0b41a70
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s1[i] + s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_add_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_add_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_add_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a2352b6e762fbab0313e9a03342c9074a57ebbb5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_adds_epi8 (x512, x512);
+  x512 = _mm512_mask_adds_epi8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_adds_epi8 (m512, x512, x512);
+  x256 = _mm256_mask_adds_epi8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_adds_epi8 (m256, x256, x256);
+  x128 = _mm_mask_adds_epi8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_adds_epi8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..28759bb025466743ee45c3979b5e5ff3b984ca5e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsb-2.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] + (int)s2[i];
+      if (tmp > 0x7F) tmp = 0x7F;
+      if (tmp < (char)0x80) tmp = (char)0x80;
+      r[i] = (char)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_adds_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_adds_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_adds_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..187b0e978605b55860744fbca4d1837a94cb6502
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_adds_epi16 (x512, x512);
+  x512 = _mm512_mask_adds_epi16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_adds_epi16 (m512, x512, x512);
+  x256 = _mm256_mask_adds_epi16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_adds_epi16 (m256, x256, x256);
+  x128 = _mm_mask_adds_epi16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_adds_epi16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f6b118be4e00cc54da179d13344b2ec6a5522ea
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddsw-2.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] + (int)s2[i];
+      if (tmp > 0x7FFF) tmp = 0x7FFF;
+      if (tmp < (short)0x8000) tmp = (short)0x8000;
+      r[i] = (short)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_adds_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_adds_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_adds_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e1036cb019e3519a98e46e4d86d2d0db6c5c72f1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_adds_epu8 (x512, x512);
+  x512 = _mm512_mask_adds_epu8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_adds_epu8 (m512, x512, x512);
+  x256 = _mm256_mask_adds_epu8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_adds_epu8 (m256, x256, x256);
+  x128 = _mm_mask_adds_epu8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_adds_epu8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e67232f9486206cfd02a222cf11bb16f5ceee6f7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusb-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned char *r, unsigned char *s1, unsigned char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] + (int)s2[i];
+      if (tmp > 0xFF) tmp = 0xFF;
+      if (tmp < 0) tmp = 0;
+      r[i] = (unsigned char)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+      src2.a[i] = 3 + 11 * (i % 377) * i;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_adds_epu8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_adds_epu8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_adds_epu8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..95520c629b03e910baffb3c55152f10170aa2b45
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_adds_epu16 (x512, x512);
+  x512 = _mm512_mask_adds_epu16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_adds_epu16 (m512, x512, x512);
+  x256 = _mm256_mask_adds_epu16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_adds_epu16 (m256, x256, x256);
+  x128 = _mm_mask_adds_epu16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_adds_epu16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..138ee4098ce2d815213bd9340923348294363b98
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddusw-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *r, unsigned short *s1, unsigned short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] + (int)s2[i];
+      if (tmp > 0xFFFF) tmp = 0xFFFF;
+      if (tmp < 0) tmp = 0;
+      r[i] = (unsigned short)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+      src2.a[i] = 3 + 11 * (i % 377) * i;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_adds_epu16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_adds_epu16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_adds_epu16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..86029ea6094f8725c105ddee066b7a88d8263dff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_add_epi16 (x512, x512);
+  x512 = _mm512_mask_add_epi16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_add_epi16 (m512, x512, x512);
+  x256 = _mm256_mask_add_epi16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_add_epi16 (m256, x256, x256);
+  x128 = _mm_mask_add_epi16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_add_epi16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b383703d3aa9f4ef2e40d36364171461eced34b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpaddw-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s1[i] + s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_add_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_add_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_add_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c609365f89bb350d4556996c76e887085fb84a0f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpalignr\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_alignr_epi8 (z, z, 10);
+  z = _mm512_mask_alignr_epi8 (z, m1, z, z, 10);
+  z = _mm512_maskz_alignr_epi8 (m1, z, z, 10);
+  y = _mm256_mask_alignr_epi8 (y, m2, y, y, 10);
+  y = _mm256_maskz_alignr_epi8 (m2, y, y, 10);
+  x = _mm_mask_alignr_epi8 (x, m3, x, x, 10);
+  x = _mm_maskz_alignr_epi8 (m3, x, x, 10);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4de6e05db7985000edb322143a2fcb9bc2f75dd5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpalignr-2.c
@@ -0,0 +1,74 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <string.h>
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+#define N 0x3
+
+void
+CALC (char *src1, char *src2, char * dst)
+{
+  /* result for EVEX.U1.512 version consists from 4 result block, each of them
+   * has length of 128 bits. */
+  unsigned block_len = 16;
+  unsigned double_block_len = 32;
+  unsigned shift = 0;
+  char buf[double_block_len];
+  char *bout = dst;
+  int bits, i;
+
+  for (bits = 0; bits < AVX512F_LEN; bits += 128)
+    {
+      memcpy (&buf[0], src2 + shift, block_len);
+      memcpy (&buf[block_len], src1 + shift, block_len);
+
+      for (i = 0; i < block_len; i++)
+	/* shift counts larger than 32 produces zero result. */
+	if (N >= 32 || N + i >= 32)
+	  bout[i] = 0;
+	else
+	  bout[i] = buf[N + i];
+
+      shift += block_len;
+      bout += block_len;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_b) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i;
+      s2.a[i] = i * 2;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_alignr_epi8) (s1.x, s2.x, N);
+  res2.x = INTRINSIC (_mask_alignr_epi8) (res2.x, mask, s1.x, s2.x, N);
+  res3.x = INTRINSIC (_maskz_alignr_epi8) (mask, s1.x, s2.x, N);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..266a1bfa0129ff67aa2ec36b444ba2bb5b02d55a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x;
+volatile __m256i y;
+volatile __m512i z;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_avg_epu8 (z, z);
+  z = _mm512_mask_avg_epu8 (z, m1, z, z);
+  z = _mm512_maskz_avg_epu8 (m1, z, z);
+  y = _mm256_mask_avg_epu8 (y, m2, y, y);
+  y = _mm256_maskz_avg_epu8 (m2, y, y);
+  x = _mm_mask_avg_epu8 (x, m3, x, x);
+  x = _mm_maskz_avg_epu8 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2dabd71947892f7f9e9494f1b41eea361933dd71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgb-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *s1, char *s2, char *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((unsigned char) s1[i] +
+      (unsigned char) s2[i] + 1) >> 1;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_b) s1, s2, res1, res2 ,res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i + 15;
+      s2.a[i] = i + 14;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_avg_epu8) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_avg_epu8) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_avg_epu8) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b00784bbadbe7d5fe84754af641476aa9b1d734
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpavgw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x;
+volatile __m256i y;
+volatile __m512i z;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_avg_epu16 (z, z);
+  z = _mm512_mask_avg_epu16 (z, m1, z, z);
+  z = _mm512_maskz_avg_epu16 (m1, z, z);
+  y = _mm256_mask_avg_epu16 (y, m2, y, y);
+  y = _mm256_maskz_avg_epu16 (m2, y, y);
+  x = _mm_mask_avg_epu16 (x, m3, x, x);
+  x = _mm_maskz_avg_epu16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..51496865d6451cae2876319b18bc800163dc91f5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpavgw-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s1, short *s2, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((unsigned short) s1[i] +
+      (unsigned short) s2[i] + 1) >> 1;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2 ,res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i + 15;
+      s2.a[i] = i + 14;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_avg_epu16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_avg_epu16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_avg_epu16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d001c27c3882d1ec356938b20ded310b3cb84163
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vpblendmb|vmovdqu8)\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmb|vmovdqu8)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmb|vmovdqu8)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __m512i xxx;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_blend_epi8 (m, x, x);
+  xx = _mm_mask_blend_epi8 (m, xx, xx);
+  xxx = _mm512_mask_blend_epi8 (m, xxx, xxx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..107559bbc9e98f61da1a0136d323d4c273f852f5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmb-2.c
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2, MASK_TYPE mask)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (mask & (1LL << i)) ? s2[i] : s1[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 15 + 46 * i * sign;
+      src2.a[i] = -22 + i * sign;
+      sign = sign * -1;
+    }
+
+  res1.x = INTRINSIC (_mask_blend_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a, mask);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..65431cdea418d413d6c9bf8ec02415c303d71184
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vpblendmw|vmovdqu16)\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmw|vmovdqu16)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmw|vmovdqu16)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __m512i xxx;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_blend_epi16 (m, x, x);
+  xx = _mm_mask_blend_epi16 (m, xx, xx);
+  xxx = _mm512_mask_blend_epi16 (m, xxx, xxx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d4fb51c431d0146476ccbcb662e72b843ddc59e3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpblendmw-2.c
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2, MASK_TYPE mask)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (mask & (1 << i)) ? s2[i] : s1[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 15 + 3467 * i * sign;
+      src2.a[i] = -2217 * i * sign;
+      sign = sign * -1;
+    }
+
+  res1.x = INTRINSIC (_mask_blend_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a, mask);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1880105a7016958b3bd55398ffc004fc34adfa94
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-1.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile char w;
+volatile __mmask64 mx;
+volatile __mmask32 my;
+volatile __mmask16 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_broadcastb_epi8 (z);
+  x = _mm512_mask_broadcastb_epi8 (x, mx, z);
+  x = _mm512_maskz_broadcastb_epi8 (mx, z);
+  y = _mm256_mask_broadcastb_epi8 (y, my, z);
+  y = _mm256_maskz_broadcastb_epi8 (my, z);
+  z = _mm_mask_broadcastb_epi8 (z, mz, z);
+  z = _mm_maskz_broadcastb_epi8 (mz, z);
+
+  x = _mm512_set1_epi8 (w);
+  x = _mm512_mask_set1_epi8 (x, mx, w);
+  x = _mm512_maskz_set1_epi8 (mx, w);
+  y = _mm256_mask_set1_epi8 (y, my, w);
+  y = _mm256_maskz_set1_epi8 (my, w);
+  z = _mm_mask_set1_epi8 (z, mz, w);
+  z = _mm_maskz_set1_epi8 (mz, w);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..821b5dd849118e7507b441e613b532d8ff1a68c1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastb-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[0];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3;
+  UNION_TYPE (128, i_b) src;
+  MASK_TYPE mask = SIZE | 123;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 16; i++)
+    {
+      src.a[i] = 1 + 3 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  CALC (res_ref, src.a);
+
+  if (AVX512F_LEN == 512)
+    {
+      res1.x = INTRINSIC (_broadcastb_epi8) (src.x);
+      if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+	abort ();
+    }
+
+  res2.x = INTRINSIC (_mask_broadcastb_epi8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcastb_epi8) (mask, src.x);
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+
+  CALC (res_ref, src.a);
+
+  if (AVX512F_LEN == 512)
+    {
+      res1.x = INTRINSIC (_set1_epi8) (src.a[0]);
+      if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+	abort ();
+    }
+
+  res2.x = INTRINSIC (_mask_set1_epi8) (res2.x, mask, src.a[0]);
+  res3.x = INTRINSIC (_maskz_set1_epi8) (mask, src.a[0]);
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5255f4f07573242e3d40f6a9f2a898b3cab08b9f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-1.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile short w;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_broadcastw_epi16 (z);
+  x = _mm512_mask_broadcastw_epi16 (x, mx, z);
+  x = _mm512_maskz_broadcastw_epi16 (mx, z);
+  y = _mm256_mask_broadcastw_epi16 (y, my, z);
+  y = _mm256_maskz_broadcastw_epi16 (my, z);
+  z = _mm_mask_broadcastw_epi16 (z, mz, z);
+  z = _mm_maskz_broadcastw_epi16 (mz, z);
+
+  x = _mm512_set1_epi16 (w);
+  x = _mm512_mask_set1_epi16 (x, mx, w);
+  x = _mm512_maskz_set1_epi16 (mx, w);
+  y = _mm256_mask_set1_epi16 (y, my, w);
+  y = _mm256_maskz_set1_epi16 (my, w);
+  z = _mm_mask_set1_epi16 (z, mz, w);
+  z = _mm_maskz_set1_epi16 (mz, w);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e68aa145ad6bfac87d90c4f768b5515e8a092c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpbroadcastw-2.c
@@ -0,0 +1,77 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[0];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  UNION_TYPE (128, i_w) src;
+  MASK_TYPE mask = SIZE | 123;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 8; i++)
+    {
+      src.a[i] = 1 + 3 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  CALC (res_ref, src.a);
+
+  if (AVX512F_LEN == 512)
+    {
+      res1.x = INTRINSIC (_broadcastw_epi16) (src.x);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+	abort ();
+    }
+
+  res2.x = INTRINSIC (_mask_broadcastw_epi16) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcastw_epi16) (mask, src.x);
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+
+  CALC (res_ref, src.a);
+
+  if (AVX512F_LEN == 512)
+    {
+      res1.x = INTRINSIC (_set1_epi16) (src.a[0]);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+	abort ();
+    }
+
+  res2.x = INTRINSIC (_mask_set1_epi16) (res2.x, mask, src.a[0]);
+  res3.x = INTRINSIC (_maskz_set1_epi16) (mask, src.a[0]);
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a76a7cd5ea235275f30f4a9ea33dfa357438864
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m512i xq;
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask16 m;
+volatile __mmask32 mm;
+volatile __mmask64 mmm;
+
+void extern
+avx512bw_test (void)
+{
+  mmm = _mm512_cmp_epi8_mask (xq, xq, _MM_CMPINT_GE);
+  mmm = _mm512_mask_cmp_epi8_mask (m, xq, xq, _MM_CMPINT_NLE);
+  mm = _mm256_cmp_epi8_mask (x, x, _MM_CMPINT_GT);
+  mm = _mm256_mask_cmp_epi8_mask (m, x, x, _MM_CMPINT_EQ);
+  m = _mm_cmp_epi8_mask (xx, xx, _MM_CMPINT_LT);
+  m = _mm_mask_cmp_epi8_mask (m, xx, xx, _MM_CMPINT_LE);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8b0c541a9029cbddcfd138aea01da5f955ffc451
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpb-2.c
@@ -0,0 +1,107 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#if AVX512F_LEN == 512
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 64; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm512_loadu_si512 (s1);		\
+    source2.x = _mm512_loadu_si512 (s2);		\
+    dst1 = _mm512_cmp_epi8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm512_mask_cmp_epi8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 32; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);	\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);	\
+    dst1 = _mm256_cmp_epi8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epi8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 16; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epi8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epi8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+void
+TEST ()
+{
+    char s1[64] = {34, 78,  53, 64,
+		  1, 57, 11, 231,
+		  14, 45, 71, 75,
+		  55, 66, 21, 73,
+		  34, 68, 3, 56,
+		  1, 57, 111, 241,
+		  14,  15, 61, 75,
+		  55,  16, 52, 3,
+		  34, 78,  53, 64,
+		  1, 57, 11, 231,
+		  14, 45, 71, 75,
+		  45, 66, 21, 73,
+		  34, 68, 3, 56,
+		  1, 57, 111, 241,
+		  14,  15, 61, 75,
+		  55,  16, 52, 3};
+    char s2[64] = {4, 68, 86, 8,
+		  1, 46,  1, 1,
+		  45, 67, 36, 3,
+		  4, 39, 56, 56,
+		  124, 78, 53, 56,
+		  1, 46,  1, 12,
+		  45, 47, 36, 13,
+		  4, 35, 56, 67,
+		  4, 68, 86, 8,
+		  1, 46,  1, 1,
+		  45, 67, 36, 3,
+		  4, 39, 56, 56,
+		  124, 78, 53, 56,
+		  1, 46,  1, 12,
+		  45, 47, 36, 13,
+		  4, 35, 56, 67};
+    UNION_TYPE (AVX512F_LEN, i_b) source1, source2;
+    MASK_TYPE dst1, dst2, dst_ref;
+    MASK_TYPE mask = MASK_VALUE;
+    int i;
+
+    CMP(0x00, s1[i] == s2[i]);
+    CMP(0x01, s1[i] < s2[i]);
+    CMP(0x02, s1[i] <= s2[i]);
+    CMP(0x03, 0);
+    CMP(0x04, s1[i] != s2[i]);
+    CMP(0x05, s1[i] >= s2[i]);
+    CMP(0x06, s1[i] > s2[i]);
+    CMP(0x07, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..732a951a4b4432256c0a4bf93c9bd4c47a6e427b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\[\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+volatile __mmask64 m64;
+
+void extern
+avx512bw_test (void)
+{
+  m16 = _mm_cmpeq_epi8_mask (x128, x128);
+  m32 = _mm256_cmpeq_epi8_mask (x256, x256);
+  m64 = _mm512_cmpeq_epi8_mask (x512, x512);
+  m16 = _mm_mask_cmpeq_epi8_mask (3, x128, x128);
+  m32 = _mm256_mask_cmpeq_epi8_mask (3, x256, x256);
+  m64 = _mm512_mask_cmpeq_epi8_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e81f2bcfb33ed0e648570b43d6f79d896b4ce35
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqb-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, char *s1, char *s2)
+{
+  int i;
+  *r = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] == s2[i])
+      *r = *r | (one << i);
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+  res1 = 0;
+  res2 = 0;
+
+  for (i = 0; i < SIZE / 2; i++)
+    {
+      src1.a[i * 2] = i;
+      src1.a[i * 2 + 1] = i * i;
+      src2.a[i * 2] = 2 * i;
+      src2.a[i * 2 + 1] = i * i;
+    }
+
+  res1 = INTRINSIC (_cmpeq_epi8_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_cmpeq_epi8_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res_ref != res1)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res_ref != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b77203bfb3f955c8b607f909eb708294ef9be3b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+
+void extern
+avx512bw_test (void)
+{
+  m8 = _mm_cmpeq_epi16_mask (x128, x128);
+  m8 = _mm_mask_cmpeq_epi16_mask (3, x128, x128);
+  m16 = _mm256_cmpeq_epi16_mask (x256, x256);
+  m16 = _mm256_mask_cmpeq_epi16_mask (3, x256, x256);
+  m32 = _mm512_mask_cmpeq_epi16_mask (3, x512, x512);
+  m32 = _mm512_cmpeq_epi16_mask (x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ff608a0605e3ce28a8dc916e2300f51720fca72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpeqw-2.c
@@ -0,0 +1,50 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, short *s1, short *s2)
+{
+  int i;
+  *r = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] == s2[i])
+      *r = *r | (one << i);
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE / 2; i++)
+    {
+      src1.a[i * 2] = i;
+      src1.a[i * 2 + 1] = i * i;
+      src2.a[i * 2] = 2 * i;
+      src2.a[i * 2 + 1] = i * i;
+    }
+
+  res1 = INTRINSIC (_cmpeq_epi16_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_cmpeq_epi16_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res_ref != res1)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res_ref != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b54de5ec9d751a56470c3797d1ea546833c59cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+volatile __mmask64 m64;
+
+void extern
+avx512bw_test (void)
+{
+  m16 = _mm_cmpgt_epi8_mask (x128, x128);
+  m32 = _mm256_cmpgt_epi8_mask (x256, x256);
+  m64 = _mm512_cmpgt_epi8_mask (x512, x512);
+  m16 = _mm_mask_cmpgt_epi8_mask (3, x128, x128);
+  m32 = _mm256_mask_cmpgt_epi8_mask (3, x256, x256);
+  m64 = _mm512_mask_cmpgt_epi8_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f99c23885cd6042fcead0da94adab9e7555c71b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtb-2.c
@@ -0,0 +1,50 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, char *s1, char *s2)
+{
+  int i;
+  *r = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] > s2[i])
+      *r = *r | (one << i);
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE / 2; i++)
+    {
+      src1.a[i * 2] = i;
+      src1.a[i * 2 + 1] = i * i;
+      src2.a[i * 2] = 2 * i;
+      src2.a[i * 2 + 1] = i * i;
+    }
+
+  res1 = INTRINSIC (_cmpgt_epi8_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_cmpgt_epi8_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res_ref != res1)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res_ref != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f2671345fe9c317ca71b920858cf1fbf91e30e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+
+void extern
+avx512bw_test (void)
+{
+  m8 = _mm_cmpgt_epi16_mask (x128, x128);
+  m16 = _mm256_cmpgt_epi16_mask (x256, x256);
+  m32 = _mm512_cmpgt_epi16_mask (x512, x512);
+  m8 = _mm_mask_cmpgt_epi16_mask (3, x128, x128);
+  m16 = _mm256_mask_cmpgt_epi16_mask (3, x256, x256);
+  m32 = _mm512_mask_cmpgt_epi16_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b56fca8180a77d0a84a88b6efd2513c7a8f4650f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpgtw-2.c
@@ -0,0 +1,50 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, short *s1, short *s2)
+{
+  int i;
+  *r = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] > s2[i])
+      *r = *r | (one << i);
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE / 2; i++)
+    {
+      src1.a[i * 2] = i;
+      src1.a[i * 2 + 1] = i * i;
+      src2.a[i * 2] = 2 * i;
+      src2.a[i * 2 + 1] = i * i;
+    }
+
+  res1 = INTRINSIC (_cmpgt_epi16_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_cmpgt_epi16_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res_ref != res1)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res_ref != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..32117ac721e1acfaf8087ae595b9ee76989ed4c0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m512i xq;
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask16 m;
+volatile __mmask32 mm;
+volatile __mmask64 mmm;
+
+void extern
+avx512bw_test (void)
+{
+  mmm = _mm512_cmp_epu8_mask (xq, xq, _MM_CMPINT_EQ);
+  mmm = _mm512_mask_cmp_epu8_mask (m, xq, xq, _MM_CMPINT_LT);
+  mm = _mm256_cmp_epu8_mask (x, x, _MM_CMPINT_LE);
+  mm = _mm256_mask_cmp_epu8_mask (m, x, x, _MM_CMPINT_UNUSED);
+  m = _mm_cmp_epu8_mask (xx, xx, _MM_CMPINT_NE);
+  m = _mm_mask_cmp_epu8_mask (m, xx, xx, _MM_CMPINT_NLT);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..be288c9b3e6796950845879c79914f2c669ab334
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpub-2.c
@@ -0,0 +1,107 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#if AVX512F_LEN == 512
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 64; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm512_loadu_si512 (s1);		\
+    source2.x = _mm512_loadu_si512 (s2);		\
+    dst1 = _mm512_cmp_epu8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm512_mask_cmp_epu8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 32; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);	\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);	\
+    dst1 = _mm256_cmp_epu8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epu8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 16; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epu8_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epu8_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+void
+TEST ()
+{
+    unsigned char s1[64] = {34, 78,  53, 64,
+			    1, 57, 11, 231,
+			    14, 45, 71, 75,
+			    55, 66, 21, 73,
+			    34, 68, 3, 56,
+			    1, 57, 111, 241,
+			    14,  15, 61, 75,
+			    55,  16, 52, 3,
+			    34, 78,  53, 64,
+			    1, 57, 11, 231,
+			    14, 45, 71, 75,
+			    55, 66, 21, 73,
+			    34, 68, 3, 56,
+			    1, 57, 111, 241,
+			    14,  15, 61, 75,
+			    55,  16, 52, 3};
+    unsigned char s2[64] = {4, 68, 86, 8,
+			    1, 46,  1, 1,
+			    45, 67, 36, 3,
+			    4, 39, 56, 56,
+			    124, 78, 53, 56,
+			    1, 46,  1, 12,
+			    45, 47, 36, 13,
+			    4, 35, 56, 67,
+			    4, 68, 86, 8,
+			    1, 46,  1, 1,
+			    45, 67, 36, 3,
+			    4, 39, 56, 56,
+			    124, 78, 53, 56,
+			    1, 46,  1, 12,
+			    45, 47, 36, 13,
+			    4, 35, 56, 67};
+    UNION_TYPE (AVX512F_LEN, i_b) source1, source2;
+    MASK_TYPE dst1, dst2, dst_ref;
+    MASK_TYPE mask = MASK_VALUE;
+    int i;
+
+    CMP(0x00, s1[i] == s2[i]);
+    CMP(0x01, s1[i] < s2[i]);
+    CMP(0x02, s1[i] <= s2[i]);
+    CMP(0x03, 0);
+    CMP(0x04, s1[i] != s2[i]);
+    CMP(0x05, s1[i] >= s2[i]);
+    CMP(0x06, s1[i] > s2[i]);
+    CMP(0x07, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..916f01b0fabd659aa36389f2ecef18678fe0eddc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m512i xq;
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+volatile __mmask16 mm;
+volatile __mmask32 mmm;
+
+void extern
+avx512bw_test (void)
+{
+  mmm = _mm512_cmp_epu16_mask (xq, xq, _MM_CMPINT_NE);
+  mmm = _mm512_mask_cmp_epu16_mask (m, xq, xq, _MM_CMPINT_NLT);
+  mm = _mm256_cmp_epu16_mask (x, x, _MM_CMPINT_GE);
+  mm = _mm256_mask_cmp_epu16_mask (m, x, x, _MM_CMPINT_NLE);
+  m = _mm_cmp_epu16_mask (xx, xx, _MM_CMPINT_GT);
+  m = _mm_mask_cmp_epu16_mask (m, xx, xx, _MM_CMPINT_EQ);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..587030535aff7c1e24ca476af24d059186a5462e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpuw-2.c
@@ -0,0 +1,91 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#if AVX512F_LEN == 512
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 32; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm512_loadu_si512 (s1);		\
+    source2.x = _mm512_loadu_si512 (s2);		\
+    dst1 = _mm512_cmp_epu16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm512_mask_cmp_epu16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 16; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);	\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);	\
+    dst1 = _mm256_cmp_epu16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epu16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 8; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epu16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epu16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+void
+TEST ()
+{
+    unsigned short s1[32] = {2134,  6678,  453, 54646,
+			    231, 5674,  111, 23241,
+			    12314,  145,  671, 7575,
+			    23455,  166, 5321, 5673,
+			    2134,  6678,  453, 54646,
+			    231, 5674,  111, 23241,
+			    12314,  145,  671, 7575,
+			    23455,  166, 5321, 5673};
+    unsigned short s2[32] = {41124, 6678, 8653,   856,
+			    231, 4646,  111,   124,
+			    2745, 4567, 3676,   123,
+			    714, 3589, 5683,  5673,
+			    41124, 6678, 8653,   856,
+			    231, 4646,  111,   124,
+			    2745, 4567, 3676,   123,
+			    714, 3589, 5683,  5673};
+    UNION_TYPE (AVX512F_LEN, i_w) source1, source2;
+    MASK_TYPE dst1, dst2, dst_ref;
+    MASK_TYPE mask = MASK_VALUE;
+    int i;
+
+    CMP(0x00, s1[i] == s2[i]);
+    CMP(0x01, s1[i] < s2[i]);
+    CMP(0x02, s1[i] <= s2[i]);
+    CMP(0x03, 0);
+    CMP(0x04, s1[i] != s2[i]);
+    CMP(0x05, s1[i] >= s2[i]);
+    CMP(0x06, s1[i] > s2[i]);
+    CMP(0x07, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a506dc12e0a13d10495e52dd4026aee1b1cf43f1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m512i xq;
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+volatile __mmask16 mm;
+volatile __mmask32 mmm;
+
+void extern
+avx512bw_test (void)
+{
+  mmm = _mm512_cmp_epi16_mask (xq, xq, _MM_CMPINT_GT);
+  mmm = _mm512_mask_cmp_epi16_mask (m, xq, xq, _MM_CMPINT_EQ);
+  mm = _mm256_cmp_epi16_mask (x, x, _MM_CMPINT_EQ);
+  mm = _mm256_mask_cmp_epi16_mask (m, x, x, _MM_CMPINT_LT);
+  m = _mm_cmp_epi16_mask (xx, xx, _MM_CMPINT_LE);
+  m = _mm_mask_cmp_epi16_mask (m, xx, xx, _MM_CMPINT_UNUSED);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..54c3588238bd49ec1e1625de68fa59556ab5e1e9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpcmpw-2.c
@@ -0,0 +1,91 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#if AVX512F_LEN == 512
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 32; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm512_loadu_si512 (s1);		\
+    source2.x = _mm512_loadu_si512 (s2);		\
+    dst1 = _mm512_cmp_epi16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm512_mask_cmp_epi16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 16; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);	\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);	\
+    dst1 = _mm256_cmp_epi16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epi16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 8; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epi16_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epi16_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+void
+TEST ()
+{
+    short s1[32] = {2134,  6678,  453, 54646,
+		   231, 5674,  111, 23241,
+		   12314,  145,  671, 7575,
+		   23455,  166, 5321, 5673,
+		   2134,  6678,  453, 54646,
+		   231, 5674,  111, 23241,
+		   12314,  145,  671, 7575,
+		   23455,  166, 5321, 5673};
+    short s2[32] = {41124, 6678, 8653,   856,
+		   231, 4646,  111,   124,
+		   2745, 4567, 3676,   123,
+		   714, 3589, 5683,  5673,
+		   41124, 6678, 8653,   856,
+		   231, 4646,  111,   124,
+		   2745, 4567, 3676,   123,
+		   714, 3589, 5683,  5673};
+    UNION_TYPE (AVX512F_LEN, i_w) source1, source2;
+    MASK_TYPE dst1, dst2, dst_ref;
+    MASK_TYPE mask = MASK_VALUE;
+    int i;
+
+    CMP(0x00, s1[i] == s2[i]);
+    CMP(0x01, s1[i] < s2[i]);
+    CMP(0x02, s1[i] <= s2[i]);
+    CMP(0x03, 0);
+    CMP(0x04, s1[i] != s2[i]);
+    CMP(0x05, s1[i] >= s2[i]);
+    CMP(0x06, s1[i] > s2[i]);
+    CMP(0x07, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..275fef47c2a310412ecad1f78a017202c1097bb1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermi2w\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2w\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2w\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x3;
+volatile __m256i x2;
+volatile __m128i x1;
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m3;
+volatile __mmask16 m2;
+volatile __mmask8 m1;
+
+void extern
+avx512bw_test (void)
+{
+  x3 = _mm512_mask2_permutex2var_epi16 (x3, z, m3, x3);
+  x2 = _mm256_mask2_permutex2var_epi16 (x2, y, m2, x2);
+  x1 = _mm_mask2_permutex2var_epi16 (x1, x, m1, x1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..52d7ac274fcf4ddcf12378c54fd4371469b494b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-2.c
@@ -0,0 +1,58 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "math.h"
+#include "values.h"
+#include "avx512f-mask-type.h"
+
+#define NUM 32
+
+void
+CALC (short *dst, short *src1, short *ind, short *src2)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      unsigned long long offset = ind[i] & (SIZE - 1);
+      unsigned long long cond = ind[i] & SIZE;
+
+      dst[i] = cond ? src2[offset] : src1[offset];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, j;
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res, ind;
+  short res_ref[SIZE];
+
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < NUM; i++)
+    {
+      for (j = 0; j < SIZE; j++)
+	{
+	  ind.a[j] = DEFAULT_VALUE;
+	  s1.a[j] = i * 2 * j + 1;
+	  s2.a[j] = i * 2 * j;
+
+	  res.a[j] = DEFAULT_VALUE;
+	}
+
+      CALC (res_ref, s1.a, ind.a, s2.a);
+
+      res.x =
+	INTRINSIC (_mask2_permutex2var_epi16) (s1.x, ind.x, mask,
+					       s2.x);
+
+      MASK_MERGE (i_w) (res_ref, mask, SIZE);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res, res_ref))
+	abort ();
+    }
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1596695251cd357367b460b47034fd0a6fafb7ec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-1.c
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } *
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2w\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x3;
+volatile __m256i x2;
+volatile __m128i x1;
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m3;
+volatile __mmask16 m2;
+volatile __mmask8 m1;
+
+void extern
+avx512bw_test (void)
+{
+  x3 = _mm512_permutex2var_epi16 (x3, z, x3);
+  x3 = _mm512_mask_permutex2var_epi16 (x3, m3, z, x3);
+  x3 = _mm512_maskz_permutex2var_epi16 (m3, x3, z, x3);
+  x2 = _mm256_permutex2var_epi16 (x2, y, x2);
+  x2 = _mm256_mask_permutex2var_epi16 (x2, m2, y, x2);
+  x2 = _mm256_maskz_permutex2var_epi16 (m2, x2, y, x2);
+  x1 = _mm_permutex2var_epi16 (x1, x, x1);
+  x1 = _mm_mask_permutex2var_epi16 (x1, m1, x, x1);
+  x1 = _mm_maskz_permutex2var_epi16 (m1, x1, x, x1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..58d75f4b8ec9a9e55610fcdff2d82dd2cfe72565
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-2.c
@@ -0,0 +1,70 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "math.h"
+#include "values.h"
+#include "avx512f-mask-type.h"
+
+#define NUM 32
+
+void
+CALC (short *dst, short *src1, short *ind, short *src2)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      unsigned long long offset = ind[i] & (SIZE - 1);
+      unsigned long long cond = ind[i] & SIZE;
+
+      dst[i] = cond ? src2[offset] : src1[offset];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, j;
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3, ind;
+  short res_ref[SIZE];
+
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < NUM; i++)
+    {
+      for (j = 0; j < SIZE; j++)
+	{
+	  ind.a[j] = i * (j << 1);
+	  s1.a[j] = DEFAULT_VALUE;
+	  s2.a[j] = 1.5 * i * 2 * j;
+
+	  res1.a[j] = DEFAULT_VALUE;
+	  res2.a[j] = DEFAULT_VALUE;
+	  res3.a[j] = DEFAULT_VALUE;
+	}
+
+      CALC (res_ref, s1.a, ind.a, s2.a);
+
+      res1.x = INTRINSIC (_permutex2var_epi16) (s1.x, ind.x, s2.x);
+      res2.x =
+	INTRINSIC (_mask_permutex2var_epi16) (s1.x, mask, ind.x, s2.x);
+      res3.x =
+	INTRINSIC (_maskz_permutex2var_epi16) (mask, s1.x, ind.x,
+					       s2.x);
+
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+	abort ();
+
+      MASK_MERGE (i_w) (res_ref, mask, SIZE);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+	abort ();
+
+      MASK_ZERO (i_w) (res_ref, mask, SIZE);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+	abort ();
+    }
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d8f356ddc83cc165adc704539b5233235e6dea1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i x3;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  x1 = _mm512_permutexvar_epi16 (x1, x1);
+  x1 = _mm512_maskz_permutexvar_epi16 (m1, x1, x1);
+  x1 = _mm512_mask_permutexvar_epi16 (x1, m1, x1, x1);
+  x2 = _mm256_permutexvar_epi16 (x2, x2);
+  x2 = _mm256_maskz_permutexvar_epi16 (m2, x2, x2);
+  x2 = _mm256_mask_permutexvar_epi16 (x2, m2, x2, x2);
+  x3 = _mm_permutexvar_epi16 (x3, x3);
+  x3 = _mm_maskz_permutexvar_epi16 (m3, x3, x3);
+  x3 = _mm_mask_permutexvar_epi16 (x3, m3, x3, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1746534fa4ae9e05464277de3200fd01ebce94e9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *ind, short *src, short *res)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      res[i] = src[ind[i] & (SIZE - 1)];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3;
+  short res_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * i * i;
+      s2.a[i] = i + 20;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_permutexvar_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_permutexvar_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_permutexvar_epi16) (mask, s1.x, s2.x);
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w)(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w)(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f4f41b58df7a6b26888dc8675e8baa40674b3835
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddubsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i xq;
+volatile __m128i xw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_maddubs_epi16 (x, x);
+  x = _mm512_mask_maddubs_epi16 (x, 2, x, x);
+  x = _mm512_maskz_maddubs_epi16 (2, x, x);
+  xq = _mm256_mask_maddubs_epi16 (xq, 2, xq, xq);
+  xq = _mm256_maskz_maddubs_epi16 (2, xq, xq);
+  xw = _mm_mask_maddubs_epi16 (xw, 2, xw, xw);
+  xw = _mm_maskz_maddubs_epi16 (2, xw, xw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e3bd83fee8ae8ea21c666db933c33d630da39b7e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddubsw-2.c
@@ -0,0 +1,66 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#include <values.h>
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *i1, short *i2, short *r)
+{
+  unsigned char *ub1 = (unsigned char *) i1;
+  char *sb2 = (char *) i2;
+  short *sout = (short *) r;
+  int t0;
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      t0 = ((int) ub1[2 * i] * (int) sb2[2 * i] +
+	    (int) ub1[2 * i + 1] * (int) sb2[2 * i + 1]);
+      if (t0 > (int) 0x7fff)
+	sout[i] = 0x7fff;
+      else if (t0 < (int) 0xffff8000)
+	sout[i] = 0x8000;
+      else
+	sout[i] = (short) t0;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3;
+  short res_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i;
+  int fail = 0;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * 17 + i;
+      s2.a[i] = i * -17 + i * 2;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_maddubs_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_maddubs_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_maddubs_epi16) (mask, s1.x, s2.x);
+
+  CALC(s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..42e20a6799c69e5f4e1801d514f956efdc5abdef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaddwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i xq;
+volatile __m128i xw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_madd_epi16 (x, x);
+  x = _mm512_mask_madd_epi16 (x, 2, x, x);
+  x = _mm512_maskz_madd_epi16 (2, x, x);
+  xq = _mm256_mask_madd_epi16 (xq, 2, xq, xq);
+  xq = _mm256_maskz_madd_epi16 (2, xq, xq);
+  xw = _mm_mask_madd_epi16 (xw, 2, xw, xw);
+  xw = _mm_maskz_madd_epi16 (2, xw, xw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fb6ef8e1b94309257378503e0edab03ea3f46bef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaddwd-2.c
@@ -0,0 +1,58 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#include <values.h>
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *i1, short *i2, int *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((int) i1[2 * i] * (int) i2[2 * i] +
+	    (int) i1[2 * i + 1] * (int) i2[2 * i + 1]);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2;
+  UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3;
+  int res_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i;
+
+  for (i = 0; i < SIZE * 2; i++)
+    {
+      s1.a[i] = i * 17 + i;
+      s2.a[i] = i * -17 + i * 2;
+    }
+
+  for (i = 0; i < SIZE; i++)
+    {
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_madd_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_madd_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_madd_epi16) (mask, s1.x, s2.x);
+
+  CALC(s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ad8d9095a8d187fd87646520e127a62d98eb6397
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_max_epi8 (x, x);
+  x = _mm512_mask_max_epi8 (x, mx, x, x);
+  x = _mm512_maskz_max_epi8 (mx, x, x);
+  y = _mm256_mask_max_epi8 (y, my, y, y);
+  y = _mm256_maskz_max_epi8 (my, y, y);
+  z = _mm_mask_max_epi8 (z, mz, z, z);
+  z = _mm_maskz_max_epi8 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9d81e41a6422259087055862e473da7fe1c836ad
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsb-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *src1, char *src2, char *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] > src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] =  i * sign;
+      src2.a[i] = (i + 20) * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_max_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_max_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_max_epi8) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..237b9b8b287370f850231590798240b622359113
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_max_epi16 (x, x);
+  x = _mm512_mask_max_epi16 (x, mx, x, x);
+  x = _mm512_maskz_max_epi16 (mx, x, x);
+  y = _mm256_mask_max_epi16 (y, my, y, y);
+  y = _mm256_maskz_max_epi16 (my, y, y);
+  z = _mm_mask_max_epi16 (z, mz, z, z);
+  z = _mm_maskz_max_epi16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..608fbf40fbcdadde3dec13d47272004ad080a9c7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxsw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] > src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] =  i * sign;
+      src2.a[i] = (i + 20) * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_max_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_max_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_max_epi16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..87728891557c9a4623af9bbbba6884cbcdd33ced
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_max_epu8 (x, x);
+  x = _mm512_mask_max_epu8 (x, mx, x, x);
+  x = _mm512_maskz_max_epu8 (mx, x, x);
+  y = _mm256_mask_max_epu8 (y, my, y, y);
+  y = _mm256_maskz_max_epu8 (my, y, y);
+  z = _mm_mask_max_epu8 (z, mz, z, z);
+  z = _mm_maskz_max_epu8 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bcfa472f7332502b144aa275ef655d92ec47b17b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxub-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned char *src1, unsigned char *src2,
+      unsigned char *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] > src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i;
+      src2.a[i] = i + 20;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_max_epu8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_max_epu8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_max_epu8) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a0dc29f2293c25f990c843f54d18432acd5677de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_max_epu16 (x, x);
+  x = _mm512_mask_max_epu16 (x, mx, x, x);
+  x = _mm512_maskz_max_epu16 (mx, x, x);
+  y = _mm256_mask_max_epu16 (y, my, y, y);
+  y = _mm256_maskz_max_epu16 (my, y, y);
+  z = _mm_mask_max_epu16 (z, mz, z, z);
+  z = _mm_maskz_max_epu16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9f80f8764c13f88872f19a2291866e4c6476ddd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmaxuw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *src1, unsigned short *src2,
+      unsigned short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] > src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i;
+      src2.a[i] = i + 20;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_max_epu16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_max_epu16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_max_epu16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..091607373b6b2d1b23fb43feb30330cc76c17f1d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_min_epi8 (x, x);
+  x = _mm512_mask_min_epi8 (x, mx, x, x);
+  x = _mm512_maskz_min_epi8 (mx, x, x);
+  y = _mm256_mask_min_epi8 (y, my, y, y);
+  y = _mm256_maskz_min_epi8 (my, y, y);
+  z = _mm_mask_min_epi8 (z, mz, z, z);
+  z = _mm_maskz_min_epi8 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7f5532e139c19cae06ec812ab8e353a13591a902
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsb-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *src1, char *src2, char *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] < src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] =  i * sign;
+      src2.a[i] = (i + 20) * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_min_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_min_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_min_epi8) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e712752078134290bc25d0600042dbb0937a016f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_min_epi16 (x, x);
+  x = _mm512_mask_min_epi16 (x, mx, x, x);
+  x = _mm512_maskz_min_epi16 (mx, x, x);
+  y = _mm256_mask_min_epi16 (y, my, y, y);
+  y = _mm256_maskz_min_epi16 (my, y, y);
+  z = _mm_mask_min_epi16 (z, mz, z, z);
+  z = _mm_maskz_min_epi16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d7e6896097b28a031fe74ed5855aec92b900e9e8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminsw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] < src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] =  i * sign;
+      src2.a[i] = (i + 20) * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_min_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_min_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_min_epi16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e36e344558aecd4f2e5cc9938dfb92682822ecc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminub\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_min_epu8 (x, x);
+  x = _mm512_mask_min_epu8 (x, mx, x, x);
+  x = _mm512_maskz_min_epu8 (mx, x, x);
+  y = _mm256_mask_min_epu8 (y, my, y, y);
+  y = _mm256_maskz_min_epu8 (my, y, y);
+  z = _mm_mask_min_epu8 (z, mz, z, z);
+  z = _mm_maskz_min_epu8 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..57e1ed5cf6e73b5a2892652388a02dc81e185244
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminub-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned char *src1, unsigned char *src2,
+      unsigned char *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] < src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i;
+      src2.a[i] = i + 20;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_min_epu8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_min_epu8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_min_epu8) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ca15b38abb89e0ec614860b6e927fb011352041
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask32 mx;
+volatile __mmask16 my;
+volatile __mmask8 mz;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_min_epu16 (x, x);
+  x = _mm512_mask_min_epu16 (x, mx, x, x);
+  x = _mm512_maskz_min_epu16 (mx, x, x);
+  y = _mm256_mask_min_epu16 (y, my, y, y);
+  y = _mm256_maskz_min_epu16 (my, y, y);
+  z = _mm_mask_min_epu16 (z, mz, z, z);
+  z = _mm_maskz_min_epu16 (mz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a3834b36ec1112ed49385f9b040a6d5f7898b7d9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpminuw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *src1, unsigned short *src2,
+      unsigned short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] < src2[i] ? src1[i] : src2[i];
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i;
+      src2.a[i] = i + 20;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_min_epu16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_min_epu16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_min_epu16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..48284783bef5a41300b41aab4f1481ec157ca9ac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovb2m\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovb2m\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovb2m\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m64;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+
+void extern
+avx512bw_test (void)
+{
+  m16 = _mm_movepi8_mask (x128);
+  m32 = _mm256_movepi8_mask (x256);
+  m64 = _mm512_movepi8_mask (x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0e6db4d7c5b0ffdcc3cb86ecb9c738e07274f354
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovb2m-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, char *s1)
+{
+  int i;
+  MASK_TYPE res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] >> 7)
+      res = res | (one << i);
+
+  *r = res;
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) src;
+  MASK_TYPE res, res_ref = 0;
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 2 * i * sign;
+      sign = sign * -1;
+    }
+
+  res = INTRINSIC (_movepi8_mask) (src.x);
+
+  CALC (&res_ref, src.a);
+
+  if (res_ref != res)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a832479dc4f7d43cded09510ae06530db422cf0e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovm2b\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%xmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2b\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%ymm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2b\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%zmm\[0-9\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m64;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+
+void extern
+avx512bw_test (void)
+{
+  x128 = _mm_movm_epi8 (m16);
+  x256 = _mm256_movm_epi8 (m32);
+  x512 = _mm512_movm_epi8 (m64);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..17a6dc6238b6d99eccde5fa15b7efa58bc060c51
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2b-2.c
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, MASK_TYPE s)
+{
+  int i;
+  char all_ones = 0xff;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((s >> i) & 1) ? all_ones : 0;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) res, res_ref;
+  MASK_TYPE src = (MASK_TYPE) 0x1111abeffeec1234;
+
+  res.x = INTRINSIC (_movm_epi8) (src);
+
+  CALC (res_ref.a, src);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res, res_ref.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d356d5e89a42d840e76035330dda041fd0de282f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovm2w\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%xmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2w\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%ymm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2w\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%zmm\[0-9\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512bw_test (void)
+{
+  x128 = _mm_movm_epi16 (m8);
+  x256 = _mm256_movm_epi16 (m16);
+  x512 = _mm512_movm_epi16 (m32);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..073bdc92c012fd55c3d6facbfb38df4de44772b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovm2w-2.c
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, MASK_TYPE s)
+{
+  int i;
+  short all_ones = 0xffff;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((s >> i) & 1) ? all_ones : 0;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) res, res_ref;
+  MASK_TYPE src = (MASK_TYPE) 0x1111abc2;
+
+  res.x = INTRINSIC (_movm_epi16) (src);
+
+  CALC (res_ref.a, src);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res, res_ref.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ea02205b0698d255b1a9a3aed00f89ebd10bbdc2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __m512i u;
+volatile __mmask8 m1;
+volatile __mmask16 m2;
+volatile __mmask32 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm_cvtsepi16_epi8 (x);
+  z = _mm_mask_cvtsepi16_epi8 (z, m1, x);
+  z = _mm_maskz_cvtsepi16_epi8 (m1, x);
+  z = _mm256_cvtsepi16_epi8 (y);
+  z = _mm256_mask_cvtsepi16_epi8 (z, m2, y);
+  z = _mm256_maskz_cvtsepi16_epi8 (m2, y);
+  y = _mm512_cvtsepi16_epi8 (u);
+  y = _mm512_mask_cvtsepi16_epi8 (y, m3, u);
+  y = _mm512_maskz_cvtsepi16_epi8 (m3, u);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..46cf03ce6a25a5a88698dc1a3bcf15d2c9a49b50
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovswb-2.c
@@ -0,0 +1,61 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#define SIZE_HALF (AVX512F_LEN_HALF / 8)
+#include "avx512f-mask-type.h"
+#include <limits.h>
+
+void
+CALC (char *r, short *s)
+{
+  int i;
+  for (i = 0; i < SIZE_HALF; i++)
+    {
+      if (s[i] < CHAR_MIN)
+	r[i] = CHAR_MIN;
+      else if (s[i] > CHAR_MAX)
+	r[i] = CHAR_MAX;
+      else
+	r[i] = s[i];
+      r[i] = (i < SIZE) ? r[i] : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN_HALF, i_b) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN, i_w) src;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[32];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 1 + 34 * i * sign;
+      sign = sign * -1;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtsepi16_epi8) (src.x);
+  res2.x = INTRINSIC (_mask_cvtsepi16_epi8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvtsepi16_epi8) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..78be054595eac7ef56fd56911f33c33f81fb9b64
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i res1;
+volatile __m256i s1, res2;
+volatile __m128i s2, res3;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512bw_test (void)
+{
+  res1 = _mm512_cvtepi8_epi16 (s1);
+
+  res1 = _mm512_mask_cvtepi8_epi16 (res1, m32, s1);
+  res2 = _mm256_mask_cvtepi8_epi16 (res2, m16, s2);
+  res3 = _mm_mask_cvtepi8_epi16 (res3, m8, s2);
+
+  res1 = _mm512_maskz_cvtepi8_epi16 (m32, s1);
+  res2 = _mm256_maskz_cvtepi8_epi16 (m16, s2);
+  res3 = _mm_maskz_cvtepi8_epi16 (m8, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4cc440530689baa2dc8586c1c04e9b25724d00f4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-2.c
@@ -0,0 +1,56 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SRC_SIZE (AVX512F_LEN_HALF / 8)
+#define DST_SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *s, short *r)
+{
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      r[i] = (short) s[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN_HALF, i_b) s;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[DST_SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s.a[i] = 8 * i * sign;
+      sign = -sign;
+    }
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_cvtepi8_epi16) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepi8_epi16) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepi8_epi16) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..03fd07bea63e078b1cac0a74ab0caa45c591c472
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovuswb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __m512i u;
+volatile __mmask8 m1;
+volatile __mmask16 m2;
+volatile __mmask32 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm_cvtusepi16_epi8 (x);
+  z = _mm_mask_cvtusepi16_epi8 (z, m1, x);
+  z = _mm_maskz_cvtusepi16_epi8 (m1, x);
+  z = _mm256_cvtusepi16_epi8 (y);
+  z = _mm256_mask_cvtusepi16_epi8 (z, m2, y);
+  z = _mm256_maskz_cvtusepi16_epi8 (m2, y);
+  y = _mm512_cvtusepi16_epi8 (u);
+  y = _mm512_mask_cvtusepi16_epi8 (y, m3, u);
+  y = _mm512_maskz_cvtusepi16_epi8 (m3, u);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc82398b662120a0d82603c93e659ef79ad6a9ff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#define SIZE_HALF (AVX512F_LEN_HALF / 8)
+#include "avx512f-mask-type.h"
+#include <limits.h>
+
+void
+CALC (unsigned char *r, unsigned short *s)
+{
+  int i;
+  for (i = 0; i < SIZE_HALF; i++)
+      r[i] = (i < SIZE) ? ((s[i] > UCHAR_MAX) ? UCHAR_MAX : s[i]) : 0;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN_HALF, i_b) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN, i_w) src;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char res_ref[32];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 1 + 34 * i;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtusepi16_epi8) (src.x);
+  res2.x = INTRINSIC (_mask_cvtusepi16_epi8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvtusepi16_epi8) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..31a64ffc0d9b64ac128eeb87fc22be8330fbc8fb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovw2m\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovw2m\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovw2m\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+
+void extern
+avx512bw_test (void)
+{
+  m8 = _mm_movepi16_mask (x128);
+  m16 = _mm256_movepi16_mask (x256);
+  m32 = _mm512_movepi16_mask (x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..916d481350da8d568c9969922f2ee5542d04e0dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, short *s1)
+{
+  int i;
+  MASK_TYPE res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] >> 15)
+      res = res | (one << i);
+
+  *r = res;
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) src;
+  MASK_TYPE res, res_ref = 0;
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 2 * i * sign;
+      sign = sign * -1;
+    }
+
+  res = INTRINSIC (_movepi16_mask) (src.x);
+
+  CALC (&res_ref, src.a);
+
+  if (res_ref != res)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..115a54747f4194f89c8f3aa198fda7f9d09d779d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovwb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __m512i u;
+volatile __mmask8 m1;
+volatile __mmask16 m2;
+volatile __mmask32 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm_cvtepi16_epi8 (x);
+  z = _mm_mask_cvtepi16_epi8 (z, m1, x);
+  z = _mm_maskz_cvtepi16_epi8 (m1, x);
+  z = _mm256_cvtepi16_epi8 (y);
+  z = _mm256_mask_cvtepi16_epi8 (z, m2, y);
+  z = _mm256_maskz_cvtepi16_epi8 (m2, y);
+  y = _mm512_cvtepi16_epi8 (u);
+  y = _mm512_mask_cvtepi16_epi8 (y, m3, u);
+  y = _mm512_maskz_cvtepi16_epi8 (m3, u);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..16dff18ce50609a693461ae33ed51755eb9aa38b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#define SIZE_HALF (AVX512F_LEN_HALF / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, short *s)
+{
+  int i;
+  for (i = 0; i < SIZE_HALF; i++)
+    {
+      r[i] = (i < SIZE) ? (char) s[i] : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN_HALF, i_b) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN, i_w) src;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[32];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 1 + 34 * i * sign;
+      sign = sign * -1;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtepi16_epi8) (src.x);
+  res2.x = INTRINSIC (_mask_cvtepi16_epi8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvtepi16_epi8) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..691b9b70e2cd88ae5ac8abff12ed9a8856b7ba97
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i res1;
+volatile __m256i s1, res2;
+volatile __m128i s2, res3;
+volatile __mmask32 m32;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512bw_test (void)
+{
+  res1 = _mm512_cvtepu8_epi16 (s1);
+
+  res1 = _mm512_mask_cvtepu8_epi16 (res1, m32, s1);
+  res2 = _mm256_mask_cvtepu8_epi16 (res2, m16, s2);
+  res3 = _mm_mask_cvtepu8_epi16 (res3, m8, s2);
+
+  res1 = _mm512_maskz_cvtepu8_epi16 (m32, s1);
+  res2 = _mm256_maskz_cvtepu8_epi16 (m16, s2);
+  res3 = _mm_maskz_cvtepu8_epi16 (m8, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7048147e743f83be4b99e0516c4c4ae21cef1c70
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SRC_SIZE (AVX512F_LEN_HALF / 8)
+#define DST_SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned char *s, short *r)
+{
+  int i;
+
+  for (i = 0; i < DST_SIZE; i++)
+    {
+      r[i] = s[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN_HALF, i_b) s;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[DST_SIZE];
+  int i;
+
+  for (i = 0; i < SRC_SIZE; i++)
+    {
+      s.a[i] = 16 * i;
+    }
+
+  for (i = 0; i < DST_SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_cvtepu8_epi16) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepu8_epi16) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepu8_epi16) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, DST_SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..066da24dfae9f33545b2281fd8ee33d67d9dac28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhrsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x, y, z;
+volatile __m256i xq, yq, zq;
+volatile __m128i xw, yw, zw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_mulhrs_epi16 (y, z);
+  x = _mm512_mask_mulhrs_epi16 (x, 2, y, z);
+  x = _mm512_maskz_mulhrs_epi16 (2, y, z);
+  xq = _mm256_mask_mulhrs_epi16 (xq, 2, yq, zq);
+  xq = _mm256_maskz_mulhrs_epi16 (2, yq, zq);
+  xw = _mm_mask_mulhrs_epi16 (xw, 2, yw, zw);
+  xw = _mm_maskz_mulhrs_epi16 (2, yw, zw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ae2f36f73bc09a8952ca69bbc84c24b1d504209
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i, t0;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      t0 = (((int) src1[i] * (int) src2[i]) >> 14) + 1;
+      dst[i] = (short) (t0 >> 1);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, dst1, dst2, dst3;
+  short dst_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = -1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i % 2;
+      src2.a[i] = i * sign;
+      dst2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  dst1.x = INTRINSIC (_mulhrs_epi16) (src1.x, src2.x);
+  dst2.x =
+    INTRINSIC (_mask_mulhrs_epi16) (dst2.x, mask, src1.x, src2.x);
+  dst3.x = INTRINSIC (_maskz_mulhrs_epi16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ffda9365494855d253e3221963d97ca744184d7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhuw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x, y, z;
+volatile __m256i xq, yq, zq;
+volatile __m128i xw, yw, zw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_mulhi_epu16 (y, z);
+  x = _mm512_mask_mulhi_epu16 (x, 2, y, z);
+  x = _mm512_maskz_mulhi_epu16 (2, y, z);
+  xq = _mm256_mask_mulhi_epu16 (xq, 2, yq, zq);
+  xq = _mm256_maskz_mulhi_epu16 (2, yq, zq);
+  xw = _mm_mask_mulhi_epu16 (xw, 2, yw, zw);
+  xw = _mm_maskz_mulhi_epu16 (2, yw, zw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..512940a2765502a245f0056820f36316f5000b15
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = (src1[i] * src2[i]) >> 16;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, dst1, dst2, dst3;
+  short dst_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = -1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i % 2;
+      src2.a[i] = i * sign;
+      dst2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  dst1.x = INTRINSIC (_mulhi_epu16) (src1.x, src2.x);
+  dst2.x =
+    INTRINSIC (_mask_mulhi_epu16) (dst2.x, mask, src1.x, src2.x);
+  dst3.x = INTRINSIC (_maskz_mulhi_epu16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..70c2f561bdab06259a9ba0610f135b7a943bab9b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x, y, z;
+volatile __m256i xq, yq, zq;
+volatile __m128i xw, yw, zw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_mulhi_epi16 (y, z);
+  x = _mm512_mask_mulhi_epi16 (x, 2, y, z);
+  x = _mm512_maskz_mulhi_epi16 (2, y, z);
+  xq = _mm256_mask_mulhi_epi16 (xq, 2, yq, zq);
+  xq = _mm256_maskz_mulhi_epi16 (2, yq, zq);
+  xw = _mm_mask_mulhi_epi16 (xw, 2, yw, zw);
+  xw = _mm_maskz_mulhi_epi16 (2, yw, zw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d87932d304e7417e4b92370175c459fe974c641e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = (src1[i] * src2[i]) >> 16;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, dst1, dst2, dst3;
+  short dst_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = -1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i % 2;
+      src2.a[i] = i * sign;
+      dst2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  dst1.x = INTRINSIC (_mulhi_epi16) (src1.x, src2.x);
+  dst2.x =
+    INTRINSIC (_mask_mulhi_epi16) (dst2.x, mask, src1.x, src2.x);
+  dst3.x = INTRINSIC (_maskz_mulhi_epi16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d27e88a936c09e827269b86ec52ce30dca5b192
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x, y, z;
+volatile __m256i xq, yq, zq;
+volatile __m128i xw, yw, zw;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_mullo_epi16 (y, z);
+  x = _mm512_mask_mullo_epi16 (x, 3, y, z);
+  x = _mm512_maskz_mullo_epi16 (3, y, z);
+  xq = _mm256_mask_mullo_epi16 (xq, 3, yq, zq);
+  xq = _mm256_maskz_mullo_epi16 (3, yq, zq);
+  xw = _mm_mask_mullo_epi16 (xw, 3, yw, zw);
+  xw = _mm_maskz_mullo_epi16 (3, yw, zw);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..603882330b9c6f4123a8d810133824e28353edb0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *src1, short *src2, short *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = (short) ((int) src1[i] * (int) src2[i]);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2, dst1, dst2, dst3;
+  short dst_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * sign;
+      src2.a[i] = i + 20 * sign;
+      sign = -sign;
+      dst2.a[i] = DEFAULT_VALUE;
+    }
+
+  dst1.x = INTRINSIC (_mullo_epi16) (src1.x, src2.x);
+  dst2.x = INTRINSIC (_mask_mullo_epi16) (dst2.x, mask, src1.x, src2.x);
+  dst3.x = INTRINSIC (_maskz_mullo_epi16) (mask, src1.x, src2.x);
+
+  CALC (src1.a, src2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (dst3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..200ec8957f55614449b8a8e050f7a44cf30564ac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_shuffle_epi8 (z, z);
+  z = _mm512_mask_shuffle_epi8 (z, m1, z, z);
+  z = _mm512_maskz_shuffle_epi8 (m1, z, z);
+  y = _mm256_mask_shuffle_epi8 (y, m2, y, y);
+  y = _mm256_maskz_shuffle_epi8 (m2, y, y);
+  x = _mm_mask_shuffle_epi8 (x, m3, x, x);
+  x = _mm_maskz_shuffle_epi8 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6b43dcfb744b31fa1d65001342e053b9da5f6b75
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufb-2.c
@@ -0,0 +1,58 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *s1, char *s2, char *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      if (s2[i] < 0)
+	r[i] = 0;
+      else
+	r[i] = s1[(s2[i] & 0xf) + 16 * (i / 16)];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_b) s1, s2, res1, res2, res3;
+  char res_ref[SIZE];
+  int i, sign = 1;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * i * sign;
+      s2.a[i] = 179 - i;
+      res1.a[i] = DEFAULT_VALUE;
+      res2.a[i] = DEFAULT_VALUE;
+      res3.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_shuffle_epi8) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_shuffle_epi8) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_shuffle_epi8) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..66de86451dd86e6a1ce81723930a6e855bfa8ce3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufhw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_shufflehi_epi16 (z, _MM_PERM_AADB);
+  z = _mm512_mask_shufflehi_epi16 (z, m1, z, _MM_PERM_AADB);
+  z = _mm512_maskz_shufflehi_epi16 (m1, z, _MM_PERM_AADB);
+  y = _mm256_mask_shufflehi_epi16 (y, m2, y, _MM_PERM_AADB);
+  y = _mm256_maskz_shufflehi_epi16 (m2, y, _MM_PERM_AADB);
+  x = _mm_mask_shufflehi_epi16 (x, m3, x, _MM_PERM_AADB);
+  x = _mm_maskz_shufflehi_epi16 (m3, x, _MM_PERM_AADB);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4043217ba7bb733c529a0d5ae10a898c7f839970
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshufhw-2.c
@@ -0,0 +1,62 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s, unsigned char imm, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE / 8; i++)
+    {
+      r[8 * i] = s[8 * i];
+      r[8 * i + 1] = s[8 * i + 1];
+      r[8 * i + 2] = s[8 * i + 2];
+      r[8 * i + 3] = s[8 * i + 3];
+      r[8 * i + 4] = s[8 * i + (imm >> 0 & 3) + 4];
+      r[8 * i + 5] = s[8 * i + (imm >> 2 & 3) + 4];
+      r[8 * i + 6] = s[8 * i + (imm >> 4 & 3) + 4];
+      r[8 * i + 7] = s[8 * i + (imm >> 6 & 3) + 4];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, res1, res2, res3;
+  short res_ref[SIZE];
+  int i, sign = 1;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * i * sign;
+      res1.a[i] = DEFAULT_VALUE;
+      res2.a[i] = DEFAULT_VALUE;
+      res3.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_shufflehi_epi16) (s1.x, 0xec);
+  res2.x =
+    INTRINSIC (_mask_shufflehi_epi16) (res2.x, mask, s1.x, 0xec);
+  res3.x = INTRINSIC (_maskz_shufflehi_epi16) (mask, s1.x, 0xec);
+
+  CALC (s1.a, 0xec, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b18f99c0c068608a05fe61e5fa303abd92d562e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshuflw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_shufflelo_epi16 (z, _MM_PERM_AADB);
+  z = _mm512_mask_shufflelo_epi16 (z, m1, z, _MM_PERM_AADB);
+  z = _mm512_maskz_shufflelo_epi16 (m1, z, _MM_PERM_AADB);
+  y = _mm256_mask_shufflelo_epi16 (y, m2, y, _MM_PERM_AADB);
+  y = _mm256_maskz_shufflelo_epi16 (m2, y, _MM_PERM_AADB);
+  x = _mm_mask_shufflelo_epi16 (x, m3, x, _MM_PERM_AADB);
+  x = _mm_maskz_shufflelo_epi16 (m3, x, _MM_PERM_AADB);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..72dda61c3c204dca0651313db46466c986a31caf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpshuflw-2.c
@@ -0,0 +1,62 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s, unsigned char imm, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE / 8; i++)
+    {
+      r[8 * i] = s[8 * i + (imm >> 0 & 3)];
+      r[8 * i + 1] = s[8 * i + (imm >> 2 & 3)];
+      r[8 * i + 2] = s[8 * i + (imm >> 4 & 3)];
+      r[8 * i + 3] = s[8 * i + (imm >> 6 & 3)];
+      r[8 * i + 4] = s[8 * i + 4];
+      r[8 * i + 5] = s[8 * i + 5];
+      r[8 * i + 6] = s[8 * i + 6];
+      r[8 * i + 7] = s[8 * i + 7];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, res1, res2, res3;
+  short res_ref[SIZE];
+  int i, sign = 1;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * i * sign;
+      res1.a[i] = DEFAULT_VALUE;
+      res2.a[i] = DEFAULT_VALUE;
+      res3.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_shufflelo_epi16) (s1.x, 0xec);
+  res2.x =
+    INTRINSIC (_mask_shufflelo_epi16) (res2.x, mask, s1.x, 0xec);
+  res3.x = INTRINSIC (_maskz_shufflelo_epi16) (mask, s1.x, 0xec);
+
+  CALC (s1.a, 0xec, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpslldq-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpslldq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4964c1df8955c8ebac9000213ac1ebf4ac1f3d35
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpslldq-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpslldq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+extern volatile __m512i x;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_bslli_epi128 (x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bdf0da64e5000a55a68ffaf00446df4923051d15
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_sllv_epi16 (z, z);
+  z = _mm512_mask_sllv_epi16 (z, m1, z, z);
+  z = _mm512_maskz_sllv_epi16 (m1, z, z);
+  y = _mm256_sllv_epi16 (y, y);
+  y = _mm256_mask_sllv_epi16 (y, m2, y, y);
+  y = _mm256_maskz_sllv_epi16 (m2, y, y);
+  x = _mm_sllv_epi16 (x, x);
+  x = _mm_mask_sllv_epi16 (x, m3, x, x);
+  x = _mm_maskz_sllv_epi16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e8a5f20b657f7591b7beba01c896cbd96a6ef0e1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllvw-2.c
@@ -0,0 +1,53 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s1, short *s2, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; ++i)
+    {
+      r[i] = ((unsigned short) s1[i]) << s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * sign;
+      s2.a[i] = i >> 2;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_sllv_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_sllv_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_sllv_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..42457fb0107d18eb67fe39e4047c9f89bf2fa6da
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 7 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m512i x;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __m128i y;
+volatile __mmask32 m;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_sll_epi16 (x, y);
+  x = _mm512_mask_sll_epi16 (x, m, x, y);
+  x = _mm512_maskz_sll_epi16 (m, x, y);
+  x256 = _mm256_mask_sll_epi16 (x256, m256, x256, y);
+  x256 = _mm256_maskz_sll_epi16 (m256, x256, y);
+  x128 = _mm_mask_sll_epi16 (x128, m128, x128, y);
+  x128 = _mm_maskz_sll_epi16 (m128, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3eb629b988fa129b9477596089f4526b59cbc9b9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllw-2.c
@@ -0,0 +1,65 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, long long *s2)
+{
+  int i;
+  long long count = s2[0];
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = count < 16 ? (s1[i] << count) : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1;
+  UNION_TYPE (128, i_q) src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  long long imm;
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      sign = sign * -1;
+    }
+  for (i = 0; i < 2; i++)
+    {
+      src2.a[i] = 0;
+    }
+
+  for (imm = 1; imm <= 17; imm++)
+    {
+      src2.a[0] = imm;
+      for (i = 0; i < SIZE; i++)
+	res2.a[i] = DEFAULT_VALUE;
+
+      res1.x = INTRINSIC (_sll_epi16) (src1.x, src2.x);
+      res2.x = INTRINSIC (_mask_sll_epi16) (res2.x, mask, src1.x, src2.x);
+      res3.x = INTRINSIC (_maskz_sll_epi16) (mask, src1.x, src2.x);
+
+      CALC (res_ref, src1.a, src2.a);
+
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+	abort ();
+
+      MASK_MERGE (i_w) (res_ref, mask, SIZE);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+	abort ();
+
+      MASK_ZERO (i_w) (res_ref, mask, SIZE);
+      if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+	abort ();
+    }
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..83d4c04710edef2999399c0ad4f5dcbc67ba9832
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m512i x;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+#define y 7
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_slli_epi16 (x, y);
+  x = _mm512_mask_slli_epi16 (x, m, x, y);
+  x = _mm512_maskz_slli_epi16 (m, x, y);
+  x256 = _mm256_mask_slli_epi16 (x256, m256, x256, y);
+  x256 = _mm256_maskz_slli_epi16 (m256, x256, y);
+  x128 = _mm_mask_slli_epi16 (x128, m128, x128, y);
+  x128 = _mm_maskz_slli_epi16 (m128, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..87d55f79d92d7ac3d1e6cbc33f7029330ee78e67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsllwi-2.c
@@ -0,0 +1,75 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short count)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = count < 16 ? (s1[i] << count) : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      sign = sign * -1;
+    }
+
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_slli_epi16) (src1.x, 5);
+  res2.x = INTRINSIC (_mask_slli_epi16) (res2.x, mask, src1.x, 5);
+  res3.x = INTRINSIC (_maskz_slli_epi16) (mask, src1.x, 5);
+
+  CALC (res_ref, src1.a, 5);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+
+
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_slli_epi16) (src1.x, 17);
+  res2.x = INTRINSIC (_mask_slli_epi16) (res2.x, mask, src1.x, 17);
+  res3.x = INTRINSIC (_maskz_slli_epi16) (mask, src1.x, 17);
+
+  CALC (res_ref, src1.a, 17);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..70db2fda45387c656583c0b397f855348f4e8488
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_srav_epi16 (z, z);
+  z = _mm512_mask_srav_epi16 (z, m1, z, z);
+  z = _mm512_maskz_srav_epi16 (m1, z, z);
+  y = _mm256_srav_epi16 (y, y);
+  y = _mm256_mask_srav_epi16 (y, m2, y, y);
+  y = _mm256_maskz_srav_epi16 (m2, y, y);
+  x = _mm_srav_epi16 (x, x);
+  x = _mm_mask_srav_epi16 (x, m3, x, x);
+  x = _mm_maskz_srav_epi16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..225d732a7b4acafab40eb71836fc32ffe0a57e1f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsravw-2.c
@@ -0,0 +1,53 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s1, short *s2, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; ++i)
+    {
+      r[i] = s2[i] < 16 ? (s1[i] >> s2[i]) : (s1[i] > 0 ? 0 : 0xFFFF);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * sign;
+      s2.a[i] = i >> 2;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_srav_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_srav_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_srav_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..667825bd7eb248e5af7647c03a25bd21f5b8f735
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_sra_epi16 (z, x);
+  z = _mm512_mask_sra_epi16 (z, m1, z, x);
+  z = _mm512_maskz_sra_epi16 (m1, z, x);
+  y = _mm256_mask_sra_epi16 (y, m2, y, x);
+  y = _mm256_maskz_sra_epi16 (m2, y, x);
+  x  = _mm_mask_sra_epi16 (x, m3, x, x);
+  x  = _mm_maskz_sra_epi16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f1649c23542c8a880ca1d07e2365ce84fcb9f593
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsraw-2.c
@@ -0,0 +1,61 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#include <string.h>
+
+#define N 0x5
+
+void
+CALC (short *s1, long long int *s2, short *r)
+{
+  int i;
+  long long int count = s2[0];
+
+  memset (r, 0, SIZE);
+
+  if (count < 16)
+    for (i = 0; i < SIZE; ++i)
+      r[i] = s1[i] >> count;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  union128i_q s2;
+  short res_ref[SIZE];
+  int i, sign;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  s2.a[0] = N;
+
+  res1.x = INTRINSIC (_sra_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_sra_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_sra_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebb9fa9f4a7730573f9d1ca95333d3887291d527
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraw\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_srai_epi16 (z, 13);
+  z = _mm512_mask_srai_epi16 (z, m1, z, 13);
+  z = _mm512_maskz_srai_epi16 (m1, z, 13);
+  y = _mm256_mask_srai_epi16 (y, m2, y, 13);
+  y = _mm256_maskz_srai_epi16 (m2, y, 13);
+  x = _mm_mask_srai_epi16 (x, m3, x, 13);
+  x = _mm_maskz_srai_epi16 (m3, x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b72b806a4828104796e04685bea4fd0e4cab869d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrawi-2.c
@@ -0,0 +1,58 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+#include <string.h>
+
+#define N 0x5
+
+void
+CALC (short *s1, short *r)
+{
+  int i;
+
+  memset (r, 0, SIZE);
+
+  if (N < 16)
+    for (i = 0; i < SIZE; ++i)
+      r[i] = s1[i] >> N;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  union128i_q s2;
+  short res_ref[SIZE];
+  int i, sign;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * sign;
+      sign = -sign;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_srai_epi16) (s1.x, N);
+  res2.x = INTRINSIC (_mask_srai_epi16) (res2.x, mask, s1.x, N);
+  res3.x = INTRINSIC (_maskz_srai_epi16) (mask, s1.x, N);
+
+  CALC (s1.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrldq-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrldq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9424f5106970d347e1273154249e4c5e30df371
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrldq-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpsrldq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+extern volatile __m512i x;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm512_bsrli_epi128 (x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a94b7cfa30eb4337d7bec4eff7b39737d3ecad72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_srlv_epi16 (z, z);
+  z = _mm512_mask_srlv_epi16 (z, m1, z, z);
+  z = _mm512_maskz_srlv_epi16 (m1, z, z);
+  y = _mm256_srlv_epi16 (y, y);
+  y = _mm256_mask_srlv_epi16 (y, m2, y, y);
+  y = _mm256_maskz_srlv_epi16 (m2, y, y);
+  x = _mm_srlv_epi16 (x, x);
+  x = _mm_mask_srlv_epi16 (x, m3, x, x);
+  x = _mm_maskz_srlv_epi16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..eb98685770b854ac2bb45efaa8fd2676ad2fa366
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlvw-2.c
@@ -0,0 +1,53 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *s1, short *s2, short *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; ++i)
+    {
+      r[i] = ((unsigned short) s1[i]) >> s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_w) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = i * sign;
+      s2.a[i] = i >> 2;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_srlv_epi16) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_srlv_epi16) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_srlv_epi16) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..584f30346d7d0d3a805c863f8fe9f8de2148838b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_srl_epi16 (z, x);
+  z = _mm512_mask_srl_epi16 (z, m1, z, x);
+  z = _mm512_maskz_srl_epi16 (m1, z, x);
+  y = _mm256_mask_srl_epi16 (y, m2, y, x);
+  y = _mm256_maskz_srl_epi16 (m2, y, x);
+  x = _mm_mask_srl_epi16 (x, m3, x, x);
+  x = _mm_maskz_srl_epi16 (m3, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..611a8a84b83864b131fc553d5b3683942e13febc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlw-2.c
@@ -0,0 +1,82 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *r, unsigned short *s1, unsigned short *s2)
+{
+  int i;
+  unsigned short count = s2[0];
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = count < 16 ? (s1[i] >> count) : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1;
+  UNION_TYPE (128, i_w) src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+    }
+
+  for (i = 0; i < 128 / 16; i++)
+    {
+      src2.a[i] = 0;
+    }
+
+  src2.a[0] = 1;
+  src2.a[1] = 0;
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_srl_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_srl_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_srl_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+
+  src2.a[0] = 17;
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_srl_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_srl_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_srl_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0ca04050e4b25cf96b48611e65df00ab4aede37e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlw\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  z = _mm512_srli_epi16 (z, 13);
+  z = _mm512_mask_srli_epi16 (z, m1, z, 13);
+  z = _mm512_maskz_srli_epi16 (m1, z, 13);
+  y = _mm256_mask_srli_epi16 (y, m2, y, 13);
+  y = _mm256_maskz_srli_epi16 (m2, y, 13);
+  x = _mm_mask_srli_epi16 (x, m3, x, 13);
+  x = _mm_maskz_srli_epi16 (m3, x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1dfe6448af84f245e599c323b8b34576492218f8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsrlwi-2.c
@@ -0,0 +1,72 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *r, unsigned short *s1, unsigned short count)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = count < 16 ? (s1[i] >> count) : 0;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+    }
+
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_srli_epi16) (src1.x, 5);
+  res2.x = INTRINSIC (_mask_srli_epi16) (res2.x, mask, src1.x, 5);
+  res3.x = INTRINSIC (_maskz_srli_epi16) (mask, src1.x, 5);
+
+  CALC (res_ref, src1.a, 5);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_srli_epi16) (src1.x, 17);
+  res2.x = INTRINSIC (_mask_srli_epi16) (res2.x, mask, src1.x, 17);
+  res3.x = INTRINSIC (_maskz_srli_epi16) (mask, src1.x, 17);
+
+  CALC (res_ref, src1.a, 17);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ce3113845a9ce405c428a7f8a10d9fce5d92136
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_sub_epi8 (x512, x512);
+  x512 = _mm512_mask_sub_epi8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_sub_epi8 (m512, x512, x512);
+  x256 = _mm256_mask_sub_epi8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_sub_epi8 (m256, x256, x256);
+  x128 = _mm_mask_sub_epi8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_sub_epi8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a4cc8040ee1e55359457beb1396922609d30296
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubb-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s1[i] - s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_sub_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_sub_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_sub_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf27ca0dc43e32013bf048b3efec4f66e48d339d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_subs_epi8 (x512, x512);
+  x512 = _mm512_mask_subs_epi8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_subs_epi8 (m512, x512, x512);
+  x256 = _mm256_mask_subs_epi8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_subs_epi8 (m256, x256, x256);
+  x128 = _mm_mask_subs_epi8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_subs_epi8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b602b388c3d5d7bb20114f6ec2a78ddb9f029560
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsb-2.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] - (int)s2[i];
+      if (tmp > 0x7F) tmp = 0x7F;
+      if (tmp < (char)0x80) tmp = (char)0x80;
+      r[i] = (char)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_subs_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_subs_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_subs_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..583fc7915943cd21179ad8dbe74a0d44791b8307
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubsw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_subs_epi16 (x512, x512);
+  x512 = _mm512_mask_subs_epi16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_subs_epi16 (m512, x512, x512);
+  x256 = _mm256_mask_subs_epi16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_subs_epi16 (m256, x256, x256);
+  x128 = _mm_mask_subs_epi16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_subs_epi16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4e519be376af2c90abbdbf5f159e73c470a94ea
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubsw-2.c
@@ -0,0 +1,57 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] - (int)s2[i];
+      if (tmp > 0x7FFF) tmp = 0x7FFF;
+      if (tmp < (short)0x8000) tmp = (short)0x8000;
+      r[i] = (short)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_subs_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_subs_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_subs_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0012e92de1dfb46a057afc57bcafcc814fef0e63
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask64 m512;
+volatile __mmask32 m256;
+volatile __mmask16 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_subs_epu8 (x512, x512);
+  x512 = _mm512_mask_subs_epu8 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_subs_epu8 (m512, x512, x512);
+  x256 = _mm256_mask_subs_epu8 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_subs_epu8 (m256, x256, x256);
+  x128 = _mm_mask_subs_epu8 (x128, m128, x128, x128);
+  x128 = _mm_maskz_subs_epu8 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8b5e5557f4a2e57a767a2378a1b2c577fd6aab1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusb-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned char *r, unsigned char *s1, unsigned char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] - (int)s2[i];
+      if (tmp > 0xFF) tmp = 0xFF;
+      if (tmp < 0) tmp = 0;
+      r[i] = (unsigned char)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned char res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+      src2.a[i] = 3 + 11 * (i % 377) * i;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_subs_epu8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_subs_epu8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_subs_epu8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5f448d69096087703c8d61af868f73ed725957a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubusw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_subs_epu16 (x512, x512);
+  x512 = _mm512_mask_subs_epu16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_subs_epu16 (m512, x512, x512);
+  x256 = _mm256_mask_subs_epu16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_subs_epu16 (m256, x256, x256);
+  x128 = _mm_mask_subs_epu16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_subs_epu16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..deb30cd181d976b0ad672b1b583f0f5004becb84
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubusw-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned short *r, unsigned short *s1, unsigned short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (int)s1[i] - (int)s2[i];
+      if (tmp > 0xFFFF) tmp = 0xFFFF;
+      if (tmp < 0) tmp = 0;
+      r[i] = (unsigned short)tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned short res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + 7 * i % 291;
+      src2.a[i] = 3 + 11 * (i % 377) * i;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_subs_epu16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_subs_epu16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_subs_epu16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..68127e7d23e30077bb9b4d9059bc1b5a4a6bb017
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask32 m512;
+volatile __mmask16 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512bw_test (void)
+{
+  x512 = _mm512_sub_epi16 (x512, x512);
+  x512 = _mm512_mask_sub_epi16 (x512, m512, x512, x512);
+  x512 = _mm512_maskz_sub_epi16 (m512, x512, x512);
+  x256 = _mm256_mask_sub_epi16 (x256, m256, x256, x256);
+  x256 = _mm256_maskz_sub_epi16 (m256, x256, x256);
+  x128 = _mm_mask_sub_epi16 (x128, m128, x128, x128);
+  x128 = _mm_maskz_sub_epi16 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9febeaa92f39f310d5447eec89d588706844aa6e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpsubw-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s1[i] - s2[i];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 2 + sign * 7 * i % 291;
+      src2.a[i] = 3 + sign * 11 * (i % 377) * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_sub_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_sub_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_sub_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..62137d05bdeffb5b6e5f09499588163f181166f1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmb\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __m512i x512;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+volatile __mmask64 m64;
+
+void extern
+avx512bw_test (void)
+{
+  m16 = _mm_test_epi8_mask (x128, x128);
+  m32 = _mm256_test_epi8_mask (x256, x256);
+  m64 = _mm512_test_epi8_mask (x512, x512);
+  m16 = _mm_mask_test_epi8_mask (3, x128, x128);
+  m32 = _mm256_mask_test_epi8_mask (3, x256, x256);
+  m64 = _mm512_mask_test_epi8_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..106a8daab1d251f1cc192fc1dec34daf83a7d620
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmb-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *res, char *src1, char *src2)
+{
+  int i;
+  *res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (src1[i] & src2[i])
+      *res = *res | one << i;
+}
+
+void
+TEST (void)
+{
+  int i, sign = 1;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i * sign;
+      src2.a[i] = i + 20;
+      sign = -sign;
+    }
+
+  res1 = INTRINSIC (_test_epi8_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_test_epi8_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res1 != res_ref)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res2 != res_ref)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8194a11b1b1876941fb1b68b057244e452cdc340
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmw\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __m512i x512;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+
+void extern
+avx512bw_test (void)
+{
+  m8 = _mm_test_epi16_mask (x128, x128);
+  m16 = _mm256_test_epi16_mask (x256, x256);
+  m32 = _mm512_test_epi16_mask (x512, x512);
+  m8 = _mm_mask_test_epi16_mask (3, x128, x128);
+  m16 = _mm256_mask_test_epi16_mask (3, x256, x256);
+  m32 = _mm512_mask_test_epi16_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..82a5dd93e1b46e025b47afbd8390c6a42a895236
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestmw-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *res, short *src1, short *src2)
+{
+  int i;
+  *res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (src1[i] & src2[i])
+      *res = *res | one << i;
+}
+
+void
+TEST (void)
+{
+  int i, sign = 1;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i * sign;
+      src2.a[i] = i + 20;
+      sign = -sign;
+    }
+
+  res1 = INTRINSIC (_test_epi16_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_test_epi16_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res1 != res_ref)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res2 != res_ref)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb126fbd2ffe20c7d4e2f419b9c704dcefbf49f5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmb\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __m512i x512;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+volatile __mmask64 m64;
+
+void extern
+avx512bw_test (void)
+{
+  m16 = _mm_testn_epi8_mask (x128, x128);
+  m32 = _mm256_testn_epi8_mask (x256, x256);
+  m64 = _mm512_testn_epi8_mask (x512, x512);
+  m16 = _mm_mask_testn_epi8_mask (3, x128, x128);
+  m32 = _mm256_mask_testn_epi8_mask (3, x256, x256);
+  m64 = _mm512_mask_testn_epi8_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9ca442cfb66b907d4fef3365133811c16c4288b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmb-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *res, char *src1, char *src2)
+{
+  int i;
+  *res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (!(src1[i] & src2[i]))
+      *res = *res | one << i;
+}
+
+void
+TEST (void)
+{
+  int i, sign = 1;
+  UNION_TYPE (AVX512F_LEN, i_b) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i * sign;
+      src2.a[i] = i + 20;
+      sign = -sign;
+    }
+
+  res1 = INTRINSIC (_testn_epi8_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_testn_epi8_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res1 != res_ref)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res2 != res_ref)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..82944b56e1ad5c4cff5740b668636032b2d7acb8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmw\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __m512i x512;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+volatile __mmask32 m32;
+
+void extern
+avx512bw_test (void)
+{
+  m8 = _mm_testn_epi16_mask (x128, x128);
+  m16 = _mm256_testn_epi16_mask (x256, x256);
+  m32 = _mm512_testn_epi16_mask (x512, x512);
+  m8 = _mm_mask_testn_epi16_mask (3, x128, x128);
+  m16 = _mm256_mask_testn_epi16_mask (3, x256, x256);
+  m32 = _mm512_mask_testn_epi16_mask (3, x512, x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0e2b4adf1cdb8cc491ca37704579ce3ab8615fa9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vptestnmw-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *res, short *src1, short *src2)
+{
+  int i;
+  *res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (!(src1[i] & src2[i]))
+      *res = *res | one << i;
+}
+
+void
+TEST (void)
+{
+  int i, sign = 1;
+  UNION_TYPE (AVX512F_LEN, i_w) src1, src2;
+  MASK_TYPE res_ref, res1, res2;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i * i * sign;
+      src2.a[i] = i + 20;
+      sign = -sign;
+    }
+
+  res1 = INTRINSIC (_testn_epi16_mask) (src1.x, src2.x);
+  res2 = INTRINSIC (_mask_testn_epi16_mask) (mask, src1.x, src2.x);
+
+  CALC (&res_ref, src1.a, src2.a);
+
+  if (res1 != res_ref)
+    abort ();
+
+  res_ref &= mask;
+
+  if (res2 != res_ref)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8beb7cc9c1e4570ffccdf3915bda4a58dc8e0a7f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i d, e, f;
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  d = _mm512_unpackhi_epi8 (e, f);
+  d = _mm512_mask_unpackhi_epi8 (d, m1, e, f);
+  d = _mm512_maskz_unpackhi_epi8 (m1, e, f);
+  x = _mm256_mask_unpackhi_epi8 (x, m2, y, z);
+  x = _mm256_maskz_unpackhi_epi8 (m2, y, z);
+  a = _mm_mask_unpackhi_epi8 (a, m3, b, c);
+  a = _mm_maskz_unpackhi_epi8 (m3, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..21fcee8143679dee0660f5fecb9966f9e5e4ad42
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhbw-2.c
@@ -0,0 +1,69 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE/16; i++)
+    {
+      r[16 * i] = s1[16 * i + 8];
+      r[16 * i + 1] = s2[16 * i + 8];
+      r[16 * i + 2] = s1[16 * i + 9];
+      r[16 * i + 3] = s2[16 * i + 9];
+      r[16 * i + 4] = s1[16 * i + 10];
+      r[16 * i + 5] = s2[16 * i + 10];
+      r[16 * i + 6] = s1[16 * i + 11];
+      r[16 * i + 7] = s2[16 * i + 11];
+      r[16 * i + 8] = s1[16 * i + 12];
+      r[16 * i + 9] = s2[16 * i + 12];
+      r[16 * i + 10] = s1[16 * i + 13];
+      r[16 * i + 11] = s2[16 * i + 13];
+      r[16 * i + 12] = s1[16 * i + 14];
+      r[16 * i + 13] = s2[16 * i + 14];
+      r[16 * i + 14] = s1[16 * i + 15];
+      r[16 * i + 15] = s2[16 * i + 15];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 34 * i * sign;
+      src1.a[i] = 179 * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_unpackhi_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_unpackhi_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_unpackhi_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..069cf7fef1c6837de7b3db9a0041a97deeba841e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i d, e, f;
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  d = _mm512_unpackhi_epi16 (e, f);
+  d = _mm512_mask_unpackhi_epi16 (d, m1, e, f);
+  d = _mm512_maskz_unpackhi_epi16 (m1, e, f);
+  x = _mm256_mask_unpackhi_epi16 (x, m2, y, z);
+  x = _mm256_maskz_unpackhi_epi16 (m2, y, z);
+  a = _mm_mask_unpackhi_epi16 (a, m3, b, c);
+  a = _mm_maskz_unpackhi_epi16 (m3, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..13ea5b92e2946e91098a0703930548768b3088a9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpckhwd-2.c
@@ -0,0 +1,61 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE/8; i++)
+    {
+      r[8 * i] = s1[8 * i + 4];
+      r[8 * i + 1] = s2[8 * i + 4];
+      r[8 * i + 2] = s1[8 * i + 5];
+      r[8 * i + 3] = s2[8 * i + 5];
+      r[8 * i + 4] = s1[8 * i + 6];
+      r[8 * i + 5] = s2[8 * i + 6];
+      r[8 * i + 6] = s1[8 * i + 7];
+      r[8 * i + 7] = s2[8 * i + 7];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 34 * i * sign;
+      src1.a[i] = 179 * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_unpackhi_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_unpackhi_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_unpackhi_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..34ed46d4cc5f56a56dcf5a2cd411acae5b1b388a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklbw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i d, e, f;
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask64 m1;
+volatile __mmask32 m2;
+volatile __mmask16 m3;
+
+void extern
+avx512bw_test (void)
+{
+  d = _mm512_unpacklo_epi8 (e, f);
+  d = _mm512_mask_unpacklo_epi8 (d, m1, e, f);
+  d = _mm512_maskz_unpacklo_epi8 (m1, e, f);
+  x = _mm256_mask_unpacklo_epi8 (x, m2, y, z);
+  x = _mm256_maskz_unpacklo_epi8 (m2, y, z);
+  a = _mm_mask_unpacklo_epi8 (a, m3, b, c);
+  a = _mm_maskz_unpacklo_epi8 (m3, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce155a8aba640131f001c319cb96779d276289ad
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklbw-2.c
@@ -0,0 +1,69 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 8)
+#include "avx512f-mask-type.h"
+
+void
+CALC (char *r, char *s1, char *s2)
+{
+  int i;
+  for (i = 0; i < SIZE/16; i++)
+    {
+      r[16 * i] = s1[16 * i];
+      r[16 * i + 1] = s2[16 * i];
+      r[16 * i + 2] = s1[16 * i + 1];
+      r[16 * i + 3] = s2[16 * i + 1];
+      r[16 * i + 4] = s1[16 * i + 2];
+      r[16 * i + 5] = s2[16 * i + 2];
+      r[16 * i + 6] = s1[16 * i + 3];
+      r[16 * i + 7] = s2[16 * i + 3];
+      r[16 * i + 8] = s1[16 * i + 4];
+      r[16 * i + 9] = s2[16 * i + 4];
+      r[16 * i + 10] = s1[16 * i + 5];
+      r[16 * i + 11] = s2[16 * i + 5];
+      r[16 * i + 12] = s1[16 * i + 6];
+      r[16 * i + 13] = s2[16 * i + 6];
+      r[16 * i + 14] = s1[16 * i + 7];
+      r[16 * i + 15] = s2[16 * i + 7];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  char res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 34 * i * sign;
+      src1.a[i] = 179 * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_unpacklo_epi8) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_unpacklo_epi8) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_unpacklo_epi8) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_b) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..799631137364c0c2a2e5c327d19e0fa4ef7d683e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i d, e, f;
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask32 m1;
+volatile __mmask16 m2;
+volatile __mmask8 m3;
+
+void extern
+avx512bw_test (void)
+{
+  d = _mm512_unpacklo_epi16 (e, f);
+  d = _mm512_mask_unpacklo_epi16 (d, m1, e, f);
+  d = _mm512_maskz_unpacklo_epi16 (m1, e, f);
+  x = _mm256_mask_unpacklo_epi16 (x, m2, y, z);
+  x = _mm256_maskz_unpacklo_epi16 (m2, y, z);
+  a = _mm_mask_unpacklo_epi16 (a, m3, b, c);
+  a = _mm_maskz_unpacklo_epi16 (m3, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-2.c b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a29e4d4f0de4d58f44d1a4bff97b16a3be5cc1ef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-vpunpcklwd-2.c
@@ -0,0 +1,61 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -DAVX512BW" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 16)
+#include "avx512f-mask-type.h"
+
+void
+CALC (short *r, short *s1, short *s2)
+{
+  int i;
+  for (i = 0; i < SIZE/8; i++)
+    {
+      r[8 * i] = s1[8 * i];
+      r[8 * i + 1] = s2[8 * i];
+      r[8 * i + 2] = s1[8 * i + 1];
+      r[8 * i + 3] = s2[8 * i + 1];
+      r[8 * i + 4] = s1[8 * i + 2];
+      r[8 * i + 5] = s2[8 * i + 2];
+      r[8 * i + 6] = s1[8 * i + 3];
+      r[8 * i + 7] = s2[8 * i + 3];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_w) res1, res2, res3, src1, src2;
+  MASK_TYPE mask = MASK_VALUE;
+  short res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = 34 * i * sign;
+      src1.a[i] = 179 * i;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_unpacklo_epi16) (src1.x, src2.x);
+  res2.x = INTRINSIC (_mask_unpacklo_epi16) (res2.x, mask, src1.x, src2.x);
+  res3.x = INTRINSIC (_maskz_unpacklo_epi16) (mask, src1.x, src2.x);
+
+  CALC (res_ref, src1.a, src2.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_w) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-check.h b/gcc/testsuite/gcc.target/i386/avx512dq-check.h
new file mode 100644
index 0000000000000000000000000000000000000000..e8dcf4b7d9f1d7129d82af938bd193eccd07a871
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-check.h
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include "cpuid.h"
+#include "m512-check.h"
+#include "avx512f-os-support.h"
+
+static void avx512dq_test (void);
+
+static void __attribute__ ((noinline)) do_test (void)
+{
+  avx512dq_test ();
+}
+
+int
+main ()
+{
+  unsigned int eax, ebx, ecx, edx;
+
+  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+    return 0;
+
+  /* Run AVX512DQ test only if host has AVX512DQ support.  */
+  if ((ecx & bit_OSXSAVE) == (bit_OSXSAVE))
+    {
+      if (__get_cpuid_max (0, NULL) < 7)
+	return 0;
+
+      __cpuid_count (7, 0, eax, ebx, ecx, edx);
+
+      if ((avx512f_os_support ()) && ((ebx & bit_AVX512DQ) == bit_AVX512DQ))
+	{
+	  do_test ();
+#ifdef DEBUG
+	  printf ("PASSED\n");
+#endif
+	  return 0;
+	}
+#ifdef DEBUG
+      printf ("SKIPPED\n");
+#endif
+    }
+#ifdef DEBUG
+  else
+    printf ("SKIPPED\n");
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb6cf9250e6680cc3eb9c6f1e4f6c20922352b73
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d z;
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_andnot_pd (z, z);
+  z = _mm512_mask_andnot_pd (z, m, z, z);
+  z = _mm512_maskz_andnot_pd (m, z, z);
+  y = _mm256_mask_andnot_pd (y, m, y, y);
+  y = _mm256_maskz_andnot_pd (m, y, y);
+  x = _mm_mask_andnot_pd (x, m, x, x);
+  x = _mm_maskz_andnot_pd (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..88e52e0d891629aac3ec95aae9729fc048003e4a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s1, double *s2, double *r)
+{
+  int i;
+  long long tmp;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      tmp = (~(*(long long *) &s1[i])) & (*(long long *) &s2[i]);
+      r[i] = *(double *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 13. * i;
+      s2.a[i] = 17. * i;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_andnot_pd) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_andnot_pd) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_andnot_pd) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a76a2564c3a64b3a11a0867d2ae495680ff61cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandnps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 z;
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask16 m1;
+volatile __mmask8 m2;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_andnot_ps (z, z);
+  z = _mm512_mask_andnot_ps (z, m1, z, z);
+  z = _mm512_maskz_andnot_ps (m1, z, z);
+  y = _mm256_mask_andnot_ps (y, m2, y, y);
+  y = _mm256_maskz_andnot_ps (m2, y, y);
+  x = _mm_mask_andnot_ps (x, m2, x, x);
+  x = _mm_maskz_andnot_ps (m2, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..14df2fbdef2ec9886430ee90e267915e59051386
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandnps-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *s1, float *s2, float *r)
+{
+  int i;
+  int tmp;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      tmp = (~(*(int *) &s1[i])) & (*(int *) &s2[i]);
+      r[i] = *(float *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, ) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 13. * i;
+      s2.a[i] = 17. * i;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_andnot_ps) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_andnot_ps) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_andnot_ps) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, ) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..212754d425f15e5c45dc9f37ea9194c9bab44701
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-1.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d z;
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_and_pd (z, z);
+  z = _mm512_mask_and_pd (z, m, z, z);
+  z = _mm512_maskz_and_pd (m, z, z);
+  y = _mm256_mask_and_pd (y, m, y, y);
+  y = _mm256_maskz_and_pd (m, y, y);
+  x = _mm_mask_and_pd (x, m, x, x);
+  x = _mm_maskz_and_pd (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e5a73658b108bc8142e13c9e8062873637dce29e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s1, double *s2, double *r)
+{
+  int i;
+  long long tmp;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      tmp = (*(long long *) &s1[i]) & (*(long long *) &s2[i]);
+      r[i] = *(double *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 13. * i;
+      s2.a[i] = 17. * i;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_and_pd) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_and_pd) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_and_pd) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e41a7db041b567d769d86f9ae3e293fe0ebc4745
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandps-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vandps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 z;
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask16 m1;
+volatile __mmask8 m2;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_and_ps (z, z);
+  z = _mm512_mask_and_ps (z, m1, z, z);
+  z = _mm512_maskz_and_ps (m1, z, z);
+  y = _mm256_mask_and_ps (y, m2, y, y);
+  y = _mm256_maskz_and_ps (m2, y, y);
+  x = _mm_mask_and_ps (x, m2, x, x);
+  x = _mm_maskz_and_ps (m2, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vandps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vandps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..013e1ecc7a75ef2af3c7366fa18eda88b69f197c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vandps-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *s1, float *s2, float *r)
+{
+  int i;
+  int tmp;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      tmp = (*(int *) &s1[i]) & (*(int *) &s2[i]);
+      r[i] = *(float *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, ) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 13. * i;
+      s2.a[i] = 17. * i;
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_and_ps) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_and_ps) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_and_ps) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, ) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6f0072c7770d425b58ba36b7821de54340fb5db5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 x;
+volatile __m256 y;
+volatile __m128 z;
+volatile __mmask16 mx;
+volatile __mmask8 my;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_f32x2 (z);
+  x = _mm512_mask_broadcast_f32x2 (x, mx, z);
+  x = _mm512_maskz_broadcast_f32x2 (mx, z);
+  y = _mm256_broadcast_f32x2 (z);
+  y = _mm256_mask_broadcast_f32x2 (y, my, z);
+  y = _mm256_maskz_broadcast_f32x2 (my, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..142ac938e54e1772eb341a2f2f330c71e2803e0c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x2-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 2];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN,) res1, res2, res3;
+  UNION_TYPE (128,) src;
+  MASK_TYPE mask = SIZE | 123;
+  float res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 4; i++)
+    {
+      src.a[i] = 34.67 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_f32x2) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_f32x2) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_f32x2) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN,) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d041bba493701688aa9677dd00fb71ab7cced551
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]|vshuff32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshuff32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}|vshuff32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 x;
+volatile __m256 y;
+volatile __mmask16 m;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_f32x8 (y);
+  x = _mm512_mask_broadcast_f32x8 (x, m, y);
+  x = _mm512_maskz_broadcast_f32x8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..26d225164215162bbb463653d3b21ec36e86d716
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf32x8-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 8];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN,) res1, res2, res3;
+  UNION_TYPE (256,) src;
+  MASK_TYPE mask = SIZE | 123;
+  float res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 8; i++)
+    {
+      src.a[i] = 34.67 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_f32x8) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_f32x8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_f32x8) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN,) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c240ccee5fd5e6d076a4d2af05bde2edb7e3d06c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]|vshuff64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshuff64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}|vshuff64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]|vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}|vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d x;
+volatile __m256d y;
+volatile __m128d z;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_f64x2 (z);
+  x = _mm512_mask_broadcast_f64x2 (x, m, z);
+  x = _mm512_maskz_broadcast_f64x2 (m, z);
+  y = _mm256_broadcast_f64x2 (z);
+  y = _mm256_mask_broadcast_f64x2 (y, m, z);
+  y = _mm256_maskz_broadcast_f64x2 (m, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ebb1114129871f5b9b56e368ff350f12de12e747
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcastf64x2-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *r, double *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 2];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, d) res1, res2, res3;
+  UNION_TYPE (128, d) src;
+  MASK_TYPE mask = SIZE | 123;
+  double res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 2; i++)
+    {
+      src.a[i] = 34.67 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_f64x2) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_f64x2) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_f64x2) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..95cfcbd252103d81ea1cdcf0dc684d1a90e9a704
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-1.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask16 mx;
+volatile __mmask8 my;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_i32x2 (z);
+  x = _mm512_mask_broadcast_i32x2 (x, mx, z);
+  x = _mm512_maskz_broadcast_i32x2 (mx, z);
+  y = _mm256_broadcast_i32x2 (z);
+  y = _mm256_mask_broadcast_i32x2 (y, my, z);
+  y = _mm256_maskz_broadcast_i32x2 (my, z);
+  z = _mm_broadcast_i32x2 (z);
+  z = _mm_mask_broadcast_i32x2 (z, my, z);
+  z = _mm_maskz_broadcast_i32x2 (my, z);
+
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ccca285700e4c1e36d1be16229f7ca239782d65a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x2-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (int *r, int *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 2];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3;
+  UNION_TYPE (128, i_d) src;
+  MASK_TYPE mask = SIZE | 123;
+  int res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 4; i++)
+    {
+      src.a[i] = 34 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_i32x2) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_i32x2) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_i32x2) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9e05ea273472a57a046055bb17a81014fda1e2a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]|vshufi32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshufi32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}|vshufi32x4\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __mmask16 m;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_i32x8 (y);
+  x = _mm512_mask_broadcast_i32x8 (x, m, y);
+  x = _mm512_maskz_broadcast_i32x8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3be8746d8300d4d870a1e17962847462a54de49d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti32x8-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (int *r, int *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 8];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3;
+  UNION_TYPE (256, i_d) src;
+  MASK_TYPE mask = SIZE | 123;
+  int res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 8; i++)
+    {
+      src.a[i] = 34 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_i32x8) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_i32x8) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_i32x8) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7dd332dafcfe954ca6ddb34f5ee67d612f6523d3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]|vshufi64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshufi64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}|vshufi64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]|vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}|vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_broadcast_i64x2 (z);
+  x = _mm512_mask_broadcast_i64x2 (x, m, z);
+  x = _mm512_maskz_broadcast_i64x2 (m, z);
+  y = _mm256_broadcast_i64x2 (z);
+  y = _mm256_mask_broadcast_i64x2 (y, m, z);
+  y = _mm256_maskz_broadcast_i64x2 (m, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ac761c82af347c4ea4ba0bc24783dcf5ec34dcbe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vbroadcasti64x2-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *r, long long *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = s[i % 2];
+    }
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  UNION_TYPE (128, i_q) src;
+  MASK_TYPE mask = SIZE | 123;
+  long long res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < 2; i++)
+    {
+      src.a[i] = 34 * i * sign;
+      sign = sign * -1;
+    }
+  for (i = 0; i < SIZE; i++)
+    res2.a[i] = DEFAULT_VALUE;
+
+  res1.x = INTRINSIC (_broadcast_i64x2) (src.x);
+  res2.x = INTRINSIC (_mask_broadcast_i64x2) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_broadcast_i64x2) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..16f2c6c2dcfba330f2aa516009b729b7d98ec4a0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-1.c
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*\{ru-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2qq\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d s1;
+volatile __m256d s2;
+volatile __m128d s3;
+volatile __m512i res1;
+volatile __m256i res2;
+volatile __m128i res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtpd_epi64 (s1);
+  res2 = _mm256_cvtpd_epi64 (s2);
+  res3 = _mm_cvtpd_epi64 (s3);
+
+  res1 = _mm512_mask_cvtpd_epi64 (res1, m, s1);
+  res2 = _mm256_mask_cvtpd_epi64 (res2, m, s2);
+  res3 = _mm_mask_cvtpd_epi64 (res3, m, s3);
+
+  res1 = _mm512_maskz_cvtpd_epi64 (m, s1);
+  res2 = _mm256_maskz_cvtpd_epi64 (m, s2);
+  res3 = _mm_maskz_cvtpd_epi64 (m, s3);
+
+  res1 = _mm512_cvt_roundpd_epi64 (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundpd_epi64 (res1, m, s1, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundpd_epi64 (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0e30bfe99cbc85a9c0740ee776a8b993e9f9bbe5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2qq-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s, long long *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (s[i] >= 0) ? (long long) (s[i] + 0.5)
+			 : (long long) (s[i] - 0.5);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  long long res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_cvtpd_epi64) (s.x);
+  res2.x = INTRINSIC (_mask_cvtpd_epi64) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtpd_epi64) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c53e41d8bef7e66365fd7f27aa3eb7e5ce735d97
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-1.c
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*\{rd-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2uqq\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d s1;
+volatile __m256d s2;
+volatile __m128d s3;
+volatile __m512i res1;
+volatile __m256i res2;
+volatile __m128i res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtpd_epu64 (s1);
+  res2 = _mm256_cvtpd_epu64 (s2);
+  res3 = _mm_cvtpd_epu64 (s3);
+
+  res1 = _mm512_mask_cvtpd_epu64 (res1, m, s1);
+  res2 = _mm256_mask_cvtpd_epu64 (res2, m, s2);
+  res3 = _mm_mask_cvtpd_epu64 (res3, m, s3);
+
+  res1 = _mm512_maskz_cvtpd_epu64 (m, s1);
+  res2 = _mm256_maskz_cvtpd_epu64 (m, s2);
+  res3 = _mm_maskz_cvtpd_epu64 (m, s3);
+
+  res1 = _mm512_cvt_roundpd_epu64 (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundpd_epu64 (res1, m, s1, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundpd_epu64 (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..de1462841b380caa70ece454e206455ec4be865e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtpd2uqq-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq  -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s, unsigned long long *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (unsigned long long) (s[i] + 0.5);
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned long long res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000);
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtpd_epu64) (s.x);
+  res2.x = INTRINSIC (_mask_cvtpd_epu64) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtpd_epu64) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..60a631f0fb4eccc14d158753f661e53ebe550a0b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*\{ru-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2qq\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i x3;
+volatile __m256 z1;
+volatile __m128 z2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_cvtps_epi64 (z1);
+  x1 = _mm512_mask_cvtps_epi64 (x1, m, z1);
+  x1 = _mm512_maskz_cvtps_epi64 (m, z1);
+  x2 = _mm256_cvtps_epi64 (z2);
+  x2 = _mm256_mask_cvtps_epi64 (x2, m, z2);
+  x2 = _mm256_maskz_cvtps_epi64 (m, z2);
+  x3 = _mm_cvtps_epi64 (z2);
+  x3 = _mm_mask_cvtps_epi64 (x3, m, z2);
+  x3 = _mm_maskz_cvtps_epi64 (m, z2);
+  x1 = _mm512_cvt_roundps_epi64 (z1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  x1 = _mm512_mask_cvt_roundps_epi64 (x1, m, z1, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+  x1 = _mm512_maskz_cvt_roundps_epi64 (m, z1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..60659d13c77caceb73fc13c09e426ef8123e600d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2qq-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    r[i] = (long long) (s[i] + ((s[i] >= 0) ? 0.5 : -0.5));
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN_HALF,) src;
+  MASK_TYPE mask = MASK_VALUE;
+  long long res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      res2.a[i] = DEFAULT_VALUE;
+      src.a[i] = 1.5 + 34.67 * i * sign;
+      sign = sign * -1;
+    }
+
+  res1.x = INTRINSIC (_cvtps_epi64) (src.x);
+  res2.x = INTRINSIC (_mask_cvtps_epi64) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvtps_epi64) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4f41c4ab6475b12dada36e45c57c05c3d09f9d94
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*\{rd-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2uqq\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i x3;
+volatile __m256 z1;
+volatile __m128 z2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_cvtps_epu64 (z1);
+  x1 = _mm512_mask_cvtps_epu64 (x1, m, z1);
+  x1 = _mm512_maskz_cvtps_epu64 (m, z1);
+  x2 = _mm256_cvtps_epu64 (z2);
+  x2 = _mm256_mask_cvtps_epu64 (x2, m, z2);
+  x2 = _mm256_maskz_cvtps_epu64 (m, z2);
+  x3 = _mm_cvtps_epu64 (z2);
+  x3 = _mm_mask_cvtps_epu64 (x3, m, z2);
+  x3 = _mm_maskz_cvtps_epu64 (m, z2);
+  x1 = _mm512_cvt_roundps_epu64 (z1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  x1 = _mm512_mask_cvt_roundps_epu64 (x1, m, z1, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+  x1 = _mm512_maskz_cvt_roundps_epu64 (m, z1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bab1717720797cac9450c3f5a482ea1d89287f49
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtps2uqq-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned long long *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    r[i] = (unsigned long long) (s[i] + ((s[i] >= 0) ? 0.5 : -0.5));
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN_HALF,) src;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned long long res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      res2.a[i] = DEFAULT_VALUE;
+      src.a[i] = 1.5 + 34.67 * i;
+    }
+
+  res1.x = INTRINSIC (_cvtps_epu64) (src.x);
+  res2.x = INTRINSIC (_mask_cvtps_epu64) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvtps_epu64) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ad246c384d372f44fbbab218a4f6101dc1bf2d9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*\{rd-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2pd\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i s1;
+volatile __m256i s2;
+volatile __m128i s3;
+volatile __m512d res1;
+volatile __m256d res2;
+volatile __m128d res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtepi64_pd (s1);
+  res1 = _mm512_mask_cvtepi64_pd (res1, m, s1);
+  res1 = _mm512_maskz_cvtepi64_pd (m, s1);
+  res2 = _mm256_cvtepi64_pd (s2);
+  res2 = _mm256_mask_cvtepi64_pd (res2, m, s2);
+  res2 = _mm256_maskz_cvtepi64_pd (m, s2);
+  res3 = _mm_cvtepi64_pd (s3);
+  res3 = _mm_mask_cvtepi64_pd (res3, m, s3);
+  res3 = _mm_maskz_cvtepi64_pd (m, s3);
+  res1 = _mm512_cvt_roundepi64_pd (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundepi64_pd (res1, m, s1, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundepi64_pd (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7143415198be5bcd095346cac2d69b817c34bcfb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2pd-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *s, double *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = (double) s[i];
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s;
+  UNION_TYPE (AVX512F_LEN, d) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_cvtepi64_pd) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepi64_pd) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepi64_pd) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8007299490b3d11ff6f424b59cc94ea73b2ba51d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*\{rd-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtqq2ps\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i s1;
+volatile __m256i s2;
+volatile __m128i s3;
+volatile __m256 res1;
+volatile __m128 res2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtepi64_ps (s1);
+  res1 = _mm512_mask_cvtepi64_ps (res1, m, s1);
+  res1 = _mm512_maskz_cvtepi64_ps (m, s1);
+  res2 = _mm256_cvtepi64_ps (s2);
+  res2 = _mm256_mask_cvtepi64_ps (res2, m, s2);
+  res2 = _mm256_maskz_cvtepi64_ps (m, s2);
+  res2 = _mm_cvtepi64_ps (s3);
+  res2 = _mm_mask_cvtepi64_ps (res2, m, s3);
+  res2 = _mm_maskz_cvtepi64_ps (m, s3);
+  res1 = _mm512_cvt_roundepi64_ps (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundepi64_ps (res1, m, s1, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundepi64_ps (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..751c086f6ff89956adf9c75ff87437ba127c485c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtqq2ps-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#define SIZE_HALF (AVX512F_LEN_HALF / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *s, float *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE_HALF; i++)
+    r[i] = (i < SIZE) ? (float) s[i] : 0;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s;
+  UNION_TYPE (AVX512F_LEN_HALF,) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE_HALF];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_cvtepi64_ps) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepi64_ps) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepi64_ps) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ec4ccf9f23acf4271711289fe766af544aadeb90
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-1.c
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d s1;
+volatile __m256d s2;
+volatile __m128d s3;
+volatile __m512i res1;
+volatile __m256i res2;
+volatile __m128i res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvttpd_epi64 (s1);
+  res2 = _mm256_cvttpd_epi64 (s2);
+  res3 = _mm_cvttpd_epi64 (s3);
+
+  res1 = _mm512_mask_cvttpd_epi64 (res1, m, s1);
+  res2 = _mm256_mask_cvttpd_epi64 (res2, m, s2);
+  res3 = _mm_mask_cvttpd_epi64 (res3, m, s3);
+
+  res1 = _mm512_maskz_cvttpd_epi64 (m, s1);
+  res2 = _mm256_maskz_cvttpd_epi64 (m, s2);
+  res3 = _mm_maskz_cvttpd_epi64 (m, s3);
+
+  res1 = _mm512_cvtt_roundpd_epi64 (s1, _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvtt_roundpd_epi64 (res1, m, s1, _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvtt_roundpd_epi64 (m, s1, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6b338223cbc09dd446b29db73ddff74698fa7176
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2qq-2.c
@@ -0,0 +1,53 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s, long long *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (long long) s[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  long long res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_cvttpd_epi64) (s.x);
+  res2.x = INTRINSIC (_mask_cvttpd_epi64) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvttpd_epi64) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4ceec9a8e83f3dc7e7a7397160b8ebe8bdd5088
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-1.c
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d s1;
+volatile __m256d s2;
+volatile __m128d s3;
+volatile __m512i res1;
+volatile __m256i res2;
+volatile __m128i res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvttpd_epu64 (s1);
+  res2 = _mm256_cvttpd_epu64 (s2);
+  res3 = _mm_cvttpd_epu64 (s3);
+
+  res1 = _mm512_mask_cvttpd_epu64 (res1, m, s1);
+  res2 = _mm256_mask_cvttpd_epu64 (res2, m, s2);
+  res3 = _mm_mask_cvttpd_epu64 (res3, m, s3);
+
+  res1 = _mm512_maskz_cvttpd_epu64 (m, s1);
+  res2 = _mm256_maskz_cvttpd_epu64 (m, s2);
+  res3 = _mm_maskz_cvttpd_epu64 (m, s3);
+
+  res1 = _mm512_cvtt_roundpd_epu64 (s1, _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvtt_roundpd_epu64 (res1, m, s1, _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvtt_roundpd_epu64 (m, s1, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..39f450c9ea04c28a531b8a48df24387cf65aa408
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttpd2uqq-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *s, unsigned long long *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      r[i] = (unsigned long long) s[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned long long res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000);
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvttpd_epu64) (s.x);
+  res2.x = INTRINSIC (_mask_cvttpd_epu64) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvttpd_epu64) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..dd3b451f25e85882c9c9c7319359eb883716b576
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2qq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i x3;
+volatile __m256 z1;
+volatile __m128 z2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_cvttps_epi64 (z1);
+  x1 = _mm512_mask_cvttps_epi64 (x1, m, z1);
+  x1 = _mm512_maskz_cvttps_epi64 (m, z1);
+  x2 = _mm256_cvttps_epi64 (z2);
+  x2 = _mm256_mask_cvttps_epi64 (x2, m, z2);
+  x2 = _mm256_maskz_cvttps_epi64 (m, z2);
+  x3 = _mm_cvttps_epi64 (z2);
+  x3 = _mm_mask_cvttps_epi64 (x3, m, z2);
+  x3 = _mm_maskz_cvttps_epi64 (m, z2);
+  x1 = _mm512_cvtt_roundps_epi64 (z1, _MM_FROUND_NO_EXC);
+  x1 = _mm512_mask_cvtt_roundps_epi64 (x1, m, z1, _MM_FROUND_NO_EXC);
+  x1 = _mm512_maskz_cvtt_roundps_epi64 (m, z1, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b3b38b321abe0dd1c5beff0a7c85c911801f782
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2qq-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    r[i] = (long long) s[i];
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN_HALF,) src;
+  MASK_TYPE mask = MASK_VALUE;
+  long long res_ref[SIZE];
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      res2.a[i] = DEFAULT_VALUE;
+      src.a[i] = 1.5 + 34.67 * i * sign;
+      sign = sign * -1;
+    }
+
+  res1.x = INTRINSIC (_cvttps_epi64) (src.x);
+  res2.x = INTRINSIC (_mask_cvttps_epi64) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvttps_epi64) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ef629b887ae45ac686747fc1d31ed11d402f123
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2uqq\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i x3;
+volatile __m256 z1;
+volatile __m128 z2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_cvttps_epu64 (z1);
+  x1 = _mm512_mask_cvttps_epu64 (x1, m, z1);
+  x1 = _mm512_maskz_cvttps_epu64 (m, z1);
+  x2 = _mm256_cvttps_epu64 (z2);
+  x2 = _mm256_mask_cvttps_epu64 (x2, m, z2);
+  x2 = _mm256_maskz_cvttps_epu64 (m, z2);
+  x3 = _mm_cvttps_epu64 (z2);
+  x3 = _mm_mask_cvttps_epu64 (x3, m, z2);
+  x3 = _mm_maskz_cvttps_epu64 (m, z2);
+  x1 = _mm512_cvtt_roundps_epu64 (z1, _MM_FROUND_NO_EXC);
+  x1 = _mm512_mask_cvtt_roundps_epu64 (x1, m, z1, _MM_FROUND_NO_EXC);
+  x1 = _mm512_maskz_cvtt_roundps_epu64 (m, z1, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1221ebe8ce646bb707d7cb6a477dfed2f43b57c1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvttps2uqq-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned long long *r, float *s)
+{
+  int i;
+  for (i = 0; i < SIZE; i++)
+    r[i] = (unsigned long long) s[i];
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_q) res1, res2, res3;
+  UNION_TYPE (AVX512F_LEN_HALF,) src;
+  MASK_TYPE mask = MASK_VALUE;
+  unsigned long long res_ref[SIZE];
+
+  for (i = 0; i < SIZE; i++)
+    {
+      res2.a[i] = DEFAULT_VALUE;
+      src.a[i] = 1.5 + 34.67 * i;
+    }
+
+  res1.x = INTRINSIC (_cvttps_epu64) (src.x);
+  res2.x = INTRINSIC (_mask_cvttps_epu64) (res2.x, mask, src.x);
+  res3.x = INTRINSIC (_maskz_cvttps_epu64) (mask, src.x);
+
+  CALC (res_ref, src.a);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..55fad80c8358d666d37b73f0e0f6cb73c6c0ec93
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*\{ru-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2pd\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i s1;
+volatile __m256i s2;
+volatile __m128i s3;
+volatile __m512d res1;
+volatile __m256d res2;
+volatile __m128d res3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtepu64_pd (s1);
+  res1 = _mm512_mask_cvtepu64_pd (res1, m, s1);
+  res1 = _mm512_maskz_cvtepu64_pd (m, s1);
+  res2 = _mm256_cvtepu64_pd (s2);
+  res2 = _mm256_mask_cvtepu64_pd (res2, m, s2);
+  res2 = _mm256_maskz_cvtepu64_pd (m, s2);
+  res3 = _mm_cvtepu64_pd (s3);
+  res3 = _mm_mask_cvtepu64_pd (res3, m, s3);
+  res3 = _mm_maskz_cvtepu64_pd (m, s3);
+  res1 = _mm512_cvt_roundepu64_pd (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundepu64_pd (res1, m, s1, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundepu64_pd (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..907e1d9877b534f8dc02936a313ba1890fda9108
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2pd-2.c
@@ -0,0 +1,50 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned long long *s, double *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = (double) s[i];
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s;
+  UNION_TYPE (AVX512F_LEN, d) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123 * (i + 2000);
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtepu64_pd) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepu64_pd) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepu64_pd) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4931bb322db1a50fabde488b157d04ffd8db0def
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2psy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*\{ru-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtuqq2ps\[ \\t\]+\[^\n\]*\{rz-sae\}\[^\n\]*%zmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i s1;
+volatile __m256i s2;
+volatile __m128i s3;
+volatile __m256 res1;
+volatile __m128 res2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  res1 = _mm512_cvtepu64_ps (s1);
+  res1 = _mm512_mask_cvtepu64_ps (res1, m, s1);
+  res1 = _mm512_maskz_cvtepu64_ps (m, s1);
+  res2 = _mm256_cvtepu64_ps (s2);
+  res2 = _mm256_mask_cvtepu64_ps (res2, m, s2);
+  res2 = _mm256_maskz_cvtepu64_ps (m, s2);
+  res2 = _mm_cvtepu64_ps (s3);
+  res2 = _mm_mask_cvtepu64_ps (res2, m, s3);
+  res2 = _mm_maskz_cvtepu64_ps (m, s3);
+  res1 = _mm512_cvt_roundepu64_ps (s1, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+  res1 = _mm512_mask_cvt_roundepu64_ps (res1, m, s1, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+  res1 = _mm512_maskz_cvt_roundepu64_ps (m, s1, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..794024f6cedfa01d595a905e4af80c32bfc2cebb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vcvtuqq2ps-2.c
@@ -0,0 +1,51 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#define SIZE_HALF (AVX512F_LEN_HALF / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (unsigned long long *s, float *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE_HALF; i++)
+    r[i] = (i < SIZE) ? (float) s[i] : 0;
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s;
+  UNION_TYPE (AVX512F_LEN_HALF,) res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE_HALF];
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123 * (i + 2000);
+      res2.a[i] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_cvtepu64_ps) (s.x);
+  res2.x = INTRINSIC (_mask_cvtepu64_ps) (res2.x, mask, s.x);
+  res3.x = INTRINSIC (_maskz_cvtepu64_ps) (mask, s.x);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO ()(res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN_HALF,) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextractf32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..03a4f2c145f4c332212005ffd1e561980006cc9a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf32x8-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vextractf32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextractf32x8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vextractf32x8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 x;
+volatile __m256 y;
+
+void extern
+avx512dq_test (void)
+{
+  y = _mm512_extractf32x8_ps (x, 1);
+  y = _mm512_mask_extractf32x8_ps (y, 2, x, 1);
+  y = _mm512_maskz_extractf32x8_ps (2, x, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ddd52c6375459f3d96559216232505084c00bdb6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vextractf64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextractf64x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vextractf64x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vextractf64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+
+#include <immintrin.h>
+
+volatile __m512d x1;
+volatile __m256d x2;
+volatile __m128d y;
+
+void extern
+avx512dq_test (void)
+{
+  y = _mm512_extractf64x2_pd (x1, 3);
+  y = _mm512_mask_extractf64x2_pd (y, 2, x1, 3);
+  y = _mm512_maskz_extractf64x2_pd (2, x1, 3);
+  y = _mm256_extractf64x2_pd (x2, 1);
+  y = _mm256_mask_extractf64x2_pd (y, 2, x2, 1);
+  y = _mm256_maskz_extractf64x2_pd (2, x2, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..02a2543cbb17c429c0e0d561b9bb13eeaa912989
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextractf64x2-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+#include "string.h"
+
+void
+CALC (double *s1, double *res_ref, int mask)
+{
+  memset (res_ref, 0, 16);
+  memcpy (res_ref, s1 + mask * 2, 16);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s1;
+  union128d res1, res2, res3;
+  double res_ref[2];
+  MASK_TYPE mask = MASK_VALUE;
+  int j;
+
+  for (j = 0; j < SIZE; j++)
+    {
+      s1.a[j] = j * j / 4.56;
+    }
+
+  for (j = 0; j < 2; j++)
+    {
+      res1.a[j] = DEFAULT_VALUE;
+      res2.a[j] = DEFAULT_VALUE;
+      res3.a[j] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_extractf64x2_pd) (s1.x, 1);
+  res2.x = INTRINSIC (_mask_extractf64x2_pd) (res2.x, mask, s1.x, 1);
+  res3.x = INTRINSIC (_maskz_extractf64x2_pd) (mask, s1.x, 1);
+  CALC (s1.a, res_ref, 1);
+
+  if (check_union128d (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, 2);
+  if (check_union128d (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, 2);
+  if (check_union128d (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextracti32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c1f66bc897b7c5af3837b10ba7ae0d2480c354c4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti32x8-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vextracti32x8\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextracti32x8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vextracti32x8\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+
+void extern
+avx512dq_test (void)
+{
+  y = _mm512_extracti32x8_epi32 (x, 1);
+  y = _mm512_mask_extracti32x8_epi32 (y, 2, x, 1);
+  y = _mm512_maskz_extracti32x8_epi32 (2, x, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9852d8b2b66dda504505a09efacda35b7c73ef6f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vextracti64x2\[ \\t\]+\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextracti64x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vextracti64x2\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vextracti64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x1;
+volatile __m256i x2;
+volatile __m128i y;
+
+void extern
+avx512dq_test (void)
+{
+  y = _mm512_extracti64x2_epi64 (x1, 3);
+  y = _mm512_mask_extracti64x2_epi64 (y, 2, x1, 3);
+  y = _mm512_maskz_extracti64x2_epi64 (2, x1, 3);
+  y = _mm256_extracti64x2_epi64 (x2, 1);
+  y = _mm256_mask_extracti64x2_epi64 (y, 2, x2, 1);
+  y = _mm256_maskz_extracti64x2_epi64 (2, x2, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..95fb0cf6a2c29ae73b3a9fbfa09b9bd1733b8000
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vextracti64x2-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+#include "string.h"
+
+void
+CALC (long long int *s1, long long int *res_ref, int mask)
+{
+  memset (res_ref, 0, 16);
+  memcpy (res_ref, s1 + mask * 2, 16);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s1;
+  union128i_q res1, res2, res3;
+  long long int res_ref[2];
+  MASK_TYPE mask = MASK_VALUE;
+  int j;
+
+  for (j = 0; j < SIZE; j++)
+    {
+      s1.a[j] = j * j + 37;
+    }
+
+  for (j = 0; j < 2; j++)
+    {
+      res1.a[j] = DEFAULT_VALUE;
+      res2.a[j] = DEFAULT_VALUE;
+      res3.a[j] = DEFAULT_VALUE;
+    }
+
+  res1.x = INTRINSIC (_extracti64x2_epi64) (s1.x, 1);
+  res2.x =
+    INTRINSIC (_mask_extracti64x2_epi64) (res2.x, mask, s1.x, 1);
+  res3.x = INTRINSIC (_maskz_extracti64x2_epi64) (mask, s1.x, 1);
+  CALC (s1.a, res_ref, 1);
+
+  if (check_union128i_q (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, 2);
+  if (check_union128i_q (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, 2);
+  if (check_union128i_q (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..00855bde8781014efdc28bba6b15ab42b3eac031
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclasspd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d x512;
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  m = _mm512_fpclass_pd_mask (x512, 13);
+  m = _mm256_fpclass_pd_mask (x256, 13);
+  m = _mm_fpclass_pd_mask (x128, 13);
+  m = _mm512_mask_fpclass_pd_mask (2, x512, 13);
+  m = _mm256_mask_fpclass_pd_mask (2, x256, 13);
+  m = _mm_mask_fpclass_pd_mask (2, x128, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..000e0919088d0d2b36a3060a3fa8200d36b6e123
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasspd-2.c
@@ -0,0 +1,75 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#include <values.h>
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+#ifndef __FPCLASSPD__
+#define __FPCLASSPD__
+int check_fp_class_dp (double src, int imm)
+{
+  int qNaN_res = isnan (src);
+  int sNaN_res = isnan (src);
+  int Pzero_res = (src == 0.0);
+  int Nzero_res = (src == -0.0);
+  int PInf_res = (isinf (src) == 1);
+  int NInf_res = (isinf (src) == -1);
+  int Denorm_res = (fpclassify (src) == FP_SUBNORMAL);
+  int FinNeg_res = finite (src) && (src < 0);
+
+  int result = (((imm & 1) && qNaN_res)
+		|| (((imm >> 1) & 1) && Pzero_res)
+		|| (((imm >> 2) & 1) && Nzero_res)
+		|| (((imm >> 3) & 1) && PInf_res)
+		|| (((imm >> 4) & 1) && NInf_res)
+		|| (((imm >> 5) & 1) && Denorm_res)
+		|| (((imm >> 6) & 1) && FinNeg_res)
+		|| (((imm >> 7) & 1) && sNaN_res));
+  return result;
+}
+#endif
+
+__mmask8
+CALC (double *s1, int imm)
+{
+  int i;
+  __mmask8 res = 0;
+
+  for (i = 0; i < SIZE; i++)
+    if (check_fp_class_dp(s1[i], imm))
+      res = res | (1 << i);
+
+  return res;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, d) src;
+  __mmask8 res1, res2, res_ref = 0;
+  MASK_TYPE mask = MASK_VALUE;
+
+  src.a[0] = NAN;
+  src.a[1] = 1.0 / 0.0;
+  for (i = 2; i < SIZE; i++)
+    {
+      src.a[i] = -24.43 + 0.6 * i;
+    }
+
+  res1 = INTRINSIC (_fpclass_pd_mask) (src.x, 0xFF);
+  res2 = INTRINSIC (_mask_fpclass_pd_mask) (mask, src.x, 0xFF);
+
+  res_ref = CALC (src.a, 0xFF);
+
+  if (res_ref != res1)
+    abort ();
+
+  if ((res_ref & mask) != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6da5e72770592f5be2d35123dc3c06be3bc43fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%zmm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+/* { dg-final { scan-assembler-times "vfpclassps\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n^k\]*%k\[1-7\]\{" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 x512;
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  m16 = _mm512_fpclass_ps_mask (x512, 13);
+  m8 = _mm256_fpclass_ps_mask (x256, 13);
+  m8 = _mm_fpclass_ps_mask (x128, 13);
+  m16 = _mm512_mask_fpclass_ps_mask (2, x512, 13);
+  m8 = _mm256_mask_fpclass_ps_mask (2, x256, 13);
+  m8 = _mm_mask_fpclass_ps_mask (2, x128, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e02e382461d04b259e1b2693333c427440dc161b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassps-2.c
@@ -0,0 +1,76 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#include <math.h>
+#include <values.h>
+#include "avx512f-mask-type.h"
+#define SIZE (AVX512F_LEN / 32)
+
+#ifndef __FPCLASSPD__
+#define __FPCLASSPD__
+int check_fp_class_sp (float src, int imm)
+{
+  int qNaN_res = isnan (src);
+  int sNaN_res = isnan (src);
+  int Pzero_res = (src == 0.0);
+  int Nzero_res = (src == -0.0);
+  int PInf_res = (isinf (src) == 1);
+  int NInf_res = (isinf (src) == -1);
+  int Denorm_res = (fpclassify (src) == FP_SUBNORMAL);
+  int FinNeg_res = finite (src) && (src < 0);
+
+  int result = (((imm & 1) && qNaN_res)
+		|| (((imm >> 1) & 1) && Pzero_res)
+		|| (((imm >> 2) & 1) && Nzero_res)
+		|| (((imm >> 3) & 1) && PInf_res)
+		|| (((imm >> 4) & 1) && NInf_res)
+		|| (((imm >> 5) & 1) && Denorm_res)
+		|| (((imm >> 6) & 1) && FinNeg_res)
+		|| (((imm >> 7) & 1) && sNaN_res));
+  return result;
+}
+#endif
+
+MASK_TYPE
+CALC (float *s1, int imm)
+{
+  int i;
+  MASK_TYPE res = 0;
+
+  for (i = 0; i < SIZE; i++)
+    if (check_fp_class_sp(s1[i], imm))
+      res = res | (1 << i);
+
+  return res;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN,) src;
+  MASK_TYPE res1, res2, res_ref = 0;
+  MASK_TYPE mask = MASK_VALUE;
+
+  src.a[0] = NAN;
+  src.a[1] = 1.0 / 0.0;
+  for (i = 2; i < SIZE; i++)
+    {
+      src.a[i] = -24.43 + 0.6 * i;
+    }
+
+  res1 = INTRINSIC (_fpclass_ps_mask) (src.x, 0xFF);
+  res2 = INTRINSIC (_mask_fpclass_ps_mask) (mask, src.x, 0xFF);
+
+
+  res_ref = CALC (src.a, 0xFF);
+
+  if (res_ref != res1)
+    abort ();
+
+  if ((mask & res_ref) != res2)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasssd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasssd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c1b5caab991b132f071bd38cc6ee170cd8f40cde
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclasssd-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler "vfpclasssd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128d x128;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  m8 = _mm_fpclass_sd_mask (x128, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassss-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassss-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f4756ea279d0c0fe0f28eddf57d5ea7700b0bcb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vfpclassss-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler "vfpclassss\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128 x128;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  m8 = _mm_fpclass_ss_mask (x128, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..26f36c49c2779192653f926e0f07d4f0cb50f240
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf32x8-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vinsertf32x8\[ \\t\]+\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vinsertf32x8\[ \\t\]+\[^\n\]*\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vinsertf32x8\[ \\t\]+\[^\n\]*" 3 } } */
+
+#include <immintrin.h>
+
+volatile __m512 x;
+volatile __m256 y;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_insertf32x8 (x, y, 1);
+  x = _mm512_mask_insertf32x8 (x, 2, x, y, 1);
+  x = _mm512_maskz_insertf32x8 (2, x, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8476a36b2c54ff855082306c2640242d1e54bea7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vinsertf64x2\[^\n\]*ymm" 3 } } */
+/* { dg-final { scan-assembler-times "vinsertf64x2\[^\n\]*\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vinsertf64x2\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vinsertf64x2\[^\n\]*zmm" 3 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d y;
+volatile __m512d z;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm256_insertf64x2 (x, y, 1);
+  x = _mm256_mask_insertf64x2 (x, 2, x, y, 1);
+  x = _mm256_maskz_insertf64x2 (2, x, y, 1);
+  z = _mm512_insertf64x2 (z, y, 1);
+  z = _mm512_mask_insertf64x2 (z, 2, z, y, 1);
+  z = _mm512_maskz_insertf64x2 (2, z, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..00c1c8018db900f1aec5832b84968324ff52975c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinsertf64x2-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+#include "string.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (UNION_TYPE (AVX512F_LEN, d) s1, union128d s2,
+      double *res_ref, int mask)
+{
+  memcpy (res_ref, s1.a, SIZE * sizeof (double));
+  memcpy (res_ref + mask * 2, s2.a, 16);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s1, res1, res2, res3;
+  union128d s2;
+  double res_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int j;
+
+  for (j = 0; j < SIZE; j++)
+    {
+      s1.a[j] = j * j;
+      res1.a[j] = DEFAULT_VALUE;
+      res2.a[j] = DEFAULT_VALUE;
+      res3.a[j] = DEFAULT_VALUE;
+    }
+
+  for (j = 0; j < 2; j++)
+    s2.a[j] = j * j * j;
+
+  res1.x = INTRINSIC (_insertf64x2) (s1.x, s2.x, 1);
+  res2.x = INTRINSIC (_mask_insertf64x2) (res2.x, mask, s1.x, s2.x, 1);
+  res3.x = INTRINSIC (_maskz_insertf64x2) (mask, s1.x, s2.x, 1);
+
+  CALC (s1, s2, res_ref, 1);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinserti32x8-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti32x8-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9bebd6836b670889dfb38f27e9eb780e9e996520
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti32x8-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vinserti32x8\[ \\t\]+\[^\n\]*" 3 } } */
+/* { dg-final { scan-assembler-times "vinserti32x8\[ \\t\]+\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vinserti32x8\[ \\t\]+\[^\n\]*\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+volatile __m256i y;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm512_inserti32x8 (x, y, 1);
+  x = _mm512_mask_inserti32x8 (x, 2, x, y, 1);
+  x = _mm512_maskz_inserti32x8 (2, x, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..22d8f1132ea273f274f30c521672c9155b384125
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vinserti64x2\[^\n\]*ymm" 3 } } */
+/* { dg-final { scan-assembler-times "vinserti64x2\[^\n\]*\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vinserti64x2\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vinserti64x2\[^\n\]*zmm" 3 } } */
+
+#include <immintrin.h>
+
+volatile __m512i z;
+volatile __m256i x;
+volatile __m128i y;
+
+void extern
+avx512dq_test (void)
+{
+  x = _mm256_inserti64x2 (x, y, 1);
+  x = _mm256_mask_inserti64x2 (x, 2, x, y, 1);
+  x = _mm256_maskz_inserti64x2 (2, x, y, 1);
+  z = _mm512_inserti64x2 (z, y, 0);
+  z = _mm512_mask_inserti64x2 (z, 2, z, y, 0);
+  z = _mm512_maskz_inserti64x2 (2, z, y, 0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..63ed54ea0b464a115e6778bfc56edfcd1dc3da59
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vinserti64x2-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+#include "string.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (UNION_TYPE (AVX512F_LEN, i_q) s1, union128i_q s2,
+      long long *res_ref, int mask)
+{
+  memcpy (res_ref, s1.a, SIZE * sizeof (long long));
+  memcpy (res_ref + mask * 2, s2.a, 16);
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) s1, res1, res2, res3;
+  union128i_q s2;
+  long long res_ref[SIZE];
+  MASK_TYPE mask = MASK_VALUE;
+  int j;
+
+  for (j = 0; j < SIZE; j++)
+    {
+      s1.a[j] = j * j;
+      res1.a[j] = DEFAULT_VALUE;
+      res2.a[j] = DEFAULT_VALUE;
+      res3.a[j] = DEFAULT_VALUE;
+    }
+
+  for (j = 0; j < 2; j++)
+    s2.a[j] = j * j * j;
+
+  res1.x = INTRINSIC (_inserti64x2) (s1.x, s2.x, 1);
+  res2.x = INTRINSIC (_mask_inserti64x2) (res2.x, mask, s1.x, s2.x, 1);
+  res3.x = INTRINSIC (_maskz_inserti64x2) (mask, s1.x, s2.x, 1);
+
+  CALC (s1, s2, res_ref, 1);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..97383c1af6985f6e409d9e0d827a7de849485039
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-1.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d z;
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_or_pd (z, z);
+  z = _mm512_mask_or_pd (z, m, z, z);
+  z = _mm512_maskz_or_pd (m, z, z);
+
+  y = _mm256_mask_or_pd (y, m, y, y);
+  y = _mm256_maskz_or_pd (m, y, y);
+
+  x = _mm_mask_or_pd (x, m, x, x);
+  x = _mm_maskz_or_pd (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5ef0309ebe785a8563cf426224a34055db04ad6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vorpd-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *src1, double *src2, double *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      long long tmp = (*(long long *) &src1[i]) | (*(long long *) &src2[i]);
+      dst[i] = *(double *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN,d) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double dst_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++) {
+      s1.a[i] = 132.45 * i;
+      s2.a[i] = 43.6 - i * 4.4;
+      res2.a[i] = DEFAULT_VALUE;
+  }
+
+  res1.x = INTRINSIC (_or_pd) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_or_pd) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_or_pd) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN,d) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (d) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,d) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (d) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,d) (res3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vorps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vorps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7f042868431b77b5e653f83f833adb53e615790f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vorps-1.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 z;
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask8 n;
+volatile __mmask16 m;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_or_ps (z, z);
+  z = _mm512_mask_or_ps (z, m, z, z);
+  z = _mm512_maskz_or_ps (m, z, z);
+
+  y = _mm256_mask_or_ps (y, n, y, y);
+  y = _mm256_maskz_or_ps (n, y, y);
+
+  x = _mm_mask_or_ps (x, n, x, x);
+  x = _mm_maskz_or_ps (n, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vorps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vorps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..87d8e02a524f887138ea55583cf0527159703930
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vorps-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *src1, float *src2, float *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (*(int *) &src1[i]) | (*(int *) &src2[i]);
+      dst[i] = *(float *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN,) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float dst_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++) {
+      s1.a[i] = 132.45 * i;
+      s2.a[i] = 43.6 - i * 4.4;
+      res2.a[i] = DEFAULT_VALUE;
+  }
+
+  res1.x = INTRINSIC (_or_ps) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_or_ps) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_or_ps) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN,) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE () (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO () (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c76bdec47e4db0158fc81788d4d252d96eec7f6e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovd2m\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovd2m\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovd2m\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+
+void extern
+avx512dq_test (void)
+{
+  m8 = _mm_movepi32_mask (x128);
+  m8 = _mm256_movepi32_mask (x256);
+  m16 = _mm512_movepi32_mask (x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..24fdf4ae48744994c91561e5a41262a827d83907
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovd2m-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, int *s1)
+{
+  int i;
+  MASK_TYPE res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] >> 31)
+      res = res | (one << i);
+
+  *r = res;
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_d) src;
+  MASK_TYPE res, res_ref = 0;
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 2 * i * sign;
+      sign = sign * -1;
+    }
+
+  res = INTRINSIC (_movepi32_mask) (src.x);
+
+  CALC (&res_ref, src.a);
+
+  if (res_ref != res)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5afd552492d510333b7bba067c306f99f82cee53
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovm2d\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%xmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2d\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%ymm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2d\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%zmm\[0-9\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  x128 = _mm_movm_epi32 (m8);
+  x256 = _mm256_movm_epi32 (m8);
+  x512 = _mm512_movm_epi32 (m16);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..67b78de5e51e0249320af2a0cb1e40f466fdc3e3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2d-2.c
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (int *r, MASK_TYPE s)
+{
+  int i;
+  int all_ones = 0xffffffff;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((s >> i) & 1) ? all_ones : 0;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_d) res, res_ref;
+  MASK_TYPE src = (MASK_TYPE) 0x1111;
+
+  res.x = INTRINSIC (_movm_epi32) (src);
+
+  CALC (res_ref.a, src);
+
+  if (UNION_CHECK (AVX512F_LEN, i_d) (res, res_ref.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a71599e55601e2c4701d62d31c5d139a57b2f5fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovm2q\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%xmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2q\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%ymm\[0-9\]" } } */
+/* { dg-final { scan-assembler "vpmovm2q\[ \\t\]+\[^\n\]*%k\[1-7\]\[^\n\]*%zmm\[0-9\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  x128 = _mm_movm_epi64 (m8);
+  x256 = _mm256_movm_epi64 (m8);
+  x512 = _mm512_movm_epi64 (m8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c7a6c55f5dd5b3f3a91e6c4efb0d13d3638c96b6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovm2q-2.c
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *r, MASK_TYPE s)
+{
+  int i;
+  long long all_ones = 0xffffffffffffffff;
+
+  for (i = 0; i < SIZE; i++)
+    r[i] = ((s >> i) & 1) ? all_ones : 0;
+}
+
+void
+TEST (void)
+{
+  int i;
+  UNION_TYPE (AVX512F_LEN, i_q) res, res_ref;
+  MASK_TYPE src = (MASK_TYPE) 0xff;
+
+  res.x = INTRINSIC (_movm_epi64) (src);
+
+  CALC (res_ref.a, src);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (res, res_ref.a))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8ce3694da9a9359f200985f1f4fc73266c0b839a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpmovq2m\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovq2m\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+/* { dg-final { scan-assembler "vpmovq2m\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%k\[1-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m512i x512;
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  m8 = _mm_movepi64_mask (x128);
+  m8 = _mm256_movepi64_mask (x256);
+  m8 = _mm512_movepi64_mask (x512);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b7816cb9f199493a92b4cbaf5bcc6dd8922ac135
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmovq2m-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (MASK_TYPE *r, long long *s1)
+{
+  int i;
+  MASK_TYPE res = 0;
+  MASK_TYPE one = 1;
+
+  for (i = 0; i < SIZE; i++)
+    if (s1[i] >> 63)
+      res = res | (one << i);
+
+  *r = res;
+}
+
+void
+TEST (void)
+{
+  int i, sign;
+  UNION_TYPE (AVX512F_LEN, i_q) src;
+  MASK_TYPE res, res_ref = 0;
+
+  sign = -1;
+  for (i = 0; i < SIZE; i++)
+    {
+      src.a[i] = 2 * i * sign;
+      sign = sign * -1;
+    }
+
+  res = INTRINSIC (_movepi64_mask) (src.x);
+
+  CALC (&res_ref, src.a);
+
+  if (res_ref != res)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..25124ebc82800928fc6a6bcea9328805ef2414e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmullq\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512i _x1, _y1, _z1;
+volatile __m256i _x2, _y2, _z2;
+volatile __m128i _x3, _y3, _z3;
+
+void extern
+avx512dq_test (void)
+{
+  _x3 = _mm_mullo_epi64 (_y3, _z3);
+  _x3 = _mm_mask_mullo_epi64 (_x3, 2, _y3, _z3);
+  _x3 = _mm_maskz_mullo_epi64 (2, _y3, _z3);
+  _x2 = _mm256_mullo_epi64 (_y2, _z2);
+  _x2 = _mm256_mask_mullo_epi64 (_x2, 3, _y2, _z2);
+  _x2 = _mm256_maskz_mullo_epi64 (3, _y2, _z2);
+  _x1 = _mm512_mullo_epi64 (_y1, _z1);
+  _x1 = _mm512_mask_mullo_epi64 (_x1, 3, _y1, _z1);
+  _x1 = _mm512_maskz_mullo_epi64 (3, _y1, _z1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2184834d80722d7b1db3136d86cf36733f143506
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vpmullq-2.c
@@ -0,0 +1,49 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (long long *src1, long long *src2, long long *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    dst[i] = src1[i] * src2[i];
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, i_q) src1, src2, dst1, dst2, dst3;
+  long long dst_ref[SIZE];
+  int i;
+  MASK_TYPE mask = MASK_VALUE;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      src1.a[i] = i + 50;
+      src2.a[i] = i + 100;
+      dst2.a[i] = DEFAULT_VALUE;
+    }
+
+  dst1.x = INTRINSIC (_mullo_epi64) (src1.x, src2.x);
+  dst2.x = INTRINSIC (_mask_mullo_epi64) (dst2.x, mask, src1.x, src2.x);
+  dst3.x = INTRINSIC (_maskz_mullo_epi64) (mask, src1.x, src2.x);
+  CALC (src1.a, src2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, i_q) (dst1, dst_ref))
+    abort ();
+
+  MASK_MERGE (i_q) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (dst2, dst_ref))
+    abort ();
+
+  MASK_ZERO (i_q) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, i_q) (dst3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..45f7b27dcc819b3abc3d53c0f3aabc7b12220cb3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-1.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrangepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d z;
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_range_round_pd (z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_range_pd (z, z, 15);
+  y = _mm256_range_pd (y, y, 15);
+  x = _mm_range_pd (x, x, 15);
+
+  z = _mm512_mask_range_round_pd (z, m, z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_mask_range_pd (z, m, z, z, 15);
+  y = _mm256_mask_range_pd (y, m, y, y, 15);
+  x = _mm_mask_range_pd (x, m, x, x, 15);
+
+  z = _mm512_maskz_range_round_pd (m, z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_maskz_range_pd (m, z, z, 15);
+  y = _mm256_maskz_range_pd (m, y, y, 15);
+  x = _mm_maskz_range_pd (m, x, x, 15);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fc032fbc50738280d00c4515390285e9636f3dcf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangepd-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+#define IMM 0x02
+
+void
+CALC (double *s1, double *s2, double *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      if (s1[i] < -s2[i])
+	r[i] = -s2[i];
+      else if (s1[i] > s2[i])
+	r[i] = s2[i];
+      else
+	r[i] = s1[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 234.567 * i * sign;
+      s2.a[i] = 100 * (i + 1);
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_range_pd) (s1.x, s2.x, IMM);
+  res2.x = INTRINSIC (_mask_range_pd) (res2.x, mask, s1.x, s2.x, IMM);
+  res3.x = INTRINSIC (_maskz_range_pd) (mask, s1.x, s2.x, IMM);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..71e259ff8c9a60ebe286ba152949da92d94fa6ea
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-1.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 6 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrangeps\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 z;
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask8 m8;
+volatile __mmask16 m16;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_range_round_ps (z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_range_ps (z, z, 15);
+  y = _mm256_range_ps (y, y, 15);
+  x = _mm_range_ps (x, x, 15);
+
+  z = _mm512_mask_range_round_ps (z, m16, z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_mask_range_ps (z, m16, z, z, 15);
+  y = _mm256_mask_range_ps (y, m8, y, y, 15);
+  x = _mm_mask_range_ps (x, m8, x, x, 15);
+
+  z = _mm512_maskz_range_round_ps (m16, z, z, 15, _MM_FROUND_NO_EXC);
+  z = _mm512_maskz_range_ps (m16, z, z, 15);
+  y = _mm256_maskz_range_ps (m8, y, y, 15);
+  x = _mm_maskz_range_ps (m8, x, x, 15);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..373260abd79be90022af745563694fe9b3297da4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangeps-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+#define IMM 0x02
+
+void
+CALC (float *s1, float *s2, float *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      if (s1[i] < -s2[i])
+	r[i] = -s2[i];
+      else if (s1[i] > s2[i])
+	r[i] = s2[i];
+      else
+	r[i] = s1[i];
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, ) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s1.a[i] = 234.567 * i * sign;
+      s2.a[i] = 100 * (i + 1);
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_range_ps) (s1.x, s2.x, IMM);
+  res2.x = INTRINSIC (_mask_range_ps) (res2.x, mask, s1.x, s2.x, IMM);
+  res3.x = INTRINSIC (_maskz_range_ps) (mask, s1.x, s2.x, IMM);
+
+  CALC (s1.a, s2.a, res_ref);
+
+  if (UNION_CHECK (AVX512F_LEN, ) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO () (res_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN, ) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangesd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangesd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..21f48113c1a264516cf0750dd4ab8f4a6ddc9814
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangesd-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vrangesd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vrangesd\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128d x1, x2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm_range_sd (x1, x2, 3);
+  x1 = _mm_range_round_sd (x1, x2, 3, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vrangess-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vrangess-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f5e750b67679d3139f2f6fbd819e79e523d463b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vrangess-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vrangess\[ \\t\]+\[^\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrangess\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m128 x1, x2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm_range_ss (x1, x2, 1);
+  x1 = _mm_range_round_ss (x1, x2, 1, _MM_FROUND_NO_EXC);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce70cd7152a7f71acab7d4a122ad4b777795344d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-1.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vreducepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+#define IMM 123
+
+volatile __m512d x1;
+volatile __m256d x2;
+volatile __m128d x3;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_reduce_pd (x1, IMM);
+  x2 = _mm256_reduce_pd (x2, IMM);
+  x3 = _mm_reduce_pd (x3, IMM);
+
+  x1 = _mm512_mask_reduce_pd (x1, m, x1, IMM);
+  x2 = _mm256_mask_reduce_pd (x2, m, x2, IMM);
+  x3 = _mm_mask_reduce_pd (x3, m, x3, IMM);
+
+  x1 = _mm512_maskz_reduce_pd (m, x1, IMM);
+  x2 = _mm256_maskz_reduce_pd (m, x2, IMM);
+  x3 = _mm_maskz_reduce_pd (m, x3, IMM);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3e231ab9d2a67a01509a77d06298cc58f37f1c77
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreducepd-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+#define IMM 0x23
+
+void
+CALC (double *s, double *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      double tmp = (int) (4 * s[i]) / 4.0;
+      r[i] = s[i] - tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN, d) s, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_reduce_pd) (s.x, IMM);
+  res2.x = INTRINSIC (_mask_reduce_pd) (res2.x, mask, s.x, IMM);
+  res3.x = INTRINSIC (_maskz_reduce_pd) (mask, s.x, IMM);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_FP_CHECK (AVX512F_LEN, d) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE (d) (res_ref, mask, SIZE);
+  if (UNION_FP_CHECK (AVX512F_LEN, d) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO (d) (res_ref, mask, SIZE);
+  if (UNION_FP_CHECK (AVX512F_LEN, d) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cdc3fb963ea205d5ac46dda222ea43fe03decb79
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-1.c
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vreduceps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+#define IMM 123
+
+volatile __m512 x1;
+volatile __m256 x2;
+volatile __m128 x3;
+volatile __mmask16 m16;
+volatile __mmask8 m8;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm512_reduce_ps (x1, IMM);
+  x2 = _mm256_reduce_ps (x2, IMM);
+  x3 = _mm_reduce_ps (x3, IMM);
+
+  x1 = _mm512_mask_reduce_ps (x1, m16, x1, IMM);
+  x2 = _mm256_mask_reduce_ps (x2, m8, x2, IMM);
+  x3 = _mm_mask_reduce_ps (x3, m8, x3, IMM);
+
+  x1 = _mm512_maskz_reduce_ps (m16, x1, IMM);
+  x2 = _mm256_maskz_reduce_ps (m8, x2, IMM);
+  x3 = _mm_maskz_reduce_ps (m8, x3, IMM);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..97afd2ad93e8bf75144f8a853426f907689f349a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreduceps-2.c
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+#define IMM 0x23
+
+void
+CALC (float *s, float *r)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      float tmp = (int) (4 * s[i]) / 4.0;
+      r[i] = s[i] - tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN,) s, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float res_ref[SIZE];
+  int i, sign = 1;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      s.a[i] = 123.456 * (i + 2000) * sign;
+      res2.a[i] = DEFAULT_VALUE;
+      sign = -sign;
+    }
+
+  res1.x = INTRINSIC (_reduce_ps) (s.x, IMM);
+  res2.x = INTRINSIC (_mask_reduce_ps) (res2.x, mask, s.x, IMM);
+  res3.x = INTRINSIC (_maskz_reduce_ps) (mask, s.x, IMM);
+
+  CALC (s.a, res_ref);
+
+  if (UNION_FP_CHECK (AVX512F_LEN,) (res1, res_ref))
+    abort ();
+
+  MASK_MERGE () (res_ref, mask, SIZE);
+  if (UNION_FP_CHECK (AVX512F_LEN,) (res2, res_ref))
+    abort ();
+
+  MASK_ZERO () (res_ref, mask, SIZE);
+  if (UNION_FP_CHECK (AVX512F_LEN,) (res3, res_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreducesd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreducesd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6a4a283098a3fa92ee3c1e972241f4dfe376a39
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreducesd-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vreducesd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128d x1, x2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm_reduce_sd (x1, x2, 123);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vreducess-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vreducess-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0d51b6119dff360514a7fd40a5d15cd2b09c7463
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vreducess-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vreducess\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128 x1, x2;
+volatile __mmask8 m;
+
+void extern
+avx512dq_test (void)
+{
+  x1 = _mm_reduce_ss (x1, x2, 123);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..42ea18d592e4ea120b8d58bcc933d550d09acc08
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-1.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512d z;
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_xor_pd (z, z);
+  z = _mm512_mask_xor_pd (z, m, z, z);
+  z = _mm512_maskz_xor_pd (m, z, z);
+
+  y = _mm256_mask_xor_pd (y, m, y, y);
+  y = _mm256_maskz_xor_pd (m, y, y);
+
+  x = _mm_mask_xor_pd (x, m, x, x);
+  x = _mm_maskz_xor_pd (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..060861a9264cd4717f7a9dc98a095c7fbe0233a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 64)
+#include "avx512f-mask-type.h"
+
+void
+CALC (double *src1, double *src2, double *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      long long tmp = (*(long long *) &src1[i]) ^ (*(long long *) &src2[i]);
+      dst[i] = *(double *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN,d) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  double dst_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++) {
+      s1.a[i] = 132.45 * i;
+      s2.a[i] = 43.6 - i * 4.4;
+      res2.a[i] = DEFAULT_VALUE;
+  }
+
+  res1.x = INTRINSIC (_xor_pd) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_xor_pd) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_xor_pd) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN,d) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE (d) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,d) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO (d) (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,d) (res3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..561785209d557e5d43d976777e5f05fb0be37303
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-1.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%zmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vxorps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m512 z;
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask16 m;
+volatile __mmask8 n;
+
+void extern
+avx512dq_test (void)
+{
+  z = _mm512_xor_ps (z, z);
+  z = _mm512_mask_xor_ps (z, m, z, z);
+  z = _mm512_maskz_xor_ps (m, z, z);
+
+  y = _mm256_mask_xor_ps (y, n, y, y);
+  y = _mm256_maskz_xor_ps (n, y, y);
+
+  x = _mm_mask_xor_ps (x, n, x, x);
+  x = _mm_maskz_xor_ps (n, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-2.c b/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5360c04f12e9117f69eb613bd6f91345c9aff8bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512dq-vxorps-2.c
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512f-helper.h"
+
+#define SIZE    (AVX512F_LEN / 32)
+#include "avx512f-mask-type.h"
+
+void
+CALC (float *src1, float *src2, float *dst)
+{
+  int i;
+
+  for (i = 0; i < SIZE; i++)
+    {
+      int tmp = (*(int *) &src1[i]) ^ (*(int *) &src2[i]);
+      dst[i] = *(float *) &tmp;
+    }
+}
+
+void
+TEST (void)
+{
+  UNION_TYPE (AVX512F_LEN,) s1, s2, res1, res2, res3;
+  MASK_TYPE mask = MASK_VALUE;
+  float dst_ref[SIZE];
+  int i;
+
+  for (i = 0; i < SIZE; i++) {
+      s1.a[i] = 132.45 * i;
+      s2.a[i] = 43.6 - i * 4.4;
+      res2.a[i] = DEFAULT_VALUE;
+  }
+
+  res1.x = INTRINSIC (_xor_ps) (s1.x, s2.x);
+  res2.x = INTRINSIC (_mask_xor_ps) (res2.x, mask, s1.x, s2.x);
+  res3.x = INTRINSIC (_maskz_xor_ps) (mask, s1.x, s2.x);
+
+  CALC (s1.a, s2.a, dst_ref);
+
+  if (UNION_CHECK (AVX512F_LEN,) (res1, dst_ref))
+    abort ();
+
+  MASK_MERGE () (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res2, dst_ref))
+    abort ();
+
+  MASK_ZERO () (dst_ref, mask, SIZE);
+  if (UNION_CHECK (AVX512F_LEN,) (res3, dst_ref))
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-helper.h b/gcc/testsuite/gcc.target/i386/avx512f-helper.h
index 9beabdf5e43acddf258629f715b94d134fa6e833..04a1a89da511c2fb438b0faff37697c254e7de99 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-helper.h
+++ b/gcc/testsuite/gcc.target/i386/avx512f-helper.h
@@ -1,16 +1,25 @@
 /* This file is used to reduce a number of runtime tests for AVX512F
-   instructions.  Idea is to create one file per instruction -
+   and AVX512VL instructions.  Idea is to create one file per instruction -
    avx512f-insn-2.c - using defines from this file instead of intrinsic
    name, vector length etc.  Then dg-options are set with appropriate
    -Dwhatever options in that .c file producing tests for specific
    length.  */
 
-#if defined (AVX512F)
+#ifndef AVX512F_HELPER_INCLUDED
+#define AVX512F_HELPER_INCLUDED
+
+#if defined (AVX512F) && !defined (AVX512VL)
 #include "avx512f-check.h"
 #elif defined (AVX512ER)
 #include "avx512er-check.h"
 #elif defined (AVX512CD)
 #include "avx512cd-check.h"
+#elif defined (AVX512DQ)
+#include "avx512dq-check.h"
+#elif defined (AVX512BW)
+#include "avx512bw-check.h"
+#elif defined (AVX512VL)
+#include "avx512vl-check.h"
 #endif
 
 /* Macros expansion.  */
@@ -73,8 +82,7 @@ MAKE_MASK_ZERO(i_uq, unsigned long long)
 
 #define MASK_ZERO(TYPE) zero_masking_##TYPE
 
-/* Intrinsic being tested.  */
-#define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
+
 /* Unions used for testing (for example union512d, union256d etc.).  */
 #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
 /* Corresponding union check.  */
@@ -89,12 +97,17 @@ MAKE_MASK_ZERO(i_uq, unsigned long long)
 /* Function which calculates result.  */
 #define CALC EVAL(calc_, AVX512F_LEN,)
 
+#ifndef AVX512VL
 #define AVX512F_LEN 512
 #define AVX512F_LEN_HALF 256
+void test_512 ();
+#endif
 
 void test_512 ();
+void test_256 ();
+void test_128 ();
 
-#if defined (AVX512F)
+#if defined (AVX512F) && !defined (AVX512VL)
 void
 avx512f_test (void) { test_512 (); }
 #elif defined (AVX512CD)
@@ -103,4 +116,28 @@ avx512cd_test (void) { test_512 (); }
 #elif defined (AVX512ER)
 void
 avx512er_test (void) { test_512 (); }
+#elif defined (AVX512DQ)
+void
+avx512dq_test (void) { test_512 (); }
+#elif defined (AVX512BW)
+void
+avx512bw_test (void) { test_512 (); }
+#elif defined (AVX512VL)
+void
+avx512vl_test (void) { test_256 (); test_128 (); }
+#endif
+
+#endif /* AVX512F_HELPER_INCLUDED */
+
+/* Intrinsic being tested. It has different deffinitions,
+   depending on AVX512F_LEN, so it's outside include guards
+   and in undefed away to silence warnings.  */
+#if defined INTRINSIC
+#undef INTRINSIC
+#endif
+
+#if AVX512F_LEN != 128
+#define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
+#else
+#define INTRINSIC(NAME) _mm ## NAME
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-mask-type.h b/gcc/testsuite/gcc.target/i386/avx512f-mask-type.h
index 2dacdd67a2a62052cbca8b338212f2bf3c5c588d..efece198e5124a143b00f1bafb7f2bd8e05d16dd 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-mask-type.h
+++ b/gcc/testsuite/gcc.target/i386/avx512f-mask-type.h
@@ -1,10 +1,30 @@
 /* Type of mask.  */
 #if SIZE <= 8
+#undef MASK_TYPE
+#undef MASK_VALUE
+#undef MASK_ALL_ONES
 #define MASK_TYPE __mmask8
 #define MASK_VALUE 0xB9
 #define MASK_ALL_ONES 0xFF
 #elif SIZE <= 16
+#undef MASK_TYPE
+#undef MASK_VALUE
+#undef MASK_ALL_ONES
 #define MASK_TYPE __mmask16
 #define MASK_VALUE 0xA6BA
 #define MASK_ALL_ONES 0xFFFF
+#elif SIZE <= 32
+#undef MASK_TYPE
+#undef MASK_VALUE
+#undef MASK_ALL_ONES
+#define MASK_TYPE __mmask32
+#define MASK_VALUE 0xA6BAAB6A 
+#define MASK_ALL_ONES 0xFFFFFFFFu
+#elif SIZE <= 64 
+#undef MASK_TYPE
+#undef MASK_VALUE
+#undef MASK_ALL_ONES
+#define MASK_TYPE __mmask64
+#define MASK_VALUE 0xA6BAA6BAB6AB6ABB 
+#define MASK_ALL_ONES 0xFFFFFFFFFFFFFFFFull
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcmppd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcmppd-2.c
index a81f36256cd35663701a48608b466b41fc21a58d..52e226d9f1534a84d0f0f23c28b44b319dae6a2b 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcmppd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcmppd-2.c
@@ -26,6 +26,38 @@
     if ((dst_ref & mask) != dst2) abort();
 #endif
 
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = (((int) rel) << i) | dst_ref;		\
+    }							\
+    source1.x = _mm256_loadu_pd(s1);			\
+    source2.x = _mm256_loadu_pd(s2);			\
+    dst1 = _mm256_cmp_pd_mask(source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_pd_mask(mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((dst_ref & mask) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 2; i++)				\
+    {							\
+      dst_ref = (((int) rel) << i) | dst_ref;		\
+    }							\
+    source1.x = _mm_loadu_pd(s1);			\
+    source2.x = _mm_loadu_pd(s2);			\
+    dst1 = _mm_cmp_pd_mask(source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_pd_mask(mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((dst_ref & mask) != dst2) abort();
+#endif
+
 void
 TEST ()
 {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcmpps-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcmpps-2.c
index 88dc8908596f4cedfa6962e03063527f1b587b4d..2ffa2ed16b770829287e8ae4797c5fa74afd50c1 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcmpps-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcmpps-2.c
@@ -12,6 +12,7 @@
 #include "avx512f-mask-type.h"
 
 #if AVX512F_LEN == 512
+#undef CMP
 #define CMP(imm, rel)					\
     dst_ref = 0;					\
     for (i = 0; i < 16; i++)				\
@@ -26,6 +27,38 @@
     if ((dst_ref & mask) != dst2) abort();
 #endif
 
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 8; i++)				\
+    {							\
+      dst_ref = (((int) rel) << i) | dst_ref;		\
+    }							\
+    source1.x = _mm256_loadu_ps(s1);			\
+    source2.x = _mm256_loadu_ps(s2);			\
+    dst1 = _mm256_cmp_ps_mask(source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_ps_mask(mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((dst_ref & mask) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = (((int) rel) << i) | dst_ref;		\
+    }							\
+    source1.x = _mm_loadu_ps(s1);			\
+    source2.x = _mm_loadu_ps(s2);			\
+    dst1 = _mm_cmp_ps_mask(source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_ps_mask(mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((dst_ref & mask) != dst2) abort();
+#endif
+
 void
 TEST ()
 {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2ps-2.c
index e79e014e61dc072e99def016968228f212117c48..d274ab784d6c9cb9e8d6cc0b4d0446c5bc3e550e 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2ps-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2ps-2.c
@@ -15,6 +15,8 @@ CALC (float *e, UNION_TYPE (AVX512F_LEN, d) s1)
   int i;
   for (i = 0; i < SIZE; i++)
     e[i] = (float) s1.a[i];
+  for (i = SIZE; i < AVX512F_LEN_HALF / 32; i++)
+    e[i] = 0.0;
 }
 
 void
@@ -23,7 +25,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, d) s1;
   UNION_TYPE (AVX512F_LEN_HALF,) u1, u2, u3;
   MASK_TYPE mask = MASK_VALUE;
-  float e[SIZE];
+  float e[AVX512F_LEN_HALF / 32];
   int i;
 
   for (i = 0; i < SIZE; i++)
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2udq-2.c
index 1873cf8e08e3dec362c5beedef8fa73a0e2d8a0c..ad9003528d02b41b232b9319071a3a67dc57b259 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2udq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcvtpd2udq-2.c
@@ -15,10 +15,14 @@ CALC (double *s, unsigned *r)
 {
   int i;
 
-  for (i = 0; i < DST_SIZE; i++)
+  for (i = 0; i < SRC_SIZE; i++)
     {
       r[i] = (unsigned) (s[i] + 0.5);
     }
+  for (i = SRC_SIZE; i < DST_SIZE; i++)
+    {
+      r[i] = 0;
+    }
 }
 
 void
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcvtph2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcvtph2ps-2.c
index ec98f4b3ad548ccda166f8d9a04148b68164e0a8..5cf110f92aca3566f3cc1d4985fdd38297fc2d5f 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcvtph2ps-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcvtph2ps-2.c
@@ -67,9 +67,9 @@ TEST (void)
   val.a[15] = 0xc800;
 #endif
 
-  res1.x = _mm512_cvtph_ps (val.x);
-  res2.x = _mm512_mask_cvtph_ps (res2.x, mask, val.x);
-  res3.x = _mm512_maskz_cvtph_ps (mask, val.x);
+  res1.x = INTRINSIC (_cvtph_ps) (val.x);
+  res2.x = INTRINSIC (_mask_cvtph_ps) (res2.x, mask, val.x);
+  res3.x = INTRINSIC (_maskz_cvtph_ps) (mask, val.x);
 
   if (UNION_CHECK (AVX512F_LEN,) (res1, exp))
     abort ();
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcvtps2ph-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcvtps2ph-2.c
index 540bf29a4f9cdfbeb5df5766d782b9bad8a42ec8..e4f21a6e4b12cac5a9e3258674ce820f9660ad59 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcvtps2ph-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcvtps2ph-2.c
@@ -15,7 +15,11 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN,) val;
   UNION_TYPE (AVX512F_LEN_HALF, i_w) res1,res2,res3;
   MASK_TYPE mask = MASK_VALUE;
+#if AVX512F_LEN == 128
+  short exp[SIZE * 2];
+#else
   short exp[SIZE];
+#endif
   int i;
 
   for (i = 0; i < SIZE; i++)
@@ -55,6 +59,11 @@ TEST (void)
   exp[5] = 0xc000;
   exp[6] = 0xc400;
   exp[7] = 0xc800;
+#else
+  exp[4] = 0;
+  exp[5] = 0;
+  exp[6] = 0;
+  exp[7] = 0;
 #endif
 #if AVX512F_LEN > 256
   exp[8] = 0x3c00;
@@ -67,9 +76,9 @@ TEST (void)
   exp[15] = 0xc800;
 #endif
 
-  res1.x = _mm512_cvtps_ph (val.x, 0);
-  res2.x = _mm512_mask_cvtps_ph (res2.x, mask, val.x, 0);
-  res3.x = _mm512_maskz_cvtps_ph (mask, val.x, 0);
+  res1.x = INTRINSIC (_cvtps_ph (val.x, 0));
+  res2.x = INTRINSIC (_mask_cvtps_ph (res2.x, mask, val.x, 0));
+  res3.x = INTRINSIC (_maskz_cvtps_ph (mask, val.x, 0));
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res1, exp))
     abort ();
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vcvttpd2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vcvttpd2udq-2.c
index 5345589c4f963131da4c5a221d2a8da7d1619877..f0a966ed96824aefa7f61b7299c76e9a0b088c9b 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vcvttpd2udq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vcvttpd2udq-2.c
@@ -15,10 +15,10 @@ CALC (double *s, unsigned *r)
 {
   int i;
 
-  for (i = 0; i < DST_SIZE; i++)
-    {
+  for (i = 0; i < SRC_SIZE; i++)
       r[i] = (unsigned) s[i];
-    }
+  for (i = SRC_SIZE; i < DST_SIZE; i++)
+      r[i] = 0;
 }
 
 void
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpandd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpandd-2.c
index b5654d2fe8c6ed320d7c15494ba695a8a48e59f4..55786bc6289ff96358501262d9c29fd97b6d3f9e 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpandd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpandd-2.c
@@ -34,18 +34,22 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_and_si512) (s1.x, s2.x);
   res2.x = INTRINSIC (_and_epi32) (s1.x, s2.x);
+#endif
   res3.x = INTRINSIC (_mask_and_epi32) (res3.x, mask, s1.x, s2.x);
   res4.x = INTRINSIC (_maskz_and_epi32) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
     abort ();
 
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
     abort ();
+#endif
 
   MASK_MERGE (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpandnd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpandnd-2.c
index 418b96e6edf634e95e31cdc3e255a0c784f9849a..b5c071944dba27ea1cc6e12ba9eb9fa4e504c822 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpandnd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpandnd-2.c
@@ -34,18 +34,22 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_andnot_si512) (s1.x, s2.x);
   res2.x = INTRINSIC (_andnot_epi32) (s1.x, s2.x);
+#endif
   res3.x = INTRINSIC (_mask_andnot_epi32) (res3.x, mask, s1.x, s2.x);
   res4.x = INTRINSIC (_maskz_andnot_epi32) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
       abort ();
 
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
       abort ();
+#endif
 
   MASK_MERGE (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpandnq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpandnq-2.c
index 585d2885991907d2c728cff53308a6a9d31187b2..9b7512bcdf8f06ea10abd7911443e7f3339923da 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpandnq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpandnq-2.c
@@ -34,14 +34,18 @@ TEST (void)
       res2.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_andnot_epi64) (s1.x, s2.x);
+#endif
   res2.x = INTRINSIC (_mask_andnot_epi64) (res2.x, mask, s1.x, s2.x);
   res3.x = INTRINSIC (_maskz_andnot_epi64) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
       abort ();
+#endif
 
   MASK_MERGE (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpandq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpandq-2.c
index b2f39456449ce6823d0ffd310cc7eb045049a001..3493830d5044a0a7aad5156fc9712f6b33cbb027 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpandq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpandq-2.c
@@ -34,14 +34,18 @@ TEST (void)
       res2.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_and_epi64) (s1.x, s2.x);
+#endif
   res2.x = INTRINSIC (_mask_and_epi64) (res2.x, mask, s1.x, s2.x);
   res3.x = INTRINSIC (_maskz_and_epi64) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
       abort ();
+#endif
 
   MASK_MERGE (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpbroadcastq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpbroadcastq-2.c
index cbd9d7b85d4ea17ee168876b46a43feff94f616b..9cfa63d98b157fb84fc23417fbd02c141f977fa4 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpbroadcastq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpbroadcastq-2.c
@@ -54,7 +54,9 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN, i_q) (res3, res_ref))
     abort ();
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_set1_epi64) (src.a[0]);
+#endif
   res2.x = INTRINSIC (_mask_set1_epi64) (res2.x, mask, src.a[0]);
   res3.x = INTRINSIC (_maskz_set1_epi64) (mask, src.a[0]);
 
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpd-2.c
index 3a2dccfd4bd85476940fa70f4309b48319b86a80..9479f896af395f0e862f89d208579a4c4e1aac90 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpd-2.c
@@ -11,6 +11,7 @@
 #include "avx512f-mask-type.h"
 
 #if AVX512F_LEN == 512
+#undef CMP
 #define CMP(imm, rel)					\
     dst_ref = 0;					\
     for (i = 0; i < 16; i++)				\
@@ -25,6 +26,38 @@
     if ((mask & dst_ref) != dst2) abort();
 #endif
 
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 8; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);		\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);		\
+    dst1 = _mm256_cmp_epi32_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epi32_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epi32_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epi32_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
 void
 TEST ()
 {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpq-2.c
index 7c9b888b255ca2de04298ee0ee9faa647d155d1d..857b04e6999c18bed3e127d72a8590186f15718e 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpq-2.c
@@ -12,6 +12,8 @@
 
 __mmask8 dst_ref;
 
+#if AVX512F_LEN == 512
+#undef CMP
 #define CMP(imm, rel)					\
     dst_ref = 0;					\
     for (i = 0; i < 8; i++)				\
@@ -24,6 +26,39 @@ __mmask8 dst_ref;
     dst2 = _mm512_mask_cmp_epi64_mask (mask, source1.x, source2.x, imm);\
     if (dst_ref != dst1) abort();			\
     if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);		\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);		\
+    dst1 = _mm256_cmp_epi64_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epi64_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 2; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epi64_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epi64_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
 
 void
 TEST ()
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpud-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpud-2.c
index 7a1ed898271466ef6a3b203e0b0972e0987fa188..3f09e7d3ea0f26159ca4a5ca3c290b16166f5f19 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpud-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpud-2.c
@@ -11,6 +11,7 @@
 #include "avx512f-mask-type.h"
 
 #if AVX512F_LEN == 512
+#undef CMP
 #define CMP(imm, rel)					\
     dst_ref = 0;					\
     for (i = 0; i < 16; i++)				\
@@ -25,6 +26,38 @@
     if ((mask & dst_ref) != dst2) abort();
 #endif
 
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 8; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);		\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);		\
+    dst1 = _mm256_cmp_epu32_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epu32_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epu32_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epu32_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
 void
 TEST ()
 {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpuq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpuq-2.c
index f8db6c643a9f79b416dafaef73e85be53c4109a8..11eb6ffebcdeca5bcbeba80e5c9e682acfc5375f 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpcmpuq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpcmpuq-2.c
@@ -11,6 +11,7 @@
 #include "avx512f-mask-type.h"
 
 #if AVX512F_LEN == 512
+#undef CMP
 #define CMP(imm, rel)					\
     dst_ref = 0;					\
     for (i = 0; i < 8; i++)				\
@@ -25,6 +26,38 @@
     if ((mask & dst_ref) != dst2) abort();
 #endif
 
+#if AVX512F_LEN == 256
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 4; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm256_loadu_si256 ((__m256i*)s1);		\
+    source2.x = _mm256_loadu_si256 ((__m256i*)s2);		\
+    dst1 = _mm256_cmp_epu64_mask (source1.x, source2.x, imm);\
+    dst2 = _mm256_mask_cmp_epu64_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
+#if AVX512F_LEN == 128
+#undef CMP
+#define CMP(imm, rel)					\
+    dst_ref = 0;					\
+    for (i = 0; i < 2; i++)				\
+    {							\
+      dst_ref = ((rel) << i) | dst_ref;			\
+    }							\
+    source1.x = _mm_loadu_si128 ((__m128i*)s1);		\
+    source2.x = _mm_loadu_si128 ((__m128i*)s2);		\
+    dst1 = _mm_cmp_epu64_mask (source1.x, source2.x, imm);\
+    dst2 = _mm_mask_cmp_epu64_mask (mask, source1.x, source2.x, imm);\
+    if (dst_ref != dst1) abort();			\
+    if ((mask & dst_ref) != dst2) abort();
+#endif
+
 void
 TEST ()
 {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpermd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpermd-2.c
index 1b2ce756abbb4f89bc3277a0f764aed04f2de17f..dbd4544c39e93f6fba2a01b43f1b9e5fb135cb45 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpermd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpermd-2.c
@@ -17,7 +17,11 @@ CALC (int *mask, int *src1, int *dst)
 
   for (i = 0; i < SIZE; i++)
     {
+#if AVX512F_LEN == 512
       dst[i] = src1[mask[i] & 15];
+#else
+      dst[i] = src1[mask[i] & 7];
+#endif
     }
 }
 
@@ -37,14 +41,18 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutexvar_epi32) (src1.x, src2.x);
+#endif
   res2.x = INTRINSIC (_maskz_permutexvar_epi32) (mask, src1.x, src2.x);
   res3.x = INTRINSIC (_mask_permutexvar_epi32) (res3.x, mask, src1.x, src2.x);
 
   CALC (src1.a, src2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
     abort ();
+#endif
 
   MASK_ZERO (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpermilpdi-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpermilpdi-2.c
index 26f5a775c73d2f8adb17595b069e1ea42a9be93b..e1c3a209f75467c6c00eef3ac796a2aec054d696 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpermilpdi-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpermilpdi-2.c
@@ -9,8 +9,12 @@
 #define SIZE (AVX512F_LEN / 64)
 #include "avx512f-mask-type.h"
 
-#ifndef CTRL
-#define CTRL 129
+#if AVX512F_LEN > 256
+  #define CTRL 129
+#elif AVX512F_LEN > 128
+  #define CTRL 5
+#else
+  #define CTRL 1
 #endif
 
 static void
@@ -55,3 +59,5 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
     abort ();
 }
+
+#undef CTRL
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpermq-imm-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpermq-imm-2.c
index dd88cd46c0b18c4903fff1c370fa0296d90a2c0a..770d5623f5f454f09c5340bb9dbe8267f8c31847 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpermq-imm-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpermq-imm-2.c
@@ -40,14 +40,18 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutex_epi64) (src1.x, IMM_MASK);
+#endif
   res2.x = INTRINSIC (_maskz_permutex_epi64) (mask, src1.x, IMM_MASK);
   res3.x = INTRINSIC (_mask_permutex_epi64) (res3.x, mask, src1.x, IMM_MASK);
 
   CALC (src1.a, IMM_MASK, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
     abort ();
+#endif
 
   MASK_ZERO (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpermq-var-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpermq-var-2.c
index b7c36a5f1410483b003ebbc21bd9e07736593347..c596b1d9c40f5bd383b55f114efc4c579c9365e8 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpermq-var-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpermq-var-2.c
@@ -17,7 +17,11 @@ CALC (long long *mask, long long *src1, long long *dst)
 
   for (i = 0; i < SIZE; i++)
     {
+#if AVX512F_LEN == 512
       dst[i] = src1[mask[i] & 7];
+#else
+      dst[i] = src1[mask[i] & 3];
+#endif
     }
 }
 
@@ -37,14 +41,18 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutexvar_epi64) (src1.x, src2.x);
+#endif
   res2.x = INTRINSIC (_maskz_permutexvar_epi64) (mask, src1.x, src2.x);
   res3.x = INTRINSIC (_mask_permutexvar_epi64) (res3.x, mask, src1.x, src2.x);
 
   CALC (src1.a, src2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
     abort ();
+#endif
 
   MASK_ZERO (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovdb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovdb-2.c
index 0e418f98ed272a76fbfd13dab36f2f0887e65f27..80cb2c3cb2f5b9d3d88b17bca6b7c3d4e1d72847 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovdb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovdb-2.c
@@ -9,11 +9,12 @@
 #define SIZE (AVX512F_LEN / 32)
 #include "avx512f-mask-type.h"
 
-static void
-CALC (char *r, int *s)
+void
+CALC (char *r, int *s, int mem)
 {
   int i;
-  for (i = 0; i < 16; i++)
+  int len = mem ? SIZE : 16;
+  for (i = 0; i < len; i++)
     {
       r[i] = (i < SIZE) ? (char) s[i] : 0;
     }
@@ -28,6 +29,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_d) src;
   MASK_TYPE mask = MASK_VALUE;
   char res_ref[16];
+  char res_ref2[16];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -38,12 +40,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 16; i++)
+    {
+      res4[i] = DEFAULT_VALUE * 2;
+      res_ref2[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtepi32_epi8) (src.x);
   res2.x = INTRINSIC (_mask_cvtepi32_epi8) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtepi32_epi8) (mask, src.x);
-  INTRINSIC (_mask_cvtepi32_storeu_epi8) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_b) (res1, res_ref))
     abort ();
@@ -52,10 +59,14 @@ TEST (void)
   if (UNION_CHECK (128, i_b) (res2, res_ref))
     abort ();
 
-  if (checkVc (res4, res_ref, 16))
-    abort ();
-
   MASK_ZERO (i_b) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_b) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtepi32_storeu_epi8) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_b) (res_ref2, mask, SIZE);
+  if (checkVc (res4, res_ref2, 16))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovdw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovdw-2.c
index 376c105c0b22f2f2eb301432c6ecd1c1cf490eaf..c0797fcda950ca014458aeed5d7689fe827aff0d 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovdw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovdw-2.c
@@ -10,11 +10,12 @@
 #include "avx512f-mask-type.h"
 #define SIZE_HALF (AVX512F_LEN_HALF / 16)
 
-void static
-CALC (short *r, int *s)
+void 
+CALC (short *r, int *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
+  int len = mem ? SIZE : SIZE_HALF;
+  for (i = 0; i < len; i++)
     {
       r[i] = (i < SIZE) ? (short) s[i] : 0;
     }
@@ -29,6 +30,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_d) src;
   MASK_TYPE mask = MASK_VALUE;
   short res_ref[SIZE_HALF];
+  short res_ref2[SIZE_HALF];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -39,12 +41,16 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtepi32_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtepi32_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtepi32_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtepi32_storeu_epi16) (res4, mask, src.x);
-
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res1, res_ref))
     abort ();
@@ -53,10 +59,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res2, res_ref))
     abort ();
 
-  if (checkVs (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_w) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtepi32_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqb-2.c
index 892ad74e0d187f004ba0eb64cf7a39f4b1b680f6..8a9b4adaadeefa9d13893baf804c74dd7b524fce 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqb-2.c
@@ -14,7 +14,7 @@ CALC (char *r, long long *s, int mem)
 {
   int i;
   /* Don't zero out upper half if destination is memory.  */
-  int len = mem ? 8 : 16;
+  int len = mem ? SIZE : 16;
   for (i = 0; i < len; i++)
     {
       r[i] = (i < SIZE) ? (char) s[i] : 0;
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqd-2.c
index 57170faf8f84ba2ca77cc1b538a7f41387b00103..f0e4e1274833ab8206970f199149719c07f85acd 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqd-2.c
@@ -10,11 +10,12 @@
 #include "avx512f-mask-type.h"
 #define SIZE_HALF (AVX512F_LEN_HALF / 32)
 
-void static
-CALC (int *r, long long *s)
+void 
+CALC (int *r, long long *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
+  int len = mem ? SIZE : SIZE_HALF;
+  for (i = 0; i < len; i++)
     {
       r[i] = (i < SIZE) ? (int) s[i] : 0;
     }
@@ -29,6 +30,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_q) src;
   MASK_TYPE mask = MASK_VALUE;
   int res_ref[SIZE_HALF];
+  int res_ref2[SIZE_HALF];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -39,13 +41,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtepi64_epi32) (src.x);
   res2.x = INTRINSIC (_mask_cvtepi64_epi32) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtepi64_epi32) (mask, src.x);
-  INTRINSIC (_mask_cvtepi64_storeu_epi32) (res4, mask, src.x);
-
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res1, res_ref))
     abort ();
@@ -54,10 +60,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res2, res_ref))
     abort ();
 
-  if (checkVi (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtepi64_storeu_epi32) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_d) (res_ref2, mask, SIZE);
+  if (checkVi (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqw-2.c
index 27b816511da04971fe57876078bbc44f8e83c74e..c527a977948538d025f86f0fd7a358b1a3e88159 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovqw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovqw-2.c
@@ -9,11 +9,12 @@
 #define SIZE (AVX512F_LEN / 64)
 #include "avx512f-mask-type.h"
 
-static void
-CALC (short *r, long long *s)
+void
+CALC (short *r, long long *s, int mem)
 {
   int i;
-  for (i = 0; i < 8; i++)
+  int len = mem ? SIZE : 8;
+  for (i = 0; i < len; i++)
     {
       r[i] = (i < SIZE) ? (short) s[i] : 0;
     }
@@ -28,6 +29,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_q) src;
   MASK_TYPE mask = MASK_VALUE;
   short res_ref[8];
+  short res_ref2[8];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -38,12 +40,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 8; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtepi64_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtepi64_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtepi64_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtepi64_storeu_epi16) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_w) (res1, res_ref))
     abort ();
@@ -52,10 +59,14 @@ TEST (void)
   if (UNION_CHECK (128, i_w) (res2, res_ref))
     abort ();
 
-  if (checkVs (res4, res_ref, 8))
-    abort ();
-
   MASK_ZERO (i_w) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_w) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtepi64_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, 8))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdb-2.c
index 116c8b69e717d6095700edb1d392990efd26829f..09bdc46ec73305a113e2fef6dc7606ee20ccf0b8 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdb-2.c
@@ -10,19 +10,24 @@
 #include "avx512f-mask-type.h"
 #include <limits.h>
 
-static void
-CALC (char *r, int *s)
+void
+CALC (char *r, int *s, int mem)
 {
   int i;
-  for (i = 0; i < 16; i++)
+  int len = mem ? SIZE : 16;
+  for (i = 0; i < len; i++)
     {
-      if (s[i] < CHAR_MIN)
-	r[i] = CHAR_MIN;
-      else if (s[i] > CHAR_MAX)
-	r[i] = CHAR_MAX;
+      if (i < SIZE)
+	{
+	  if (s[i] < CHAR_MIN)
+	    r[i] = CHAR_MIN;
+	  else if (s[i] > CHAR_MAX)
+	    r[i] = CHAR_MAX;
+	  else
+	    r[i] = s[i];
+	}
       else
-	r[i] = s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
+	r[i] = 0;
     }
 }
 
@@ -35,6 +40,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_d) src;
   MASK_TYPE mask = MASK_VALUE;
   char res_ref[16];
+  char res_ref2[16];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -45,12 +51,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 16; i++)
+    {
+      res4[i] = DEFAULT_VALUE * 2;
+      res_ref2[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtsepi32_epi8) (src.x);
   res2.x = INTRINSIC (_mask_cvtsepi32_epi8) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtsepi32_epi8) (mask, src.x);
-  INTRINSIC (_mask_cvtsepi32_storeu_epi8) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_b) (res1, res_ref))
     abort ();
@@ -59,10 +70,14 @@ TEST (void)
   if (UNION_CHECK (128, i_b) (res2, res_ref))
     abort ();
 
-  if (checkVc (res4, res_ref, 16))
-    abort ();
-
   MASK_ZERO (i_b) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_b) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtsepi32_storeu_epi8) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_b) (res_ref2, mask, SIZE);
+  if (checkVc (res4, res_ref2, 16))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdw-2.c
index e175cce1c48bf6e98622d465f285b88d1591a214..d0edbd39c4d2fda881a9e74c2cb51642740a9f97 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsdw-2.c
@@ -11,19 +11,24 @@
 #define SIZE_HALF (AVX512F_LEN_HALF / 16)
 #include <limits.h>
 
-static void
-CALC (short *r, int *s)
+void
+CALC (short *r, int *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
+  int len = mem ? SIZE : SIZE_HALF;
+  for (i = 0; i < len; i++)
     {
-      if (s[i] < SHRT_MIN)
-	r[i] = SHRT_MIN;
-      else if (s[i] > SHRT_MAX)
-	r[i] = SHRT_MAX;
+      if (i < SIZE)
+	{
+	  if (s[i] < SHRT_MIN)
+	    r[i] = SHRT_MIN;
+	  else if (s[i] > SHRT_MAX)
+	    r[i] = SHRT_MAX;
+	  else
+	    r[i] = s[i];
+	}
       else
-	r[i] = s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
+	r[i] = 0;
     }
 }
 
@@ -36,6 +41,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_d) src;
   MASK_TYPE mask = MASK_VALUE;
   short res_ref[SIZE_HALF];
+  short res_ref2[SIZE_HALF];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -46,12 +52,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtsepi32_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtsepi32_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtsepi32_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtsepi32_storeu_epi16) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res1, res_ref))
     abort ();
@@ -60,10 +71,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res2, res_ref))
     abort ();
 
-  if (checkVs (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_w) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_w) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtsepi32_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqb-2.c
index babe6e22b99f1109336711947b5a8fe1effe8a5b..09b509616b261a21e9a8977dcac4bc8b34692dea 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqb-2.c
@@ -14,7 +14,7 @@ void static
 CALC (char *r, long long *s, int mem)
 {
   int i;
-  int len = mem ? 8 : 16;
+  int len = mem ? SIZE : 16;
   for (i = 0; i < len; i++)
     {
       if (s[i] < CHAR_MIN)
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqd-2.c
index 342f9cb76b52ef1e07372842f145dc1a55eb5ad7..dc2e89d66bb68ecefae77fc81bd1e00e6f53e7e2 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqd-2.c
@@ -11,19 +11,24 @@
 #define SIZE_HALF (AVX512F_LEN_HALF / 32)
 #include <limits.h>
 
-static void
-CALC (int *r, long long *s)
+void
+CALC (int *r, long long *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
+  int len = mem ? SIZE : SIZE_HALF; 
+  for (i = 0; i < len; i++)
     {
-      if (s[i] < INT_MIN)
-	r[i] = INT_MIN;
-      else if (s[i] > INT_MAX)
-	r[i] = INT_MAX;
+      if (i < SIZE)
+	{
+	  if (s[i] < INT_MIN)
+	    r[i] = INT_MIN;
+	  else if (s[i] > INT_MAX)
+	    r[i] = INT_MAX;
+	  else
+	    r[i] = s[i];
+	}
       else
-	r[i] = s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
+	r[i] = 0;
     }
 }
 
@@ -36,6 +41,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_q) src;
   MASK_TYPE mask = MASK_VALUE;
   int res_ref[SIZE_HALF];
+  int res_ref2[SIZE_HALF];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -46,12 +52,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res4[i] = DEFAULT_VALUE * 2;
+      res_ref2[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtsepi64_epi32) (src.x);
   res2.x = INTRINSIC (_mask_cvtsepi64_epi32) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtsepi64_epi32) (mask, src.x);
-  INTRINSIC (_mask_cvtsepi64_storeu_epi32) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res1, res_ref))
     abort ();
@@ -60,10 +71,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res2, res_ref))
     abort ();
 
-  if (checkVi (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_d) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtsepi64_storeu_epi32) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_d) (res_ref2, mask, SIZE);
+  if (checkVi (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqw-2.c
index bc1619a8308b44052d82e2f19abb2894db205ba9..a7b6b3674393786a3898a55e84be35ebf0a9beb0 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovsqw-2.c
@@ -10,11 +10,12 @@
 #include "avx512f-mask-type.h"
 #include <limits.h>
 
-void static
-CALC (short *r, long long *s)
+void 
+CALC (short *r, long long *s, int mem)
 {
   int i;
-  for (i = 0; i < 8; i++)
+  int len = mem ? SIZE : 8;
+  for (i = 0; i < len; i++)
     {
       if (s[i] < SHRT_MIN)
 	r[i] = SHRT_MIN;
@@ -35,6 +36,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_q) src;
   MASK_TYPE mask = MASK_VALUE;
   short res_ref[8];
+  short res_ref2[8];
 
   sign = -1;
   for (i = 0; i < SIZE; i++)
@@ -45,12 +47,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 8; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtsepi64_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtsepi64_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtsepi64_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtsepi64_storeu_epi16) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_w) (res1, res_ref))
     abort ();
@@ -59,10 +66,14 @@ TEST (void)
   if (UNION_CHECK (128, i_w) (res2, res_ref))
     abort ();
 
-  if (checkVs (res4, res_ref, 8))
-    abort ();
-
   MASK_ZERO (i_w) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_w) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtsepi64_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, 8))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdb-2.c
index 8907a72f3ea8317ff5217ce164a215ad9b6e49a9..5a201d31e2c5331a64cf8f6d702a0af825987eba 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdb-2.c
@@ -10,15 +10,13 @@
 #include "avx512f-mask-type.h"
 #include <limits.h>
 
-static void
-CALC (unsigned char *r, unsigned int *s)
+void
+CALC (unsigned char *r, unsigned int *s, int mem)
 {
   int i;
-  for (i = 0; i < 16; i++)
-    {
-      r[i] = (s[i] > UCHAR_MAX) ? UCHAR_MAX : s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
-    }
+  int len = mem ? SIZE : 16;
+  for (i = 0; i < len; i++)
+    r[i] = (i < SIZE) ? ((s[i] > UCHAR_MAX) ? UCHAR_MAX : s[i]) : 0;
 }
 
 void
@@ -30,6 +28,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_ud) src;
   MASK_TYPE mask = MASK_VALUE;
   unsigned char res_ref[16];
+  unsigned char res_ref2[16];
 
   for (i = 0; i < SIZE; i++)
     {
@@ -38,12 +37,16 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 16; i++)
+    {
+      res4[i] = DEFAULT_VALUE * 2;
+      res_ref2[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtusepi32_epi8) (src.x);
   res2.x = INTRINSIC (_mask_cvtusepi32_epi8) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtusepi32_epi8) (mask, src.x);
-  INTRINSIC (_mask_cvtusepi32_storeu_epi8) (res4, mask, src.x);
-
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_ub) (res1, res_ref))
     abort ();
@@ -52,10 +55,14 @@ TEST (void)
   if (UNION_CHECK (128, i_ub) (res2, res_ref))
     abort ();
 
-  if (checkVuc (res4, res_ref, 16))
-    abort ();
-
   MASK_ZERO (i_ub) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_ub) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtusepi32_storeu_epi8) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_b) (res_ref2, mask, SIZE);
+  if (checkVc (res4, res_ref2, 16))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdw-2.c
index c2c2624b498791f9603c4ddacc74076222a2ba80..a12bf475d403b920e0562e3e0423fd58b996316a 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusdw-2.c
@@ -11,15 +11,13 @@
 #define SIZE_HALF (AVX512F_LEN_HALF / 16)
 #include <limits.h>
 
-static void
-CALC (unsigned short *r, unsigned int *s)
+void
+CALC (unsigned short *r, unsigned int *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
-    {
-      r[i] = (s[i] > USHRT_MAX) ? USHRT_MAX : s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
-    }
+  int len = mem ? SIZE : SIZE_HALF;
+  for (i = 0; i < len; i++)
+    r[i] = (i < SIZE) ? ((s[i] > USHRT_MAX) ? USHRT_MAX : s[i]) : 0;
 }
 
 void
@@ -31,6 +29,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_ud) src;
   MASK_TYPE mask = MASK_VALUE;
   unsigned short res_ref[SIZE_HALF];
+  unsigned short res_ref2[SIZE_HALF];
 
   for (i = 0; i < SIZE; i++)
     {
@@ -39,12 +38,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtusepi32_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtusepi32_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtusepi32_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtusepi32_storeu_epi16) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_uw) (res1, res_ref))
     abort ();
@@ -53,10 +57,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_uw) (res2, res_ref))
     abort ();
 
-  if (checkVus (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_uw) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_uw) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtusepi32_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqb-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqb-2.c
index 8c20544524b7d6ee77ff1c516c587abc3e31ef80..4f2cef5aca150ab6585c6df42a5c34c1db01a575 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqb-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqb-2.c
@@ -14,12 +14,9 @@ static void
 CALC (unsigned char *r, unsigned long long *s, int mem)
 {
   int i;
-  int len = mem ? 8 : 16;
+  int len = mem ? SIZE : 16;
   for (i = 0; i < len; i++)
-    {
-      r[i] = (s[i] > UCHAR_MAX) ? UCHAR_MAX : s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
-    }
+    r[i] = (i < SIZE) ? ((s[i] > UCHAR_MAX) ? UCHAR_MAX : s[i]) : 0;
 }
 
 void
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqd-2.c
index f500ea3c2850234a9e0b17ab62d492b9d32dd9c8..3b494f060ebf99e9e4b007ea4c13b676f805c8d2 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqd-2.c
@@ -11,15 +11,13 @@
 #define SIZE_HALF (AVX512F_LEN_HALF / 32)
 #include <limits.h>
 
-static void
-CALC (unsigned int *r, unsigned long long *s)
+void
+CALC (unsigned int *r, unsigned long long *s, int mem)
 {
   int i;
-  for (i = 0; i < SIZE_HALF; i++)
-    {
-      r[i] = (s[i] > UINT_MAX) ? UINT_MAX : s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
-    }
+  int len = mem ? SIZE : SIZE_HALF;
+  for (i = 0; i < len; i++)
+    r[i] = (i < SIZE) ? ((s[i] > UINT_MAX) ? UINT_MAX : s[i]) : 0;
 }
 
 void
@@ -31,6 +29,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_uq) src;
   MASK_TYPE mask = MASK_VALUE;
   unsigned int res_ref[SIZE_HALF];
+  unsigned int res_ref2[SIZE_HALF];
 
   for (i = 0; i < SIZE; i++)
     {
@@ -39,12 +38,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < SIZE_HALF; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtusepi64_epi32) (src.x);
   res2.x = INTRINSIC (_mask_cvtusepi64_epi32) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtusepi64_epi32) (mask, src.x);
-  INTRINSIC (_mask_cvtusepi64_storeu_epi32) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (AVX512F_LEN_HALF, i_ud) (res1, res_ref))
     abort ();
@@ -53,10 +57,14 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN_HALF, i_ud) (res2, res_ref))
     abort ();
 
-  if (checkVui (res4, res_ref, SIZE_HALF))
-    abort ();
-
   MASK_ZERO (i_ud) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN_HALF, i_ud) (res3, res_ref))
     abort ();
+
+  CALC (res_ref2, src.a, 1);
+  INTRINSIC (_mask_cvtusepi64_storeu_epi32) (res4, mask, src.x);
+
+  MASK_MERGE (i_d) (res_ref2, mask, SIZE);
+  if (checkVi (res4, res_ref2, SIZE_HALF))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqw-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqw-2.c
index c1ce9ed65bc313e1b47bbef2e252d0e6538b5859..7caff1e229888dc8883990c58d0df6597cbe28f8 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqw-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpmovusqw-2.c
@@ -10,15 +10,13 @@
 #include "avx512f-mask-type.h"
 #include <limits.h>
 
-static void
-CALC (unsigned short *r, unsigned long long *s)
+void
+CALC (unsigned short *r, unsigned long long *s, int mem)
 {
   int i;
-  for (i = 0; i < 8; i++)
-    {
-      r[i] = (s[i] > USHRT_MAX) ? USHRT_MAX : s[i];
-      r[i] = (i < SIZE) ? r[i] : 0;
-    }
+  int len = mem ? SIZE : 8;
+  for (i = 0; i < len; i++)
+    r[i] = (i < SIZE) ? ((s[i] > USHRT_MAX) ? USHRT_MAX : s[i]) : 0;
 }
 
 void
@@ -30,6 +28,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN, i_uq) src;
   MASK_TYPE mask = MASK_VALUE;
   unsigned short res_ref[8];
+  unsigned short res_ref2[8];
 
   for (i = 0; i < SIZE; i++)
     {
@@ -38,12 +37,17 @@ TEST (void)
       res4[i] = DEFAULT_VALUE;
     }
 
+  for (i = SIZE; i < 8; i++)
+    {
+      res_ref2[i] = DEFAULT_VALUE * 2;
+      res4[i] = DEFAULT_VALUE * 2;
+    }
+
   res1.x = INTRINSIC (_cvtusepi64_epi16) (src.x);
   res2.x = INTRINSIC (_mask_cvtusepi64_epi16) (res2.x, mask, src.x);
   res3.x = INTRINSIC (_maskz_cvtusepi64_epi16) (mask, src.x);
-  INTRINSIC (_mask_cvtusepi64_storeu_epi16) (res4, mask, src.x);
 
-  CALC (res_ref, src.a);
+  CALC (res_ref, src.a, 0);
 
   if (UNION_CHECK (128, i_uw) (res1, res_ref))
     abort ();
@@ -52,10 +56,14 @@ TEST (void)
   if (UNION_CHECK (128, i_uw) (res2, res_ref))
     abort ();
 
-  if (checkVus (res4, res_ref, 8))
-    abort ();
-
   MASK_ZERO (i_uw) (res_ref, mask, SIZE);
   if (UNION_CHECK (128, i_uw) (res3, res_ref))
     abort ();
+
+  INTRINSIC (_mask_cvtusepi64_storeu_epi16) (res4, mask, src.x);
+  CALC (res_ref2, src.a, 1);
+
+  MASK_MERGE (i_w) (res_ref2, mask, SIZE);
+  if (checkVs (res4, res_ref2, 8))
+    abort ();
 }
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpord-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpord-2.c
index 5656a81e3fb9a5e36042bbcbdd2ee475af232b0a..86dbfa7fef29b45fa5864aa74e6cf557258b75ce 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpord-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpord-2.c
@@ -34,18 +34,22 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_or_si512) (s1.x, s2.x);
   res2.x = INTRINSIC (_or_epi32) (s1.x, s2.x);
+#endif
   res3.x = INTRINSIC (_mask_or_epi32) (res3.x, mask, s1.x, s2.x);
   res4.x = INTRINSIC (_maskz_or_epi32) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
     abort ();
 
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
     abort ();
+#endif
 
   MASK_MERGE (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vporq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vporq-2.c
index 9af7172e31c23008ab5fd9861cfce7914b794725..86dc1abd18b9c7367a90bee899e88ce30e4af795 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vporq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vporq-2.c
@@ -33,15 +33,18 @@ TEST (void)
       sign = -sign;
       res2.a[i] = DEFAULT_VALUE;
     }
-
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_or_epi64) (s1.x, s2.x);
+#endif
   res2.x = INTRINSIC (_mask_or_epi64) (res2.x, mask, s1.x, s2.x);
   res3.x = INTRINSIC (_maskz_or_epi64) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
       abort ();
+#endif
 
   MASK_MERGE (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpxord-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpxord-2.c
index fa431aed14087419d3eaf055c00ce447a432371a..44ca56c63280f0b86c0c9057ecf8a08d7ff9aa27 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpxord-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpxord-2.c
@@ -34,18 +34,22 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_xor_si512) (s1.x, s2.x);
   res2.x = INTRINSIC (_xor_epi32) (s1.x, s2.x);
+#endif
   res3.x = INTRINSIC (_mask_xor_epi32) (res3.x, mask, s1.x, s2.x);
   res4.x = INTRINSIC (_maskz_xor_epi32) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
     abort ();
 
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
     abort ();
+#endif
 
   MASK_MERGE (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vpxorq-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vpxorq-2.c
index ef605476bbcd2fee2e8755dcff11fbfb853eb325..c35d019089e75b479d13dad84dd5779095046361 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vpxorq-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vpxorq-2.c
@@ -34,14 +34,18 @@ TEST (void)
       res2.a[i] = DEFAULT_VALUE;
     }
 
+#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_xor_epi64) (s1.x, s2.x);
+#endif
   res2.x = INTRINSIC (_mask_xor_epi64) (res2.x, mask, s1.x, s2.x);
   res3.x = INTRINSIC (_maskz_xor_epi64) (mask, s1.x, s2.x);
 
   CALC (s1.a, s2.a, res_ref);
 
+#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
-      abort ();
+    abort ();
+#endif
 
   MASK_MERGE (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vrndscalepd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vrndscalepd-2.c
index d882d2fb2edf2b7acf52accfef8d8b12ae106030..0aaca4320450817afde6980402ec5c101f2cd9d6 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vrndscalepd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vrndscalepd-2.c
@@ -64,12 +64,16 @@ TEST (void)
 	case 1:
 	  imm = _MM_FROUND_FLOOR;
 	  res1.x = INTRINSIC (_floor_pd) (s.x);
-	  res2.x = INTRINSIC (_mask_floor_pd) (res2.x, mask, s.x);
+	  #if AVX512F_LEN == 512
+	    res2.x = INTRINSIC (_mask_floor_pd) (res2.x, mask, s.x);
+	  #endif
 	  break;
 	case 2:
 	  imm = _MM_FROUND_CEIL;
 	  res1.x = INTRINSIC (_ceil_pd) (s.x);
-	  res2.x = INTRINSIC (_mask_ceil_pd) (res2.x, mask, s.x);
+	  #if AVX512F_LEN == 512
+	    res2.x = INTRINSIC (_mask_ceil_pd) (res2.x, mask, s.x);
+	  #endif
 	  break;
 	}
 
@@ -80,8 +84,13 @@ TEST (void)
 
       MASK_MERGE(d) (res_ref,mask,SIZE );
 
-      if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
-	abort ();
+      #if AVX512F_LEN == 512
+	if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+	  abort ();
+      #else
+	if (!i && UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
+	  abort ();
+      #endif
 
       MASK_ZERO(d) (res_ref,mask,SIZE );
 
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vrndscaleps-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vrndscaleps-2.c
index ca8edad8f406326ecaf4b26b015ddc1348457eb0..470313d97419ada2314ef982866c801909c64045 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vrndscaleps-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vrndscaleps-2.c
@@ -38,7 +38,7 @@ TEST (void)
   UNION_TYPE (AVX512F_LEN,) res1, res2, res3, s;
   float res_ref[SIZE];
 
-  MASK_TYPE mask = 6 ^ (0xffff >> SIZE);
+  MASK_TYPE mask = MASK_VALUE;
 
   imm = _MM_FROUND_FLOOR | (7 << 4);
 
@@ -64,12 +64,16 @@ TEST (void)
 	case 1:
 	  imm = _MM_FROUND_FLOOR;
 	  res1.x = INTRINSIC (_floor_ps) (s.x);
-	  res2.x = INTRINSIC (_mask_floor_ps) (res2.x, mask, s.x);
+	  #if AVX512F_LEN == 512
+	    res2.x = INTRINSIC (_mask_floor_ps) (res2.x, mask, s.x);
+	  #endif
 	  break;
 	case 2:
 	  imm = _MM_FROUND_CEIL;
 	  res1.x = INTRINSIC (_ceil_ps) (s.x);
-	  res2.x = INTRINSIC (_mask_ceil_ps) (res2.x, mask, s.x);
+	  #if AVX512F_LEN == 512
+	    res2.x = INTRINSIC (_mask_ceil_ps) (res2.x, mask, s.x);
+	  #endif
 	  break;
 	}
 
@@ -80,8 +84,13 @@ TEST (void)
 
       MASK_MERGE ()(res_ref, mask, SIZE);
 
-      if (UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
-	abort ();
+      #if AVX512F_LEN == 512
+	if (UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
+	  abort ();
+      #else
+	if (!i && UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
+	  abort ();
+      #endif
 
       MASK_ZERO ()(res_ref, mask, SIZE);
 
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vshuff32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vshuff32x4-2.c
index fa976260af497df5fa3d4060432c0f9bbbd6cdb8..d9b44b369e2dbcc1dfaa709f69576a5254a1f43c 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vshuff32x4-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vshuff32x4-2.c
@@ -38,7 +38,11 @@ TEST (void)
   MASK_TYPE mask = MASK_VALUE;
   float e[SIZE];
   int i;
+#if AVX512F_LEN == 512
   int imm = 203;
+#else
+  int imm = 1;
+#endif
 
   for (i = 0; i < SIZE; i++)
     {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vshuff64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vshuff64x2-2.c
index 9f5e093b39b37c68849caf32d96f6fd5868ff878..a4427fd48659b95d16faee0f911ef8ea7cd767a9 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vshuff64x2-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vshuff64x2-2.c
@@ -38,7 +38,11 @@ TEST (void)
   MASK_TYPE mask = MASK_VALUE;
   double e[SIZE];
   int i;
+#if AVX512F_LEN == 512
   int imm = 203;
+#else
+  int imm = 1;
+#endif
 
   for (i = 0; i < SIZE; i++)
     {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vshufi32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vshufi32x4-2.c
index b51eec7d97f5db662f0e06a0bfbcc3cb0c9a2933..00641707b1c212b1dad6792d3cb58518aa7987e3 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vshufi32x4-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vshufi32x4-2.c
@@ -38,7 +38,11 @@ TEST (void)
   MASK_TYPE mask = MASK_VALUE;
   int e[SIZE];
   int i;
+#if AVX512F_LEN == 512
   int imm = 203;
+#else
+  int imm = 1;
+#endif
 
   for (i = 0; i < SIZE; i++)
     {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vshufi64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vshufi64x2-2.c
index 5428eaeeb6089a416958d7cd77ee34f2233a2cda..f35a0418f5b1c0796dfdfb6abe00bbc30c95ff29 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vshufi64x2-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vshufi64x2-2.c
@@ -38,7 +38,11 @@ TEST (void)
   MASK_TYPE mask = MASK_VALUE;
   long long e[SIZE];
   int i;
+#if AVX512F_LEN == 512
   int imm = 203;
+#else
+  int imm = 1;
+#endif
 
   for (i = 0; i < SIZE; i++)
     {
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-vshufpd-2.c b/gcc/testsuite/gcc.target/i386/avx512f-vshufpd-2.c
index 3645fd7e21a9e42a0d3eaf379d78b584a0ed49a9..9ebc4d8f0c69358e1780e47649cf995ba2dea608 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-vshufpd-2.c
+++ b/gcc/testsuite/gcc.target/i386/avx512f-vshufpd-2.c
@@ -8,6 +8,15 @@
 
 #define SIZE (AVX512F_LEN / 64)
 #include "avx512f-mask-type.h"
+
+#if AVX512F_LEN > 256
+  #define IMM_VAR 120
+#elif AVX512F_LEN > 128
+  #define IMM_VAR 5
+#else
+  #define IMM_VAR 1
+#endif
+
 void static
 CALC (double *e, UNION_TYPE (AVX512F_LEN, d) s1,
       UNION_TYPE (AVX512F_LEN, d) s2, int imm)
@@ -43,10 +52,10 @@ TEST (void)
       u3.a[i] = DEFAULT_VALUE;
     }
 
-  u1.x = INTRINSIC (_shuffle_pd) (s1.x, s2.x, 120);
-  u2.x = INTRINSIC (_mask_shuffle_pd) (u2.x, mask, s1.x, s2.x, 120);
-  u3.x = INTRINSIC (_maskz_shuffle_pd) (mask, s1.x, s2.x, 120);
-  CALC (e, s1, s2, 120);
+  u1.x = INTRINSIC (_shuffle_pd) (s1.x, s2.x, IMM_VAR);
+  u2.x = INTRINSIC (_mask_shuffle_pd) (u2.x, mask, s1.x, s2.x, IMM_VAR);
+  u3.x = INTRINSIC (_maskz_shuffle_pd) (mask, s1.x, s2.x, IMM_VAR);
+  CALC (e, s1, s2, IMM_VAR);
 
   if (UNION_CHECK (AVX512F_LEN, d) (u1, e))
     abort ();
@@ -59,3 +68,5 @@ TEST (void)
   if (UNION_CHECK (AVX512F_LEN, d) (u3, e))
     abort ();
 }
+
+#undef IMM_VAR
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-check.h b/gcc/testsuite/gcc.target/i386/avx512vl-check.h
new file mode 100644
index 0000000000000000000000000000000000000000..c017ee28e47d7b2c7f3b92f49aafae4c869b09ce
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-check.h
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include "cpuid.h"
+#include "m512-check.h"
+#include "avx512f-os-support.h"
+
+static void avx512vl_test (void);
+
+static void __attribute__ ((noinline)) do_test (void)
+{
+  avx512vl_test ();
+}
+
+int
+main ()
+{
+  unsigned int eax, ebx, ecx, edx;
+
+  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+    return 0;
+
+  /* Run avx512vl test only if host has avx512vl support.  */
+  if ((ecx & bit_OSXSAVE) == (bit_OSXSAVE))
+    {
+      if (__get_cpuid_max (0, NULL) < 7)
+	return 0;
+
+      __cpuid_count (7, 0, eax, ebx, ecx, edx);
+
+      if ((avx512f_os_support ())
+	  && ((ebx & bit_AVX512F) == bit_AVX512F)
+	  && ((ebx & bit_AVX512VL) == bit_AVX512VL))
+	{
+	  do_test ();
+#ifdef DEBUG
+	  printf ("PASSED\n");
+#endif
+	  return 0;
+	}
+#ifdef DEBUG
+      printf ("SKIPPED\n");
+#endif
+    }
+#ifdef DEBUG
+  else
+    printf ("SKIPPED\n");
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-gather-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-gather-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cb70057591269cd4284118ab7401dfc59c620754
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-gather-1.c
@@ -0,0 +1,217 @@
+/* { dg-do run } */
+/* { dg-require-effective-target avx512vl } */
+/* { dg-options "-O3 -mavx512vl" } */
+
+#include "avx512vl-check.h"
+
+#define N 12
+float vf1[N+4], vf2[N];
+double vd1[N+4], vd2[N];
+int vi1[N+4], vi2[N], k[N];
+long long vl1[N+4], vl2[N];
+long l[N];
+
+__attribute__((noinline, noclone)) void
+f1 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vf2[i] = vf1[k[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f2 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vi2[i] = vi1[k[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f3 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vf2[i] = vf1[k[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f4 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vi2[i] = vi1[k[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f5 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vd2[i] = vd1[k[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f6 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vl2[i] = vl1[k[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f7 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vd2[i] = vd1[k[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f8 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vl2[i] = vl1[k[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f9 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vf2[i] = vf1[l[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f10 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vi2[i] = vi1[l[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f11 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vf2[i] = vf1[l[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f12 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vi2[i] = vi1[l[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f13 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vd2[i] = vd1[l[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f14 (void)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vl2[i] = vl1[l[i]];
+}
+
+__attribute__((noinline, noclone)) void
+f15 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vd2[i] = vd1[l[i] + x];
+}
+
+__attribute__((noinline, noclone)) void
+f16 (int x)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    vl2[i] = vl1[l[i] + x];
+}
+
+static void
+avx512vl_test (void)
+{
+  int i;
+
+  for (i = 0; i < N + 4; i++)
+    {
+      asm ("");
+      vf1[i] = 17.0f + i;
+      vd1[i] = 19.0 + i;
+      vi1[i] = 21 + i;
+      vl1[i] = 23L + i;
+    }
+  for (i = 0; i < N; i++)
+    {
+      asm ("");
+      k[i] = (i * 731) & (N - 1);
+      l[i] = (i * 657) & (N - 1);
+    }
+
+  f1 ();
+  f2 ();
+  for (i = 0; i < N; i++)
+    if (vf2[i] != ((i * 731) & (N - 1)) + 17
+	|| vi2[i] != ((i * 731) & (N - 1)) + 21)
+      abort ();
+
+  f3 (1);
+  f4 (2);
+  for (i = 0; i < N; i++)
+    if (vf2[i] != ((i * 731) & (N - 1)) + 17 + 1
+	|| vi2[i] != ((i * 731) & (N - 1)) + 21 + 2)
+      abort ();
+
+  f5 ();
+  f6 ();
+  for (i = 0; i < N; i++)
+    if (vd2[i] != ((i * 731) & (N - 1)) + 19
+	|| vl2[i] != ((i * 731) & (N - 1)) + 23)
+      abort ();
+
+  f7 (3);
+  f8 (2);
+  for (i = 0; i < N; i++)
+    if (vd2[i] != ((i * 731) & (N - 1)) + 19 + 3
+	|| vl2[i] != ((i * 731) & (N - 1)) + 23 + 2)
+      abort ();
+
+  f9 ();
+  f10 ();
+  for (i = 0; i < N; i++)
+    if (vf2[i] != ((i * 657) & (N - 1)) + 17
+	|| vi2[i] != ((i * 657) & (N - 1)) + 21)
+      abort ();
+
+  f11 (4);
+  f12 (1);
+  for (i = 0; i < N; i++)
+    if (vf2[i] != ((i * 657) & (N - 1)) + 17 + 4
+	|| vi2[i] != ((i * 657) & (N - 1)) + 21 + 1)
+      abort ();
+
+  f13 ();
+  f14 ();
+  for (i = 0; i < N; i++)
+    if (vd2[i] != ((i * 657) & (N - 1)) + 19
+	|| vl2[i] != ((i * 657) & (N - 1)) + 23)
+      abort ();
+
+  f15 (2);
+  f16 (4);
+  for (i = 0; i < N; i++)
+    if (vd2[i] != ((i * 657) & (N - 1)) + 19 + 2
+	|| vl2[i] != ((i * 657) & (N - 1)) + 23 + 4)
+      abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..880f5eff35bdb57acb87c241f971e925ed2954dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherd-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpgatherdd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpgatherdd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1, idx1;
+volatile __m128i x2, idx2;
+volatile __mmask8 m8;
+int *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i32gather_epi32 (x1, 0xFF, idx1, base, 8);
+  x1 = _mm256_mmask_i32gather_epi32 (x1, m8, idx1, base, 8);
+  x2 = _mm_mmask_i32gather_epi32 (x2, 0xFF, idx2, base, 8);
+  x2 = _mm_mmask_i32gather_epi32 (x2, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..48e7f21711902b1637d64c9796bfd24a8f19b4eb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherpd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgatherdpd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vgatherdpd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __m128i idx;
+volatile __mmask8 m8;
+double *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i32gather_pd (x1, 0xFF, idx, base, 8);
+  x1 = _mm256_mmask_i32gather_pd (x1, m8, idx, base, 8);
+  x2 = _mm_mmask_i32gather_pd (x2, 0xFF, idx, base, 8);
+  x2 = _mm_mmask_i32gather_pd (x2, m8, idx, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..fcd0a583287f61e9c9e55a63a3efb1f6ce7482c2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgatherdps\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vgatherdps\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+float *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i32gather_ps (x1, 0xFF, idx1, base, 8);
+  x1 = _mm256_mmask_i32gather_ps (x1, m8, idx1, base, 8);
+  x2 = _mm_mmask_i32gather_ps (x2, 0xFF, idx2, base, 8);
+  x2 = _mm_mmask_i32gather_ps (x2, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..771909cc7e451c6efb957df06d5fd80634c7d934
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32gatherq-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpgatherdq\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpgatherdq\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1;
+volatile __m128i x2, idx;
+volatile __mmask8 m8;
+long long *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i32gather_epi64 (x1, 0xFF, idx, base, 8);
+  x1 = _mm256_mmask_i32gather_epi64 (x1, m8, idx, base, 8);
+  x2 = _mm_mmask_i32gather_epi64 (x2, 0xFF, idx, base, 8);
+  x2 = _mm_mmask_i32gather_epi64 (x2, m8, idx, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..761c7698751009f8175afc04580b47bbdf7d8065
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpscatterdd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpscatterdd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i src1, idx1;
+volatile __m128i src2, idx2;
+volatile __mmask8 m8;
+int *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i32scatter_epi32 (addr, idx1, src1, 8);
+  _mm256_mask_i32scatter_epi32 (addr, m8, idx1, src1, 8);
+
+  _mm_i32scatter_epi32 (addr, idx2, src2, 8);
+  _mm_mask_i32scatter_epi32 (addr, m8, idx2, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..914ad8d591bdf7d47ee36129f686f5dc1c013f8d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vscatterdpd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vscatterdpd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256d src1;
+volatile __m128d src2;
+volatile __m128i idx;
+volatile __mmask8 m8;
+double *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i32scatter_pd (addr, idx, src1, 8);
+  _mm256_mask_i32scatter_pd (addr, m8, idx, src1, 8);
+
+  _mm_i32scatter_pd (addr, idx, src2, 8);
+  _mm_mask_i32scatter_pd (addr, m8, idx, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..72de9dd7f32d0a573c02aef33ed9080e6aeb0198
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterps-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vscatterdps\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vscatterdps\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256 src1;
+volatile __m128 src2;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+float *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i32scatter_ps (addr, idx1, src1, 8);
+  _mm256_mask_i32scatter_ps (addr, m8, idx1, src1, 8);
+
+  _mm_i32scatter_ps (addr, idx2, src2, 8);
+  _mm_mask_i32scatter_ps (addr, m8, idx2, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1eb8eae90e9e3f4d6b5059e01b249fa8b1c1aa1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i32scatterq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpscatterdq\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpscatterdq\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i src1;
+volatile __m128i src2, idx;
+volatile __mmask8 m8;
+long long *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i32scatter_epi64 (addr, idx, src1, 8);
+  _mm256_mask_i32scatter_epi64 (addr, m8, idx, src1, 8);
+
+  _mm_i32scatter_epi64 (addr, idx, src2, 8);
+  _mm_mask_i32scatter_epi64 (addr, m8, idx, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a11520c29481837cf687597bb6d2fafde58ed3fc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherd-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpgatherqd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpgatherqd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i idx1;
+volatile __m128i idx2, x;
+volatile __mmask8 m8;
+int *base;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mmask_i64gather_epi32 (x, 0xFF, idx1, base, 8);
+  x = _mm256_mmask_i64gather_epi32 (x, m8, idx1, base, 8);
+  x = _mm_mmask_i64gather_epi32 (x, 0xFF, idx2, base, 8);
+  x = _mm_mmask_i64gather_epi32 (x, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b1b2cf68437a6074d989261b3f9bd49581be944
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgatherqpd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vgatherqpd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+double *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i64gather_pd (x1, 0xFF, idx1, base, 8);
+  x1 = _mm256_mmask_i64gather_pd (x1, m8, idx1, base, 8);
+  x2 = _mm_mmask_i64gather_pd (x2, 0xFF, idx2, base, 8);
+  x2 = _mm_mmask_i64gather_pd (x2, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b8f6fec181afc9b3fa03bf66e498b2ac3993dd1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherps-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgatherqps\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vgatherqps\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m128 x;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+float *base;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mmask_i64gather_ps (x, 0xFF, idx1, base, 8);
+  x = _mm256_mmask_i64gather_ps (x, m8, idx1, base, 8);
+  x = _mm_mmask_i64gather_ps (x, 0xFF, idx2, base, 8);
+  x = _mm_mmask_i64gather_ps (x, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ccdb416ffed94566471187efbc163c862df34573
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64gatherq-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpgatherqq\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]{%k\[1-7\]}" 2} } */
+/* { dg-final { scan-assembler-times "vpgatherqq\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1, idx1;
+volatile __m128i x2, idx2;
+volatile __mmask8 m8;
+long long *base;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mmask_i64gather_epi64 (x1, 0xFF, idx1, base, 8);
+  x1 = _mm256_mmask_i64gather_epi64 (x1, m8, idx1, base, 8);
+  x2 = _mm_mmask_i64gather_epi64 (x2, 0xFF, idx2, base, 8);
+  x2 = _mm_mmask_i64gather_epi64 (x2, m8, idx2, base, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a124eced243a4c203c8c1bc91ffb8fd29409a0a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpscatterqd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpscatterqd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i idx1;
+volatile __m128i idx2, src;
+volatile __mmask8 m8;
+int *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i64scatter_epi32 (addr, idx1, src, 8);
+  _mm256_mask_i64scatter_epi32 (addr, m8, idx1, src, 8);
+
+  _mm_i64scatter_epi32 (addr, idx2, src, 8);
+  _mm_mask_i64scatter_epi32 (addr, m8, idx2, src, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..20e9babb8bda6859dd4e7c8a0484d48505706430
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterpd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vscatterqpd\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vscatterqpd\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256d src1;
+volatile __m128d src2;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+double *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i64scatter_pd (addr, idx1, src1, 8);
+  _mm256_mask_i64scatter_pd (addr, m8, idx1, src1, 8);
+
+  _mm_i64scatter_pd (addr, idx2, src2, 8);
+  _mm_mask_i64scatter_pd (addr, m8, idx2, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..53bac89e709da556ec4421dbff53fef365e4c592
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vscatterqps\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vscatterqps\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m128 src;
+volatile __m256i idx1;
+volatile __m128i idx2;
+volatile __mmask8 m8;
+float *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i64scatter_ps (addr, idx1, src, 8);
+  _mm256_mask_i64scatter_ps (addr, m8, idx1, src, 8);
+
+  _mm_i64scatter_ps (addr, idx2, src, 8);
+  _mm_mask_i64scatter_ps (addr, m8, idx2, src, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4235835857a26a8196936d9276e28e9e75635541
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-i64scatterq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpscatterqq\[ \\t\]+\[^\n\]*ymm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+/* { dg-final { scan-assembler-times "vpscatterqq\[ \\t\]+\[^\n\]*xmm\[0-9\]\[^\n\]*xmm\[0-9\]\[^\n\]*{%k\[1-7\]}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256i src1, idx1;
+volatile __m128i src2, idx2;
+volatile __mmask8 m8;
+long long *addr;
+
+void extern
+avx512vl_test (void)
+{
+  _mm256_i64scatter_epi64 (addr, idx1, src1, 8);
+  _mm256_mask_i64scatter_epi64 (addr, m8, idx1, src1, 8);
+
+  _mm_i64scatter_epi64 (addr, idx2, src2, 8);
+  _mm_mask_i64scatter_epi64 (addr, m8, idx2, src2, 8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f28ff3560613a314afaade4d90b0363c3579c187
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vaddpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vaddpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vaddpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vaddpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128d x128;
+volatile __m256d x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_mask_add_pd (x128, m, x128, x128);
+  x128 = _mm_maskz_add_pd (m, x128, x128);
+
+  x256 = _mm256_mask_add_pd (x256, m, x256, x256);
+  x256 = _mm256_maskz_add_pd (m, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9fd14be84abfeeb4f66db7bae0d2d5537d3affc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vaddpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vaddpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vaddpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c9f23e1e85b4db1b5556b652e685402ebdd945c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vaddps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vaddps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vaddps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vaddps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128 x128;
+volatile __m256 x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_mask_add_ps (x128, m, x128, x128);
+  x128 = _mm_maskz_add_ps (m, x128, x128);
+
+  x256 = _mm256_mask_add_ps (x256, m, x256, x256);
+  x256 = _mm256_maskz_add_ps (m, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0c2b7f18d6bf2e2507a38b17db7d8377eb258844
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vaddps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vaddps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vaddps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-valignd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-valignd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b48abe180ce7a04403c0a70d50f6aa95e707b33
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-valignd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "valignd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_alignr_epi32 (y, y, 3);
+  y = _mm256_mask_alignr_epi32 (y, m, y, y, 3);
+  y = _mm256_maskz_alignr_epi32 (m, y, y, 3);
+
+  x = _mm_alignr_epi32 (x, x, 3);
+  x = _mm_mask_alignr_epi32 (x, m, x, x, 3);
+  x = _mm_maskz_alignr_epi32 (m, x, x, 3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-valignd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-valignd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef7c67830f4343c7e3eb47a0e796c4c980e63a72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-valignd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-valignd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-valignd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-valignq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-valignq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..909eaddcec5a212736ba8e86fc55da71b77dd14d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-valignq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "valignq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_alignr_epi64 (y, y, 3);
+  y = _mm256_mask_alignr_epi64 (y, m, y, y, 3);
+  y = _mm256_maskz_alignr_epi64 (m, y, y, 3);
+
+  x = _mm_alignr_epi64 (x, x, 1);
+  x = _mm_mask_alignr_epi64 (x, m, x, x, 1);
+  x = _mm_maskz_alignr_epi64 (m, x, x, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-valignq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-valignq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b59cbf0bc5e7cf11d7fb3f49df1a9954b515cb62
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-valignq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-valignq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-valignq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vandnpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vandnpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..72a4ccae28c0f2fdcd19e730d5e13ee7497853d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vandnpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandnpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandnpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vandnps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vandnps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..77950d0e25151c5d8e7878944038af45376f9ebc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vandnps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandnps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandnps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vandpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vandpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..44716b328f6825c9a681937237246a129d01ddf2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vandpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vandps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vandps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ec8ee9e719bb12919337ae8b93220b231663e9f7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vandps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vandps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed8b670a20d2984b122b2dadb1d21052fb9c7051
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vblendmpd|vmovapd)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vblendmpd|vmovapd)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_blend_pd (m, x, x);
+  xx = _mm_mask_blend_pd (m, xx, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..56b80b114872a41a177107550f080b0e6275a9cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vblendmpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vblendmpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a43d477365148bcf31ae315fe60df67614970d8e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vblendmps|vmovaps)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vblendmps|vmovaps)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_blend_ps (m, x, x);
+  xx = _mm_mask_blend_ps (m, xx, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..16a40f8d68c18e51570acd456e85e3be43e53f79
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vblendmps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vblendmps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vblendmps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7afe2015040b24d837f539b177f53e45d6980ea9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vbroadcastf32x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..135975f77ae78032818976b8f947958dd7ed0ccb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]|vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastf32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}|vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_broadcast_f32x4 (y);
+  x = _mm256_mask_broadcast_f32x4 (x, m, y);
+  x = _mm256_maskz_broadcast_f32x4 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5bc7e2c739e6b1aa58012e94a9e5e6c21527d80
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -mavx512dq -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vbroadcastf32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..df9893779d55997b81ddd522e7b1a0700e416b1d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastf64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vbroadcastf64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..90469664a2c2a4df231f9b4c166e68279f075af8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x2-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vbroadcasti32x2-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vbroadcasti32x2-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ae6945d19752585b19ef23981688df6c0b62dd09
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]|vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcasti32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}|vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_broadcast_i32x4 (y);
+  x = _mm256_mask_broadcast_i32x4 (x, m, y);
+  x = _mm256_maskz_broadcast_i32x4 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..feca66049c4ca1724512bf3c5e91d05a4afd8f09
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -mavx512dq -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vbroadcasti32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..eded7cb8046c689153e43478f0d2008e9f17afd8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcasti64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vbroadcasti64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..08cd026e8d4c0d45cf9c4d1e0076119b97e18a57
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_broadcastsd_pd (y);
+  x = _mm256_mask_broadcastsd_pd (x, m, y);
+  x = _mm256_maskz_broadcastsd_pd (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1655482c13ddb6b6d22d463e8a956625b8cd4f5b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastsd-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vbroadcastsd-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0cbb7bf51ec8f8dbc1878ce3c57fb6dce034348c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vbroadcastss\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_broadcastss_ps (y);
+  x = _mm256_mask_broadcastss_ps (x, m, y);
+  x = _mm256_maskz_broadcastss_ps (m, y);
+  y = _mm_broadcastss_ps (y);
+  y = _mm_mask_broadcastss_ps (y, m, y);
+  y = _mm_maskz_broadcastss_ps (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6dae6ff9ce07acd9a2d44d23cdf2af5e1dbcc65
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vbroadcastss-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vbroadcastss-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vbroadcastss-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3195e930432d1a3aacd26d7961ee982bf8015200
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vcmppd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vcmppd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vcmppd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vcmppd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm256_cmp_pd_mask (x, x, _CMP_FALSE_OQ);
+  m = _mm256_mask_cmp_pd_mask (m, x, x, _CMP_FALSE_OQ);
+  m = _mm_cmp_pd_mask (xx, xx, _CMP_FALSE_OQ);
+  m = _mm_mask_cmp_pd_mask (m, xx, xx, _CMP_FALSE_OQ);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2c4937ffeb7fd358fb6f97b1f007a1fb0177f8b6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcmppd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcmppd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcmppd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7bb6d42b450d7fd6d1e28b834c8de20ceee31ceb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vcmpps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vcmpps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vcmpps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vcmpps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm256_cmp_ps_mask (x, x, _CMP_FALSE_OQ);
+  m = _mm256_mask_cmp_ps_mask (m, x, x, _CMP_FALSE_OQ);
+  m = _mm_cmp_ps_mask (xx, xx, _CMP_FALSE_OQ);
+  m = _mm_mask_cmp_ps_mask (m, xx, xx, _CMP_FALSE_OQ);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a726dfd81483467777211de481c8cdbdd47652a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcmpps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcmpps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcmpps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ad837a1351144cc1ee1ae58afe5b473c24852747
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompresspd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+double *p;
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_compress_pd (x1, m, x1);
+  x2 = _mm_mask_compress_pd (x2, m, x2);
+
+  x1 = _mm256_maskz_compress_pd (m, x1);
+  x2 = _mm_maskz_compress_pd (m, x2);
+
+  _mm256_mask_compressstoreu_pd (p, m, x1);
+  _mm_mask_compressstoreu_pd (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..eee9bfb447ba3193908df67873b8c6c6bcb58b9b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcompresspd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcompresspd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcompresspd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..785f5160b4eff8871a15cc910e76a706f4cd7e86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcompressps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+float *p;
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_compress_ps (x1, m, x1);
+  x2 = _mm_mask_compress_ps (x2, m, x2);
+
+  x1 = _mm256_maskz_compress_ps (m, x1);
+  x2 = _mm_maskz_compress_ps (m, x2);
+
+  _mm256_mask_compressstoreu_ps (p, m, x1);
+  _mm_mask_compressstoreu_ps (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..67c7790436be8c8dd965ab15fa818e41540a96b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcompressps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcompressps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcompressps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c8cfd33facf54ad225afb47e6cdb161c83a2ae9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtdq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s;
+volatile __m256d res1;
+volatile __m128d res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi32_pd (res1, m, s);
+  res2 = _mm_mask_cvtepi32_pd (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi32_pd (m, s);
+  res2 = _mm_maskz_cvtepi32_pd (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d45492799b66ed362c8e4810fde88ce4d87b078
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtdq2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtdq2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..82aa1cc58bb3a7d720c5346ed1693514520fbc7d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtdq2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtdq2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s1;
+volatile __m128i s2;
+volatile __m256 res1;
+volatile __m128 res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi32_ps (res1, m, s1);
+  res2 = _mm_mask_cvtepi32_ps (res2, m, s2);
+
+  res1 = _mm256_maskz_cvtepi32_ps (m, s1);
+  res2 = _mm_maskz_cvtepi32_ps (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d6751544ace0340a2c6ba352de6f0cee43cf8d75
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtdq2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtdq2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..168c6e37eb40db0b83f0c8d1f6da850851074048
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtpd2dqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2dqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2dqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2dqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d s1;
+volatile __m128d s2;
+volatile __m128i res;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_mask_cvtpd_epi32 (res, m, s1);
+  res = _mm_mask_cvtpd_epi32 (res, m, s2);
+
+  res = _mm256_maskz_cvtpd_epi32 (m, s1);
+  res = _mm_maskz_cvtpd_epi32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c16d528b44d3cd01d1299823129b2829186009b3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2dq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2dq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b18582b0a6f2f486b0cddfc707e4f61a6ff5bb28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d xx;
+volatile __m128 y;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_cvtpd_ps (y, 4, x);
+  y = _mm256_maskz_cvtpd_ps (6, x);
+  y = _mm_mask_cvtpd_ps (y, 4, xx);
+  y = _mm_maskz_cvtpd_ps (6, xx);
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..854a3340316c2d8fffd02550e131163637b636bb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1109d898c4ae89902b3ed826e80b685996e78c48
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2qq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtpd2qq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtpd2qq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7544b6bc9cac838cbe4cc586ba658b3033342b3c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d s1;
+volatile __m128d s2;
+volatile __m128i res;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_cvtpd_epu32 (s1);
+  res = _mm_cvtpd_epu32 (s2);
+
+  res = _mm256_mask_cvtpd_epu32 (res, m, s1);
+  res = _mm_mask_cvtpd_epu32 (res, m, s2);
+
+  res = _mm256_maskz_cvtpd_epu32 (m, s1);
+  res = _mm_maskz_cvtpd_epu32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d949d430b1daece88e5dcc995eb479b9dcfad0e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2udq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtpd2udq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..01648cd92d259f8e53e4b50a95f02cced35e6e50
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2uqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtpd2uqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtpd2uqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..de22503c0dfbd4919e0cd5a5baa0d8fe95317996
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vcvtph2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtph2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtph2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtph2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x;
+volatile __m256 y;
+volatile __m128i xx;
+volatile __m128 yy;
+
+void extern
+avx512bw_test (void)
+{
+  y = _mm256_mask_cvtph_ps (y, 4, x);
+  y = _mm256_maskz_cvtph_ps (6, x);
+  yy = _mm_mask_cvtph_ps (yy, 4, xx);
+  yy = _mm_maskz_cvtph_ps (6, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5d2c1104eee4c306abd15f45608b9606e2986d7f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtph2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mf16c -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtph2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtph2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a38521402b5144cede6471de4bc344d0546005d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtps2dq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2dq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2dq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2dq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __m256i z1;
+volatile __m128i z2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z1 = _mm256_mask_cvtps_epi32 (z1, m, x1);
+  z1 = _mm256_maskz_cvtps_epi32 (m, x1);
+  z2 = _mm_mask_cvtps_epi32 (z2, m, x2);
+  z2 = _mm_maskz_cvtps_epi32 (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ba660ba9546e3fae81276ba10042f83e164d153b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2dq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2dq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2dq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e7dfc2c7f733658bdaad94fe2a509b255c1ef972
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtps2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128 s;
+volatile __m256d res1;
+volatile __m128d res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtps_pd (res1, m, s);
+  res2 = _mm_mask_cvtps_pd (res2, m, s);
+
+  res1 = _mm256_maskz_cvtps_pd (m, s);
+  res2 = _mm_maskz_cvtps_pd (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..641d86198e662bd31305944bc35d4802307817e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..28314ee9af5617927bbbab181df60f7c864f5793
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vcvtps2ph\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vcvtps2ph\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128i y;
+volatile __m128 xx;
+volatile __m128i yy;
+
+void extern
+avx512bw_test (void)
+{
+  y = _mm256_maskz_cvtps_ph (4, x, 0);
+  y = _mm256_mask_cvtps_ph (y, 2, x, 0);
+  yy = _mm_maskz_cvtps_ph (4, xx, 0);
+  yy = _mm_mask_cvtps_ph (yy, 2, xx, 0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3d9e4fbeb717f40cc371249c6ff15f8f66bf8e44
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2ph-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mf16c -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2ph-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2ph-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..876f9bec1657c4e67869ac96a26e1f5f4226c3b9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2qq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtps2qq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtps2qq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..30d0337db2eeb3f7a41804056591e90b75fdfe18
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __m256i z1;
+volatile __m128i z2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z1 = _mm256_cvtps_epu32 (x1);
+  z1 = _mm256_mask_cvtps_epu32 (z1, m, x1);
+  z1 = _mm256_maskz_cvtps_epu32 (m, x1);
+  z2 = _mm_cvtps_epu32 (x2);
+  z2 = _mm_mask_cvtps_epu32 (z2, m, x2);
+  z2 = _mm_maskz_cvtps_epu32 (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6bb32728e85f18676f12ae7ef56d381ef7a7b03a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2udq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2udq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtps2udq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..512022dd067030aed5b9439624bfc34298cf1595
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtps2uqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtps2uqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtps2uqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a85b269fc36eccd1c9ae5d65c31fe97a5c3ce19
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtqq2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtqq2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1ed75fd40ed3656ab3c2602b5ff426fd58531dfc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtqq2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtqq2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtqq2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..729f49d91fd6cbb4bff767c6bd43f0a5b30fab12
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttpd2dqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2dqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2dqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2dqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d s1;
+volatile __m128d s2;
+volatile __m128i res;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_mask_cvttpd_epi32 (res, m, s1);
+  res = _mm_mask_cvttpd_epi32 (res, m, s2);
+
+  res = _mm256_maskz_cvttpd_epi32 (m, s1);
+  res = _mm_maskz_cvttpd_epi32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..24fd9ad642f6d4b3e6aa75d2bb85949368b98629
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2dq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttpd2dq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttpd2dq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b09268037ca644056438343c7b9cc802279212ce
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2qq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttpd2qq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttpd2qq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b0cd9dd52ce8b7374224caa138cf1637f1db604
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqy\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttpd2udqx\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d s1;
+volatile __m128d s2;
+volatile __m128i res;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_cvttpd_epu32 (s1);
+  res = _mm_cvttpd_epu32 (s2);
+
+  res = _mm256_mask_cvttpd_epu32 (res, m, s1);
+  res = _mm_mask_cvttpd_epu32 (res, m, s2);
+
+  res = _mm256_maskz_cvttpd_epu32 (m, s1);
+  res = _mm_maskz_cvttpd_epu32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..53f04207be03eda86dfecce4c2b90555302863a8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2udq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttpd2udq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttpd2udq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..caf512ad95015068c5c93ee9d0358427e9323862
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttpd2uqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttpd2uqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttpd2uqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1aa638b5f31e49255e3a0952deaa18232f694920
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttps2dq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2dq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2dq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2dq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 s1;
+volatile __m128 s2;
+volatile __m256i res1;
+volatile __m128i res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvttps_epi32 (res1, m, s1);
+  res1 = _mm256_maskz_cvttps_epi32 (m, s1);
+  res2 = _mm_mask_cvttps_epi32 (res2, m, s2);
+  res2 = _mm_maskz_cvttps_epi32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..173db3c002b29f4c49680c3a5161e8feef2ffdb3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2dq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttps2dq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttps2dq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2qq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2qq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f45db8f5c220cd4a593aa203699b3b03735dcb21
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2qq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttps2qq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttps2qq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f40b18a9ade2208d5d41238ea0126963baadd3e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttps2udq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 s1;
+volatile __m128 s2;
+volatile __m256i res1;
+volatile __m128i res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_cvttps_epu32 (s1);
+  res1 = _mm256_mask_cvttps_epu32 (res1, m, s1);
+  res1 = _mm256_maskz_cvttps_epu32 (m, s1);
+  res2 = _mm_cvttps_epu32 (s2);
+  res2 = _mm_mask_cvttps_epu32 (res2, m, s2);
+  res2 = _mm_maskz_cvttps_epu32 (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e8779ea8b9a7018c23abbe0f56902f83a4419e80
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2udq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttps2udq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvttps2udq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2uqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2uqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb15ecd05db08bed20929cb2ce9b9103510a39b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvttps2uqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttps2uqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvttps2uqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3355617b7bc8351a363c7d45d139c937cf381934
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s;
+volatile __m256d res1;
+volatile __m128d res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_cvtepu32_pd (s);
+  res2 = _mm_cvtepu32_pd (s);
+
+  res1 = _mm256_mask_cvtepu32_pd (res1, m, s);
+  res2 = _mm_mask_cvtepu32_pd (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu32_pd (m, s);
+  res2 = _mm_maskz_cvtepu32_pd (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..698448500a6b83d081b1564986db8aaba07ac450
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtudq2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtudq2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef46834637274b303fac9e96e7d98cdf82f918cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtudq2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s1;
+volatile __m128i s2;
+volatile __m256 res1;
+volatile __m128 res2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_cvtepu32_ps (s1);
+  res2 = _mm_cvtepu32_ps (s2);
+
+  res1 = _mm256_mask_cvtepu32_ps (res1, m, s1);
+  res2 = _mm_mask_cvtepu32_ps (res2, m, s2);
+
+  res1 = _mm256_maskz_cvtepu32_ps (m, s1);
+  res2 = _mm_maskz_cvtepu32_ps (m, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..98731c684490c53ec772cc38d3f41521d5daa54c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtudq2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtudq2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vcvtudq2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d803b32ab59953f918fa7fc117bf91347285d11f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtuqq2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtuqq2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c99919e09f7c196000eadd504d9dbbaeb17f4918
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vcvtuqq2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtuqq2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vcvtuqq2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vdbpsadbw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vdbpsadbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..62c52ea875704a7e492b08736ab86fba3a43d721
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vdbpsadbw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vdbpsadbw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vdbpsadbw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e840cdbecca6b2ce2175d38097b878477da96ddf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdivpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_div_pd (x256, m, x256, x256);
+  x256 = _mm256_maskz_div_pd (m, x256, x256);
+  x128 = _mm_mask_div_pd (x128, m, x128, x128);
+  x128 = _mm_maskz_div_pd (m, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf9c41524a83eb8ec83f4e5fabfea5020589c5ff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vdivpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vdivpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vdivpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..37b9aa5feac6a33bc6c08718cecf73790eb07ae0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vdivps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_div_ps (x256, m, x256, x256);
+  x256 = _mm256_maskz_div_ps (m, x256, x256);
+  x128 = _mm_mask_div_ps (x128, m, x128, x128);
+  x128 = _mm_maskz_div_ps (m, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..629bd1dcad377612818069c0e376622a73f5b204
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vdivps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vdivps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vdivps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..03044c5c6ec3704ad6aa1e66a4a4f026440906e1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vexpandpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+double *p;
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_expand_pd (x1, m, x1);
+  x2 = _mm_mask_expand_pd (x2, m, x2);
+
+  x1 = _mm256_maskz_expand_pd (m, x1);
+  x2 = _mm_maskz_expand_pd (m, x2);
+
+  x1 = _mm256_mask_expandloadu_pd (x1, m, p);
+  x2 = _mm_mask_expandloadu_pd (x2, m, p);
+
+  x1 = _mm256_maskz_expandloadu_pd (m, p);
+  x2 = _mm_maskz_expandloadu_pd (m, p);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4cb6a228c7d37b90859c020129000bbfed44956b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vexpandpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vexpandpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d6a05e916b489068e6c5df4303fe30d777a63ecf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vexpandps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vexpandps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+float *p;
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_expand_ps (x1, m, x1);
+  x2 = _mm_mask_expand_ps (x2, m, x2);
+
+  x1 = _mm256_maskz_expand_ps (m, x1);
+  x2 = _mm_maskz_expand_ps (m, x2);
+
+  x1 = _mm256_mask_expandloadu_ps (x1, m, p);
+  x2 = _mm_mask_expandloadu_ps (x2, m, p);
+
+  x1 = _mm256_maskz_expandloadu_ps (m, p);
+  x2 = _mm_maskz_expandloadu_ps (m, p);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9ccd4e9bbae2c63db84c1c322c955f264de9658
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vexpandps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vexpandps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vexpandps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..58148e0182458662096c7d704c414e27004018da
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vextractf32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextractf32x4\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vextractf32x4\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 y;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_extractf32x4_ps (x, 1);
+  y = _mm256_mask_extractf32x4_ps (y, 2, x, 1);
+  y = _mm256_maskz_extractf32x4_ps (2, x, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c93d518eb070e5c1e7597873cd77189f8325ca00
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vextractf32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextractf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6123426fe3eaa307f4d2aee7fb54c888d437f66b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextractf64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vextractf64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..fb26d6a6c8fc0772d5f053be3f1d503204b5a843
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vextracti32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vextracti32x4\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vextracti32x4\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_extracti32x4_epi32 (x, 1);
+  y = _mm256_mask_extracti32x4_epi32 (y, 2, x, 1);
+  y = _mm256_maskz_extracti32x4_epi32 (2, x, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9c40906e08d445efa754341f3ca1a13ee0206f7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vextracti32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vextracti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9b8554c7e720b6cf9b4850b50aa3cc13aaba20f3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vextracti64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vextracti64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a95d83fefa702a3233e0f3c1ac88697a8de63b74
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vfixupimmpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" } } */
+/* { dg-final { scan-assembler "vfixupimmpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" } } */
+/* { dg-final { scan-assembler "vfixupimmpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" } } */
+/* { dg-final { scan-assembler "vfixupimmpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256d xx;
+volatile __m256i yy;
+volatile __m128d x2;
+volatile __m128i y2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_fixupimm_pd (xx, xx, yy, 3);
+  xx = _mm256_mask_fixupimm_pd (xx, m, xx, yy, 3);
+  xx = _mm256_maskz_fixupimm_pd (m, xx, xx, yy, 3);
+  x2 = _mm_fixupimm_pd (x2, x2, y2, 3);
+  x2 = _mm_mask_fixupimm_pd (x2, m, x2, y2, 3);
+  x2 = _mm_maskz_fixupimm_pd (m, x2, x2, y2, 3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..36750096ee7b37af3482c8f5eb2b8d4c59e87881
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfixupimmpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfixupimmpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6b6c5740c6a26d57a24349bd83412cc0f8957de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vfixupimmps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" } } */
+/* { dg-final { scan-assembler "vfixupimmps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" } } */
+/* { dg-final { scan-assembler "vfixupimmps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" } } */
+/* { dg-final { scan-assembler "vfixupimmps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256 xx;
+volatile __m256i yy;
+volatile __m128 x2;
+volatile __m128i y2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_fixupimm_ps (xx, xx, yy, 3);
+  xx = _mm256_mask_fixupimm_ps (xx, m, xx, yy, 3);
+  xx = _mm256_maskz_fixupimm_ps (m, xx, xx, yy, 3);
+  x2 = _mm_fixupimm_ps (x2, x2, y2, 3);
+  x2 = _mm_mask_fixupimm_ps (x2, m, x2, y2, 3);
+  x2 = _mm_maskz_fixupimm_ps (m, x2, x2, y2, 3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a37ad5954307525df68a159ea3f32ade08280a07
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfixupimmps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfixupimmps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfixupimmps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..da6ea65980001149448acdafc5e6f3a2588ec1ce
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmadd231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmadd_pd (yy, m, y2, y3);
+  xx = _mm_mask_fmadd_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmadd_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fmadd_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmadd_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fmadd_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3fdb818411bbf85fb0c7d102ae8dd49e0247a4f8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..185a8296f2419056356e438ec52168824f52b043
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmadd231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmadd_ps (yy, m, y2, y3);
+  xx = _mm_mask_fmadd_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmadd_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fmadd_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmadd_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fmadd_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d5dd7629cdb1df56ab4ceba8ad80ae8c2edef62
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0c015cba5d2c3ff0704ead69e58872c26224f9e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmaddsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmaddsub_pd (yy, m, y2, y3);
+  xx = _mm_mask_fmaddsub_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmaddsub_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fmaddsub_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmaddsub_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fmaddsub_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..178d43c0f99ea96abe7c65851194071203ba895f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddsubXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddsubXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..25efa30d0fd8ce1f0aafc79a0167fa920a144eec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmaddsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmaddsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmaddsub_ps (yy, m, y2, y3);
+  xx = _mm_mask_fmaddsub_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmaddsub_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fmaddsub_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmaddsub_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fmaddsub_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b148aef5ed8b33846c2311bf30798577827ce8a1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmaddsubXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddsubXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmaddsubXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e0d52a5401ac8d77b94faabfaf0779b59e352cc9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsub231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmsub_pd (yy, m, y2, y3);
+  xx = _mm_mask_fmsub_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmsub_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fmsub_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmsub_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fmsub_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a973dc3383d530af43a53afa13cb08c40521a8a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8e5ab4e380f4113566259cc2d0e9011f5efd96cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsub231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmsub_ps (yy, m, y2, y3);
+  xx = _mm_mask_fmsub_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmsub_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fmsub_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmsub_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fmsub_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9059e2e97bfefb85b1be3f6559c2daf975287dd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7bf5324d9f5ed250cba04c86f3ad4551f5694730
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmsubadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmsubadd_pd (yy, m, y2, y3);
+  xx = _mm_mask_fmsubadd_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmsubadd_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fmsubadd_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmsubadd_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fmsubadd_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..733416c6d67f776ad727d5f272c3b351db3c02dd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubaddXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubaddXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c1af7cf84e7db5bf4533306bd5fbe08da6bc4162
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfmsubadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfmsubadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fmsubadd_ps (yy, m, y2, y3);
+  xx = _mm_mask_fmsubadd_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fmsubadd_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fmsubadd_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fmsubadd_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fmsubadd_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..eade1ca593ae155b17446cd361947fd97eaed4e2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfmsubaddXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubaddXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfmsubaddXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3335e64b69a881960174b76e0e0a36a4873b374c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfnmadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmadd231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fnmadd_pd (yy, m, y2, y3);
+  xx = _mm_mask_fnmadd_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fnmadd_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fnmadd_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fnmadd_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fnmadd_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4f37d83eede5f4f01e50c33ecb7e3632fc5a2e57
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmaddXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmaddXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8d30de40ac41db576c4b35a89975b48e419a25f3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfnmadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmadd231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmadd...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fnmadd_ps (yy, m, y2, y3);
+  xx = _mm_mask_fnmadd_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fnmadd_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fnmadd_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fnmadd_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fnmadd_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..72b722d1959c31be04882825d6c9c299d45b6793
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmaddXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmaddXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmaddXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..50ba7be10e6f8318bda122e0029c8e196dc4e329
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfnmsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmsub231pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub231pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fnmsub_pd (yy, m, y2, y3);
+  xx = _mm_mask_fnmsub_pd (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fnmsub_pd (yy, y2, y3, m);
+  x3 = _mm_mask3_fnmsub_pd (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fnmsub_pd (m, yy, y2, y3);
+  xx = _mm_maskz_fnmsub_pd (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f2369677cdcbb5b1e5ae7b4efcaf55846ac59c70
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmsubXXXpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmsubXXXpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..396fe24db7aba53acf5d3730ee3d15ef1a08e578
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vfnmsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vfnmsub231ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub231ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vfnmsub...ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_fnmsub_ps (yy, m, y2, y3);
+  xx = _mm_mask_fnmsub_ps (xx, m, x2, x3);
+
+  y3 = _mm256_mask3_fnmsub_ps (yy, y2, y3, m);
+  x3 = _mm_mask3_fnmsub_ps (xx, x2, x3, m);
+
+  yy = _mm256_maskz_fnmsub_ps (m, yy, y2, y3);
+  xx = _mm_maskz_fnmsub_ps (m, xx, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1913e44664677c5fc7e7a55130ffd9f0c2bc3add
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfnmsubXXXps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmsubXXXps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vfnmsubXXXps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfpclasspd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfpclasspd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d9346c311b7915339f2c634c07c24d9c3a12cf4b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfpclasspd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vfpclasspd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vfpclasspd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vfpclassps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vfpclassps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9bf59b32ada8e1472ec1578e1fb3e1615ae6a4c7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vfpclassps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vfpclassps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vfpclassps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0b7dcca0e497b320749de0ec6dbeb46c0fa1669
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3} } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1} } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3} } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1} } */
+/* { dg-final { scan-assembler-times "vgetexppd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+
+#include <immintrin.h>
+
+volatile __m256d xx;
+volatile __m128d x2;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_getexp_pd (xx);
+  xx = _mm256_mask_getexp_pd (xx, m8, xx);
+  xx = _mm256_maskz_getexp_pd (m8, xx);
+  x2 = _mm_getexp_pd (x2);
+  x2 = _mm_mask_getexp_pd (x2, m8, x2);
+  x2 = _mm_maskz_getexp_pd (m8, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b8ebaf521b2561a00217796030836606eb93624f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexppd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetexppd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetexppd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4aa5bccd763f9d918be2b331d45ff9767adb23cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3} } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1} } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3} } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1} } */
+/* { dg-final { scan-assembler-times "vgetexpps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+
+#include <immintrin.h>
+
+volatile __m256 xx;
+volatile __m128 x2;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_getexp_ps (xx);
+  xx = _mm256_mask_getexp_ps (xx, m8, xx);
+  xx = _mm256_maskz_getexp_ps (m8, xx);
+  x2 = _mm_getexp_ps (x2);
+  x2 = _mm_mask_getexp_ps (x2, m8, x2);
+  x2 = _mm_maskz_getexp_ps (m8, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..643ccae84abdea63989b7e839b0b27c3bd782b54
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetexpps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetexpps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetexpps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ad5ae3b073597e048f50015eea8241fef104f409
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x, y;
+volatile __m128d a, b;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_getmant_pd (y, _MM_MANT_NORM_p75_1p5, _MM_MANT_SIGN_src);
+  x = _mm256_mask_getmant_pd (x, m, y, _MM_MANT_NORM_p75_1p5,
+			      _MM_MANT_SIGN_src);
+  x = _mm256_maskz_getmant_pd (m, y, _MM_MANT_NORM_p75_1p5,
+			       _MM_MANT_SIGN_src);
+  a = _mm_getmant_pd (b, _MM_MANT_NORM_p75_1p5, _MM_MANT_SIGN_src);
+  a = _mm_mask_getmant_pd (a, m, b, _MM_MANT_NORM_p75_1p5,
+			   _MM_MANT_SIGN_src);
+  a = _mm_maskz_getmant_pd (m, b, _MM_MANT_NORM_p75_1p5,
+			    _MM_MANT_SIGN_src);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7007074ca86bb7d9010ab344336e402b179ecc04
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetmantpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetmantpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..089293546e26ba25b58f0db4138619a0ef0a0789
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vgetmantps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x, y;
+volatile __m128 a, b;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_getmant_ps (y, _MM_MANT_NORM_p75_1p5, _MM_MANT_SIGN_src);
+  x = _mm256_mask_getmant_ps (x, m, y, _MM_MANT_NORM_p75_1p5,
+			      _MM_MANT_SIGN_src);
+  x = _mm256_maskz_getmant_ps (m, y, _MM_MANT_NORM_p75_1p5,
+			       _MM_MANT_SIGN_src);
+  a = _mm_getmant_ps (b, _MM_MANT_NORM_p75_1p5, _MM_MANT_SIGN_src);
+  a = _mm_mask_getmant_ps (a, m, b, _MM_MANT_NORM_p75_1p5,
+			   _MM_MANT_SIGN_src);
+  a = _mm_maskz_getmant_ps (m, b, _MM_MANT_NORM_p75_1p5,
+			    _MM_MANT_SIGN_src);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b76ca95337967d185d2dd8b69a769ecdb634ed1f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetmantps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vgetmantps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c0addd817d106c3693dfde5cee180c0baa986ee2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vinsertf32x4\[^\n\]*ymm" 3 } } */
+/* { dg-final { scan-assembler-times "vinsertf32x4\[^\n\]*\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vinsertf32x4\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 y;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_insertf32x4 (x, y, 1);
+  x = _mm256_mask_insertf32x4 (x, 2, x, y, 1);
+  x = _mm256_maskz_insertf32x4 (2, x, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6f980249969e18cebcf07540c28bfeec86f9693
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vinsertf32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6793449fdf08f1564d20d2dd3c5b04446e67662c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinsertf64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vinsertf64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..08e0897ab680e26cc97da46fd3b5f92ce679e908
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vinserti32x4\[^\n\]*ymm" 3 } } */
+/* { dg-final { scan-assembler-times "vinserti32x4\[^\n\]*\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vinserti32x4\[^\n\]*\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_inserti32x4 (x, y, 1);
+  x = _mm256_mask_inserti32x4 (x, 2, x, y, 1);
+  x = _mm256_maskz_inserti32x4 (2, x, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..03c29ae6e9ee83b554fe7233c8b2fb519252d905
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vinserti32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vinserti64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..faefdec8259b13318b1b710ceb4cfe364bb35bc4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vinserti64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vinserti64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c90b022ecd692cf6ee996427deab986886068598
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_max_pd (x256, m8, x256, x256);
+  x256 = _mm256_maskz_max_pd (m8, x256, x256);
+  x128 = _mm_mask_max_pd (x128, m8, x128, x128);
+  x128 = _mm_maskz_max_pd (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..40c878d7f28223fa697e1769fbdb5c327353fdde
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmaxpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmaxpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..666975677d90c545ddb8fabdadf686866e3aeafa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmaxps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_max_ps (x256, m8, x256, x256);
+  x256 = _mm256_maskz_max_ps (m8, x256, x256);
+  x128 = _mm_mask_max_ps (x128, m8, x128, x128);
+  x128 = _mm_maskz_max_ps (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d86addd9e68ddecc527b65e62d8d297db1203bd2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmaxps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmaxps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmaxps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bda66f16e6357ae6d846bb4ee11ff04f57af3868
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vminpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_min_pd (x256, m8, x256, x256);
+  x256 = _mm256_maskz_min_pd (m8, x256, x256);
+  x128 = _mm_mask_min_pd (x128, m8, x128, x128);
+  x128 = _mm_maskz_min_pd (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..deea0532727d284856de2d0b3781c288f87dee44
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vminpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vminpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vminpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vminps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vminps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a27b15f31c1a3aff87b6c8add90cca3fbc6ae1d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vminps-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vminps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_min_ps (x256, m8, x256, x256);
+  x256 = _mm256_maskz_min_ps (m8, x256, x256);
+  x128 = _mm_mask_min_ps (x128, m8, x128, x128);
+  x128 = _mm_maskz_min_ps (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vminps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vminps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b896a34ab5a1317bb3bcdaf6139f908351725b55
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vminps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vminps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vminps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a24a3661194d14da628bebbdccc237cb4a3c1d2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-1.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovapd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+double *p;
+volatile __m256d yy, y2;
+volatile __m128d xx, x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_mov_pd (yy, m, y2);
+  xx = _mm_mask_mov_pd (xx, m, x2);
+
+  yy = _mm256_maskz_mov_pd (m, y2);
+  xx = _mm_maskz_mov_pd (m, x2);
+
+  yy = _mm256_mask_load_pd (yy, m, p);
+  xx = _mm_mask_load_pd (xx, m, p);
+
+  yy = _mm256_maskz_load_pd (m, p);
+  xx = _mm_maskz_load_pd (m, p);
+
+  _mm256_mask_store_pd (p, m, yy);
+  _mm_mask_store_pd (p, m, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..11d7af1ac2a7d7757e357fcb594f914664826784
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovapd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovapd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovapd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5104292f0995fc9dcf4153b52cca68a7c5de8cb3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-1.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+float __attribute__ ((aligned (32))) *p;
+volatile __m256 yy, y2;
+volatile __m128 xx, x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_mov_ps (yy, m, y2);
+  xx = _mm_mask_mov_ps (xx, m, x2);
+
+  yy = _mm256_maskz_mov_ps (m, y2);
+  xx = _mm_maskz_mov_ps (m, x2);
+
+  yy = _mm256_mask_load_ps (yy, m, p);
+  xx = _mm_mask_load_ps (xx, m, p);
+
+  yy = _mm256_maskz_load_ps (m, p);
+  xx = _mm_maskz_load_ps (m, p);
+
+  _mm256_mask_store_ps (p, m, yy);
+  _mm_mask_store_ps (p, m, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d876e91f7dc86d317466ffe37766e0063906f67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovaps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovaps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovaps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9dd98de51d083d42f0e5f360f3a4712e4428e7ef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovddup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vunpcklpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovddup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]|vunpcklpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovddup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}|vunpcklpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovddup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}|vunpcklpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2;
+volatile __m128d xx, x2;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+    yy = _mm256_mask_movedup_pd (yy, m8, y2);
+    yy = _mm256_maskz_movedup_pd (m8, y2);
+
+    xx = _mm_mask_movedup_pd (xx, m8, x2);
+    xx = _mm_maskz_movedup_pd (m8, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a5eaaafd00a4333e560165443c69b8dc268623bc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovddup-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovddup-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovddup-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..498232723e14ce9ac1ace42d16e07cb2ef24ac17
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-1.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa32\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+int *p;
+volatile __m256i yy, y2;
+volatile __m128i xx, x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_mov_epi32 (yy, m, y2);
+  xx = _mm_mask_mov_epi32 (xx, m, x2);
+
+  yy = _mm256_maskz_mov_epi32 (m, y2);
+  xx = _mm_maskz_mov_epi32 (m, x2);
+
+  yy = _mm256_mask_load_epi32 (yy, m, p);
+  xx = _mm_mask_load_epi32 (xx, m, p);
+
+  yy = _mm256_maskz_load_epi32 (m, p);
+  xx = _mm_maskz_load_epi32 (m, p);
+
+  _mm256_mask_store_epi32 (p, m, yy);
+  _mm_mask_store_epi32 (p, m, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0a0c90501ee7a3c530b3869d256a1dab1ffe9e40
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa32-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqa32-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqa32-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c2b900e34893352598cb7f575dd564461fce3dc8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-1.c
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\\(\[^\n\]*%ymm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\\(\[^\n\]*%xmm\[0-9\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^x^y\]*\\(" 2 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^x^y\]*\\(" 2 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+long long *p;
+__m256i const *p1;
+__m128i const *p2;
+volatile __m256i yy, y2;
+volatile __m128i xx, x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_mov_epi64 (yy, m, y2);
+  xx = _mm_mask_mov_epi64 (xx, m, x2);
+
+  yy = _mm256_maskz_mov_epi64 (m, y2);
+  xx = _mm_maskz_mov_epi64 (m, x2);
+
+  yy = _mm256_load_si256 (p1);
+  xx = _mm_load_si128 (p2);
+
+  yy = _mm256_mask_load_epi64 (yy, m, p);
+  xx = _mm_mask_load_epi64 (xx, m, p);
+
+  yy = _mm256_maskz_load_epi64 (m, p);
+  xx = _mm_maskz_load_epi64 (m, p);
+
+  _mm256_store_epi64 (p, yy);
+  _mm_store_epi64 (p, xx);
+
+  _mm256_mask_store_epi64 (p, m, yy);
+  _mm_mask_store_epi64 (p, m, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c404ea7e0e79c301505aedb4b39e376f08745c7e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqa64-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqa64-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqa64-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu16-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu16-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..35651e5ddd9d0366d8aae80bec480cfd6a46855a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu16-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vmovdqu16-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vmovdqu16-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ecffbc7f4e392baa2cda32096c74b862aa831b91
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu32\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+int *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_loadu_epi32 (x1, m, p);
+  x2 = _mm_mask_loadu_epi32 (x2, m, p);
+
+  x1 = _mm256_maskz_loadu_epi32 (m, p);
+  x2 = _mm_maskz_loadu_epi32 (m, p);
+
+  _mm256_mask_storeu_epi32 (p, m, x1);
+  _mm_mask_storeu_epi32 (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffff00dd57e22bd6fb6ed8e68166dd73c0d81a5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqu32-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqu32-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9e3fb5884c44ab687c8db52222bed5af9c67dca3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovdqu64\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+long long *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_loadu_epi64 (x1, m, p);
+  x2 = _mm_mask_loadu_epi64 (x2, m, p);
+
+  x1 = _mm256_maskz_loadu_epi64 (m, p);
+  x2 = _mm_maskz_loadu_epi64 (m, p);
+
+  _mm256_mask_storeu_epi64 (p, m, x1);
+  _mm_mask_storeu_epi64 (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..451edccaf55cbeb56d6e3110226e6076e509fccd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqu64-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovdqu64-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu8-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu8-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d14df55dbd91bb51a0ad858a3776b82c31980c6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu8-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vmovdqu8-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vmovdqu8-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovntdqa-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovntdqa-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ac860f3c2e8a2603ba4a59d3e9313e83d04549c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovntdqa-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vmovntdqa\[ \\t\]+\[^\n\]*%zmm\[0-9\]"} } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+__m512i *y;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm512_stream_load_si512 (y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..80d88e0779f08693daa66e5f491e99a238fb6097
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovshdup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovshdup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovshdup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovshdup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_movehdup_ps (y, m, y);
+  x = _mm_mask_movehdup_ps (x, m, x);
+
+  y = _mm256_maskz_movehdup_ps (m, y);
+  x = _mm_maskz_movehdup_ps (m, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d7b883de824d55c306d2a1c4fe3c734fcbbb3dac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovshdup-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovshdup-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovshdup-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..147c9de1750f307957f8c465271917193e41f1d4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovsldup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovsldup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovsldup\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovsldup\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_moveldup_ps (y, m, y);
+  x = _mm_mask_moveldup_ps (x, m, x);
+
+  y = _mm256_maskz_moveldup_ps (m, y);
+  x = _mm_maskz_moveldup_ps (m, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..877f1907acbcce0877fecbc6ebd2ff4e15fcfcb9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovsldup-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovsldup-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovsldup-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3bd734d249795e8dbd5a5127d815ac412ed3b96a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovupd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+double *p;
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_loadu_pd (x1, m, p);
+  x2 = _mm_mask_loadu_pd (x2, m, p);
+
+  x1 = _mm256_maskz_loadu_pd (m, p);
+  x2 = _mm_maskz_loadu_pd (m, p);
+
+  _mm256_mask_storeu_pd (p, m, x1);
+  _mm_mask_storeu_pd (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9ccc6a8f578656ee7c62b4ab5ec657962aef596
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovupd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovupd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovupd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f48eaed0bdc9dff4a5453a83a16c39dc84d8d54
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*\\)\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*\\)\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmovups\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+float *p;
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_loadu_ps (x1, m, p);
+  x2 = _mm_mask_loadu_ps (x2, m, p);
+
+  x1 = _mm256_maskz_loadu_ps (m, p);
+  x2 = _mm_maskz_loadu_ps (m, p);
+
+  _mm256_mask_storeu_ps (p, m, x1);
+  _mm_mask_storeu_ps (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fe49a6c8b42921f075cfe67e6b51dc18d92b689f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmovups-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovups-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmovups-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7346ee8827356f8761002ffaf66956e4957bb57e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmulpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_mul_pd (x256, m, x256, x256);
+  x256 = _mm256_maskz_mul_pd (m, x256, x256);
+  x128 = _mm_mask_mul_pd (x128, m, x128, x128);
+  x128 = _mm_maskz_mul_pd (m, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffd0862347e99f398673f38f3781b2f927c115cc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmulpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmulpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmulpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8e06e874db7b1fe425682b2dd83381db4c8d4f73
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vmulps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_mul_ps (x256, m, x256, x256);
+  x256 = _mm256_maskz_mul_ps (m, x256, x256);
+  x128 = _mm_mask_mul_ps (x128, m, x128, x128);
+  x128 = _mm_maskz_mul_ps (m, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0cf529ab6b5a0d6c55e8c936bd951afc687fe0b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vmulps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmulps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vmulps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vorpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vorpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8cb5a2fdedc9ee03246a4860133e2aed81a3a4a1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vorpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vorpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vorpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vorps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vorps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d628291cae1f8f311ffbc74263b66ca124e2f685
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vorps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vorps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vorps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1535d7f9b6023fe7330309d3971216ed931b718
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpabsb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpabsb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c8a7a0d50a31392e996bbf20993b7168acba6ddb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpabsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i xx;
+volatile __m128i x2;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_mask_abs_epi32 (xx, 2,xx);
+  xx = _mm256_maskz_abs_epi32 (2, xx);
+  x2 = _mm_mask_abs_epi32 (x2, 2, x2);
+  x2 = _mm_maskz_abs_epi32 (2, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4106fe340bd76e536befacb640907119ad96682d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpabsd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpabsd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..590d8ecda46170f60aa115d9205e3237aba1d5ac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpabsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i xx;
+volatile __m128i x2;
+
+void extern
+avx512vl_test (void)
+{
+  xx = _mm256_abs_epi64 (xx);
+  xx = _mm256_mask_abs_epi64 (xx, 2, xx);
+  xx = _mm256_maskz_abs_epi64 (2, xx);
+  x2 = _mm_abs_epi64 (x2);
+  x2 = _mm_mask_abs_epi64 (x2, 2, x2);
+  x2 = _mm_maskz_abs_epi64 (2, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e9a54a402a02c5b7b81b9c796cf771a866a5bca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpabsq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpabsq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpabsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7bd947f285228081435ebccc51011f02f37d698
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpabsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpabsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpabsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpackssdw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpackssdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6bad76290e54ca1565aabe94048aacdcde8eb4c2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpackssdw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackssdw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackssdw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpacksswb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpacksswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7c369e0b861c73522f779cc72a05f05084c940e7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpacksswb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpacksswb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpacksswb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpackusdw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpackusdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..253adae9b7289966fc421f227b23857120338f7b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpackusdw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackusdw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackusdw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpackuswb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpackuswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a052e60e0b2c61a21d28726a937a2e97159ca2f6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpackuswb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackuswb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpackuswb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..07c9fd0ddb2ae5e4c3e289f4c024e40d71c628cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d468c06c1914d40af42ccecd467c02e3e8599e13
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_add_epi32 (x256, m8, x256, x256);
+  x256 = _mm256_maskz_add_epi32 (m8, x256, x256);
+  x128 = _mm_mask_add_epi32 (x128, m8, x128, x128);
+  x128 = _mm_maskz_add_epi32 (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3dc72ef3faf0432f861bb5644ae9ccfc5455fa00
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpaddd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpaddd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b94fdd0b5789e0d6b4afc899e0af56fbe83775a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpaddq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_add_epi64 (x256, m8, x256, x256);
+  x256 = _mm256_maskz_add_epi64 (m8, x256, x256);
+  x128 = _mm_mask_add_epi64 (x128, m8, x128, x128);
+  x128 = _mm_maskz_add_epi64 (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7fb63b757e21eb8929e3dab85cb9ef2d034a61ea
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpaddq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpaddq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f17892871cfa38aedbaf79f3d8a9b340d3d8ed07
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddsb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddsb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..51b24a38dba8c6eedbd5cf0b38e96da284637b10
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..122edcd9c4f0683d3e44084b03ce606ad2b407a4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddusb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddusb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..75726328621a9d453f4b8f4663c4814c72a04b12
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddusw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddusw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddusw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpaddw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a3a5db355b213f72933fd81eb1192398536012e4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpaddw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpaddw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpalignr-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpalignr-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0d30c65262248dc70c28d2a6b534c3fe7d4dd763
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpalignr-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpalignr-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpalignr-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..23cffba81c36f297646063261bd80fcb54dad2c3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_and_epi32 (y, m, y, y);
+  y = _mm256_maskz_and_epi32 (m, y, y);
+
+  x = _mm_mask_and_epi32 (x, m, x, x);
+  x = _mm_maskz_and_epi32 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..85a806b1e06889bfe2c42582b55217367bfd7b98
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e244cd899c4914c3112ad40885a9d4f43e0fa3d0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_andnot_epi32 (y, m, y, y);
+  y = _mm256_maskz_andnot_epi32 (m, y, y);
+
+  x = _mm_mask_andnot_epi32 (x, m, x, x);
+  x = _mm_maskz_andnot_epi32 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8805d30d2f230cb1aacf147ad9a73ef02d843134
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandnd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandnd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc171d1c2982427e8183b490a442b41f0df3922f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandnq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_andnot_epi64 (y, m, y, y);
+  y = _mm256_maskz_andnot_epi64 (m, y, y);
+
+  x = _mm_mask_andnot_epi64 (x, m, x, x);
+  x = _mm_maskz_andnot_epi64 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..da4169b40f3a45da95ec1373f981ad5c77c65206
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandnq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandnq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandnq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3922c9faa7ebaa8ab096cb00c012f178b3e09b14
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpandq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_and_epi64 (y, m, y, y);
+  y = _mm256_maskz_and_epi64 (m, y, y);
+
+  x = _mm_mask_and_epi64 (x, m, x, x);
+  x = _mm_maskz_and_epi64 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3579cf45e5b117811d1a50b0a3a0bcdae99ed271
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpandq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpandq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpavgb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpavgb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffcff26e12c894fba66e2fdb7e03d4236d2beebc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpavgb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpavgb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpavgb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpavgw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpavgw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8ce32abcb0ba7dd41c9e1224c2b7aaf2b3b161af
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpavgw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpavgw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpavgw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ff339726c03731b50da4fcc480d69df6c64acb86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpblendmb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpblendmb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4a62debab6c6e83852d158f9c784082f80eb6828
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vpblendmd|vmovdqa32)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmd|vmovdqa32)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_blend_epi32 (m, x, x);
+  xx = _mm_mask_blend_epi32 (m, xx, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b05227cbb8b7e446c94b47e434fbca2c5e465566
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpblendmd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpblendmd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc23d17aa554a1897e9e7e2e81cff67da55a90bb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "(vpblendmq|vmovdqa64)\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "(vpblendmq|vmovdqa64)\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_blend_epi64 (m, x, x);
+  xx = _mm_mask_blend_epi64 (m, xx, xx);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b15de68a41ce8623a97d152f9bc17e6cae6ad33
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpblendmq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpblendmq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..74c59aab49a1e06cc0dee495d6c13b4e4c0f4dc5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpblendmw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpblendmw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpblendmw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5f5575ac266bc1b441f5ae86681cb98782879f3e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpbroadcastb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpbroadcastb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c665163d005a45e183b14d3a3109425bd235fd54
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+%e\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+%e\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+%e\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+%e\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 { target { ! { ia32 } } } } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile int z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_broadcastd_epi32 (x, m, y);
+  x = _mm256_maskz_broadcastd_epi32 (m, y);
+  y = _mm_mask_broadcastd_epi32 (y, m, y);
+  y = _mm_maskz_broadcastd_epi32 (m, y);
+
+  x = _mm256_mask_set1_epi32 (x, m, z);
+  x = _mm256_maskz_set1_epi32 (m, z);
+  y = _mm_mask_set1_epi32 (y, m, z);
+  y = _mm_maskz_set1_epi32 (m, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bfa207f9153a4ac2eb240805ee2dc6ebf6cdf010
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpbroadcastd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpbroadcastd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmb2q-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmb2q-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..2417216613126337687f26be6699c565e1ddd6d8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmb2q-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd -O2" } */
+/* { dg-final { scan-assembler "vpbroadcastmb2q\[ \\t\]+\[^\n\]*k\[1-7\]\[^\n\]*%xmm\[0-7\]" } } */
+/* { dg-final { scan-assembler "vpbroadcastmb2q\[ \\t\]+\[^\n\]*k\[1-7\]\[^\n\]*%ymm\[0-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_broadcastmb_epi64 (m8);
+  x256 = _mm256_broadcastmb_epi64 (m8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmw2d-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmw2d-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a6891b2fc8f773fc7db8e317f1bb796b64f8f45d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastmw2d-1.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd -O2" } */
+/* { dg-final { scan-assembler "vpbroadcastmw2d\[ \\t\]+\[^\n\]*k\[1-7\]\[^\n\]*%xmm\[0-7\]" } } */
+/* { dg-final { scan-assembler "vpbroadcastmw2d\[ \\t\]+\[^\n\]*k\[1-7\]\[^\n\]*%ymm\[0-7\]" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask16 m16;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_broadcastmw_epi32 (m16);
+  x256 = _mm256_broadcastmw_epi32 (m16);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a957334a1c56b8dde9f9eb9281efda5497d6acbc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-1.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+%r\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+%r\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+%r\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 { target { ! { ia32 } } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+%r\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 { target { ! { ia32 } } } } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile long long z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_broadcastq_epi64 (x, m, y);
+  x = _mm256_maskz_broadcastq_epi64 (m, y);
+  y = _mm_mask_broadcastq_epi64 (y, m, y);
+  y = _mm_maskz_broadcastq_epi64 (m, y);
+
+  x = _mm256_mask_set1_epi64 (x, m, z);
+  x = _mm256_maskz_set1_epi64 (m, z);
+  y = _mm_mask_set1_epi64 (y, m, z);
+  y = _mm_maskz_set1_epi64 (m, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f4880280ea01071821b85de99ebb145903e78c8b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpbroadcastq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpbroadcastq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..981abef006be72d4391b6bf0a6171e0eb6b74083
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpbroadcastw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpbroadcastw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpbroadcastw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7b8e413c164668c05d4b7c1db0b4f0e23e5bfb43
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce99466f1ed48c92aae6a90bdd4dc53b3adfa191
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm256_cmp_epi32_mask (x, x, _MM_CMPINT_EQ);
+  m = _mm256_mask_cmp_epi32_mask (m, x, x, _MM_CMPINT_EQ);
+  m = _mm_cmp_epi32_mask (xx, xx, _MM_CMPINT_EQ);
+  m = _mm_mask_cmp_epi32_mask (m, xx, xx, _MM_CMPINT_EQ);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..957cb039128f3e3c2bfb151c0800812a07beb07b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5b068b071fbf1d700c0d9707c0d2a919f18d073
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpeqb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpeqb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c4a3a55930aa6d8d008f9bfc68e375b4fca4e617
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpcmpeqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcmpeqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcmpeqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcmpeqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_cmpeq_epi32_mask (x128, x128);
+  m = _mm256_cmpeq_epi32_mask (x256, x256);
+  m = _mm_mask_cmpeq_epi32_mask (3, x128, x128);
+  m = _mm256_mask_cmpeq_epi32_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fd6982ebe91dff09f581b11c6f94acf2d9aa188c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpeqd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpeqd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..65ef59206bc605049ab8bba07f15021cd5df3245
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpeqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpeqq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpeqq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_cmpeq_epi64_mask (x128, x128);
+  m = _mm256_cmpeq_epi64_mask (x256, x256);
+  m = _mm_mask_cmpeq_epi64_mask (3, x128, x128);
+  m = _mm256_mask_cmpeq_epi64_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b99ac1b050faa4bc6dde4395a399e671f3d364cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpeqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpeqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..82cd9cbfc1270488f4822bf72a66ebcbda5ee516
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpeqw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpeqw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpeqw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpged-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpged-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4af12f250365c8f0f942868a6b491c14f3e5a678
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpged-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpged-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpged-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca5a3cbeb1ed2d63a23765b532cbc2ce6a7c920b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9ad3d4ad1f5bb0eb2af22db31d41d3216b94fe5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ed2506c5923e9c94f5c309569c17a6c5a5fef61
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgeuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgeuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..143368a716618da06c40f70a39566c98368ebcfc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpgtb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpgtb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ba621ea694c80f6dd0bd9b49bcc7e09fea3003b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpgtd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_cmpgt_epi32_mask (x128, x128);
+  m = _mm256_cmpgt_epi32_mask (x256, x256);
+  m = _mm_mask_cmpgt_epi32_mask (3, x128, x128);
+  m = _mm256_mask_cmpgt_epi32_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..99daeb413c6cee73dcbbbfdc64852dd78b633a12
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgtd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgtd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce8cc4dc03715d0fc77fc471e2e71c76a99c50e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vpcmpgtq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpgtq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vpcmpgtq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_cmpgt_epi64_mask (x128, x128);
+  m = _mm256_cmpgt_epi64_mask (x256, x256);
+  m = _mm_mask_cmpgt_epi64_mask (3, x128, x128);
+  m = _mm256_mask_cmpgt_epi64_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..85f47be3d960bc468955f86d5f505ba3372c3f37
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgtq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpgtq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d5fcae7dced6bce91602cb30a909e9c719ad7da
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpgtw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpgtw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpgtw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpled-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpled-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..756b836c39a90e1359a090da826e0fd360edb6e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpled-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpled-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpled-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5a342713873686d521bafae8d3d40e80361271b1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc26cd24272606fa755c0171b1f2d195f9cb0b76
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..41ebcb9bfeac495b8dafec0d0def3b86c271b574
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpleuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpleuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2e0e5d59b8ff00ba416f4483756f84ebe578e126
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5e3d16c23a40ee8bbb5f46f04df36afe48386547
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..59d45ce944d5a5ac6e41bb95a75a9d8908fc07de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4380c6948a6a736b3ca2a5611558fe24e0f359e7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpltuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpltuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2fe87e9ed26aff53c7dd4a370e49cacc7be3454e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpneqd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpneqd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c0fb0291fa11ce55698a7d67ac47ef0d400b44c3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpneqq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpneqq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpneqq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ac9326784e4d6b94255187d818462382574a670e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpnequd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpnequd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..649179f6e466a222e7977b47c7a717209ab6e490
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpnequq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpnequq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpnequq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6be6171dacdd1b5df07c62dbd41f25f5880eeb5d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  m = _mm256_cmp_epi64_mask (x, x, _MM_CMPINT_UNUSED);
+  m = _mm256_mask_cmp_epi64_mask (m, x, x, _MM_CMPINT_NE);
+  m = _mm_cmp_epi64_mask (xx, xx, _MM_CMPINT_NLT);
+  m = _mm_mask_cmp_epi64_mask (m, xx, xx, _MM_CMPINT_GE);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7de841472af2d972cb4e385388fd5caa5c382fc8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpub-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4be301aab4aef97bbcb7f1fd9a28eca2994f0dc3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpub-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpub-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpub-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6de5a88be79091e3d54fd394a3ad936c72e9ba6b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm256_cmp_epu32_mask (x, x, _MM_CMPINT_LE);
+  m = _mm256_mask_cmp_epu32_mask (m, x, x, _MM_CMPINT_UNUSED);
+  m = _mm_cmp_epu32_mask (xx, xx, _MM_CMPINT_NE);
+  m = _mm_mask_cmp_epu32_mask (m, xx, xx, _MM_CMPINT_NLT);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0df8f868e686524c6b31098bb68e40e2c7020da3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..24b2da47ed25ee9265de03c26bfa3ce10ad145b1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler "vpcmpuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+/* { dg-final { scan-assembler "vpcmpuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vpcmpuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n^k\]*%k\[1-7\]\{" } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i xx;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm256_cmp_epu64_mask (x, x, _MM_CMPINT_NLE);
+  m = _mm256_mask_cmp_epu64_mask (m, x, x, _MM_CMPINT_GT);
+  m = _mm_cmp_epu64_mask (xx, xx, _MM_CMPINT_EQ);
+  m = _mm_mask_cmp_epu64_mask (m, xx, xx, _MM_CMPINT_LT);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..188962767877de55cf535ee412821ae5e350fd2e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcmpuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b0ec73bbf799c2d8bd80cb8e5a49a135189ea35
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpuw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpuw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpuw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fcd32b57d0e8c013e77f1b73eb6706f81522c37c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcmpw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpcmpw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..af00ab0ac464b65dd1dd5a7b8a4a0ecb9729bf8f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+int *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_compress_epi32 (x1, m, x1);
+  x2 = _mm_mask_compress_epi32 (x2, m, x2);
+
+  x1 = _mm256_maskz_compress_epi32 (m, x1);
+  x2 = _mm_maskz_compress_epi32 (m, x2);
+
+  _mm256_mask_compressstoreu_epi32 (p, m, x1);
+  _mm_mask_compressstoreu_epi32 (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6f1b08bb0a5728c1dcbf7d15528035233f06f36
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcompressd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcompressd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0fb73ca64b60ee34fa00cc83260a0c71e3916932
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpcompressq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*\\)\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+long long *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_compress_epi64 (x1, m, x1);
+  x2 = _mm_mask_compress_epi64 (x2, m, x2);
+
+  x1 = _mm256_maskz_compress_epi64 (m, x1);
+  x2 = _mm_maskz_compress_epi64 (m, x2);
+
+  _mm256_mask_compressstoreu_epi64 (p, m, x1);
+  _mm_mask_compressstoreu_epi64 (p, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9544eb1de7899501b283dea9766dab8dd2beaa4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpcompressq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcompressq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpcompressq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..db7a2e0c22c62282ae34327ead93a98639c5b15b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd -O2" } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s;
+volatile __m256i res;
+volatile __m128i s2;
+volatile __m128i res2;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_conflict_epi32 (s);
+  res = _mm256_mask_conflict_epi32 (res, 2, s);
+  res = _mm256_maskz_conflict_epi32 (2, s);
+  res2 = _mm_conflict_epi32 (s2);
+  res2 = _mm_mask_conflict_epi32 (res2, 2, s2);
+  res2 = _mm_maskz_conflict_epi32 (2, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b81684c845031c2e04cb209bedc5507eec712a9b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpconflictq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd -O2" } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpconflictq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s;
+volatile __m256i res;
+volatile __m128i s2;
+volatile __m128i res2;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_conflict_epi64 (s);
+  res = _mm256_mask_conflict_epi64 (res, 2, s);
+  res = _mm256_maskz_conflict_epi64 (2, s);
+  res2 = _mm_conflict_epi64 (s2);
+  res2 = _mm_mask_conflict_epi64 (res2, 2, s2);
+  res2 = _mm_maskz_conflict_epi64 (2, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..06135081af09a8eecf936253dc240230d14e4d38
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_maskz_permutexvar_epi32 (m, x, x);
+  x = _mm256_mask_permutexvar_epi32 (x, m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d10e6ed215455dc3053d1dcc1f39bcbfa107277
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermd-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermd-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7211427a78e0e3c2d319efc755a4eecf28b0c830
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermi2d\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2d\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask2_permutex2var_epi32 (x1, y, m, x1);
+  x2 = _mm_mask2_permutex2var_epi32 (x2, z, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..090cb40000f72c5014d3479aaf9a1a117b2c991c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2d-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2d-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2d-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7e1e971d174e51fe93f6660b1e44970e883ff233
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermi2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask2_permutex2var_pd (x1, y, m, x1);
+  x2 = _mm_mask2_permutex2var_pd (x2, z, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4ce1323e8f7a1a6003a746aa7c46fc7002df75b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ff3a2529e591ce67718a17eedf1f9addaeb0f902
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermi2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask2_permutex2var_ps (x1, y, m, x1);
+  x2 = _mm_mask2_permutex2var_ps (x2, z, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..377ee1b74fe31b0e9ef92bba82ca4174383308f0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9edffe8bea545f78452f561b06f3d34c9eb201d5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermi2q\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermi2q\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask2_permutex2var_epi64 (x1, y, m, x1);
+  x2 = _mm_mask2_permutex2var_epi64 (x2, z, m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..22418b31ac2fe6486613e7fa1f4550c8b66b70ff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2q-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2q-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermi2q-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2w-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..edac8cdf649f382e731a624f1b46882ad786385b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermi2w-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermi2w-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermi2w-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8986e09bd25de1e4d5cfc79ece766699286bff04
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d y;
+volatile __m256i c;
+volatile __m128d x;
+volatile __m128i k;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_permutevar_pd (y, m, y, c);
+  y = _mm256_maskz_permutevar_pd (m, y, c);
+  x = _mm_mask_permutevar_pd (x, m, x, k);
+  x = _mm_maskz_permutevar_pd (m, x, k);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf2383094bab26110d2be68d61c6cdbfcb39d783
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f84f40a3dba2ceedb74f2c1366dc3ea8a3009c4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 { xfail *-*-* } } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*3\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*3\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilpd\[ \\t\]+\[^\n\]*3\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d y;
+volatile __m128d x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_permute_pd (y, m, y, 13);
+  y = _mm256_maskz_permute_pd (m, y, 13);
+  x = _mm_mask_permute_pd (x, m, x, 3);
+  x = _mm_maskz_permute_pd (m, x, 3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5a2b4046288dc04fb771c59c5a183cee5c1e23dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpdi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpdi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpdi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3bf91d625644be566e06e8e60401736b62b365db
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 y;
+volatile __m128 x;
+volatile __m256i c;
+volatile __m128i k;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_permutevar_ps (y, m, y, c);
+  y = _mm256_maskz_permutevar_ps (m, y, c);
+  x = _mm_mask_permutevar_ps (x, m, x, k);
+  x = _mm_maskz_permutevar_ps (m, x, k);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..df724c7db0d4a8e918b39465d6c20a44ff0e7d93
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..503a65178e0a0c11556d393481ee88f419722bcf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermilps\[ \\t\]+\[^\n\]*13\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 y;
+volatile __m128 x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_permute_ps (y, m, y, 13);
+  y = _mm256_maskz_permute_ps (m, y, 13);
+  x = _mm_mask_permute_ps (x, m, x, 13);
+  x = _mm_maskz_permute_ps (m, x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5e7cbff63524de16c01ff88946e826eb9145498
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermilpsi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpsi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermilpsi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2fde4bb256fb5f62c31206f7c534daa1c6e03e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m256d y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_permutexvar_pd (x, y);
+  y = _mm256_mask_permutexvar_pd (y, m, x, y);
+  y = _mm256_maskz_permutexvar_pd (m, x, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..84ae96626a5f61c063f44ab66401978456ffff10
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpd-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermpd-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..aeedc5f2692882cf58145d4cefbacd66352dd27d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_permutex_pd (x, 13);
+  x = _mm256_mask_permutex_pd (x, m, x, 13);
+  x = _mm256_maskz_permutex_pd (m, x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c48043b860813241d53cb88e5b14c20e3c3b7fcb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermpdi-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermpdi-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ed8c80359c5031465ecae4eda040206dd3f4849
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-1.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m256 y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_permutexvar_ps (x, y);
+  y = _mm256_mask_permutexvar_ps (y, m, x, y);
+  y = _mm256_maskz_permutexvar_ps (m, x, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e53b1777de7aa4f0fa218edbc499655a0cd1ffac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermps-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermps-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f949a7602064c08db7d0cb22e597ba2dace011cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_permutex_epi64 (x, m, x, 13);
+  x = _mm256_maskz_permutex_epi64 (m, x, 13);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ac7c671ba965d448e51ba19dfe1cfaf8e207182b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermq-imm-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b333e90073a0358b7482868385a6c2c47f4d7b7a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_maskz_permutexvar_epi64 (m, x, x);
+  x = _mm256_mask_permutexvar_epi64 (x, m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..af096f52e497c15359ec7c0988f31397801c3fc9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermq-var-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..91930846cb03e574cf4d577e23963611290da9f7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2d\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_permutex2var_epi32 (x1, y, x1);
+  x1 = _mm256_mask_permutex2var_epi32 (x1, m, y, x1);
+  x1 = _mm256_maskz_permutex2var_epi32 (m, x1, y, x1);
+  x2 = _mm_permutex2var_epi32 (x2, z, x2);
+  x2 = _mm_mask_permutex2var_epi32 (x2, m, z, x2);
+  x2 = _mm_maskz_permutex2var_epi32 (m, x2, z, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..82e045c572a825991113cdf0e07b632ac59a767d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2d-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2d-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2d-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a61fcfc26ed4b2f23f6fb6c4a3f0c144c0e2104
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_permutex2var_pd (x1, y, x1);
+  x1 = _mm256_mask_permutex2var_pd (x1, m, y, x1);
+  x1 = _mm256_maskz_permutex2var_pd (m, x1, y, x1);
+  x2 = _mm_permutex2var_pd (x2, z, x2);
+  x2 = _mm_mask_permutex2var_pd (x2, m, z, x2);
+  x2 = _mm_maskz_permutex2var_pd (m, x2, z, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..66681eb4da76630f291ae186fc31528a15ea7c67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..57125e4a4c7b3da2b0e89e2f2457a8726de82052
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_permutex2var_ps (x1, y, x1);
+  x1 = _mm256_mask_permutex2var_ps (x1, m, y, x1);
+  x1 = _mm256_maskz_permutex2var_ps (m, x1, y, x1);
+  x2 = _mm_permutex2var_ps (x2, z, x2);
+  x2 = _mm_mask_permutex2var_ps (x2, m, z, x2);
+  x2 = _mm_maskz_permutex2var_ps (m, x2, z, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf6e0a8ee1a39f69fd72fbd09189553d504bd1cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ba76a81324db003afd4326853dce797e94868ff2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpermt2q\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_permutex2var_epi64 (x1, y, x1);
+  x1 = _mm256_mask_permutex2var_epi64 (x1, m, y, x1);
+  x1 = _mm256_maskz_permutex2var_epi64 (m, x1, y, x1);
+  x2 = _mm_permutex2var_epi64 (x2, z, x2);
+  x2 = _mm_mask_permutex2var_epi64 (x2, m, z, x2);
+  x2 = _mm_maskz_permutex2var_epi64 (m, x2, z, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..998b1752d04f8de5baddabcfa8e7dd35923a8d2d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2q-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2q-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpermt2q-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2w-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf33b6ab57281d63041e966f283a79e20f35725c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermt2w-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermt2w-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermt2w-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpermw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpermw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f01064ecfc3f4c951c5aab3aa3c99c24c410501
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpermw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpermw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..aa68a5c400fd92b682d94b5f2227a72e6bc47cc3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpexpandd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+int *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_expand_epi32 (x1, m, x1);
+  x2 = _mm_mask_expand_epi32 (x2, m, x2);
+
+  x1 = _mm256_maskz_expand_epi32 (m, x1);
+  x2 = _mm_maskz_expand_epi32 (m, x2);
+
+  x1 = _mm256_mask_expandloadu_epi32 (x1, m, p);
+  x2 = _mm_mask_expandloadu_epi32 (x2, m, p);
+
+  x1 = _mm256_maskz_expandloadu_epi32 (m, p);
+  x2 = _mm_maskz_expandloadu_epi32 (m, p);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c353d5a13117dc032dc6ec0832aedc7b7f391e3e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpexpandd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpexpandd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..418e1b41e645ba03f90352af3f6c4b4389e23f93
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-1.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpexpandq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+/* { dg-final { scan-assembler-times "vpexpandq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 2 } } */
+
+#include <immintrin.h>
+
+long long *p;
+volatile __m256i x1;
+volatile __m128i x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_expand_epi64 (x1, m, x1);
+  x2 = _mm_mask_expand_epi64 (x2, m, x2);
+
+  x1 = _mm256_maskz_expand_epi64 (m, x1);
+  x2 = _mm_maskz_expand_epi64 (m, x2);
+
+  x1 = _mm256_mask_expandloadu_epi64 (x1, m, p);
+  x2 = _mm_mask_expandloadu_epi64 (x2, m, p);
+
+  x1 = _mm256_maskz_expandloadu_epi64 (m, p);
+  x2 = _mm_maskz_expandloadu_epi64 (m, p);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2b571b7faa27de338d5d53c11893f8b51d99037c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpexpandq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpexpandq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpexpandq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e93805d459b0aea6f688def77d91910ba2eeaf24
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd -O2" } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1} } */
+/* { dg-final { scan-assembler-times "vplzcntd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s;
+volatile __m256i res;
+volatile __m128i s2;
+volatile __m128i res2;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_lzcnt_epi32 (s);
+  res = _mm256_mask_lzcnt_epi32 (res, 2, s);
+  res = _mm256_maskz_lzcnt_epi32 (2, s);
+  res2 = _mm_lzcnt_epi32 (s2);
+  res2 = _mm_mask_lzcnt_epi32 (res2, 2, s2);
+  res2 = _mm_maskz_lzcnt_epi32 (2, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef8042ef3f5b52e3079fde3debd88c87db8bccca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vplzcntq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512cd  -O2" } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vplzcntq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i s;
+volatile __m256i res;
+volatile __m128i s2;
+volatile __m128i res2;
+
+void extern
+avx512vl_test (void)
+{
+  res = _mm256_lzcnt_epi64 (s);
+  res = _mm256_maskz_lzcnt_epi64 (2, s);
+  res = _mm256_mask_lzcnt_epi64 (res, 2, s);
+  res2 = _mm_lzcnt_epi64 (s2);
+  res2 = _mm_maskz_lzcnt_epi64 (2, s2);
+  res2 = _mm_mask_lzcnt_epi64 (res2, 2, s2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddubsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddubsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5eb756b1ebf0b6b1f04dbf76f70df314424aa554
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddubsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaddubsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaddubsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddwd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2e1b6c9551871a6ac580f7628be5c9ab17294233
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaddwd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaddwd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaddwd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..06c22a216163cea3d1396d0206e476d4186e2949
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxsb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxsb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a2db4f0db85dc8fc67dcd40df3691570944b9da6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_max_epi32 (x, m, x, x);
+  x = _mm256_maskz_max_epi32 (m, x, x);
+  y = _mm_mask_max_epi32 (y, m, y, y);
+  y = _mm_maskz_max_epi32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ff1017afbd51e5effd878a6fcc4576967b8c7c68
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxsd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxsd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7c1d669d8cc7673f41958b54b14a193b2f8e4d23
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_max_epi64 (x, x);
+  x = _mm256_mask_max_epi64 (x, m, x, x);
+  x = _mm256_maskz_max_epi64 (m, x, x);
+  y = _mm_max_epi64 (y, y);
+  y = _mm_mask_max_epi64 (y, m, y, y);
+  y = _mm_maskz_max_epi64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..958e8d3190ab9caedd6cd4144bb84ce2edb64057
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxsq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxsq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bc769aa7addc51c34c9408a1174c3c054915d1a0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxub-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..90797d900e9ffe281b6fc95594de474d0df97e29
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxub-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxub-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxub-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2e6d1210a19a00ad2914aff635278ea93bc64d0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_max_epu32 (x, m, x, x);
+  x = _mm256_maskz_max_epu32 (m, x, x);
+  y = _mm_mask_max_epu32 (y, m, y, y);
+  y = _mm_maskz_max_epu32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f61e911fe602a356a07c219f978bab961b156b1f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ff7768a1afd74ae8d2c349daa014bf524bbd061
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmaxuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_max_epu64 (x, x);
+  x = _mm256_mask_max_epu64 (x, m, x, x);
+  x = _mm256_maskz_max_epu64 (m, x, x);
+  y = _mm_max_epu64 (y, y);
+  y = _mm_mask_max_epu64 (y, m, y, y);
+  y = _mm_maskz_max_epu64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb985567224f5a37d2d8cc0c7e530728c2ed6dc5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmaxuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..65c78fd62c0d29522f1d981790b535bda6ab60dd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmaxuw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxuw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmaxuw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..16282201365a7278200f0dbad8d687c7152855e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminsb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminsb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8a87dbae59bdb0a233a872f96bf4dd69b00f1afb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_min_epi32 (x, m, x, x);
+  x = _mm256_maskz_min_epi32 (m, x, x);
+  y = _mm_mask_min_epi32 (y, m, y, y);
+  y = _mm_maskz_min_epi32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc465e8492fae58a258c7dae4160cafc5a535ce0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminsd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminsd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a76c9de1de252f1579444cd871da58d0b7a9c21
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminsq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_min_epi64 (x, x);
+  x = _mm256_mask_min_epi64 (x, m, x, x);
+  x = _mm256_maskz_min_epi64 (m, x, x);
+  y = _mm_min_epi64 (y, y);
+  y = _mm_mask_min_epi64 (y, m, y, y);
+  y = _mm_maskz_min_epi64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0f68a0fe28e43cde5ec1ee5b03015cb7effe7d5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminsq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminsq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..940a87f9eb374342555dbdf373b512cb54b837bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminub-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminub-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d6f21456b6d210f29096bfddf449ad9dd91325f1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminub-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminub-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminub-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7c55d8713e2bed07404eb6add89c9b678b0e2f91
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpminud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminud\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminud\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_min_epu32 (x, m, x, x);
+  x = _mm256_maskz_min_epu32 (m, x, x);
+  y = _mm_mask_min_epu32 (y, m, y, y);
+  y = _mm_maskz_min_epu32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..34a17f8e08a5a2aa711a4282bbe04ea61a1de698
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminud-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminud-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminud-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2c997a04b00281523426c579fbc30f68c69bd2c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpminuq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_min_epu64 (x, x);
+  x = _mm256_mask_min_epu64 (x, m, x, x);
+  x = _mm256_maskz_min_epu64 (m, x, x);
+  y = _mm_min_epu64 (y, y);
+  y = _mm_mask_min_epu64 (y, m, y, y);
+  y = _mm_maskz_min_epu64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..67f1e4afa8dbdb754aa07e7a827e940a896f6192
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminuq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpminuq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpminuw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..71f0accb84c93e6869f0154716f7e731bec507d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpminuw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminuw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpminuw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovb2m-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovb2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d178049552f5502c7dd2b1905fe685ae5cc1357c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovb2m-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovb2m-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovb2m-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovd2m-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovd2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd76c21233619024e85d9ac08d0d00ae5d92a3a0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovd2m-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovd2m-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovd2m-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5ea9418ab7b875825a6aeef25363959031a13bd3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtepi32_epi8 (x);
+  z = _mm_mask_cvtepi32_epi8 (z, m, x);
+  z = _mm_maskz_cvtepi32_epi8 (m, x);
+  z = _mm256_cvtepi32_epi8 (y);
+  z = _mm256_mask_cvtepi32_epi8 (z, m, y);
+  z = _mm256_maskz_cvtepi32_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d2f3adc2a408d5ce837510645b7621b76ae295e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovdb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovdb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cba590ddccea18d0128427b72c4e19db669b9bfe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtepi32_epi16 (x);
+  z = _mm_mask_cvtepi32_epi16 (z, m, x);
+  z = _mm_maskz_cvtepi32_epi16 (m, x);
+  z = _mm256_cvtepi32_epi16 (y);
+  z = _mm256_mask_cvtepi32_epi16 (z, m, y);
+  z = _mm256_maskz_cvtepi32_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ec76377f542d580c32c6aa5983a6ae0f2ebdbaa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovdw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovdw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovdw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2b-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2b-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8783abd0feb5dd184fa5611f0c9628df66ba08de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2b-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovm2b-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovm2b-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2d-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2d-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..639d0cc4d013091f780914dc20c3be5d70d369db
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2d-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovm2d-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovm2d-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2q-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2q-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc316a8d0ea1a134089da976ef0866f7a1e21f29
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2q-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovm2q-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovm2q-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2w-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2w-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b8eaa7b97546081a2fcf7a7795b9f2bce02695f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovm2w-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovm2w-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovm2w-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovq2m-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovq2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..dfcd7996385f3b573a68a0429176df6415dfb640
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovq2m-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovq2m-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmovq2m-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..8cdca2dfa411d81468d13611720900ba15b84084
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtepi64_epi8 (x);
+  z = _mm_mask_cvtepi64_epi8 (z, m, x);
+  z = _mm_maskz_cvtepi64_epi8 (m, x);
+  z = _mm256_cvtepi64_epi8 (y);
+  z = _mm256_mask_cvtepi64_epi8 (z, m, y);
+  z = _mm256_maskz_cvtepi64_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..893d30bbae1ea72e612ebc7790f93536d405985c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..063d937c415153971380d063442db0ab04636cad
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtepi64_epi32 (x);
+  z = _mm_mask_cvtepi64_epi32 (z, m, x);
+  z = _mm_maskz_cvtepi64_epi32 (m, x);
+  z = _mm256_cvtepi64_epi32 (y);
+  z = _mm256_mask_cvtepi64_epi32 (z, m, y);
+  z = _mm256_maskz_cvtepi64_epi32 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2570919bef87cc151bef4d31a0de6de9b5c906a4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e3d6ddfe646f5f0cafac04b532b92c0e86a2a18b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtepi64_epi16 (x);
+  z = _mm_mask_cvtepi64_epi16 (z, m, x);
+  z = _mm_maskz_cvtepi64_epi16 (m, x);
+  z = _mm256_cvtepi64_epi16 (y);
+  z = _mm256_mask_cvtepi64_epi16 (z, m, y);
+  z = _mm256_maskz_cvtepi64_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0983ac57d57c4d8211f6cb88a5bfd43beafd630c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovqw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovqw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..876f0cfea946e949081ab69d5e7b0931e95d9b70
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtsepi32_epi8 (x);
+  z = _mm_mask_cvtsepi32_epi8 (z, m, x);
+  z = _mm_maskz_cvtsepi32_epi8 (m, x);
+  z = _mm256_cvtsepi32_epi8 (y);
+  z = _mm256_mask_cvtsepi32_epi8 (z, m, y);
+  z = _mm256_maskz_cvtsepi32_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2a73d23af61e94ad4c1da983882ae1bdbcfb065b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsdb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsdb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ae2a45b8fddba5b8b793ba8536f3c171154be151
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtsepi32_epi16 (x);
+  z = _mm_mask_cvtsepi32_epi16 (z, m, x);
+  z = _mm_maskz_cvtsepi32_epi16 (m, x);
+  z = _mm256_cvtsepi32_epi16 (y);
+  z = _mm256_mask_cvtsepi32_epi16 (z, m, y);
+  z = _mm256_maskz_cvtsepi32_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e1bd82abd04d2137363eea8517df9e9f8b6b83b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsdw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsdw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsdw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..68f70fdd3dc8d70fbd186f5b0f21442f88f79980
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtsepi64_epi8 (x);
+  z = _mm_mask_cvtsepi64_epi8 (z, m, x);
+  z = _mm_maskz_cvtsepi64_epi8 (m, x);
+  z = _mm256_cvtsepi64_epi8 (y);
+  z = _mm256_mask_cvtsepi64_epi8 (z, m, y);
+  z = _mm256_maskz_cvtsepi64_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0ffc86c8256d0151abcd73224fff7b6164cbbd04
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ca1fe284c46920e906933199e91ceb603cc89ff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtsepi64_epi32 (x);
+  z = _mm_mask_cvtsepi64_epi32 (z, m, x);
+  z = _mm_maskz_cvtsepi64_epi32 (m, x);
+  z = _mm256_cvtsepi64_epi32 (y);
+  z = _mm256_mask_cvtsepi64_epi32 (z, m, y);
+  z = _mm256_maskz_cvtsepi64_epi32 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7e9ed106c860c28afcdef7254cab98eb8808edd7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cca0d09a983543da9bc8216325bcbc42c4987b9a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtsepi64_epi16 (x);
+  z = _mm_mask_cvtsepi64_epi16 (z, m, x);
+  z = _mm_maskz_cvtsepi64_epi16 (m, x);
+  z = _mm256_cvtsepi64_epi16 (y);
+  z = _mm256_mask_cvtsepi64_epi16 (z, m, y);
+  z = _mm256_maskz_cvtsepi64_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0dacb477c8cd2473f0354d34b04f813d8d13e4a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsqw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsqw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovswb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2384d917c6de660ecdfae7694f6ee723f773f11
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovswb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovswb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovswb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e54b3f81da7f0ff65bcd354edc8662083ca82457
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi8_epi32 (res1, m, s);
+  res2 = _mm_mask_cvtepi8_epi32 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi8_epi32 (m, s);
+  res2 = _mm_maskz_cvtepi8_epi32 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b36fd4c05be4caac05808aff2b79bd9e409e780
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxbd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxbd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..095f532493f56ca839725e5769dbb6e623b28cc7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi8_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepi8_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi8_epi64 (m, s);
+  res2 = _mm_maskz_cvtepi8_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..289ebd4cc0ef467afe7802da119b95326f40598d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxbq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxbq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..71dca4eca769e99118ef2604cec5447f1d0f9b6d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxbw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovsxbw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovsxbw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c6ba11be5c4ebc3d3827d8949e153f786f343f4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi32_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepi32_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi32_epi64 (m, s);
+  res2 = _mm_maskz_cvtepi32_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c564c1210d6202aad2072453da7fa7df21d63e3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxdq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxdq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxdq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..69a019d05df56d2c9235497ac32c09368031355e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi16_epi32 (res1, m, s);
+  res2 = _mm_mask_cvtepi16_epi32 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi16_epi32 (m, s);
+  res2 = _mm_maskz_cvtepi16_epi32 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e8d466ca4ce4705b074bb03c20096d625741c8c9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxwd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxwd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..72ad8618354cf1c24c526157b089b99dd98128d7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovsxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovsxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepi16_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepi16_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepi16_epi64 (m, s);
+  res2 = _mm_maskz_cvtepi16_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cb4cf2433348f3745e01a18b7b724abf48dd7feb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovsxwq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxwq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovsxwq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..81a308ff297a976c7fa4308d816087b45d8a6b00
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtusepi32_epi8 (x);
+  z = _mm_mask_cvtusepi32_epi8 (z, m, x);
+  z = _mm_maskz_cvtusepi32_epi8 (m, x);
+  z = _mm256_cvtusepi32_epi8 (y);
+  z = _mm256_mask_cvtusepi32_epi8 (z, m, y);
+  z = _mm256_maskz_cvtusepi32_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4230463c1bd89fe6a219a7f48ae78d74d5c4a647
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusdb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusdb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9fe534dfcee5ce5a7366def1e86e051d2d2076d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusdw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtusepi32_epi16 (x);
+  z = _mm_mask_cvtusepi32_epi16 (z, m, x);
+  z = _mm_maskz_cvtusepi32_epi16 (m, x);
+  z = _mm256_cvtusepi32_epi16 (y);
+  z = _mm256_mask_cvtusepi32_epi16 (z, m, y);
+  z = _mm256_maskz_cvtusepi32_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..db4fff646daadd952de8c2ef3c4d8cd71d8f55a5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusdw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusdw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusdw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d64e81c2edabea3684cf167d5400e7e16bc991d3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqb\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtusepi64_epi8 (x);
+  z = _mm_mask_cvtusepi64_epi8 (z, m, x);
+  z = _mm_maskz_cvtusepi64_epi8 (m, x);
+  z = _mm256_cvtusepi64_epi8 (y);
+  z = _mm256_mask_cvtusepi64_epi8 (z, m, y);
+  z = _mm256_maskz_cvtusepi64_epi8 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..644f1785714d81cbae7d1cddd8c208c8579e3dca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..05d0bb5e2a89ea728477950ff1b9fc96bc8ec0d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtusepi64_epi32 (x);
+  z = _mm_mask_cvtusepi64_epi32 (z, m, x);
+  z = _mm_maskz_cvtusepi64_epi32 (m, x);
+  z = _mm256_cvtusepi64_epi32 (y);
+  z = _mm256_mask_cvtusepi64_epi32 (z, m, y);
+  z = _mm256_maskz_cvtusepi64_epi32 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ea1dacc28515bef52835df10e519f9bc49a9de1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d98b6d56d9b553e3e2957568c26b81ffc7f14bde
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\[\\n\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovusqw\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i x, z;
+volatile __m256i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  z = _mm_cvtusepi64_epi16 (x);
+  z = _mm_mask_cvtusepi64_epi16 (z, m, x);
+  z = _mm_maskz_cvtusepi64_epi16 (m, x);
+  z = _mm256_cvtusepi64_epi16 (y);
+  z = _mm256_mask_cvtusepi64_epi16 (z, m, y);
+  z = _mm256_maskz_cvtusepi64_epi16 (m, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7a34af4076f0712c632f6c053b32f41f269df20
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovusqw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovusqw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovuswb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovuswb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd8b215c0d0f784ede6f32dea11cc433c0bbe312
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovuswb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovuswb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovuswb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovw2m-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovw2m-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..dd2da1d84d556933cd2889f2a08409c532c3602d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovw2m-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovw2m-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovw2m-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovwb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovwb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ed7c246d7f1d26960d95411e0805a3680bb04c38
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovwb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovwb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovwb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..23d6ed138b8bc967e2d64ce37d899266afcad218
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepu8_epi32 (res1, m, s);
+  res2 = _mm_mask_cvtepu8_epi32 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu8_epi32 (m, s);
+  res2 = _mm_maskz_cvtepu8_epi32 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..db10b72ca1adc33627c70634b7ad85bf991e0363
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxbd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxbd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..af642114afb7f0ebd8e3890ad396babb4bb4bee1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxbq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepu8_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepu8_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu8_epi64 (m, s);
+  res2 = _mm_maskz_cvtepu8_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd193327563f127f4ba09acfebbccb66191a9163
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxbq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxbq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c24ebf7fb6988958996488a09c98f6804b553992
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxbw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovzxbw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmovzxbw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4695b5545cf41053a7f58f8bcc77ff0e3f88f1cc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepu32_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepu32_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu32_epi64 (m, s);
+  res2 = _mm_maskz_cvtepu32_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c351c22aaa7f06d34a22cbb46ff9fd4b5ccd838b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxdq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxdq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxdq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b18d2fa668ab5408d74bf8ec6362bf9604098fd1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepu16_epi32 (res1, m, s);
+  res2 = _mm_mask_cvtepu16_epi32 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu16_epi32 (m, s);
+  res2 = _mm_maskz_cvtepu16_epi32 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8eef3e88b1c4a01e5883963eebd323af9870d0a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxwd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxwd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e624109f95d3a12d629ed334313c241dacfd1a5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmovzxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmovzxwq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128i s, res2;
+volatile __m256i res1;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  res1 = _mm256_mask_cvtepu16_epi64 (res1, m, s);
+  res2 = _mm_mask_cvtepu16_epi64 (res2, m, s);
+
+  res1 = _mm256_maskz_cvtepu16_epi64 (m, s);
+  res2 = _mm_maskz_cvtepu16_epi64 (m, s);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1be6cb5b9b3a8030445b7c12e75e376935543d3c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmovzxwq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxwq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmovzxwq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a57dd0614cab67462a2373d78eba867a6c89a81
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmuldq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuldq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuldq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuldq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_mul_epi32 (x, m, x, x);
+  x = _mm256_maskz_mul_epi32 (m, x, x);
+  y = _mm_mask_mul_epi32 (y, m, y, y);
+  y = _mm_maskz_mul_epi32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7d2eea55d2c0d591647d77835ded68f588757aa1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuldq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmuldq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmuldq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhrsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhrsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..39841f5d77431be5e5cd151d81c071cae5af3229
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhrsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhrsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhrsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhuw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhuw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5f2dcb9eecd0f392d5d923b3c91b17fafb07441b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhuw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhuw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhuw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..669ee7c98fecb9d4e45a704942bc0b4fdb00eac1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulhw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmulhw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6cc59e5964b45338104ec21465b04a97df78d9b7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i z;
+volatile __mmask8 myz;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_mullo_epi32 (y, myz, y, y);
+  y = _mm256_maskz_mullo_epi32 (myz, y, y);
+  z = _mm_mask_mullo_epi32 (z, myz, z, z);
+  z = _mm_maskz_mullo_epi32 (myz, z, z);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1ea4456a9f2a861c82203e04dc68859958b4f5ce
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmulld-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmulld-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmullq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmullq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..36a77b133cbdb6e7f6845a73f00d1ec612165440
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmullq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmullq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vpmullq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmullw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmullw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f01b3c9798660ad5ec62be6f2979a84f8b333e91
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmullw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmullw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpmullw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..dfe0e2a12afc4d7522c6d87aac8e46fcddb3aea0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-1.c
@@ -0,0 +1,20 @@
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpmuludq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuludq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuludq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpmuludq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}{z}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_mul_epu32 (x, m, x, x);
+  x = _mm256_maskz_mul_epu32 (m, x, x);
+  y = _mm_mask_mul_epu32 (y, m, y, y);
+  y = _mm_maskz_mul_epu32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cd2b3e6da55b11196b866422370e50e0f9445a4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpmuludq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmuludq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpmuludq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpord-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpord-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..01a0aa67dae9ee7b4ca766dedbd58940b361cd09
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpord-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_or_epi32 (y, m, y, y);
+  y = _mm256_maskz_or_epi32 (m, y, y);
+
+  x = _mm_mask_or_epi32 (x, m, x, x);
+  x = _mm_maskz_or_epi32 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpord-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpord-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c81e1f763ffef8ce818d382773a0f056d72214c7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpord-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpord-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpord-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vporq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vporq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9a89a32be1ba65f86c2ffa91b397bb494f16500
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vporq-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vporq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_or_epi64 (y, m, y, y);
+  y = _mm256_maskz_or_epi64 (m, y, y);
+
+  x = _mm_mask_or_epi64 (x, m, x, x);
+  x = _mm_maskz_or_epi64 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vporq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vporq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..776181fdba2728319164e28677c3884cc231a182
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vporq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vporq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vporq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprold-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprold-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..22cb7c13c4dd691ff247b10323ce53129dc6d272
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprold-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprold\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rol_epi32 (x, 11);
+  x = _mm256_mask_rol_epi32 (x, m, x, 11);
+  x = _mm256_maskz_rol_epi32 (m, x, 11);
+
+  y = _mm_rol_epi32 (y, 12);
+  y = _mm_mask_rol_epi32 (y, m, y, 12);
+  y = _mm_maskz_rol_epi32 (m, y, 12);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprold-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprold-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c7b4ab629fcc06fe6d088e34d2800f96a8afc03
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprold-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprold-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprold-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..24ef525eee57235b1e32ecdc3ce1cb04f9fcdcf1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rol_epi64 (x, 11);
+  x = _mm256_mask_rol_epi64 (x, m, x, 11);
+  x = _mm256_maskz_rol_epi64 (m, x, 11);
+
+  y = _mm_rol_epi64 (y, 12);
+  y = _mm_mask_rol_epi64 (y, m, y, 12);
+  y = _mm_maskz_rol_epi64 (m, y, 12);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf1f98f2647f6fe64afd50d37a26510fa84d1689
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f6b60451f6f344ffa482e454b2fed64c099b919
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rolv_epi32 (x, x);
+  x = _mm256_mask_rolv_epi32 (x, m, x, x);
+  x = _mm256_maskz_rolv_epi32 (m, x, x);
+
+  y = _mm_rolv_epi32 (y, y);
+  y = _mm_mask_rolv_epi32 (y, m, y, y);
+  y = _mm_maskz_rolv_epi32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0f31644b0fb6476b774fd1a46ed8a7239fb7c925
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolvd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolvd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a4e68084bf08dec1e2a34a82fab41c9b334aa21
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprolvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rolv_epi64 (x, x);
+  x = _mm256_mask_rolv_epi64 (x, m, x, x);
+  x = _mm256_maskz_rolv_epi64 (m, x, x);
+
+  y = _mm_rolv_epi64 (y, y);
+  y = _mm_mask_rolv_epi64 (y, m, y, y);
+  y = _mm_maskz_rolv_epi64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b203c9fdd5a0e51d63def6ecf106fa4ea216caf8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprolvq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolvq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprolvq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprord-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprord-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9fad895877701bfc47f8109e45d5c028bc0f457
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprord-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_ror_epi32 (x, 11);
+  x = _mm256_mask_ror_epi32 (x, m, x, 11);
+  x = _mm256_maskz_ror_epi32 (m, x, 11);
+
+  y = _mm_ror_epi32 (y, 12);
+  y = _mm_mask_ror_epi32 (y, m, y, 12);
+  y = _mm_maskz_ror_epi32 (m, y, 12);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprord-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprord-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ae0e3ba6bf569b1bb4de54231e7e794577c16d7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprord-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprord-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprord-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1511ad60e64c4e4dee56a924ade6d37b911792a7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_ror_epi64 (x, 11);
+  x = _mm256_mask_ror_epi64 (x, m, x, 11);
+  x = _mm256_maskz_ror_epi64 (m, x, 11);
+
+  y = _mm_ror_epi64 (y, 12);
+  y = _mm_mask_ror_epi64 (y, m, y, 12);
+  y = _mm_maskz_ror_epi64 (m, y, 12);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..83aacd134e69068dd68f14fed1441f26e60a901a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c383adf7906e99bd05d4227cd861d5e81cfdd6b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rorv_epi32 (x, x);
+  x = _mm256_mask_rorv_epi32 (x, m, x, x);
+  x = _mm256_maskz_rorv_epi32 (m, x, x);
+
+  y = _mm_rorv_epi32 (y, y);
+  y = _mm_mask_rorv_epi32 (y, m, y, y);
+  y = _mm_maskz_rorv_epi32 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..373beebb2ab2c7a2bd9008dbc79d7961c03cba22
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorvd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorvd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..58435058035912d2ca917b38fe190ec8728931fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vprorvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_rorv_epi64 (x, x);
+  x = _mm256_mask_rorv_epi64 (x, m, x, x);
+  x = _mm256_maskz_rorv_epi64 (m, x, x);
+
+  y = _mm_rorv_epi64 (y, y);
+  y = _mm_mask_rorv_epi64 (y, m, y, y);
+  y = _mm_maskz_rorv_epi64 (m, y, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..781b62b8e120b01aa4c995598a7088f9ac2e9078
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vprorvq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorvq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vprorvq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsadbw-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsadbw-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5ee60602ab428646df60eb7775daf11547b8b0fe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsadbw-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -mavx512bw -O2" } */
+/* { dg-final { scan-assembler "vpsadbw\[ \\t\]+\[^\n\]*%zmm\[0-9\]"} } */
+
+#include <immintrin.h>
+
+volatile __m512i x;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm512_sad_epu8 (x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpshufb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..85133e3a6c0f99365c6ae5889a316d210567f861
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshufb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshufb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d7f6380be5e34de956f4adef643607aef68e0935
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpshufd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpshufd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_shuffle_epi32 (x, m, x, _MM_PERM_AADB);
+  x = _mm256_maskz_shuffle_epi32 (m, x, _MM_PERM_AADB);
+  y = _mm_mask_shuffle_epi32 (y, m, y, _MM_PERM_AADB);
+  y = _mm_maskz_shuffle_epi32 (m, y, _MM_PERM_AADB);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..54223fd4dd4154b4988e7ec1a56081d65d8abb53
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpshufd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpshufd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpshufhw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufhw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a65ec081c1ecb62de510d58f6f3ab3910b24e5e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpshufhw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshufhw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshufhw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpshuflw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpshuflw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d534f154be3e0cbb01841d354f3df96a89703fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpshuflw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshuflw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpshuflw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6e9e24423b75f87959aa593df52ad5353e857b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 4 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sll_epi32 (x256, m256, x256, x128);
+  x256 = _mm256_maskz_sll_epi32 (m256, x256, x128);
+  x128 = _mm_mask_sll_epi32 (x128, m128, x128, x128);
+  x128 = _mm_maskz_sll_epi32 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..681feb04ccbba62b6b8fce5b183868021e96b3ba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpslld-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpslld-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpslld-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ad049c012c40ef19c34047f596388a286ea2007f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpslld\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m256;
+volatile __mmask8 m128;
+#define y 7
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_slli_epi32 (x256, m256, x256, y);
+  x256 = _mm256_maskz_slli_epi32 (m256, x256, y);
+  x128 = _mm_mask_slli_epi32 (x128, m128, x128, y);
+  x128 = _mm_maskz_slli_epi32 (m128, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..31baa684d527e2785ffaa3092b2337aef3196e33
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpslldi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpslldi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpslldi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a703cf2ad53e24e76f483f3bc9ef1e38993e97a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 4 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m256;
+volatile __mmask8 m128;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sll_epi64 (x256, m256, x256, x128);
+  x256 = _mm256_maskz_sll_epi64 (m256, x256, x128);
+  x128 = _mm_mask_sll_epi64 (x128, m128, x128, x128);
+  x128 = _mm_maskz_sll_epi64 (m128, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..135292f357614f3f142e87ea8074e68ae1549b5f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a38a410e73ac3d7e54e02cec2aa75a559b5ccc8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m256;
+volatile __mmask8 m128;
+#define y 7
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_slli_epi64 (x256, m256, x256, y);
+  x256 = _mm256_maskz_slli_epi64 (m256, x256, y);
+  x128 = _mm_mask_slli_epi64 (x128, m128, x128, y);
+  x128 = _mm_maskz_slli_epi64 (m128, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..764df718a02b67df3d124c561933fd96d45ab8cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllqi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllqi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllqi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc5947f08d16d2a785788a1be57b141b1989fcbc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sllv_epi32 (x256, m, x256, y256);
+  x256 = _mm256_maskz_sllv_epi32 (m, x256, y256);
+  x128 = _mm_mask_sllv_epi32 (x128, m, x128, y128);
+  x128 = _mm_maskz_sllv_epi32 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f1281d33926be40936542948f598c00c1d8370fc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllvd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllvd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9d28c7facbdb789385f6473bc374c3e898685be
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsllvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sllv_epi64 (x256, m, x256, y256);
+  x256 = _mm256_maskz_sllv_epi64 (m, x256, y256);
+  x128 = _mm_mask_sllv_epi64 (x128, m, x128, y128);
+  x128 = _mm_maskz_sllv_epi64 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..19b087b0446a27d727d6f8ba19bc8c37b9afe5ad
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllvq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsllvq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1b49e2b040757958c0ee833fb5fc5e506b783566
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllvw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllvw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllvw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc5a099ab7a0af342d55f9a419b05b12e63c000f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsllwi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllwi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4b03ee02e37c580208b42dcfa075808eed1881b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsllwi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllwi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsllwi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bd71aa5054aa0433b4ef66ef5575a6cdd2f82a09
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sra_epi32 (x256, m, x256, y);
+  x256 = _mm256_maskz_sra_epi32 (m, x256, y);
+  x128 = _mm_mask_sra_epi32 (x128, m, x128, y);
+  x128 = _mm_maskz_sra_epi32 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..86abe6c2148577eda1ce1de08519fcb21b53d105
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrad-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrad-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrad-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a732be5bedbd6323b6aa6c8bc8930079e041eeab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrad\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+#define y 7
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srai_epi32 (x256, m, x256, y);
+  x256 = _mm256_maskz_srai_epi32 (m, x256, y);
+  x128 = _mm_mask_srai_epi32 (x128, m, x128, y);
+  x128 = _mm_maskz_srai_epi32 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b77874583c4e971b4aaa4b634d2eaf41520106d7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsradi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsradi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsradi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e1d754358e8aaea915783dda3f13f977c0e40832
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_sra_epi64 (x256, y);
+  x256 = _mm256_mask_sra_epi64 (x256, m, x256, y);
+  x256 = _mm256_maskz_sra_epi64 (m, x256, y);
+  x128 = _mm_sra_epi64 (x128, y);
+  x128 = _mm_mask_sra_epi64 (x128, m, x128, y);
+  x128 = _mm_maskz_sra_epi64 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..3331f6b2e3bb1f563d6dfd66f1f24268863befd4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsraq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsraq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..27a9e39d2c4babc5d37cf728487ec1194620f245
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsraq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+#define y 7
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_srai_epi64 (x256, y);
+  x256 = _mm256_mask_srai_epi64 (x256, m, x256, y);
+  x256 = _mm256_maskz_srai_epi64 (m, x256, y);
+  x128 = _mm_srai_epi64 (x128, y);
+  x128 = _mm_mask_srai_epi64 (x128, m, x128, y);
+  x128 = _mm_maskz_srai_epi64 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..25b6c44e8b4658dc4d4b2696c7881b8c10dfefb5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraqi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsraqi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsraqi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..46d99a35621914d25b68b0b8a51c95cce78757c1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srav_epi32 (x256, m, x256, y256);
+  x256 = _mm256_maskz_srav_epi32 (m, x256, y256);
+  x128 = _mm_mask_srav_epi32 (x128, m, x128, y128);
+  x128 = _mm_maskz_srav_epi32 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..da8c2afdaa7e44765484e023f14b1c95f9c1ee8e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsravd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsravd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..07e51b255f3df862fc20738ebf6c5602e4675203
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsravq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_srav_epi64 (x256, y256);
+  x256 = _mm256_mask_srav_epi64 (x256, m, x256, y256);
+  x256 = _mm256_maskz_srav_epi64 (m, x256, y256);
+  x128 = _mm_srav_epi64 (x128, y128);
+  x128 = _mm_mask_srav_epi64 (x128, m, x128, y128);
+  x128 = _mm_maskz_srav_epi64 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..ae95fa3eb8b2faaf1b32e94a00e1b0cd16ee7e0d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsravq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsravq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsravw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..74ce9e04d8f5c8508f1f93fc4235be9d2dd46869
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsravw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsravw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsravw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsraw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6fdc9000c4dc06efd20b7a7d85f177d1e2b8491
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsraw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsraw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsraw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrawi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrawi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ce2c923effa94e20b0c9b262e4da86ccfbe2847
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrawi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrawi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrawi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..812580302b0d4a9f5e6404da55e1b666b75db5f6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srl_epi32 (x256, m, x256, y);
+  x256 = _mm256_maskz_srl_epi32 (m, x256, y);
+  x128 = _mm_mask_srl_epi32 (x128, m, x128, y);
+  x128 = _mm_maskz_srl_epi32 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1c420f170f23bc03c2deae1384fd3bf90887c604
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrld-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrld-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrld-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..cd33ddd50c16fbf4303619263d8cb016f3ad94cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrld\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+#define y 7
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srli_epi32 (x256, m, x256, y);
+  x256 = _mm256_maskz_srli_epi32 (m, x256, y);
+  x128 = _mm_mask_srli_epi32 (x128, m, x128, y);
+  x128 = _mm_maskz_srli_epi32 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..86ff3ab787a5c5674d0284c49d8c554d34fb3d03
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrldi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrldi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrldi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..995e14f98889b4d9cdd172d9eb2400c480bcb61f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __m128i y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_srl_epi64 (x256, y);
+  x256 = _mm256_mask_srl_epi64 (x256, m, x256, y);
+  x256 = _mm256_maskz_srl_epi64 (m, x256, y);
+  x128 = _mm_srl_epi64 (x128, y);
+  x128 = _mm_mask_srl_epi64 (x128, m, x128, y);
+  x128 = _mm_maskz_srl_epi64 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..db6a3d1801294963766f49d55cf9f398f807e056
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..5479e4be49eccae77a843acee9741a6a2cdbdcb3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlq\[ \\t\]+\[^\n\]*, %xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+#define y 7
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_srli_epi64 (x256, y);
+  x256 = _mm256_mask_srli_epi64 (x256, m, x256, y);
+  x256 = _mm256_maskz_srli_epi64 (m, x256, y);
+  x128 = _mm_srli_epi64 (x128, y);
+  x128 = _mm_mask_srli_epi64 (x128, m, x128, y);
+  x128 = _mm_maskz_srli_epi64 (m, x128, y);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..25a1f243f53bee400c7c263ff89dba0721add0d4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlqi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlqi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlqi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..828f911b2ea7b9263f9ed1c6ac0c594e2ba9e942
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask16 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srlv_epi32 (x256, m, x256, y256);
+  x256 = _mm256_maskz_srlv_epi32 (m, x256, y256);
+  x128 = _mm_mask_srlv_epi32 (x128, m, x128, y128);
+  x128 = _mm_maskz_srlv_epi32 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..dfbf36475488f26e6eb8221375e755b383ad77b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlvd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlvd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..e68f0db33c8cd07228d96a5759c1df5fd1548fb9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsrlvq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256, y256;
+volatile __m128i x128, y128;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_srlv_epi64 (x256, m, x256, y256);
+  x256 = _mm256_maskz_srlv_epi64 (m, x256, y256);
+  x128 = _mm_mask_srlv_epi64 (x128, m, x128, y128);
+  x128 = _mm_maskz_srlv_epi64 (m, x128, y128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9640a7346b7e815f7d4d4b7afd065a5c8c88c3c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlvq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsrlvq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8209fdde68528e8fd25d33a66e86ade3802039cf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlvw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlvw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlvw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8a4894ee0729e9eb8b5dde2fac9fc815cf389fc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlwi-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlwi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4d973e83716a6f3a3111cdfa2dceeb99204d50c5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsrlwi-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlwi-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsrlwi-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8c1e8dca13b2e7c5809bb3818cbf5027770663c9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..14cbf7e69d752960584efff262930bbdcac4264d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sub_epi32 (x256, m8, x256, x256);
+  x256 = _mm256_maskz_sub_epi32 (m8, x256, x256);
+  x128 = _mm_mask_sub_epi32 (x128, m8, x128, x128);
+  x128 = _mm_maskz_sub_epi32 (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f16988f1ae63f3734c111a3f63c3bc5b56e83328
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsubd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsubd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b11ce0a4168c5a659f75f780e06b3c6d9d0d8e72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-1.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpsubq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x256;
+volatile __m128i x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_mask_sub_epi64 (x256, m8, x256, x256);
+  x256 = _mm256_maskz_sub_epi64 (m8, x256, x256);
+  x128 = _mm_mask_sub_epi64 (x128, m8, x128, x128);
+  x128 = _mm_maskz_sub_epi64 (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..37e4d82a21733148b7c686d1962058e3d8aecb71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsubq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpsubq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e426dbff9405de541c0f25e8a12149b5326272e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubsb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubsb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6f573124ce59cfde7bde227d1ee127f10cec0de9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubsw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubsw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubsw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f92d757b3684646f0b61de8264069d3b0a14f629
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubusb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubusb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4553ea92a353e703d76be4cbee5b0c9e6da62883
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubusw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubusw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubusw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpsubw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b229c087afa8d21369e2fdd1b99f97539cc50a11
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpsubw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpsubw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..c280c359db740c6e8b35a42e47f3db4669807e72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y, y2, y3;
+volatile __m128i x, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_ternarylogic_epi32 (y, y2, y3, 0xF0);
+  y = _mm256_mask_ternarylogic_epi32 (y, m, y2, y3, 0xF0);
+  y = _mm256_maskz_ternarylogic_epi32 (m, y, y2, y3, 0xF0);
+
+  x = _mm_ternarylogic_epi32 (x, x2, x3, 0xF0);
+  x = _mm_mask_ternarylogic_epi32 (x, m, x2, x3, 0xF0);
+  x = _mm_maskz_ternarylogic_epi32 (m, x, x2, x3, 0xF0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0336a153e2ca3ffc4086e39e6877aa0d36ebb30a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpternlogd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpternlogd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..ae06ee9df65da12347a442741a6e559c40b1f2bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpternlogq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y, y2, y3;
+volatile __m128i x, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_ternarylogic_epi64 (y, y2, y3, 0xF0);
+  y = _mm256_mask_ternarylogic_epi64 (y, m, y2, y3, 0xF0);
+  y = _mm256_maskz_ternarylogic_epi64 (m, y, y2, y3, 0xF0);
+
+  x = _mm_ternarylogic_epi64 (x, x2, x3, 0xF0);
+  x = _mm_mask_ternarylogic_epi64 (x, m, x2, x3, 0xF0);
+  x = _mm_maskz_ternarylogic_epi64 (m, x, x2, x3, 0xF0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9187e0adea35a7d891e91b5458ead8ffa2c0fbf8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpternlogq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpternlogq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..595b9c91594129f0e96033f81406974bc8a68b93
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestmb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestmb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9ea72b1ccd04ee8035f2abf5df893a7b2aa5d28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestmd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%*k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%*k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_test_epi32_mask (x128, x128);
+  m = _mm256_test_epi32_mask (x256, x256);
+  m = _mm_mask_test_epi32_mask (3, x128, x128);
+  m = _mm256_mask_test_epi32_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0fed9722b386023eff0f50edc2b94f9a01719b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestmd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestmd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d463e84ccba6af926255edd5c5c98f5a1332a61b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestmq\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmq\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestmq\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestmq\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_test_epi64_mask (x128, x128);
+  m = _mm256_test_epi64_mask (x256, x256);
+  m = _mm_mask_test_epi64_mask (3, x128, x128);
+  m = _mm256_mask_test_epi64_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0cc41241566a1c7cf0dae4509a5215955b488a2d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestmq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestmq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestmw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d1598c0b6998f4dac60e2c19b8431b807742ffa9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestmw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestmw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestmw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmb-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmb-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2df27f2990875242a1508f278c7d6528d835be9e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmb-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestnmb-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestnmb-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..37086c44058ef791cfb3ffeb7fa24069020417e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestnmd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmd\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmd\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_testn_epi32_mask (x128, x128);
+  m = _mm256_testn_epi32_mask (x256, x256);
+  m = _mm_mask_testn_epi32_mask (3, x128, x128);
+  m = _mm256_mask_testn_epi32_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..307e618036aa49bd076a548450630e4fa5fa0f00
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestnmd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestnmd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..91fb87b68ebda5af22b572c46b9ee2f79a4d6621
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler "vptestnmq\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmq\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\[^\{\]" } } */
+/* { dg-final { scan-assembler "vptestnmq\[ \\t\]+\[^\n\]*%xmm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+/* { dg-final { scan-assembler "vptestnmq\[ \\t\]+\[^\n\]*%ymm\[0-7\]\[^\n\]*k\[1-7\]\{%k\[1-7\]\}" } } */
+
+#include <immintrin.h>
+
+volatile __m128i x128;
+volatile __m256i x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  m = _mm_testn_epi64_mask (x128, x128);
+  m = _mm256_testn_epi64_mask (x256, x256);
+  m = _mm_mask_testn_epi64_mask (3, x128, x128);
+  m = _mm256_mask_testn_epi64_mask (3, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..89aa0ff4a151979697d0683e69f7467c447a1388
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestnmq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vptestnmq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..bbc8c75e6e186517f1b4fd8ee6707c0650010e2a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vptestnmw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestnmw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vptestnmw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhbw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..fadf7ba761abcffc1e712d173716680a45c4c16f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhbw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpckhbw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpckhbw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..06f7db7f23c8980d71f10029efe42fad392e2300
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpckhdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_unpackhi_epi32 (x, m, y, z);
+  x = _mm256_maskz_unpackhi_epi32 (m, y, z);
+  a = _mm_mask_unpackhi_epi32 (a, m, b, c);
+  a = _mm_maskz_unpackhi_epi32 (m, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d4743caef40fe1208dd66b8524e197351e88039
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhdq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckhdq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckhdq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0948430d6ef00116a3778bb2b3ef2391bf11e0e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpckhqdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhqdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhqdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckhqdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_unpackhi_epi64 (x, m, y, z);
+  x = _mm256_maskz_unpackhi_epi64 (m, y, z);
+  a = _mm_mask_unpackhi_epi64 (a, m, b, c);
+  a = _mm_maskz_unpackhi_epi64 (m, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f61e456dd272b89679a8cf8088f77e734ec7280d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhqdq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckhqdq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckhqdq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhwd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..41ad9b7df173df77931bbcb7f55a6dce1cb0705c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckhwd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpckhwd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpckhwd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklbw-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklbw-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d275f18feae8c0a8930523f9b98af776be70b3cb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklbw-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpcklbw-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpcklbw-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..19e10c1e898008090df685890db3e4fb918d7dee
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpckldq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckldq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckldq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpckldq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_unpacklo_epi32 (x, m, y, z);
+  x = _mm256_maskz_unpacklo_epi32 (m, y, z);
+  a = _mm_mask_unpacklo_epi32 (a, m, b, c);
+  a = _mm_maskz_unpacklo_epi32 (m, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d3099ec86246f0d478e0cc0c163dde0c3be263f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpckldq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckldq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpckldq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b3add1e80266febe1d3845217ab138ed738e6897
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpunpcklqdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklqdq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklqdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpunpcklqdq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x, y, z;
+volatile __m128i a, b, c;
+volatile __mmask8 m;
+
+void extern
+avx512bw_test (void)
+{
+  x = _mm256_mask_unpacklo_epi64 (x, m, y, z);
+  x = _mm256_maskz_unpacklo_epi64 (m, y, z);
+  a = _mm_mask_unpacklo_epi64 (a, m, b, c);
+  a = _mm_maskz_unpacklo_epi64 (m, b, c);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..37ec820b55787d913b9dd66873167e0018240593
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklqdq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpcklqdq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpunpcklqdq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklwd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklwd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..4047202ad9032fefe38e1b83a755349918e32010
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpunpcklwd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpcklwd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512bw-vpunpcklwd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..aa65a8b7b059330a8bb36ab8e79c30317d23fd3f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpxord\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_xor_epi32 (y, m, y, y);
+  y = _mm256_maskz_xor_epi32 (m, y, y);
+
+  x = _mm_mask_xor_epi32 (x, m, x, x);
+  x = _mm_maskz_xor_epi32 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f67fdf9377d8230cb862a6d3cc75561e80334d03
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpxord-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpxord-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpxord-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7df4fde4827b2c73bf33a665fc9f861cf1dac2c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 2 } } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vpxorq\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i y;
+volatile __m128i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  y = _mm256_mask_xor_epi64 (y, m, y, y);
+  y = _mm256_maskz_xor_epi64 (m, y, y);
+
+  x = _mm_mask_xor_epi64 (x, m, x, x);
+  x = _mm_maskz_xor_epi64 (m, x, x);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f28e67122cbc72535997402a0658ac9e4d84cd45
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vpxorq-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpxorq-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vpxorq-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrangepd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrangepd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2353bbde06946ed167da7dd79528760c575cbbc1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrangepd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vrangepd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vrangepd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrangeps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrangeps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b3ee2343ec6995fa607cbbbdc880d738bb37cacd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrangeps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vrangeps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vrangeps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..dff3b0255ed0065987976e425682f1a6ac2be356
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_rcp14_pd (x1);
+  x2 = _mm_rcp14_pd (x2);
+
+  x1 = _mm256_mask_rcp14_pd (x1, m, x1);
+  x2 = _mm_mask_rcp14_pd (x2, m, x2);
+
+  x1 = _mm256_maskz_rcp14_pd (m, x1);
+  x2 = _mm_maskz_rcp14_pd (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..737c81db0263140806c049e2b27d47eb193f1ff3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrcp14pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrcp14pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3ca71f4e3aecc867e2088384bdb8f2ad6c2d54a8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-1.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrcp14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_rcp14_ps (x1);
+  x2 = _mm_rcp14_ps (x2);
+
+  x1 = _mm256_mask_rcp14_ps (x1, m, x1);
+  x2 = _mm_mask_rcp14_ps (x2, m, x2);
+
+  x1 = _mm256_maskz_rcp14_ps (m, x1);
+  x2 = _mm_maskz_rcp14_ps (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8241aa2649e1d2b59b0f56e9c7f23768ec98429c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrcp14ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrcp14ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrcp14ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vreducepd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vreducepd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..9083ccc96f0e00e33418ccefba9ea3fb31b8dbeb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vreducepd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vreducepd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vreducepd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vreduceps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vreduceps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c571fb5df74e5cd83cabd208a7216f49853e325
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vreduceps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vreduceps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vreduceps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..71ec79f3420c3552476eaba60efbe23243027f2c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 5 } } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 5 } } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscalepd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_roundscale_pd (x1, 0x42);
+  x1 = _mm256_ceil_pd (x1);
+  x1 = _mm256_floor_pd (x1);
+  x1 = _mm256_mask_roundscale_pd (x1, 2, x1, 0x42);
+  x1 = _mm256_maskz_roundscale_pd (2, x1, 0x42);
+  x2 = _mm_roundscale_pd (x2, 0x42);
+  x2 = _mm_ceil_pd (x2);
+  x2 = _mm_floor_pd (x2);
+  x2 = _mm_mask_roundscale_pd (x2, 2, x2, 0x42);
+  x2 = _mm_maskz_roundscale_pd (2, x2, 0x42);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..77d56318743c45879c227bcb079d5bd39ac5f49a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscalepd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrndscalepd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrndscalepd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..08399474c951cb712b50228ff63ef5bd30318c73
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-1.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 5 } } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 5 } } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrndscaleps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_roundscale_ps (x1, 0x42);
+  x1 = _mm256_ceil_ps (x1);
+  x1 = _mm256_floor_ps (x1);
+  x1 = _mm256_mask_roundscale_ps (x1, 2, x1, 0x42);
+  x1 = _mm256_maskz_roundscale_ps (2, x1, 0x42);
+  x2 = _mm_roundscale_ps (x2, 0x42);
+  x2 = _mm_ceil_ps (x2);
+  x2 = _mm_floor_ps (x2);
+  x2 = _mm_mask_roundscale_ps (x2, 2, x2, 0x42);
+  x2 = _mm_maskz_roundscale_ps (2, x2, 0x42);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7f7566bebd46c6c32ba401276f688b3d6966b596
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrndscaleps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrndscaleps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrndscaleps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3400276379ad714116aa5a5fec0935b9f90f07b6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14pd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_rsqrt14_pd (x1);
+  x1 = _mm256_mask_rsqrt14_pd (x1, m, x1);
+  x1 = _mm256_maskz_rsqrt14_pd (m, x1);
+
+  x2 = _mm_rsqrt14_pd (x2);
+  x2 = _mm_mask_rsqrt14_pd (x2, m, x2);
+  x2 = _mm_maskz_rsqrt14_pd (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..750e5916d9d1015addb57d0b44217f8925337edb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14pd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrsqrt14pd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrsqrt14pd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..840e60b5b2deb4571e97e40b6ae7cd6eb9801d71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vrsqrt14ps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_rsqrt14_ps (x1);
+  x1 = _mm256_mask_rsqrt14_ps (x1, m, x1);
+  x1 = _mm256_maskz_rsqrt14_ps (m, x1);
+
+  x2 = _mm_rsqrt14_ps (x2);
+  x2 = _mm_mask_rsqrt14_ps (x2, m, x2);
+  x2 = _mm_maskz_rsqrt14_ps (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..6eed5988b1387ecbd615a0c178cd9e8b68e8c7de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vrsqrt14ps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrsqrt14ps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vrsqrt14ps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..63e571d23ffdeb0099b1a43d6a3a858196161054
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x256;
+volatile __m128d x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_scalef_pd (x256, x256);
+  x256 = _mm256_mask_scalef_pd (x256, m8, x256, x256);
+  x256 = _mm256_maskz_scalef_pd (m8, x256, x256);
+  x128 = _mm_scalef_pd (x128, x128);
+  x128 = _mm_mask_scalef_pd (x128, m8, x128, x128);
+  x128 = _mm_maskz_scalef_pd (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..0d8e4c4255eb58a59b56a0cd110aa23e666e69a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vscalefpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vscalefpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b12359c33e6508e35849b68d5fe1f1772ea8394b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\[^\{\]" 3 } } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vscalefps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x256;
+volatile __m128 x128;
+volatile __mmask8 m8;
+
+void extern
+avx512vl_test (void)
+{
+  x256 = _mm256_scalef_ps (x256, x256);
+  x256 = _mm256_mask_scalef_ps (x256, m8, x256, x256);
+  x256 = _mm256_maskz_scalef_ps (m8, x256, x256);
+  x128 = _mm_scalef_ps (x128, x128);
+  x128 = _mm_mask_scalef_ps (x128, m8, x128, x128);
+  x128 = _mm_maskz_scalef_ps (m8, x128, x128);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d655a1b6dcdafcd91588c667132169a4935b1140
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vscalefps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vscalefps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vscalefps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8a9f56e4152855b921463c0a287624752a4032b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshuff32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_shuffle_f32x4 (x, x, 2);
+  x = _mm256_mask_shuffle_f32x4 (x, m, x, x, 2);
+  x = _mm256_maskz_shuffle_f32x4 (m, x, x, 2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..7fbbff3c9c4b9b0a09129860c7de41bbf1f88b67
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshuff32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..83b1d148b1a9a817e988d5d45e7bcf9c67a5931a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshuff64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_shuffle_f64x2 (x, x, 2);
+  x = _mm256_mask_shuffle_f64x2 (x, m, x, x, 2);
+  x = _mm256_maskz_shuffle_f64x2 (m, x, x, 2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..e751077b74b7aa1eb83529a1b8b0c2193b533622
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshuff64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshuff64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0d52a339275da2b92d90193ad43cfc9b762e4483
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufi32x4\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_shuffle_i32x4 (x, x, 2);
+  x = _mm256_mask_shuffle_i32x4 (x, m, x, x, 2);
+  x = _mm256_maskz_shuffle_i32x4 (m, x, x, 2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8debef41427b9b6a7912bacd2886d08231d0c747
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi32x4-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufi32x4-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bde1bf08e8bf2f2a20e4e467e08d5a8183120aae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufi64x2\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256i x;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_shuffle_i64x2 (x, x, 2);
+  x = _mm256_mask_shuffle_i64x2 (x, m, x, x, 2);
+  x = _mm256_maskz_shuffle_i64x2 (m, x, x, 2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..726234c3d1e8bca5e2c996b931bf939c7d90e6a3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufi64x2-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufi64x2-2.c"
+
+void
+test_128 () {}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..addb7cd9837263766fe37899c7395f4df6d45466
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vshufpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vshufpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x;
+volatile __m128d y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_shuffle_pd (x, m, x, x, 13);
+  x = _mm256_maskz_shuffle_pd (m, x, x, 13);
+  y = _mm_mask_shuffle_pd (y, m, y, y, 1);
+  y = _mm_maskz_shuffle_pd (m, y, y, 1);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..8b4ef9882a227911188345f87caa93ff00eee359
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..560195cbea0cd768e4fed4b4a5c8839dcdbf4afb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vshufps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vshufps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vshufps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x;
+volatile __m128 y;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_mask_shuffle_ps (x, m, x, x, 64);
+  x = _mm256_maskz_shuffle_ps (m, x, x, 64);
+  y = _mm_mask_shuffle_ps (y, m, y, y, 64);
+  y = _mm_maskz_shuffle_ps (m, y, y, 64);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..260922f27fbe23e983267714da3e01d147e42cb6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vshufps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vshufps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..63dbb83d63bd787724ef8d156c8fb0c1fc589805
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vsqrtpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d x1;
+volatile __m128d x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_sqrt_pd (x1, m, x1);
+  x1 = _mm256_maskz_sqrt_pd (m, x1);
+
+  x2 = _mm_mask_sqrt_pd (x2, m, x2);
+  x2 = _mm_maskz_sqrt_pd (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..15698e2a344e44e2fa7a2f97d537e5061c9bee83
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsqrtpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsqrtpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9bfd599232b8a98de48496b1917832998a557314
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vsqrtps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vsqrtps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x1;
+volatile __m128 x2;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x1 = _mm256_mask_sqrt_ps (x1, m, x1);
+  x1 = _mm256_maskz_sqrt_ps (m, x1);
+
+  x2 = _mm_mask_sqrt_ps (x2, m, x2);
+  x2 = _mm_maskz_sqrt_ps (m, x2);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1bd5bb12e18cf609cabb8ea4c584fb5a8a5ce3cd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsqrtps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsqrtps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsqrtps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..9234f0fe33e19829192b6a9c413e85a5078dcf9a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vsubpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsubpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vsubpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsubpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128d x128;
+volatile __m256d x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_mask_sub_pd (x128, m, x128, x128);
+  x128 = _mm_maskz_sub_pd (m, x128, x128);
+
+  x256 = _mm256_mask_sub_pd (x256, m, x256, x256);
+  x256 = _mm256_maskz_sub_pd (m, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..b3a9c8f76dd7def34ad68bd480479108b1d82728
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsubpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512f -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsubpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsubpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8909163bdb194784c801ae8be49dfa48d8832d3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vsubps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsubps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vsubps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vsubps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m128 x128;
+volatile __m256 x256;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  x128 = _mm_mask_sub_ps (x128, m, x128, x128);
+  x128 = _mm_maskz_sub_ps (m, x128, x128);
+
+  x256 = _mm256_mask_sub_ps (x256, m, x256, x256);
+  x256 = _mm256_maskz_sub_ps (m, x256, x256);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d22740a098d072ace3f5d5e624bc8ba37db98b73
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vsubps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsubps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vsubps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c292804d2a4570665cd6f8d87d509c570c9b779
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vunpckhpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_unpackhi_pd (yy, m, y2, y3);
+  xx = _mm_mask_unpackhi_pd (xx, m, x2, x3);
+
+  yy = _mm256_maskz_unpackhi_pd (m, y2, y3);
+  xx = _mm_maskz_unpackhi_pd (m, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a3323db368e0658aa5c7c359cb9018781421e8e2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpckhpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpckhpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..1a8aa61ccffc8dead108c9c90618d9341c8bcbe5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vunpckhps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vunpckhps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 yy, y2, y3;
+volatile __m128 xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_unpackhi_ps (yy, m, y2, y3);
+  xx = _mm_mask_unpackhi_ps (xx, m, x2, x3);
+
+  yy = _mm256_maskz_unpackhi_ps (m, y2, y3);
+  xx = _mm_maskz_unpackhi_ps (m, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..211cbd90a525f68ba7cc011e093ccf0c6e70dbcb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpckhps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpckhps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpckhps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2b6b867b4f7d6e6ea738118b3a28a26a6f6dda1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vunpcklpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklpd\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklpd\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256d yy, y2, y3;
+volatile __m128d xx, x2, x3;
+volatile __mmask8 m;
+
+void extern
+avx512vl_test (void)
+{
+  yy = _mm256_mask_unpacklo_pd (yy, m, y2, y3);
+  xx = _mm_mask_unpacklo_pd (xx, m, x2, x3);
+
+  yy = _mm256_maskz_unpacklo_pd (m, y2, y3);
+  xx = _mm_maskz_unpacklo_pd (m, x2, x3);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..03df654b3ac4a112dc737827beb2448aee1486bf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpcklpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpcklpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-1.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..bf49da0d7ea9ac20d4d05030da2f222848684ebc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%ymm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%ymm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%xmm\[0-9\]" 3 } } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\{z\}" 1 } } */
+/* { dg-final { scan-assembler-times "vunpcklps\[ \\t\]+\[^\n\]*%xmm\[0-9\]\{%k\[1-7\]\}\[^\{\]" 1 } } */
+
+#include <immintrin.h>
+
+volatile __m256 x, y, z;
+volatile __m128 xx, yy, zz;
+
+void extern
+avx512vl_test (void)
+{
+  x = _mm256_unpacklo_ps (y, z);
+  x = _mm256_mask_unpacklo_ps (x, 2, y, z);
+  x = _mm256_maskz_unpacklo_ps (2, y, z);
+  xx = _mm_unpacklo_ps (yy, zz);
+  xx = _mm_mask_unpacklo_ps (xx, 2, yy, zz);
+  xx = _mm_maskz_unpacklo_ps (2, yy, zz);
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2fa930673bd9c74fefd76bba0769f482b1568943
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vunpcklps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpcklps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512f-vunpcklps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vxorpd-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vxorpd-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e88a3a609e4394d41cdd9c550801af97d9e704a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vxorpd-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vxorpd-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vxorpd-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-vxorps-2.c b/gcc/testsuite/gcc.target/i386/avx512vl-vxorps-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6c3ed5bd1f3399bda1a0bab6280bff8565e948d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-vxorps-2.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq -mavx512vl -DAVX512VL" } */
+/* { dg-require-effective-target avx512vl } */
+
+#define AVX512F_LEN 256
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vxorps-2.c"
+
+#undef AVX512F_LEN
+#undef AVX512F_LEN_HALF
+
+#define AVX512F_LEN 128
+#define AVX512F_LEN_HALF 128
+#include "avx512dq-vxorps-2.c"
diff --git a/gcc/testsuite/gcc.target/i386/i386.exp b/gcc/testsuite/gcc.target/i386/i386.exp
index 91ff1cb197642095b1173c57f415a8b13e56e9f8..18b82b63962937a1ea2c09b4934a00bfe5bb0e06 100644
--- a/gcc/testsuite/gcc.target/i386/i386.exp
+++ b/gcc/testsuite/gcc.target/i386/i386.exp
@@ -266,6 +266,19 @@ proc check_effective_target_avx512f { } {
     } "-mavx512f" ]
 }
 
+# Return 1 if avx512vl instructions can be compiled.
+proc check_effective_target_avx512vl { } {
+    return [check_no_compiler_messages avx512vl object {
+	typedef long long __v4di __attribute__ ((__vector_size__ (32)));
+	__v4di
+	mm256_and_epi64  (__v4di __X, __v4di __Y)
+	{
+            __v4di __W;
+            return __builtin_ia32_pandq256_mask (__X, __Y, __W, -1);
+	}
+    } "-mavx512vl" ]
+}
+
 # Return 1 if avx512cd instructions can be compiled.
 proc check_effective_target_avx512cd { } {
     return [check_no_compiler_messages avx512cd_trans object {
@@ -274,8 +287,8 @@ proc check_effective_target_avx512cd { } {
 	_mm512_conflict_epi64 (__v8di __W, __v8di __A)
 	{
 	  return (__v8di) __builtin_ia32_vpconflictdi_512_mask ((__v8di) __A,
-		  						 (__v8di) __W,
-			  					 -1);
+								 (__v8di) __W,
+								 -1);
 	}
    } "-Wno-psabi -mavx512cd" ]
 }
@@ -306,6 +319,36 @@ proc check_effective_target_sha { } {
     } "-O2 -msha" ]
 }
 
+# Return 1 if avx512dq instructions can be compiled.
+proc check_effective_target_avx512dq { } {
+    return [check_no_compiler_messages avx512dq object {
+	typedef long long __v8di __attribute__ ((__vector_size__ (64)));
+	__v8di
+	_mm512_mask_mullo_epi64 (__v8di __W, __v8di __A, __v8di __B)
+	{
+	    return (__v8di) __builtin_ia32_pmullq512_mask ((__v8di) __A,
+							    (__v8di) __B,
+							    (__v8di) __W,
+							    -1);
+	}
+    } "-mavx512dq" ]
+}
+
+# Return 1 if avx512bw instructions can be compiled.
+proc check_effective_target_avx512bw { } {
+    return [check_no_compiler_messages avx512bw object {
+	typedef short __v32hi __attribute__ ((__vector_size__ (64)));
+	__v32hi
+	_mm512_mask_mulhrs_epi16 (__v32hi __W, __v32hi __A, __v32hi __B)
+	{
+	    return (__v32hi) __builtin_ia32_pmulhrsw512_mask ((__v32hi) __A,
+							    (__v32hi) __B,
+							    (__v32hi) __W,
+							    -1);
+	}
+    } "-mavx512bw" ]
+}
+
 # If a testcase doesn't have special options, use these.
 global DEFAULT_CFLAGS
 if ![info exists DEFAULT_CFLAGS] then {
diff --git a/gcc/testsuite/gcc.target/i386/m512-check.h b/gcc/testsuite/gcc.target/i386/m512-check.h
index 64e085bc60262365cafd0a26ee50283787ad0de4..1a1065d205350579bbd67043cedfa1e9dd592fcb 100644
--- a/gcc/testsuite/gcc.target/i386/m512-check.h
+++ b/gcc/testsuite/gcc.target/i386/m512-check.h
@@ -111,3 +111,7 @@ check_rough_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v,	\
 
 CHECK_ROUGH_EXP (union512, float, "%f")
 CHECK_ROUGH_EXP (union512d, double, "%f")
+CHECK_ROUGH_EXP (union256, float, "%f")
+CHECK_ROUGH_EXP (union256d, double, "%f")
+CHECK_ROUGH_EXP (union128, float, "%f")
+CHECK_ROUGH_EXP (union128d, double, "%f")