| ; 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: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; 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: vpslld $16, %xmm0, %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: vpslld $16, %xmm0, %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: pextrw $1, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | |
| ; 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: pextrw $2, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] | |
| ; 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: vpxor %xmm1, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm0[1],xmm1[2],xmm0[3],xmm1[4],xmm0[5],xmm1[6],xmm0[7] | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpslld $16, %xmm0, %xmm2 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpextrw $2, %xmm0, %eax | |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm0 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm0, %xmm0 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %xmm0, %eax | |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm2, %xmm0 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vcvtneps2bf16 %xmm1, %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: vpxor %xmm1, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm0[1],xmm1[2],xmm0[3],xmm1[4],xmm0[5],xmm1[6],xmm0[7] | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpslld $16, %xmm0, %xmm2 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpextrw $2, %xmm0, %eax | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm0 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpslld $16, %xmm0, %xmm0 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm0, %xmm0 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %xmm0, %eax | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm2, %xmm0 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: {vex} vcvtneps2bf16 %xmm1, %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: pextrw $3, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] | |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] | |
| ; 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: pxor %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %esi | |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm6, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm6, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm7, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm7, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm5, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm5, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm4, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] | |
| ; 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: pxor %xmm9, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: pxor %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7] | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4],xmm0[4],xmm9[5],xmm0[5],xmm9[6],xmm0[6],xmm9[7],xmm0[7] | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm1, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm1, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm1, %esi | |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm1, %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %esi | |
| ; FAST_ISEL_SSE2-NEXT: movdqa %xmm0, %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm14, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm14, %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm15, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm15, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm13, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm13, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm9, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm9, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm12, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm12, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm11, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm11, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm10, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm10, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm9[0] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm8, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm8, %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm7, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm7, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm6, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm6, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm4, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm5, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm5, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] | |
| ; 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: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; 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: pushq %rax | |
| ; 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: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] | |
| ; 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: pinsrw $0, 4(%rdi), %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: pushq %rax | |
| ; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax | |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: shrq $32, %rax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: psrld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] | |
| ; 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: vmovd %eax, %xmm0 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3],xmm1[4],xmm0[5],xmm1[6],xmm0[7] | |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovq %rax, %xmm1 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVX512BF16-NEXT: shrq $32, %rax | |
| ; FAST_ISEL_AVX512BF16-NEXT: vmovd %eax, %xmm2 | |
| ; FAST_ISEL_AVX512BF16-NEXT: vpslld $16, %xmm2, %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: vpinsrw $0, 4(%rdi), %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: vmovd %eax, %xmm0 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpxor %xmm1, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3],xmm1[4],xmm0[5],xmm1[6],xmm0[7] | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovq %rax, %xmm1 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpslld $16, %xmm1, %xmm1 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: shrq $32, %rax | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vmovd %eax, %xmm2 | |
| ; FAST_ISEL_AVXNECONVERT-NEXT: vpslld $16, %xmm2, %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: pushq %rax | |
| ; FAST_ISEL_SSE2-NEXT: movq (%rdi), %rax | |
| ; FAST_ISEL_SSE2-NEXT: movq %rax, (%rsp) | |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rsp), %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm0, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %ecx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pinsrw $0, %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] | |
| ; FAST_ISEL_SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[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 %rax | |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pxor %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm6[4],xmm3[5],xmm6[5],xmm3[6],xmm6[6],xmm3[7],xmm6[7] | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm6, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm6, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm6, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm6, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm6, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm6, %esi | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm6, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm6, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm7, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm7, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm5, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm5, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm4, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm1 | |
| ; 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 %rax | |
| ; FAST_ISEL_SSE2-NEXT: movdqa (%rdi), %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: movdqa 16(%rdi), %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: pxor %xmm9, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: pxor %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm8[4],xmm4[5],xmm8[5],xmm4[6],xmm8[6],xmm4[7],xmm8[7] | |
| ; FAST_ISEL_SSE2-NEXT: punpckhwd {{.*#+}} xmm9 = xmm9[4],xmm14[4],xmm9[5],xmm14[5],xmm9[6],xmm14[6],xmm9[7],xmm14[7] | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm8, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm8, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm8, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm8, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm8, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm8, %esi | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $7, %xmm14, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $6, %xmm14, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $5, %xmm14, %eax | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $3, %xmm14, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $2, %xmm14, %edx | |
| ; FAST_ISEL_SSE2-NEXT: pextrw $1, %xmm14, %esi | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: movd %eax, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: movd %ecx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %edx, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: movd %esi, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: pslld $16, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm14, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm14, %xmm14 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm15, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm15, %xmm15 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm13, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm13, %xmm13 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm0, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm0, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm0 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm9, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm9, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm12, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm12, %xmm12 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm11, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm11, %xmm11 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm10, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm10, %xmm10 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm9 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm9[0] | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm8, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm8, %xmm8 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm7, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm7, %xmm7 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm6, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm6, %xmm6 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm1, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm1, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm1 | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm4, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %eax # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm4, %xmm4 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %eax, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm5, %eax | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movl %eax, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %eax # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm5, %xmm5 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %eax | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm3, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %edx # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %ecx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm3, %xmm3 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %edx, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: shrl $16, %ecx | |
| ; FAST_ISEL_SSE2-NEXT: movd %xmm2, %edx | |
| ; FAST_ISEL_SSE2-NEXT: btl $16, %edx | |
| ; FAST_ISEL_SSE2-NEXT: movl %edx, %esi | |
| ; FAST_ISEL_SSE2-NEXT: adcl $32767, %esi # imm = 0x7FFF | |
| ; FAST_ISEL_SSE2-NEXT: orl $4194304, %edx # imm = 0x400000 | |
| ; FAST_ISEL_SSE2-NEXT: ucomiss %xmm2, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: cmovnpl %esi, %edx | |
| ; FAST_ISEL_SSE2-NEXT: andl $-65536, %edx # imm = 0xFFFF0000 | |
| ; FAST_ISEL_SSE2-NEXT: orl %ecx, %edx | |
| ; FAST_ISEL_SSE2-NEXT: shlq $32, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: orq %rax, %rdx | |
| ; FAST_ISEL_SSE2-NEXT: movq %rdx, %xmm2 | |
| ; FAST_ISEL_SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] | |
| ; 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 } |