blob: 64ce6d2af719acc5ccb48c937d6709ac42cee7de [file] [edit]
; 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
}