[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / cvt16-2.ll
blob67111e838cab8f4daccfb26ea4bb63fc3fd1eeed
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-avx512fp16 | FileCheck %s -check-prefix=LIBCALL
3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512fp16 | FileCheck %s -check-prefix=FP16
5 define void @test1(float %src, i16* %dest) {
6 ; LIBCALL-LABEL: test1:
7 ; LIBCALL:       # %bb.0:
8 ; LIBCALL-NEXT:    pushq %rbx
9 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16
10 ; LIBCALL-NEXT:    .cfi_offset %rbx, -16
11 ; LIBCALL-NEXT:    movq %rdi, %rbx
12 ; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
13 ; LIBCALL-NEXT:    movw %ax, (%rbx)
14 ; LIBCALL-NEXT:    popq %rbx
15 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8
16 ; LIBCALL-NEXT:    retq
18 ; FP16-LABEL: test1:
19 ; FP16:       # %bb.0:
20 ; FP16-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
21 ; FP16-NEXT:    vmovsh %xmm0, (%rdi)
22 ; FP16-NEXT:    retq
23   %1 = tail call i16 @llvm.convert.to.fp16.f32(float %src)
24   store i16 %1, i16* %dest, align 2
25   ret void
28 define float @test2(i16* nocapture %src) {
29 ; LIBCALL-LABEL: test2:
30 ; LIBCALL:       # %bb.0:
31 ; LIBCALL-NEXT:    movzwl (%rdi), %edi
32 ; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL
34 ; FP16-LABEL: test2:
35 ; FP16:       # %bb.0:
36 ; FP16-NEXT:    vmovsh (%rdi), %xmm0
37 ; FP16-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
38 ; FP16-NEXT:    retq
39   %1 = load i16, i16* %src, align 2
40   %2 = tail call float @llvm.convert.from.fp16.f32(i16 %1)
41   ret float %2
44 define float @test3(float %src) nounwind uwtable readnone {
45 ; LIBCALL-LABEL: test3:
46 ; LIBCALL:       # %bb.0:
47 ; LIBCALL-NEXT:    pushq %rax
48 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16
49 ; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
50 ; LIBCALL-NEXT:    movzwl %ax, %edi
51 ; LIBCALL-NEXT:    popq %rax
52 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8
53 ; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL
55 ; FP16-LABEL: test3:
56 ; FP16:       # %bb.0:
57 ; FP16-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
58 ; FP16-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
59 ; FP16-NEXT:    retq
60   %1 = tail call i16 @llvm.convert.to.fp16.f32(float %src)
61   %2 = tail call float @llvm.convert.from.fp16.f32(i16 %1)
62   ret float %2
65 ; FIXME: Should it be __extendhfdf2?
66 define double @test4(i16* nocapture %src) {
67 ; LIBCALL-LABEL: test4:
68 ; LIBCALL:       # %bb.0:
69 ; LIBCALL-NEXT:    pushq %rax
70 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16
71 ; LIBCALL-NEXT:    movzwl (%rdi), %edi
72 ; LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
73 ; LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
74 ; LIBCALL-NEXT:    popq %rax
75 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8
76 ; LIBCALL-NEXT:    retq
78 ; FP16-LABEL: test4:
79 ; FP16:       # %bb.0:
80 ; FP16-NEXT:    vmovsh (%rdi), %xmm0
81 ; FP16-NEXT:    vcvtsh2sd %xmm0, %xmm0, %xmm0
82 ; FP16-NEXT:    retq
83   %1 = load i16, i16* %src, align 2
84   %2 = tail call double @llvm.convert.from.fp16.f64(i16 %1)
85   ret double %2
88 define i16 @test5(double %src) {
89 ; LIBCALL-LABEL: test5:
90 ; LIBCALL:       # %bb.0:
91 ; LIBCALL-NEXT:    jmp __truncdfhf2@PLT # TAILCALL
93 ; FP16-LABEL: test5:
94 ; FP16:       # %bb.0:
95 ; FP16-NEXT:    vcvtsd2sh %xmm0, %xmm0, %xmm0
96 ; FP16-NEXT:    vmovw %xmm0, %eax
97 ; FP16-NEXT:    # kill: def $ax killed $ax killed $eax
98 ; FP16-NEXT:    retq
99   %val = tail call i16 @llvm.convert.to.fp16.f64(double %src)
100   ret i16 %val
103 ; FIXME: Should it be __extendhfxf2?
104 define x86_fp80 @test6(i16* nocapture %src) {
105 ; LIBCALL-LABEL: test6:
106 ; LIBCALL:       # %bb.0:
107 ; LIBCALL-NEXT:    pushq %rax
108 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16
109 ; LIBCALL-NEXT:    movzwl (%rdi), %edi
110 ; LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
111 ; LIBCALL-NEXT:    movss %xmm0, {{[0-9]+}}(%rsp)
112 ; LIBCALL-NEXT:    flds {{[0-9]+}}(%rsp)
113 ; LIBCALL-NEXT:    popq %rax
114 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8
115 ; LIBCALL-NEXT:    retq
117 ; FP16-LABEL: test6:
118 ; FP16:       # %bb.0:
119 ; FP16-NEXT:    pushq %rax
120 ; FP16-NEXT:    .cfi_def_cfa_offset 16
121 ; FP16-NEXT:    vmovsh (%rdi), %xmm0
122 ; FP16-NEXT:    callq __extendhfxf2@PLT
123 ; FP16-NEXT:    popq %rax
124 ; FP16-NEXT:    .cfi_def_cfa_offset 8
125 ; FP16-NEXT:    retq
126   %1 = load i16, i16* %src, align 2
127   %2 = tail call x86_fp80 @llvm.convert.from.fp16.f80(i16 %1)
128   ret x86_fp80 %2
131 define i16 @test7(x86_fp80 %src) {
132 ; LIBCALL-LABEL: test7:
133 ; LIBCALL:       # %bb.0:
134 ; LIBCALL-NEXT:    jmp __truncxfhf2@PLT # TAILCALL
136 ; FP16-LABEL: test7:
137 ; FP16:       # %bb.0:
138 ; FP16-NEXT:    subq $24, %rsp
139 ; FP16-NEXT:    .cfi_def_cfa_offset 32
140 ; FP16-NEXT:    fldt {{[0-9]+}}(%rsp)
141 ; FP16-NEXT:    fstpt (%rsp)
142 ; FP16-NEXT:    callq __truncxfhf2@PLT
143 ; FP16-NEXT:    vmovw %xmm0, %eax
144 ; FP16-NEXT:    # kill: def $ax killed $ax killed $eax
145 ; FP16-NEXT:    addq $24, %rsp
146 ; FP16-NEXT:    .cfi_def_cfa_offset 8
147 ; FP16-NEXT:    retq
148   %val = tail call i16 @llvm.convert.to.fp16.f80(x86_fp80 %src)
149   ret i16 %val
152 declare float @llvm.convert.from.fp16.f32(i16) nounwind readnone
153 declare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone
154 declare double @llvm.convert.from.fp16.f64(i16) nounwind readnone
155 declare i16 @llvm.convert.to.fp16.f64(double) nounwind readnone
156 declare x86_fp80 @llvm.convert.from.fp16.f80(i16) nounwind readnone
157 declare i16 @llvm.convert.to.fp16.f80(x86_fp80) nounwind readnone