Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/X86/avx512-extract-subvector-load-store.ll
Show First 20 Lines • Show All 605 Lines • ▼ Show 20 Lines | ; AVX512NOTDQ-NEXT: retq | ||||
%d0 = load <2 x i1>, <2 x i1>* %a0 | %d0 = load <2 x i1>, <2 x i1>* %a0 | ||||
%d1 = shufflevector <2 x i1> %d0,<2 x i1> undef,<1 x i32><i32 1> | %d1 = shufflevector <2 x i1> %d0,<2 x i1> undef,<1 x i32><i32 1> | ||||
store <1 x i1> %d1, <1 x i1>* %a1 | store <1 x i1> %d1, <1 x i1>* %a1 | ||||
ret void | ret void | ||||
} | } | ||||
define void @load_v3i1_broadcast_1_v1i1_store(<3 x i1>* %a0,<1 x i1>* %a1) { | define void @load_v3i1_broadcast_1_v1i1_store(<3 x i1>* %a0,<1 x i1>* %a1) { | ||||
; AVX512-LABEL: load_v3i1_broadcast_1_v1i1_store: | ; AVX512-LABEL: load_v3i1_broadcast_1_v1i1_store: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: movzbl (%rdi), %eax | ; AVX512-NEXT: movb (%rdi), %al | ||||
; AVX512-NEXT: shrb %al | |||||
; AVX512-NEXT: xorl %ecx, %ecx | ; AVX512-NEXT: xorl %ecx, %ecx | ||||
; AVX512-NEXT: btl $1, %eax | ; AVX512-NEXT: testb $1, %al | ||||
; AVX512-NEXT: movl $255, %eax | ; AVX512-NEXT: movl $255, %eax | ||||
; AVX512-NEXT: cmovael %ecx, %eax | ; AVX512-NEXT: cmovel %ecx, %eax | ||||
; AVX512-NEXT: kmovd %eax, %k0 | ; AVX512-NEXT: kmovd %eax, %k0 | ||||
; AVX512-NEXT: kshiftrb $1, %k0, %k0 | ; AVX512-NEXT: kshiftrb $1, %k0, %k0 | ||||
; AVX512-NEXT: kmovb %k0, (%rsi) | ; AVX512-NEXT: kmovb %k0, (%rsi) | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
; | ; | ||||
; AVX512NOTDQ-LABEL: load_v3i1_broadcast_1_v1i1_store: | ; AVX512NOTDQ-LABEL: load_v3i1_broadcast_1_v1i1_store: | ||||
; AVX512NOTDQ: # %bb.0: | ; AVX512NOTDQ: # %bb.0: | ||||
; AVX512NOTDQ-NEXT: movzbl (%rdi), %eax | ; AVX512NOTDQ-NEXT: movb (%rdi), %al | ||||
; AVX512NOTDQ-NEXT: shrb %al | |||||
; AVX512NOTDQ-NEXT: xorl %ecx, %ecx | ; AVX512NOTDQ-NEXT: xorl %ecx, %ecx | ||||
; AVX512NOTDQ-NEXT: btl $1, %eax | ; AVX512NOTDQ-NEXT: testb $1, %al | ||||
; AVX512NOTDQ-NEXT: movl $255, %eax | ; AVX512NOTDQ-NEXT: movl $255, %eax | ||||
; AVX512NOTDQ-NEXT: cmovael %ecx, %eax | ; AVX512NOTDQ-NEXT: cmovel %ecx, %eax | ||||
; AVX512NOTDQ-NEXT: kmovd %eax, %k0 | ; AVX512NOTDQ-NEXT: kmovd %eax, %k0 | ||||
; AVX512NOTDQ-NEXT: kshiftrw $1, %k0, %k0 | ; AVX512NOTDQ-NEXT: kshiftrw $1, %k0, %k0 | ||||
; AVX512NOTDQ-NEXT: kmovd %k0, %eax | ; AVX512NOTDQ-NEXT: kmovd %k0, %eax | ||||
; AVX512NOTDQ-NEXT: movb %al, (%rsi) | ; AVX512NOTDQ-NEXT: movb %al, (%rsi) | ||||
; AVX512NOTDQ-NEXT: retq | ; AVX512NOTDQ-NEXT: retq | ||||
%d0 = load <3 x i1>, <3 x i1>* %a0 | %d0 = load <3 x i1>, <3 x i1>* %a0 | ||||
%d1 = shufflevector <3 x i1> %d0,<3 x i1> undef,<1 x i32><i32 1> | %d1 = shufflevector <3 x i1> %d0,<3 x i1> undef,<1 x i32><i32 1> | ||||
store <1 x i1> %d1, <1 x i1>* %a1 | store <1 x i1> %d1, <1 x i1>* %a1 | ||||
ret void | ret void | ||||
} | } | ||||
define void @load_v3i1_broadcast_2_v1i1_store(<3 x i1>* %a0,<1 x i1>* %a1) { | define void @load_v3i1_broadcast_2_v1i1_store(<3 x i1>* %a0,<1 x i1>* %a1) { | ||||
; AVX512-LABEL: load_v3i1_broadcast_2_v1i1_store: | ; AVX512-LABEL: load_v3i1_broadcast_2_v1i1_store: | ||||
; AVX512: # %bb.0: | ; AVX512: # %bb.0: | ||||
; AVX512-NEXT: movzbl (%rdi), %eax | ; AVX512-NEXT: xorl %eax, %eax | ||||
; AVX512-NEXT: xorl %ecx, %ecx | ; AVX512-NEXT: testb $4, (%rdi) | ||||
; AVX512-NEXT: btl $2, %eax | ; AVX512-NEXT: movl $255, %ecx | ||||
; AVX512-NEXT: movl $255, %eax | ; AVX512-NEXT: cmovel %eax, %ecx | ||||
; AVX512-NEXT: cmovael %ecx, %eax | ; AVX512-NEXT: kmovd %ecx, %k0 | ||||
; AVX512-NEXT: kmovd %eax, %k0 | |||||
; AVX512-NEXT: kshiftrb $2, %k0, %k0 | ; AVX512-NEXT: kshiftrb $2, %k0, %k0 | ||||
; AVX512-NEXT: kmovb %k0, (%rsi) | ; AVX512-NEXT: kmovb %k0, (%rsi) | ||||
; AVX512-NEXT: retq | ; AVX512-NEXT: retq | ||||
; | ; | ||||
; AVX512NOTDQ-LABEL: load_v3i1_broadcast_2_v1i1_store: | ; AVX512NOTDQ-LABEL: load_v3i1_broadcast_2_v1i1_store: | ||||
; AVX512NOTDQ: # %bb.0: | ; AVX512NOTDQ: # %bb.0: | ||||
; AVX512NOTDQ-NEXT: movzbl (%rdi), %eax | ; AVX512NOTDQ-NEXT: xorl %eax, %eax | ||||
; AVX512NOTDQ-NEXT: xorl %ecx, %ecx | ; AVX512NOTDQ-NEXT: testb $4, (%rdi) | ||||
; AVX512NOTDQ-NEXT: btl $2, %eax | ; AVX512NOTDQ-NEXT: movl $255, %ecx | ||||
; AVX512NOTDQ-NEXT: movl $255, %eax | ; AVX512NOTDQ-NEXT: cmovel %eax, %ecx | ||||
; AVX512NOTDQ-NEXT: cmovael %ecx, %eax | ; AVX512NOTDQ-NEXT: kmovd %ecx, %k0 | ||||
; AVX512NOTDQ-NEXT: kmovd %eax, %k0 | |||||
; AVX512NOTDQ-NEXT: kshiftrw $2, %k0, %k0 | ; AVX512NOTDQ-NEXT: kshiftrw $2, %k0, %k0 | ||||
; AVX512NOTDQ-NEXT: kmovd %k0, %eax | ; AVX512NOTDQ-NEXT: kmovd %k0, %eax | ||||
; AVX512NOTDQ-NEXT: movb %al, (%rsi) | ; AVX512NOTDQ-NEXT: movb %al, (%rsi) | ||||
; AVX512NOTDQ-NEXT: retq | ; AVX512NOTDQ-NEXT: retq | ||||
%d0 = load <3 x i1>, <3 x i1>* %a0 | %d0 = load <3 x i1>, <3 x i1>* %a0 | ||||
%d1 = shufflevector <3 x i1> %d0,<3 x i1> undef,<1 x i32><i32 2> | %d1 = shufflevector <3 x i1> %d0,<3 x i1> undef,<1 x i32><i32 2> | ||||
store <1 x i1> %d1, <1 x i1>* %a1 | store <1 x i1> %d1, <1 x i1>* %a1 | ||||
ret void | ret void | ||||
▲ Show 20 Lines • Show All 746 Lines • Show Last 20 Lines |