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