| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -mtriple=i686-linux-gnu -mattr=avx512bf16,avx512fp16,avx512vl | FileCheck %s --check-prefixes=X86 | |
| ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,SSE2 | |
| ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avx512bf16,avx512vl | FileCheck %s --check-prefixes=X64,AVX,AVX512,AVX512BF16 | |
| ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avx512bf16,avx512fp16,avx512vl | FileCheck %s --check-prefixes=X64,AVX,AVX512,AVX512FP16 | |
| ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avxneconvert,f16c | FileCheck %s --check-prefixes=X64,AVX,AVXNC | |
| ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avx512bw,avx512vl | FileCheck %s --check-prefixes=AVX512BW | |
| define void @add(ptr %pa, ptr %pb, ptr %pc) nounwind { | |
| ; X86-LABEL: add: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx | |
| ; X86-NEXT: vmovw (%edx), %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovw (%ecx), %xmm1 | |
| ; X86-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; X86-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: vpextrw $0, %xmm0, (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: movq %rdx, %rbx | |
| ; SSE2-NEXT: movzwl (%rsi), %eax | |
| ; SSE2-NEXT: shll $16, %eax | |
| ; SSE2-NEXT: movd %eax, %xmm1 | |
| ; SSE2-NEXT: movzwl (%rdi), %eax | |
| ; SSE2-NEXT: shll $16, %eax | |
| ; SSE2-NEXT: movd %eax, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movw %ax, (%rbx) | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: add: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: movzwl (%rsi), %eax | |
| ; AVX512BF16-NEXT: shll $16, %eax | |
| ; AVX512BF16-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BF16-NEXT: movzwl (%rdi), %eax | |
| ; AVX512BF16-NEXT: shll $16, %eax | |
| ; AVX512BF16-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BF16-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, (%rdx) | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: add: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vmovw (%rsi), %xmm0 | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vmovw (%rdi), %xmm1 | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512FP16-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512FP16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vpextrw $0, %xmm0, (%rdx) | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: movzwl (%rsi), %eax | |
| ; AVXNC-NEXT: shll $16, %eax | |
| ; AVXNC-NEXT: vmovd %eax, %xmm0 | |
| ; AVXNC-NEXT: movzwl (%rdi), %eax | |
| ; AVXNC-NEXT: shll $16, %eax | |
| ; AVXNC-NEXT: vmovd %eax, %xmm1 | |
| ; AVXNC-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, (%rdx) | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rbx | |
| ; AVX512BW-NEXT: movq %rdx, %rbx | |
| ; AVX512BW-NEXT: movzwl (%rsi), %eax | |
| ; AVX512BW-NEXT: shll $16, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: movzwl (%rdi), %eax | |
| ; AVX512BW-NEXT: shll $16, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rbx) | |
| ; AVX512BW-NEXT: popq %rbx | |
| ; AVX512BW-NEXT: retq | |
| %a = load bfloat, ptr %pa | |
| %b = load bfloat, ptr %pb | |
| %add = fadd bfloat %a, %b | |
| store bfloat %add, ptr %pc | |
| ret void | |
| } | |
| define bfloat @add2(bfloat %a, bfloat %b) nounwind { | |
| ; X86-LABEL: add2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovw {{[0-9]+}}(%esp), %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovw {{[0-9]+}}(%esp), %xmm1 | |
| ; X86-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; X86-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rax | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: popq %rax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: add2: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vaddss %xmm1, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add2: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vaddss %xmm1, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rax | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vaddss %xmm1, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: popq %rax | |
| ; AVX512BW-NEXT: retq | |
| %add = fadd bfloat %a, %b | |
| ret bfloat %add | |
| } | |
| define void @add_double(ptr %pa, ptr %pb, ptr %pc) nounwind { | |
| ; X86-LABEL: add_double: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: pushl %edi | |
| ; X86-NEXT: pushl %esi | |
| ; X86-NEXT: subl $36, %esp | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero | |
| ; X86-NEXT: vmovsd %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; X86-NEXT: vmovq %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vpslld $16, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Folded Reload | |
| ; X86-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovsd %xmm0, (%esi) | |
| ; X86-NEXT: addl $36, %esp | |
| ; X86-NEXT: popl %esi | |
| ; X86-NEXT: popl %edi | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add_double: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $24, %rsp | |
| ; SSE2-NEXT: movq %rdx, %rbx | |
| ; SSE2-NEXT: movq %rsi, %r14 | |
| ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: cvtss2sd %xmm0, %xmm0 | |
| ; SSE2-NEXT: movsd %xmm0, (%rbx) | |
| ; SSE2-NEXT: addq $24, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: add_double: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: pushq %r14 | |
| ; AVX512-NEXT: pushq %rbx | |
| ; AVX512-NEXT: subq $24, %rsp | |
| ; AVX512-NEXT: movq %rdx, %rbx | |
| ; AVX512-NEXT: movq %rsi, %r14 | |
| ; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX512-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX512-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpslld $16, (%rsp), %xmm1 # 16-byte Folded Reload | |
| ; AVX512-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vmovsd %xmm0, (%rbx) | |
| ; AVX512-NEXT: addq $24, %rsp | |
| ; AVX512-NEXT: popq %rbx | |
| ; AVX512-NEXT: popq %r14 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add_double: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: pushq %r14 | |
| ; AVXNC-NEXT: pushq %rbx | |
| ; AVXNC-NEXT: subq $24, %rsp | |
| ; AVXNC-NEXT: movq %rdx, %rbx | |
| ; AVXNC-NEXT: movq %rsi, %r14 | |
| ; AVXNC-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVXNC-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload | |
| ; AVXNC-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vmovsd %xmm0, (%rbx) | |
| ; AVXNC-NEXT: addq $24, %rsp | |
| ; AVXNC-NEXT: popq %rbx | |
| ; AVXNC-NEXT: popq %r14 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add_double: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %r14 | |
| ; AVX512BW-NEXT: pushq %rbx | |
| ; AVX512BW-NEXT: subq $24, %rsp | |
| ; AVX512BW-NEXT: movq %rdx, %rbx | |
| ; AVX512BW-NEXT: movq %rsi, %r14 | |
| ; AVX512BW-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, (%rsp), %xmm1 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovsd %xmm0, (%rbx) | |
| ; AVX512BW-NEXT: addq $24, %rsp | |
| ; AVX512BW-NEXT: popq %rbx | |
| ; AVX512BW-NEXT: popq %r14 | |
| ; AVX512BW-NEXT: retq | |
| %la = load double, ptr %pa | |
| %a = fptrunc double %la to bfloat | |
| %lb = load double, ptr %pb | |
| %b = fptrunc double %lb to bfloat | |
| %add = fadd bfloat %a, %b | |
| %dadd = fpext bfloat %add to double | |
| store double %dadd, ptr %pc | |
| ret void | |
| } | |
| define double @add_double2(double %da, double %db) nounwind { | |
| ; X86-LABEL: add_double2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $44, %esp | |
| ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero | |
| ; X86-NEXT: vmovsd %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; X86-NEXT: vmovq %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vpslld $16, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Folded Reload | |
| ; X86-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovsd %xmm0, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fldl {{[0-9]+}}(%esp) | |
| ; X86-NEXT: addl $44, %esp | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add_double2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: subq $40, %rsp | |
| ; SSE2-NEXT: movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload | |
| ; SSE2-NEXT: # xmm0 = mem[0],zero | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: cvtss2sd %xmm0, %xmm0 | |
| ; SSE2-NEXT: addq $40, %rsp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: add_double2: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: subq $40, %rsp | |
| ; AVX512-NEXT: vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; AVX512-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512-NEXT: vmovq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload | |
| ; AVX512-NEXT: # xmm0 = mem[0],zero | |
| ; AVX512-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpslld $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload | |
| ; AVX512-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVX512-NEXT: addq $40, %rsp | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add_double2: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: subq $40, %rsp | |
| ; AVXNC-NEXT: vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vmovq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload | |
| ; AVXNC-NEXT: # xmm0 = mem[0],zero | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVXNC-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: addq $40, %rsp | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add_double2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: subq $40, %rsp | |
| ; AVX512BW-NEXT: vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm0 = mem[0],zero | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: addq $40, %rsp | |
| ; AVX512BW-NEXT: retq | |
| %a = fptrunc double %da to bfloat | |
| %b = fptrunc double %db to bfloat | |
| %add = fadd bfloat %a, %b | |
| %dadd = fpext bfloat %add to double | |
| ret double %dadd | |
| } | |
| define void @add_constant(ptr %pa, ptr %pc) nounwind { | |
| ; X86-LABEL: add_constant: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: vmovw (%ecx), %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: vpextrw $0, %xmm0, (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add_constant: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: movq %rsi, %rbx | |
| ; SSE2-NEXT: movzwl (%rdi), %eax | |
| ; SSE2-NEXT: shll $16, %eax | |
| ; SSE2-NEXT: movd %eax, %xmm0 | |
| ; SSE2-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movw %ax, (%rbx) | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: add_constant: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: movzwl (%rdi), %eax | |
| ; AVX512BF16-NEXT: shll $16, %eax | |
| ; AVX512BF16-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BF16-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, (%rsi) | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: add_constant: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vmovw (%rdi), %xmm0 | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vpextrw $0, %xmm0, (%rsi) | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add_constant: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: movzwl (%rdi), %eax | |
| ; AVXNC-NEXT: shll $16, %eax | |
| ; AVXNC-NEXT: vmovd %eax, %xmm0 | |
| ; AVXNC-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, (%rsi) | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add_constant: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rbx | |
| ; AVX512BW-NEXT: movq %rsi, %rbx | |
| ; AVX512BW-NEXT: movzwl (%rdi), %eax | |
| ; AVX512BW-NEXT: shll $16, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rbx) | |
| ; AVX512BW-NEXT: popq %rbx | |
| ; AVX512BW-NEXT: retq | |
| %a = load bfloat, ptr %pa | |
| %add = fadd bfloat %a, 1.0 | |
| store bfloat %add, ptr %pc | |
| ret void | |
| } | |
| define bfloat @add_constant2(bfloat %a) nounwind { | |
| ; X86-LABEL: add_constant2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovw {{[0-9]+}}(%esp), %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: add_constant2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rax | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: popq %rax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: add_constant2: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: add_constant2: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: add_constant2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rax | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: popq %rax | |
| ; AVX512BW-NEXT: retq | |
| %add = fadd bfloat %a, 1.0 | |
| ret bfloat %add | |
| } | |
| define void @store_constant(ptr %pc) nounwind { | |
| ; X86-LABEL: store_constant: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movw $16256, (%eax) # imm = 0x3F80 | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: store_constant: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movw $16256, (%rdi) # imm = 0x3F80 | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: store_constant: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: movw $16256, (%rdi) # imm = 0x3F80 | |
| ; AVX512BW-NEXT: retq | |
| store bfloat 1.0, ptr %pc | |
| ret void | |
| } | |
| define void @fold_ext_trunc(ptr %pa, ptr %pc) nounwind { | |
| ; X86-LABEL: fold_ext_trunc: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: movzwl (%ecx), %ecx | |
| ; X86-NEXT: movw %cx, (%eax) | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: fold_ext_trunc: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movzwl (%rdi), %eax | |
| ; X64-NEXT: movw %ax, (%rsi) | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fold_ext_trunc: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: movzwl (%rdi), %eax | |
| ; AVX512BW-NEXT: movw %ax, (%rsi) | |
| ; AVX512BW-NEXT: retq | |
| %a = load bfloat, ptr %pa | |
| %ext = fpext bfloat %a to float | |
| %trunc = fptrunc float %ext to bfloat | |
| store bfloat %trunc, ptr %pc | |
| ret void | |
| } | |
| define bfloat @fold_ext_trunc2(bfloat %a) nounwind { | |
| ; X86-LABEL: fold_ext_trunc2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: fold_ext_trunc2: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fold_ext_trunc2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: retq | |
| %ext = fpext bfloat %a to float | |
| %trunc = fptrunc float %ext to bfloat | |
| ret bfloat %trunc | |
| } | |
| define bfloat @fold_from_half(half %a) nounwind { | |
| ; X86-LABEL: fold_from_half: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fold_from_half: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rax | |
| ; SSE2-NEXT: callq __extendhfsf2@PLT | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: popq %rax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: fold_from_half: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vcvtph2ps %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: fold_from_half: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fold_from_half: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vcvtph2ps %xmm0, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fold_from_half: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rax | |
| ; AVX512BW-NEXT: vcvtph2ps %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: popq %rax | |
| ; AVX512BW-NEXT: retq | |
| %ext = fpext half %a to float | |
| %trunc = fptrunc float %ext to bfloat | |
| ret bfloat %trunc | |
| } | |
| define half @fold_to_half(bfloat %a) nounwind { | |
| ; X86-LABEL: fold_to_half: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovw {{[0-9]+}}(%esp), %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fold_to_half: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rax | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfhf2@PLT | |
| ; SSE2-NEXT: popq %rax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: fold_to_half: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vcvtps2ph $4, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: fold_to_half: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fold_to_half: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vcvtps2ph $4, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fold_to_half: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vcvtps2ph $4, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %ext = fpext bfloat %a to float | |
| %trunc = fptrunc float %ext to half | |
| ret half %trunc | |
| } | |
| define bfloat @bitcast_from_half(half %a) nounwind { | |
| ; X86-LABEL: bitcast_from_half: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: bitcast_from_half: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: bitcast_from_half: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: retq | |
| %bc = bitcast half %a to bfloat | |
| ret bfloat %bc | |
| } | |
| define half @bitcast_to_half(bfloat %a) nounwind { | |
| ; X86-LABEL: bitcast_to_half: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: bitcast_to_half: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: bitcast_to_half: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: retq | |
| %bc = bitcast bfloat %a to half | |
| ret half %bc | |
| } | |
| define <8 x bfloat> @addv(<8 x bfloat> %a, <8 x bfloat> %b) nounwind { | |
| ; X86-LABEL: addv: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero | |
| ; X86-NEXT: vpslld $16, %ymm1, %ymm1 | |
| ; X86-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; X86-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; X86-NEXT: vaddps %ymm1, %ymm0, %ymm0 | |
| ; X86-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: addv: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r15 | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %r13 | |
| ; SSE2-NEXT: pushq %r12 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $104, %rsp | |
| ; SSE2-NEXT: movq %xmm0, %rcx | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movq %rcx, %rax | |
| ; SSE2-NEXT: shrq $48, %rax | |
| ; SSE2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; SSE2-NEXT: movq %xmm1, %rdx | |
| ; SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movq %rdx, %rax | |
| ; SSE2-NEXT: shrq $48, %rax | |
| ; SSE2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; SSE2-NEXT: shrq $32, %rcx | |
| ; SSE2-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; SSE2-NEXT: shrq $32, %rdx | |
| ; SSE2-NEXT: movq %rdx, (%rsp) # 8-byte Spill | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: movq %xmm0, %r13 | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movq %r13, %rbx | |
| ; SSE2-NEXT: shrq $48, %rbx | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] | |
| ; SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movq %xmm1, %rbp | |
| ; SSE2-NEXT: movq %rbp, %r15 | |
| ; SSE2-NEXT: shrq $48, %r15 | |
| ; SSE2-NEXT: shrq $32, %r13 | |
| ; SSE2-NEXT: shrq $32, %rbp | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r12d | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: psrld $16, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, %xmm1 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: psrld $16, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %r14d | |
| ; SSE2-NEXT: shll $16, %r14d | |
| ; SSE2-NEXT: orl %r12d, %r14d | |
| ; SSE2-NEXT: movd %ebp, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: movd %r13d, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebp | |
| ; SSE2-NEXT: movd %r15d, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: movd %ebx, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %r13d | |
| ; SSE2-NEXT: shll $16, %r13d | |
| ; SSE2-NEXT: orl %ebp, %r13d | |
| ; SSE2-NEXT: shlq $32, %r13 | |
| ; SSE2-NEXT: orq %r14, %r13 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: psrld $16, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, %xmm1 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: psrld $16, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: orl %ebp, %ebx | |
| ; SSE2-NEXT: movd (%rsp), %xmm1 # 4-byte Folded Reload | |
| ; SSE2-NEXT: # xmm1 = mem[0],zero,zero,zero | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload | |
| ; SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebp | |
| ; SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Folded Reload | |
| ; SSE2-NEXT: # xmm1 = mem[0],zero,zero,zero | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload | |
| ; SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: addss %xmm1, %xmm0 | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: shll $16, %eax | |
| ; SSE2-NEXT: orl %ebp, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %rbx, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movq %r13, %xmm1 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: addq $104, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r12 | |
| ; SSE2-NEXT: popq %r13 | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %r15 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: addv: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero | |
| ; AVX512-NEXT: vpslld $16, %ymm1, %ymm1 | |
| ; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX512-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX512-NEXT: vaddps %ymm1, %ymm0, %ymm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVX512-NEXT: vzeroupper | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: addv: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm1, %ymm1 | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: vaddps %ymm1, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: addv: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rbp | |
| ; AVX512BW-NEXT: pushq %r15 | |
| ; AVX512BW-NEXT: pushq %r14 | |
| ; AVX512BW-NEXT: pushq %r13 | |
| ; AVX512BW-NEXT: pushq %r12 | |
| ; AVX512BW-NEXT: pushq %rbx | |
| ; AVX512BW-NEXT: subq $40, %rsp | |
| ; AVX512BW-NEXT: vmovdqa %xmm1, (%rsp) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vpxor %xmm3, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0],xmm1[1],xmm3[2],xmm1[3],xmm3[4],xmm1[5],xmm3[6],xmm1[7] | |
| ; AVX512BW-NEXT: vpblendw {{.*#+}} xmm1 = xmm3[0],xmm0[1],xmm3[2],xmm0[3],xmm3[4],xmm0[5],xmm3[6],xmm0[7] | |
| ; AVX512BW-NEXT: vaddss %xmm2, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %eax | |
| ; AVX512BW-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | |
| ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vpunpckhwd (%rsp), %xmm1, %xmm0 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm0 = xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] | |
| ; AVX512BW-NEXT: vpunpckhwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm1 = xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %ebp | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $7, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $7, %xmm1, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r14d | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $6, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $6, %xmm1, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r15d | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $5, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $5, %xmm1, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r12d | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $3, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $3, %xmm1, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r13d | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $2, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $2, %xmm1, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %ebx | |
| ; AVX512BW-NEXT: vpslld $16, (%rsp), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: vpslld $16, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: vaddss %xmm0, %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpinsrw $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload | |
| ; AVX512BW-NEXT: vpinsrw $2, %ebx, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $3, %r13d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $4, %ebp, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $5, %r12d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $6, %r15d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $7, %r14d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: addq $40, %rsp | |
| ; AVX512BW-NEXT: popq %rbx | |
| ; AVX512BW-NEXT: popq %r12 | |
| ; AVX512BW-NEXT: popq %r13 | |
| ; AVX512BW-NEXT: popq %r14 | |
| ; AVX512BW-NEXT: popq %r15 | |
| ; AVX512BW-NEXT: popq %rbp | |
| ; AVX512BW-NEXT: retq | |
| %add = fadd <8 x bfloat> %a, %b | |
| ret <8 x bfloat> %add | |
| } | |
| define <2 x bfloat> @pr62997(bfloat %a, bfloat %b) { | |
| ; X86-LABEL: pr62997: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr62997: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: pr62997: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BF16-NEXT: vpinsrw $1, %eax, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: pr62997: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr62997: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVXNC-NEXT: vpinsrw $1, %eax, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr62997: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BW-NEXT: vpinsrw $1, %eax, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %1 = insertelement <2 x bfloat> undef, bfloat %a, i64 0 | |
| %2 = insertelement <2 x bfloat> %1, bfloat %b, i64 1 | |
| ret <2 x bfloat> %2 | |
| } | |
| define <32 x bfloat> @pr63017() { | |
| ; X86-LABEL: pr63017: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vxorps %xmm0, %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr63017: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: xorps %xmm0, %xmm0 | |
| ; SSE2-NEXT: xorps %xmm1, %xmm1 | |
| ; SSE2-NEXT: xorps %xmm2, %xmm2 | |
| ; SSE2-NEXT: xorps %xmm3, %xmm3 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: pr63017: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr63017: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vxorps %xmm0, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vxorps %xmm1, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr63017: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vxorps %xmm0, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| ret <32 x bfloat> zeroinitializer | |
| } | |
| define <32 x bfloat> @pr63017_2() nounwind { | |
| ; X86-LABEL: pr63017_2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpbroadcastw {{.*#+}} zmm0 = [-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0] | |
| ; X86-NEXT: vmovdqu16 (%eax), %zmm0 {%k1} | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr63017_2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: testb %al, %al | |
| ; SSE2-NEXT: jne .LBB16_1 | |
| ; SSE2-NEXT: # %bb.2: # %cond.load | |
| ; SSE2-NEXT: movzwl (%rax), %eax | |
| ; SSE2-NEXT: movd %eax, %xmm0 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: jmp .LBB16_3 | |
| ; SSE2-NEXT: .LBB16_1: | |
| ; SSE2-NEXT: movd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0] | |
| ; SSE2-NEXT: .LBB16_3: | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $88, %rsp | |
| ; SSE2-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | |
| ; SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | |
| ; SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] | |
| ; SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebx, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm0 | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload | |
| ; SSE2-NEXT: addq $88, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: pr63017_2: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vpbroadcastw {{.*#+}} zmm0 = [49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024] | |
| ; AVX512BF16-NEXT: vmovdqu16 (%rax), %zmm0 {%k1} | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: pr63017_2: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vpbroadcastw {{.*#+}} zmm0 = [-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0,-1.875E+0] | |
| ; AVX512FP16-NEXT: vmovdqu16 (%rax), %zmm0 {%k1} | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr63017_2: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vbroadcastss {{.*#+}} ymm0 = [49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024] | |
| ; AVXNC-NEXT: testb %al, %al | |
| ; AVXNC-NEXT: jne .LBB16_2 | |
| ; AVXNC-NEXT: # %bb.1: # %cond.load | |
| ; AVXNC-NEXT: vmovups (%rax), %ymm0 | |
| ; AVXNC-NEXT: .LBB16_2: | |
| ; AVXNC-NEXT: vmovaps %ymm0, %ymm1 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr63017_2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpbroadcastw {{.*#+}} zmm0 = [49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024] | |
| ; AVX512BW-NEXT: vmovdqu16 (%rax), %zmm0 {%k1} | |
| ; AVX512BW-NEXT: retq | |
| %1 = call <32 x bfloat> @llvm.masked.load.v32bf16.p0(ptr poison, i32 2, <32 x i1> poison, <32 x bfloat> <bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80, bfloat 0xRBF80>) | |
| ret <32 x bfloat> %1 | |
| } | |
| define <32 x bfloat> @pr62997_3(<32 x bfloat> %0, bfloat %1) { | |
| ; X86-LABEL: pr62997_3: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpinsrw $1, {{[0-9]+}}(%esp), %xmm0, %xmm1 | |
| ; X86-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr62997_3: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movq %xmm0, %rax | |
| ; SSE2-NEXT: movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000 | |
| ; SSE2-NEXT: andq %rax, %rcx | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: pextrw $0, %xmm4, %edx | |
| ; SSE2-NEXT: shll $16, %edx | |
| ; SSE2-NEXT: orl %eax, %edx | |
| ; SSE2-NEXT: orq %rcx, %rdx | |
| ; SSE2-NEXT: movq %rdx, %xmm4 | |
| ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1] | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: pr62997_3: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BF16-NEXT: vpinsrw $1, %eax, %xmm0, %xmm1 | |
| ; AVX512BF16-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: pr62997_3: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vmovw %xmm1, %eax | |
| ; AVX512FP16-NEXT: vpinsrw $1, %eax, %xmm0, %xmm1 | |
| ; AVX512FP16-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr62997_3: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpextrw $0, %xmm2, %eax | |
| ; AVXNC-NEXT: vpinsrw $1, %eax, %xmm0, %xmm2 | |
| ; AVXNC-NEXT: vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr62997_3: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BW-NEXT: vpinsrw $1, %eax, %xmm0, %xmm1 | |
| ; AVX512BW-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0 | |
| ; AVX512BW-NEXT: retq | |
| %3 = insertelement <32 x bfloat> %0, bfloat %1, i64 1 | |
| ret <32 x bfloat> %3 | |
| } | |
| declare <32 x bfloat> @llvm.masked.load.v32bf16.p0(ptr, i32, <32 x i1>, <32 x bfloat>) | |
| define <4 x float> @pr64460_1(<4 x bfloat> %a) { | |
| ; X86-LABEL: pr64460_1: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr64460_1: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pxor %xmm1, %xmm1 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; SSE2-NEXT: movdqa %xmm1, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: pr64460_1: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; AVX-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr64460_1: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; AVX512BW-NEXT: retq | |
| %b = fpext <4 x bfloat> %a to <4 x float> | |
| ret <4 x float> %b | |
| } | |
| define <8 x float> @pr64460_2(<8 x bfloat> %a) { | |
| ; X86-LABEL: pr64460_2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; X86-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr64460_2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pxor %xmm1, %xmm1 | |
| ; SSE2-NEXT: pxor %xmm2, %xmm2 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] | |
| ; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] | |
| ; SSE2-NEXT: movdqa %xmm2, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: pr64460_2: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr64460_2: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX512BW-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX512BW-NEXT: retq | |
| %b = fpext <8 x bfloat> %a to <8 x float> | |
| ret <8 x float> %b | |
| } | |
| define <16 x float> @pr64460_3(<16 x bfloat> %a) { | |
| ; X86-LABEL: pr64460_3: | |
| ; X86: # %bb.0: | |
| ; X86-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 | |
| ; X86-NEXT: vpslld $16, %zmm0, %zmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr64460_3: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pxor %xmm3, %xmm3 | |
| ; SSE2-NEXT: pxor %xmm5, %xmm5 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3] | |
| ; SSE2-NEXT: pxor %xmm4, %xmm4 | |
| ; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7] | |
| ; SSE2-NEXT: pxor %xmm2, %xmm2 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] | |
| ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7] | |
| ; SSE2-NEXT: movdqa %xmm5, %xmm0 | |
| ; SSE2-NEXT: movdqa %xmm4, %xmm1 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: pr64460_3: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-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 | |
| ; AVX512-NEXT: vpslld $16, %zmm0, %zmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr64460_3: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm1, %ymm2 | |
| ; AVXNC-NEXT: vextracti128 $1, %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm0, %ymm1 | |
| ; AVXNC-NEXT: vmovdqa %ymm2, %ymm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr64460_3: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-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 | |
| ; AVX512BW-NEXT: vpslld $16, %zmm0, %zmm0 | |
| ; AVX512BW-NEXT: retq | |
| %b = fpext <16 x bfloat> %a to <16 x float> | |
| ret <16 x float> %b | |
| } | |
| define <8 x double> @pr64460_4(<8 x bfloat> %a) { | |
| ; X86-LABEL: pr64460_4: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; X86-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; X86-NEXT: vcvtps2pd %ymm0, %zmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr64460_4: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pxor %xmm3, %xmm3 | |
| ; SSE2-NEXT: pxor %xmm1, %xmm1 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; SSE2-NEXT: cvtps2pd %xmm1, %xmm4 | |
| ; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] | |
| ; SSE2-NEXT: cvtps2pd %xmm3, %xmm2 | |
| ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] | |
| ; SSE2-NEXT: cvtps2pd %xmm0, %xmm1 | |
| ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3] | |
| ; SSE2-NEXT: cvtps2pd %xmm0, %xmm3 | |
| ; SSE2-NEXT: movaps %xmm4, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: pr64460_4: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX512-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX512-NEXT: vcvtps2pd %ymm0, %zmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr64460_4: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm0, %ymm1 | |
| ; AVXNC-NEXT: vcvtps2pd %xmm1, %ymm0 | |
| ; AVXNC-NEXT: vextracti128 $1, %ymm1, %xmm1 | |
| ; AVXNC-NEXT: vcvtps2pd %xmm1, %ymm1 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr64460_4: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX512BW-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX512BW-NEXT: vcvtps2pd %ymm0, %zmm0 | |
| ; AVX512BW-NEXT: retq | |
| %b = fpext <8 x bfloat> %a to <8 x double> | |
| ret <8 x double> %b | |
| } | |
| define <4 x bfloat> @fptrunc_v4f32(<4 x float> %a) nounwind { | |
| ; X86-LABEL: fptrunc_v4f32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; X86-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fptrunc_v4f32: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: subq $72, %rsp | |
| ; SSE2-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; SSE2-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] | |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] | |
| ; SSE2-NEXT: addq $72, %rsp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: fptrunc_v4f32: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; AVX512-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVX512-NEXT: vzeroupper | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fptrunc_v4f32: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fptrunc_v4f32: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; AVX512BW-NEXT: vpsrld $16, %ymm0, %ymm1 | |
| ; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vpaddd %ymm0, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vcmpunordps %ymm0, %ymm0, %k1 | |
| ; AVX512BW-NEXT: vpord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1} | |
| ; AVX512BW-NEXT: vpsrld $16, %ymm1, %ymm0 | |
| ; AVX512BW-NEXT: vpmovdw %ymm0, %xmm0 | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: retq | |
| %b = fptrunc <4 x float> %a to <4 x bfloat> | |
| ret <4 x bfloat> %b | |
| } | |
| define <8 x bfloat> @fptrunc_v8f32(<8 x float> %a) nounwind { | |
| ; X86-LABEL: fptrunc_v8f32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fptrunc_v8f32: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $32, %rsp | |
| ; SSE2-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebx | |
| ; SSE2-NEXT: orl %ebp, %ebx | |
| ; SSE2-NEXT: shlq $32, %rbx | |
| ; SSE2-NEXT: orq %r14, %rbx | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebp, %r14d | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebp, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm1 | |
| ; SSE2-NEXT: movq %rbx, %xmm0 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: addq $32, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: fptrunc_v8f32: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVX512-NEXT: vzeroupper | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fptrunc_v8f32: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fptrunc_v8f32: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpsrld $16, %ymm0, %ymm1 | |
| ; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vpaddd %ymm0, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1 | |
| ; AVX512BW-NEXT: vcmpunordps %ymm0, %ymm0, %k1 | |
| ; AVX512BW-NEXT: vpord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1} | |
| ; AVX512BW-NEXT: vpsrld $16, %ymm1, %ymm0 | |
| ; AVX512BW-NEXT: vpmovdw %ymm0, %xmm0 | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: retq | |
| %b = fptrunc <8 x float> %a to <8 x bfloat> | |
| ret <8 x bfloat> %b | |
| } | |
| define <16 x bfloat> @fptrunc_v16f32(<16 x float> %a) nounwind { | |
| ; X86-LABEL: fptrunc_v16f32: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vcvtneps2bf16 %zmm0, %ymm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fptrunc_v16f32: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r15 | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %r12 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $64, %rsp | |
| ; SSE2-NEXT: movaps %xmm3, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm2, %xmm0 | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1],xmm2[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebx | |
| ; SSE2-NEXT: orl %ebp, %ebx | |
| ; SSE2-NEXT: shlq $32, %rbx | |
| ; SSE2-NEXT: orq %r14, %rbx | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r15d | |
| ; SSE2-NEXT: orl %ebp, %r15d | |
| ; SSE2-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebp, %r14d | |
| ; SSE2-NEXT: shlq $32, %r14 | |
| ; SSE2-NEXT: orq %r15, %r14 | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r12d | |
| ; SSE2-NEXT: orl %ebp, %r12d | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r15d | |
| ; SSE2-NEXT: orl %ebp, %r15d | |
| ; SSE2-NEXT: shlq $32, %r15 | |
| ; SSE2-NEXT: orq %r12, %r15 | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r12d | |
| ; SSE2-NEXT: orl %ebp, %r12d | |
| ; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebp, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r12, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm1 | |
| ; SSE2-NEXT: movq %r15, %xmm0 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: movq %r14, %xmm2 | |
| ; SSE2-NEXT: movq %rbx, %xmm1 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] | |
| ; SSE2-NEXT: addq $64, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r12 | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %r15 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: fptrunc_v16f32: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vcvtneps2bf16 %zmm0, %ymm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fptrunc_v16f32: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %ymm0, %xmm0 | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %ymm1, %xmm1 | |
| ; AVXNC-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fptrunc_v16f32: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpsrld $16, %zmm0, %zmm1 | |
| ; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1 | |
| ; AVX512BW-NEXT: vpaddd %zmm0, %zmm1, %zmm1 | |
| ; AVX512BW-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1 | |
| ; AVX512BW-NEXT: vcmpunordps %zmm0, %zmm0, %k1 | |
| ; AVX512BW-NEXT: vpord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1} | |
| ; AVX512BW-NEXT: vpsrld $16, %zmm1, %zmm0 | |
| ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 | |
| ; AVX512BW-NEXT: retq | |
| %b = fptrunc <16 x float> %a to <16 x bfloat> | |
| ret <16 x bfloat> %b | |
| } | |
| define <8 x bfloat> @fptrunc_v8f64(<8 x double> %a) nounwind { | |
| ; X86-LABEL: fptrunc_v8f64: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $204, %esp | |
| ; X86-NEXT: vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill | |
| ; X86-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovlps %xmm0, (%esp) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; X86-NEXT: vmovhps %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; X86-NEXT: vmovlps %xmm0, (%esp) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; X86-NEXT: vmovhps %xmm0, (%esp) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; X86-NEXT: vextractf32x4 $2, %zmm0, %xmm0 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovlps %xmm0, (%esp) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; X86-NEXT: vmovhps %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; X86-NEXT: vextractf32x4 $3, %zmm0, %xmm0 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovlps %xmm0, (%esp) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill | |
| ; X86-NEXT: vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; X86-NEXT: vmovhps %xmm0, (%esp) | |
| ; X86-NEXT: calll __truncdfbf2 | |
| ; X86-NEXT: vmovdqa64 {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; X86-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] | |
| ; X86-NEXT: vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; X86-NEXT: vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload | |
| ; X86-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] | |
| ; X86-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] | |
| ; X86-NEXT: vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; X86-NEXT: vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload | |
| ; X86-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] | |
| ; X86-NEXT: vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 16-byte Reload | |
| ; X86-NEXT: vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 16-byte Folded Reload | |
| ; X86-NEXT: # xmm2 = xmm2[0],mem[0],xmm2[1],mem[1],xmm2[2],mem[2],xmm2[3],mem[3] | |
| ; X86-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] | |
| ; X86-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] | |
| ; X86-NEXT: addl $204, %esp | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: fptrunc_v8f64: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: subq $64, %rsp | |
| ; SSE2-NEXT: movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill | |
| ; SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebx, %r14d | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %ebx | |
| ; SSE2-NEXT: orl %ebp, %ebx | |
| ; SSE2-NEXT: shlq $32, %rbx | |
| ; SSE2-NEXT: orq %r14, %rbx | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %r14d | |
| ; SSE2-NEXT: orl %ebp, %r14d | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ebp | |
| ; SSE2-NEXT: shll $16, %ebp | |
| ; SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; SSE2-NEXT: callq __truncdfbf2@PLT | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %eax | |
| ; SSE2-NEXT: movzwl %ax, %eax | |
| ; SSE2-NEXT: orl %ebp, %eax | |
| ; SSE2-NEXT: shlq $32, %rax | |
| ; SSE2-NEXT: orq %r14, %rax | |
| ; SSE2-NEXT: movq %rax, %xmm1 | |
| ; SSE2-NEXT: movq %rbx, %xmm0 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: addq $64, %rsp | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: fptrunc_v8f64: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: pushq %rbp | |
| ; AVX512BF16-NEXT: pushq %r15 | |
| ; AVX512BF16-NEXT: pushq %r14 | |
| ; AVX512BF16-NEXT: pushq %r13 | |
| ; AVX512BF16-NEXT: pushq %r12 | |
| ; AVX512BF16-NEXT: pushq %rbx | |
| ; AVX512BF16-NEXT: subq $184, %rsp | |
| ; AVX512BF16-NEXT: vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill | |
| ; AVX512BF16-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 | |
| ; AVX512BF16-NEXT: vzeroupper | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BF16-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BF16-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVX512BF16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVX512BF16-NEXT: vzeroupper | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BF16-NEXT: vextractf32x4 $2, %zmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vzeroupper | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BF16-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovapd %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BF16-NEXT: vextractf32x4 $3, %zmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vzeroupper | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BF16-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BF16-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %ebx | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %ebp | |
| ; AVX512BF16-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %r14d | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %r15d | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %r12d | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %r13d | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %eax | |
| ; AVX512BF16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BF16-NEXT: vpinsrw $1, %r13d, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $3, %r12d, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $4, %r15d, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $5, %r14d, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $6, %ebp, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vpinsrw $7, %ebx, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: addq $184, %rsp | |
| ; AVX512BF16-NEXT: popq %rbx | |
| ; AVX512BF16-NEXT: popq %r12 | |
| ; AVX512BF16-NEXT: popq %r13 | |
| ; AVX512BF16-NEXT: popq %r14 | |
| ; AVX512BF16-NEXT: popq %r15 | |
| ; AVX512BF16-NEXT: popq %rbp | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: fptrunc_v8f64: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: subq $184, %rsp | |
| ; AVX512FP16-NEXT: vmovupd %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill | |
| ; AVX512FP16-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVX512FP16-NEXT: vzeroupper | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVX512FP16-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512FP16-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 | |
| ; AVX512FP16-NEXT: vzeroupper | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512FP16-NEXT: vextractf32x4 $2, %zmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVX512FP16-NEXT: vzeroupper | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovaps (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512FP16-NEXT: vextractf32x4 $3, %zmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVX512FP16-NEXT: vzeroupper | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512FP16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512FP16-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512FP16-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload | |
| ; AVX512FP16-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3] | |
| ; AVX512FP16-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload | |
| ; AVX512FP16-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload | |
| ; AVX512FP16-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] | |
| ; AVX512FP16-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] | |
| ; AVX512FP16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload | |
| ; AVX512FP16-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload | |
| ; AVX512FP16-NEXT: # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3] | |
| ; AVX512FP16-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload | |
| ; AVX512FP16-NEXT: vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm2, %xmm2 # 16-byte Folded Reload | |
| ; AVX512FP16-NEXT: # xmm2 = xmm2[0],mem[0],xmm2[1],mem[1],xmm2[2],mem[2],xmm2[3],mem[3] | |
| ; AVX512FP16-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] | |
| ; AVX512FP16-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] | |
| ; AVX512FP16-NEXT: addq $184, %rsp | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: fptrunc_v8f64: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: pushq %rbp | |
| ; AVXNC-NEXT: pushq %r15 | |
| ; AVXNC-NEXT: pushq %r14 | |
| ; AVXNC-NEXT: pushq %r13 | |
| ; AVXNC-NEXT: pushq %r12 | |
| ; AVXNC-NEXT: pushq %rbx | |
| ; AVXNC-NEXT: subq $168, %rsp | |
| ; AVXNC-NEXT: vmovups %ymm1, (%rsp) # 32-byte Spill | |
| ; AVXNC-NEXT: vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill | |
| ; AVXNC-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVXNC-NEXT: # xmm0 = mem[1,0] | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload | |
| ; AVXNC-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vmovups (%rsp), %ymm0 # 32-byte Reload | |
| ; AVXNC-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload | |
| ; AVXNC-NEXT: # xmm0 = mem[1,0] | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vmovups (%rsp), %ymm0 # 32-byte Reload | |
| ; AVXNC-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVXNC-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVXNC-NEXT: vzeroupper | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVXNC-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVXNC-NEXT: # xmm0 = mem[1,0] | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %ebx | |
| ; AVXNC-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %ebp | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %r14d | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %r15d | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %r12d | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %r13d | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: callq __truncdfbf2@PLT | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %eax | |
| ; AVXNC-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVXNC-NEXT: vpinsrw $1, %r13d, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $3, %r12d, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $4, %r15d, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $5, %r14d, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $6, %ebp, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpinsrw $7, %ebx, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: addq $168, %rsp | |
| ; AVXNC-NEXT: popq %rbx | |
| ; AVXNC-NEXT: popq %r12 | |
| ; AVXNC-NEXT: popq %r13 | |
| ; AVXNC-NEXT: popq %r14 | |
| ; AVXNC-NEXT: popq %r15 | |
| ; AVXNC-NEXT: popq %rbp | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: fptrunc_v8f64: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rbp | |
| ; AVX512BW-NEXT: pushq %r15 | |
| ; AVX512BW-NEXT: pushq %r14 | |
| ; AVX512BW-NEXT: pushq %r13 | |
| ; AVX512BW-NEXT: pushq %r12 | |
| ; AVX512BW-NEXT: pushq %rbx | |
| ; AVX512BW-NEXT: subq $184, %rsp | |
| ; AVX512BW-NEXT: vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill | |
| ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0] | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BW-NEXT: vextractf32x4 $2, %zmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovaps %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovapd %xmm0, (%rsp) # 16-byte Spill | |
| ; AVX512BW-NEXT: vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload | |
| ; AVX512BW-NEXT: vextractf32x4 $3, %zmm0, %xmm0 | |
| ; AVX512BW-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill | |
| ; AVX512BW-NEXT: vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload | |
| ; AVX512BW-NEXT: # xmm0 = mem[1,0] | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %ebx | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %ebp | |
| ; AVX512BW-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r14d | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r15d | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r12d | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %r13d | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: callq __truncdfbf2@PLT | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload | |
| ; AVX512BW-NEXT: vpinsrw $1, %r13d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $3, %r12d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $4, %r15d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $5, %r14d, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $6, %ebp, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $7, %ebx, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: addq $184, %rsp | |
| ; AVX512BW-NEXT: popq %rbx | |
| ; AVX512BW-NEXT: popq %r12 | |
| ; AVX512BW-NEXT: popq %r13 | |
| ; AVX512BW-NEXT: popq %r14 | |
| ; AVX512BW-NEXT: popq %r15 | |
| ; AVX512BW-NEXT: popq %rbp | |
| ; AVX512BW-NEXT: retq | |
| %b = fptrunc <8 x double> %a to <8 x bfloat> | |
| ret <8 x bfloat> %b | |
| } | |
| define <32 x bfloat> @test_v8bf16_v32bf16(ptr %0) { | |
| ; X86-LABEL: test_v8bf16_v32bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: test_v8bf16_v32bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movaps (%rdi), %xmm0 | |
| ; SSE2-NEXT: movaps %xmm0, %xmm1 | |
| ; SSE2-NEXT: movaps %xmm0, %xmm2 | |
| ; SSE2-NEXT: movaps %xmm0, %xmm3 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: test_v8bf16_v32bf16: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: test_v8bf16_v32bf16: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] | |
| ; AVXNC-NEXT: vmovaps %ymm0, %ymm1 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: test_v8bf16_v32bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] | |
| ; AVX512BW-NEXT: retq | |
| %2 = load <8 x bfloat>, ptr %0, align 16 | |
| %3 = shufflevector <8 x bfloat> %2, <8 x bfloat> %2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| ret <32 x bfloat> %3 | |
| } | |
| define <16 x bfloat> @concat_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) { | |
| ; X86-LABEL: concat_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; X86-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: concat_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: concat_v8bf16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: concat_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 | |
| ; AVX512BW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512BW-NEXT: retq | |
| %a = shufflevector <8 x bfloat> %x, <8 x bfloat> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| ret <16 x bfloat> %a | |
| } | |
| define <8 x bfloat> @extract_v32bf16_v8bf16(<32 x bfloat> %x) { | |
| ; X86-LABEL: extract_v32bf16_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: extract_v32bf16_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pextrw $0, %xmm1, %eax | |
| ; SSE2-NEXT: pextrw $1, %xmm1, %ecx | |
| ; SSE2-NEXT: shll $16, %ecx | |
| ; SSE2-NEXT: orl %eax, %ecx | |
| ; SSE2-NEXT: pextrw $2, %xmm1, %eax | |
| ; SSE2-NEXT: pextrw $3, %xmm1, %edx | |
| ; SSE2-NEXT: shll $16, %edx | |
| ; SSE2-NEXT: orl %eax, %edx | |
| ; SSE2-NEXT: shlq $32, %rdx | |
| ; SSE2-NEXT: orq %rcx, %rdx | |
| ; SSE2-NEXT: pextrw $4, %xmm1, %eax | |
| ; SSE2-NEXT: pextrw $5, %xmm1, %ecx | |
| ; SSE2-NEXT: shll $16, %ecx | |
| ; SSE2-NEXT: orl %eax, %ecx | |
| ; SSE2-NEXT: pextrw $6, %xmm1, %eax | |
| ; SSE2-NEXT: pextrw $7, %xmm1, %esi | |
| ; SSE2-NEXT: shll $16, %esi | |
| ; SSE2-NEXT: orl %eax, %esi | |
| ; SSE2-NEXT: shlq $32, %rsi | |
| ; SSE2-NEXT: orq %rcx, %rsi | |
| ; SSE2-NEXT: movq %rsi, %xmm1 | |
| ; SSE2-NEXT: movq %rdx, %xmm0 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: extract_v32bf16_v8bf16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVX-NEXT: vzeroupper | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: extract_v32bf16_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vextractf128 $1, %ymm0, %xmm0 | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: retq | |
| %a = shufflevector <32 x bfloat> %x, <32 x bfloat> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| ret <8 x bfloat> %a | |
| } | |
| define <16 x bfloat> @concat_zero_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) { | |
| ; X86-LABEL: concat_zero_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovaps %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: concat_zero_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: xorps %xmm1, %xmm1 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: concat_zero_v8bf16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vmovaps %xmm0, %xmm0 | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: concat_zero_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vmovaps %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %a = shufflevector <8 x bfloat> %x, <8 x bfloat> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| ret <16 x bfloat> %a | |
| } | |
| define <16 x bfloat> @concat_dup_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) { | |
| ; X86-LABEL: concat_dup_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] | |
| ; X86-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: concat_dup_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: concat_dup_v8bf16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] | |
| ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: concat_dup_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] | |
| ; AVX512BW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 | |
| ; AVX512BW-NEXT: retq | |
| %a = shufflevector <8 x bfloat> %x, <8 x bfloat> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| ret <16 x bfloat> %a | |
| } | |
| define float @trunc_ext(float %a) nounwind { | |
| ; X86-LABEL: trunc_ext: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: pushl %eax | |
| ; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero | |
| ; X86-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovd %xmm0, (%esp) | |
| ; X86-NEXT: flds (%esp) | |
| ; X86-NEXT: popl %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: trunc_ext: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rax | |
| ; SSE2-NEXT: callq __truncsfbf2@PLT | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: popq %rax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: trunc_ext: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: trunc_ext: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: trunc_ext: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rax | |
| ; AVX512BW-NEXT: callq __truncsfbf2@PLT | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: popq %rax | |
| ; AVX512BW-NEXT: retq | |
| %b = fptrunc float %a to bfloat | |
| %c = fpext bfloat %b to float | |
| ret float %c | |
| } | |
| define void @PR92471(ptr %0, ptr %1) nounwind { | |
| ; X86-LABEL: PR92471: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero | |
| ; X86-NEXT: vpinsrd $1, 4(%ecx), %xmm0, %xmm0 | |
| ; X86-NEXT: vpinsrd $2, 8(%ecx), %xmm0, %xmm0 | |
| ; X86-NEXT: vpinsrw $6, 12(%ecx), %xmm0, %xmm0 | |
| ; X86-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; X86-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; X86-NEXT: vextracti128 $1, %ymm0, %xmm1 | |
| ; X86-NEXT: vpextrd $2, %xmm1, 24(%eax) | |
| ; X86-NEXT: vpextrd $1, %xmm1, 20(%eax) | |
| ; X86-NEXT: vmovd %xmm1, 16(%eax) | |
| ; X86-NEXT: vmovdqu %xmm0, (%eax) | |
| ; X86-NEXT: vzeroupper | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: PR92471: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero | |
| ; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero | |
| ; SSE2-NEXT: pinsrw $2, 12(%rdi), %xmm1 | |
| ; SSE2-NEXT: pxor %xmm2, %xmm2 | |
| ; SSE2-NEXT: pxor %xmm3, %xmm3 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3] | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3] | |
| ; SSE2-NEXT: movdqu %xmm2, (%rsi) | |
| ; SSE2-NEXT: movq %xmm3, 16(%rsi) | |
| ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3] | |
| ; SSE2-NEXT: movd %xmm0, 24(%rsi) | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: PR92471: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX-NEXT: vpinsrd $2, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX-NEXT: vpinsrw $6, 12(%rdi), %xmm0, %xmm0 | |
| ; AVX-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX-NEXT: vextracti128 $1, %ymm0, %xmm1 | |
| ; AVX-NEXT: vpextrd $2, %xmm1, 24(%rsi) | |
| ; AVX-NEXT: vmovq %xmm1, 16(%rsi) | |
| ; AVX-NEXT: vmovdqu %xmm0, (%rsi) | |
| ; AVX-NEXT: vzeroupper | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: PR92471: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero | |
| ; AVX512BW-NEXT: vpinsrd $2, 8(%rdi), %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpinsrw $6, 12(%rdi), %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVX512BW-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 | |
| ; AVX512BW-NEXT: vpextrd $2, %xmm1, 24(%rsi) | |
| ; AVX512BW-NEXT: vmovq %xmm1, 16(%rsi) | |
| ; AVX512BW-NEXT: vmovdqu %xmm0, (%rsi) | |
| ; AVX512BW-NEXT: vzeroupper | |
| ; AVX512BW-NEXT: retq | |
| %3 = load <7 x bfloat>, ptr %0, align 2 | |
| %4 = fpext <7 x bfloat> %3 to <7 x float> | |
| store <7 x float> %4, ptr %1, align 4 | |
| ret void | |
| } | |
| define bfloat @PR108936(x86_fp80 %0) nounwind { | |
| ; X86-LABEL: PR108936: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $12, %esp | |
| ; X86-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-NEXT: fstpt (%esp) | |
| ; X86-NEXT: calll __truncxfbf2 | |
| ; X86-NEXT: addl $12, %esp | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: PR108936: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: subq $24, %rsp | |
| ; X64-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-NEXT: fstpt (%rsp) | |
| ; X64-NEXT: callq __truncxfbf2@PLT | |
| ; X64-NEXT: addq $24, %rsp | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: PR108936: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: subq $24, %rsp | |
| ; AVX512BW-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; AVX512BW-NEXT: fstpt (%rsp) | |
| ; AVX512BW-NEXT: callq __truncxfbf2@PLT | |
| ; AVX512BW-NEXT: addq $24, %rsp | |
| ; AVX512BW-NEXT: retq | |
| %2 = fptrunc x86_fp80 %0 to bfloat | |
| ret bfloat %2 | |
| } | |
| define bfloat @PR115710(fp128 %0) nounwind { | |
| ; X86-LABEL: PR115710: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: subl $28, %esp | |
| ; X86-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0 | |
| ; X86-NEXT: vmovups %xmm0, (%esp) | |
| ; X86-NEXT: calll __trunctfbf2 | |
| ; X86-NEXT: addl $28, %esp | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: PR115710: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: pushq %rax | |
| ; X64-NEXT: callq __trunctfbf2@PLT | |
| ; X64-NEXT: popq %rax | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: PR115710: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: pushq %rax | |
| ; AVX512BW-NEXT: callq __trunctfbf2@PLT | |
| ; AVX512BW-NEXT: popq %rax | |
| ; AVX512BW-NEXT: retq | |
| %2 = fptrunc fp128 %0 to bfloat | |
| ret bfloat %2 | |
| } | |
| define bfloat @select_bf16(i1 %cond, bfloat %a, bfloat %b) nounwind { | |
| ; X86-LABEL: select_bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: cmovnel %eax, %ecx | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: select_bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: andl $1, %edi | |
| ; SSE2-NEXT: negl %edi | |
| ; SSE2-NEXT: movd %edi, %xmm2 | |
| ; SSE2-NEXT: pand %xmm2, %xmm0 | |
| ; SSE2-NEXT: pandn %xmm1, %xmm2 | |
| ; SSE2-NEXT: por %xmm2, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: select_bf16: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: kmovd %edi, %k1 | |
| ; AVX512BF16-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} | |
| ; AVX512BF16-NEXT: vmovaps %xmm1, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: select_bf16: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: kmovd %edi, %k1 | |
| ; AVX512FP16-NEXT: vmovsh %xmm0, %xmm0, %xmm1 {%k1} | |
| ; AVX512FP16-NEXT: vmovaps %xmm1, %xmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: select_bf16: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: andl $1, %edi | |
| ; AVXNC-NEXT: negl %edi | |
| ; AVXNC-NEXT: vmovd %edi, %xmm2 | |
| ; AVXNC-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: kmovd %edi, %k1 | |
| ; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} | |
| ; AVX512BW-NEXT: vmovaps %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %sel = select i1 %cond, bfloat %a, bfloat %b | |
| ret bfloat %sel | |
| } | |
| define bfloat @select_bf16_constants(i1 %cond) nounwind { | |
| ; X86-LABEL: select_bf16_constants: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: xorl %eax, %eax | |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; X86-NEXT: cmovel %eax, %ecx | |
| ; X86-NEXT: vmovw %ecx, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: select_bf16_constants: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: xorl %eax, %eax | |
| ; SSE2-NEXT: testb $1, %dil | |
| ; SSE2-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; SSE2-NEXT: cmovel %eax, %ecx | |
| ; SSE2-NEXT: pinsrw $0, %ecx, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: select_bf16_constants: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: xorl %eax, %eax | |
| ; AVX512BF16-NEXT: testb $1, %dil | |
| ; AVX512BF16-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; AVX512BF16-NEXT: cmovel %eax, %ecx | |
| ; AVX512BF16-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: select_bf16_constants: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: xorl %eax, %eax | |
| ; AVX512FP16-NEXT: testb $1, %dil | |
| ; AVX512FP16-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; AVX512FP16-NEXT: cmovel %eax, %ecx | |
| ; AVX512FP16-NEXT: vmovw %ecx, %xmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: select_bf16_constants: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: xorl %eax, %eax | |
| ; AVXNC-NEXT: testb $1, %dil | |
| ; AVXNC-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; AVXNC-NEXT: cmovel %eax, %ecx | |
| ; AVXNC-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_bf16_constants: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: xorl %eax, %eax | |
| ; AVX512BW-NEXT: testb $1, %dil | |
| ; AVX512BW-NEXT: movl $16256, %ecx # imm = 0x3F80 | |
| ; AVX512BW-NEXT: cmovel %eax, %ecx | |
| ; AVX512BW-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %sel = select i1 %cond, bfloat 1.0, bfloat 0.0 | |
| ret bfloat %sel | |
| } | |
| define bfloat @select_ogt_bf16(bfloat %a, bfloat %b) nounwind { | |
| ; X86-LABEL: select_ogt_bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: vmovw %ecx, %xmm0 | |
| ; X86-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; X86-NEXT: vmovw %eax, %xmm1 | |
| ; X86-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; X86-NEXT: vucomiss %xmm0, %xmm1 | |
| ; X86-NEXT: cmoval %eax, %ecx | |
| ; X86-NEXT: vmovw %ecx, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: select_ogt_bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pextrw $0, %xmm1, %eax | |
| ; SSE2-NEXT: pextrw $0, %xmm0, %ecx | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: ucomiss %xmm1, %xmm0 | |
| ; SSE2-NEXT: cmoval %ecx, %eax | |
| ; SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: select_ogt_bf16: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BF16-NEXT: vpextrw $0, %xmm0, %ecx | |
| ; AVX512BF16-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BF16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: vucomiss %xmm1, %xmm0 | |
| ; AVX512BF16-NEXT: cmoval %ecx, %eax | |
| ; AVX512BF16-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0 | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: select_ogt_bf16: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: vmovw %xmm1, %eax | |
| ; AVX512FP16-NEXT: vmovw %xmm0, %ecx | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512FP16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512FP16-NEXT: vucomiss %xmm1, %xmm0 | |
| ; AVX512FP16-NEXT: cmoval %ecx, %eax | |
| ; AVX512FP16-NEXT: vmovw %eax, %xmm0 | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: select_ogt_bf16: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVXNC-NEXT: vpextrw $0, %xmm0, %ecx | |
| ; AVXNC-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vucomiss %xmm1, %xmm0 | |
| ; AVXNC-NEXT: cmoval %ecx, %eax | |
| ; AVXNC-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_ogt_bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm1, %eax | |
| ; AVX512BW-NEXT: vpextrw $0, %xmm0, %ecx | |
| ; AVX512BW-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vucomiss %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: cmoval %ecx, %eax | |
| ; AVX512BW-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: retq | |
| %cmp = fcmp ogt bfloat %a, %b | |
| %sel = select i1 %cmp, bfloat %a, bfloat %b | |
| ret bfloat %sel | |
| } | |
| define <16 x i16> @pr230367(<16 x bfloat> %a) { | |
| ; X86-LABEL: pr230367: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1 | |
| ; X86-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 | |
| ; X86-NEXT: vpslld $16, %zmm0, %zmm0 | |
| ; X86-NEXT: vcmpltps %zmm1, %zmm0, %k0 | |
| ; X86-NEXT: vpmovm2w %k0, %ymm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: pr230367: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movdqa %xmm0, %xmm2 | |
| ; SSE2-NEXT: movdqa %xmm1, %xmm4 | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm1[1] | |
| ; SSE2-NEXT: movq %xmm4, %rcx | |
| ; SSE2-NEXT: movq %rcx, %rax | |
| ; SSE2-NEXT: shrq $32, %rax | |
| ; SSE2-NEXT: shrq $48, %rcx | |
| ; SSE2-NEXT: movq %xmm1, %rsi | |
| ; SSE2-NEXT: movq %rsi, %rdx | |
| ; SSE2-NEXT: shrq $32, %rdx | |
| ; SSE2-NEXT: shrq $48, %rsi | |
| ; SSE2-NEXT: movdqa %xmm0, %xmm5 | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm5 = xmm5[1],xmm0[1] | |
| ; SSE2-NEXT: movq %xmm5, %r8 | |
| ; SSE2-NEXT: movq %r8, %rdi | |
| ; SSE2-NEXT: shrq $32, %rdi | |
| ; SSE2-NEXT: shrq $48, %r8 | |
| ; SSE2-NEXT: movq %xmm0, %r10 | |
| ; SSE2-NEXT: movq %r10, %r9 | |
| ; SSE2-NEXT: shrq $32, %r9 | |
| ; SSE2-NEXT: shrq $48, %r10 | |
| ; SSE2-NEXT: pslld $16, %xmm0 | |
| ; SSE2-NEXT: xorps %xmm3, %xmm3 | |
| ; SSE2-NEXT: xorl %r11d, %r11d | |
| ; SSE2-NEXT: ucomiss %xmm0, %xmm3 | |
| ; SSE2-NEXT: seta %r11b | |
| ; SSE2-NEXT: negl %r11d | |
| ; SSE2-NEXT: movd %r11d, %xmm0 | |
| ; SSE2-NEXT: psrld $16, %xmm2 | |
| ; SSE2-NEXT: pslld $16, %xmm2 | |
| ; SSE2-NEXT: xorl %r11d, %r11d | |
| ; SSE2-NEXT: ucomiss %xmm2, %xmm3 | |
| ; SSE2-NEXT: seta %r11b | |
| ; SSE2-NEXT: negl %r11d | |
| ; SSE2-NEXT: movd %r11d, %xmm2 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] | |
| ; SSE2-NEXT: movd %r10d, %xmm2 | |
| ; SSE2-NEXT: pslld $16, %xmm2 | |
| ; SSE2-NEXT: xorl %r10d, %r10d | |
| ; SSE2-NEXT: ucomiss %xmm2, %xmm3 | |
| ; SSE2-NEXT: seta %r10b | |
| ; SSE2-NEXT: negl %r10d | |
| ; SSE2-NEXT: movd %r10d, %xmm2 | |
| ; SSE2-NEXT: movd %r9d, %xmm6 | |
| ; SSE2-NEXT: pslld $16, %xmm6 | |
| ; SSE2-NEXT: xorl %r9d, %r9d | |
| ; SSE2-NEXT: ucomiss %xmm6, %xmm3 | |
| ; SSE2-NEXT: seta %r9b | |
| ; SSE2-NEXT: negl %r9d | |
| ; SSE2-NEXT: movd %r9d, %xmm6 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3] | |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1] | |
| ; SSE2-NEXT: movdqa %xmm5, %xmm2 | |
| ; SSE2-NEXT: pslld $16, %xmm2 | |
| ; SSE2-NEXT: xorl %r9d, %r9d | |
| ; SSE2-NEXT: ucomiss %xmm2, %xmm3 | |
| ; SSE2-NEXT: seta %r9b | |
| ; SSE2-NEXT: negl %r9d | |
| ; SSE2-NEXT: movd %r9d, %xmm2 | |
| ; SSE2-NEXT: psrld $16, %xmm5 | |
| ; SSE2-NEXT: pslld $16, %xmm5 | |
| ; SSE2-NEXT: xorl %r9d, %r9d | |
| ; SSE2-NEXT: ucomiss %xmm5, %xmm3 | |
| ; SSE2-NEXT: seta %r9b | |
| ; SSE2-NEXT: negl %r9d | |
| ; SSE2-NEXT: movd %r9d, %xmm5 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3] | |
| ; SSE2-NEXT: movd %r8d, %xmm5 | |
| ; SSE2-NEXT: pslld $16, %xmm5 | |
| ; SSE2-NEXT: xorl %r8d, %r8d | |
| ; SSE2-NEXT: ucomiss %xmm5, %xmm3 | |
| ; SSE2-NEXT: seta %r8b | |
| ; SSE2-NEXT: negl %r8d | |
| ; SSE2-NEXT: movd %r8d, %xmm5 | |
| ; SSE2-NEXT: movd %edi, %xmm6 | |
| ; SSE2-NEXT: pslld $16, %xmm6 | |
| ; SSE2-NEXT: xorl %edi, %edi | |
| ; SSE2-NEXT: ucomiss %xmm6, %xmm3 | |
| ; SSE2-NEXT: seta %dil | |
| ; SSE2-NEXT: negl %edi | |
| ; SSE2-NEXT: movd %edi, %xmm6 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3] | |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1] | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] | |
| ; SSE2-NEXT: movdqa %xmm1, %xmm2 | |
| ; SSE2-NEXT: pslld $16, %xmm2 | |
| ; SSE2-NEXT: xorl %edi, %edi | |
| ; SSE2-NEXT: ucomiss %xmm2, %xmm3 | |
| ; SSE2-NEXT: seta %dil | |
| ; SSE2-NEXT: negl %edi | |
| ; SSE2-NEXT: movd %edi, %xmm2 | |
| ; SSE2-NEXT: psrld $16, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: xorl %edi, %edi | |
| ; SSE2-NEXT: ucomiss %xmm1, %xmm3 | |
| ; SSE2-NEXT: seta %dil | |
| ; SSE2-NEXT: negl %edi | |
| ; SSE2-NEXT: movd %edi, %xmm1 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] | |
| ; SSE2-NEXT: movd %esi, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: xorl %esi, %esi | |
| ; SSE2-NEXT: ucomiss %xmm1, %xmm3 | |
| ; SSE2-NEXT: seta %sil | |
| ; SSE2-NEXT: negl %esi | |
| ; SSE2-NEXT: movd %esi, %xmm1 | |
| ; SSE2-NEXT: movd %edx, %xmm5 | |
| ; SSE2-NEXT: pslld $16, %xmm5 | |
| ; SSE2-NEXT: xorl %edx, %edx | |
| ; SSE2-NEXT: ucomiss %xmm5, %xmm3 | |
| ; SSE2-NEXT: seta %dl | |
| ; SSE2-NEXT: negl %edx | |
| ; SSE2-NEXT: movd %edx, %xmm5 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3] | |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1] | |
| ; SSE2-NEXT: movdqa %xmm4, %xmm1 | |
| ; SSE2-NEXT: pslld $16, %xmm1 | |
| ; SSE2-NEXT: xorl %edx, %edx | |
| ; SSE2-NEXT: ucomiss %xmm1, %xmm3 | |
| ; SSE2-NEXT: seta %dl | |
| ; SSE2-NEXT: negl %edx | |
| ; SSE2-NEXT: movd %edx, %xmm1 | |
| ; SSE2-NEXT: psrld $16, %xmm4 | |
| ; SSE2-NEXT: pslld $16, %xmm4 | |
| ; SSE2-NEXT: xorl %edx, %edx | |
| ; SSE2-NEXT: ucomiss %xmm4, %xmm3 | |
| ; SSE2-NEXT: seta %dl | |
| ; SSE2-NEXT: negl %edx | |
| ; SSE2-NEXT: movd %edx, %xmm4 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3] | |
| ; SSE2-NEXT: movd %ecx, %xmm4 | |
| ; SSE2-NEXT: pslld $16, %xmm4 | |
| ; SSE2-NEXT: xorl %ecx, %ecx | |
| ; SSE2-NEXT: ucomiss %xmm4, %xmm3 | |
| ; SSE2-NEXT: seta %cl | |
| ; SSE2-NEXT: negl %ecx | |
| ; SSE2-NEXT: movd %ecx, %xmm4 | |
| ; SSE2-NEXT: movd %eax, %xmm5 | |
| ; SSE2-NEXT: pslld $16, %xmm5 | |
| ; SSE2-NEXT: xorl %eax, %eax | |
| ; SSE2-NEXT: ucomiss %xmm5, %xmm3 | |
| ; SSE2-NEXT: seta %al | |
| ; SSE2-NEXT: negl %eax | |
| ; SSE2-NEXT: movd %eax, %xmm3 | |
| ; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3] | |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] | |
| ; SSE2-NEXT: movdqa %xmm2, %xmm1 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: pr230367: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1 | |
| ; AVX512-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 | |
| ; AVX512-NEXT: vpslld $16, %zmm0, %zmm0 | |
| ; AVX512-NEXT: vcmpltps %zmm1, %zmm0, %k0 | |
| ; AVX512-NEXT: vpmovm2w %k0, %ymm0 | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: pr230367: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vxorps %xmm1, %xmm1, %xmm1 | |
| ; AVXNC-NEXT: vextracti128 $1, %ymm0, %xmm2 | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm2, %ymm2 | |
| ; AVXNC-NEXT: vcmpltps %ymm1, %ymm2, %ymm2 | |
| ; AVXNC-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero | |
| ; AVXNC-NEXT: vpslld $16, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: vcmpltps %ymm1, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: vpackssdw %ymm2, %ymm0, %ymm0 | |
| ; AVXNC-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: pr230367: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 | |
| ; AVX512BW-NEXT: vpblendw {{.*#+}} xmm3 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7] | |
| ; AVX512BW-NEXT: vxorps %xmm1, %xmm1, %xmm1 | |
| ; AVX512BW-NEXT: vucomiss %xmm3, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm3 | |
| ; AVX512BW-NEXT: vucomiss %xmm3, %xmm1 | |
| ; AVX512BW-NEXT: seta %cl | |
| ; AVX512BW-NEXT: vmovd %ecx, %xmm3 | |
| ; AVX512BW-NEXT: vpinsrb $1, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $2, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $2, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $3, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $3, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpunpckhwd {{.*#+}} xmm4 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $4, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $5, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $5, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $6, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $6, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $7, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $7, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $8, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpblendw {{.*#+}} xmm4 = xmm2[0],xmm0[1],xmm2[2],xmm0[3],xmm2[4],xmm0[5],xmm2[6],xmm0[7] | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $9, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $2, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $10, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpextrw $3, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm4 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm4, %xmm4 | |
| ; AVX512BW-NEXT: vucomiss %xmm4, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $11, %eax, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] | |
| ; AVX512BW-NEXT: vucomiss %xmm2, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $12, %eax, %xmm3, %xmm2 | |
| ; AVX512BW-NEXT: vpextrw $5, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm3 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vucomiss %xmm3, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $13, %eax, %xmm2, %xmm2 | |
| ; AVX512BW-NEXT: vpextrw $6, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm3 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm3, %xmm3 | |
| ; AVX512BW-NEXT: vucomiss %xmm3, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $14, %eax, %xmm2, %xmm2 | |
| ; AVX512BW-NEXT: vpextrw $7, %xmm0, %eax | |
| ; AVX512BW-NEXT: vmovd %eax, %xmm0 | |
| ; AVX512BW-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vucomiss %xmm0, %xmm1 | |
| ; AVX512BW-NEXT: seta %al | |
| ; AVX512BW-NEXT: vpinsrb $15, %eax, %xmm2, %xmm0 | |
| ; AVX512BW-NEXT: vptestmb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k0 | |
| ; AVX512BW-NEXT: vpmovm2w %k0, %ymm0 | |
| ; AVX512BW-NEXT: retq | |
| %c = fcmp olt <16 x bfloat> %a, zeroinitializer | |
| %r = sext <16 x i1> %c to <16 x i16> | |
| ret <16 x i16> %r | |
| } | |
| ; Both operands come out of GPRs, so the CMOV is cheaper than moving them into | |
| ; vector registers and the result back out. | |
| define i16 @select_bf16_from_gpr(i1 %cond, i16 %a, i16 %b) nounwind { | |
| ; X86-LABEL: select_bf16_from_gpr: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: cmovnel %eax, %ecx | |
| ; X86-NEXT: movzwl (%ecx), %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: select_bf16_from_gpr: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movl %esi, %eax | |
| ; X64-NEXT: testb $1, %dil | |
| ; X64-NEXT: cmovel %edx, %eax | |
| ; X64-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; X64-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_bf16_from_gpr: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: movl %esi, %eax | |
| ; AVX512BW-NEXT: testb $1, %dil | |
| ; AVX512BW-NEXT: cmovel %edx, %eax | |
| ; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; AVX512BW-NEXT: retq | |
| %fa = bitcast i16 %a to bfloat | |
| %fb = bitcast i16 %b to bfloat | |
| %sel = select i1 %cond, bfloat %fa, bfloat %fb | |
| %res = bitcast bfloat %sel to i16 | |
| ret i16 %res | |
| } | |
| ; The operands already live in vector registers, so blend there even though the | |
| ; select itself is on i16. | |
| define i16 @select_i16_of_bf16(i1 %cond, bfloat %a, bfloat %b) nounwind { | |
| ; X86-LABEL: select_i16_of_bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx | |
| ; X86-NEXT: cmovnel %eax, %ecx | |
| ; X86-NEXT: movzwl (%ecx), %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: select_i16_of_bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: andl $1, %edi | |
| ; SSE2-NEXT: negl %edi | |
| ; SSE2-NEXT: movd %edi, %xmm2 | |
| ; SSE2-NEXT: pand %xmm2, %xmm0 | |
| ; SSE2-NEXT: pandn %xmm1, %xmm2 | |
| ; SSE2-NEXT: por %xmm0, %xmm2 | |
| ; SSE2-NEXT: movd %xmm2, %eax | |
| ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512BF16-LABEL: select_i16_of_bf16: | |
| ; AVX512BF16: # %bb.0: | |
| ; AVX512BF16-NEXT: kmovd %edi, %k1 | |
| ; AVX512BF16-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} | |
| ; AVX512BF16-NEXT: vmovd %xmm1, %eax | |
| ; AVX512BF16-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; AVX512BF16-NEXT: retq | |
| ; | |
| ; AVX512FP16-LABEL: select_i16_of_bf16: | |
| ; AVX512FP16: # %bb.0: | |
| ; AVX512FP16-NEXT: kmovd %edi, %k1 | |
| ; AVX512FP16-NEXT: vmovsh %xmm0, %xmm0, %xmm1 {%k1} | |
| ; AVX512FP16-NEXT: vmovw %xmm1, %eax | |
| ; AVX512FP16-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; AVX512FP16-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: select_i16_of_bf16: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: andl $1, %edi | |
| ; AVXNC-NEXT: negl %edi | |
| ; AVXNC-NEXT: vmovd %edi, %xmm2 | |
| ; AVXNC-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm0 | |
| ; AVXNC-NEXT: vmovd %xmm0, %eax | |
| ; AVXNC-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_i16_of_bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: kmovd %edi, %k1 | |
| ; AVX512BW-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1} | |
| ; AVX512BW-NEXT: vmovd %xmm1, %eax | |
| ; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax | |
| ; AVX512BW-NEXT: retq | |
| %ai = bitcast bfloat %a to i16 | |
| %bi = bitcast bfloat %b to i16 | |
| %sel = select i1 %cond, i16 %ai, i16 %bi | |
| ret i16 %sel | |
| } | |
| define <8 x bfloat> @select_v8bf16(i1 %cond, <8 x bfloat> %a, <8 x bfloat> %b) nounwind { | |
| ; X86-LABEL: select_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) | |
| ; X86-NEXT: jne .LBB41_2 | |
| ; X86-NEXT: # %bb.1: | |
| ; X86-NEXT: vmovaps %xmm1, %xmm0 | |
| ; X86-NEXT: .LBB41_2: | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: select_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r15 | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %r13 | |
| ; SSE2-NEXT: pushq %r12 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | |
| ; SSE2-NEXT: movq %xmm0, %rdi | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] | |
| ; SSE2-NEXT: movq %xmm0, %r14 | |
| ; SSE2-NEXT: movl %r14d, %eax | |
| ; SSE2-NEXT: shrl $16, %eax | |
| ; SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | |
| ; SSE2-NEXT: movq %xmm1, %r10 | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] | |
| ; SSE2-NEXT: movq %xmm1, %r11 | |
| ; SSE2-NEXT: movl %r11d, %r9d | |
| ; SSE2-NEXT: shrl $16, %r9d | |
| ; SSE2-NEXT: movq %r11, %rdx | |
| ; SSE2-NEXT: shrq $48, %rdx | |
| ; SSE2-NEXT: movq %r14, %r12 | |
| ; SSE2-NEXT: shrq $48, %r12 | |
| ; SSE2-NEXT: movq %r11, %rbx | |
| ; SSE2-NEXT: shrq $32, %rbx | |
| ; SSE2-NEXT: movq %r14, %r13 | |
| ; SSE2-NEXT: shrq $32, %r13 | |
| ; SSE2-NEXT: movl %edi, %ebp | |
| ; SSE2-NEXT: shrl $16, %ebp | |
| ; SSE2-NEXT: movl %r10d, %esi | |
| ; SSE2-NEXT: shrl $16, %esi | |
| ; SSE2-NEXT: movq %r10, %rcx | |
| ; SSE2-NEXT: shrq $48, %rcx | |
| ; SSE2-NEXT: movq %rdi, %r15 | |
| ; SSE2-NEXT: shrq $48, %r15 | |
| ; SSE2-NEXT: movq %r10, %r8 | |
| ; SSE2-NEXT: shrq $32, %r8 | |
| ; SSE2-NEXT: movq %rdi, %rax | |
| ; SSE2-NEXT: shrq $32, %rax | |
| ; SSE2-NEXT: testb $1, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Folded Reload | |
| ; SSE2-NEXT: cmovnel %eax, %r8d | |
| ; SSE2-NEXT: cmovnel %r15d, %ecx | |
| ; SSE2-NEXT: cmovnel %edi, %r10d | |
| ; SSE2-NEXT: cmovnel %ebp, %esi | |
| ; SSE2-NEXT: cmovnel %r13d, %ebx | |
| ; SSE2-NEXT: cmovnel %r12d, %edx | |
| ; SSE2-NEXT: cmovnel %r14d, %r11d | |
| ; SSE2-NEXT: cmovnel {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Folded Reload | |
| ; SSE2-NEXT: shll $16, %r9d | |
| ; SSE2-NEXT: movzwl %r11w, %eax | |
| ; SSE2-NEXT: orl %r9d, %eax | |
| ; SSE2-NEXT: shll $16, %edx | |
| ; SSE2-NEXT: movzwl %bx, %edi | |
| ; SSE2-NEXT: orl %edx, %edi | |
| ; SSE2-NEXT: shlq $32, %rdi | |
| ; SSE2-NEXT: orq %rax, %rdi | |
| ; SSE2-NEXT: shll $16, %esi | |
| ; SSE2-NEXT: movzwl %r10w, %eax | |
| ; SSE2-NEXT: orl %esi, %eax | |
| ; SSE2-NEXT: shll $16, %ecx | |
| ; SSE2-NEXT: movzwl %r8w, %edx | |
| ; SSE2-NEXT: orl %ecx, %edx | |
| ; SSE2-NEXT: shlq $32, %rdx | |
| ; SSE2-NEXT: orq %rax, %rdx | |
| ; SSE2-NEXT: movq %rdx, %xmm0 | |
| ; SSE2-NEXT: movq %rdi, %xmm1 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r12 | |
| ; SSE2-NEXT: popq %r13 | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %r15 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: select_v8bf16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: testb $1, %dil | |
| ; AVX-NEXT: jne .LBB41_2 | |
| ; AVX-NEXT: # %bb.1: | |
| ; AVX-NEXT: vmovaps %xmm1, %xmm0 | |
| ; AVX-NEXT: .LBB41_2: | |
| ; AVX-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: select_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: testb $1, %dil | |
| ; AVX512BW-NEXT: jne .LBB41_2 | |
| ; AVX512BW-NEXT: # %bb.1: | |
| ; AVX512BW-NEXT: vmovaps %xmm1, %xmm0 | |
| ; AVX512BW-NEXT: .LBB41_2: | |
| ; AVX512BW-NEXT: retq | |
| %sel = select i1 %cond, <8 x bfloat> %a, <8 x bfloat> %b | |
| ret <8 x bfloat> %sel | |
| } | |
| define <8 x bfloat> @vselect_v8bf16(<8 x i1> %m, <8 x bfloat> %a, <8 x bfloat> %b) nounwind { | |
| ; X86-LABEL: vselect_v8bf16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpsllw $15, %xmm0, %xmm0 | |
| ; X86-NEXT: vpmovw2m %xmm0, %k1 | |
| ; X86-NEXT: vpblendmw %xmm1, %xmm2, %xmm0 {%k1} | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: vselect_v8bf16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %rbp | |
| ; SSE2-NEXT: pushq %r15 | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %r13 | |
| ; SSE2-NEXT: pushq %r12 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: movq %xmm2, %rsi | |
| ; SSE2-NEXT: movq %rsi, %rdx | |
| ; SSE2-NEXT: shrq $32, %rdx | |
| ; SSE2-NEXT: movq %xmm1, %r8 | |
| ; SSE2-NEXT: movq %r8, %rax | |
| ; SSE2-NEXT: shrq $32, %rax | |
| ; SSE2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill | |
| ; SSE2-NEXT: movq %rsi, %rcx | |
| ; SSE2-NEXT: shrq $48, %rcx | |
| ; SSE2-NEXT: movq %r8, %rdi | |
| ; SSE2-NEXT: shrq $48, %rdi | |
| ; SSE2-NEXT: movl %r8d, %r10d | |
| ; SSE2-NEXT: shrl $16, %r10d | |
| ; SSE2-NEXT: movl %esi, %r9d | |
| ; SSE2-NEXT: shrl $16, %r9d | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] | |
| ; SSE2-NEXT: movq %xmm2, %r15 | |
| ; SSE2-NEXT: movq %r15, %r11 | |
| ; SSE2-NEXT: shrq $32, %r11 | |
| ; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] | |
| ; SSE2-NEXT: movq %xmm1, %r12 | |
| ; SSE2-NEXT: movq %r12, %r14 | |
| ; SSE2-NEXT: shrq $32, %r14 | |
| ; SSE2-NEXT: movq %r15, %rbx | |
| ; SSE2-NEXT: shrq $48, %rbx | |
| ; SSE2-NEXT: movq %r12, %r13 | |
| ; SSE2-NEXT: shrq $48, %r13 | |
| ; SSE2-NEXT: movl %r12d, %ebp | |
| ; SSE2-NEXT: shrl $16, %ebp | |
| ; SSE2-NEXT: movl %r15d, %eax | |
| ; SSE2-NEXT: shrl $16, %eax | |
| ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %ebp, %eax | |
| ; SSE2-NEXT: shll $16, %eax | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %r12d, %r15d | |
| ; SSE2-NEXT: movzwl %r15w, %r15d | |
| ; SSE2-NEXT: orl %eax, %r15d | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %r13d, %ebx | |
| ; SSE2-NEXT: shll $16, %ebx | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %r14d, %r11d | |
| ; SSE2-NEXT: movzwl %r11w, %r11d | |
| ; SSE2-NEXT: orl %ebx, %r11d | |
| ; SSE2-NEXT: shlq $32, %r11 | |
| ; SSE2-NEXT: orq %r15, %r11 | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %r10d, %r9d | |
| ; SSE2-NEXT: shll $16, %r9d | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %r8d, %esi | |
| ; SSE2-NEXT: movzwl %si, %eax | |
| ; SSE2-NEXT: orl %r9d, %eax | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel %edi, %ecx | |
| ; SSE2-NEXT: shll $16, %ecx | |
| ; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmovnel {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Folded Reload | |
| ; SSE2-NEXT: movzwl %dx, %edx | |
| ; SSE2-NEXT: orl %ecx, %edx | |
| ; SSE2-NEXT: shlq $32, %rdx | |
| ; SSE2-NEXT: orq %rax, %rdx | |
| ; SSE2-NEXT: movq %rdx, %xmm0 | |
| ; SSE2-NEXT: movq %r11, %xmm1 | |
| ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r12 | |
| ; SSE2-NEXT: popq %r13 | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: popq %r15 | |
| ; SSE2-NEXT: popq %rbp | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX512-LABEL: vselect_v8bf16: | |
| ; AVX512: # %bb.0: | |
| ; AVX512-NEXT: vpsllw $15, %xmm0, %xmm0 | |
| ; AVX512-NEXT: vpmovw2m %xmm0, %k1 | |
| ; AVX512-NEXT: vpblendmw %xmm1, %xmm2, %xmm0 {%k1} | |
| ; AVX512-NEXT: retq | |
| ; | |
| ; AVXNC-LABEL: vselect_v8bf16: | |
| ; AVXNC: # %bb.0: | |
| ; AVXNC-NEXT: vpsllw $15, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpsraw $15, %xmm0, %xmm0 | |
| ; AVXNC-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 | |
| ; AVXNC-NEXT: retq | |
| ; | |
| ; AVX512BW-LABEL: vselect_v8bf16: | |
| ; AVX512BW: # %bb.0: | |
| ; AVX512BW-NEXT: vpsllw $15, %xmm0, %xmm0 | |
| ; AVX512BW-NEXT: vpmovw2m %xmm0, %k1 | |
| ; AVX512BW-NEXT: vpblendmw %xmm1, %xmm2, %xmm0 {%k1} | |
| ; AVX512BW-NEXT: retq | |
| %sel = select <8 x i1> %m, <8 x bfloat> %a, <8 x bfloat> %b | |
| ret <8 x bfloat> %sel | |
| } | |
| define half @bitcast_f32_hi16(float %f) { | |
| ; X86-LABEL: bitcast_f32_hi16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: bitcast_f32_hi16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: psrld $16, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: bitcast_f32_hi16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vpsrld $16, %xmm0, %xmm0 | |
| ; AVX-NEXT: retq | |
| %i = bitcast float %f to i32 | |
| %s = lshr i32 %i, 16 | |
| %t = trunc i32 %s to i16 | |
| %h = bitcast i16 %t to half | |
| ret half %h | |
| } | |
| define <8 x i16> @insert_f32_hi16(<8 x i16> %vec, float %f) { | |
| ; X86-LABEL: insert_f32_hi16: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpinsrw $1, {{[0-9]+}}(%esp), %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: insert_f32_hi16: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movd %xmm1, %eax | |
| ; SSE2-NEXT: shrl $16, %eax | |
| ; SSE2-NEXT: pinsrw $1, %eax, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: insert_f32_hi16: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7] | |
| ; AVX-NEXT: retq | |
| %i = bitcast float %f to i32 | |
| %s = lshr i32 %i, 16 | |
| %t = trunc i32 %s to i16 | |
| %ins = insertelement <8 x i16> %vec, i16 %t, i32 1 | |
| ret <8 x i16> %ins | |
| } | |
| define <8 x i16> @insert_f32_hi16_lane2(<8 x i16> %vec, float %f) { | |
| ; X86-LABEL: insert_f32_hi16_lane2: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: vpinsrw $2, {{[0-9]+}}(%esp), %xmm0, %xmm0 | |
| ; X86-NEXT: retl | |
| ; | |
| ; SSE2-LABEL: insert_f32_hi16_lane2: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: movd %xmm1, %eax | |
| ; SSE2-NEXT: shrl $16, %eax | |
| ; SSE2-NEXT: pinsrw $2, %eax, %xmm0 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX-LABEL: insert_f32_hi16_lane2: | |
| ; AVX: # %bb.0: | |
| ; AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero | |
| ; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7] | |
| ; AVX-NEXT: retq | |
| %i = bitcast float %f to i32 | |
| %s = lshr i32 %i, 16 | |
| %t = trunc i32 %s to i16 | |
| %ins = insertelement <8 x i16> %vec, i16 %t, i32 2 | |
| ret <8 x i16> %ins | |
| } |