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.