xref: /llvm-project/llvm/test/Transforms/InstCombine/X86/x86-pmulhu.ll (revision 5c204b1d2619cbad7b7ad228b62feae08781a6db)
152cc7c00SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
252cc7c00SSimon Pilgrim; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s
352cc7c00SSimon Pilgrim
452cc7c00SSimon Pilgrim;
552cc7c00SSimon Pilgrim; UNDEF Elts
652cc7c00SSimon Pilgrim;
752cc7c00SSimon Pilgrim
852cc7c00SSimon Pilgrimdefine <8 x i16> @undef_pmulhu_128(<8 x i16> %a0) {
952cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_128(
104ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
1152cc7c00SSimon Pilgrim;
1252cc7c00SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> undef)
1352cc7c00SSimon Pilgrim  ret <8 x i16> %1
1452cc7c00SSimon Pilgrim}
1552cc7c00SSimon Pilgrim
1652cc7c00SSimon Pilgrimdefine <8 x i16> @undef_pmulhu_128_commute(<8 x i16> %a0) {
1752cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_128_commute(
184ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
1952cc7c00SSimon Pilgrim;
2052cc7c00SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> undef, <8 x i16> %a0)
2152cc7c00SSimon Pilgrim  ret <8 x i16> %1
2252cc7c00SSimon Pilgrim}
2352cc7c00SSimon Pilgrim
2452cc7c00SSimon Pilgrimdefine <16 x i16> @undef_pmulhu_256(<16 x i16> %a0) {
2552cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_256(
264ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
2752cc7c00SSimon Pilgrim;
2852cc7c00SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %a0, <16 x i16> undef)
2952cc7c00SSimon Pilgrim  ret <16 x i16> %1
3052cc7c00SSimon Pilgrim}
3152cc7c00SSimon Pilgrim
3252cc7c00SSimon Pilgrimdefine <16 x i16> @undef_pmulhu_256_commute(<16 x i16> %a0) {
3352cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_256_commute(
344ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
3552cc7c00SSimon Pilgrim;
3652cc7c00SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> undef, <16 x i16> %a0)
3752cc7c00SSimon Pilgrim  ret <16 x i16> %1
3852cc7c00SSimon Pilgrim}
3952cc7c00SSimon Pilgrim
4052cc7c00SSimon Pilgrimdefine <32 x i16> @undef_pmulhu_512(<32 x i16> %a0) {
4152cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_512(
424ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
4352cc7c00SSimon Pilgrim;
4452cc7c00SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> %a0, <32 x i16> undef)
4552cc7c00SSimon Pilgrim  ret <32 x i16> %1
4652cc7c00SSimon Pilgrim}
4752cc7c00SSimon Pilgrim
4852cc7c00SSimon Pilgrimdefine <32 x i16> @undef_pmulhu_512_commute(<32 x i16> %a0) {
4952cc7c00SSimon Pilgrim; CHECK-LABEL: @undef_pmulhu_512_commute(
504ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
5152cc7c00SSimon Pilgrim;
5252cc7c00SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> undef, <32 x i16> %a0)
5352cc7c00SSimon Pilgrim  ret <32 x i16> %1
5452cc7c00SSimon Pilgrim}
5552cc7c00SSimon Pilgrim
5652cc7c00SSimon Pilgrim;
5752cc7c00SSimon Pilgrim; Zero Elts
5852cc7c00SSimon Pilgrim;
5952cc7c00SSimon Pilgrim
6052cc7c00SSimon Pilgrimdefine <8 x i16> @zero_pmulhu_128(<8 x i16> %a0) {
6152cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_128(
624ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
6352cc7c00SSimon Pilgrim;
6452cc7c00SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> zeroinitializer)
6552cc7c00SSimon Pilgrim  ret <8 x i16> %1
6652cc7c00SSimon Pilgrim}
6752cc7c00SSimon Pilgrim
6852cc7c00SSimon Pilgrimdefine <8 x i16> @zero_pmulhu_128_commute(<8 x i16> %a0) {
6952cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_128_commute(
704ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
7152cc7c00SSimon Pilgrim;
7252cc7c00SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> zeroinitializer, <8 x i16> %a0)
7352cc7c00SSimon Pilgrim  ret <8 x i16> %1
7452cc7c00SSimon Pilgrim}
7552cc7c00SSimon Pilgrim
7652cc7c00SSimon Pilgrimdefine <16 x i16> @zero_pmulhu_256(<16 x i16> %a0) {
7752cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_256(
784ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
7952cc7c00SSimon Pilgrim;
8052cc7c00SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %a0, <16 x i16> zeroinitializer)
8152cc7c00SSimon Pilgrim  ret <16 x i16> %1
8252cc7c00SSimon Pilgrim}
8352cc7c00SSimon Pilgrim
8452cc7c00SSimon Pilgrimdefine <16 x i16> @zero_pmulhu_256_commute(<16 x i16> %a0) {
8552cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_256_commute(
864ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
8752cc7c00SSimon Pilgrim;
8852cc7c00SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> zeroinitializer, <16 x i16> %a0)
8952cc7c00SSimon Pilgrim  ret <16 x i16> %1
9052cc7c00SSimon Pilgrim}
9152cc7c00SSimon Pilgrim
9252cc7c00SSimon Pilgrimdefine <32 x i16> @zero_pmulhu_512(<32 x i16> %a0) {
9352cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_512(
944ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
9552cc7c00SSimon Pilgrim;
9652cc7c00SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> %a0, <32 x i16> zeroinitializer)
9752cc7c00SSimon Pilgrim  ret <32 x i16> %1
9852cc7c00SSimon Pilgrim}
9952cc7c00SSimon Pilgrim
10052cc7c00SSimon Pilgrimdefine <32 x i16> @zero_pmulhu_512_commute(<32 x i16> %a0) {
10152cc7c00SSimon Pilgrim; CHECK-LABEL: @zero_pmulhu_512_commute(
1024ee4bc3cSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
10352cc7c00SSimon Pilgrim;
10452cc7c00SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> zeroinitializer, <32 x i16> %a0)
10552cc7c00SSimon Pilgrim  ret <32 x i16> %1
10652cc7c00SSimon Pilgrim}
10752cc7c00SSimon Pilgrim
10852cc7c00SSimon Pilgrim;
10907fa7fc0SSimon Pilgrim; Multiply by One
11007fa7fc0SSimon Pilgrim;
11107fa7fc0SSimon Pilgrim
11207fa7fc0SSimon Pilgrimdefine <8 x i16> @one_pmulhu_128(<8 x i16> %a0) {
11307fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_128(
114f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
11507fa7fc0SSimon Pilgrim;
11607fa7fc0SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %a0, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
11707fa7fc0SSimon Pilgrim  ret <8 x i16> %1
11807fa7fc0SSimon Pilgrim}
11907fa7fc0SSimon Pilgrim
12007fa7fc0SSimon Pilgrimdefine <8 x i16> @one_pmulhu_128_commute(<8 x i16> %a0) {
12107fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_128_commute(
122f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> zeroinitializer
12307fa7fc0SSimon Pilgrim;
12407fa7fc0SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %a0)
12507fa7fc0SSimon Pilgrim  ret <8 x i16> %1
12607fa7fc0SSimon Pilgrim}
12707fa7fc0SSimon Pilgrim
12807fa7fc0SSimon Pilgrimdefine <16 x i16> @one_pmulhu_256(<16 x i16> %a0) {
12907fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_256(
130f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
13107fa7fc0SSimon Pilgrim;
13207fa7fc0SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %a0, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
13307fa7fc0SSimon Pilgrim  ret <16 x i16> %1
13407fa7fc0SSimon Pilgrim}
13507fa7fc0SSimon Pilgrim
13607fa7fc0SSimon Pilgrimdefine <16 x i16> @one_pmulhu_256_commute(<16 x i16> %a0) {
13707fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_256_commute(
138f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> zeroinitializer
13907fa7fc0SSimon Pilgrim;
14007fa7fc0SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <16 x i16> %a0)
14107fa7fc0SSimon Pilgrim  ret <16 x i16> %1
14207fa7fc0SSimon Pilgrim}
14307fa7fc0SSimon Pilgrim
14407fa7fc0SSimon Pilgrimdefine <32 x i16> @one_pmulhu_512(<32 x i16> %a0) {
14507fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_512(
146f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
14707fa7fc0SSimon Pilgrim;
14807fa7fc0SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> %a0, <32 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
14907fa7fc0SSimon Pilgrim  ret <32 x i16> %1
15007fa7fc0SSimon Pilgrim}
15107fa7fc0SSimon Pilgrim
15207fa7fc0SSimon Pilgrimdefine <32 x i16> @one_pmulhu_512_commute(<32 x i16> %a0) {
15307fa7fc0SSimon Pilgrim; CHECK-LABEL: @one_pmulhu_512_commute(
154f60f7b47SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> zeroinitializer
15507fa7fc0SSimon Pilgrim;
15607fa7fc0SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <32 x i16> %a0)
15707fa7fc0SSimon Pilgrim  ret <32 x i16> %1
15807fa7fc0SSimon Pilgrim}
15907fa7fc0SSimon Pilgrim
16007fa7fc0SSimon Pilgrim;
16152cc7c00SSimon Pilgrim; Constant Folding
16252cc7c00SSimon Pilgrim;
16352cc7c00SSimon Pilgrim
16452cc7c00SSimon Pilgrimdefine <8 x i16> @fold_pmulhu_128() {
16552cc7c00SSimon Pilgrim; CHECK-LABEL: @fold_pmulhu_128(
1667bb251a9SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> <i16 -6, i16 0, i16 1, i16 32763, i16 -14, i16 5, i16 3, i16 32757>
16752cc7c00SSimon Pilgrim;
16852cc7c00SSimon Pilgrim  %1 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> <i16 -1, i16 2, i16 3, i16 -4, i16 -5, i16 6, i16 7, i16 -8>, <8 x i16> <i16 -5, i16 7, i16 -32768, i16 32765, i16 -9, i16 -11, i16 -32763, i16 32761>)
16952cc7c00SSimon Pilgrim  ret <8 x i16> %1
17052cc7c00SSimon Pilgrim}
17152cc7c00SSimon Pilgrim
17252cc7c00SSimon Pilgrimdefine <16 x i16> @fold_pmulhu_256() {
17352cc7c00SSimon Pilgrim; CHECK-LABEL: @fold_pmulhu_256(
1747bb251a9SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> <i16 0, i16 6, i16 1, i16 1, i16 -13, i16 -16, i16 3, i16 3, i16 12, i16 8, i16 -32766, i16 5, i16 16, i16 12, i16 -32764, i16 32748>
17552cc7c00SSimon Pilgrim;
17652cc7c00SSimon Pilgrim  %1 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> <i16 0, i16 -1, i16 2, i16 3, i16 -4, i16 -5, i16 6, i16 7, i16 -8, i16 9, i16 -10, i16 11, i16 -12, i16 13, i16 -14, i16 -15>, <16 x i16> <i16 -5, i16 7, i16 -32768, i16 32766, i16 -9, i16 -11, i16 -32764, i16 32762, i16 13, i16 -15, i16 -32760, i16 32758, i16 17, i16 -19, i16 -32756, i16 32756>)
17752cc7c00SSimon Pilgrim  ret <16 x i16> %1
17852cc7c00SSimon Pilgrim}
17952cc7c00SSimon Pilgrim
18052cc7c00SSimon Pilgrimdefine <32 x i16> @fold_pmulhu_512() {
18152cc7c00SSimon Pilgrim; CHECK-LABEL: @fold_pmulhu_512(
1827bb251a9SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> <i16 0, i16 6, i16 1, i16 1, i16 -13, i16 -16, i16 3, i16 3, i16 12, i16 8, i16 -32766, i16 5, i16 16, i16 12, i16 -32764, i16 32748, i16 0, i16 6, i16 1, i16 1, i16 -13, i16 -16, i16 3, i16 3, i16 12, i16 8, i16 -32766, i16 5, i16 16, i16 12, i16 -32764, i16 32748>
18352cc7c00SSimon Pilgrim;
18452cc7c00SSimon Pilgrim  %1 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> <i16 0, i16 -1, i16 2, i16 3, i16 -4, i16 -5, i16 6, i16 7, i16 -8, i16 9, i16 -10, i16 11, i16 -12, i16 13, i16 -14, i16 -15, i16 -5, i16 7, i16 -32768, i16 32766, i16 -9, i16 -11, i16 -32764, i16 32762, i16 13, i16 -15, i16 -32760, i16 32758, i16 17, i16 -19, i16 -32756, i16 32756>, <32 x i16> <i16 -5, i16 7, i16 -32768, i16 32766, i16 -9, i16 -11, i16 -32764, i16 32762, i16 13, i16 -15, i16 -32760, i16 32758, i16 17, i16 -19, i16 -32756, i16 32756, i16 0, i16 -1, i16 2, i16 3, i16 -4, i16 -5, i16 6, i16 7, i16 -8, i16 9, i16 -10, i16 11, i16 -12, i16 13, i16 -14, i16 -15>)
18552cc7c00SSimon Pilgrim  ret <32 x i16> %1
18652cc7c00SSimon Pilgrim}
18752cc7c00SSimon Pilgrim
18852cc7c00SSimon Pilgrim;
18952cc7c00SSimon Pilgrim; Demanded Elts
19052cc7c00SSimon Pilgrim;
19152cc7c00SSimon Pilgrim
19252cc7c00SSimon Pilgrimdefine <8 x i16> @elts_pmulhu_128(<8 x i16> %a0, <8 x i16> %a1) {
19352cc7c00SSimon Pilgrim; CHECK-LABEL: @elts_pmulhu_128(
194c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> [[A0:%.*]], <8 x i16> [[A1:%.*]])
195c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> poison, <8 x i32> zeroinitializer
196c20695a4SSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> [[TMP2]]
19752cc7c00SSimon Pilgrim;
19852cc7c00SSimon Pilgrim  %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2>
19952cc7c00SSimon Pilgrim  %2 = shufflevector <8 x i16> %a1, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
20052cc7c00SSimon Pilgrim  %3 = call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %1, <8 x i16> %2)
20152cc7c00SSimon Pilgrim  %4 = shufflevector <8 x i16> %3, <8 x i16> poison, <8 x i32> zeroinitializer
20252cc7c00SSimon Pilgrim  ret <8 x i16> %4
20352cc7c00SSimon Pilgrim}
20452cc7c00SSimon Pilgrim
20552cc7c00SSimon Pilgrimdefine <16 x i16> @elts_pmulhu_256(<16 x i16> %a0, <16 x i16> %a1) {
20652cc7c00SSimon Pilgrim; CHECK-LABEL: @elts_pmulhu_256(
207c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> [[A0:%.*]], <16 x i16> [[A1:%.*]])
208c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i16> [[TMP1]], <16 x i16> poison, <16 x i32> zeroinitializer
209c20695a4SSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> [[TMP2]]
21052cc7c00SSimon Pilgrim;
21152cc7c00SSimon Pilgrim  %1 = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
21252cc7c00SSimon Pilgrim  %2 = shufflevector <16 x i16> %a1, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
21352cc7c00SSimon Pilgrim  %3 = call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %1, <16 x i16> %2)
21452cc7c00SSimon Pilgrim  %4 = shufflevector <16 x i16> %3, <16 x i16> poison, <16 x i32> zeroinitializer
21552cc7c00SSimon Pilgrim  ret <16 x i16> %4
21652cc7c00SSimon Pilgrim}
21752cc7c00SSimon Pilgrim
21852cc7c00SSimon Pilgrimdefine <32 x i16> @elts_pmulhu_512(<32 x i16> %a0, <32 x i16> %a1) {
21952cc7c00SSimon Pilgrim; CHECK-LABEL: @elts_pmulhu_512(
220c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP1:%.*]] = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> [[A0:%.*]], <32 x i16> [[A1:%.*]])
221c20695a4SSimon Pilgrim; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <32 x i16> [[TMP1]], <32 x i16> poison, <32 x i32> zeroinitializer
222c20695a4SSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> [[TMP2]]
22352cc7c00SSimon Pilgrim;
22452cc7c00SSimon Pilgrim  %1 = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> <i32 0, i32 1, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
22552cc7c00SSimon Pilgrim  %2 = shufflevector <32 x i16> %a1, <32 x i16> undef, <32 x i32> <i32 0, i32 1, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
22652cc7c00SSimon Pilgrim  %3 = call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> %1, <32 x i16> %2)
22752cc7c00SSimon Pilgrim  %4 = shufflevector <32 x i16> %3, <32 x i16> poison, <32 x i32> zeroinitializer
22852cc7c00SSimon Pilgrim  ret <32 x i16> %4
22952cc7c00SSimon Pilgrim}
230e6cf2920SSimon Pilgrim
231e6cf2920SSimon Pilgrim;
232e6cf2920SSimon Pilgrim; Known Bits
233e6cf2920SSimon Pilgrim;
234e6cf2920SSimon Pilgrim
235e6cf2920SSimon Pilgrimdefine <8 x i16> @known_pmulhu_128(<8 x i16> %a0, <8 x i16> %a1, <8 x i16> %a2) {
236e6cf2920SSimon Pilgrim; CHECK-LABEL: @known_pmulhu_128(
237*5c204b1dSSimon Pilgrim; CHECK-NEXT:    ret <8 x i16> [[A2:%.*]]
238e6cf2920SSimon Pilgrim;
239e6cf2920SSimon Pilgrim  %x0 = lshr <8 x i16> %a0, <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
240e6cf2920SSimon Pilgrim  %x1 = and <8 x i16> %a1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
241e6cf2920SSimon Pilgrim  %m = tail call <8 x i16> @llvm.x86.sse2.pmulhu.w(<8 x i16> %x0, <8 x i16> %x1)
242e6cf2920SSimon Pilgrim  %r = add <8 x i16> %m, %a2
243e6cf2920SSimon Pilgrim  ret <8 x i16> %r
244e6cf2920SSimon Pilgrim}
245e6cf2920SSimon Pilgrim
246e6cf2920SSimon Pilgrimdefine <16 x i16> @known_pmulhu_256(<16 x i16> %a0, <16 x i16> %a1, <16 x i16> %a2) {
247e6cf2920SSimon Pilgrim; CHECK-LABEL: @known_pmulhu_256(
248*5c204b1dSSimon Pilgrim; CHECK-NEXT:    ret <16 x i16> [[A2:%.*]]
249e6cf2920SSimon Pilgrim;
250e6cf2920SSimon Pilgrim  %x0 = lshr <16 x i16> %a0, <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
251e6cf2920SSimon Pilgrim  %x1 = and <16 x i16> %a1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
252e6cf2920SSimon Pilgrim  %m = tail call <16 x i16> @llvm.x86.avx2.pmulhu.w(<16 x i16> %x0, <16 x i16> %x1)
253e6cf2920SSimon Pilgrim  %r = add <16 x i16> %m, %a2
254e6cf2920SSimon Pilgrim  ret <16 x i16> %r
255e6cf2920SSimon Pilgrim}
256e6cf2920SSimon Pilgrim
257e6cf2920SSimon Pilgrimdefine <32 x i16> @known_pmulhu_512(<32 x i16> %a0, <32 x i16> %a1, <32 x i16> %a2) {
258e6cf2920SSimon Pilgrim; CHECK-LABEL: @known_pmulhu_512(
259*5c204b1dSSimon Pilgrim; CHECK-NEXT:    ret <32 x i16> [[A2:%.*]]
260e6cf2920SSimon Pilgrim;
261e6cf2920SSimon Pilgrim  %x0 = lshr <32 x i16> %a0, <i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
262e6cf2920SSimon Pilgrim  %x1 = and <32 x i16> %a1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
263e6cf2920SSimon Pilgrim  %m = tail call <32 x i16> @llvm.x86.avx512.pmulhu.w.512(<32 x i16> %x0, <32 x i16> %x1)
264e6cf2920SSimon Pilgrim  %r = add <32 x i16> %m, %a2
265e6cf2920SSimon Pilgrim  ret <32 x i16> %r
266e6cf2920SSimon Pilgrim}
267