1161 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+sse2 < %s | FileCheck -check-prefixes=SSE2 %s3; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+sse2 < %s | FileCheck -check-prefixes=FAST_ISEL_SSE2 %s4; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+avx512bf16,avx512vl < %s | FileCheck -check-prefixes=AVX512BF16 %s5; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+avx512bf16,avx512vl < %s | FileCheck -check-prefixes=FAST_ISEL_AVX512BF16 %s6; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+avxneconvert < %s | FileCheck -check-prefixes=AVXNECONVERT %s7; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+avxneconvert < %s | FileCheck -check-prefixes=FAST_ISEL_AVXNECONVERT %s8 9define bfloat @return_arg_bf16(bfloat %x) #0 {10; SSE2-LABEL: return_arg_bf16:11; SSE2: # %bb.0:12; SSE2-NEXT: retq13;14; FAST_ISEL_SSE2-LABEL: return_arg_bf16:15; FAST_ISEL_SSE2: # %bb.0:16; FAST_ISEL_SSE2-NEXT: pushq %rax17; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax18; FAST_ISEL_SSE2-NEXT: shll $16, %eax19; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm020; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT21; FAST_ISEL_SSE2-NEXT: popq %rax22; FAST_ISEL_SSE2-NEXT: retq23;24; AVX512BF16-LABEL: return_arg_bf16:25; AVX512BF16: # %bb.0:26; AVX512BF16-NEXT: retq27;28; FAST_ISEL_AVX512BF16-LABEL: return_arg_bf16:29; FAST_ISEL_AVX512BF16: # %bb.0:30; FAST_ISEL_AVX512BF16-NEXT: vpextrw $0, %xmm0, %eax31; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax32; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm033; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm034; FAST_ISEL_AVX512BF16-NEXT: retq35;36; AVXNECONVERT-LABEL: return_arg_bf16:37; AVXNECONVERT: # %bb.0:38; AVXNECONVERT-NEXT: retq39;40; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_bf16:41; FAST_ISEL_AVXNECONVERT: # %bb.0:42; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $0, %xmm0, %eax43; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax44; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm045; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm046; FAST_ISEL_AVXNECONVERT-NEXT: retq47 ret bfloat %x48}49 50define <2 x bfloat> @return_arg_v2bf16(<2 x bfloat> %x) #0 {51; SSE2-LABEL: return_arg_v2bf16:52; SSE2: # %bb.0:53; SSE2-NEXT: retq54;55; FAST_ISEL_SSE2-LABEL: return_arg_v2bf16:56; FAST_ISEL_SSE2: # %bb.0:57; FAST_ISEL_SSE2-NEXT: subq $40, %rsp58; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax59; FAST_ISEL_SSE2-NEXT: shll $16, %eax60; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill61; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax62; FAST_ISEL_SSE2-NEXT: shll $16, %eax63; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm064; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT65; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill66; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload67; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero68; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT69; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload70; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]71; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm072; FAST_ISEL_SSE2-NEXT: addq $40, %rsp73; FAST_ISEL_SSE2-NEXT: retq74;75; AVX512BF16-LABEL: return_arg_v2bf16:76; AVX512BF16: # %bb.0:77; AVX512BF16-NEXT: retq78;79; FAST_ISEL_AVX512BF16-LABEL: return_arg_v2bf16:80; FAST_ISEL_AVX512BF16: # %bb.0:81; FAST_ISEL_AVX512BF16-NEXT: retq82;83; AVXNECONVERT-LABEL: return_arg_v2bf16:84; AVXNECONVERT: # %bb.0:85; AVXNECONVERT-NEXT: retq86;87; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v2bf16:88; FAST_ISEL_AVXNECONVERT: # %bb.0:89; FAST_ISEL_AVXNECONVERT-NEXT: retq90 ret <2 x bfloat> %x91}92 93define <3 x bfloat> @return_arg_v3bf16(<3 x bfloat> %x) #0 {94; SSE2-LABEL: return_arg_v3bf16:95; SSE2: # %bb.0:96; SSE2-NEXT: retq97;98; FAST_ISEL_SSE2-LABEL: return_arg_v3bf16:99; FAST_ISEL_SSE2: # %bb.0:100; FAST_ISEL_SSE2-NEXT: subq $40, %rsp101; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax102; FAST_ISEL_SSE2-NEXT: shll $16, %eax103; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill104; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax105; FAST_ISEL_SSE2-NEXT: shll $16, %eax106; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill107; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax108; FAST_ISEL_SSE2-NEXT: shll $16, %eax109; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0110; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT111; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill112; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload113; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero114; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT115; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload116; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]117; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill118; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload119; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero120; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT121; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload122; FAST_ISEL_SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]123; FAST_ISEL_SSE2-NEXT: movaps %xmm1, %xmm0124; FAST_ISEL_SSE2-NEXT: addq $40, %rsp125; FAST_ISEL_SSE2-NEXT: retq126;127; AVX512BF16-LABEL: return_arg_v3bf16:128; AVX512BF16: # %bb.0:129; AVX512BF16-NEXT: retq130;131; FAST_ISEL_AVX512BF16-LABEL: return_arg_v3bf16:132; FAST_ISEL_AVX512BF16: # %bb.0:133; FAST_ISEL_AVX512BF16-NEXT: vpextrw $2, %xmm0, %eax134; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax135; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm1136; FAST_ISEL_AVX512BF16-NEXT: vpextrw $1, %xmm0, %eax137; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax138; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm2139; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm0, %eax140; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax141; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0142; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm1, %xmm1143; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm1, %eax144; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0145; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm2, %xmm1146; FAST_ISEL_AVX512BF16-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]147; FAST_ISEL_AVX512BF16-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0148; FAST_ISEL_AVX512BF16-NEXT: retq149;150; AVXNECONVERT-LABEL: return_arg_v3bf16:151; AVXNECONVERT: # %bb.0:152; AVXNECONVERT-NEXT: retq153;154; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v3bf16:155; FAST_ISEL_AVXNECONVERT: # %bb.0:156; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $2, %xmm0, %eax157; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax158; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1159; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $1, %xmm0, %eax160; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax161; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm2162; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm0, %eax163; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax164; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0165; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm1, %xmm1166; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm1, %eax167; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0168; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm2, %xmm1169; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]170; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $2, %eax, %xmm1, %xmm1171; FAST_ISEL_AVXNECONVERT-NEXT: vmovq %xmm1, %rax172; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx173; FAST_ISEL_AVXNECONVERT-NEXT: shrl $16, %ecx174; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm1175; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]176; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax177; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1178; FAST_ISEL_AVXNECONVERT-NEXT: vpbroadcastw %xmm1, %xmm1179; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]180; FAST_ISEL_AVXNECONVERT-NEXT: retq181 ret <3 x bfloat> %x182}183 184define <4 x bfloat> @return_arg_v4bf16(<4 x bfloat> %x) #0 {185; SSE2-LABEL: return_arg_v4bf16:186; SSE2: # %bb.0:187; SSE2-NEXT: retq188;189; FAST_ISEL_SSE2-LABEL: return_arg_v4bf16:190; FAST_ISEL_SSE2: # %bb.0:191; FAST_ISEL_SSE2-NEXT: subq $56, %rsp192; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax193; FAST_ISEL_SSE2-NEXT: shll $16, %eax194; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill195; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax196; FAST_ISEL_SSE2-NEXT: shll $16, %eax197; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill198; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax199; FAST_ISEL_SSE2-NEXT: shll $16, %eax200; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill201; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax202; FAST_ISEL_SSE2-NEXT: shll $16, %eax203; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0204; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT205; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill206; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload207; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero208; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT209; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload210; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]211; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill212; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload213; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero214; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT215; FAST_ISEL_SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill216; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload217; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero218; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT219; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload220; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]221; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload222; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]223; FAST_ISEL_SSE2-NEXT: addq $56, %rsp224; FAST_ISEL_SSE2-NEXT: retq225;226; AVX512BF16-LABEL: return_arg_v4bf16:227; AVX512BF16: # %bb.0:228; AVX512BF16-NEXT: retq229;230; FAST_ISEL_AVX512BF16-LABEL: return_arg_v4bf16:231; FAST_ISEL_AVX512BF16: # %bb.0:232; FAST_ISEL_AVX512BF16-NEXT: retq233;234; AVXNECONVERT-LABEL: return_arg_v4bf16:235; AVXNECONVERT: # %bb.0:236; AVXNECONVERT-NEXT: retq237;238; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v4bf16:239; FAST_ISEL_AVXNECONVERT: # %bb.0:240; FAST_ISEL_AVXNECONVERT-NEXT: retq241 ret <4 x bfloat> %x242}243 244define <8 x bfloat> @return_arg_v8bf16(<8 x bfloat> %x) #0 {245; SSE2-LABEL: return_arg_v8bf16:246; SSE2: # %bb.0:247; SSE2-NEXT: retq248;249; FAST_ISEL_SSE2-LABEL: return_arg_v8bf16:250; FAST_ISEL_SSE2: # %bb.0:251; FAST_ISEL_SSE2-NEXT: pushq %r14252; FAST_ISEL_SSE2-NEXT: pushq %rbx253; FAST_ISEL_SSE2-NEXT: subq $56, %rsp254; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax255; FAST_ISEL_SSE2-NEXT: shll $16, %eax256; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill257; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax258; FAST_ISEL_SSE2-NEXT: shll $16, %eax259; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill260; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax261; FAST_ISEL_SSE2-NEXT: shll $16, %eax262; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill263; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax264; FAST_ISEL_SSE2-NEXT: shll $16, %eax265; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill266; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax267; FAST_ISEL_SSE2-NEXT: shll $16, %eax268; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill269; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax270; FAST_ISEL_SSE2-NEXT: shll $16, %eax271; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill272; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax273; FAST_ISEL_SSE2-NEXT: shll $16, %eax274; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1275; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax276; FAST_ISEL_SSE2-NEXT: shll $16, %eax277; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill278; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0279; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT280; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx281; FAST_ISEL_SSE2-NEXT: shll $16, %ebx282; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload283; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero284; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT285; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax286; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d287; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d288; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload289; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero290; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT291; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx292; FAST_ISEL_SSE2-NEXT: shll $16, %ebx293; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload294; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero295; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT296; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax297; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax298; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax299; FAST_ISEL_SSE2-NEXT: shlq $32, %rax300; FAST_ISEL_SSE2-NEXT: orq %r14, %rax301; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0302; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill303; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload304; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero305; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT306; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx307; FAST_ISEL_SSE2-NEXT: shll $16, %ebx308; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload309; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero310; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT311; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax312; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d313; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d314; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload315; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero316; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT317; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx318; FAST_ISEL_SSE2-NEXT: shll $16, %ebx319; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload320; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero321; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT322; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax323; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax324; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax325; FAST_ISEL_SSE2-NEXT: shlq $32, %rax326; FAST_ISEL_SSE2-NEXT: orq %r14, %rax327; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm1328; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload329; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]330; FAST_ISEL_SSE2-NEXT: addq $56, %rsp331; FAST_ISEL_SSE2-NEXT: popq %rbx332; FAST_ISEL_SSE2-NEXT: popq %r14333; FAST_ISEL_SSE2-NEXT: retq334;335; AVX512BF16-LABEL: return_arg_v8bf16:336; AVX512BF16: # %bb.0:337; AVX512BF16-NEXT: retq338;339; FAST_ISEL_AVX512BF16-LABEL: return_arg_v8bf16:340; FAST_ISEL_AVX512BF16: # %bb.0:341; FAST_ISEL_AVX512BF16-NEXT: retq342;343; AVXNECONVERT-LABEL: return_arg_v8bf16:344; AVXNECONVERT: # %bb.0:345; AVXNECONVERT-NEXT: retq346;347; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v8bf16:348; FAST_ISEL_AVXNECONVERT: # %bb.0:349; FAST_ISEL_AVXNECONVERT-NEXT: retq350 ret <8 x bfloat> %x351}352 353define <16 x bfloat> @return_arg_v16bf16(<16 x bfloat> %x) #0 {354;355; SSE2-LABEL: return_arg_v16bf16:356; SSE2: # %bb.0:357; SSE2-NEXT: retq358;359; FAST_ISEL_SSE2-LABEL: return_arg_v16bf16:360; FAST_ISEL_SSE2: # %bb.0:361; FAST_ISEL_SSE2-NEXT: pushq %r14362; FAST_ISEL_SSE2-NEXT: pushq %rbx363; FAST_ISEL_SSE2-NEXT: subq $104, %rsp364; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax365; FAST_ISEL_SSE2-NEXT: shll $16, %eax366; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill367; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax368; FAST_ISEL_SSE2-NEXT: shll $16, %eax369; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill370; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax371; FAST_ISEL_SSE2-NEXT: shll $16, %eax372; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill373; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax374; FAST_ISEL_SSE2-NEXT: shll $16, %eax375; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill376; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax377; FAST_ISEL_SSE2-NEXT: shll $16, %eax378; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill379; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax380; FAST_ISEL_SSE2-NEXT: shll $16, %eax381; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill382; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax383; FAST_ISEL_SSE2-NEXT: shll $16, %eax384; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill385; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax386; FAST_ISEL_SSE2-NEXT: shll $16, %eax387; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill388; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax389; FAST_ISEL_SSE2-NEXT: shll $16, %eax390; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill391; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax392; FAST_ISEL_SSE2-NEXT: shll $16, %eax393; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill394; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax395; FAST_ISEL_SSE2-NEXT: shll $16, %eax396; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill397; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax398; FAST_ISEL_SSE2-NEXT: shll $16, %eax399; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill400; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax401; FAST_ISEL_SSE2-NEXT: shll $16, %eax402; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill403; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax404; FAST_ISEL_SSE2-NEXT: shll $16, %eax405; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill406; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax407; FAST_ISEL_SSE2-NEXT: shll $16, %eax408; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1409; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax410; FAST_ISEL_SSE2-NEXT: shll $16, %eax411; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill412; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0413; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT414; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx415; FAST_ISEL_SSE2-NEXT: shll $16, %ebx416; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload417; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero418; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT419; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax420; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d421; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d422; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload423; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero424; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT425; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx426; FAST_ISEL_SSE2-NEXT: shll $16, %ebx427; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload428; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero429; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT430; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax431; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax432; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax433; FAST_ISEL_SSE2-NEXT: shlq $32, %rax434; FAST_ISEL_SSE2-NEXT: orq %r14, %rax435; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0436; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill437; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload438; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero439; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT440; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx441; FAST_ISEL_SSE2-NEXT: shll $16, %ebx442; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload443; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero444; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT445; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax446; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d447; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d448; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload449; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero450; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT451; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx452; FAST_ISEL_SSE2-NEXT: shll $16, %ebx453; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload454; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero455; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT456; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax457; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax458; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax459; FAST_ISEL_SSE2-NEXT: shlq $32, %rax460; FAST_ISEL_SSE2-NEXT: orq %r14, %rax461; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0462; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload463; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]464; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill465; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload466; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero467; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT468; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx469; FAST_ISEL_SSE2-NEXT: shll $16, %ebx470; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload471; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero472; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT473; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax474; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d475; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d476; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload477; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero478; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT479; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx480; FAST_ISEL_SSE2-NEXT: shll $16, %ebx481; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload482; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero483; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT484; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax485; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax486; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax487; FAST_ISEL_SSE2-NEXT: shlq $32, %rax488; FAST_ISEL_SSE2-NEXT: orq %r14, %rax489; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0490; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill491; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload492; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero493; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT494; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx495; FAST_ISEL_SSE2-NEXT: shll $16, %ebx496; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload497; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero498; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT499; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax500; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d501; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d502; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload503; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero504; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT505; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx506; FAST_ISEL_SSE2-NEXT: shll $16, %ebx507; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload508; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero509; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT510; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax511; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax512; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax513; FAST_ISEL_SSE2-NEXT: shlq $32, %rax514; FAST_ISEL_SSE2-NEXT: orq %r14, %rax515; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0516; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload517; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]518; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload519; FAST_ISEL_SSE2-NEXT: addq $104, %rsp520; FAST_ISEL_SSE2-NEXT: popq %rbx521; FAST_ISEL_SSE2-NEXT: popq %r14522; FAST_ISEL_SSE2-NEXT: retq523;524; AVX512BF16-LABEL: return_arg_v16bf16:525; AVX512BF16: # %bb.0:526; AVX512BF16-NEXT: retq527;528; FAST_ISEL_AVX512BF16-LABEL: return_arg_v16bf16:529; FAST_ISEL_AVX512BF16: # %bb.0:530; FAST_ISEL_AVX512BF16-NEXT: retq531;532; AVXNECONVERT-LABEL: return_arg_v16bf16:533; AVXNECONVERT: # %bb.0:534; AVXNECONVERT-NEXT: retq535;536; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v16bf16:537; FAST_ISEL_AVXNECONVERT: # %bb.0:538; FAST_ISEL_AVXNECONVERT-NEXT: retq539 ret <16 x bfloat> %x540}541 542declare bfloat @returns_bf16(bfloat)543declare <2 x bfloat> @returns_v2bf16(<2 x bfloat>)544declare <3 x bfloat> @returns_v3bf16(<3 x bfloat>)545declare <4 x bfloat> @returns_v4bf16(<4 x bfloat>)546declare <8 x bfloat> @returns_v8bf16(<8 x bfloat>)547declare <16 x bfloat> @returns_v16bf16(<16 x bfloat>)548 549define bfloat @call_ret_bf16(ptr %ptr) #0 {550;551; SSE2-LABEL: call_ret_bf16:552; SSE2: # %bb.0:553; SSE2-NEXT: pushq %rax554; SSE2-NEXT: pinsrw $0, (%rdi), %xmm0555; SSE2-NEXT: callq returns_bf16@PLT556;557; FAST_ISEL_SSE2-LABEL: call_ret_bf16:558; FAST_ISEL_SSE2: # %bb.0:559; FAST_ISEL_SSE2-NEXT: pushq %rax560; FAST_ISEL_SSE2-NEXT: movzwl (%rdi), %eax561; FAST_ISEL_SSE2-NEXT: shll $16, %eax562; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0563; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT564; FAST_ISEL_SSE2-NEXT: callq returns_bf16@PLT565;566; AVX512BF16-LABEL: call_ret_bf16:567; AVX512BF16: # %bb.0:568; AVX512BF16-NEXT: pushq %rax569; AVX512BF16-NEXT: vpinsrw $0, (%rdi), %xmm0, %xmm0570; AVX512BF16-NEXT: callq returns_bf16@PLT571;572; FAST_ISEL_AVX512BF16-LABEL: call_ret_bf16:573; FAST_ISEL_AVX512BF16: # %bb.0:574; FAST_ISEL_AVX512BF16-NEXT: pushq %rax575; FAST_ISEL_AVX512BF16-NEXT: movzwl (%rdi), %eax576; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax577; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0578; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0579; FAST_ISEL_AVX512BF16-NEXT: callq returns_bf16@PLT580;581; AVXNECONVERT-LABEL: call_ret_bf16:582; AVXNECONVERT: # %bb.0:583; AVXNECONVERT-NEXT: pushq %rax584; AVXNECONVERT-NEXT: vpinsrw $0, (%rdi), %xmm0, %xmm0585; AVXNECONVERT-NEXT: callq returns_bf16@PLT586;587; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_bf16:588; FAST_ISEL_AVXNECONVERT: # %bb.0:589; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax590; FAST_ISEL_AVXNECONVERT-NEXT: movzwl (%rdi), %eax591; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax592; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0593; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0594; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_bf16@PLT595 %val = load bfloat, ptr %ptr596 call bfloat @returns_bf16(bfloat %val)597 unreachable598}599 600define <2 x bfloat> @call_ret_v2bf16(ptr %ptr) #0 {601;602; SSE2-LABEL: call_ret_v2bf16:603; SSE2: # %bb.0:604; SSE2-NEXT: pushq %rax605; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero606; SSE2-NEXT: callq returns_v2bf16@PLT607;608; FAST_ISEL_SSE2-LABEL: call_ret_v2bf16:609; FAST_ISEL_SSE2: # %bb.0:610; FAST_ISEL_SSE2-NEXT: subq $40, %rsp611; FAST_ISEL_SSE2-NEXT: movl (%rdi), %eax612; FAST_ISEL_SSE2-NEXT: movl %eax, (%rsp)613; FAST_ISEL_SSE2-NEXT: movdqa (%rsp), %xmm0614; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax615; FAST_ISEL_SSE2-NEXT: shll $16, %eax616; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill617; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax618; FAST_ISEL_SSE2-NEXT: shll $16, %eax619; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0620; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT621; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill622; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload623; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero624; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT625; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload626; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]627; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0628; FAST_ISEL_SSE2-NEXT: callq returns_v2bf16@PLT629;630; AVX512BF16-LABEL: call_ret_v2bf16:631; AVX512BF16: # %bb.0:632; AVX512BF16-NEXT: pushq %rax633; AVX512BF16-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero634; AVX512BF16-NEXT: callq returns_v2bf16@PLT635;636; FAST_ISEL_AVX512BF16-LABEL: call_ret_v2bf16:637; FAST_ISEL_AVX512BF16: # %bb.0:638; FAST_ISEL_AVX512BF16-NEXT: pushq %rax639; FAST_ISEL_AVX512BF16-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero640; FAST_ISEL_AVX512BF16-NEXT: callq returns_v2bf16@PLT641;642; AVXNECONVERT-LABEL: call_ret_v2bf16:643; AVXNECONVERT: # %bb.0:644; AVXNECONVERT-NEXT: pushq %rax645; AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero646; AVXNECONVERT-NEXT: callq returns_v2bf16@PLT647;648; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v2bf16:649; FAST_ISEL_AVXNECONVERT: # %bb.0:650; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax651; FAST_ISEL_AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero652; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v2bf16@PLT653 %val = load <2 x bfloat>, ptr %ptr654 call <2 x bfloat> @returns_v2bf16(<2 x bfloat> %val)655 unreachable656}657 658define <3 x bfloat> @call_ret_v3bf16(ptr %ptr) #0 {659;660; SSE2-LABEL: call_ret_v3bf16:661; SSE2: # %bb.0:662; SSE2-NEXT: pushq %rax663; SSE2-NEXT: pinsrw $0, 4(%rdi), %xmm1664; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero665; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]666; SSE2-NEXT: callq returns_v3bf16@PLT667;668; FAST_ISEL_SSE2-LABEL: call_ret_v3bf16:669; FAST_ISEL_SSE2: # %bb.0:670; FAST_ISEL_SSE2-NEXT: subq $40, %rsp671; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax672; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx673; FAST_ISEL_SSE2-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000674; FAST_ISEL_SSE2-NEXT: movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill675; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx676; FAST_ISEL_SSE2-NEXT: shll $16, %ecx677; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0678; FAST_ISEL_SSE2-NEXT: shrq $32, %rax679; FAST_ISEL_SSE2-NEXT: shll $16, %eax680; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill681; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT682; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill683; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload684; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero685; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT686; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload687; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]688; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill689; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload690; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero691; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT692; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload693; FAST_ISEL_SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]694; FAST_ISEL_SSE2-NEXT: movaps %xmm1, %xmm0695; FAST_ISEL_SSE2-NEXT: callq returns_v3bf16@PLT696;697; AVX512BF16-LABEL: call_ret_v3bf16:698; AVX512BF16: # %bb.0:699; AVX512BF16-NEXT: pushq %rax700; AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero701; AVX512BF16-NEXT: callq returns_v3bf16@PLT702;703; FAST_ISEL_AVX512BF16-LABEL: call_ret_v3bf16:704; FAST_ISEL_AVX512BF16: # %bb.0:705; FAST_ISEL_AVX512BF16-NEXT: pushq %rax706; FAST_ISEL_AVX512BF16-NEXT: movq (%rdi), %rax707; FAST_ISEL_AVX512BF16-NEXT: movl %eax, %ecx708; FAST_ISEL_AVX512BF16-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000709; FAST_ISEL_AVX512BF16-NEXT: vmovd %ecx, %xmm0710; FAST_ISEL_AVX512BF16-NEXT: movl %eax, %ecx711; FAST_ISEL_AVX512BF16-NEXT: shll $16, %ecx712; FAST_ISEL_AVX512BF16-NEXT: vmovd %ecx, %xmm1713; FAST_ISEL_AVX512BF16-NEXT: shrq $32, %rax714; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax715; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm2716; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm2, %xmm2717; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm2, %eax718; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm1, %xmm1719; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0720; FAST_ISEL_AVX512BF16-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]721; FAST_ISEL_AVX512BF16-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0722; FAST_ISEL_AVX512BF16-NEXT: callq returns_v3bf16@PLT723;724; AVXNECONVERT-LABEL: call_ret_v3bf16:725; AVXNECONVERT: # %bb.0:726; AVXNECONVERT-NEXT: pushq %rax727; AVXNECONVERT-NEXT: vpinsrw $0, 4(%rdi), %xmm0, %xmm0728; AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero729; AVXNECONVERT-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero730; AVXNECONVERT-NEXT: callq returns_v3bf16@PLT731;732; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v3bf16:733; FAST_ISEL_AVXNECONVERT: # %bb.0:734; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax735; FAST_ISEL_AVXNECONVERT-NEXT: movq (%rdi), %rax736; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx737; FAST_ISEL_AVXNECONVERT-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000738; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %ecx, %xmm0739; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx740; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %ecx741; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %ecx, %xmm1742; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax743; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax744; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm2745; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm2, %xmm2746; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm2, %eax747; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm1, %xmm1748; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0749; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]750; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0751; FAST_ISEL_AVXNECONVERT-NEXT: vmovq %xmm0, %rax752; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx753; FAST_ISEL_AVXNECONVERT-NEXT: shrl $16, %ecx754; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0755; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]756; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax757; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1758; FAST_ISEL_AVXNECONVERT-NEXT: vpbroadcastw %xmm1, %xmm1759; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7]760; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v3bf16@PLT761 %val = load <3 x bfloat>, ptr %ptr762 call <3 x bfloat> @returns_v3bf16(<3 x bfloat> %val)763 unreachable764}765 766define <4 x bfloat> @call_ret_v4bf16(ptr %ptr) #0 {767;768; SSE2-LABEL: call_ret_v4bf16:769; SSE2: # %bb.0:770; SSE2-NEXT: pushq %rax771; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero772; SSE2-NEXT: callq returns_v4bf16@PLT773;774; FAST_ISEL_SSE2-LABEL: call_ret_v4bf16:775; FAST_ISEL_SSE2: # %bb.0:776; FAST_ISEL_SSE2-NEXT: subq $56, %rsp777; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax778; FAST_ISEL_SSE2-NEXT: movq %rax, {{[0-9]+}}(%rsp)779; FAST_ISEL_SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0780; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax781; FAST_ISEL_SSE2-NEXT: shll $16, %eax782; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill783; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax784; FAST_ISEL_SSE2-NEXT: shll $16, %eax785; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill786; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax787; FAST_ISEL_SSE2-NEXT: shll $16, %eax788; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill789; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax790; FAST_ISEL_SSE2-NEXT: shll $16, %eax791; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0792; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT793; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill794; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload795; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero796; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT797; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload798; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]799; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill800; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload801; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero802; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT803; FAST_ISEL_SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill804; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload805; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero806; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT807; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload808; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]809; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload810; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]811; FAST_ISEL_SSE2-NEXT: callq returns_v4bf16@PLT812;813; AVX512BF16-LABEL: call_ret_v4bf16:814; AVX512BF16: # %bb.0:815; AVX512BF16-NEXT: pushq %rax816; AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero817; AVX512BF16-NEXT: callq returns_v4bf16@PLT818;819; FAST_ISEL_AVX512BF16-LABEL: call_ret_v4bf16:820; FAST_ISEL_AVX512BF16: # %bb.0:821; FAST_ISEL_AVX512BF16-NEXT: pushq %rax822; FAST_ISEL_AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero823; FAST_ISEL_AVX512BF16-NEXT: callq returns_v4bf16@PLT824;825; AVXNECONVERT-LABEL: call_ret_v4bf16:826; AVXNECONVERT: # %bb.0:827; AVXNECONVERT-NEXT: pushq %rax828; AVXNECONVERT-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero829; AVXNECONVERT-NEXT: callq returns_v4bf16@PLT830;831; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v4bf16:832; FAST_ISEL_AVXNECONVERT: # %bb.0:833; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax834; FAST_ISEL_AVXNECONVERT-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero835; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v4bf16@PLT836 %val = load <4 x bfloat>, ptr %ptr837 call <4 x bfloat> @returns_v4bf16(<4 x bfloat> %val)838 unreachable839}840 841define <8 x bfloat> @call_ret_v8bf16(ptr %ptr) #0 {842;843; SSE2-LABEL: call_ret_v8bf16:844; SSE2: # %bb.0:845; SSE2-NEXT: pushq %rax846; SSE2-NEXT: movaps (%rdi), %xmm0847; SSE2-NEXT: callq returns_v8bf16@PLT848;849; FAST_ISEL_SSE2-LABEL: call_ret_v8bf16:850; FAST_ISEL_SSE2: # %bb.0:851; FAST_ISEL_SSE2-NEXT: pushq %r14852; FAST_ISEL_SSE2-NEXT: pushq %rbx853; FAST_ISEL_SSE2-NEXT: subq $56, %rsp854; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm1855; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax856; FAST_ISEL_SSE2-NEXT: shll $16, %eax857; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill858; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax859; FAST_ISEL_SSE2-NEXT: shll $16, %eax860; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill861; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax862; FAST_ISEL_SSE2-NEXT: shll $16, %eax863; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill864; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax865; FAST_ISEL_SSE2-NEXT: shll $16, %eax866; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill867; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax868; FAST_ISEL_SSE2-NEXT: shll $16, %eax869; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill870; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax871; FAST_ISEL_SSE2-NEXT: shll $16, %eax872; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill873; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax874; FAST_ISEL_SSE2-NEXT: shll $16, %eax875; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0876; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax877; FAST_ISEL_SSE2-NEXT: shll $16, %eax878; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill879; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT880; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx881; FAST_ISEL_SSE2-NEXT: shll $16, %ebx882; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload883; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero884; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT885; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax886; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d887; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d888; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload889; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero890; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT891; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx892; FAST_ISEL_SSE2-NEXT: shll $16, %ebx893; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload894; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero895; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT896; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax897; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax898; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax899; FAST_ISEL_SSE2-NEXT: shlq $32, %rax900; FAST_ISEL_SSE2-NEXT: orq %r14, %rax901; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0902; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill903; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload904; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero905; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT906; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx907; FAST_ISEL_SSE2-NEXT: shll $16, %ebx908; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload909; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero910; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT911; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax912; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d913; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d914; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload915; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero916; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT917; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx918; FAST_ISEL_SSE2-NEXT: shll $16, %ebx919; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload920; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero921; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT922; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax923; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax924; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax925; FAST_ISEL_SSE2-NEXT: shlq $32, %rax926; FAST_ISEL_SSE2-NEXT: orq %r14, %rax927; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm1928; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload929; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]930; FAST_ISEL_SSE2-NEXT: callq returns_v8bf16@PLT931;932; AVX512BF16-LABEL: call_ret_v8bf16:933; AVX512BF16: # %bb.0:934; AVX512BF16-NEXT: pushq %rax935; AVX512BF16-NEXT: vmovaps (%rdi), %xmm0936; AVX512BF16-NEXT: callq returns_v8bf16@PLT937;938; FAST_ISEL_AVX512BF16-LABEL: call_ret_v8bf16:939; FAST_ISEL_AVX512BF16: # %bb.0:940; FAST_ISEL_AVX512BF16-NEXT: pushq %rax941; FAST_ISEL_AVX512BF16-NEXT: vmovaps (%rdi), %xmm0942; FAST_ISEL_AVX512BF16-NEXT: callq returns_v8bf16@PLT943;944; AVXNECONVERT-LABEL: call_ret_v8bf16:945; AVXNECONVERT: # %bb.0:946; AVXNECONVERT-NEXT: pushq %rax947; AVXNECONVERT-NEXT: vmovaps (%rdi), %xmm0948; AVXNECONVERT-NEXT: callq returns_v8bf16@PLT949;950; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v8bf16:951; FAST_ISEL_AVXNECONVERT: # %bb.0:952; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax953; FAST_ISEL_AVXNECONVERT-NEXT: vmovaps (%rdi), %xmm0954; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v8bf16@PLT955 %val = load <8 x bfloat>, ptr %ptr956 call <8 x bfloat> @returns_v8bf16(<8 x bfloat> %val)957 unreachable958}959 960define <16 x bfloat> @call_ret_v16bf16(ptr %ptr) #0 {961;962; SSE2-LABEL: call_ret_v16bf16:963; SSE2: # %bb.0:964; SSE2-NEXT: pushq %rax965; SSE2-NEXT: movaps (%rdi), %xmm0966; SSE2-NEXT: movaps 16(%rdi), %xmm1967; SSE2-NEXT: callq returns_v16bf16@PLT968;969; FAST_ISEL_SSE2-LABEL: call_ret_v16bf16:970; FAST_ISEL_SSE2: # %bb.0:971; FAST_ISEL_SSE2-NEXT: pushq %r14972; FAST_ISEL_SSE2-NEXT: pushq %rbx973; FAST_ISEL_SSE2-NEXT: subq $104, %rsp974; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm1975; FAST_ISEL_SSE2-NEXT: movdqa 16(%rdi), %xmm0976; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax977; FAST_ISEL_SSE2-NEXT: shll $16, %eax978; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill979; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax980; FAST_ISEL_SSE2-NEXT: shll $16, %eax981; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill982; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax983; FAST_ISEL_SSE2-NEXT: shll $16, %eax984; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill985; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax986; FAST_ISEL_SSE2-NEXT: shll $16, %eax987; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill988; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax989; FAST_ISEL_SSE2-NEXT: shll $16, %eax990; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill991; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax992; FAST_ISEL_SSE2-NEXT: shll $16, %eax993; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill994; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax995; FAST_ISEL_SSE2-NEXT: shll $16, %eax996; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill997; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax998; FAST_ISEL_SSE2-NEXT: shll $16, %eax999; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1000; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax1001; FAST_ISEL_SSE2-NEXT: shll $16, %eax1002; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1003; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax1004; FAST_ISEL_SSE2-NEXT: shll $16, %eax1005; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1006; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax1007; FAST_ISEL_SSE2-NEXT: shll $16, %eax1008; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1009; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax1010; FAST_ISEL_SSE2-NEXT: shll $16, %eax1011; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1012; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax1013; FAST_ISEL_SSE2-NEXT: shll $16, %eax1014; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1015; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax1016; FAST_ISEL_SSE2-NEXT: shll $16, %eax1017; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1018; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax1019; FAST_ISEL_SSE2-NEXT: shll $16, %eax1020; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm01021; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax1022; FAST_ISEL_SSE2-NEXT: shll $16, %eax1023; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1024; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1025; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1026; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1027; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1028; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1029; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1030; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1031; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d1032; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d1033; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1034; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1035; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1036; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1037; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1038; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1039; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1040; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1041; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1042; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax1043; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax1044; FAST_ISEL_SSE2-NEXT: shlq $32, %rax1045; FAST_ISEL_SSE2-NEXT: orq %r14, %rax1046; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm01047; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1048; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1049; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1050; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1051; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1052; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1053; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1054; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1055; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1056; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1057; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d1058; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d1059; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1060; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1061; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1062; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1063; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1064; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1065; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1066; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1067; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1068; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax1069; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax1070; FAST_ISEL_SSE2-NEXT: shlq $32, %rax1071; FAST_ISEL_SSE2-NEXT: orq %r14, %rax1072; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm01073; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1074; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1075; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1076; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1077; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1078; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1079; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1080; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1081; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1082; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1083; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1084; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1085; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d1086; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d1087; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1088; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1089; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1090; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1091; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1092; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1093; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1094; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1095; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1096; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax1097; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax1098; FAST_ISEL_SSE2-NEXT: shlq $32, %rax1099; FAST_ISEL_SSE2-NEXT: orq %r14, %rax1100; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm01101; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1102; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1103; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1104; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1105; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1106; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1107; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1108; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1109; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1110; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1111; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d1112; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d1113; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1114; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1115; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1116; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx1117; FAST_ISEL_SSE2-NEXT: shll $16, %ebx1118; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload1119; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero1120; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT1121; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax1122; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax1123; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax1124; FAST_ISEL_SSE2-NEXT: shlq $32, %rax1125; FAST_ISEL_SSE2-NEXT: orq %r14, %rax1126; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm01127; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1128; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1129; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload1130; FAST_ISEL_SSE2-NEXT: callq returns_v16bf16@PLT1131;1132; AVX512BF16-LABEL: call_ret_v16bf16:1133; AVX512BF16: # %bb.0:1134; AVX512BF16-NEXT: pushq %rax1135; AVX512BF16-NEXT: vmovaps (%rdi), %ymm01136; AVX512BF16-NEXT: callq returns_v16bf16@PLT1137;1138; FAST_ISEL_AVX512BF16-LABEL: call_ret_v16bf16:1139; FAST_ISEL_AVX512BF16: # %bb.0:1140; FAST_ISEL_AVX512BF16-NEXT: pushq %rax1141; FAST_ISEL_AVX512BF16-NEXT: vmovaps (%rdi), %ymm01142; FAST_ISEL_AVX512BF16-NEXT: callq returns_v16bf16@PLT1143;1144; AVXNECONVERT-LABEL: call_ret_v16bf16:1145; AVXNECONVERT: # %bb.0:1146; AVXNECONVERT-NEXT: pushq %rax1147; AVXNECONVERT-NEXT: vmovaps (%rdi), %ymm01148; AVXNECONVERT-NEXT: callq returns_v16bf16@PLT1149;1150; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v16bf16:1151; FAST_ISEL_AVXNECONVERT: # %bb.0:1152; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax1153; FAST_ISEL_AVXNECONVERT-NEXT: vmovaps (%rdi), %ymm01154; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v16bf16@PLT1155 %val = load <16 x bfloat>, ptr %ptr1156 call <16 x bfloat> @returns_v16bf16(<16 x bfloat> %val)1157 unreachable1158}1159 1160attributes #0 = { nounwind }1161