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