Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/test/CodeGen/X86/vector-trunc.ll
Show First 20 Lines • Show All 672 Lines • ▼ Show 20 Lines | |||||
; SSE41-NEXT: packusdw %xmm3, %xmm2 | ; SSE41-NEXT: packusdw %xmm3, %xmm2 | ||||
; SSE41-NEXT: movdqu %xmm2, (%rax) | ; SSE41-NEXT: movdqu %xmm2, (%rax) | ||||
; SSE41-NEXT: movdqu %xmm0, (%rax) | ; SSE41-NEXT: movdqu %xmm0, (%rax) | ||||
; SSE41-NEXT: retq | ; SSE41-NEXT: retq | ||||
; | ; | ||||
; AVX1-LABEL: trunc16i32_16i16: | ; AVX1-LABEL: trunc16i32_16i16: | ||||
; AVX1: # %bb.0: # %entry | ; AVX1: # %bb.0: # %entry | ||||
; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] | ; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] | ||||
; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 | |||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 | |||||
; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 | |||||
; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 | ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 | ||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 | ||||
; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 | ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 | ||||
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 | ||||
; AVX1-NEXT: vmovups %ymm0, (%rax) | ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ||||
; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 | |||||
; AVX1-NEXT: vmovdqu %xmm1, (%rax) | |||||
; AVX1-NEXT: vmovdqu %xmm0, (%rax) | |||||
; AVX1-NEXT: vzeroupper | ; AVX1-NEXT: vzeroupper | ||||
; AVX1-NEXT: retq | ; AVX1-NEXT: retq | ||||
; | ; | ||||
; AVX2-LABEL: trunc16i32_16i16: | ; AVX2-LABEL: trunc16i32_16i16: | ||||
; AVX2: # %bb.0: # %entry | ; AVX2: # %bb.0: # %entry | ||||
; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] | ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] | ||||
; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 | ; AVX2-NEXT: vpshufb %ymm2, %ymm0, %ymm0 | ||||
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] | ||||
; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 | ; AVX2-NEXT: vpshufb %ymm2, %ymm1, %ymm1 | ||||
; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] | ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] | ||||
; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | ; AVX2-NEXT: vmovdqu %xmm1, (%rax) | ||||
; AVX2-NEXT: vmovdqu %ymm0, (%rax) | ; AVX2-NEXT: vmovdqu %xmm0, (%rax) | ||||
; AVX2-NEXT: vzeroupper | ; AVX2-NEXT: vzeroupper | ||||
; AVX2-NEXT: retq | ; AVX2-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: trunc16i32_16i16: | ; AVX512-LABEL: trunc16i32_16i16: | ||||
; AVX512: # %bb.0: # %entry | ; AVX512: # %bb.0: # %entry | ||||
; AVX512-NEXT: vpmovdw %zmm0, (%rax) | ; AVX512-NEXT: vpmovdw %zmm0, (%rax) | ||||
; AVX512-NEXT: vzeroupper | ; AVX512-NEXT: vzeroupper | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
Show All 13 Lines | |||||
; SSE-NEXT: psrad $16, %xmm0 | ; SSE-NEXT: psrad $16, %xmm0 | ||||
; SSE-NEXT: packssdw %xmm1, %xmm0 | ; SSE-NEXT: packssdw %xmm1, %xmm0 | ||||
; SSE-NEXT: movdqu %xmm2, (%rax) | ; SSE-NEXT: movdqu %xmm2, (%rax) | ||||
; SSE-NEXT: movdqu %xmm0, (%rax) | ; SSE-NEXT: movdqu %xmm0, (%rax) | ||||
; SSE-NEXT: retq | ; SSE-NEXT: retq | ||||
; | ; | ||||
; AVX1-LABEL: trunc16i32_16i16_ashr: | ; AVX1-LABEL: trunc16i32_16i16_ashr: | ||||
; AVX1: # %bb.0: # %entry | ; AVX1: # %bb.0: # %entry | ||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | |||||
; AVX1-NEXT: vpsrad $16, %xmm2, %xmm2 | |||||
; AVX1-NEXT: vpsrad $16, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ||||
; AVX1-NEXT: vpsrad $16, %xmm2, %xmm2 | ; AVX1-NEXT: vpsrad $16, %xmm2, %xmm2 | ||||
; AVX1-NEXT: vpsrad $16, %xmm1, %xmm1 | ; AVX1-NEXT: vpsrad $16, %xmm1, %xmm1 | ||||
; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 | ; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 | ||||
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ||||
; AVX1-NEXT: vmovups %ymm0, (%rax) | ; AVX1-NEXT: vpsrad $16, %xmm2, %xmm2 | ||||
; AVX1-NEXT: vpsrad $16, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vmovdqu %xmm1, (%rax) | |||||
; AVX1-NEXT: vmovdqu %xmm0, (%rax) | |||||
; AVX1-NEXT: vzeroupper | ; AVX1-NEXT: vzeroupper | ||||
; AVX1-NEXT: retq | ; AVX1-NEXT: retq | ||||
; | ; | ||||
; AVX2-LABEL: trunc16i32_16i16_ashr: | ; AVX2-LABEL: trunc16i32_16i16_ashr: | ||||
; AVX2: # %bb.0: # %entry | ; AVX2: # %bb.0: # %entry | ||||
; AVX2-NEXT: vpsrad $16, %ymm1, %ymm1 | ; AVX2-NEXT: vpsrad $16, %ymm1, %ymm1 | ||||
; AVX2-NEXT: vpsrad $16, %ymm0, %ymm0 | ; AVX2-NEXT: vpsrad $16, %ymm0, %ymm0 | ||||
; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 | ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
; SSE41-NEXT: psrld $16, %xmm0 | ; SSE41-NEXT: psrld $16, %xmm0 | ||||
; SSE41-NEXT: packusdw %xmm1, %xmm0 | ; SSE41-NEXT: packusdw %xmm1, %xmm0 | ||||
; SSE41-NEXT: movdqu %xmm2, (%rax) | ; SSE41-NEXT: movdqu %xmm2, (%rax) | ||||
; SSE41-NEXT: movdqu %xmm0, (%rax) | ; SSE41-NEXT: movdqu %xmm0, (%rax) | ||||
; SSE41-NEXT: retq | ; SSE41-NEXT: retq | ||||
; | ; | ||||
; AVX1-LABEL: trunc16i32_16i16_lshr: | ; AVX1-LABEL: trunc16i32_16i16_lshr: | ||||
; AVX1: # %bb.0: # %entry | ; AVX1: # %bb.0: # %entry | ||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | |||||
; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2 | |||||
; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ||||
; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2 | ; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2 | ||||
; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1 | ; AVX1-NEXT: vpsrld $16, %xmm1, %xmm1 | ||||
; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 | ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 | ||||
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ||||
; AVX1-NEXT: vmovups %ymm0, (%rax) | ; AVX1-NEXT: vpsrld $16, %xmm2, %xmm2 | ||||
; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 | |||||
; AVX1-NEXT: vmovdqu %xmm1, (%rax) | |||||
; AVX1-NEXT: vmovdqu %xmm0, (%rax) | |||||
; AVX1-NEXT: vzeroupper | ; AVX1-NEXT: vzeroupper | ||||
; AVX1-NEXT: retq | ; AVX1-NEXT: retq | ||||
; | ; | ||||
; AVX2-LABEL: trunc16i32_16i16_lshr: | ; AVX2-LABEL: trunc16i32_16i16_lshr: | ||||
; AVX2: # %bb.0: # %entry | ; AVX2: # %bb.0: # %entry | ||||
; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1 | ; AVX2-NEXT: vpsrld $16, %ymm1, %ymm1 | ||||
; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 | ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0 | ||||
; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 | ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 | ||||
▲ Show 20 Lines • Show All 473 Lines • ▼ Show 20 Lines | |||||
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] | ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] | ||||
; SSE41-NEXT: movdqu %xmm2, (%rax) | ; SSE41-NEXT: movdqu %xmm2, (%rax) | ||||
; SSE41-NEXT: movdqu %xmm0, (%rax) | ; SSE41-NEXT: movdqu %xmm0, (%rax) | ||||
; SSE41-NEXT: retq | ; SSE41-NEXT: retq | ||||
; | ; | ||||
; AVX1-LABEL: trunc32i16_32i8: | ; AVX1-LABEL: trunc32i16_32i8: | ||||
; AVX1: # %bb.0: # %entry | ; AVX1: # %bb.0: # %entry | ||||
; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | ; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | ||||
; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 | |||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 | |||||
; AVX1-NEXT: vpackuswb %xmm3, %xmm1, %xmm1 | |||||
; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 | ; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0 | ||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 | ||||
; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 | ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 | ||||
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1 | ||||
; AVX1-NEXT: vmovups %ymm0, (%rax) | ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ||||
; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 | |||||
; AVX1-NEXT: vmovdqu %xmm1, (%rax) | |||||
; AVX1-NEXT: vmovdqu %xmm0, (%rax) | |||||
; AVX1-NEXT: vzeroupper | ; AVX1-NEXT: vzeroupper | ||||
; AVX1-NEXT: retq | ; AVX1-NEXT: retq | ||||
; | ; | ||||
; AVX2-LABEL: trunc32i16_32i8: | ; AVX2-LABEL: trunc32i16_32i8: | ||||
; AVX2: # %bb.0: # %entry | ; AVX2: # %bb.0: # %entry | ||||
; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | ||||
; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 | ; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0 | ||||
; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 | ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1 | ||||
; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm2 | ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm2 | ||||
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 | ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 | ||||
; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] | ; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7] | ||||
; AVX2-NEXT: vpackuswb %ymm0, %ymm2, %ymm0 | ; AVX2-NEXT: vpackuswb %ymm0, %ymm2, %ymm0 | ||||
; AVX2-NEXT: vmovdqu %ymm0, (%rax) | ; AVX2-NEXT: vmovdqu %ymm0, (%rax) | ||||
; AVX2-NEXT: vzeroupper | ; AVX2-NEXT: vzeroupper | ||||
; AVX2-NEXT: retq | ; AVX2-NEXT: retq | ||||
; | ; | ||||
; AVX512F-LABEL: trunc32i16_32i8: | ; AVX512F-LABEL: trunc32i16_32i8: | ||||
; AVX512F: # %bb.0: # %entry | ; AVX512F: # %bb.0: # %entry | ||||
; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | |||||
; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 | |||||
; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero | ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero | ||||
; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 | ; AVX512F-NEXT: vpmovdb %zmm1, (%rax) | ||||
; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | ||||
; AVX512F-NEXT: vmovdqu %ymm0, (%rax) | ; AVX512F-NEXT: vpmovdb %zmm0, (%rax) | ||||
; AVX512F-NEXT: vzeroupper | ; AVX512F-NEXT: vzeroupper | ||||
; AVX512F-NEXT: retq | ; AVX512F-NEXT: retq | ||||
; | ; | ||||
; AVX512VL-LABEL: trunc32i16_32i8: | ; AVX512VL-LABEL: trunc32i16_32i8: | ||||
; AVX512VL: # %bb.0: # %entry | ; AVX512VL: # %bb.0: # %entry | ||||
; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | |||||
; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 | |||||
; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero | ; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero | ||||
; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1 | ; AVX512VL-NEXT: vpmovdb %zmm1, (%rax) | ||||
; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 | ; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero | ||||
; AVX512VL-NEXT: vmovdqu %ymm0, (%rax) | ; AVX512VL-NEXT: vpmovdb %zmm0, (%rax) | ||||
; AVX512VL-NEXT: vzeroupper | ; AVX512VL-NEXT: vzeroupper | ||||
; AVX512VL-NEXT: retq | ; AVX512VL-NEXT: retq | ||||
; | ; | ||||
; AVX512BW-LABEL: trunc32i16_32i8: | ; AVX512BW-LABEL: trunc32i16_32i8: | ||||
; AVX512BW: # %bb.0: # %entry | ; AVX512BW: # %bb.0: # %entry | ||||
; AVX512BW-NEXT: vpmovwb %zmm0, (%rax) | ; AVX512BW-NEXT: vpmovwb %zmm0, (%rax) | ||||
; AVX512BW-NEXT: vzeroupper | ; AVX512BW-NEXT: vzeroupper | ||||
; AVX512BW-NEXT: retq | ; AVX512BW-NEXT: retq | ||||
▲ Show 20 Lines • Show All 656 Lines • Show Last 20 Lines |