1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse2-builtins.c 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mm_cvtsd_si64(<2 x double> %a0) nounwind { 7*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_cvtsd_si64: 8*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 9*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cvtsd2si %xmm0, %rax 10*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 11*9880d681SAndroid Build Coastguard Worker %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) 12*9880d681SAndroid Build Coastguard Worker ret i64 %res 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mm_cvtsi128_si64(<2 x i64> %a0) nounwind { 17*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_cvtsi128_si64: 18*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 19*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movd %xmm0, %rax 20*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 21*9880d681SAndroid Build Coastguard Worker %res = extractelement <2 x i64> %a0, i32 0 22*9880d681SAndroid Build Coastguard Worker ret i64 %res 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_cvtsi64_sd(<2 x double> %a0, i64 %a1) nounwind { 26*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_cvtsi64_sd: 27*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 28*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cvtsi2sdq %rdi, %xmm1 29*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 30*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 31*9880d681SAndroid Build Coastguard Worker %cvt = sitofp i64 %a1 to double 32*9880d681SAndroid Build Coastguard Worker %res = insertelement <2 x double> %a0, double %cvt, i32 0 33*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_mm_cvtsi64_si128(i64 %a0) nounwind { 37*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_cvtsi64_si128: 38*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 39*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movd %rdi, %xmm0 40*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 41*9880d681SAndroid Build Coastguard Worker %res0 = insertelement <2 x i64> undef, i64 %a0, i32 0 42*9880d681SAndroid Build Coastguard Worker %res1 = insertelement <2 x i64> %res0, i64 0, i32 1 43*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %res1 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i64 @test_mm_cvttsd_si64(<2 x double> %a0) nounwind { 47*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_cvttsd_si64: 48*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 49*9880d681SAndroid Build Coastguard Worker; X64-NEXT: cvttsd2si %xmm0, %rax 50*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 51*9880d681SAndroid Build Coastguard Worker %ext = extractelement <2 x double> %a0, i32 0 52*9880d681SAndroid Build Coastguard Worker %res = fptosi double %ext to i64 53*9880d681SAndroid Build Coastguard Worker ret i64 %res 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_mm_loadu_si64(i64* %a0) nounwind { 57*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_loadu_si64: 58*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 59*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 60*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 61*9880d681SAndroid Build Coastguard Worker %ld = load i64, i64* %a0, align 1 62*9880d681SAndroid Build Coastguard Worker %res0 = insertelement <2 x i64> undef, i64 %ld, i32 0 63*9880d681SAndroid Build Coastguard Worker %res1 = insertelement <2 x i64> %res0, i64 0, i32 1 64*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %res1 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine void @test_mm_stream_si64(i64 *%a0, i64 %a1) { 68*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_stream_si64: 69*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 70*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movntiq %rsi, (%rdi) 71*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 72*9880d681SAndroid Build Coastguard Worker store i64 %a1, i64* %a0, align 1, !nontemporal !0 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker!0 = !{i64 1} 77