1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefix=GCN %s
3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s
4
5define double @v_constained_fma_f64_fpexcept_strict(double %x, double %y, double %z) #0 {
6; GCN-LABEL: v_constained_fma_f64_fpexcept_strict:
7; GCN:       ; %bb.0:
8; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
10; GCN-NEXT:    s_setpc_b64 s[30:31]
11;
12; GFX10-LABEL: v_constained_fma_f64_fpexcept_strict:
13; GFX10:       ; %bb.0:
14; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
15; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
16; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
17; GFX10-NEXT:    s_setpc_b64 s[30:31]
18  %val = call double @llvm.experimental.constrained.fma.f64(double %x, double %y, double %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
19  ret double %val
20}
21
22define <2 x double> @v_constained_fma_v2f64_fpexcept_strict(<2 x double> %x, <2 x double> %y, <2 x double> %z) #0 {
23; GCN-LABEL: v_constained_fma_v2f64_fpexcept_strict:
24; GCN:       ; %bb.0:
25; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
26; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
27; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
28; GCN-NEXT:    s_setpc_b64 s[30:31]
29;
30; GFX10-LABEL: v_constained_fma_v2f64_fpexcept_strict:
31; GFX10:       ; %bb.0:
32; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
33; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
34; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[4:5], v[8:9]
35; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[6:7], v[10:11]
36; GFX10-NEXT:    s_setpc_b64 s[30:31]
37  %val = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %x, <2 x double> %y, <2 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
38  ret <2 x double> %val
39}
40
41define <3 x double> @v_constained_fma_v3f64_fpexcept_strict(<3 x double> %x, <3 x double> %y, <3 x double> %z) #0 {
42; GCN-LABEL: v_constained_fma_v3f64_fpexcept_strict:
43; GCN:       ; %bb.0:
44; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
45; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
46; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
47; GCN-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
48; GCN-NEXT:    s_setpc_b64 s[30:31]
49;
50; GFX10-LABEL: v_constained_fma_v3f64_fpexcept_strict:
51; GFX10:       ; %bb.0:
52; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
53; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
54; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
55; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
56; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
57; GFX10-NEXT:    s_setpc_b64 s[30:31]
58  %val = call <3 x double> @llvm.experimental.constrained.fma.v3f64(<3 x double> %x, <3 x double> %y, <3 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
59  ret <3 x double> %val
60}
61
62define <4 x double> @v_constained_fma_v4f64_fpexcept_strict(<4 x double> %x, <4 x double> %y, <4 x double> %z) #0 {
63; GCN-LABEL: v_constained_fma_v4f64_fpexcept_strict:
64; GCN:       ; %bb.0:
65; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
66; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
67; GCN-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
68; GCN-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
69; GCN-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
70; GCN-NEXT:    s_setpc_b64 s[30:31]
71;
72; GFX10-LABEL: v_constained_fma_v4f64_fpexcept_strict:
73; GFX10:       ; %bb.0:
74; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
75; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
76; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
77; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
78; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
79; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
80; GFX10-NEXT:    s_setpc_b64 s[30:31]
81  %val = call <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double> %x, <4 x double> %y, <4 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
82  ret <4 x double> %val
83}
84
85define double @v_constained_fma_f64_fpexcept_strict_fneg(double %x, double %y, double %z) #0 {
86; GCN-LABEL: v_constained_fma_f64_fpexcept_strict_fneg:
87; GCN:       ; %bb.0:
88; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89; GCN-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
90; GCN-NEXT:    s_setpc_b64 s[30:31]
91;
92; GFX10-LABEL: v_constained_fma_f64_fpexcept_strict_fneg:
93; GFX10:       ; %bb.0:
94; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
95; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
96; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
97; GFX10-NEXT:    s_setpc_b64 s[30:31]
98  %neg.z = fneg double %z
99  %val = call double @llvm.experimental.constrained.fma.f64(double %x, double %y, double %neg.z, metadata !"round.tonearest", metadata !"fpexcept.strict")
100  ret double %val
101}
102
103define double @v_constained_fma_f64_fpexcept_strict_fneg_fneg(double %x, double %y, double %z) #0 {
104; GCN-LABEL: v_constained_fma_f64_fpexcept_strict_fneg_fneg:
105; GCN:       ; %bb.0:
106; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
107; GCN-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], v[4:5]
108; GCN-NEXT:    s_setpc_b64 s[30:31]
109;
110; GFX10-LABEL: v_constained_fma_f64_fpexcept_strict_fneg_fneg:
111; GFX10:       ; %bb.0:
112; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
113; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
114; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[2:3], v[4:5]
115; GFX10-NEXT:    s_setpc_b64 s[30:31]
116  %neg.x = fneg double %x
117  %neg.y = fneg double %y
118  %val = call double @llvm.experimental.constrained.fma.f64(double %neg.x, double %neg.y, double %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
119  ret double %val
120}
121
122define double @v_constained_fma_f64_fpexcept_strict_fabs_fabs(double %x, double %y, double %z) #0 {
123; GCN-LABEL: v_constained_fma_f64_fpexcept_strict_fabs_fabs:
124; GCN:       ; %bb.0:
125; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
126; GCN-NEXT:    v_fma_f64 v[0:1], |v[0:1]|, |v[2:3]|, v[4:5]
127; GCN-NEXT:    s_setpc_b64 s[30:31]
128;
129; GFX10-LABEL: v_constained_fma_f64_fpexcept_strict_fabs_fabs:
130; GFX10:       ; %bb.0:
131; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
133; GFX10-NEXT:    v_fma_f64 v[0:1], |v[0:1]|, |v[2:3]|, v[4:5]
134; GFX10-NEXT:    s_setpc_b64 s[30:31]
135  %neg.x = call double @llvm.fabs.f64(double %x)
136  %neg.y = call double @llvm.fabs.f64(double %y)
137  %val = call double @llvm.experimental.constrained.fma.f64(double %neg.x, double %neg.y, double %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
138  ret double %val
139}
140
141define <2 x double> @v_constained_fma_v2f64_fpexcept_strict_fneg_fneg(<2 x double> %x, <2 x double> %y, <2 x double> %z) #0 {
142; GCN-LABEL: v_constained_fma_v2f64_fpexcept_strict_fneg_fneg:
143; GCN:       ; %bb.0:
144; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
145; GCN-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[4:5], v[8:9]
146; GCN-NEXT:    v_fma_f64 v[2:3], -v[2:3], -v[6:7], v[10:11]
147; GCN-NEXT:    s_setpc_b64 s[30:31]
148;
149; GFX10-LABEL: v_constained_fma_v2f64_fpexcept_strict_fneg_fneg:
150; GFX10:       ; %bb.0:
151; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
152; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
153; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], -v[4:5], v[8:9]
154; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], -v[6:7], v[10:11]
155; GFX10-NEXT:    s_setpc_b64 s[30:31]
156  %neg.x = fneg <2 x double> %x
157  %neg.y = fneg <2 x double> %y
158  %val = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %neg.x, <2 x double> %neg.y, <2 x double> %z, metadata !"round.tonearest", metadata !"fpexcept.strict")
159  ret <2 x double> %val
160}
161
162declare double @llvm.fabs.f64(double) #1
163declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) #1
164declare <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double>, <2 x double>, <2 x double>, metadata, metadata) #1
165declare <3 x double> @llvm.experimental.constrained.fma.v3f64(<3 x double>, <3 x double>, <3 x double>, metadata, metadata) #1
166declare <4 x double> @llvm.experimental.constrained.fma.v4f64(<4 x double>, <4 x double>, <4 x double>, metadata, metadata) #1
167
168attributes #0 = { strictfp }
169attributes #1 = { inaccessiblememonly nounwind willreturn }
170