[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / fmuladd-soft-float.ll
blobd0bfe74719f89b40c3268677a91ceb25193fa9b8
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=s390x-linux < %s | FileCheck %s -check-prefix=SOFT-FLOAT
4 define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 {
5 ; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f32:
6 ; SOFT-FLOAT:       # %bb.0:
7 ; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
8 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
9 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
10 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
11 ; SOFT-FLOAT-NEXT:    aghi %r15, -160
12 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
13 ; SOFT-FLOAT-NEXT:    llgfr %r2, %r2
14 ; SOFT-FLOAT-NEXT:    llgfr %r3, %r3
15 ; SOFT-FLOAT-NEXT:    lr %r13, %r4
16 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
17 ; SOFT-FLOAT-NEXT:    llgfr %r3, %r13
18 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
19 ; SOFT-FLOAT-NEXT:    # kill: def $r2l killed $r2l killed $r2d
20 ; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
21 ; SOFT-FLOAT-NEXT:    br %r14
22   %result = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
23   ret float %result
26 define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 {
27 ; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f64:
28 ; SOFT-FLOAT:       # %bb.0:
29 ; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
30 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
31 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
32 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
33 ; SOFT-FLOAT-NEXT:    aghi %r15, -160
34 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
35 ; SOFT-FLOAT-NEXT:    lgr %r13, %r4
36 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
37 ; SOFT-FLOAT-NEXT:    lgr %r3, %r13
38 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
39 ; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
40 ; SOFT-FLOAT-NEXT:    br %r14
41   %result = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
42   ret double %result
45 define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 {
46 ; SOFT-FLOAT-LABEL: fmuladd_contract_f32:
47 ; SOFT-FLOAT:       # %bb.0:
48 ; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
49 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
50 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
51 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
52 ; SOFT-FLOAT-NEXT:    aghi %r15, -160
53 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
54 ; SOFT-FLOAT-NEXT:    llgfr %r2, %r2
55 ; SOFT-FLOAT-NEXT:    llgfr %r3, %r3
56 ; SOFT-FLOAT-NEXT:    lr %r13, %r4
57 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
58 ; SOFT-FLOAT-NEXT:    llgfr %r3, %r13
59 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
60 ; SOFT-FLOAT-NEXT:    # kill: def $r2l killed $r2l killed $r2d
61 ; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
62 ; SOFT-FLOAT-NEXT:    br %r14
63   %product = fmul contract float %a, %b
64   %result = fadd contract float %product, %c
65   ret float %result
68 define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 {
69 ; SOFT-FLOAT-LABEL: fmuladd_contract_f64:
70 ; SOFT-FLOAT:       # %bb.0:
71 ; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
72 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
73 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
74 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
75 ; SOFT-FLOAT-NEXT:    aghi %r15, -160
76 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
77 ; SOFT-FLOAT-NEXT:    lgr %r13, %r4
78 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
79 ; SOFT-FLOAT-NEXT:    lgr %r3, %r13
80 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
81 ; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
82 ; SOFT-FLOAT-NEXT:    br %r14
83   %product = fmul contract double %a, %b
84   %result = fadd contract double %product, %c
85   ret double %result
88 define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 {
89 ; SOFT-FLOAT-LABEL: fmuladd_contract_v4f32:
90 ; SOFT-FLOAT:       # %bb.0:
91 ; SOFT-FLOAT-NEXT:    stmg %r7, %r15, 56(%r15)
92 ; SOFT-FLOAT-NEXT:    .cfi_offset %r7, -104
93 ; SOFT-FLOAT-NEXT:    .cfi_offset %r8, -96
94 ; SOFT-FLOAT-NEXT:    .cfi_offset %r9, -88
95 ; SOFT-FLOAT-NEXT:    .cfi_offset %r10, -80
96 ; SOFT-FLOAT-NEXT:    .cfi_offset %r11, -72
97 ; SOFT-FLOAT-NEXT:    .cfi_offset %r12, -64
98 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
99 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
100 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
101 ; SOFT-FLOAT-NEXT:    aghi %r15, -176
102 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 336
103 ; SOFT-FLOAT-NEXT:    llgf %r0, 388(%r15)
104 ; SOFT-FLOAT-NEXT:    stg %r0, 168(%r15) # 8-byte Folded Spill
105 ; SOFT-FLOAT-NEXT:    llgf %r0, 380(%r15)
106 ; SOFT-FLOAT-NEXT:    stg %r0, 160(%r15) # 8-byte Folded Spill
107 ; SOFT-FLOAT-NEXT:    llgf %r11, 372(%r15)
108 ; SOFT-FLOAT-NEXT:    llgf %r10, 364(%r15)
109 ; SOFT-FLOAT-NEXT:    llgf %r8, 340(%r15)
110 ; SOFT-FLOAT-NEXT:    llgf %r0, 356(%r15)
111 ; SOFT-FLOAT-NEXT:    llgf %r7, 348(%r15)
112 ; SOFT-FLOAT-NEXT:    llgfr %r1, %r5
113 ; SOFT-FLOAT-NEXT:    lr %r9, %r4
114 ; SOFT-FLOAT-NEXT:    lr %r13, %r3
115 ; SOFT-FLOAT-NEXT:    lr %r12, %r2
116 ; SOFT-FLOAT-NEXT:    lgr %r2, %r1
117 ; SOFT-FLOAT-NEXT:    lgr %r3, %r0
118 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
119 ; SOFT-FLOAT-NEXT:    llgfr %r0, %r9
120 ; SOFT-FLOAT-NEXT:    lgr %r9, %r2
121 ; SOFT-FLOAT-NEXT:    lgr %r2, %r0
122 ; SOFT-FLOAT-NEXT:    lgr %r3, %r7
123 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
124 ; SOFT-FLOAT-NEXT:    llgfr %r0, %r13
125 ; SOFT-FLOAT-NEXT:    lgr %r13, %r2
126 ; SOFT-FLOAT-NEXT:    lgr %r2, %r0
127 ; SOFT-FLOAT-NEXT:    lgr %r3, %r8
128 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
129 ; SOFT-FLOAT-NEXT:    llgfr %r0, %r12
130 ; SOFT-FLOAT-NEXT:    llgfr %r3, %r6
131 ; SOFT-FLOAT-NEXT:    lgr %r12, %r2
132 ; SOFT-FLOAT-NEXT:    lgr %r2, %r0
133 ; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
134 ; SOFT-FLOAT-NEXT:    lgr %r3, %r10
135 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
136 ; SOFT-FLOAT-NEXT:    lgr %r10, %r2
137 ; SOFT-FLOAT-NEXT:    lgr %r2, %r12
138 ; SOFT-FLOAT-NEXT:    lgr %r3, %r11
139 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
140 ; SOFT-FLOAT-NEXT:    lgr %r12, %r2
141 ; SOFT-FLOAT-NEXT:    lgr %r2, %r13
142 ; SOFT-FLOAT-NEXT:    lg %r3, 160(%r15) # 8-byte Folded Reload
143 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
144 ; SOFT-FLOAT-NEXT:    lgr %r13, %r2
145 ; SOFT-FLOAT-NEXT:    lgr %r2, %r9
146 ; SOFT-FLOAT-NEXT:    lg %r3, 168(%r15) # 8-byte Folded Reload
147 ; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
148 ; SOFT-FLOAT-NEXT:    lgr %r5, %r2
149 ; SOFT-FLOAT-NEXT:    lr %r2, %r10
150 ; SOFT-FLOAT-NEXT:    lr %r3, %r12
151 ; SOFT-FLOAT-NEXT:    lr %r4, %r13
152 ; SOFT-FLOAT-NEXT:    # kill: def $r5l killed $r5l killed $r5d
153 ; SOFT-FLOAT-NEXT:    lmg %r7, %r15, 232(%r15)
154 ; SOFT-FLOAT-NEXT:    br %r14
155   %product = fmul contract <4 x float> %a, %b
156   %result = fadd contract <4 x float> %product, %c
157   ret <4 x float> %result
160 define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 {
161 ; SOFT-FLOAT-LABEL: fmuladd_contract_v4f64:
162 ; SOFT-FLOAT:       # %bb.0:
163 ; SOFT-FLOAT-NEXT:    stmg %r6, %r15, 48(%r15)
164 ; SOFT-FLOAT-NEXT:    .cfi_offset %r6, -112
165 ; SOFT-FLOAT-NEXT:    .cfi_offset %r7, -104
166 ; SOFT-FLOAT-NEXT:    .cfi_offset %r8, -96
167 ; SOFT-FLOAT-NEXT:    .cfi_offset %r9, -88
168 ; SOFT-FLOAT-NEXT:    .cfi_offset %r10, -80
169 ; SOFT-FLOAT-NEXT:    .cfi_offset %r11, -72
170 ; SOFT-FLOAT-NEXT:    .cfi_offset %r12, -64
171 ; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
172 ; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
173 ; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
174 ; SOFT-FLOAT-NEXT:    aghi %r15, -184
175 ; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 344
176 ; SOFT-FLOAT-NEXT:    mvc 176(8,%r15), 24(%r4) # 8-byte Folded Spill
177 ; SOFT-FLOAT-NEXT:    mvc 168(8,%r15), 16(%r4) # 8-byte Folded Spill
178 ; SOFT-FLOAT-NEXT:    mvc 160(8,%r15), 8(%r4) # 8-byte Folded Spill
179 ; SOFT-FLOAT-NEXT:    lg %r10, 0(%r4)
180 ; SOFT-FLOAT-NEXT:    lg %r9, 0(%r2)
181 ; SOFT-FLOAT-NEXT:    lg %r8, 0(%r3)
182 ; SOFT-FLOAT-NEXT:    lg %r7, 8(%r2)
183 ; SOFT-FLOAT-NEXT:    lg %r6, 8(%r3)
184 ; SOFT-FLOAT-NEXT:    lg %r13, 16(%r2)
185 ; SOFT-FLOAT-NEXT:    lg %r2, 24(%r2)
186 ; SOFT-FLOAT-NEXT:    lg %r0, 24(%r3)
187 ; SOFT-FLOAT-NEXT:    lg %r12, 16(%r3)
188 ; SOFT-FLOAT-NEXT:    lgr %r3, %r0
189 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
190 ; SOFT-FLOAT-NEXT:    lgr %r11, %r2
191 ; SOFT-FLOAT-NEXT:    lgr %r2, %r13
192 ; SOFT-FLOAT-NEXT:    lgr %r3, %r12
193 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
194 ; SOFT-FLOAT-NEXT:    lgr %r13, %r2
195 ; SOFT-FLOAT-NEXT:    lgr %r2, %r7
196 ; SOFT-FLOAT-NEXT:    lgr %r3, %r6
197 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
198 ; SOFT-FLOAT-NEXT:    lgr %r12, %r2
199 ; SOFT-FLOAT-NEXT:    lgr %r2, %r9
200 ; SOFT-FLOAT-NEXT:    lgr %r3, %r8
201 ; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
202 ; SOFT-FLOAT-NEXT:    lgr %r3, %r10
203 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
204 ; SOFT-FLOAT-NEXT:    lgr %r10, %r2
205 ; SOFT-FLOAT-NEXT:    lgr %r2, %r12
206 ; SOFT-FLOAT-NEXT:    lg %r3, 160(%r15) # 8-byte Folded Reload
207 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
208 ; SOFT-FLOAT-NEXT:    lgr %r12, %r2
209 ; SOFT-FLOAT-NEXT:    lgr %r2, %r13
210 ; SOFT-FLOAT-NEXT:    lg %r3, 168(%r15) # 8-byte Folded Reload
211 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
212 ; SOFT-FLOAT-NEXT:    lgr %r13, %r2
213 ; SOFT-FLOAT-NEXT:    lgr %r2, %r11
214 ; SOFT-FLOAT-NEXT:    lg %r3, 176(%r15) # 8-byte Folded Reload
215 ; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
216 ; SOFT-FLOAT-NEXT:    lgr %r5, %r2
217 ; SOFT-FLOAT-NEXT:    lgr %r2, %r10
218 ; SOFT-FLOAT-NEXT:    lgr %r3, %r12
219 ; SOFT-FLOAT-NEXT:    lgr %r4, %r13
220 ; SOFT-FLOAT-NEXT:    lmg %r6, %r15, 232(%r15)
221 ; SOFT-FLOAT-NEXT:    br %r14
222   %product = fmul contract <4 x double> %a, %b
223   %result = fadd contract <4 x double> %product, %c
224   ret <4 x double> %result
227 attributes #0 = { "use-soft-float"="true" }
229 declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
230 declare double @llvm.fmuladd.f64(double %a, double %b, double %c)