Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/X86/bitcast-vector-bool.ll
Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | ; AVX512-NEXT: retq | ||||
ret i1 %5 | ret i1 %5 | ||||
} | } | ||||
define i2 @bitcast_v4i32_to_v2i2(<4 x i32> %a0) nounwind { | define i2 @bitcast_v4i32_to_v2i2(<4 x i32> %a0) nounwind { | ||||
; SSE2-SSSE3-LABEL: bitcast_v4i32_to_v2i2: | ; SSE2-SSSE3-LABEL: bitcast_v4i32_to_v2i2: | ||||
; SSE2-SSSE3: # %bb.0: | ; SSE2-SSSE3: # %bb.0: | ||||
; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax | ; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax | ||||
; SSE2-SSSE3-NEXT: movl %eax, %ecx | ; SSE2-SSSE3-NEXT: movl %eax, %ecx | ||||
; SSE2-SSSE3-NEXT: andl $3, %ecx | ; SSE2-SSSE3-NEXT: shrb $2, %cl | ||||
; SSE2-SSSE3-NEXT: movq %rcx, %xmm0 | ; SSE2-SSSE3-NEXT: movzbl %cl, %ecx | ||||
; SSE2-SSSE3-NEXT: shrl $2, %eax | ; SSE2-SSSE3-NEXT: andb $3, %al | ||||
; SSE2-SSSE3-NEXT: movq %rax, %xmm1 | ; SSE2-SSSE3-NEXT: movzbl %al, %eax | ||||
; SSE2-SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | ; SSE2-SSSE3-NEXT: movd %eax, %xmm0 | ||||
; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm0 | |||||
; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | ; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | ||||
; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: retq | ; SSE2-SSSE3-NEXT: retq | ||||
; | ; | ||||
; AVX12-LABEL: bitcast_v4i32_to_v2i2: | ; AVX12-LABEL: bitcast_v4i32_to_v2i2: | ||||
; AVX12: # %bb.0: | ; AVX12: # %bb.0: | ||||
; AVX12-NEXT: vmovmskps %xmm0, %ecx | ; AVX12-NEXT: vmovmskps %xmm0, %eax | ||||
; AVX12-NEXT: movl %ecx, %eax | ; AVX12-NEXT: movl %eax, %ecx | ||||
; AVX12-NEXT: shrl $2, %eax | ; AVX12-NEXT: shrb $2, %cl | ||||
; AVX12-NEXT: andl $3, %ecx | ; AVX12-NEXT: andb $3, %al | ||||
; AVX12-NEXT: addb %cl, %al | ; AVX12-NEXT: addb %cl, %al | ||||
; AVX12-NEXT: # kill: def $al killed $al killed $eax | ; AVX12-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX12-NEXT: retq | ; AVX12-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: bitcast_v4i32_to_v2i2: | ; AVX512-LABEL: bitcast_v4i32_to_v2i2: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ||||
; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %k0 | ; AVX512-NEXT: vpcmpgtd %xmm0, %xmm1, %k0 | ||||
; AVX512-NEXT: kmovd %k0, %ecx | ; AVX512-NEXT: kmovd %k0, %eax | ||||
; AVX512-NEXT: movzbl %cl, %eax | ; AVX512-NEXT: movl %eax, %ecx | ||||
; AVX512-NEXT: shrl $2, %eax | ; AVX512-NEXT: shrb $2, %cl | ||||
; AVX512-NEXT: andl $3, %eax | ; AVX512-NEXT: andb $3, %al | ||||
; AVX512-NEXT: andl $3, %ecx | |||||
; AVX512-NEXT: addb %cl, %al | ; AVX512-NEXT: addb %cl, %al | ||||
; AVX512-NEXT: # kill: def $al killed $al killed $eax | ; AVX512-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
%1 = icmp slt <4 x i32> %a0, zeroinitializer | %1 = icmp slt <4 x i32> %a0, zeroinitializer | ||||
%2 = bitcast <4 x i1> %1 to <2 x i2> | %2 = bitcast <4 x i1> %1 to <2 x i2> | ||||
%3 = extractelement <2 x i2> %2, i32 0 | %3 = extractelement <2 x i2> %2, i32 0 | ||||
%4 = extractelement <2 x i2> %2, i32 1 | %4 = extractelement <2 x i2> %2, i32 1 | ||||
%5 = add i2 %3, %4 | %5 = add i2 %3, %4 | ||||
ret i2 %5 | ret i2 %5 | ||||
} | } | ||||
define i4 @bitcast_v8i16_to_v2i4(<8 x i16> %a0) nounwind { | define i4 @bitcast_v8i16_to_v2i4(<8 x i16> %a0) nounwind { | ||||
; SSE2-SSSE3-LABEL: bitcast_v8i16_to_v2i4: | ; SSE2-SSSE3-LABEL: bitcast_v8i16_to_v2i4: | ||||
; SSE2-SSSE3: # %bb.0: | ; SSE2-SSSE3: # %bb.0: | ||||
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ||||
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ||||
; SSE2-SSSE3-NEXT: movzbl %al, %ecx | ; SSE2-SSSE3-NEXT: movl %eax, %ecx | ||||
; SSE2-SSSE3-NEXT: shrl $4, %ecx | ; SSE2-SSSE3-NEXT: shrb $4, %cl | ||||
; SSE2-SSSE3-NEXT: movq %rcx, %xmm0 | ; SSE2-SSSE3-NEXT: movzbl %cl, %ecx | ||||
; SSE2-SSSE3-NEXT: andl $15, %eax | ; SSE2-SSSE3-NEXT: andb $15, %al | ||||
; SSE2-SSSE3-NEXT: movq %rax, %xmm1 | ; SSE2-SSSE3-NEXT: movzbl %al, %eax | ||||
; SSE2-SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | ; SSE2-SSSE3-NEXT: movd %eax, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) | ; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | |||||
; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: retq | ; SSE2-SSSE3-NEXT: retq | ||||
; | ; | ||||
; AVX12-LABEL: bitcast_v8i16_to_v2i4: | ; AVX12-LABEL: bitcast_v8i16_to_v2i4: | ||||
; AVX12: # %bb.0: | ; AVX12: # %bb.0: | ||||
; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 | ; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 | ||||
; AVX12-NEXT: vpmovmskb %xmm0, %ecx | ; AVX12-NEXT: vpmovmskb %xmm0, %eax | ||||
; AVX12-NEXT: movzbl %cl, %eax | ; AVX12-NEXT: movl %eax, %ecx | ||||
; AVX12-NEXT: shrl $4, %eax | ; AVX12-NEXT: shrb $4, %cl | ||||
; AVX12-NEXT: andl $15, %ecx | ; AVX12-NEXT: andb $15, %al | ||||
; AVX12-NEXT: addb %cl, %al | ; AVX12-NEXT: addb %cl, %al | ||||
; AVX12-NEXT: # kill: def $al killed $al killed $eax | ; AVX12-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX12-NEXT: retq | ; AVX12-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: bitcast_v8i16_to_v2i4: | ; AVX512-LABEL: bitcast_v8i16_to_v2i4: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: vpmovw2m %xmm0, %k0 | ; AVX512-NEXT: vpmovw2m %xmm0, %k0 | ||||
; AVX512-NEXT: kmovd %k0, %ecx | ; AVX512-NEXT: kmovd %k0, %eax | ||||
; AVX512-NEXT: movzbl %cl, %eax | ; AVX512-NEXT: movl %eax, %ecx | ||||
; AVX512-NEXT: shrl $4, %eax | ; AVX512-NEXT: shrb $4, %cl | ||||
; AVX512-NEXT: andl $15, %ecx | ; AVX512-NEXT: andb $15, %al | ||||
; AVX512-NEXT: addb %cl, %al | ; AVX512-NEXT: addb %cl, %al | ||||
; AVX512-NEXT: # kill: def $al killed $al killed $eax | ; AVX512-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
%1 = icmp slt <8 x i16> %a0, zeroinitializer | %1 = icmp slt <8 x i16> %a0, zeroinitializer | ||||
%2 = bitcast <8 x i1> %1 to <2 x i4> | %2 = bitcast <8 x i1> %1 to <2 x i4> | ||||
%3 = extractelement <2 x i4> %2, i32 0 | %3 = extractelement <2 x i4> %2, i32 0 | ||||
%4 = extractelement <2 x i4> %2, i32 1 | %4 = extractelement <2 x i4> %2, i32 1 | ||||
%5 = add i4 %3, %4 | %5 = add i4 %3, %4 | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
; | ; | ||||
define i2 @bitcast_v4i64_to_v2i2(<4 x i64> %a0) nounwind { | define i2 @bitcast_v4i64_to_v2i2(<4 x i64> %a0) nounwind { | ||||
; SSE2-SSSE3-LABEL: bitcast_v4i64_to_v2i2: | ; SSE2-SSSE3-LABEL: bitcast_v4i64_to_v2i2: | ||||
; SSE2-SSSE3: # %bb.0: | ; SSE2-SSSE3: # %bb.0: | ||||
; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax | ; SSE2-SSSE3-NEXT: movmskps %xmm0, %eax | ||||
; SSE2-SSSE3-NEXT: movl %eax, %ecx | ; SSE2-SSSE3-NEXT: movl %eax, %ecx | ||||
; SSE2-SSSE3-NEXT: shrl $2, %ecx | ; SSE2-SSSE3-NEXT: shrb $2, %cl | ||||
; SSE2-SSSE3-NEXT: movq %rcx, %xmm0 | ; SSE2-SSSE3-NEXT: movzbl %cl, %ecx | ||||
; SSE2-SSSE3-NEXT: andl $3, %eax | ; SSE2-SSSE3-NEXT: andb $3, %al | ||||
; SSE2-SSSE3-NEXT: movq %rax, %xmm1 | ; SSE2-SSSE3-NEXT: movzbl %al, %eax | ||||
; SSE2-SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | ; SSE2-SSSE3-NEXT: movd %eax, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) | ; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | |||||
; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: retq | ; SSE2-SSSE3-NEXT: retq | ||||
; | ; | ||||
; AVX12-LABEL: bitcast_v4i64_to_v2i2: | ; AVX12-LABEL: bitcast_v4i64_to_v2i2: | ||||
; AVX12: # %bb.0: | ; AVX12: # %bb.0: | ||||
; AVX12-NEXT: vmovmskpd %ymm0, %ecx | ; AVX12-NEXT: vmovmskpd %ymm0, %eax | ||||
; AVX12-NEXT: movl %ecx, %eax | ; AVX12-NEXT: movl %eax, %ecx | ||||
; AVX12-NEXT: shrl $2, %eax | ; AVX12-NEXT: shrb $2, %cl | ||||
; AVX12-NEXT: andl $3, %ecx | ; AVX12-NEXT: andb $3, %al | ||||
; AVX12-NEXT: addb %cl, %al | ; AVX12-NEXT: addb %cl, %al | ||||
; AVX12-NEXT: # kill: def $al killed $al killed $eax | ; AVX12-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX12-NEXT: vzeroupper | ; AVX12-NEXT: vzeroupper | ||||
; AVX12-NEXT: retq | ; AVX12-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: bitcast_v4i64_to_v2i2: | ; AVX512-LABEL: bitcast_v4i64_to_v2i2: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ||||
; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %k0 | ; AVX512-NEXT: vpcmpgtq %ymm0, %ymm1, %k0 | ||||
; AVX512-NEXT: kmovd %k0, %ecx | ; AVX512-NEXT: kmovd %k0, %eax | ||||
; AVX512-NEXT: movzbl %cl, %eax | ; AVX512-NEXT: movl %eax, %ecx | ||||
; AVX512-NEXT: shrl $2, %eax | ; AVX512-NEXT: shrb $2, %cl | ||||
; AVX512-NEXT: andl $3, %eax | ; AVX512-NEXT: andb $3, %al | ||||
; AVX512-NEXT: andl $3, %ecx | |||||
; AVX512-NEXT: addb %cl, %al | ; AVX512-NEXT: addb %cl, %al | ||||
; AVX512-NEXT: # kill: def $al killed $al killed $eax | ; AVX512-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX512-NEXT: vzeroupper | ; AVX512-NEXT: vzeroupper | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
%1 = icmp slt <4 x i64> %a0, zeroinitializer | %1 = icmp slt <4 x i64> %a0, zeroinitializer | ||||
%2 = bitcast <4 x i1> %1 to <2 x i2> | %2 = bitcast <4 x i1> %1 to <2 x i2> | ||||
%3 = extractelement <2 x i2> %2, i32 0 | %3 = extractelement <2 x i2> %2, i32 0 | ||||
%4 = extractelement <2 x i2> %2, i32 1 | %4 = extractelement <2 x i2> %2, i32 1 | ||||
%5 = add i2 %3, %4 | %5 = add i2 %3, %4 | ||||
ret i2 %5 | ret i2 %5 | ||||
} | } | ||||
define i4 @bitcast_v8i32_to_v2i4(<8 x i32> %a0) nounwind { | define i4 @bitcast_v8i32_to_v2i4(<8 x i32> %a0) nounwind { | ||||
; SSE2-SSSE3-LABEL: bitcast_v8i32_to_v2i4: | ; SSE2-SSSE3-LABEL: bitcast_v8i32_to_v2i4: | ||||
; SSE2-SSSE3: # %bb.0: | ; SSE2-SSSE3: # %bb.0: | ||||
; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ||||
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ||||
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ||||
; SSE2-SSSE3-NEXT: movzbl %al, %ecx | ; SSE2-SSSE3-NEXT: movl %eax, %ecx | ||||
; SSE2-SSSE3-NEXT: shrl $4, %ecx | ; SSE2-SSSE3-NEXT: shrb $4, %cl | ||||
; SSE2-SSSE3-NEXT: movq %rcx, %xmm0 | ; SSE2-SSSE3-NEXT: movzbl %cl, %ecx | ||||
; SSE2-SSSE3-NEXT: andl $15, %eax | ; SSE2-SSSE3-NEXT: andb $15, %al | ||||
; SSE2-SSSE3-NEXT: movq %rax, %xmm1 | ; SSE2-SSSE3-NEXT: movzbl %al, %eax | ||||
; SSE2-SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | ; SSE2-SSSE3-NEXT: movd %eax, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) | ; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | |||||
; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: retq | ; SSE2-SSSE3-NEXT: retq | ||||
; | ; | ||||
; AVX12-LABEL: bitcast_v8i32_to_v2i4: | ; AVX12-LABEL: bitcast_v8i32_to_v2i4: | ||||
; AVX12: # %bb.0: | ; AVX12: # %bb.0: | ||||
; AVX12-NEXT: vmovmskps %ymm0, %ecx | ; AVX12-NEXT: vmovmskps %ymm0, %eax | ||||
; AVX12-NEXT: movl %ecx, %eax | ; AVX12-NEXT: movl %eax, %ecx | ||||
; AVX12-NEXT: shrl $4, %eax | ; AVX12-NEXT: shrb $4, %cl | ||||
; AVX12-NEXT: andl $15, %ecx | ; AVX12-NEXT: andb $15, %al | ||||
; AVX12-NEXT: addb %cl, %al | ; AVX12-NEXT: addb %cl, %al | ||||
; AVX12-NEXT: # kill: def $al killed $al killed $eax | ; AVX12-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX12-NEXT: vzeroupper | ; AVX12-NEXT: vzeroupper | ||||
; AVX12-NEXT: retq | ; AVX12-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: bitcast_v8i32_to_v2i4: | ; AVX512-LABEL: bitcast_v8i32_to_v2i4: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ||||
; AVX512-NEXT: vpcmpgtd %ymm0, %ymm1, %k0 | ; AVX512-NEXT: vpcmpgtd %ymm0, %ymm1, %k0 | ||||
; AVX512-NEXT: kmovd %k0, %ecx | ; AVX512-NEXT: kmovd %k0, %eax | ||||
; AVX512-NEXT: movzbl %cl, %eax | ; AVX512-NEXT: movl %eax, %ecx | ||||
; AVX512-NEXT: shrl $4, %eax | ; AVX512-NEXT: shrb $4, %cl | ||||
; AVX512-NEXT: andl $15, %ecx | ; AVX512-NEXT: andb $15, %al | ||||
; AVX512-NEXT: addb %cl, %al | ; AVX512-NEXT: addb %cl, %al | ||||
; AVX512-NEXT: # kill: def $al killed $al killed $eax | ; AVX512-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX512-NEXT: vzeroupper | ; AVX512-NEXT: vzeroupper | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
%1 = icmp slt <8 x i32> %a0, zeroinitializer | %1 = icmp slt <8 x i32> %a0, zeroinitializer | ||||
%2 = bitcast <8 x i1> %1 to <2 x i4> | %2 = bitcast <8 x i1> %1 to <2 x i4> | ||||
%3 = extractelement <2 x i4> %2, i32 0 | %3 = extractelement <2 x i4> %2, i32 0 | ||||
%4 = extractelement <2 x i4> %2, i32 1 | %4 = extractelement <2 x i4> %2, i32 1 | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | |||||
define i4 @bitcast_v8i64_to_v2i4(<8 x i64> %a0) nounwind { | define i4 @bitcast_v8i64_to_v2i4(<8 x i64> %a0) nounwind { | ||||
; SSE2-SSSE3-LABEL: bitcast_v8i64_to_v2i4: | ; SSE2-SSSE3-LABEL: bitcast_v8i64_to_v2i4: | ||||
; SSE2-SSSE3: # %bb.0: | ; SSE2-SSSE3: # %bb.0: | ||||
; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2 | ; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2 | ||||
; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0 | ||||
; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm0 | ; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm0 | ||||
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0 | ||||
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax | ||||
; SSE2-SSSE3-NEXT: movzbl %al, %ecx | ; SSE2-SSSE3-NEXT: movl %eax, %ecx | ||||
; SSE2-SSSE3-NEXT: shrl $4, %ecx | ; SSE2-SSSE3-NEXT: shrb $4, %cl | ||||
; SSE2-SSSE3-NEXT: movq %rcx, %xmm0 | ; SSE2-SSSE3-NEXT: movzbl %cl, %ecx | ||||
; SSE2-SSSE3-NEXT: andl $15, %eax | ; SSE2-SSSE3-NEXT: andb $15, %al | ||||
; SSE2-SSSE3-NEXT: movq %rax, %xmm1 | ; SSE2-SSSE3-NEXT: movzbl %al, %eax | ||||
; SSE2-SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | ; SSE2-SSSE3-NEXT: movd %eax, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) | ; SSE2-SSSE3-NEXT: pinsrw $4, %ecx, %xmm0 | ||||
; SSE2-SSSE3-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) | |||||
; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al | ||||
; SSE2-SSSE3-NEXT: retq | ; SSE2-SSSE3-NEXT: retq | ||||
; | ; | ||||
; AVX1-LABEL: bitcast_v8i64_to_v2i4: | ; AVX1-LABEL: bitcast_v8i64_to_v2i4: | ||||
; AVX1: # %bb.0: | ; AVX1: # %bb.0: | ||||
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 | ||||
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 | ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 | ||||
; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 | ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 | ||||
; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0 | ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0 | ||||
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 | ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 | ||||
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 | ||||
; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 | ; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 | ||||
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | ||||
; AVX1-NEXT: vmovmskps %ymm0, %ecx | ; AVX1-NEXT: vmovmskps %ymm0, %eax | ||||
; AVX1-NEXT: movl %ecx, %eax | ; AVX1-NEXT: movl %eax, %ecx | ||||
; AVX1-NEXT: shrl $4, %eax | ; AVX1-NEXT: shrb $4, %cl | ||||
; AVX1-NEXT: andl $15, %ecx | ; AVX1-NEXT: andb $15, %al | ||||
; AVX1-NEXT: addb %cl, %al | ; AVX1-NEXT: addb %cl, %al | ||||
; AVX1-NEXT: # kill: def $al killed $al killed $eax | ; AVX1-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX1-NEXT: vzeroupper | ; AVX1-NEXT: vzeroupper | ||||
; AVX1-NEXT: retq | ; AVX1-NEXT: retq | ||||
; | ; | ||||
; AVX2-LABEL: bitcast_v8i64_to_v2i4: | ; AVX2-LABEL: bitcast_v8i64_to_v2i4: | ||||
; AVX2: # %bb.0: | ; AVX2: # %bb.0: | ||||
; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 | ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 | ||||
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] | ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] | ||||
; AVX2-NEXT: vmovmskps %ymm0, %ecx | ; AVX2-NEXT: vmovmskps %ymm0, %eax | ||||
; AVX2-NEXT: movl %ecx, %eax | ; AVX2-NEXT: movl %eax, %ecx | ||||
; AVX2-NEXT: shrl $4, %eax | ; AVX2-NEXT: shrb $4, %cl | ||||
; AVX2-NEXT: andl $15, %ecx | ; AVX2-NEXT: andb $15, %al | ||||
; AVX2-NEXT: addb %cl, %al | ; AVX2-NEXT: addb %cl, %al | ||||
; AVX2-NEXT: # kill: def $al killed $al killed $eax | ; AVX2-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX2-NEXT: vzeroupper | ; AVX2-NEXT: vzeroupper | ||||
; AVX2-NEXT: retq | ; AVX2-NEXT: retq | ||||
; | ; | ||||
; AVX512-LABEL: bitcast_v8i64_to_v2i4: | ; AVX512-LABEL: bitcast_v8i64_to_v2i4: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 | ||||
; AVX512-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 | ; AVX512-NEXT: vpcmpgtq %zmm0, %zmm1, %k0 | ||||
; AVX512-NEXT: kmovd %k0, %ecx | ; AVX512-NEXT: kmovd %k0, %eax | ||||
; AVX512-NEXT: movzbl %cl, %eax | ; AVX512-NEXT: movl %eax, %ecx | ||||
; AVX512-NEXT: shrl $4, %eax | ; AVX512-NEXT: shrb $4, %cl | ||||
; AVX512-NEXT: andl $15, %ecx | ; AVX512-NEXT: andb $15, %al | ||||
; AVX512-NEXT: addb %cl, %al | ; AVX512-NEXT: addb %cl, %al | ||||
; AVX512-NEXT: # kill: def $al killed $al killed $eax | ; AVX512-NEXT: # kill: def $al killed $al killed $eax | ||||
; AVX512-NEXT: vzeroupper | ; AVX512-NEXT: vzeroupper | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
%1 = icmp slt <8 x i64> %a0, zeroinitializer | %1 = icmp slt <8 x i64> %a0, zeroinitializer | ||||
%2 = bitcast <8 x i1> %1 to <2 x i4> | %2 = bitcast <8 x i1> %1 to <2 x i4> | ||||
%3 = extractelement <2 x i4> %2, i32 0 | %3 = extractelement <2 x i4> %2, i32 0 | ||||
%4 = extractelement <2 x i4> %2, i32 1 | %4 = extractelement <2 x i4> %2, i32 1 | ||||
▲ Show 20 Lines • Show All 277 Lines • Show Last 20 Lines |