blob: 0c1c41ecc48611184d54c89c0fdafb9ac7c92f0e [file] [log] [blame]
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +00001; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=avx2,+fma -fp-contract=fast | FileCheck %s
NAKAMURA Takumi10eb4cf2012-08-27 09:37:54 +00002; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver2 -mattr=-fma4 -fp-contract=fast | FileCheck %s
Craig Topperc30fdbc2012-08-31 15:40:30 +00003; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver1 -fp-contract=fast | FileCheck %s --check-prefix=CHECK_FMA4
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +00004
5; CHECK: test_x86_fmadd_ps
Craig Topperc0387f62012-08-31 16:31:13 +00006; CHECK: vfmadd213ps %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +00007; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +00008; CHECK_FMA4: test_x86_fmadd_ps
9; CHECK_FMA4: vfmaddps %xmm2, %xmm1, %xmm0, %xmm0
10; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000011define <4 x float> @test_x86_fmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
12 %x = fmul <4 x float> %a0, %a1
13 %res = fadd <4 x float> %x, %a2
14 ret <4 x float> %res
15}
16
17; CHECK: test_x86_fmsub_ps
Craig Topperc0387f62012-08-31 16:31:13 +000018; CHECK: fmsub213ps %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000019; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000020; CHECK_FMA4: test_x86_fmsub_ps
21; CHECK_FMA4: vfmsubps %xmm2, %xmm1, %xmm0, %xmm0
22; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000023define <4 x float> @test_x86_fmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
24 %x = fmul <4 x float> %a0, %a1
25 %res = fsub <4 x float> %x, %a2
26 ret <4 x float> %res
27}
28
29; CHECK: test_x86_fnmadd_ps
Craig Topperc0387f62012-08-31 16:31:13 +000030; CHECK: fnmadd213ps %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000031; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000032; CHECK_FMA4: test_x86_fnmadd_ps
33; CHECK_FMA4: vfnmaddps %xmm2, %xmm1, %xmm0, %xmm0
34; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000035define <4 x float> @test_x86_fnmadd_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
36 %x = fmul <4 x float> %a0, %a1
37 %res = fsub <4 x float> %a2, %x
38 ret <4 x float> %res
39}
40
41; CHECK: test_x86_fnmsub_ps
Craig Topperc0387f62012-08-31 16:31:13 +000042; CHECK: fnmsub213ps %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000043; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000044; CHECK_FMA4: test_x86_fnmsub_ps
45; CHECK_FMA4: fnmsubps %xmm2, %xmm1, %xmm0, %xmm0
46; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000047define <4 x float> @test_x86_fnmsub_ps(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2) {
48 %x = fmul <4 x float> %a0, %a1
49 %y = fsub <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
50 %res = fsub <4 x float> %y, %a2
51 ret <4 x float> %res
52}
53
54; CHECK: test_x86_fmadd_ps_y
Craig Topperc0387f62012-08-31 16:31:13 +000055; CHECK: vfmadd213ps %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000056; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000057; CHECK_FMA4: test_x86_fmadd_ps_y
58; CHECK_FMA4: vfmaddps %ymm2, %ymm1, %ymm0, %ymm0
59; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000060define <8 x float> @test_x86_fmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
61 %x = fmul <8 x float> %a0, %a1
62 %res = fadd <8 x float> %x, %a2
63 ret <8 x float> %res
64}
65
66; CHECK: test_x86_fmsub_ps_y
Craig Topperc0387f62012-08-31 16:31:13 +000067; CHECK: vfmsub213ps %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000068; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000069; CHECK_FMA4: test_x86_fmsub_ps_y
70; CHECK_FMA4: vfmsubps %ymm2, %ymm1, %ymm0, %ymm0
71; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000072define <8 x float> @test_x86_fmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
73 %x = fmul <8 x float> %a0, %a1
74 %res = fsub <8 x float> %x, %a2
75 ret <8 x float> %res
76}
77
78; CHECK: test_x86_fnmadd_ps_y
Craig Topperc0387f62012-08-31 16:31:13 +000079; CHECK: vfnmadd213ps %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000080; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +000081; CHECK_FMA4: test_x86_fnmadd_ps_y
82; CHECK_FMA4: vfnmaddps %ymm2, %ymm1, %ymm0, %ymm0
83; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000084define <8 x float> @test_x86_fnmadd_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
85 %x = fmul <8 x float> %a0, %a1
86 %res = fsub <8 x float> %a2, %x
87 ret <8 x float> %res
88}
89
90; CHECK: test_x86_fnmsub_ps_y
Craig Topperc0387f62012-08-31 16:31:13 +000091; CHECK: vfnmsub213ps %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +000092; CHECK: ret
93define <8 x float> @test_x86_fnmsub_ps_y(<8 x float> %a0, <8 x float> %a1, <8 x float> %a2) {
94 %x = fmul <8 x float> %a0, %a1
95 %y = fsub <8 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, %x
96 %res = fsub <8 x float> %y, %a2
97 ret <8 x float> %res
98}
99
100; CHECK: test_x86_fmadd_pd_y
Craig Topperc0387f62012-08-31 16:31:13 +0000101; CHECK: vfmadd213pd %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000102; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000103; CHECK_FMA4: test_x86_fmadd_pd_y
104; CHECK_FMA4: vfmaddpd %ymm2, %ymm1, %ymm0, %ymm0
105; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000106define <4 x double> @test_x86_fmadd_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
107 %x = fmul <4 x double> %a0, %a1
108 %res = fadd <4 x double> %x, %a2
109 ret <4 x double> %res
110}
111
112; CHECK: test_x86_fmsub_pd_y
Craig Topperc0387f62012-08-31 16:31:13 +0000113; CHECK: vfmsub213pd %ymm2, %ymm1, %ymm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000114; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000115; CHECK_FMA4: test_x86_fmsub_pd_y
116; CHECK_FMA4: vfmsubpd %ymm2, %ymm1, %ymm0, %ymm0
117; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000118define <4 x double> @test_x86_fmsub_pd_y(<4 x double> %a0, <4 x double> %a1, <4 x double> %a2) {
119 %x = fmul <4 x double> %a0, %a1
120 %res = fsub <4 x double> %x, %a2
121 ret <4 x double> %res
122}
123
124; CHECK: test_x86_fmsub_pd
Craig Topperc0387f62012-08-31 16:31:13 +0000125; CHECK: vfmsub213pd %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000126; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000127; CHECK_FMA4: test_x86_fmsub_pd
128; CHECK_FMA4: vfmsubpd %xmm2, %xmm1, %xmm0, %xmm0
129; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000130define <2 x double> @test_x86_fmsub_pd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2) {
131 %x = fmul <2 x double> %a0, %a1
132 %res = fsub <2 x double> %x, %a2
133 ret <2 x double> %res
134}
135
136; CHECK: test_x86_fnmadd_ss
Craig Topperc0387f62012-08-31 16:31:13 +0000137; CHECK: vfnmadd213ss %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000138; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000139; CHECK_FMA4: test_x86_fnmadd_ss
140; CHECK_FMA4: vfnmaddss %xmm2, %xmm1, %xmm0, %xmm0
141; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000142define float @test_x86_fnmadd_ss(float %a0, float %a1, float %a2) {
143 %x = fmul float %a0, %a1
144 %res = fsub float %a2, %x
145 ret float %res
146}
147
148; CHECK: test_x86_fnmadd_sd
Craig Topperc0387f62012-08-31 16:31:13 +0000149; CHECK: vfnmadd213sd %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000150; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000151; CHECK_FMA4: test_x86_fnmadd_sd
152; CHECK_FMA4: vfnmaddsd %xmm2, %xmm1, %xmm0, %xmm0
153; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000154define double @test_x86_fnmadd_sd(double %a0, double %a1, double %a2) {
155 %x = fmul double %a0, %a1
156 %res = fsub double %a2, %x
157 ret double %res
158}
159
160; CHECK: test_x86_fmsub_sd
Craig Topperc0387f62012-08-31 16:31:13 +0000161; CHECK: vfmsub213sd %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000162; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000163; CHECK_FMA4: test_x86_fmsub_sd
164; CHECK_FMA4: vfmsubsd %xmm2, %xmm1, %xmm0, %xmm0
165; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000166define double @test_x86_fmsub_sd(double %a0, double %a1, double %a2) {
167 %x = fmul double %a0, %a1
168 %res = fsub double %x, %a2
169 ret double %res
170}
171
172; CHECK: test_x86_fnmsub_ss
Craig Topperc0387f62012-08-31 16:31:13 +0000173; CHECK: vfnmsub213ss %xmm2, %xmm1, %xmm0
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000174; CHECK: ret
Craig Topperc30fdbc2012-08-31 15:40:30 +0000175; CHECK_FMA4: test_x86_fnmsub_ss
176; CHECK_FMA4: vfnmsubss %xmm2, %xmm1, %xmm0, %xmm0
177; CHECK_FMA4: ret
Matt Beaumont-Gay7947aec2012-08-01 16:42:35 +0000178define float @test_x86_fnmsub_ss(float %a0, float %a1, float %a2) {
179 %x = fsub float -0.000000e+00, %a0
180 %y = fmul float %x, %a1
181 %res = fsub float %y, %a2
182 ret float %res
183}