| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+sse2 < %s | FileCheck -check-prefixes=SSE2 %s |
| ; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+sse2 < %s | FileCheck -check-prefixes=FAST_ISEL_SSE2 %s |
| ; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+avx512bf16,avx512vl < %s | FileCheck -check-prefixes=AVX512BF16 %s |
| ; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+avx512bf16,avx512vl < %s | FileCheck -check-prefixes=FAST_ISEL_AVX512BF16 %s |
| ; RUN: llc -fast-isel=false -mtriple=x86_64-linux-unknown -mattr=+avxneconvert < %s | FileCheck -check-prefixes=AVXNECONVERT %s |
| ; RUN: llc -fast-isel -mtriple=x86_64-linux-unknown -mattr=+avxneconvert < %s | FileCheck -check-prefixes=FAST_ISEL_AVXNECONVERT %s |
| |
| define bfloat @return_arg_bf16(bfloat %x) #0 { |
| ; SSE2-LABEL: return_arg_bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %rax |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: popq %rax |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: vpextrw $0, %xmm0, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $0, %xmm0, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret bfloat %x |
| } |
| |
| define <2 x bfloat> @return_arg_v2bf16(<2 x bfloat> %x) #0 { |
| ; SSE2-LABEL: return_arg_v2bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_v2bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: addq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_v2bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_v2bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_v2bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v2bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret <2 x bfloat> %x |
| } |
| |
| define <3 x bfloat> @return_arg_v3bf16(<3 x bfloat> %x) #0 { |
| ; SSE2-LABEL: return_arg_v3bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_v3bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] |
| ; FAST_ISEL_SSE2-NEXT: movaps %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: addq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_v3bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_v3bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: vpextrw $2, %xmm0, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm1 |
| ; FAST_ISEL_AVX512BF16-NEXT: vpextrw $1, %xmm0, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm2 |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm0, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm1, %xmm1 |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm1, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm2, %xmm1 |
| ; FAST_ISEL_AVX512BF16-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] |
| ; FAST_ISEL_AVX512BF16-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_v3bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v3bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $2, %xmm0, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $1, %xmm0, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm2 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm0, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm1, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm1, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm2, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $2, %eax, %xmm1, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovq %xmm1, %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrl $16, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpbroadcastw %xmm1, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret <3 x bfloat> %x |
| } |
| |
| define <4 x bfloat> @return_arg_v4bf16(<4 x bfloat> %x) #0 { |
| ; SSE2-LABEL: return_arg_v4bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_v4bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] |
| ; FAST_ISEL_SSE2-NEXT: addq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_v4bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_v4bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_v4bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v4bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret <4 x bfloat> %x |
| } |
| |
| define <8 x bfloat> @return_arg_v8bf16(<8 x bfloat> %x) #0 { |
| ; SSE2-LABEL: return_arg_v8bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_v8bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %r14 |
| ; FAST_ISEL_SSE2-NEXT: pushq %rbx |
| ; FAST_ISEL_SSE2-NEXT: subq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] |
| ; FAST_ISEL_SSE2-NEXT: addq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: popq %rbx |
| ; FAST_ISEL_SSE2-NEXT: popq %r14 |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_v8bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_v8bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_v8bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v8bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret <8 x bfloat> %x |
| } |
| |
| define <16 x bfloat> @return_arg_v16bf16(<16 x bfloat> %x) #0 { |
| ; |
| ; SSE2-LABEL: return_arg_v16bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: retq |
| ; |
| ; FAST_ISEL_SSE2-LABEL: return_arg_v16bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %r14 |
| ; FAST_ISEL_SSE2-NEXT: pushq %rbx |
| ; FAST_ISEL_SSE2-NEXT: subq $104, %rsp |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] |
| ; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: addq $104, %rsp |
| ; FAST_ISEL_SSE2-NEXT: popq %rbx |
| ; FAST_ISEL_SSE2-NEXT: popq %r14 |
| ; FAST_ISEL_SSE2-NEXT: retq |
| ; |
| ; AVX512BF16-LABEL: return_arg_v16bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: retq |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: return_arg_v16bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: retq |
| ; |
| ; AVXNECONVERT-LABEL: return_arg_v16bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: retq |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: return_arg_v16bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: retq |
| ret <16 x bfloat> %x |
| } |
| |
| declare bfloat @returns_bf16(bfloat) |
| declare <2 x bfloat> @returns_v2bf16(<2 x bfloat>) |
| declare <3 x bfloat> @returns_v3bf16(<3 x bfloat>) |
| declare <4 x bfloat> @returns_v4bf16(<4 x bfloat>) |
| declare <8 x bfloat> @returns_v8bf16(<8 x bfloat>) |
| declare <16 x bfloat> @returns_v16bf16(<16 x bfloat>) |
| |
| define bfloat @call_ret_bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: pinsrw $0, (%rdi), %xmm0 |
| ; SSE2-NEXT: callq returns_bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %rax |
| ; FAST_ISEL_SSE2-NEXT: movzwl (%rdi), %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: callq returns_bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vpinsrw $0, (%rdi), %xmm0, %xmm0 |
| ; AVX512BF16-NEXT: callq returns_bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: movzwl (%rdi), %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: vpinsrw $0, (%rdi), %xmm0, %xmm0 |
| ; AVXNECONVERT-NEXT: callq returns_bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movzwl (%rdi), %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_bf16@PLT |
| %val = load bfloat, ptr %ptr |
| call bfloat @returns_bf16(bfloat %val) |
| unreachable |
| } |
| |
| define <2 x bfloat> @call_ret_v2bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_v2bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; SSE2-NEXT: callq returns_v2bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_v2bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: movl (%rdi), %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, (%rsp) |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rsp), %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq returns_v2bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_v2bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; AVX512BF16-NEXT: callq returns_v2bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_v2bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_v2bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_v2bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; AVXNECONVERT-NEXT: callq returns_v2bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v2bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v2bf16@PLT |
| %val = load <2 x bfloat>, ptr %ptr |
| call <2 x bfloat> @returns_v2bf16(<2 x bfloat> %val) |
| unreachable |
| } |
| |
| define <3 x bfloat> @call_ret_v3bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_v3bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: movl 4(%rdi), %eax |
| ; SSE2-NEXT: pinsrw $0, %eax, %xmm1 |
| ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero |
| ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] |
| ; SSE2-NEXT: callq returns_v3bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_v3bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $40, %rsp |
| ; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000 |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ecx |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: shrq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] |
| ; FAST_ISEL_SSE2-NEXT: movaps %xmm1, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq returns_v3bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_v3bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero |
| ; AVX512BF16-NEXT: callq returns_v3bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_v3bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: movq (%rdi), %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVX512BF16-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000 |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %ecx, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %ecx |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %ecx, %xmm1 |
| ; FAST_ISEL_AVX512BF16-NEXT: shrq $32, %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm2 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm2, %xmm2 |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm2, %eax |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm1, %xmm1 |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_AVX512BF16-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_v3bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_v3bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: movl 4(%rdi), %eax |
| ; AVXNECONVERT-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0 |
| ; AVXNECONVERT-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero |
| ; AVXNECONVERT-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero |
| ; AVXNECONVERT-NEXT: callq returns_v3bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v3bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movq (%rdi), %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: andl $-65536, %ecx # imm = 0xFFFF0000 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %ecx, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %ecx, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shll $16, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm2 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm2, %xmm2 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm2, %eax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm1, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $2, %eax, %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovq %xmm0, %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: movl %eax, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrl $16, %ecx |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpbroadcastw %xmm1, %xmm1 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3,4,5,6,7] |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v3bf16@PLT |
| %val = load <3 x bfloat>, ptr %ptr |
| call <3 x bfloat> @returns_v3bf16(<3 x bfloat> %val) |
| unreachable |
| } |
| |
| define <4 x bfloat> @call_ret_v4bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_v4bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero |
| ; SSE2-NEXT: callq returns_v4bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_v4bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: subq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, {{[0-9]+}}(%rsp) |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] |
| ; FAST_ISEL_SSE2-NEXT: callq returns_v4bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_v4bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero |
| ; AVX512BF16-NEXT: callq returns_v4bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_v4bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_v4bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_v4bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero |
| ; AVXNECONVERT-NEXT: callq returns_v4bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v4bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v4bf16@PLT |
| %val = load <4 x bfloat>, ptr %ptr |
| call <4 x bfloat> @returns_v4bf16(<4 x bfloat> %val) |
| unreachable |
| } |
| |
| define <8 x bfloat> @call_ret_v8bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_v8bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: movaps (%rdi), %xmm0 |
| ; SSE2-NEXT: callq returns_v8bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_v8bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %r14 |
| ; FAST_ISEL_SSE2-NEXT: pushq %rbx |
| ; FAST_ISEL_SSE2-NEXT: subq $56, %rsp |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] |
| ; FAST_ISEL_SSE2-NEXT: callq returns_v8bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_v8bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vmovaps (%rdi), %xmm0 |
| ; AVX512BF16-NEXT: callq returns_v8bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_v8bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovaps (%rdi), %xmm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_v8bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_v8bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: vmovaps (%rdi), %xmm0 |
| ; AVXNECONVERT-NEXT: callq returns_v8bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v8bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovaps (%rdi), %xmm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v8bf16@PLT |
| %val = load <8 x bfloat>, ptr %ptr |
| call <8 x bfloat> @returns_v8bf16(<8 x bfloat> %val) |
| unreachable |
| } |
| |
| define <16 x bfloat> @call_ret_v16bf16(ptr %ptr) #0 { |
| ; |
| ; SSE2-LABEL: call_ret_v16bf16: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: pushq %rax |
| ; SSE2-NEXT: movaps (%rdi), %xmm0 |
| ; SSE2-NEXT: movaps 16(%rdi), %xmm1 |
| ; SSE2-NEXT: callq returns_v16bf16@PLT |
| ; |
| ; FAST_ISEL_SSE2-LABEL: call_ret_v16bf16: |
| ; FAST_ISEL_SSE2: # %bb.0: |
| ; FAST_ISEL_SSE2-NEXT: pushq %r14 |
| ; FAST_ISEL_SSE2-NEXT: pushq %rbx |
| ; FAST_ISEL_SSE2-NEXT: subq $104, %rsp |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm1 |
| ; FAST_ISEL_SSE2-NEXT: movdqa 16(%rdi), %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $4, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %eax |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %r14d |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %r14d |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %ebx |
| ; FAST_ISEL_SSE2-NEXT: shll $16, %ebx |
| ; FAST_ISEL_SSE2-NEXT: movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload |
| ; FAST_ISEL_SSE2-NEXT: # xmm0 = mem[0],zero,zero,zero |
| ; FAST_ISEL_SSE2-NEXT: callq __truncsfbf2@PLT |
| ; FAST_ISEL_SSE2-NEXT: pextrw $0, %xmm0, %eax |
| ; FAST_ISEL_SSE2-NEXT: movzwl %ax, %eax |
| ; FAST_ISEL_SSE2-NEXT: orl %ebx, %eax |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rax |
| ; FAST_ISEL_SSE2-NEXT: orq %r14, %rax |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 |
| ; FAST_ISEL_SSE2-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] |
| ; FAST_ISEL_SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload |
| ; FAST_ISEL_SSE2-NEXT: callq returns_v16bf16@PLT |
| ; |
| ; AVX512BF16-LABEL: call_ret_v16bf16: |
| ; AVX512BF16: # %bb.0: |
| ; AVX512BF16-NEXT: pushq %rax |
| ; AVX512BF16-NEXT: vmovaps (%rdi), %ymm0 |
| ; AVX512BF16-NEXT: callq returns_v16bf16@PLT |
| ; |
| ; FAST_ISEL_AVX512BF16-LABEL: call_ret_v16bf16: |
| ; FAST_ISEL_AVX512BF16: # %bb.0: |
| ; FAST_ISEL_AVX512BF16-NEXT: pushq %rax |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovaps (%rdi), %ymm0 |
| ; FAST_ISEL_AVX512BF16-NEXT: callq returns_v16bf16@PLT |
| ; |
| ; AVXNECONVERT-LABEL: call_ret_v16bf16: |
| ; AVXNECONVERT: # %bb.0: |
| ; AVXNECONVERT-NEXT: pushq %rax |
| ; AVXNECONVERT-NEXT: vmovaps (%rdi), %ymm0 |
| ; AVXNECONVERT-NEXT: callq returns_v16bf16@PLT |
| ; |
| ; FAST_ISEL_AVXNECONVERT-LABEL: call_ret_v16bf16: |
| ; FAST_ISEL_AVXNECONVERT: # %bb.0: |
| ; FAST_ISEL_AVXNECONVERT-NEXT: pushq %rax |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovaps (%rdi), %ymm0 |
| ; FAST_ISEL_AVXNECONVERT-NEXT: callq returns_v16bf16@PLT |
| %val = load <16 x bfloat>, ptr %ptr |
| call <16 x bfloat> @returns_v16bf16(<16 x bfloat> %val) |
| unreachable |
| } |
| |
| attributes #0 = { nounwind } |