| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx | FileCheck %s --check-prefixes=AVX |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2,-sse4.1 | FileCheck %s --check-prefixes=SSE |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE41 |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512 |
| |
| define <4 x float> @test_v4f32_u32(i32 %x) { |
| ; AVX-LABEL: test_v4f32_u32: |
| ; AVX: # %bb.0: |
| ; AVX-NEXT: movl %edi, %eax |
| ; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 |
| ; AVX-NEXT: vcvtsi2ss %rax, %xmm0, %xmm0 |
| ; AVX-NEXT: retq |
| ; |
| ; SSE-LABEL: test_v4f32_u32: |
| ; SSE: # %bb.0: |
| ; SSE-NEXT: movl %edi, %eax |
| ; SSE-NEXT: xorps %xmm0, %xmm0 |
| ; SSE-NEXT: cvtsi2ss %rax, %xmm0 |
| ; SSE-NEXT: retq |
| ; |
| ; SSE41-LABEL: test_v4f32_u32: |
| ; SSE41: # %bb.0: |
| ; SSE41-NEXT: movl %edi, %eax |
| ; SSE41-NEXT: xorps %xmm0, %xmm0 |
| ; SSE41-NEXT: cvtsi2ss %rax, %xmm0 |
| ; SSE41-NEXT: retq |
| ; |
| ; AVX512-LABEL: test_v4f32_u32: |
| ; AVX512: # %bb.0: |
| ; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0 |
| ; AVX512-NEXT: vcvtusi2ss %edi, %xmm0, %xmm0 |
| ; AVX512-NEXT: retq |
| %f = uitofp i32 %x to float |
| %v0 = insertelement <4 x float> zeroinitializer, float %f, i32 0 |
| ret <4 x float> %v0 |
| } |
| |
| define <4 x float> @test_v4f32_u64(i64 %x) { |
| ; AVX-LABEL: test_v4f32_u64: |
| ; AVX: # %bb.0: |
| ; AVX-NEXT: testq %rdi, %rdi |
| ; AVX-NEXT: js .LBB1_1 |
| ; AVX-NEXT: # %bb.2: |
| ; AVX-NEXT: vcvtsi2ss %rdi, %xmm15, %xmm0 |
| ; AVX-NEXT: jmp .LBB1_3 |
| ; AVX-NEXT: .LBB1_1: |
| ; AVX-NEXT: movq %rdi, %rax |
| ; AVX-NEXT: shrq %rax |
| ; AVX-NEXT: andl $1, %edi |
| ; AVX-NEXT: orq %rax, %rdi |
| ; AVX-NEXT: vcvtsi2ss %rdi, %xmm15, %xmm0 |
| ; AVX-NEXT: vaddss %xmm0, %xmm0, %xmm0 |
| ; AVX-NEXT: .LBB1_3: |
| ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 |
| ; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] |
| ; AVX-NEXT: retq |
| ; |
| ; SSE-LABEL: test_v4f32_u64: |
| ; SSE: # %bb.0: |
| ; SSE-NEXT: testq %rdi, %rdi |
| ; SSE-NEXT: js .LBB1_1 |
| ; SSE-NEXT: # %bb.2: |
| ; SSE-NEXT: cvtsi2ss %rdi, %xmm1 |
| ; SSE-NEXT: jmp .LBB1_3 |
| ; SSE-NEXT: .LBB1_1: |
| ; SSE-NEXT: movq %rdi, %rax |
| ; SSE-NEXT: shrq %rax |
| ; SSE-NEXT: andl $1, %edi |
| ; SSE-NEXT: orq %rax, %rdi |
| ; SSE-NEXT: cvtsi2ss %rdi, %xmm1 |
| ; SSE-NEXT: addss %xmm1, %xmm1 |
| ; SSE-NEXT: .LBB1_3: |
| ; SSE-NEXT: xorps %xmm0, %xmm0 |
| ; SSE-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] |
| ; SSE-NEXT: retq |
| ; |
| ; SSE41-LABEL: test_v4f32_u64: |
| ; SSE41: # %bb.0: |
| ; SSE41-NEXT: testq %rdi, %rdi |
| ; SSE41-NEXT: js .LBB1_1 |
| ; SSE41-NEXT: # %bb.2: |
| ; SSE41-NEXT: cvtsi2ss %rdi, %xmm1 |
| ; SSE41-NEXT: jmp .LBB1_3 |
| ; SSE41-NEXT: .LBB1_1: |
| ; SSE41-NEXT: movq %rdi, %rax |
| ; SSE41-NEXT: shrq %rax |
| ; SSE41-NEXT: andl $1, %edi |
| ; SSE41-NEXT: orq %rax, %rdi |
| ; SSE41-NEXT: cvtsi2ss %rdi, %xmm1 |
| ; SSE41-NEXT: addss %xmm1, %xmm1 |
| ; SSE41-NEXT: .LBB1_3: |
| ; SSE41-NEXT: xorps %xmm0, %xmm0 |
| ; SSE41-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] |
| ; SSE41-NEXT: retq |
| ; |
| ; AVX512-LABEL: test_v4f32_u64: |
| ; AVX512: # %bb.0: |
| ; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0 |
| ; AVX512-NEXT: vcvtusi2ss %rdi, %xmm0, %xmm0 |
| ; AVX512-NEXT: retq |
| %f = uitofp i64 %x to float |
| %v0 = insertelement <4 x float> zeroinitializer, float %f, i32 0 |
| ret <4 x float> %v0 |
| } |
| |
| define <2 x double> @test_v2f64_u32(i32 %x) { |
| ; AVX-LABEL: test_v2f64_u32: |
| ; AVX: # %bb.0: |
| ; AVX-NEXT: movl %edi, %eax |
| ; AVX-NEXT: vxorpd %xmm0, %xmm0, %xmm0 |
| ; AVX-NEXT: vcvtsi2sd %rax, %xmm0, %xmm0 |
| ; AVX-NEXT: retq |
| ; |
| ; SSE-LABEL: test_v2f64_u32: |
| ; SSE: # %bb.0: |
| ; SSE-NEXT: movl %edi, %eax |
| ; SSE-NEXT: xorpd %xmm0, %xmm0 |
| ; SSE-NEXT: cvtsi2sd %rax, %xmm0 |
| ; SSE-NEXT: retq |
| ; |
| ; SSE41-LABEL: test_v2f64_u32: |
| ; SSE41: # %bb.0: |
| ; SSE41-NEXT: movl %edi, %eax |
| ; SSE41-NEXT: xorpd %xmm0, %xmm0 |
| ; SSE41-NEXT: cvtsi2sd %rax, %xmm0 |
| ; SSE41-NEXT: retq |
| ; |
| ; AVX512-LABEL: test_v2f64_u32: |
| ; AVX512: # %bb.0: |
| ; AVX512-NEXT: vxorpd %xmm0, %xmm0, %xmm0 |
| ; AVX512-NEXT: vcvtusi2sd %edi, %xmm0, %xmm0 |
| ; AVX512-NEXT: retq |
| %d = uitofp i32 %x to double |
| %v0 = insertelement <2 x double> zeroinitializer, double %d, i32 0 |
| ret <2 x double> %v0 |
| } |
| |
| define <2 x double> @test_v2f64_u64(i64 %x) { |
| ; AVX-LABEL: test_v2f64_u64: |
| ; AVX: # %bb.0: |
| ; AVX-NEXT: vmovq %rdi, %xmm0 |
| ; AVX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] |
| ; AVX-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 |
| ; AVX-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0] |
| ; AVX-NEXT: vaddpd %xmm0, %xmm1, %xmm0 |
| ; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero |
| ; AVX-NEXT: retq |
| ; |
| ; SSE-LABEL: test_v2f64_u64: |
| ; SSE: # %bb.0: |
| ; SSE-NEXT: movq %rdi, %xmm0 |
| ; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] |
| ; SSE-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 |
| ; SSE-NEXT: movapd %xmm0, %xmm1 |
| ; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] |
| ; SSE-NEXT: addpd %xmm0, %xmm1 |
| ; SSE-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero |
| ; SSE-NEXT: retq |
| ; |
| ; SSE41-LABEL: test_v2f64_u64: |
| ; SSE41: # %bb.0: |
| ; SSE41-NEXT: movq %rdi, %xmm0 |
| ; SSE41-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1] |
| ; SSE41-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 |
| ; SSE41-NEXT: movapd %xmm0, %xmm1 |
| ; SSE41-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] |
| ; SSE41-NEXT: addpd %xmm0, %xmm1 |
| ; SSE41-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero |
| ; SSE41-NEXT: retq |
| ; |
| ; AVX512-LABEL: test_v2f64_u64: |
| ; AVX512: # %bb.0: |
| ; AVX512-NEXT: vxorpd %xmm0, %xmm0, %xmm0 |
| ; AVX512-NEXT: vcvtusi2sd %rdi, %xmm0, %xmm0 |
| ; AVX512-NEXT: retq |
| %d = uitofp i64 %x to double |
| %v0 = insertelement <2 x double> zeroinitializer, double %d, i32 0 |
| ret <2 x double> %v0 |
| } |