brintos

brintos / llvm-project-archived public Read only

0
0
Text · 87.3 KiB · 7bccd6b Raw
2267 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-linux-gnu -mattr=avx512bf16,avx512fp16,avx512vl | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,SSE24; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avx512bf16,avx512vl | FileCheck %s --check-prefixes=X64,AVX,AVX512,AVX512BF165; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avx512bf16,avx512fp16,avx512vl | FileCheck %s --check-prefixes=X64,AVX,AVX512,AVX512FP166; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=avxneconvert,f16c | FileCheck %s --check-prefixes=X64,AVX,AVXNC7 8define void @add(ptr %pa, ptr %pb, ptr %pc) nounwind {9; X86-LABEL: add:10; X86:       # %bb.0:11; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax12; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx13; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx14; X86-NEXT:    movzwl (%edx), %edx15; X86-NEXT:    shll $16, %edx16; X86-NEXT:    vmovd %edx, %xmm017; X86-NEXT:    movzwl (%ecx), %ecx18; X86-NEXT:    shll $16, %ecx19; X86-NEXT:    vmovd %ecx, %xmm120; X86-NEXT:    vaddss %xmm0, %xmm1, %xmm021; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm022; X86-NEXT:    vpextrw $0, %xmm0, (%eax)23; X86-NEXT:    retl24;25; SSE2-LABEL: add:26; SSE2:       # %bb.0:27; SSE2-NEXT:    pushq %rbx28; SSE2-NEXT:    movq %rdx, %rbx29; SSE2-NEXT:    movzwl (%rsi), %eax30; SSE2-NEXT:    shll $16, %eax31; SSE2-NEXT:    movd %eax, %xmm132; SSE2-NEXT:    movzwl (%rdi), %eax33; SSE2-NEXT:    shll $16, %eax34; SSE2-NEXT:    movd %eax, %xmm035; SSE2-NEXT:    addss %xmm1, %xmm036; SSE2-NEXT:    callq __truncsfbf2@PLT37; SSE2-NEXT:    pextrw $0, %xmm0, %eax38; SSE2-NEXT:    movw %ax, (%rbx)39; SSE2-NEXT:    popq %rbx40; SSE2-NEXT:    retq41;42; AVX512-LABEL: add:43; AVX512:       # %bb.0:44; AVX512-NEXT:    movzwl (%rsi), %eax45; AVX512-NEXT:    shll $16, %eax46; AVX512-NEXT:    vmovd %eax, %xmm047; AVX512-NEXT:    movzwl (%rdi), %eax48; AVX512-NEXT:    shll $16, %eax49; AVX512-NEXT:    vmovd %eax, %xmm150; AVX512-NEXT:    vaddss %xmm0, %xmm1, %xmm051; AVX512-NEXT:    vcvtneps2bf16 %xmm0, %xmm052; AVX512-NEXT:    vpextrw $0, %xmm0, (%rdx)53; AVX512-NEXT:    retq54;55; AVXNC-LABEL: add:56; AVXNC:       # %bb.0:57; AVXNC-NEXT:    movzwl (%rsi), %eax58; AVXNC-NEXT:    shll $16, %eax59; AVXNC-NEXT:    vmovd %eax, %xmm060; AVXNC-NEXT:    movzwl (%rdi), %eax61; AVXNC-NEXT:    shll $16, %eax62; AVXNC-NEXT:    vmovd %eax, %xmm163; AVXNC-NEXT:    vaddss %xmm0, %xmm1, %xmm064; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm065; AVXNC-NEXT:    vpextrw $0, %xmm0, (%rdx)66; AVXNC-NEXT:    retq67  %a = load bfloat, ptr %pa68  %b = load bfloat, ptr %pb69  %add = fadd bfloat %a, %b70  store bfloat %add, ptr %pc71  ret void72}73 74define bfloat @add2(bfloat %a, bfloat %b) nounwind {75; X86-LABEL: add2:76; X86:       # %bb.0:77; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax78; X86-NEXT:    shll $16, %eax79; X86-NEXT:    vmovd %eax, %xmm080; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax81; X86-NEXT:    shll $16, %eax82; X86-NEXT:    vmovd %eax, %xmm183; X86-NEXT:    vaddss %xmm0, %xmm1, %xmm084; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm085; X86-NEXT:    retl86;87; SSE2-LABEL: add2:88; SSE2:       # %bb.0:89; SSE2-NEXT:    pushq %rax90; SSE2-NEXT:    pextrw $0, %xmm0, %eax91; SSE2-NEXT:    pextrw $0, %xmm1, %ecx92; SSE2-NEXT:    shll $16, %ecx93; SSE2-NEXT:    movd %ecx, %xmm194; SSE2-NEXT:    shll $16, %eax95; SSE2-NEXT:    movd %eax, %xmm096; SSE2-NEXT:    addss %xmm1, %xmm097; SSE2-NEXT:    callq __truncsfbf2@PLT98; SSE2-NEXT:    popq %rax99; SSE2-NEXT:    retq100;101; AVX512BF16-LABEL: add2:102; AVX512BF16:       # %bb.0:103; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax104; AVX512BF16-NEXT:    vpextrw $0, %xmm1, %ecx105; AVX512BF16-NEXT:    shll $16, %ecx106; AVX512BF16-NEXT:    vmovd %ecx, %xmm0107; AVX512BF16-NEXT:    shll $16, %eax108; AVX512BF16-NEXT:    vmovd %eax, %xmm1109; AVX512BF16-NEXT:    vaddss %xmm0, %xmm1, %xmm0110; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0111; AVX512BF16-NEXT:    retq112;113; AVX512FP16-LABEL: add2:114; AVX512FP16:       # %bb.0:115; AVX512FP16-NEXT:    vmovw %xmm0, %eax116; AVX512FP16-NEXT:    vmovw %xmm1, %ecx117; AVX512FP16-NEXT:    shll $16, %ecx118; AVX512FP16-NEXT:    vmovd %ecx, %xmm0119; AVX512FP16-NEXT:    shll $16, %eax120; AVX512FP16-NEXT:    vmovd %eax, %xmm1121; AVX512FP16-NEXT:    vaddss %xmm0, %xmm1, %xmm0122; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0123; AVX512FP16-NEXT:    retq124;125; AVXNC-LABEL: add2:126; AVXNC:       # %bb.0:127; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax128; AVXNC-NEXT:    vpextrw $0, %xmm1, %ecx129; AVXNC-NEXT:    shll $16, %ecx130; AVXNC-NEXT:    vmovd %ecx, %xmm0131; AVXNC-NEXT:    shll $16, %eax132; AVXNC-NEXT:    vmovd %eax, %xmm1133; AVXNC-NEXT:    vaddss %xmm0, %xmm1, %xmm0134; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0135; AVXNC-NEXT:    retq136  %add = fadd bfloat %a, %b137  ret bfloat %add138}139 140define void @add_double(ptr %pa, ptr %pb, ptr %pc) nounwind {141; X86-LABEL: add_double:142; X86:       # %bb.0:143; X86-NEXT:    pushl %ebx144; X86-NEXT:    pushl %edi145; X86-NEXT:    pushl %esi146; X86-NEXT:    subl $16, %esp147; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi148; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx149; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax150; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero151; X86-NEXT:    vmovsd %xmm0, (%esp)152; X86-NEXT:    calll __truncdfbf2153; X86-NEXT:    vmovw %xmm0, %edi154; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero155; X86-NEXT:    vmovsd %xmm0, (%esp)156; X86-NEXT:    calll __truncdfbf2157; X86-NEXT:    vmovw %xmm0, %eax158; X86-NEXT:    shll $16, %eax159; X86-NEXT:    vmovd %eax, %xmm0160; X86-NEXT:    shll $16, %edi161; X86-NEXT:    vmovd %edi, %xmm1162; X86-NEXT:    vaddss %xmm0, %xmm1, %xmm0163; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm0164; X86-NEXT:    vmovw %xmm0, %eax165; X86-NEXT:    shll $16, %eax166; X86-NEXT:    vmovd %eax, %xmm0167; X86-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0168; X86-NEXT:    vmovsd %xmm0, (%esi)169; X86-NEXT:    addl $16, %esp170; X86-NEXT:    popl %esi171; X86-NEXT:    popl %edi172; X86-NEXT:    popl %ebx173; X86-NEXT:    retl174;175; SSE2-LABEL: add_double:176; SSE2:       # %bb.0:177; SSE2-NEXT:    pushq %rbp178; SSE2-NEXT:    pushq %r14179; SSE2-NEXT:    pushq %rbx180; SSE2-NEXT:    movq %rdx, %rbx181; SSE2-NEXT:    movq %rsi, %r14182; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero183; SSE2-NEXT:    callq __truncdfbf2@PLT184; SSE2-NEXT:    pextrw $0, %xmm0, %ebp185; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero186; SSE2-NEXT:    callq __truncdfbf2@PLT187; SSE2-NEXT:    pextrw $0, %xmm0, %eax188; SSE2-NEXT:    shll $16, %eax189; SSE2-NEXT:    movd %eax, %xmm1190; SSE2-NEXT:    shll $16, %ebp191; SSE2-NEXT:    movd %ebp, %xmm0192; SSE2-NEXT:    addss %xmm1, %xmm0193; SSE2-NEXT:    callq __truncsfbf2@PLT194; SSE2-NEXT:    pextrw $0, %xmm0, %eax195; SSE2-NEXT:    shll $16, %eax196; SSE2-NEXT:    movd %eax, %xmm0197; SSE2-NEXT:    cvtss2sd %xmm0, %xmm0198; SSE2-NEXT:    movsd %xmm0, (%rbx)199; SSE2-NEXT:    popq %rbx200; SSE2-NEXT:    popq %r14201; SSE2-NEXT:    popq %rbp202; SSE2-NEXT:    retq203;204; AVX512BF16-LABEL: add_double:205; AVX512BF16:       # %bb.0:206; AVX512BF16-NEXT:    pushq %rbp207; AVX512BF16-NEXT:    pushq %r14208; AVX512BF16-NEXT:    pushq %rbx209; AVX512BF16-NEXT:    movq %rdx, %rbx210; AVX512BF16-NEXT:    movq %rsi, %r14211; AVX512BF16-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero212; AVX512BF16-NEXT:    callq __truncdfbf2@PLT213; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %ebp214; AVX512BF16-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero215; AVX512BF16-NEXT:    callq __truncdfbf2@PLT216; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax217; AVX512BF16-NEXT:    shll $16, %eax218; AVX512BF16-NEXT:    vmovd %eax, %xmm0219; AVX512BF16-NEXT:    shll $16, %ebp220; AVX512BF16-NEXT:    vmovd %ebp, %xmm1221; AVX512BF16-NEXT:    vaddss %xmm0, %xmm1, %xmm0222; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0223; AVX512BF16-NEXT:    vmovd %xmm0, %eax224; AVX512BF16-NEXT:    shll $16, %eax225; AVX512BF16-NEXT:    vmovd %eax, %xmm0226; AVX512BF16-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0227; AVX512BF16-NEXT:    vmovsd %xmm0, (%rbx)228; AVX512BF16-NEXT:    popq %rbx229; AVX512BF16-NEXT:    popq %r14230; AVX512BF16-NEXT:    popq %rbp231; AVX512BF16-NEXT:    retq232;233; AVX512FP16-LABEL: add_double:234; AVX512FP16:       # %bb.0:235; AVX512FP16-NEXT:    pushq %rbp236; AVX512FP16-NEXT:    pushq %r14237; AVX512FP16-NEXT:    pushq %rbx238; AVX512FP16-NEXT:    movq %rdx, %rbx239; AVX512FP16-NEXT:    movq %rsi, %r14240; AVX512FP16-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero241; AVX512FP16-NEXT:    callq __truncdfbf2@PLT242; AVX512FP16-NEXT:    vmovw %xmm0, %ebp243; AVX512FP16-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero244; AVX512FP16-NEXT:    callq __truncdfbf2@PLT245; AVX512FP16-NEXT:    vmovw %xmm0, %eax246; AVX512FP16-NEXT:    shll $16, %eax247; AVX512FP16-NEXT:    vmovd %eax, %xmm0248; AVX512FP16-NEXT:    shll $16, %ebp249; AVX512FP16-NEXT:    vmovd %ebp, %xmm1250; AVX512FP16-NEXT:    vaddss %xmm0, %xmm1, %xmm0251; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0252; AVX512FP16-NEXT:    vmovw %xmm0, %eax253; AVX512FP16-NEXT:    shll $16, %eax254; AVX512FP16-NEXT:    vmovd %eax, %xmm0255; AVX512FP16-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0256; AVX512FP16-NEXT:    vmovsd %xmm0, (%rbx)257; AVX512FP16-NEXT:    popq %rbx258; AVX512FP16-NEXT:    popq %r14259; AVX512FP16-NEXT:    popq %rbp260; AVX512FP16-NEXT:    retq261;262; AVXNC-LABEL: add_double:263; AVXNC:       # %bb.0:264; AVXNC-NEXT:    pushq %rbp265; AVXNC-NEXT:    pushq %r14266; AVXNC-NEXT:    pushq %rbx267; AVXNC-NEXT:    movq %rdx, %rbx268; AVXNC-NEXT:    movq %rsi, %r14269; AVXNC-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero270; AVXNC-NEXT:    callq __truncdfbf2@PLT271; AVXNC-NEXT:    vpextrw $0, %xmm0, %ebp272; AVXNC-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero273; AVXNC-NEXT:    callq __truncdfbf2@PLT274; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax275; AVXNC-NEXT:    shll $16, %eax276; AVXNC-NEXT:    vmovd %eax, %xmm0277; AVXNC-NEXT:    shll $16, %ebp278; AVXNC-NEXT:    vmovd %ebp, %xmm1279; AVXNC-NEXT:    vaddss %xmm0, %xmm1, %xmm0280; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0281; AVXNC-NEXT:    vmovd %xmm0, %eax282; AVXNC-NEXT:    shll $16, %eax283; AVXNC-NEXT:    vmovd %eax, %xmm0284; AVXNC-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0285; AVXNC-NEXT:    vmovsd %xmm0, (%rbx)286; AVXNC-NEXT:    popq %rbx287; AVXNC-NEXT:    popq %r14288; AVXNC-NEXT:    popq %rbp289; AVXNC-NEXT:    retq290  %la = load double, ptr %pa291  %a = fptrunc double %la to bfloat292  %lb = load double, ptr %pb293  %b = fptrunc double %lb to bfloat294  %add = fadd bfloat %a, %b295  %dadd = fpext bfloat %add to double296  store double %dadd, ptr %pc297  ret void298}299 300define double @add_double2(double %da, double %db) nounwind {301; X86-LABEL: add_double2:302; X86:       # %bb.0:303; X86-NEXT:    pushl %esi304; X86-NEXT:    subl $24, %esp305; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero306; X86-NEXT:    vmovsd %xmm0, (%esp)307; X86-NEXT:    calll __truncdfbf2308; X86-NEXT:    vmovw %xmm0, %esi309; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero310; X86-NEXT:    vmovsd %xmm0, (%esp)311; X86-NEXT:    calll __truncdfbf2312; X86-NEXT:    vmovw %xmm0, %eax313; X86-NEXT:    shll $16, %eax314; X86-NEXT:    vmovd %eax, %xmm0315; X86-NEXT:    shll $16, %esi316; X86-NEXT:    vmovd %esi, %xmm1317; X86-NEXT:    vaddss %xmm0, %xmm1, %xmm0318; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm0319; X86-NEXT:    vmovw %xmm0, %eax320; X86-NEXT:    shll $16, %eax321; X86-NEXT:    vmovd %eax, %xmm0322; X86-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0323; X86-NEXT:    vmovsd %xmm0, {{[0-9]+}}(%esp)324; X86-NEXT:    fldl {{[0-9]+}}(%esp)325; X86-NEXT:    addl $24, %esp326; X86-NEXT:    popl %esi327; X86-NEXT:    retl328;329; SSE2-LABEL: add_double2:330; SSE2:       # %bb.0:331; SSE2-NEXT:    pushq %rbx332; SSE2-NEXT:    subq $16, %rsp333; SSE2-NEXT:    movsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill334; SSE2-NEXT:    callq __truncdfbf2@PLT335; SSE2-NEXT:    pextrw $0, %xmm0, %ebx336; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload337; SSE2-NEXT:    # xmm0 = mem[0],zero338; SSE2-NEXT:    callq __truncdfbf2@PLT339; SSE2-NEXT:    pextrw $0, %xmm0, %eax340; SSE2-NEXT:    shll $16, %eax341; SSE2-NEXT:    movd %eax, %xmm1342; SSE2-NEXT:    shll $16, %ebx343; SSE2-NEXT:    movd %ebx, %xmm0344; SSE2-NEXT:    addss %xmm1, %xmm0345; SSE2-NEXT:    callq __truncsfbf2@PLT346; SSE2-NEXT:    pextrw $0, %xmm0, %eax347; SSE2-NEXT:    shll $16, %eax348; SSE2-NEXT:    movd %eax, %xmm0349; SSE2-NEXT:    cvtss2sd %xmm0, %xmm0350; SSE2-NEXT:    addq $16, %rsp351; SSE2-NEXT:    popq %rbx352; SSE2-NEXT:    retq353;354; AVX512BF16-LABEL: add_double2:355; AVX512BF16:       # %bb.0:356; AVX512BF16-NEXT:    pushq %rbx357; AVX512BF16-NEXT:    subq $16, %rsp358; AVX512BF16-NEXT:    vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill359; AVX512BF16-NEXT:    callq __truncdfbf2@PLT360; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %ebx361; AVX512BF16-NEXT:    vmovq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload362; AVX512BF16-NEXT:    # xmm0 = mem[0],zero363; AVX512BF16-NEXT:    callq __truncdfbf2@PLT364; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax365; AVX512BF16-NEXT:    shll $16, %eax366; AVX512BF16-NEXT:    vmovd %eax, %xmm0367; AVX512BF16-NEXT:    shll $16, %ebx368; AVX512BF16-NEXT:    vmovd %ebx, %xmm1369; AVX512BF16-NEXT:    vaddss %xmm0, %xmm1, %xmm0370; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0371; AVX512BF16-NEXT:    vmovd %xmm0, %eax372; AVX512BF16-NEXT:    shll $16, %eax373; AVX512BF16-NEXT:    vmovd %eax, %xmm0374; AVX512BF16-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0375; AVX512BF16-NEXT:    addq $16, %rsp376; AVX512BF16-NEXT:    popq %rbx377; AVX512BF16-NEXT:    retq378;379; AVX512FP16-LABEL: add_double2:380; AVX512FP16:       # %bb.0:381; AVX512FP16-NEXT:    pushq %rbx382; AVX512FP16-NEXT:    subq $16, %rsp383; AVX512FP16-NEXT:    vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill384; AVX512FP16-NEXT:    callq __truncdfbf2@PLT385; AVX512FP16-NEXT:    vmovw %xmm0, %ebx386; AVX512FP16-NEXT:    vmovsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload387; AVX512FP16-NEXT:    # xmm0 = mem[0],zero388; AVX512FP16-NEXT:    callq __truncdfbf2@PLT389; AVX512FP16-NEXT:    vmovw %xmm0, %eax390; AVX512FP16-NEXT:    shll $16, %eax391; AVX512FP16-NEXT:    vmovd %eax, %xmm0392; AVX512FP16-NEXT:    shll $16, %ebx393; AVX512FP16-NEXT:    vmovd %ebx, %xmm1394; AVX512FP16-NEXT:    vaddss %xmm0, %xmm1, %xmm0395; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0396; AVX512FP16-NEXT:    vmovw %xmm0, %eax397; AVX512FP16-NEXT:    shll $16, %eax398; AVX512FP16-NEXT:    vmovd %eax, %xmm0399; AVX512FP16-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0400; AVX512FP16-NEXT:    addq $16, %rsp401; AVX512FP16-NEXT:    popq %rbx402; AVX512FP16-NEXT:    retq403;404; AVXNC-LABEL: add_double2:405; AVXNC:       # %bb.0:406; AVXNC-NEXT:    pushq %rbx407; AVXNC-NEXT:    subq $16, %rsp408; AVXNC-NEXT:    vmovsd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill409; AVXNC-NEXT:    callq __truncdfbf2@PLT410; AVXNC-NEXT:    vpextrw $0, %xmm0, %ebx411; AVXNC-NEXT:    vmovq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Folded Reload412; AVXNC-NEXT:    # xmm0 = mem[0],zero413; AVXNC-NEXT:    callq __truncdfbf2@PLT414; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax415; AVXNC-NEXT:    shll $16, %eax416; AVXNC-NEXT:    vmovd %eax, %xmm0417; AVXNC-NEXT:    shll $16, %ebx418; AVXNC-NEXT:    vmovd %ebx, %xmm1419; AVXNC-NEXT:    vaddss %xmm0, %xmm1, %xmm0420; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0421; AVXNC-NEXT:    vmovd %xmm0, %eax422; AVXNC-NEXT:    shll $16, %eax423; AVXNC-NEXT:    vmovd %eax, %xmm0424; AVXNC-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0425; AVXNC-NEXT:    addq $16, %rsp426; AVXNC-NEXT:    popq %rbx427; AVXNC-NEXT:    retq428  %a = fptrunc double %da to bfloat429  %b = fptrunc double %db to bfloat430  %add = fadd bfloat %a, %b431  %dadd = fpext bfloat %add to double432  ret double %dadd433}434 435define void @add_constant(ptr %pa, ptr %pc) nounwind {436; X86-LABEL: add_constant:437; X86:       # %bb.0:438; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax439; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx440; X86-NEXT:    movzwl (%ecx), %ecx441; X86-NEXT:    shll $16, %ecx442; X86-NEXT:    vmovd %ecx, %xmm0443; X86-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0444; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm0445; X86-NEXT:    vpextrw $0, %xmm0, (%eax)446; X86-NEXT:    retl447;448; SSE2-LABEL: add_constant:449; SSE2:       # %bb.0:450; SSE2-NEXT:    pushq %rbx451; SSE2-NEXT:    movq %rsi, %rbx452; SSE2-NEXT:    movzwl (%rdi), %eax453; SSE2-NEXT:    shll $16, %eax454; SSE2-NEXT:    movd %eax, %xmm0455; SSE2-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0456; SSE2-NEXT:    callq __truncsfbf2@PLT457; SSE2-NEXT:    pextrw $0, %xmm0, %eax458; SSE2-NEXT:    movw %ax, (%rbx)459; SSE2-NEXT:    popq %rbx460; SSE2-NEXT:    retq461;462; AVX512-LABEL: add_constant:463; AVX512:       # %bb.0:464; AVX512-NEXT:    movzwl (%rdi), %eax465; AVX512-NEXT:    shll $16, %eax466; AVX512-NEXT:    vmovd %eax, %xmm0467; AVX512-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0468; AVX512-NEXT:    vcvtneps2bf16 %xmm0, %xmm0469; AVX512-NEXT:    vpextrw $0, %xmm0, (%rsi)470; AVX512-NEXT:    retq471;472; AVXNC-LABEL: add_constant:473; AVXNC:       # %bb.0:474; AVXNC-NEXT:    movzwl (%rdi), %eax475; AVXNC-NEXT:    shll $16, %eax476; AVXNC-NEXT:    vmovd %eax, %xmm0477; AVXNC-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0478; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0479; AVXNC-NEXT:    vpextrw $0, %xmm0, (%rsi)480; AVXNC-NEXT:    retq481  %a = load bfloat, ptr %pa482  %add = fadd bfloat %a, 1.0483  store bfloat %add, ptr %pc484  ret void485}486 487define bfloat @add_constant2(bfloat %a) nounwind {488; X86-LABEL: add_constant2:489; X86:       # %bb.0:490; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax491; X86-NEXT:    shll $16, %eax492; X86-NEXT:    vmovd %eax, %xmm0493; X86-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0494; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm0495; X86-NEXT:    retl496;497; SSE2-LABEL: add_constant2:498; SSE2:       # %bb.0:499; SSE2-NEXT:    pushq %rax500; SSE2-NEXT:    pextrw $0, %xmm0, %eax501; SSE2-NEXT:    shll $16, %eax502; SSE2-NEXT:    movd %eax, %xmm0503; SSE2-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0504; SSE2-NEXT:    callq __truncsfbf2@PLT505; SSE2-NEXT:    popq %rax506; SSE2-NEXT:    retq507;508; AVX512BF16-LABEL: add_constant2:509; AVX512BF16:       # %bb.0:510; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax511; AVX512BF16-NEXT:    shll $16, %eax512; AVX512BF16-NEXT:    vmovd %eax, %xmm0513; AVX512BF16-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0514; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0515; AVX512BF16-NEXT:    retq516;517; AVX512FP16-LABEL: add_constant2:518; AVX512FP16:       # %bb.0:519; AVX512FP16-NEXT:    vmovw %xmm0, %eax520; AVX512FP16-NEXT:    shll $16, %eax521; AVX512FP16-NEXT:    vmovd %eax, %xmm0522; AVX512FP16-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0523; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0524; AVX512FP16-NEXT:    retq525;526; AVXNC-LABEL: add_constant2:527; AVXNC:       # %bb.0:528; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax529; AVXNC-NEXT:    shll $16, %eax530; AVXNC-NEXT:    vmovd %eax, %xmm0531; AVXNC-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0532; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0533; AVXNC-NEXT:    retq534  %add = fadd bfloat %a, 1.0535  ret bfloat %add536}537 538define void @store_constant(ptr %pc) nounwind {539; X86-LABEL: store_constant:540; X86:       # %bb.0:541; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax542; X86-NEXT:    movw $16256, (%eax) # imm = 0x3F80543; X86-NEXT:    retl544;545; X64-LABEL: store_constant:546; X64:       # %bb.0:547; X64-NEXT:    movw $16256, (%rdi) # imm = 0x3F80548; X64-NEXT:    retq549  store bfloat 1.0, ptr %pc550  ret void551}552 553define void @fold_ext_trunc(ptr %pa, ptr %pc) nounwind {554; X86-LABEL: fold_ext_trunc:555; X86:       # %bb.0:556; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax557; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx558; X86-NEXT:    movzwl (%ecx), %ecx559; X86-NEXT:    movw %cx, (%eax)560; X86-NEXT:    retl561;562; X64-LABEL: fold_ext_trunc:563; X64:       # %bb.0:564; X64-NEXT:    movzwl (%rdi), %eax565; X64-NEXT:    movw %ax, (%rsi)566; X64-NEXT:    retq567  %a = load bfloat, ptr %pa568  %ext = fpext bfloat %a to float569  %trunc = fptrunc float %ext to bfloat570  store bfloat %trunc, ptr %pc571  ret void572}573 574define bfloat @fold_ext_trunc2(bfloat %a) nounwind {575; X86-LABEL: fold_ext_trunc2:576; X86:       # %bb.0:577; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero578; X86-NEXT:    retl579;580; X64-LABEL: fold_ext_trunc2:581; X64:       # %bb.0:582; X64-NEXT:    retq583  %ext = fpext bfloat %a to float584  %trunc = fptrunc float %ext to bfloat585  ret bfloat %trunc586}587 588define bfloat @fold_from_half(half %a) nounwind {589; X86-LABEL: fold_from_half:590; X86:       # %bb.0:591; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero592; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0593; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm0594; X86-NEXT:    retl595;596; SSE2-LABEL: fold_from_half:597; SSE2:       # %bb.0:598; SSE2-NEXT:    pushq %rax599; SSE2-NEXT:    callq __extendhfsf2@PLT600; SSE2-NEXT:    callq __truncsfbf2@PLT601; SSE2-NEXT:    popq %rax602; SSE2-NEXT:    retq603;604; AVX512BF16-LABEL: fold_from_half:605; AVX512BF16:       # %bb.0:606; AVX512BF16-NEXT:    vcvtph2ps %xmm0, %xmm0607; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0608; AVX512BF16-NEXT:    retq609;610; AVX512FP16-LABEL: fold_from_half:611; AVX512FP16:       # %bb.0:612; AVX512FP16-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0613; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm0614; AVX512FP16-NEXT:    retq615;616; AVXNC-LABEL: fold_from_half:617; AVXNC:       # %bb.0:618; AVXNC-NEXT:    vcvtph2ps %xmm0, %xmm0619; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm0620; AVXNC-NEXT:    retq621  %ext = fpext half %a to float622  %trunc = fptrunc float %ext to bfloat623  ret bfloat %trunc624}625 626define half @fold_to_half(bfloat %a) nounwind {627; X86-LABEL: fold_to_half:628; X86:       # %bb.0:629; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax630; X86-NEXT:    shll $16, %eax631; X86-NEXT:    vmovd %eax, %xmm0632; X86-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0633; X86-NEXT:    retl634;635; SSE2-LABEL: fold_to_half:636; SSE2:       # %bb.0:637; SSE2-NEXT:    pushq %rax638; SSE2-NEXT:    pextrw $0, %xmm0, %eax639; SSE2-NEXT:    shll $16, %eax640; SSE2-NEXT:    movd %eax, %xmm0641; SSE2-NEXT:    callq __truncsfhf2@PLT642; SSE2-NEXT:    popq %rax643; SSE2-NEXT:    retq644;645; AVX512BF16-LABEL: fold_to_half:646; AVX512BF16:       # %bb.0:647; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax648; AVX512BF16-NEXT:    shll $16, %eax649; AVX512BF16-NEXT:    vmovd %eax, %xmm0650; AVX512BF16-NEXT:    vcvtps2ph $4, %xmm0, %xmm0651; AVX512BF16-NEXT:    retq652;653; AVX512FP16-LABEL: fold_to_half:654; AVX512FP16:       # %bb.0:655; AVX512FP16-NEXT:    vmovw %xmm0, %eax656; AVX512FP16-NEXT:    shll $16, %eax657; AVX512FP16-NEXT:    vmovd %eax, %xmm0658; AVX512FP16-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0659; AVX512FP16-NEXT:    retq660;661; AVXNC-LABEL: fold_to_half:662; AVXNC:       # %bb.0:663; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax664; AVXNC-NEXT:    shll $16, %eax665; AVXNC-NEXT:    vmovd %eax, %xmm0666; AVXNC-NEXT:    vcvtps2ph $4, %xmm0, %xmm0667; AVXNC-NEXT:    retq668  %ext = fpext bfloat %a to float669  %trunc = fptrunc float %ext to half670  ret half %trunc671}672 673define bfloat @bitcast_from_half(half %a) nounwind {674; X86-LABEL: bitcast_from_half:675; X86:       # %bb.0:676; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero677; X86-NEXT:    retl678;679; X64-LABEL: bitcast_from_half:680; X64:       # %bb.0:681; X64-NEXT:    retq682  %bc = bitcast half %a to bfloat683  ret bfloat %bc684}685 686define half @bitcast_to_half(bfloat %a) nounwind {687; X86-LABEL: bitcast_to_half:688; X86:       # %bb.0:689; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero690; X86-NEXT:    retl691;692; X64-LABEL: bitcast_to_half:693; X64:       # %bb.0:694; X64-NEXT:    retq695  %bc = bitcast bfloat %a to half696  ret half %bc697}698 699define <8 x bfloat> @addv(<8 x bfloat> %a, <8 x bfloat> %b) nounwind {700; X86-LABEL: addv:701; X86:       # %bb.0:702; 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],zero703; X86-NEXT:    vpslld $16, %ymm1, %ymm1704; 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],zero705; X86-NEXT:    vpslld $16, %ymm0, %ymm0706; X86-NEXT:    vaddps %ymm1, %ymm0, %ymm0707; X86-NEXT:    vcvtneps2bf16 %ymm0, %xmm0708; X86-NEXT:    vzeroupper709; X86-NEXT:    retl710;711; SSE2-LABEL: addv:712; SSE2:       # %bb.0:713; SSE2-NEXT:    pushq %rbp714; SSE2-NEXT:    pushq %r15715; SSE2-NEXT:    pushq %r14716; SSE2-NEXT:    pushq %r13717; SSE2-NEXT:    pushq %r12718; SSE2-NEXT:    pushq %rbx719; SSE2-NEXT:    subq $56, %rsp720; SSE2-NEXT:    movq %xmm0, %rcx721; SSE2-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill722; SSE2-NEXT:    movq %rcx, %rax723; SSE2-NEXT:    shrq $48, %rax724; SSE2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill725; SSE2-NEXT:    movq %xmm1, %rdx726; SSE2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill727; SSE2-NEXT:    movq %rdx, %rax728; SSE2-NEXT:    shrq $48, %rax729; SSE2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill730; SSE2-NEXT:    movq %rcx, %rax731; SSE2-NEXT:    shrq $32, %rax732; SSE2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill733; SSE2-NEXT:    movq %rdx, %rax734; SSE2-NEXT:    shrq $32, %rax735; SSE2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill736; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]737; SSE2-NEXT:    movq %xmm0, %r15738; SSE2-NEXT:    movq %r15, %rbx739; SSE2-NEXT:    shrq $48, %rbx740; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1,1]741; SSE2-NEXT:    movq %xmm1, %r14742; SSE2-NEXT:    movq %r14, %rbp743; SSE2-NEXT:    shrq $48, %rbp744; SSE2-NEXT:    movq %r15, %r12745; SSE2-NEXT:    shrq $32, %r12746; SSE2-NEXT:    movq %r14, %r13747; SSE2-NEXT:    shrq $32, %r13748; SSE2-NEXT:    movl %r14d, %eax749; SSE2-NEXT:    shll $16, %eax750; SSE2-NEXT:    movd %eax, %xmm1751; SSE2-NEXT:    movl %r15d, %eax752; SSE2-NEXT:    shll $16, %eax753; SSE2-NEXT:    movd %eax, %xmm0754; SSE2-NEXT:    addss %xmm1, %xmm0755; SSE2-NEXT:    callq __truncsfbf2@PLT756; SSE2-NEXT:    pextrw $0, %xmm0, %eax757; SSE2-NEXT:    movzwl %ax, %eax758; SSE2-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill759; SSE2-NEXT:    andl $-65536, %r14d # imm = 0xFFFF0000760; SSE2-NEXT:    movd %r14d, %xmm1761; SSE2-NEXT:    andl $-65536, %r15d # imm = 0xFFFF0000762; SSE2-NEXT:    movd %r15d, %xmm0763; SSE2-NEXT:    addss %xmm1, %xmm0764; SSE2-NEXT:    callq __truncsfbf2@PLT765; SSE2-NEXT:    pextrw $0, %xmm0, %r15d766; SSE2-NEXT:    shll $16, %r15d767; SSE2-NEXT:    addl {{[-0-9]+}}(%r{{[sb]}}p), %r15d # 4-byte Folded Reload768; SSE2-NEXT:    shll $16, %r13d769; SSE2-NEXT:    movd %r13d, %xmm1770; SSE2-NEXT:    shll $16, %r12d771; SSE2-NEXT:    movd %r12d, %xmm0772; SSE2-NEXT:    addss %xmm1, %xmm0773; SSE2-NEXT:    callq __truncsfbf2@PLT774; SSE2-NEXT:    pextrw $0, %xmm0, %eax775; SSE2-NEXT:    movzwl %ax, %r14d776; SSE2-NEXT:    shll $16, %ebp777; SSE2-NEXT:    movd %ebp, %xmm1778; SSE2-NEXT:    shll $16, %ebx779; SSE2-NEXT:    movd %ebx, %xmm0780; SSE2-NEXT:    addss %xmm1, %xmm0781; SSE2-NEXT:    callq __truncsfbf2@PLT782; SSE2-NEXT:    pextrw $0, %xmm0, %ebx783; SSE2-NEXT:    shll $16, %ebx784; SSE2-NEXT:    orl %r14d, %ebx785; SSE2-NEXT:    shlq $32, %rbx786; SSE2-NEXT:    orq %r15, %rbx787; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload788; SSE2-NEXT:    movl %r15d, %eax789; SSE2-NEXT:    shll $16, %eax790; SSE2-NEXT:    movd %eax, %xmm1791; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload792; SSE2-NEXT:    movl %r14d, %eax793; SSE2-NEXT:    shll $16, %eax794; SSE2-NEXT:    movd %eax, %xmm0795; SSE2-NEXT:    addss %xmm1, %xmm0796; SSE2-NEXT:    callq __truncsfbf2@PLT797; SSE2-NEXT:    pextrw $0, %xmm0, %eax798; SSE2-NEXT:    movzwl %ax, %ebp799; SSE2-NEXT:    movq %r15, %rax800; SSE2-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000801; SSE2-NEXT:    movd %eax, %xmm1802; SSE2-NEXT:    movq %r14, %rax803; SSE2-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000804; SSE2-NEXT:    movd %eax, %xmm0805; SSE2-NEXT:    addss %xmm1, %xmm0806; SSE2-NEXT:    callq __truncsfbf2@PLT807; SSE2-NEXT:    pextrw $0, %xmm0, %r14d808; SSE2-NEXT:    shll $16, %r14d809; SSE2-NEXT:    orl %ebp, %r14d810; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload811; SSE2-NEXT:    shll $16, %eax812; SSE2-NEXT:    movd %eax, %xmm1813; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload814; SSE2-NEXT:    shll $16, %eax815; SSE2-NEXT:    movd %eax, %xmm0816; SSE2-NEXT:    addss %xmm1, %xmm0817; SSE2-NEXT:    callq __truncsfbf2@PLT818; SSE2-NEXT:    pextrw $0, %xmm0, %eax819; SSE2-NEXT:    movzwl %ax, %ebp820; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload821; SSE2-NEXT:    shll $16, %eax822; SSE2-NEXT:    movd %eax, %xmm1823; SSE2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload824; SSE2-NEXT:    shll $16, %eax825; SSE2-NEXT:    movd %eax, %xmm0826; SSE2-NEXT:    addss %xmm1, %xmm0827; SSE2-NEXT:    callq __truncsfbf2@PLT828; SSE2-NEXT:    pextrw $0, %xmm0, %eax829; SSE2-NEXT:    shll $16, %eax830; SSE2-NEXT:    orl %ebp, %eax831; SSE2-NEXT:    shlq $32, %rax832; SSE2-NEXT:    orq %r14, %rax833; SSE2-NEXT:    movq %rax, %xmm0834; SSE2-NEXT:    movq %rbx, %xmm1835; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]836; SSE2-NEXT:    addq $56, %rsp837; SSE2-NEXT:    popq %rbx838; SSE2-NEXT:    popq %r12839; SSE2-NEXT:    popq %r13840; SSE2-NEXT:    popq %r14841; SSE2-NEXT:    popq %r15842; SSE2-NEXT:    popq %rbp843; SSE2-NEXT:    retq844;845; AVX512-LABEL: addv:846; AVX512:       # %bb.0:847; 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],zero848; AVX512-NEXT:    vpslld $16, %ymm1, %ymm1849; 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],zero850; AVX512-NEXT:    vpslld $16, %ymm0, %ymm0851; AVX512-NEXT:    vaddps %ymm1, %ymm0, %ymm0852; AVX512-NEXT:    vcvtneps2bf16 %ymm0, %xmm0853; AVX512-NEXT:    vzeroupper854; AVX512-NEXT:    retq855;856; AVXNC-LABEL: addv:857; AVXNC:       # %bb.0:858; 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],zero859; AVXNC-NEXT:    vpslld $16, %ymm1, %ymm1860; 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],zero861; AVXNC-NEXT:    vpslld $16, %ymm0, %ymm0862; AVXNC-NEXT:    vaddps %ymm1, %ymm0, %ymm0863; AVXNC-NEXT:    {vex} vcvtneps2bf16 %ymm0, %xmm0864; AVXNC-NEXT:    vzeroupper865; AVXNC-NEXT:    retq866  %add = fadd <8 x bfloat> %a, %b867  ret <8 x bfloat> %add868}869 870define <2 x bfloat> @pr62997(bfloat %a, bfloat %b) {871; X86-LABEL: pr62997:872; X86:       # %bb.0:873; X86-NEXT:    vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero874; X86-NEXT:    vmovsh {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero875; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]876; X86-NEXT:    retl877;878; SSE2-LABEL: pr62997:879; SSE2:       # %bb.0:880; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]881; SSE2-NEXT:    retq882;883; AVX512BF16-LABEL: pr62997:884; AVX512BF16:       # %bb.0:885; AVX512BF16-NEXT:    vpextrw $0, %xmm1, %eax886; AVX512BF16-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0887; AVX512BF16-NEXT:    retq888;889; AVX512FP16-LABEL: pr62997:890; AVX512FP16:       # %bb.0:891; AVX512FP16-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]892; AVX512FP16-NEXT:    retq893;894; AVXNC-LABEL: pr62997:895; AVXNC:       # %bb.0:896; AVXNC-NEXT:    vpextrw $0, %xmm1, %eax897; AVXNC-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm0898; AVXNC-NEXT:    retq899  %1 = insertelement <2 x bfloat> undef, bfloat %a, i64 0900  %2 = insertelement <2 x bfloat> %1, bfloat %b, i64 1901  ret <2 x bfloat> %2902}903 904define <32 x bfloat> @pr63017() {905; X86-LABEL: pr63017:906; X86:       # %bb.0:907; X86-NEXT:    vxorps %xmm0, %xmm0, %xmm0908; X86-NEXT:    retl909;910; SSE2-LABEL: pr63017:911; SSE2:       # %bb.0:912; SSE2-NEXT:    xorps %xmm0, %xmm0913; SSE2-NEXT:    xorps %xmm1, %xmm1914; SSE2-NEXT:    xorps %xmm2, %xmm2915; SSE2-NEXT:    xorps %xmm3, %xmm3916; SSE2-NEXT:    retq917;918; AVX512-LABEL: pr63017:919; AVX512:       # %bb.0:920; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0921; AVX512-NEXT:    retq922;923; AVXNC-LABEL: pr63017:924; AVXNC:       # %bb.0:925; AVXNC-NEXT:    vxorps %xmm0, %xmm0, %xmm0926; AVXNC-NEXT:    vxorps %xmm1, %xmm1, %xmm1927; AVXNC-NEXT:    retq928  ret <32 x bfloat> zeroinitializer929}930 931define <32 x bfloat> @pr63017_2() nounwind {932; X86-LABEL: pr63017_2:933; X86:       # %bb.0:934; 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]935; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1}936; X86-NEXT:    retl937;938; SSE2-LABEL: pr63017_2:939; SSE2:       # %bb.0:940; SSE2-NEXT:    testb %al, %al941; SSE2-NEXT:    jne .LBB16_1942; SSE2-NEXT:  # %bb.2: # %cond.load943; SSE2-NEXT:    movzwl (%rax), %eax944; SSE2-NEXT:    shll $16, %eax945; SSE2-NEXT:    movd %eax, %xmm0946; SSE2-NEXT:    jmp .LBB16_3947; SSE2-NEXT:  .LBB16_1:948; SSE2-NEXT:    movd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]949; SSE2-NEXT:  .LBB16_3:950; SSE2-NEXT:    pushq %r14951; SSE2-NEXT:    pushq %rbx952; SSE2-NEXT:    subq $88, %rsp953; SSE2-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill954; SSE2-NEXT:    callq __truncsfbf2@PLT955; SSE2-NEXT:    pextrw $0, %xmm0, %ebx956; SSE2-NEXT:    shll $16, %ebx957; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload958; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero959; SSE2-NEXT:    callq __truncsfbf2@PLT960; SSE2-NEXT:    pextrw $0, %xmm0, %eax961; SSE2-NEXT:    movzwl %ax, %r14d962; SSE2-NEXT:    orl %ebx, %r14d963; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload964; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero965; SSE2-NEXT:    callq __truncsfbf2@PLT966; SSE2-NEXT:    pextrw $0, %xmm0, %ebx967; SSE2-NEXT:    shll $16, %ebx968; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload969; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero970; SSE2-NEXT:    callq __truncsfbf2@PLT971; SSE2-NEXT:    pextrw $0, %xmm0, %eax972; SSE2-NEXT:    movzwl %ax, %eax973; SSE2-NEXT:    orl %ebx, %eax974; SSE2-NEXT:    shlq $32, %rax975; SSE2-NEXT:    orq %r14, %rax976; SSE2-NEXT:    movq %rax, %xmm0977; SSE2-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill978; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload979; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero980; SSE2-NEXT:    callq __truncsfbf2@PLT981; SSE2-NEXT:    pextrw $0, %xmm0, %ebx982; SSE2-NEXT:    shll $16, %ebx983; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload984; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero985; SSE2-NEXT:    callq __truncsfbf2@PLT986; SSE2-NEXT:    pextrw $0, %xmm0, %eax987; SSE2-NEXT:    movzwl %ax, %r14d988; SSE2-NEXT:    orl %ebx, %r14d989; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload990; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero991; SSE2-NEXT:    callq __truncsfbf2@PLT992; SSE2-NEXT:    pextrw $0, %xmm0, %ebx993; SSE2-NEXT:    shll $16, %ebx994; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload995; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero996; SSE2-NEXT:    callq __truncsfbf2@PLT997; SSE2-NEXT:    pextrw $0, %xmm0, %eax998; SSE2-NEXT:    movzwl %ax, %eax999; SSE2-NEXT:    orl %ebx, %eax1000; SSE2-NEXT:    shlq $32, %rax1001; SSE2-NEXT:    orq %r14, %rax1002; SSE2-NEXT:    movq %rax, %xmm01003; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1004; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1005; SSE2-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1006; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1007; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1008; SSE2-NEXT:    callq __truncsfbf2@PLT1009; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1010; SSE2-NEXT:    shll $16, %ebx1011; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1012; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1013; SSE2-NEXT:    callq __truncsfbf2@PLT1014; SSE2-NEXT:    pextrw $0, %xmm0, %eax1015; SSE2-NEXT:    movzwl %ax, %r14d1016; SSE2-NEXT:    orl %ebx, %r14d1017; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1018; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1019; SSE2-NEXT:    callq __truncsfbf2@PLT1020; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1021; SSE2-NEXT:    shll $16, %ebx1022; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1023; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1024; SSE2-NEXT:    callq __truncsfbf2@PLT1025; SSE2-NEXT:    pextrw $0, %xmm0, %eax1026; SSE2-NEXT:    movzwl %ax, %eax1027; SSE2-NEXT:    orl %ebx, %eax1028; SSE2-NEXT:    shlq $32, %rax1029; SSE2-NEXT:    orq %r14, %rax1030; SSE2-NEXT:    movq %rax, %xmm01031; SSE2-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1032; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1033; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1034; SSE2-NEXT:    callq __truncsfbf2@PLT1035; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1036; SSE2-NEXT:    shll $16, %ebx1037; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1038; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1039; SSE2-NEXT:    callq __truncsfbf2@PLT1040; SSE2-NEXT:    pextrw $0, %xmm0, %eax1041; SSE2-NEXT:    movzwl %ax, %r14d1042; SSE2-NEXT:    orl %ebx, %r14d1043; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1044; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1045; SSE2-NEXT:    callq __truncsfbf2@PLT1046; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1047; SSE2-NEXT:    shll $16, %ebx1048; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1049; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1050; SSE2-NEXT:    callq __truncsfbf2@PLT1051; SSE2-NEXT:    pextrw $0, %xmm0, %eax1052; SSE2-NEXT:    movzwl %ax, %eax1053; SSE2-NEXT:    orl %ebx, %eax1054; SSE2-NEXT:    shlq $32, %rax1055; SSE2-NEXT:    orq %r14, %rax1056; SSE2-NEXT:    movq %rax, %xmm01057; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1058; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1059; SSE2-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1060; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1061; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1062; SSE2-NEXT:    callq __truncsfbf2@PLT1063; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1064; SSE2-NEXT:    shll $16, %ebx1065; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1066; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1067; SSE2-NEXT:    callq __truncsfbf2@PLT1068; SSE2-NEXT:    pextrw $0, %xmm0, %eax1069; SSE2-NEXT:    movzwl %ax, %r14d1070; SSE2-NEXT:    orl %ebx, %r14d1071; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1072; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1073; SSE2-NEXT:    callq __truncsfbf2@PLT1074; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1075; SSE2-NEXT:    shll $16, %ebx1076; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1077; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1078; SSE2-NEXT:    callq __truncsfbf2@PLT1079; SSE2-NEXT:    pextrw $0, %xmm0, %eax1080; SSE2-NEXT:    movzwl %ax, %eax1081; SSE2-NEXT:    orl %ebx, %eax1082; SSE2-NEXT:    shlq $32, %rax1083; SSE2-NEXT:    orq %r14, %rax1084; SSE2-NEXT:    movq %rax, %xmm01085; SSE2-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1086; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1087; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1088; SSE2-NEXT:    callq __truncsfbf2@PLT1089; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1090; SSE2-NEXT:    shll $16, %ebx1091; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1092; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1093; SSE2-NEXT:    callq __truncsfbf2@PLT1094; SSE2-NEXT:    pextrw $0, %xmm0, %eax1095; SSE2-NEXT:    movzwl %ax, %r14d1096; SSE2-NEXT:    orl %ebx, %r14d1097; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1098; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1099; SSE2-NEXT:    callq __truncsfbf2@PLT1100; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1101; SSE2-NEXT:    shll $16, %ebx1102; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1103; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1104; SSE2-NEXT:    callq __truncsfbf2@PLT1105; SSE2-NEXT:    pextrw $0, %xmm0, %eax1106; SSE2-NEXT:    movzwl %ax, %eax1107; SSE2-NEXT:    orl %ebx, %eax1108; SSE2-NEXT:    shlq $32, %rax1109; SSE2-NEXT:    orq %r14, %rax1110; SSE2-NEXT:    movq %rax, %xmm01111; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1112; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1113; SSE2-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1114; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1115; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1116; SSE2-NEXT:    callq __truncsfbf2@PLT1117; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1118; SSE2-NEXT:    shll $16, %ebx1119; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1120; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1121; SSE2-NEXT:    callq __truncsfbf2@PLT1122; SSE2-NEXT:    pextrw $0, %xmm0, %eax1123; SSE2-NEXT:    movzwl %ax, %r14d1124; SSE2-NEXT:    orl %ebx, %r14d1125; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1126; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1127; SSE2-NEXT:    callq __truncsfbf2@PLT1128; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1129; SSE2-NEXT:    shll $16, %ebx1130; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1131; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1132; SSE2-NEXT:    callq __truncsfbf2@PLT1133; SSE2-NEXT:    pextrw $0, %xmm0, %eax1134; SSE2-NEXT:    movzwl %ax, %eax1135; SSE2-NEXT:    orl %ebx, %eax1136; SSE2-NEXT:    shlq $32, %rax1137; SSE2-NEXT:    orq %r14, %rax1138; SSE2-NEXT:    movq %rax, %xmm01139; SSE2-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1140; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1141; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1142; SSE2-NEXT:    callq __truncsfbf2@PLT1143; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1144; SSE2-NEXT:    shll $16, %ebx1145; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1146; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1147; SSE2-NEXT:    callq __truncsfbf2@PLT1148; SSE2-NEXT:    pextrw $0, %xmm0, %eax1149; SSE2-NEXT:    movzwl %ax, %r14d1150; SSE2-NEXT:    orl %ebx, %r14d1151; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1152; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1153; SSE2-NEXT:    callq __truncsfbf2@PLT1154; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1155; SSE2-NEXT:    shll $16, %ebx1156; SSE2-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1157; SSE2-NEXT:    # xmm0 = mem[0],zero,zero,zero1158; SSE2-NEXT:    callq __truncsfbf2@PLT1159; SSE2-NEXT:    pextrw $0, %xmm0, %eax1160; SSE2-NEXT:    movzwl %ax, %eax1161; SSE2-NEXT:    orl %ebx, %eax1162; SSE2-NEXT:    shlq $32, %rax1163; SSE2-NEXT:    orq %r14, %rax1164; SSE2-NEXT:    movq %rax, %xmm01165; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload1166; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]1167; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1168; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1169; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload1170; SSE2-NEXT:    addq $88, %rsp1171; SSE2-NEXT:    popq %rbx1172; SSE2-NEXT:    popq %r141173; SSE2-NEXT:    retq1174;1175; AVX512BF16-LABEL: pr63017_2:1176; AVX512BF16:       # %bb.0:1177; 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]1178; AVX512BF16-NEXT:    vmovdqu16 (%rax), %zmm0 {%k1}1179; AVX512BF16-NEXT:    retq1180;1181; AVX512FP16-LABEL: pr63017_2:1182; AVX512FP16:       # %bb.0:1183; 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]1184; AVX512FP16-NEXT:    vmovdqu16 (%rax), %zmm0 {%k1}1185; AVX512FP16-NEXT:    retq1186;1187; AVXNC-LABEL: pr63017_2:1188; AVXNC:       # %bb.0:1189; AVXNC-NEXT:    vbroadcastss {{.*#+}} ymm0 = [49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024,49024]1190; AVXNC-NEXT:    testb %al, %al1191; AVXNC-NEXT:    jne .LBB16_21192; AVXNC-NEXT:  # %bb.1: # %cond.load1193; AVXNC-NEXT:    vmovups (%rax), %ymm01194; AVXNC-NEXT:  .LBB16_2:1195; AVXNC-NEXT:    vmovaps %ymm0, %ymm11196; AVXNC-NEXT:    retq1197  %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>)1198  ret <32 x bfloat> %11199}1200 1201define <32 x bfloat> @pr62997_3(<32 x bfloat> %0, bfloat %1) {1202; X86-LABEL: pr62997_3:1203; X86:       # %bb.0:1204; X86-NEXT:    vpinsrw $1, {{[0-9]+}}(%esp), %xmm0, %xmm11205; X86-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm01206; X86-NEXT:    retl1207;1208; SSE2-LABEL: pr62997_3:1209; SSE2:       # %bb.0:1210; SSE2-NEXT:    movq %xmm0, %rax1211; SSE2-NEXT:    movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF000000001212; SSE2-NEXT:    andq %rax, %rcx1213; SSE2-NEXT:    movzwl %ax, %eax1214; SSE2-NEXT:    pextrw $0, %xmm4, %edx1215; SSE2-NEXT:    shll $16, %edx1216; SSE2-NEXT:    orl %eax, %edx1217; SSE2-NEXT:    orq %rcx, %rdx1218; SSE2-NEXT:    movq %rdx, %xmm41219; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]1220; SSE2-NEXT:    retq1221;1222; AVX512BF16-LABEL: pr62997_3:1223; AVX512BF16:       # %bb.0:1224; AVX512BF16-NEXT:    vpextrw $0, %xmm1, %eax1225; AVX512BF16-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm11226; AVX512BF16-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm01227; AVX512BF16-NEXT:    retq1228;1229; AVX512FP16-LABEL: pr62997_3:1230; AVX512FP16:       # %bb.0:1231; AVX512FP16-NEXT:    vmovw %xmm1, %eax1232; AVX512FP16-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm11233; AVX512FP16-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm01234; AVX512FP16-NEXT:    retq1235;1236; AVXNC-LABEL: pr62997_3:1237; AVXNC:       # %bb.0:1238; AVXNC-NEXT:    vpextrw $0, %xmm2, %eax1239; AVXNC-NEXT:    vpinsrw $1, %eax, %xmm0, %xmm21240; AVXNC-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]1241; AVXNC-NEXT:    retq1242  %3 = insertelement <32 x bfloat> %0, bfloat %1, i64 11243  ret <32 x bfloat> %31244}1245 1246declare <32 x bfloat> @llvm.masked.load.v32bf16.p0(ptr, i32, <32 x i1>, <32 x bfloat>)1247 1248define <4 x float> @pr64460_1(<4 x bfloat> %a) {1249; X86-LABEL: pr64460_1:1250; X86:       # %bb.0:1251; X86-NEXT:    vpxor %xmm1, %xmm1, %xmm11252; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1253; X86-NEXT:    retl1254;1255; SSE2-LABEL: pr64460_1:1256; SSE2:       # %bb.0:1257; SSE2-NEXT:    pxor %xmm1, %xmm11258; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1259; SSE2-NEXT:    movdqa %xmm1, %xmm01260; SSE2-NEXT:    retq1261;1262; AVX-LABEL: pr64460_1:1263; AVX:       # %bb.0:1264; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11265; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1266; AVX-NEXT:    retq1267  %b = fpext <4 x bfloat> %a to <4 x float>1268  ret <4 x float> %b1269}1270 1271define <8 x float> @pr64460_2(<8 x bfloat> %a) {1272; X86-LABEL: pr64460_2:1273; X86:       # %bb.0:1274; 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],zero1275; X86-NEXT:    vpslld $16, %ymm0, %ymm01276; X86-NEXT:    retl1277;1278; SSE2-LABEL: pr64460_2:1279; SSE2:       # %bb.0:1280; SSE2-NEXT:    pxor %xmm1, %xmm11281; SSE2-NEXT:    pxor %xmm2, %xmm21282; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]1283; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1284; SSE2-NEXT:    movdqa %xmm2, %xmm01285; SSE2-NEXT:    retq1286;1287; AVX-LABEL: pr64460_2:1288; AVX:       # %bb.0:1289; 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],zero1290; AVX-NEXT:    vpslld $16, %ymm0, %ymm01291; AVX-NEXT:    retq1292  %b = fpext <8 x bfloat> %a to <8 x float>1293  ret <8 x float> %b1294}1295 1296define <16 x float> @pr64460_3(<16 x bfloat> %a) {1297; X86-LABEL: pr64460_3:1298; X86:       # %bb.0:1299; 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],zero1300; X86-NEXT:    vpslld $16, %zmm0, %zmm01301; X86-NEXT:    retl1302;1303; SSE2-LABEL: pr64460_3:1304; SSE2:       # %bb.0:1305; SSE2-NEXT:    pxor %xmm3, %xmm31306; SSE2-NEXT:    pxor %xmm5, %xmm51307; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3]1308; SSE2-NEXT:    pxor %xmm4, %xmm41309; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]1310; SSE2-NEXT:    pxor %xmm2, %xmm21311; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]1312; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]1313; SSE2-NEXT:    movdqa %xmm5, %xmm01314; SSE2-NEXT:    movdqa %xmm4, %xmm11315; SSE2-NEXT:    retq1316;1317; AVX512-LABEL: pr64460_3:1318; AVX512:       # %bb.0:1319; 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],zero1320; AVX512-NEXT:    vpslld $16, %zmm0, %zmm01321; AVX512-NEXT:    retq1322;1323; AVXNC-LABEL: pr64460_3:1324; AVXNC:       # %bb.0:1325; 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],zero1326; AVXNC-NEXT:    vpslld $16, %ymm1, %ymm21327; AVXNC-NEXT:    vextracti128 $1, %ymm0, %xmm01328; 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],zero1329; AVXNC-NEXT:    vpslld $16, %ymm0, %ymm11330; AVXNC-NEXT:    vmovdqa %ymm2, %ymm01331; AVXNC-NEXT:    retq1332  %b = fpext <16 x bfloat> %a to <16 x float>1333  ret <16 x float> %b1334}1335 1336define <8 x double> @pr64460_4(<8 x bfloat> %a) {1337; X86-LABEL: pr64460_4:1338; X86:       # %bb.0:1339; 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],zero1340; X86-NEXT:    vpslld $16, %ymm0, %ymm01341; X86-NEXT:    vcvtps2pd %ymm0, %zmm01342; X86-NEXT:    retl1343;1344; SSE2-LABEL: pr64460_4:1345; SSE2:       # %bb.0:1346; SSE2-NEXT:    pxor %xmm3, %xmm31347; SSE2-NEXT:    pxor %xmm1, %xmm11348; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1349; SSE2-NEXT:    cvtps2pd %xmm1, %xmm41350; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1351; SSE2-NEXT:    cvtps2pd %xmm3, %xmm21352; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1353; SSE2-NEXT:    cvtps2pd %xmm0, %xmm11354; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]1355; SSE2-NEXT:    cvtps2pd %xmm0, %xmm31356; SSE2-NEXT:    movaps %xmm4, %xmm01357; SSE2-NEXT:    retq1358;1359; AVX512-LABEL: pr64460_4:1360; AVX512:       # %bb.0:1361; 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],zero1362; AVX512-NEXT:    vpslld $16, %ymm0, %ymm01363; AVX512-NEXT:    vcvtps2pd %ymm0, %zmm01364; AVX512-NEXT:    retq1365;1366; AVXNC-LABEL: pr64460_4:1367; AVXNC:       # %bb.0:1368; 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],zero1369; AVXNC-NEXT:    vpslld $16, %ymm0, %ymm11370; AVXNC-NEXT:    vcvtps2pd %xmm1, %ymm01371; AVXNC-NEXT:    vextracti128 $1, %ymm1, %xmm11372; AVXNC-NEXT:    vcvtps2pd %xmm1, %ymm11373; AVXNC-NEXT:    retq1374  %b = fpext <8 x bfloat> %a to <8 x double>1375  ret <8 x double> %b1376}1377 1378define <4 x bfloat> @fptrunc_v4f32(<4 x float> %a) nounwind {1379; X86-LABEL: fptrunc_v4f32:1380; X86:       # %bb.0:1381; X86-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01382; X86-NEXT:    vcvtneps2bf16 %ymm0, %xmm01383; X86-NEXT:    vzeroupper1384; X86-NEXT:    retl1385;1386; SSE2-LABEL: fptrunc_v4f32:1387; SSE2:       # %bb.0:1388; SSE2-NEXT:    subq $72, %rsp1389; SSE2-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill1390; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1391; SSE2-NEXT:    callq __truncsfbf2@PLT1392; SSE2-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1393; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1394; SSE2-NEXT:    callq __truncsfbf2@PLT1395; SSE2-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1396; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1397; SSE2-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]1398; SSE2-NEXT:    callq __truncsfbf2@PLT1399; SSE2-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1400; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1401; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1402; SSE2-NEXT:    callq __truncsfbf2@PLT1403; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1404; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1405; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1406; SSE2-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1407; SSE2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]1408; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1409; SSE2-NEXT:    addq $72, %rsp1410; SSE2-NEXT:    retq1411;1412; AVX512-LABEL: fptrunc_v4f32:1413; AVX512:       # %bb.0:1414; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01415; AVX512-NEXT:    vcvtneps2bf16 %ymm0, %xmm01416; AVX512-NEXT:    vzeroupper1417; AVX512-NEXT:    retq1418;1419; AVXNC-LABEL: fptrunc_v4f32:1420; AVXNC:       # %bb.0:1421; AVXNC-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm01422; AVXNC-NEXT:    {vex} vcvtneps2bf16 %ymm0, %xmm01423; AVXNC-NEXT:    vzeroupper1424; AVXNC-NEXT:    retq1425  %b = fptrunc <4 x float> %a to <4 x bfloat>1426  ret <4 x bfloat> %b1427}1428 1429define <8 x bfloat> @fptrunc_v8f32(<8 x float> %a) nounwind {1430; X86-LABEL: fptrunc_v8f32:1431; X86:       # %bb.0:1432; X86-NEXT:    vcvtneps2bf16 %ymm0, %xmm01433; X86-NEXT:    vzeroupper1434; X86-NEXT:    retl1435;1436; SSE2-LABEL: fptrunc_v8f32:1437; SSE2:       # %bb.0:1438; SSE2-NEXT:    pushq %rbp1439; SSE2-NEXT:    pushq %r141440; SSE2-NEXT:    pushq %rbx1441; SSE2-NEXT:    subq $32, %rsp1442; SSE2-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill1443; SSE2-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1444; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1445; SSE2-NEXT:    callq __truncsfbf2@PLT1446; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1447; SSE2-NEXT:    shll $16, %ebx1448; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1449; SSE2-NEXT:    callq __truncsfbf2@PLT1450; SSE2-NEXT:    pextrw $0, %xmm0, %eax1451; SSE2-NEXT:    movzwl %ax, %r14d1452; SSE2-NEXT:    orl %ebx, %r14d1453; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1454; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1455; SSE2-NEXT:    callq __truncsfbf2@PLT1456; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1457; SSE2-NEXT:    shll $16, %ebp1458; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1459; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1460; SSE2-NEXT:    callq __truncsfbf2@PLT1461; SSE2-NEXT:    pextrw $0, %xmm0, %eax1462; SSE2-NEXT:    movzwl %ax, %ebx1463; SSE2-NEXT:    orl %ebp, %ebx1464; SSE2-NEXT:    shlq $32, %rbx1465; SSE2-NEXT:    orq %r14, %rbx1466; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1467; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1468; SSE2-NEXT:    callq __truncsfbf2@PLT1469; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1470; SSE2-NEXT:    shll $16, %ebp1471; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1472; SSE2-NEXT:    callq __truncsfbf2@PLT1473; SSE2-NEXT:    pextrw $0, %xmm0, %eax1474; SSE2-NEXT:    movzwl %ax, %r14d1475; SSE2-NEXT:    orl %ebp, %r14d1476; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1477; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1478; SSE2-NEXT:    callq __truncsfbf2@PLT1479; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1480; SSE2-NEXT:    shll $16, %ebp1481; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1482; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1483; SSE2-NEXT:    callq __truncsfbf2@PLT1484; SSE2-NEXT:    pextrw $0, %xmm0, %eax1485; SSE2-NEXT:    movzwl %ax, %eax1486; SSE2-NEXT:    orl %ebp, %eax1487; SSE2-NEXT:    shlq $32, %rax1488; SSE2-NEXT:    orq %r14, %rax1489; SSE2-NEXT:    movq %rax, %xmm11490; SSE2-NEXT:    movq %rbx, %xmm01491; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1492; SSE2-NEXT:    addq $32, %rsp1493; SSE2-NEXT:    popq %rbx1494; SSE2-NEXT:    popq %r141495; SSE2-NEXT:    popq %rbp1496; SSE2-NEXT:    retq1497;1498; AVX512-LABEL: fptrunc_v8f32:1499; AVX512:       # %bb.0:1500; AVX512-NEXT:    vcvtneps2bf16 %ymm0, %xmm01501; AVX512-NEXT:    vzeroupper1502; AVX512-NEXT:    retq1503;1504; AVXNC-LABEL: fptrunc_v8f32:1505; AVXNC:       # %bb.0:1506; AVXNC-NEXT:    {vex} vcvtneps2bf16 %ymm0, %xmm01507; AVXNC-NEXT:    vzeroupper1508; AVXNC-NEXT:    retq1509  %b = fptrunc <8 x float> %a to <8 x bfloat>1510  ret <8 x bfloat> %b1511}1512 1513define <16 x bfloat> @fptrunc_v16f32(<16 x float> %a) nounwind {1514; X86-LABEL: fptrunc_v16f32:1515; X86:       # %bb.0:1516; X86-NEXT:    vcvtneps2bf16 %zmm0, %ymm01517; X86-NEXT:    retl1518;1519; SSE2-LABEL: fptrunc_v16f32:1520; SSE2:       # %bb.0:1521; SSE2-NEXT:    pushq %rbp1522; SSE2-NEXT:    pushq %r151523; SSE2-NEXT:    pushq %r141524; SSE2-NEXT:    pushq %r121525; SSE2-NEXT:    pushq %rbx1526; SSE2-NEXT:    subq $64, %rsp1527; SSE2-NEXT:    movaps %xmm3, (%rsp) # 16-byte Spill1528; SSE2-NEXT:    movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1529; SSE2-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1530; SSE2-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1531; SSE2-NEXT:    movaps %xmm2, %xmm01532; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm2[1,1]1533; SSE2-NEXT:    callq __truncsfbf2@PLT1534; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1535; SSE2-NEXT:    shll $16, %ebx1536; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1537; SSE2-NEXT:    callq __truncsfbf2@PLT1538; SSE2-NEXT:    pextrw $0, %xmm0, %eax1539; SSE2-NEXT:    movzwl %ax, %r14d1540; SSE2-NEXT:    orl %ebx, %r14d1541; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1542; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1543; SSE2-NEXT:    callq __truncsfbf2@PLT1544; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1545; SSE2-NEXT:    shll $16, %ebp1546; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1547; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1548; SSE2-NEXT:    callq __truncsfbf2@PLT1549; SSE2-NEXT:    pextrw $0, %xmm0, %eax1550; SSE2-NEXT:    movzwl %ax, %ebx1551; SSE2-NEXT:    orl %ebp, %ebx1552; SSE2-NEXT:    shlq $32, %rbx1553; SSE2-NEXT:    orq %r14, %rbx1554; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1555; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1556; SSE2-NEXT:    callq __truncsfbf2@PLT1557; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1558; SSE2-NEXT:    shll $16, %ebp1559; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1560; SSE2-NEXT:    callq __truncsfbf2@PLT1561; SSE2-NEXT:    pextrw $0, %xmm0, %eax1562; SSE2-NEXT:    movzwl %ax, %r15d1563; SSE2-NEXT:    orl %ebp, %r15d1564; SSE2-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload1565; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1566; SSE2-NEXT:    callq __truncsfbf2@PLT1567; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1568; SSE2-NEXT:    shll $16, %ebp1569; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1570; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1571; SSE2-NEXT:    callq __truncsfbf2@PLT1572; SSE2-NEXT:    pextrw $0, %xmm0, %eax1573; SSE2-NEXT:    movzwl %ax, %r14d1574; SSE2-NEXT:    orl %ebp, %r14d1575; SSE2-NEXT:    shlq $32, %r141576; SSE2-NEXT:    orq %r15, %r141577; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1578; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1579; SSE2-NEXT:    callq __truncsfbf2@PLT1580; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1581; SSE2-NEXT:    shll $16, %ebp1582; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1583; SSE2-NEXT:    callq __truncsfbf2@PLT1584; SSE2-NEXT:    pextrw $0, %xmm0, %eax1585; SSE2-NEXT:    movzwl %ax, %r12d1586; SSE2-NEXT:    orl %ebp, %r12d1587; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1588; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1589; SSE2-NEXT:    callq __truncsfbf2@PLT1590; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1591; SSE2-NEXT:    shll $16, %ebp1592; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1593; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1594; SSE2-NEXT:    callq __truncsfbf2@PLT1595; SSE2-NEXT:    pextrw $0, %xmm0, %eax1596; SSE2-NEXT:    movzwl %ax, %r15d1597; SSE2-NEXT:    orl %ebp, %r15d1598; SSE2-NEXT:    shlq $32, %r151599; SSE2-NEXT:    orq %r12, %r151600; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1601; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1602; SSE2-NEXT:    callq __truncsfbf2@PLT1603; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1604; SSE2-NEXT:    shll $16, %ebp1605; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1606; SSE2-NEXT:    callq __truncsfbf2@PLT1607; SSE2-NEXT:    pextrw $0, %xmm0, %eax1608; SSE2-NEXT:    movzwl %ax, %r12d1609; SSE2-NEXT:    orl %ebp, %r12d1610; SSE2-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1611; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1612; SSE2-NEXT:    callq __truncsfbf2@PLT1613; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1614; SSE2-NEXT:    shll $16, %ebp1615; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1616; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1617; SSE2-NEXT:    callq __truncsfbf2@PLT1618; SSE2-NEXT:    pextrw $0, %xmm0, %eax1619; SSE2-NEXT:    movzwl %ax, %eax1620; SSE2-NEXT:    orl %ebp, %eax1621; SSE2-NEXT:    shlq $32, %rax1622; SSE2-NEXT:    orq %r12, %rax1623; SSE2-NEXT:    movq %rax, %xmm11624; SSE2-NEXT:    movq %r15, %xmm01625; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1626; SSE2-NEXT:    movq %r14, %xmm21627; SSE2-NEXT:    movq %rbx, %xmm11628; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1629; SSE2-NEXT:    addq $64, %rsp1630; SSE2-NEXT:    popq %rbx1631; SSE2-NEXT:    popq %r121632; SSE2-NEXT:    popq %r141633; SSE2-NEXT:    popq %r151634; SSE2-NEXT:    popq %rbp1635; SSE2-NEXT:    retq1636;1637; AVX512-LABEL: fptrunc_v16f32:1638; AVX512:       # %bb.0:1639; AVX512-NEXT:    vcvtneps2bf16 %zmm0, %ymm01640; AVX512-NEXT:    retq1641;1642; AVXNC-LABEL: fptrunc_v16f32:1643; AVXNC:       # %bb.0:1644; AVXNC-NEXT:    {vex} vcvtneps2bf16 %ymm0, %xmm01645; AVXNC-NEXT:    {vex} vcvtneps2bf16 %ymm1, %xmm11646; AVXNC-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01647; AVXNC-NEXT:    retq1648  %b = fptrunc <16 x float> %a to <16 x bfloat>1649  ret <16 x bfloat> %b1650}1651 1652define <8 x bfloat> @fptrunc_v8f64(<8 x double> %a) nounwind {1653; X86-LABEL: fptrunc_v8f64:1654; X86:       # %bb.0:1655; X86-NEXT:    subl $204, %esp1656; X86-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill1657; X86-NEXT:    vextractf128 $1, %ymm0, %xmm01658; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1659; X86-NEXT:    vmovlps %xmm0, (%esp)1660; X86-NEXT:    vzeroupper1661; X86-NEXT:    calll __truncdfbf21662; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1663; X86-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1664; X86-NEXT:    vmovhps %xmm0, (%esp)1665; X86-NEXT:    calll __truncdfbf21666; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1667; X86-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload1668; X86-NEXT:    vmovlps %xmm0, (%esp)1669; X86-NEXT:    vzeroupper1670; X86-NEXT:    calll __truncdfbf21671; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1672; X86-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload1673; X86-NEXT:    vmovhps %xmm0, (%esp)1674; X86-NEXT:    vzeroupper1675; X86-NEXT:    calll __truncdfbf21676; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1677; X86-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload1678; X86-NEXT:    vextractf32x4 $2, %zmm0, %xmm01679; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1680; X86-NEXT:    vmovlps %xmm0, (%esp)1681; X86-NEXT:    vzeroupper1682; X86-NEXT:    calll __truncdfbf21683; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1684; X86-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1685; X86-NEXT:    vmovhps %xmm0, (%esp)1686; X86-NEXT:    calll __truncdfbf21687; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1688; X86-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload1689; X86-NEXT:    vextractf32x4 $3, %zmm0, %xmm01690; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1691; X86-NEXT:    vmovlps %xmm0, (%esp)1692; X86-NEXT:    vzeroupper1693; X86-NEXT:    calll __truncdfbf21694; X86-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill1695; X86-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload1696; X86-NEXT:    vmovhps %xmm0, (%esp)1697; X86-NEXT:    calll __truncdfbf21698; X86-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1699; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1700; X86-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1701; X86-NEXT:    vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload1702; X86-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]1703; X86-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1704; X86-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload1705; X86-NEXT:    vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload1706; X86-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]1707; X86-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 16-byte Reload1708; X86-NEXT:    vpunpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 16-byte Folded Reload1709; X86-NEXT:    # xmm2 = xmm2[0],mem[0],xmm2[1],mem[1],xmm2[2],mem[2],xmm2[3],mem[3]1710; X86-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1711; X86-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1712; X86-NEXT:    addl $204, %esp1713; X86-NEXT:    retl1714;1715; SSE2-LABEL: fptrunc_v8f64:1716; SSE2:       # %bb.0:1717; SSE2-NEXT:    pushq %rbp1718; SSE2-NEXT:    pushq %r141719; SSE2-NEXT:    pushq %rbx1720; SSE2-NEXT:    subq $64, %rsp1721; SSE2-NEXT:    movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1722; SSE2-NEXT:    movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1723; SSE2-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill1724; SSE2-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1725; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1726; SSE2-NEXT:    callq __truncdfbf2@PLT1727; SSE2-NEXT:    pextrw $0, %xmm0, %ebx1728; SSE2-NEXT:    shll $16, %ebx1729; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1730; SSE2-NEXT:    callq __truncdfbf2@PLT1731; SSE2-NEXT:    pextrw $0, %xmm0, %eax1732; SSE2-NEXT:    movzwl %ax, %r14d1733; SSE2-NEXT:    orl %ebx, %r14d1734; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1735; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1736; SSE2-NEXT:    callq __truncdfbf2@PLT1737; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1738; SSE2-NEXT:    shll $16, %ebp1739; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload1740; SSE2-NEXT:    callq __truncdfbf2@PLT1741; SSE2-NEXT:    pextrw $0, %xmm0, %eax1742; SSE2-NEXT:    movzwl %ax, %ebx1743; SSE2-NEXT:    orl %ebp, %ebx1744; SSE2-NEXT:    shlq $32, %rbx1745; SSE2-NEXT:    orq %r14, %rbx1746; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1747; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1748; SSE2-NEXT:    callq __truncdfbf2@PLT1749; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1750; SSE2-NEXT:    shll $16, %ebp1751; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1752; SSE2-NEXT:    callq __truncdfbf2@PLT1753; SSE2-NEXT:    pextrw $0, %xmm0, %eax1754; SSE2-NEXT:    movzwl %ax, %r14d1755; SSE2-NEXT:    orl %ebp, %r14d1756; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1757; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]1758; SSE2-NEXT:    callq __truncdfbf2@PLT1759; SSE2-NEXT:    pextrw $0, %xmm0, %ebp1760; SSE2-NEXT:    shll $16, %ebp1761; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1762; SSE2-NEXT:    callq __truncdfbf2@PLT1763; SSE2-NEXT:    pextrw $0, %xmm0, %eax1764; SSE2-NEXT:    movzwl %ax, %eax1765; SSE2-NEXT:    orl %ebp, %eax1766; SSE2-NEXT:    shlq $32, %rax1767; SSE2-NEXT:    orq %r14, %rax1768; SSE2-NEXT:    movq %rax, %xmm11769; SSE2-NEXT:    movq %rbx, %xmm01770; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1771; SSE2-NEXT:    addq $64, %rsp1772; SSE2-NEXT:    popq %rbx1773; SSE2-NEXT:    popq %r141774; SSE2-NEXT:    popq %rbp1775; SSE2-NEXT:    retq1776;1777; AVX512BF16-LABEL: fptrunc_v8f64:1778; AVX512BF16:       # %bb.0:1779; AVX512BF16-NEXT:    pushq %rbp1780; AVX512BF16-NEXT:    pushq %r151781; AVX512BF16-NEXT:    pushq %r141782; AVX512BF16-NEXT:    pushq %r131783; AVX512BF16-NEXT:    pushq %r121784; AVX512BF16-NEXT:    pushq %rbx1785; AVX512BF16-NEXT:    subq $184, %rsp1786; AVX512BF16-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill1787; AVX512BF16-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01788; AVX512BF16-NEXT:    vzeroupper1789; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1790; AVX512BF16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1791; AVX512BF16-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1792; AVX512BF16-NEXT:    # xmm0 = mem[1,0]1793; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1794; AVX512BF16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1795; AVX512BF16-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1796; AVX512BF16-NEXT:    vextractf128 $1, %ymm0, %xmm01797; AVX512BF16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1798; AVX512BF16-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]1799; AVX512BF16-NEXT:    vzeroupper1800; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1801; AVX512BF16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1802; AVX512BF16-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1803; AVX512BF16-NEXT:    vextractf32x4 $2, %zmm0, %xmm01804; AVX512BF16-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill1805; AVX512BF16-NEXT:    vzeroupper1806; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1807; AVX512BF16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1808; AVX512BF16-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload1809; AVX512BF16-NEXT:    # xmm0 = mem[1,0]1810; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1811; AVX512BF16-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill1812; AVX512BF16-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1813; AVX512BF16-NEXT:    vextractf32x4 $3, %zmm0, %xmm01814; AVX512BF16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1815; AVX512BF16-NEXT:    vzeroupper1816; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1817; AVX512BF16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1818; AVX512BF16-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1819; AVX512BF16-NEXT:    # xmm0 = mem[1,0]1820; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1821; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %ebx1822; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1823; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %ebp1824; AVX512BF16-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload1825; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %r14d1826; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1827; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %r15d1828; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1829; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %r12d1830; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1831; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %r13d1832; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1833; AVX512BF16-NEXT:    callq __truncdfbf2@PLT1834; AVX512BF16-NEXT:    vpextrw $0, %xmm0, %eax1835; AVX512BF16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1836; AVX512BF16-NEXT:    vpinsrw $1, %r13d, %xmm0, %xmm01837; AVX512BF16-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm01838; AVX512BF16-NEXT:    vpinsrw $3, %r12d, %xmm0, %xmm01839; AVX512BF16-NEXT:    vpinsrw $4, %r15d, %xmm0, %xmm01840; AVX512BF16-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm01841; AVX512BF16-NEXT:    vpinsrw $6, %ebp, %xmm0, %xmm01842; AVX512BF16-NEXT:    vpinsrw $7, %ebx, %xmm0, %xmm01843; AVX512BF16-NEXT:    addq $184, %rsp1844; AVX512BF16-NEXT:    popq %rbx1845; AVX512BF16-NEXT:    popq %r121846; AVX512BF16-NEXT:    popq %r131847; AVX512BF16-NEXT:    popq %r141848; AVX512BF16-NEXT:    popq %r151849; AVX512BF16-NEXT:    popq %rbp1850; AVX512BF16-NEXT:    retq1851;1852; AVX512FP16-LABEL: fptrunc_v8f64:1853; AVX512FP16:       # %bb.0:1854; AVX512FP16-NEXT:    subq $184, %rsp1855; AVX512FP16-NEXT:    vmovupd %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill1856; AVX512FP16-NEXT:    vextractf128 $1, %ymm0, %xmm01857; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1858; AVX512FP16-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]1859; AVX512FP16-NEXT:    vzeroupper1860; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1861; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1862; AVX512FP16-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1863; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1864; AVX512FP16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1865; AVX512FP16-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1866; AVX512FP16-NEXT:    # xmm0 = mem[1,0]1867; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1868; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1869; AVX512FP16-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1870; AVX512FP16-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01871; AVX512FP16-NEXT:    vzeroupper1872; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1873; AVX512FP16-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1874; AVX512FP16-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1875; AVX512FP16-NEXT:    vextractf32x4 $2, %zmm0, %xmm01876; AVX512FP16-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill1877; AVX512FP16-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]1878; AVX512FP16-NEXT:    vzeroupper1879; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1880; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1881; AVX512FP16-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload1882; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1883; AVX512FP16-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill1884; AVX512FP16-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload1885; AVX512FP16-NEXT:    vextractf32x4 $3, %zmm0, %xmm01886; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1887; AVX512FP16-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]1888; AVX512FP16-NEXT:    vzeroupper1889; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1890; AVX512FP16-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1891; AVX512FP16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1892; AVX512FP16-NEXT:    callq __truncdfbf2@PLT1893; AVX512FP16-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload1894; AVX512FP16-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]1895; AVX512FP16-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload1896; AVX512FP16-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload1897; AVX512FP16-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]1898; AVX512FP16-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1899; AVX512FP16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1900; AVX512FP16-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1, %xmm1 # 16-byte Folded Reload1901; AVX512FP16-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3]1902; AVX512FP16-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload1903; AVX512FP16-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm2, %xmm2 # 16-byte Folded Reload1904; AVX512FP16-NEXT:    # xmm2 = xmm2[0],mem[0],xmm2[1],mem[1],xmm2[2],mem[2],xmm2[3],mem[3]1905; AVX512FP16-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1906; AVX512FP16-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1907; AVX512FP16-NEXT:    addq $184, %rsp1908; AVX512FP16-NEXT:    retq1909;1910; AVXNC-LABEL: fptrunc_v8f64:1911; AVXNC:       # %bb.0:1912; AVXNC-NEXT:    pushq %rbp1913; AVXNC-NEXT:    pushq %r151914; AVXNC-NEXT:    pushq %r141915; AVXNC-NEXT:    pushq %r131916; AVXNC-NEXT:    pushq %r121917; AVXNC-NEXT:    pushq %rbx1918; AVXNC-NEXT:    subq $168, %rsp1919; AVXNC-NEXT:    vmovups %ymm1, (%rsp) # 32-byte Spill1920; AVXNC-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill1921; AVXNC-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01922; AVXNC-NEXT:    vzeroupper1923; AVXNC-NEXT:    callq __truncdfbf2@PLT1924; AVXNC-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1925; AVXNC-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1926; AVXNC-NEXT:    # xmm0 = mem[1,0]1927; AVXNC-NEXT:    callq __truncdfbf2@PLT1928; AVXNC-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1929; AVXNC-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload1930; AVXNC-NEXT:    vextractf128 $1, %ymm0, %xmm01931; AVXNC-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1932; AVXNC-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]1933; AVXNC-NEXT:    vzeroupper1934; AVXNC-NEXT:    callq __truncdfbf2@PLT1935; AVXNC-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1936; AVXNC-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload1937; AVXNC-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01938; AVXNC-NEXT:    vzeroupper1939; AVXNC-NEXT:    callq __truncdfbf2@PLT1940; AVXNC-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1941; AVXNC-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload1942; AVXNC-NEXT:    # xmm0 = mem[1,0]1943; AVXNC-NEXT:    callq __truncdfbf2@PLT1944; AVXNC-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1945; AVXNC-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload1946; AVXNC-NEXT:    vextractf128 $1, %ymm0, %xmm01947; AVXNC-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1948; AVXNC-NEXT:    vzeroupper1949; AVXNC-NEXT:    callq __truncdfbf2@PLT1950; AVXNC-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill1951; AVXNC-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload1952; AVXNC-NEXT:    # xmm0 = mem[1,0]1953; AVXNC-NEXT:    callq __truncdfbf2@PLT1954; AVXNC-NEXT:    vpextrw $0, %xmm0, %ebx1955; AVXNC-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload1956; AVXNC-NEXT:    vpextrw $0, %xmm0, %ebp1957; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1958; AVXNC-NEXT:    vpextrw $0, %xmm0, %r14d1959; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1960; AVXNC-NEXT:    vpextrw $0, %xmm0, %r15d1961; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1962; AVXNC-NEXT:    vpextrw $0, %xmm0, %r12d1963; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1964; AVXNC-NEXT:    vpextrw $0, %xmm0, %r13d1965; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1966; AVXNC-NEXT:    callq __truncdfbf2@PLT1967; AVXNC-NEXT:    vpextrw $0, %xmm0, %eax1968; AVXNC-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1969; AVXNC-NEXT:    vpinsrw $1, %r13d, %xmm0, %xmm01970; AVXNC-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm01971; AVXNC-NEXT:    vpinsrw $3, %r12d, %xmm0, %xmm01972; AVXNC-NEXT:    vpinsrw $4, %r15d, %xmm0, %xmm01973; AVXNC-NEXT:    vpinsrw $5, %r14d, %xmm0, %xmm01974; AVXNC-NEXT:    vpinsrw $6, %ebp, %xmm0, %xmm01975; AVXNC-NEXT:    vpinsrw $7, %ebx, %xmm0, %xmm01976; AVXNC-NEXT:    addq $168, %rsp1977; AVXNC-NEXT:    popq %rbx1978; AVXNC-NEXT:    popq %r121979; AVXNC-NEXT:    popq %r131980; AVXNC-NEXT:    popq %r141981; AVXNC-NEXT:    popq %r151982; AVXNC-NEXT:    popq %rbp1983; AVXNC-NEXT:    retq1984  %b = fptrunc <8 x double> %a to <8 x bfloat>1985  ret <8 x bfloat> %b1986}1987 1988define <32 x bfloat> @test_v8bf16_v32bf16(ptr %0) {1989; X86-LABEL: test_v8bf16_v32bf16:1990; X86:       # %bb.0:1991; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1992; X86-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1993; X86-NEXT:    retl1994;1995; SSE2-LABEL: test_v8bf16_v32bf16:1996; SSE2:       # %bb.0:1997; SSE2-NEXT:    movaps (%rdi), %xmm01998; SSE2-NEXT:    movaps %xmm0, %xmm11999; SSE2-NEXT:    movaps %xmm0, %xmm22000; SSE2-NEXT:    movaps %xmm0, %xmm32001; SSE2-NEXT:    retq2002;2003; AVX512-LABEL: test_v8bf16_v32bf16:2004; AVX512:       # %bb.0:2005; AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2006; AVX512-NEXT:    retq2007;2008; AVXNC-LABEL: test_v8bf16_v32bf16:2009; AVXNC:       # %bb.0:2010; AVXNC-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]2011; AVXNC-NEXT:    vmovaps %ymm0, %ymm12012; AVXNC-NEXT:    retq2013  %2 = load <8 x bfloat>, ptr %0, align 162014  %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>2015  ret <32 x bfloat> %32016}2017 2018define <16 x bfloat> @concat_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) {2019; X86-LABEL: concat_v8bf16:2020; X86:       # %bb.0:2021; X86-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm02022; X86-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02023; X86-NEXT:    retl2024;2025; SSE2-LABEL: concat_v8bf16:2026; SSE2:       # %bb.0:2027; SSE2-NEXT:    retq2028;2029; AVX-LABEL: concat_v8bf16:2030; AVX:       # %bb.0:2031; AVX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm02032; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02033; AVX-NEXT:    retq2034  %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>2035  ret <16 x bfloat> %a2036}2037 2038define <8 x bfloat> @extract_v32bf16_v8bf16(<32 x bfloat> %x) {2039; X86-LABEL: extract_v32bf16_v8bf16:2040; X86:       # %bb.0:2041; X86-NEXT:    vextractf128 $1, %ymm0, %xmm02042; X86-NEXT:    vzeroupper2043; X86-NEXT:    retl2044;2045; SSE2-LABEL: extract_v32bf16_v8bf16:2046; SSE2:       # %bb.0:2047; SSE2-NEXT:    pextrw $0, %xmm1, %eax2048; SSE2-NEXT:    pextrw $1, %xmm1, %ecx2049; SSE2-NEXT:    shll $16, %ecx2050; SSE2-NEXT:    orl %eax, %ecx2051; SSE2-NEXT:    pextrw $2, %xmm1, %eax2052; SSE2-NEXT:    pextrw $3, %xmm1, %edx2053; SSE2-NEXT:    shll $16, %edx2054; SSE2-NEXT:    orl %eax, %edx2055; SSE2-NEXT:    shlq $32, %rdx2056; SSE2-NEXT:    orq %rcx, %rdx2057; SSE2-NEXT:    pextrw $4, %xmm1, %eax2058; SSE2-NEXT:    pextrw $5, %xmm1, %ecx2059; SSE2-NEXT:    shll $16, %ecx2060; SSE2-NEXT:    orl %eax, %ecx2061; SSE2-NEXT:    pextrw $6, %xmm1, %eax2062; SSE2-NEXT:    pextrw $7, %xmm1, %esi2063; SSE2-NEXT:    shll $16, %esi2064; SSE2-NEXT:    orl %eax, %esi2065; SSE2-NEXT:    shlq $32, %rsi2066; SSE2-NEXT:    orq %rcx, %rsi2067; SSE2-NEXT:    movq %rsi, %xmm12068; SSE2-NEXT:    movq %rdx, %xmm02069; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2070; SSE2-NEXT:    retq2071;2072; AVX-LABEL: extract_v32bf16_v8bf16:2073; AVX:       # %bb.0:2074; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm02075; AVX-NEXT:    vzeroupper2076; AVX-NEXT:    retq2077  %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>2078  ret <8 x bfloat> %a2079}2080 2081define <16 x bfloat> @concat_zero_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) {2082; X86-LABEL: concat_zero_v8bf16:2083; X86:       # %bb.0:2084; X86-NEXT:    vmovaps %xmm0, %xmm02085; X86-NEXT:    retl2086;2087; SSE2-LABEL: concat_zero_v8bf16:2088; SSE2:       # %bb.0:2089; SSE2-NEXT:    xorps %xmm1, %xmm12090; SSE2-NEXT:    retq2091;2092; AVX-LABEL: concat_zero_v8bf16:2093; AVX:       # %bb.0:2094; AVX-NEXT:    vmovaps %xmm0, %xmm02095; AVX-NEXT:    retq2096  %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>2097  ret <16 x bfloat> %a2098}2099 2100define <16 x bfloat> @concat_dup_v8bf16(<8 x bfloat> %x, <8 x bfloat> %y) {2101; X86-LABEL: concat_dup_v8bf16:2102; X86:       # %bb.0:2103; X86-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]2104; X86-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02105; X86-NEXT:    retl2106;2107; SSE2-LABEL: concat_dup_v8bf16:2108; SSE2:       # %bb.0:2109; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]2110; SSE2-NEXT:    retq2111;2112; AVX-LABEL: concat_dup_v8bf16:2113; AVX:       # %bb.0:2114; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]2115; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02116; AVX-NEXT:    retq2117  %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>2118  ret <16 x bfloat> %a2119}2120 2121define float @trunc_ext(float %a) nounwind {2122; X86-LABEL: trunc_ext:2123; X86:       # %bb.0:2124; X86-NEXT:    pushl %eax2125; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2126; X86-NEXT:    vcvtneps2bf16 %xmm0, %xmm02127; X86-NEXT:    vmovw %xmm0, %eax2128; X86-NEXT:    shll $16, %eax2129; X86-NEXT:    vmovd %eax, %xmm02130; X86-NEXT:    vmovd %xmm0, (%esp)2131; X86-NEXT:    flds (%esp)2132; X86-NEXT:    popl %eax2133; X86-NEXT:    retl2134;2135; SSE2-LABEL: trunc_ext:2136; SSE2:       # %bb.0:2137; SSE2-NEXT:    pushq %rax2138; SSE2-NEXT:    callq __truncsfbf2@PLT2139; SSE2-NEXT:    pextrw $0, %xmm0, %eax2140; SSE2-NEXT:    shll $16, %eax2141; SSE2-NEXT:    movd %eax, %xmm02142; SSE2-NEXT:    popq %rax2143; SSE2-NEXT:    retq2144;2145; AVX512BF16-LABEL: trunc_ext:2146; AVX512BF16:       # %bb.0:2147; AVX512BF16-NEXT:    vcvtneps2bf16 %xmm0, %xmm02148; AVX512BF16-NEXT:    vmovd %xmm0, %eax2149; AVX512BF16-NEXT:    shll $16, %eax2150; AVX512BF16-NEXT:    vmovd %eax, %xmm02151; AVX512BF16-NEXT:    retq2152;2153; AVX512FP16-LABEL: trunc_ext:2154; AVX512FP16:       # %bb.0:2155; AVX512FP16-NEXT:    vcvtneps2bf16 %xmm0, %xmm02156; AVX512FP16-NEXT:    vmovw %xmm0, %eax2157; AVX512FP16-NEXT:    shll $16, %eax2158; AVX512FP16-NEXT:    vmovd %eax, %xmm02159; AVX512FP16-NEXT:    retq2160;2161; AVXNC-LABEL: trunc_ext:2162; AVXNC:       # %bb.0:2163; AVXNC-NEXT:    {vex} vcvtneps2bf16 %xmm0, %xmm02164; AVXNC-NEXT:    vmovd %xmm0, %eax2165; AVXNC-NEXT:    shll $16, %eax2166; AVXNC-NEXT:    vmovd %eax, %xmm02167; AVXNC-NEXT:    retq2168  %b = fptrunc float %a to bfloat2169  %c = fpext bfloat %b to float2170  ret float %c2171}2172 2173define void @PR92471(ptr %0, ptr %1) nounwind {2174; X86-LABEL: PR92471:2175; X86:       # %bb.0:2176; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax2177; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx2178; X86-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2179; X86-NEXT:    vpinsrd $1, 4(%ecx), %xmm0, %xmm02180; X86-NEXT:    vpinsrd $2, 8(%ecx), %xmm0, %xmm02181; X86-NEXT:    vpinsrw $6, 12(%ecx), %xmm0, %xmm02182; 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],zero2183; X86-NEXT:    vpslld $16, %ymm0, %ymm02184; X86-NEXT:    vextracti128 $1, %ymm0, %xmm12185; X86-NEXT:    vpextrd $2, %xmm1, 24(%eax)2186; X86-NEXT:    vpextrd $1, %xmm1, 20(%eax)2187; X86-NEXT:    vmovd %xmm1, 16(%eax)2188; X86-NEXT:    vmovdqu %xmm0, (%eax)2189; X86-NEXT:    vzeroupper2190; X86-NEXT:    retl2191;2192; SSE2-LABEL: PR92471:2193; SSE2:       # %bb.0:2194; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero2195; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero2196; SSE2-NEXT:    pinsrw $2, 12(%rdi), %xmm12197; SSE2-NEXT:    pxor %xmm2, %xmm22198; SSE2-NEXT:    pxor %xmm3, %xmm32199; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]2200; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]2201; SSE2-NEXT:    movdqu %xmm2, (%rsi)2202; SSE2-NEXT:    movq %xmm3, 16(%rsi)2203; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]2204; SSE2-NEXT:    movd %xmm0, 24(%rsi)2205; SSE2-NEXT:    retq2206;2207; AVX-LABEL: PR92471:2208; AVX:       # %bb.0:2209; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero2210; AVX-NEXT:    vpinsrd $2, 8(%rdi), %xmm0, %xmm02211; AVX-NEXT:    vpinsrw $6, 12(%rdi), %xmm0, %xmm02212; 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],zero2213; AVX-NEXT:    vpslld $16, %ymm0, %ymm02214; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm12215; AVX-NEXT:    vpextrd $2, %xmm1, 24(%rsi)2216; AVX-NEXT:    vmovq %xmm1, 16(%rsi)2217; AVX-NEXT:    vmovdqu %xmm0, (%rsi)2218; AVX-NEXT:    vzeroupper2219; AVX-NEXT:    retq2220  %3 = load <7 x bfloat>, ptr %0, align 22221  %4 = fpext <7 x bfloat> %3 to <7 x float>2222  store <7 x float> %4, ptr %1, align 42223  ret void2224}2225 2226define bfloat @PR108936(x86_fp80 %0) nounwind {2227; X86-LABEL: PR108936:2228; X86:       # %bb.0:2229; X86-NEXT:    subl $12, %esp2230; X86-NEXT:    fldt {{[0-9]+}}(%esp)2231; X86-NEXT:    fstpt (%esp)2232; X86-NEXT:    calll __truncxfbf22233; X86-NEXT:    addl $12, %esp2234; X86-NEXT:    retl2235;2236; X64-LABEL: PR108936:2237; X64:       # %bb.0:2238; X64-NEXT:    subq $24, %rsp2239; X64-NEXT:    fldt {{[0-9]+}}(%rsp)2240; X64-NEXT:    fstpt (%rsp)2241; X64-NEXT:    callq __truncxfbf2@PLT2242; X64-NEXT:    addq $24, %rsp2243; X64-NEXT:    retq2244  %2 = fptrunc x86_fp80 %0 to bfloat2245  ret bfloat %22246}2247 2248define bfloat @PR115710(fp128 %0) nounwind {2249; X86-LABEL: PR115710:2250; X86:       # %bb.0:2251; X86-NEXT:    subl $28, %esp2252; X86-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm02253; X86-NEXT:    vmovups %xmm0, (%esp)2254; X86-NEXT:    calll __trunctfbf22255; X86-NEXT:    addl $28, %esp2256; X86-NEXT:    retl2257;2258; X64-LABEL: PR115710:2259; X64:       # %bb.0:2260; X64-NEXT:    pushq %rax2261; X64-NEXT:    callq __trunctfbf2@PLT2262; X64-NEXT:    popq %rax2263; X64-NEXT:    retq2264  %2 = fptrunc fp128 %0 to bfloat2265  ret bfloat %22266}2267