1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vbmi --show-mc-encoding | FileCheck %s --check-prefixes=CHECK,X86 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi --show-mc-encoding | FileCheck %s --check-prefixes=CHECK,X64 4 5declare <64 x i8> @llvm.x86.avx512.permvar.qi.512(<64 x i8>, <64 x i8>) 6 7define <64 x i8>@test_int_x86_avx512_permvar_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) { 8; CHECK-LABEL: test_int_x86_avx512_permvar_qi_512: 9; CHECK: # %bb.0: 10; CHECK-NEXT: vpermb %zmm0, %zmm1, %zmm0 # encoding: [0x62,0xf2,0x75,0x48,0x8d,0xc0] 11; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3] 12 %1 = call <64 x i8> @llvm.x86.avx512.permvar.qi.512(<64 x i8> %x0, <64 x i8> %x1) 13 ret <64 x i8> %1 14} 15 16define <64 x i8>@test_int_x86_avx512_mask_permvar_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, i64 %x3) { 17; X86-LABEL: test_int_x86_avx512_mask_permvar_qi_512: 18; X86: # %bb.0: 19; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 20; X86-NEXT: vpermb %zmm0, %zmm1, %zmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x49,0x8d,0xd0] 21; X86-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2] 22; X86-NEXT: retl # encoding: [0xc3] 23; 24; X64-LABEL: test_int_x86_avx512_mask_permvar_qi_512: 25; X64: # %bb.0: 26; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 27; X64-NEXT: vpermb %zmm0, %zmm1, %zmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x49,0x8d,0xd0] 28; X64-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2] 29; X64-NEXT: retq # encoding: [0xc3] 30 %1 = call <64 x i8> @llvm.x86.avx512.permvar.qi.512(<64 x i8> %x0, <64 x i8> %x1) 31 %2 = bitcast i64 %x3 to <64 x i1> 32 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> %x2 33 ret <64 x i8> %3 34} 35 36define <64 x i8>@test_int_x86_avx512_maskz_permvar_qi_512(<64 x i8> %x0, <64 x i8> %x1, i64 %x3) { 37; X86-LABEL: test_int_x86_avx512_maskz_permvar_qi_512: 38; X86: # %bb.0: 39; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 40; X86-NEXT: vpermb %zmm0, %zmm1, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0xc9,0x8d,0xc0] 41; X86-NEXT: retl # encoding: [0xc3] 42; 43; X64-LABEL: test_int_x86_avx512_maskz_permvar_qi_512: 44; X64: # %bb.0: 45; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 46; X64-NEXT: vpermb %zmm0, %zmm1, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0xc9,0x8d,0xc0] 47; X64-NEXT: retq # encoding: [0xc3] 48 %1 = call <64 x i8> @llvm.x86.avx512.permvar.qi.512(<64 x i8> %x0, <64 x i8> %x1) 49 %2 = bitcast i64 %x3 to <64 x i1> 50 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> zeroinitializer 51 ret <64 x i8> %3 52} 53 54declare <64 x i8> @llvm.x86.avx512.pmultishift.qb.512(<64 x i8>, <64 x i8>) 55 56define <64 x i8>@test_int_x86_avx512_pmultishift_qb_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) { 57; CHECK-LABEL: test_int_x86_avx512_pmultishift_qb_512: 58; CHECK: # %bb.0: 59; CHECK-NEXT: vpmultishiftqb %zmm1, %zmm0, %zmm0 # encoding: [0x62,0xf2,0xfd,0x48,0x83,0xc1] 60; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3] 61 %1 = call <64 x i8> @llvm.x86.avx512.pmultishift.qb.512(<64 x i8> %x0, <64 x i8> %x1) 62 ret <64 x i8> %1 63} 64 65define <64 x i8>@test_int_x86_avx512_mask_pmultishift_qb_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, i64 %x3) { 66; X86-LABEL: test_int_x86_avx512_mask_pmultishift_qb_512: 67; X86: # %bb.0: 68; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 69; X86-NEXT: vpmultishiftqb %zmm1, %zmm0, %zmm2 {%k1} # encoding: [0x62,0xf2,0xfd,0x49,0x83,0xd1] 70; X86-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2] 71; X86-NEXT: retl # encoding: [0xc3] 72; 73; X64-LABEL: test_int_x86_avx512_mask_pmultishift_qb_512: 74; X64: # %bb.0: 75; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 76; X64-NEXT: vpmultishiftqb %zmm1, %zmm0, %zmm2 {%k1} # encoding: [0x62,0xf2,0xfd,0x49,0x83,0xd1] 77; X64-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2] 78; X64-NEXT: retq # encoding: [0xc3] 79 %1 = call <64 x i8> @llvm.x86.avx512.pmultishift.qb.512(<64 x i8> %x0, <64 x i8> %x1) 80 %2 = bitcast i64 %x3 to <64 x i1> 81 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> %x2 82 ret <64 x i8> %3 83} 84 85define <64 x i8>@test_int_x86_avx512_maskz_pmultishift_qb_512(<64 x i8> %x0, <64 x i8> %x1, i64 %x3) { 86; X86-LABEL: test_int_x86_avx512_maskz_pmultishift_qb_512: 87; X86: # %bb.0: 88; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 89; X86-NEXT: vpmultishiftqb %zmm1, %zmm0, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0xfd,0xc9,0x83,0xc1] 90; X86-NEXT: retl # encoding: [0xc3] 91; 92; X64-LABEL: test_int_x86_avx512_maskz_pmultishift_qb_512: 93; X64: # %bb.0: 94; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 95; X64-NEXT: vpmultishiftqb %zmm1, %zmm0, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0xfd,0xc9,0x83,0xc1] 96; X64-NEXT: retq # encoding: [0xc3] 97 %1 = call <64 x i8> @llvm.x86.avx512.pmultishift.qb.512(<64 x i8> %x0, <64 x i8> %x1) 98 %2 = bitcast i64 %x3 to <64 x i1> 99 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> zeroinitializer 100 ret <64 x i8> %3 101} 102 103declare <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8>, <64 x i8>, <64 x i8>) 104 105define <64 x i8>@test_int_x86_avx512_vpermi2var_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) { 106; CHECK-LABEL: test_int_x86_avx512_vpermi2var_qi_512: 107; CHECK: # %bb.0: 108; CHECK-NEXT: vpermt2b %zmm2, %zmm1, %zmm0 # encoding: [0x62,0xf2,0x75,0x48,0x7d,0xc2] 109; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3] 110 %1 = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) 111 ret <64 x i8> %1 112} 113 114define <64 x i8>@test_int_x86_avx512_mask_vpermi2var_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, i64 %x3) { 115; X86-LABEL: test_int_x86_avx512_mask_vpermi2var_qi_512: 116; X86: # %bb.0: 117; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 118; X86-NEXT: vpermi2b %zmm2, %zmm0, %zmm1 {%k1} # encoding: [0x62,0xf2,0x7d,0x49,0x75,0xca] 119; X86-NEXT: vmovdqa64 %zmm1, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc1] 120; X86-NEXT: retl # encoding: [0xc3] 121; 122; X64-LABEL: test_int_x86_avx512_mask_vpermi2var_qi_512: 123; X64: # %bb.0: 124; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 125; X64-NEXT: vpermi2b %zmm2, %zmm0, %zmm1 {%k1} # encoding: [0x62,0xf2,0x7d,0x49,0x75,0xca] 126; X64-NEXT: vmovdqa64 %zmm1, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc1] 127; X64-NEXT: retq # encoding: [0xc3] 128 %1 = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) 129 %2 = bitcast i64 %x3 to <64 x i1> 130 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> %x1 131 ret <64 x i8> %3 132} 133 134define <64 x i8>@test_int_x86_avx512_vpermt2var_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2) { 135; CHECK-LABEL: test_int_x86_avx512_vpermt2var_qi_512: 136; CHECK: # %bb.0: 137; CHECK-NEXT: vpermi2b %zmm2, %zmm1, %zmm0 # encoding: [0x62,0xf2,0x75,0x48,0x75,0xc2] 138; CHECK-NEXT: ret{{[l|q]}} # encoding: [0xc3] 139 %1 = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x1, <64 x i8> %x0, <64 x i8> %x2) 140 ret <64 x i8> %1 141} 142 143define <64 x i8>@test_int_x86_avx512_mask_vpermt2var_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, i64 %x3) { 144; X86-LABEL: test_int_x86_avx512_mask_vpermt2var_qi_512: 145; X86: # %bb.0: 146; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 147; X86-NEXT: vpermt2b %zmm2, %zmm0, %zmm1 {%k1} # encoding: [0x62,0xf2,0x7d,0x49,0x7d,0xca] 148; X86-NEXT: vmovdqa64 %zmm1, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc1] 149; X86-NEXT: retl # encoding: [0xc3] 150; 151; X64-LABEL: test_int_x86_avx512_mask_vpermt2var_qi_512: 152; X64: # %bb.0: 153; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 154; X64-NEXT: vpermt2b %zmm2, %zmm0, %zmm1 {%k1} # encoding: [0x62,0xf2,0x7d,0x49,0x7d,0xca] 155; X64-NEXT: vmovdqa64 %zmm1, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc1] 156; X64-NEXT: retq # encoding: [0xc3] 157 %1 = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x1, <64 x i8> %x0, <64 x i8> %x2) 158 %2 = bitcast i64 %x3 to <64 x i1> 159 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> %x1 160 ret <64 x i8> %3 161} 162 163define <64 x i8>@test_int_x86_avx512_maskz_vpermt2var_qi_512(<64 x i8> %x0, <64 x i8> %x1, <64 x i8> %x2, i64 %x3) { 164; X86-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_512: 165; X86: # %bb.0: 166; X86-NEXT: kmovq {{[0-9]+}}(%esp), %k1 # encoding: [0xc4,0xe1,0xf8,0x90,0x4c,0x24,0x04] 167; X86-NEXT: vpermi2b %zmm2, %zmm1, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0xc9,0x75,0xc2] 168; X86-NEXT: retl # encoding: [0xc3] 169; 170; X64-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_512: 171; X64: # %bb.0: 172; X64-NEXT: kmovq %rdi, %k1 # encoding: [0xc4,0xe1,0xfb,0x92,0xcf] 173; X64-NEXT: vpermi2b %zmm2, %zmm1, %zmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0xc9,0x75,0xc2] 174; X64-NEXT: retq # encoding: [0xc3] 175 %1 = call <64 x i8> @llvm.x86.avx512.vpermi2var.qi.512(<64 x i8> %x1, <64 x i8> %x0, <64 x i8> %x2) 176 %2 = bitcast i64 %x3 to <64 x i1> 177 %3 = select <64 x i1> %2, <64 x i8> %1, <64 x i8> zeroinitializer 178 ret <64 x i8> %3 179} 180