Enable StackMap Serialization for COFF
[oota-llvm.git] / test / CodeGen / X86 / fma3-intrinsics.ll
1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 -mcpu=core-avx2 | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-pc-win32 -mattr=+fma,+fma4 | FileCheck %s
3 ; RUN: llc < %s -mcpu=bdver2 -mtriple=x86_64-pc-win32 -mattr=-fma4 | FileCheck %s
4
5 define <4 x float> @test_x86_fmadd_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
6   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
7   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
8   ; CHECK: fmadd213ss (%r8), [[XMM1]], [[XMM0]]
9   %res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
10   ret <4 x float> %res
11 }
12 declare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
13
14 define <4 x float> @test_x86_fmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
15   ; CHECK: fmadd213ps
16   %res = call <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
17   ret <4 x float> %res
18 }
19 declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
20
21 define <8 x float> @test_x86_fmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
22   ; CHECK: fmadd213ps {{.*\(%r.*}}, %ymm
23   %res = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) nounwind
24   ret <8 x float> %res
25 }
26 declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
27
28 define <4 x float> @test_x86_fnmadd_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
29   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
30   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
31   ; CHECK: fnmadd213ss (%r8), [[XMM1]], [[XMM0]]
32   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
33   ret <4 x float> %res
34 }
35 declare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
36
37 define <4 x float> @test_x86_fnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
38   ; CHECK: fnmadd213ps
39   %res = call <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
40   ret <4 x float> %res
41 }
42 declare <4 x float> @llvm.x86.fma.vfnmadd.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
43
44 define <8 x float> @test_x86_fnmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
45   ; CHECK: fnmadd213ps {{.*\(%r.*}}, %ymm
46   %res = call <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) nounwind
47   ret <8 x float> %res
48 }
49 declare <8 x float> @llvm.x86.fma.vfnmadd.ps.256(<8 x float>, <8 x float>, <8 x float>) nounwind readnone
50
51
52 define <4 x float> @test_x86_fmsub_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
53   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
54   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
55   ; CHECK: fmsub213ss (%r8), [[XMM1]], [[XMM0]]
56   %res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
57   ret <4 x float> %res
58 }
59 declare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
60
61 define <4 x float> @test_x86_fmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
62   ; CHECK: fmsub213ps
63   %res = call <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
64   ret <4 x float> %res
65 }
66 declare <4 x float> @llvm.x86.fma.vfmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
67
68 define <4 x float> @test_x86_fnmsub_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
69   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
70   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
71   ; CHECK: fnmsub213ss (%r8), [[XMM1]], [[XMM0]]
72   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
73   ret <4 x float> %res
74 }
75 declare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
76
77 define <4 x float> @test_x86_fnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
78   ; CHECK: fnmsub213ps
79   %res = call <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) nounwind
80   ret <4 x float> %res
81 }
82 declare <4 x float> @llvm.x86.fma.vfnmsub.ps(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
83
84 ;;;;
85
86 define <2 x double> @test_x86_fmadd_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
87   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
88   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
89   ; CHECK: fmadd213sd (%r8), [[XMM1]], [[XMM0]]
90   %res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
91   ret <2 x double> %res
92 }
93 declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
94
95 define <2 x double> @test_x86_fmadd_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
96   ; CHECK: fmadd213pd
97   %res = call <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
98   ret <2 x double> %res
99 }
100 declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
101
102 define <2 x double> @test_x86_fnmadd_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
103   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
104   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
105   ; CHECK: fnmadd213sd (%r8), [[XMM1]], [[XMM0]]
106   %res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
107   ret <2 x double> %res
108 }
109 declare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
110
111 define <2 x double> @test_x86_fnmadd_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
112   ; CHECK: fnmadd213pd
113   %res = call <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
114   ret <2 x double> %res
115 }
116 declare <2 x double> @llvm.x86.fma.vfnmadd.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
117
118
119
120 define <2 x double> @test_x86_fmsub_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
121   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
122   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
123   ; CHECK: fmsub213sd (%r8), [[XMM1]], [[XMM0]]
124   %res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
125   ret <2 x double> %res
126 }
127 declare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
128
129 define <2 x double> @test_x86_fmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
130   ; CHECK: fmsub213pd
131   %res = call <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
132   ret <2 x double> %res
133 }
134 declare <2 x double> @llvm.x86.fma.vfmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
135
136 define <2 x double> @test_x86_fnmsub_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
137   ; CHECK-DAG: vmovaps (%rcx), [[XMM1:%xmm[0-9]+]]
138   ; CHECK-DAG: vmovaps (%rdx), [[XMM0:%xmm[0-9]+]]
139   ; CHECK: fnmsub213sd (%r8), [[XMM1]], [[XMM0]]
140   %res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
141   ret <2 x double> %res
142 }
143 declare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone
144
145 define <2 x double> @test_x86_fnmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
146   ; CHECK: fnmsub213pd
147   %res = call <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) nounwind
148   ret <2 x double> %res
149 }
150 declare <2 x double> @llvm.x86.fma.vfnmsub.pd(<2 x double>, <2 x double>, <2 x double>) nounwind readnone