CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
764 lines
30 KiB
LLVM
764 lines
30 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSE2
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX1
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX2
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX2
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefix=AVX512
|
|
|
|
;
|
|
; 128-bit vectors
|
|
;
|
|
|
|
define <2 x i64> @ext_i2_2i64(i2 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i2_2i64:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i2_2i64:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,2]
|
|
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i2_2i64:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastd %xmm0, %xmm0
|
|
; AVX2-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,2]
|
|
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i2_2i64:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i2 %a0 to <2 x i1>
|
|
%2 = sext <2 x i1> %1 to <2 x i64>
|
|
ret <2 x i64> %2
|
|
}
|
|
|
|
define <4 x i32> @ext_i4_4i32(i4 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i4_4i32:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i4_4i32:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm1 = [1,2,4,8]
|
|
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i4_4i32:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastd %xmm0, %xmm0
|
|
; AVX2-NEXT: vpmovsxbd {{.*#+}} xmm1 = [1,2,4,8]
|
|
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i4_4i32:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i4 %a0 to <4 x i1>
|
|
%2 = sext <4 x i1> %1 to <4 x i32>
|
|
ret <4 x i32> %2
|
|
}
|
|
|
|
define <8 x i16> @ext_i8_8i16(i8 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i8_8i16:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i8_8i16:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
|
|
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i8_8i16:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastb %xmm0, %xmm0
|
|
; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i8_8i16:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k0
|
|
; AVX512-NEXT: vpmovm2w %k0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i8 %a0 to <8 x i1>
|
|
%2 = sext <8 x i1> %1 to <8 x i16>
|
|
ret <8 x i16> %2
|
|
}
|
|
|
|
define <16 x i8> @ext_i16_16i8(i16 %a0) {
|
|
; SSE2-LABEL: ext_i16_16i8:
|
|
; SSE2: # %bb.0:
|
|
; SSE2-NEXT: movd %edi, %xmm0
|
|
; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,1,4,5,6,7]
|
|
; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
|
|
; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; SSE2-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; SSE2-NEXT: retq
|
|
;
|
|
; SSSE3-LABEL: ext_i16_16i8:
|
|
; SSSE3: # %bb.0:
|
|
; SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
|
|
; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0
|
|
; SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i16_16i8:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
|
|
; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX1-NEXT: # xmm1 = mem[0,0]
|
|
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i16_16i8:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
|
|
; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i16_16i8:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k0
|
|
; AVX512-NEXT: vpmovm2b %k0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i16 %a0 to <16 x i1>
|
|
%2 = sext <16 x i1> %1 to <16 x i8>
|
|
ret <16 x i8> %2
|
|
}
|
|
|
|
;
|
|
; 256-bit vectors
|
|
;
|
|
|
|
define <4 x i64> @ext_i4_4i64(i4 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i4_4i64:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i4_4i64:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
|
; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [1,2,4,8]
|
|
; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
|
|
; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm1
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i4_4i64:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0
|
|
; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm1 = [1,2,4,8]
|
|
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i4_4i64:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; AVX512-NEXT: vmovdqa64 %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i4 %a0 to <4 x i1>
|
|
%2 = sext <4 x i1> %1 to <4 x i64>
|
|
ret <4 x i64> %2
|
|
}
|
|
|
|
define <8 x i32> @ext_i8_8i32(i8 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i8_8i32:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i8_8i32:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
|
; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
|
|
; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm0
|
|
; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i8_8i32:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0
|
|
; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i8_8i32:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i8 %a0 to <8 x i1>
|
|
%2 = sext <8 x i1> %1 to <8 x i32>
|
|
ret <8 x i32> %2
|
|
}
|
|
|
|
define <16 x i16> @ext_i16_16i16(i16 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i16_16i16:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i16_16i16:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
|
; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
|
|
; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm1
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
|
|
; AVX1-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i16_16i16:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
|
|
; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i16_16i16:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k0
|
|
; AVX512-NEXT: vpmovm2w %k0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i16 %a0 to <16 x i1>
|
|
%2 = sext <16 x i1> %1 to <16 x i16>
|
|
ret <16 x i16> %2
|
|
}
|
|
|
|
define <32 x i8> @ext_i32_32i8(i32 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i32_32i8:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm1
|
|
; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[2,2,3,3,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i32_32i8:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,0,1,1,4,5,6,7]
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,2,3,3,4,5,6,7]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
|
|
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
|
|
; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
|
|
; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX1-NEXT: # xmm2 = mem[0,0]
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i32_32i8:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0
|
|
; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27]
|
|
; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i32_32i8:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k0
|
|
; AVX512-NEXT: vpmovm2b %k0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i32 %a0 to <32 x i1>
|
|
%2 = sext <32 x i1> %1 to <32 x i8>
|
|
ret <32 x i8> %2
|
|
}
|
|
|
|
;
|
|
; 512-bit vectors
|
|
;
|
|
|
|
define <8 x i64> @ext_i8_8i64(i8 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i8_8i64:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm1
|
|
; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,8]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [64,128]
|
|
; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i8_8i64:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
|
|
; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,8]
|
|
; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm2
|
|
; AVX1-NEXT: vpcmpeqq %xmm0, %xmm2, %xmm0
|
|
; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
|
|
; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
|
|
; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [16,32,64,128]
|
|
; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
|
|
; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm2
|
|
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
|
|
; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i8_8i64:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastb %xmm0, %ymm1
|
|
; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,2,4,8]
|
|
; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
|
|
; AVX2-NEXT: vpcmpeqq %ymm0, %ymm2, %ymm0
|
|
; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm2 = [16,32,64,128]
|
|
; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i8_8i64:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i8 %a0 to <8 x i1>
|
|
%2 = sext <8 x i1> %1 to <8 x i64>
|
|
ret <8 x i64> %2
|
|
}
|
|
|
|
define <16 x i32> @ext_i16_16i32(i16 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i16_16i32:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
|
|
; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm1
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [256,512,1024,2048]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4096,8192,16384,32768]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i16_16i32:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm0
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm1
|
|
; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
|
|
; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm0
|
|
; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
|
|
; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
|
|
; AVX1-NEXT: vcvtdq2ps %ymm1, %ymm1
|
|
; AVX1-NEXT: vcmpeqps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i16_16i32:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastw %xmm0, %ymm1
|
|
; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = [1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm2
|
|
; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0
|
|
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = [256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i16_16i32:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k1
|
|
; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i16 %a0 to <16 x i1>
|
|
%2 = sext <16 x i1> %1 to <16 x i32>
|
|
ret <16 x i32> %2
|
|
}
|
|
|
|
define <32 x i16> @ext_i32_32i16(i32 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i32_32i16:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movd %edi, %xmm2
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,0,0,0,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [256,512,1024,2048,4096,8192,16384,32768]
|
|
; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm1
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[1,1,1,1,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,1,0,1]
|
|
; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
|
|
; SSE2-SSSE3-NEXT: pcmpeqw %xmm5, %xmm3
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i32_32i16:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovd %edi, %xmm1
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,0,0,4,5,6,7]
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
|
|
; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
|
|
; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[1,1,1,1,4,5,6,7]
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
|
|
; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
|
|
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
|
|
; AVX1-NEXT: vpcmpeqw %xmm4, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i32_32i16:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovd %edi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastw %xmm0, %ymm0
|
|
; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
|
|
; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
|
|
; AVX2-NEXT: shrl $16, %edi
|
|
; AVX2-NEXT: vmovd %edi, %xmm2
|
|
; AVX2-NEXT: vpbroadcastw %xmm2, %ymm2
|
|
; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2
|
|
; AVX2-NEXT: vpcmpeqw %ymm1, %ymm2, %ymm1
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i32_32i16:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovd %edi, %k0
|
|
; AVX512-NEXT: vpmovm2w %k0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i32 %a0 to <32 x i1>
|
|
%2 = sext <32 x i1> %1 to <32 x i16>
|
|
ret <32 x i16> %2
|
|
}
|
|
|
|
define <64 x i8> @ext_i64_64i8(i64 %a0) {
|
|
; SSE2-SSSE3-LABEL: ext_i64_64i8:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movq %rdi, %xmm3
|
|
; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm3[0,0,1,1,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
|
|
; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm0
|
|
; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm3[2,2,3,3,4,5,6,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm1
|
|
; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,4,5,5]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,2,3,3]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm2
|
|
; SSE2-SSSE3-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,6,6,7,7]
|
|
; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[2,2,3,3]
|
|
; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm4, %xmm3
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: ext_i64_64i8:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovq %rdi, %xmm0
|
|
; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm1[0,0,1,1,4,5,6,7]
|
|
; AVX1-NEXT: vpshuflw {{.*#+}} xmm2 = xmm1[2,2,3,3,4,5,6,7]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
|
|
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,0,1,1,4,4,5,5]
|
|
; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
|
|
; AVX1-NEXT: vpshufhw {{.*#+}} xmm3 = xmm1[0,1,2,3,4,4,5,5]
|
|
; AVX1-NEXT: vpshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,6,6,7,7]
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
|
|
; AVX1-NEXT: vshufps {{.*#+}} ymm1 = ymm1[2,2,3,3,6,6,7,7]
|
|
; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
|
|
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: ext_i64_64i8:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovq %rdi, %xmm0
|
|
; AVX2-NEXT: vpbroadcastq %xmm0, %ymm1
|
|
; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm1[0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,18,18,18,18,18,18,18,18,27,27,27,27,27,27,27,27]
|
|
; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128]
|
|
; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
|
|
; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[4,4,4,4,4,4,4,4,13,13,13,13,13,13,13,13,22,22,22,22,22,22,22,22,31,31,31,31,31,31,31,31]
|
|
; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ext_i64_64i8:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: kmovq %rdi, %k0
|
|
; AVX512-NEXT: vpmovm2b %k0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%1 = bitcast i64 %a0 to <64 x i1>
|
|
%2 = sext <64 x i1> %1 to <64 x i8>
|
|
ret <64 x i8> %2
|
|
}
|
|
|
|
define <8 x i32> @PR157382(ptr %p0, ptr %p1, ptr %p2) {
|
|
; SSE2-SSSE3-LABEL: PR157382:
|
|
; SSE2-SSSE3: # %bb.0:
|
|
; SSE2-SSSE3-NEXT: movdqu (%rdi), %xmm3
|
|
; SSE2-SSSE3-NEXT: movdqu 16(%rdi), %xmm2
|
|
; SSE2-SSSE3-NEXT: movdqu (%rsi), %xmm0
|
|
; SSE2-SSSE3-NEXT: movdqu 16(%rsi), %xmm4
|
|
; SSE2-SSSE3-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
|
|
; SSE2-SSSE3-NEXT: pxor %xmm5, %xmm5
|
|
; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6
|
|
; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
|
|
; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm7
|
|
; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm6
|
|
; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm8
|
|
; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm8
|
|
; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm8
|
|
; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
|
|
; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
|
|
; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
|
|
; SSE2-SSSE3-NEXT: por %xmm8, %xmm4
|
|
; SSE2-SSSE3-NEXT: packssdw %xmm4, %xmm0
|
|
; SSE2-SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
|
|
; SSE2-SSSE3-NEXT: pcmpeqb %xmm5, %xmm1
|
|
; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm1
|
|
; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
|
|
; SSE2-SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
|
|
; SSE2-SSSE3-NEXT: psrad $16, %xmm0
|
|
; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
|
|
; SSE2-SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
|
|
; SSE2-SSSE3-NEXT: pslld $31, %xmm1
|
|
; SSE2-SSSE3-NEXT: psrad $31, %xmm1
|
|
; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
|
|
; SSE2-SSSE3-NEXT: retq
|
|
;
|
|
; AVX1-LABEL: PR157382:
|
|
; AVX1: # %bb.0:
|
|
; AVX1-NEXT: vmovdqu (%rdi), %ymm0
|
|
; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
|
|
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm2, %xmm3
|
|
; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
|
|
; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
|
|
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
|
|
; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm5
|
|
; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
|
|
; AVX1-NEXT: vmovdqu (%rsi), %xmm6
|
|
; AVX1-NEXT: vmovdqu 16(%rsi), %xmm7
|
|
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm6, %xmm6
|
|
; AVX1-NEXT: vpor %xmm6, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm7, %xmm6
|
|
; AVX1-NEXT: vpor %xmm6, %xmm5, %xmm5
|
|
; AVX1-NEXT: vpackssdw %xmm5, %xmm3, %xmm3
|
|
; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
|
|
; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1
|
|
; AVX1-NEXT: vpmovsxbw %xmm1, %xmm1
|
|
; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1
|
|
; AVX1-NEXT: vpmovsxwd %xmm1, %xmm2
|
|
; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
|
|
; AVX1-NEXT: vpmovsxwd %xmm1, %xmm1
|
|
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
|
|
; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm0
|
|
; AVX1-NEXT: retq
|
|
;
|
|
; AVX2-LABEL: PR157382:
|
|
; AVX2: # %bb.0:
|
|
; AVX2-NEXT: vmovdqu (%rdi), %ymm0
|
|
; AVX2-NEXT: vmovdqu (%rsi), %ymm1
|
|
; AVX2-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero
|
|
; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
|
|
; AVX2-NEXT: vpcmpgtd %ymm0, %ymm3, %ymm4
|
|
; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5
|
|
; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4
|
|
; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1
|
|
; AVX2-NEXT: vpor %ymm1, %ymm4, %ymm1
|
|
; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
|
|
; AVX2-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm2
|
|
; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
|
|
; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
|
|
; AVX2-NEXT: vpmovsxbd %xmm2, %ymm2
|
|
; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
|
|
; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
|
|
; AVX2-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: PR157382:
|
|
; AVX512: # %bb.0:
|
|
; AVX512-NEXT: vmovdqu (%rdi), %ymm0
|
|
; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
|
|
; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
|
|
; AVX512-NEXT: vpcmpnltd %ymm2, %ymm0, %k0
|
|
; AVX512-NEXT: vpcmpltd (%rsi), %ymm2, %k1
|
|
; AVX512-NEXT: vptestmb %xmm1, %xmm1, %k2
|
|
; AVX512-NEXT: korw %k1, %k0, %k0
|
|
; AVX512-NEXT: korw %k2, %k0, %k1
|
|
; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%ld0 = load <8 x i32>, ptr %p0, align 1
|
|
%ld1 = load <8 x i32>, ptr %p1, align 1
|
|
%ld2 = load <8 x i8>, ptr %p2, align 1
|
|
%cmp0 = icmp sge <8 x i32> %ld0, zeroinitializer
|
|
%cmp1 = icmp sgt <8 x i32> %ld1, zeroinitializer
|
|
%cmp2 = icmp ne <8 x i8> %ld2, zeroinitializer
|
|
%cmp01 = or <8 x i1> %cmp0, %cmp1
|
|
%cmp012 = or <8 x i1> %cmp01, %cmp2
|
|
%res = select <8 x i1> %cmp012, <8 x i32> %ld0, <8 x i32> zeroinitializer
|
|
ret <8 x i32> %res
|
|
}
|