26 Value rhsSqNorm = LLVM::FAddOp::create(
27 rewriter, loc, LLVM::FMulOp::create(rewriter, loc, rhsRe, rhsRe, fmf),
28 LLVM::FMulOp::create(rewriter, loc, rhsIm, rhsIm, fmf), fmf);
30 Value realNumerator = LLVM::FAddOp::create(
31 rewriter, loc, LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsRe, fmf),
32 LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsIm, fmf), fmf);
34 Value imagNumerator = LLVM::FSubOp::create(
35 rewriter, loc, LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsRe, fmf),
36 LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsIm, fmf), fmf);
39 LLVM::FDivOp::create(rewriter, loc, realNumerator, rhsSqNorm, fmf);
41 LLVM::FDivOp::create(rewriter, loc, imagNumerator, rhsSqNorm, fmf);
46 Value rhsRe,
Value rhsIm, arith::FastMathFlagsAttr fmf,
Value *resultRe,
48 Value rhsSqNorm = arith::AddFOp::create(
49 rewriter, loc, arith::MulFOp::create(rewriter, loc, rhsRe, rhsRe, fmf),
50 arith::MulFOp::create(rewriter, loc, rhsIm, rhsIm, fmf), fmf);
52 Value realNumerator = arith::AddFOp::create(
53 rewriter, loc, arith::MulFOp::create(rewriter, loc, lhsRe, rhsRe, fmf),
54 arith::MulFOp::create(rewriter, loc, lhsIm, rhsIm, fmf), fmf);
55 Value imagNumerator = arith::SubFOp::create(
56 rewriter, loc, arith::MulFOp::create(rewriter, loc, lhsIm, rhsRe, fmf),
57 arith::MulFOp::create(rewriter, loc, lhsRe, rhsIm, fmf), fmf);
60 arith::DivFOp::create(rewriter, loc, realNumerator, rhsSqNorm, fmf);
62 arith::DivFOp::create(rewriter, loc, imagNumerator, rhsSqNorm, fmf);
96 auto elementType = cast<FloatType>(rhsRe.
getType());
98 Value rhsRealImagRatio =
99 LLVM::FDivOp::create(rewriter, loc, rhsRe, rhsIm, fmf);
100 Value rhsRealImagDenom = LLVM::FAddOp::create(
101 rewriter, loc, rhsIm,
102 LLVM::FMulOp::create(rewriter, loc, rhsRealImagRatio, rhsRe, fmf), fmf);
103 Value realNumerator1 = LLVM::FAddOp::create(
105 LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsRealImagRatio, fmf), lhsIm,
107 Value resultReal1 = LLVM::FDivOp::create(rewriter, loc, realNumerator1,
108 rhsRealImagDenom, fmf);
109 Value imagNumerator1 = LLVM::FSubOp::create(
111 LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsRealImagRatio, fmf), lhsRe,
113 Value resultImag1 = LLVM::FDivOp::create(rewriter, loc, imagNumerator1,
114 rhsRealImagDenom, fmf);
116 Value rhsImagRealRatio =
117 LLVM::FDivOp::create(rewriter, loc, rhsIm, rhsRe, fmf);
118 Value rhsImagRealDenom = LLVM::FAddOp::create(
119 rewriter, loc, rhsRe,
120 LLVM::FMulOp::create(rewriter, loc, rhsImagRealRatio, rhsIm, fmf), fmf);
121 Value realNumerator2 = LLVM::FAddOp::create(
122 rewriter, loc, lhsRe,
123 LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsImagRealRatio, fmf), fmf);
124 Value resultReal2 = LLVM::FDivOp::create(rewriter, loc, realNumerator2,
125 rhsImagRealDenom, fmf);
126 Value imagNumerator2 = LLVM::FSubOp::create(
127 rewriter, loc, lhsIm,
128 LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsImagRealRatio, fmf), fmf);
129 Value resultImag2 = LLVM::FDivOp::create(rewriter, loc, imagNumerator2,
130 rhsImagRealDenom, fmf);
134 Value zero = LLVM::ConstantOp::create(rewriter, loc, elementType,
136 Value rhsRealAbs = LLVM::FAbsOp::create(rewriter, loc, rhsRe, fmf);
137 Value rhsRealIsZero = LLVM::FCmpOp::create(
138 rewriter, loc, LLVM::FCmpPredicate::oeq, rhsRealAbs, zero);
139 Value rhsImagAbs = LLVM::FAbsOp::create(rewriter, loc, rhsIm, fmf);
140 Value rhsImagIsZero = LLVM::FCmpOp::create(
141 rewriter, loc, LLVM::FCmpPredicate::oeq, rhsImagAbs, zero);
142 Value lhsRealIsNotNaN = LLVM::FCmpOp::create(
143 rewriter, loc, LLVM::FCmpPredicate::ord, lhsRe, zero);
144 Value lhsImagIsNotNaN = LLVM::FCmpOp::create(
145 rewriter, loc, LLVM::FCmpPredicate::ord, lhsIm, zero);
146 Value lhsContainsNotNaNValue =
147 LLVM::OrOp::create(rewriter, loc, lhsRealIsNotNaN, lhsImagIsNotNaN);
148 Value resultIsInfinity = LLVM::AndOp::create(
149 rewriter, loc, lhsContainsNotNaNValue,
150 LLVM::AndOp::create(rewriter, loc, rhsRealIsZero, rhsImagIsZero));
151 Value inf = LLVM::ConstantOp::create(
152 rewriter, loc, elementType,
154 APFloat::getInf(elementType.getFloatSemantics())));
155 Value infWithSignOfrhsReal =
156 LLVM::CopySignOp::create(rewriter, loc, inf, rhsRe);
157 Value infinityResultReal =
158 LLVM::FMulOp::create(rewriter, loc, infWithSignOfrhsReal, lhsRe, fmf);
159 Value infinityResultImag =
160 LLVM::FMulOp::create(rewriter, loc, infWithSignOfrhsReal, lhsIm, fmf);
163 Value rhsRealFinite = LLVM::FCmpOp::create(
164 rewriter, loc, LLVM::FCmpPredicate::one, rhsRealAbs, inf);
165 Value rhsImagFinite = LLVM::FCmpOp::create(
166 rewriter, loc, LLVM::FCmpPredicate::one, rhsImagAbs, inf);
168 LLVM::AndOp::create(rewriter, loc, rhsRealFinite, rhsImagFinite);
169 Value lhsRealAbs = LLVM::FAbsOp::create(rewriter, loc, lhsRe, fmf);
170 Value lhsRealInfinite = LLVM::FCmpOp::create(
171 rewriter, loc, LLVM::FCmpPredicate::oeq, lhsRealAbs, inf);
172 Value lhsImagAbs = LLVM::FAbsOp::create(rewriter, loc, lhsIm, fmf);
173 Value lhsImagInfinite = LLVM::FCmpOp::create(
174 rewriter, loc, LLVM::FCmpPredicate::oeq, lhsImagAbs, inf);
176 LLVM::OrOp::create(rewriter, loc, lhsRealInfinite, lhsImagInfinite);
177 Value infNumFiniteDenom =
178 LLVM::AndOp::create(rewriter, loc, lhsInfinite, rhsFinite);
179 Value one = LLVM::ConstantOp::create(rewriter, loc, elementType,
181 Value lhsRealIsInfWithSign = LLVM::CopySignOp::create(
183 LLVM::SelectOp::create(rewriter, loc, lhsRealInfinite, one, zero), lhsRe);
184 Value lhsImagIsInfWithSign = LLVM::CopySignOp::create(
186 LLVM::SelectOp::create(rewriter, loc, lhsImagInfinite, one, zero), lhsIm);
187 Value lhsRealIsInfWithSignTimesrhsReal =
188 LLVM::FMulOp::create(rewriter, loc, lhsRealIsInfWithSign, rhsRe, fmf);
189 Value lhsImagIsInfWithSignTimesrhsImag =
190 LLVM::FMulOp::create(rewriter, loc, lhsImagIsInfWithSign, rhsIm, fmf);
191 Value resultReal3 = LLVM::FMulOp::create(
193 LLVM::FAddOp::create(rewriter, loc, lhsRealIsInfWithSignTimesrhsReal,
194 lhsImagIsInfWithSignTimesrhsImag, fmf),
196 Value lhsRealIsInfWithSignTimesrhsImag =
197 LLVM::FMulOp::create(rewriter, loc, lhsRealIsInfWithSign, rhsIm, fmf);
198 Value lhsImagIsInfWithSignTimesrhsReal =
199 LLVM::FMulOp::create(rewriter, loc, lhsImagIsInfWithSign, rhsRe, fmf);
200 Value resultImag3 = LLVM::FMulOp::create(
202 LLVM::FSubOp::create(rewriter, loc, lhsImagIsInfWithSignTimesrhsReal,
203 lhsRealIsInfWithSignTimesrhsImag, fmf),
207 Value lhsRealFinite = LLVM::FCmpOp::create(
208 rewriter, loc, LLVM::FCmpPredicate::one, lhsRealAbs, inf);
209 Value lhsImagFinite = LLVM::FCmpOp::create(
210 rewriter, loc, LLVM::FCmpPredicate::one, lhsImagAbs, inf);
212 LLVM::AndOp::create(rewriter, loc, lhsRealFinite, lhsImagFinite);
213 Value rhsRealInfinite = LLVM::FCmpOp::create(
214 rewriter, loc, LLVM::FCmpPredicate::oeq, rhsRealAbs, inf);
215 Value rhsImagInfinite = LLVM::FCmpOp::create(
216 rewriter, loc, LLVM::FCmpPredicate::oeq, rhsImagAbs, inf);
218 LLVM::OrOp::create(rewriter, loc, rhsRealInfinite, rhsImagInfinite);
219 Value finiteNumInfiniteDenom =
220 LLVM::AndOp::create(rewriter, loc, lhsFinite, rhsInfinite);
221 Value rhsRealIsInfWithSign = LLVM::CopySignOp::create(
223 LLVM::SelectOp::create(rewriter, loc, rhsRealInfinite, one, zero), rhsRe);
224 Value rhsImagIsInfWithSign = LLVM::CopySignOp::create(
226 LLVM::SelectOp::create(rewriter, loc, rhsImagInfinite, one, zero), rhsIm);
227 Value rhsRealIsInfWithSignTimeslhsReal =
228 LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsRealIsInfWithSign, fmf);
229 Value rhsImagIsInfWithSignTimeslhsImag =
230 LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsImagIsInfWithSign, fmf);
231 Value resultReal4 = LLVM::FMulOp::create(
233 LLVM::FAddOp::create(rewriter, loc, rhsRealIsInfWithSignTimeslhsReal,
234 rhsImagIsInfWithSignTimeslhsImag, fmf),
236 Value rhsRealIsInfWithSignTimeslhsImag =
237 LLVM::FMulOp::create(rewriter, loc, lhsIm, rhsRealIsInfWithSign, fmf);
238 Value rhsImagIsInfWithSignTimeslhsReal =
239 LLVM::FMulOp::create(rewriter, loc, lhsRe, rhsImagIsInfWithSign, fmf);
240 Value resultImag4 = LLVM::FMulOp::create(
242 LLVM::FSubOp::create(rewriter, loc, rhsRealIsInfWithSignTimeslhsImag,
243 rhsImagIsInfWithSignTimeslhsReal, fmf),
246 Value realAbsSmallerThanImagAbs = LLVM::FCmpOp::create(
247 rewriter, loc, LLVM::FCmpPredicate::olt, rhsRealAbs, rhsImagAbs);
248 Value resultReal5 = LLVM::SelectOp::create(
249 rewriter, loc, realAbsSmallerThanImagAbs, resultReal1, resultReal2);
250 Value resultImag5 = LLVM::SelectOp::create(
251 rewriter, loc, realAbsSmallerThanImagAbs, resultImag1, resultImag2);
252 Value resultRealSpecialCase3 = LLVM::SelectOp::create(
253 rewriter, loc, finiteNumInfiniteDenom, resultReal4, resultReal5);
254 Value resultImagSpecialCase3 = LLVM::SelectOp::create(
255 rewriter, loc, finiteNumInfiniteDenom, resultImag4, resultImag5);
256 Value resultRealSpecialCase2 = LLVM::SelectOp::create(
257 rewriter, loc, infNumFiniteDenom, resultReal3, resultRealSpecialCase3);
258 Value resultImagSpecialCase2 = LLVM::SelectOp::create(
259 rewriter, loc, infNumFiniteDenom, resultImag3, resultImagSpecialCase3);
260 Value resultRealSpecialCase1 =
261 LLVM::SelectOp::create(rewriter, loc, resultIsInfinity,
262 infinityResultReal, resultRealSpecialCase2);
263 Value resultImagSpecialCase1 =
264 LLVM::SelectOp::create(rewriter, loc, resultIsInfinity,
265 infinityResultImag, resultImagSpecialCase2);
267 Value resultRealIsNaN = LLVM::FCmpOp::create(
268 rewriter, loc, LLVM::FCmpPredicate::uno, resultReal5, zero);
269 Value resultImagIsNaN = LLVM::FCmpOp::create(
270 rewriter, loc, LLVM::FCmpPredicate::uno, resultImag5, zero);
272 LLVM::AndOp::create(rewriter, loc, resultRealIsNaN, resultImagIsNaN);
274 *resultRe = LLVM::SelectOp::create(rewriter, loc, resultIsNaN,
275 resultRealSpecialCase1, resultReal5);
276 *resultIm = LLVM::SelectOp::create(rewriter, loc, resultIsNaN,
277 resultImagSpecialCase1, resultImag5);
282 Value rhsRe,
Value rhsIm, arith::FastMathFlagsAttr fmf,
Value *resultRe,
284 auto elementType = cast<FloatType>(rhsRe.
getType());
286 Value rhsRealImagRatio =
287 arith::DivFOp::create(rewriter, loc, rhsRe, rhsIm, fmf);
288 Value rhsRealImagDenom = arith::AddFOp::create(
289 rewriter, loc, rhsIm,
290 arith::MulFOp::create(rewriter, loc, rhsRealImagRatio, rhsRe, fmf), fmf);
291 Value realNumerator1 = arith::AddFOp::create(
293 arith::MulFOp::create(rewriter, loc, lhsRe, rhsRealImagRatio, fmf), lhsIm,
295 Value resultReal1 = arith::DivFOp::create(rewriter, loc, realNumerator1,
296 rhsRealImagDenom, fmf);
297 Value imagNumerator1 = arith::SubFOp::create(
299 arith::MulFOp::create(rewriter, loc, lhsIm, rhsRealImagRatio, fmf), lhsRe,
301 Value resultImag1 = arith::DivFOp::create(rewriter, loc, imagNumerator1,
302 rhsRealImagDenom, fmf);
304 Value rhsImagRealRatio =
305 arith::DivFOp::create(rewriter, loc, rhsIm, rhsRe, fmf);
306 Value rhsImagRealDenom = arith::AddFOp::create(
307 rewriter, loc, rhsRe,
308 arith::MulFOp::create(rewriter, loc, rhsImagRealRatio, rhsIm, fmf), fmf);
309 Value realNumerator2 = arith::AddFOp::create(
310 rewriter, loc, lhsRe,
311 arith::MulFOp::create(rewriter, loc, lhsIm, rhsImagRealRatio, fmf), fmf);
312 Value resultReal2 = arith::DivFOp::create(rewriter, loc, realNumerator2,
313 rhsImagRealDenom, fmf);
314 Value imagNumerator2 = arith::SubFOp::create(
315 rewriter, loc, lhsIm,
316 arith::MulFOp::create(rewriter, loc, lhsRe, rhsImagRealRatio, fmf), fmf);
317 Value resultImag2 = arith::DivFOp::create(rewriter, loc, imagNumerator2,
318 rhsImagRealDenom, fmf);
322 Value zero = arith::ConstantOp::create(rewriter, loc, elementType,
324 Value rhsRealAbs = math::AbsFOp::create(rewriter, loc, rhsRe, fmf);
325 Value rhsRealIsZero = arith::CmpFOp::create(
326 rewriter, loc, arith::CmpFPredicate::OEQ, rhsRealAbs, zero);
327 Value rhsImagAbs = math::AbsFOp::create(rewriter, loc, rhsIm, fmf);
328 Value rhsImagIsZero = arith::CmpFOp::create(
329 rewriter, loc, arith::CmpFPredicate::OEQ, rhsImagAbs, zero);
330 Value lhsRealIsNotNaN = arith::CmpFOp::create(
331 rewriter, loc, arith::CmpFPredicate::ORD, lhsRe, zero);
332 Value lhsImagIsNotNaN = arith::CmpFOp::create(
333 rewriter, loc, arith::CmpFPredicate::ORD, lhsIm, zero);
334 Value lhsContainsNotNaNValue =
335 arith::OrIOp::create(rewriter, loc, lhsRealIsNotNaN, lhsImagIsNotNaN);
336 Value resultIsInfinity = arith::AndIOp::create(
337 rewriter, loc, lhsContainsNotNaNValue,
338 arith::AndIOp::create(rewriter, loc, rhsRealIsZero, rhsImagIsZero));
339 Value inf = arith::ConstantOp::create(
340 rewriter, loc, elementType,
342 APFloat::getInf(elementType.getFloatSemantics())));
343 Value infWithSignOfRhsReal =
344 math::CopySignOp::create(rewriter, loc, inf, rhsRe);
345 Value infinityResultReal =
346 arith::MulFOp::create(rewriter, loc, infWithSignOfRhsReal, lhsRe, fmf);
347 Value infinityResultImag =
348 arith::MulFOp::create(rewriter, loc, infWithSignOfRhsReal, lhsIm, fmf);
351 Value rhsRealFinite = arith::CmpFOp::create(
352 rewriter, loc, arith::CmpFPredicate::ONE, rhsRealAbs, inf);
353 Value rhsImagFinite = arith::CmpFOp::create(
354 rewriter, loc, arith::CmpFPredicate::ONE, rhsImagAbs, inf);
356 arith::AndIOp::create(rewriter, loc, rhsRealFinite, rhsImagFinite);
357 Value lhsRealAbs = math::AbsFOp::create(rewriter, loc, lhsRe, fmf);
358 Value lhsRealInfinite = arith::CmpFOp::create(
359 rewriter, loc, arith::CmpFPredicate::OEQ, lhsRealAbs, inf);
360 Value lhsImagAbs = math::AbsFOp::create(rewriter, loc, lhsIm, fmf);
361 Value lhsImagInfinite = arith::CmpFOp::create(
362 rewriter, loc, arith::CmpFPredicate::OEQ, lhsImagAbs, inf);
364 arith::OrIOp::create(rewriter, loc, lhsRealInfinite, lhsImagInfinite);
365 Value infNumFiniteDenom =
366 arith::AndIOp::create(rewriter, loc, lhsInfinite, rhsFinite);
367 Value one = arith::ConstantOp::create(rewriter, loc, elementType,
369 Value lhsRealIsInfWithSign = math::CopySignOp::create(
371 arith::SelectOp::create(rewriter, loc, lhsRealInfinite, one, zero),
373 Value lhsImagIsInfWithSign = math::CopySignOp::create(
375 arith::SelectOp::create(rewriter, loc, lhsImagInfinite, one, zero),
377 Value lhsRealIsInfWithSignTimesRhsReal =
378 arith::MulFOp::create(rewriter, loc, lhsRealIsInfWithSign, rhsRe, fmf);
379 Value lhsImagIsInfWithSignTimesRhsImag =
380 arith::MulFOp::create(rewriter, loc, lhsImagIsInfWithSign, rhsIm, fmf);
381 Value resultReal3 = arith::MulFOp::create(
383 arith::AddFOp::create(rewriter, loc, lhsRealIsInfWithSignTimesRhsReal,
384 lhsImagIsInfWithSignTimesRhsImag, fmf),
386 Value lhsRealIsInfWithSignTimesRhsImag =
387 arith::MulFOp::create(rewriter, loc, lhsRealIsInfWithSign, rhsIm, fmf);
388 Value lhsImagIsInfWithSignTimesRhsReal =
389 arith::MulFOp::create(rewriter, loc, lhsImagIsInfWithSign, rhsRe, fmf);
390 Value resultImag3 = arith::MulFOp::create(
392 arith::SubFOp::create(rewriter, loc, lhsImagIsInfWithSignTimesRhsReal,
393 lhsRealIsInfWithSignTimesRhsImag, fmf),
397 Value lhsRealFinite = arith::CmpFOp::create(
398 rewriter, loc, arith::CmpFPredicate::ONE, lhsRealAbs, inf);
399 Value lhsImagFinite = arith::CmpFOp::create(
400 rewriter, loc, arith::CmpFPredicate::ONE, lhsImagAbs, inf);
402 arith::AndIOp::create(rewriter, loc, lhsRealFinite, lhsImagFinite);
403 Value rhsRealInfinite = arith::CmpFOp::create(
404 rewriter, loc, arith::CmpFPredicate::OEQ, rhsRealAbs, inf);
405 Value rhsImagInfinite = arith::CmpFOp::create(
406 rewriter, loc, arith::CmpFPredicate::OEQ, rhsImagAbs, inf);
408 arith::OrIOp::create(rewriter, loc, rhsRealInfinite, rhsImagInfinite);
409 Value finiteNumInfiniteDenom =
410 arith::AndIOp::create(rewriter, loc, lhsFinite, rhsInfinite);
411 Value rhsRealIsInfWithSign = math::CopySignOp::create(
413 arith::SelectOp::create(rewriter, loc, rhsRealInfinite, one, zero),
415 Value rhsImagIsInfWithSign = math::CopySignOp::create(
417 arith::SelectOp::create(rewriter, loc, rhsImagInfinite, one, zero),
419 Value rhsRealIsInfWithSignTimesLhsReal =
420 arith::MulFOp::create(rewriter, loc, lhsRe, rhsRealIsInfWithSign, fmf);
421 Value rhsImagIsInfWithSignTimesLhsImag =
422 arith::MulFOp::create(rewriter, loc, lhsIm, rhsImagIsInfWithSign, fmf);
423 Value resultReal4 = arith::MulFOp::create(
425 arith::AddFOp::create(rewriter, loc, rhsRealIsInfWithSignTimesLhsReal,
426 rhsImagIsInfWithSignTimesLhsImag, fmf),
428 Value rhsRealIsInfWithSignTimesLhsImag =
429 arith::MulFOp::create(rewriter, loc, lhsIm, rhsRealIsInfWithSign, fmf);
430 Value rhsImagIsInfWithSignTimesLhsReal =
431 arith::MulFOp::create(rewriter, loc, lhsRe, rhsImagIsInfWithSign, fmf);
432 Value resultImag4 = arith::MulFOp::create(
434 arith::SubFOp::create(rewriter, loc, rhsRealIsInfWithSignTimesLhsImag,
435 rhsImagIsInfWithSignTimesLhsReal, fmf),
438 Value realAbsSmallerThanImagAbs = arith::CmpFOp::create(
439 rewriter, loc, arith::CmpFPredicate::OLT, rhsRealAbs, rhsImagAbs);
440 Value resultReal5 = arith::SelectOp::create(
441 rewriter, loc, realAbsSmallerThanImagAbs, resultReal1, resultReal2);
442 Value resultImag5 = arith::SelectOp::create(
443 rewriter, loc, realAbsSmallerThanImagAbs, resultImag1, resultImag2);
444 Value resultRealSpecialCase3 = arith::SelectOp::create(
445 rewriter, loc, finiteNumInfiniteDenom, resultReal4, resultReal5);
446 Value resultImagSpecialCase3 = arith::SelectOp::create(
447 rewriter, loc, finiteNumInfiniteDenom, resultImag4, resultImag5);
448 Value resultRealSpecialCase2 = arith::SelectOp::create(
449 rewriter, loc, infNumFiniteDenom, resultReal3, resultRealSpecialCase3);
450 Value resultImagSpecialCase2 = arith::SelectOp::create(
451 rewriter, loc, infNumFiniteDenom, resultImag3, resultImagSpecialCase3);
452 Value resultRealSpecialCase1 =
453 arith::SelectOp::create(rewriter, loc, resultIsInfinity,
454 infinityResultReal, resultRealSpecialCase2);
455 Value resultImagSpecialCase1 =
456 arith::SelectOp::create(rewriter, loc, resultIsInfinity,
457 infinityResultImag, resultImagSpecialCase2);
459 Value resultRealIsNaN = arith::CmpFOp::create(
460 rewriter, loc, arith::CmpFPredicate::UNO, resultReal5, zero);
461 Value resultImagIsNaN = arith::CmpFOp::create(
462 rewriter, loc, arith::CmpFPredicate::UNO, resultImag5, zero);
464 arith::AndIOp::create(rewriter, loc, resultRealIsNaN, resultImagIsNaN);
466 *resultRe = arith::SelectOp::create(rewriter, loc, resultIsNaN,
467 resultRealSpecialCase1, resultReal5);
468 *resultIm = arith::SelectOp::create(rewriter, loc, resultIsNaN,
469 resultImagSpecialCase1, resultImag5);
FloatAttr getFloatAttr(Type type, double value)
TypedAttr getZeroAttr(Type type)
This class implements a pattern rewriter for use with ConversionPatterns.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Type getType() const
Return the type of this value.
void convertDivToLLVMUsingRangeReduction(ConversionPatternRewriter &rewriter, Location loc, Value lhsRe, Value lhsIm, Value rhsRe, Value rhsIm, LLVM::FastmathFlagsAttr fmf, Value *resultRe, Value *resultIm)
convert a complex division to the LLVM dialect using Smith's method
void convertDivToStandardUsingAlgebraic(ConversionPatternRewriter &rewriter, Location loc, Value lhsRe, Value lhsIm, Value rhsRe, Value rhsIm, arith::FastMathFlagsAttr fmf, Value *resultRe, Value *resultIm)
convert a complex division to the arith/math dialects using algebraic method
void convertDivToStandardUsingRangeReduction(ConversionPatternRewriter &rewriter, Location loc, Value lhsRe, Value lhsIm, Value rhsRe, Value rhsIm, arith::FastMathFlagsAttr fmf, Value *resultRe, Value *resultIm)
convert a complex division to the arith/math dialects using Smith's method
void convertDivToLLVMUsingAlgebraic(ConversionPatternRewriter &rewriter, Location loc, Value lhsRe, Value lhsIm, Value rhsRe, Value rhsIm, LLVM::FastmathFlagsAttr fmf, Value *resultRe, Value *resultIm)
convert a complex division to the LLVM dialect using algebraic method
Include the generated interface declarations.