310 auto i1Type = IntegerType::get(
symTable->getContext(), 1);
311 auto i8Type = IntegerType::get(
symTable->getContext(), 8);
312 auto i32Type = IntegerType::get(
symTable->getContext(), 32);
313 auto i64Type = IntegerType::get(
symTable->getContext(), 64);
314 FailureOr<FuncOp> fn =
316 {i32Type, i64Type, i64Type},
nullptr, i8Type);
324 rewriter, loc, op.getLhs(), op.getRhs(), op.getType(),
327 auto floatTy = cast<FloatType>(lhs.getType());
328 auto intWType = rewriter.getIntegerType(floatTy.getWidth());
329 Value lhsBits = arith::ExtUIOp::create(
330 rewriter, loc, i64Type,
331 arith::BitcastOp::create(rewriter, loc, intWType, lhs));
332 Value rhsBits = arith::ExtUIOp::create(
333 rewriter, loc, i64Type,
334 arith::BitcastOp::create(rewriter, loc, intWType, rhs));
337 Value semValue = getAPFloatSemanticsValue(rewriter, loc, floatTy);
338 SmallVector<Value> params = {semValue, lhsBits, rhsBits};
339 Value comparisonResult =
340 func::CallOp::create(rewriter, loc,
TypeRange(i8Type),
341 SymbolRefAttr::get(*fn), params)
346 auto checkResult = [&](llvm::APFloat::cmpResult val) {
347 return arith::CmpIOp::create(
348 rewriter, loc, arith::CmpIPredicate::eq, comparisonResult,
349 arith::ConstantOp::create(
350 rewriter, loc, i8Type,
358 Value first = checkResult(vals.front());
359 if (vals.size() == 1)
361 Value rest = checkResults(vals.drop_front());
362 return arith::OrIOp::create(rewriter, loc, first, rest)
368 switch (op.getPredicate()) {
369 case arith::CmpFPredicate::AlwaysFalse:
371 arith::ConstantOp::create(rewriter, loc, i1Type,
375 case arith::CmpFPredicate::OEQ:
376 result = checkResult(llvm::APFloat::cmpEqual);
378 case arith::CmpFPredicate::OGT:
379 result = checkResult(llvm::APFloat::cmpGreaterThan);
381 case arith::CmpFPredicate::OGE:
383 {llvm::APFloat::cmpGreaterThan, llvm::APFloat::cmpEqual});
385 case arith::CmpFPredicate::OLT:
386 result = checkResult(llvm::APFloat::cmpLessThan);
388 case arith::CmpFPredicate::OLE:
390 {llvm::APFloat::cmpLessThan, llvm::APFloat::cmpEqual});
392 case arith::CmpFPredicate::ONE:
395 {llvm::APFloat::cmpLessThan, llvm::APFloat::cmpGreaterThan});
397 case arith::CmpFPredicate::ORD:
399 result = checkResults({llvm::APFloat::cmpLessThan,
400 llvm::APFloat::cmpGreaterThan,
401 llvm::APFloat::cmpEqual});
403 case arith::CmpFPredicate::UEQ:
405 {llvm::APFloat::cmpUnordered, llvm::APFloat::cmpEqual});
407 case arith::CmpFPredicate::UGT:
409 {llvm::APFloat::cmpUnordered, llvm::APFloat::cmpGreaterThan});
411 case arith::CmpFPredicate::UGE:
412 result = checkResults({llvm::APFloat::cmpUnordered,
413 llvm::APFloat::cmpGreaterThan,
414 llvm::APFloat::cmpEqual});
416 case arith::CmpFPredicate::ULT:
418 {llvm::APFloat::cmpUnordered, llvm::APFloat::cmpLessThan});
420 case arith::CmpFPredicate::ULE:
421 result = checkResults({llvm::APFloat::cmpUnordered,
422 llvm::APFloat::cmpLessThan,
423 llvm::APFloat::cmpEqual});
425 case arith::CmpFPredicate::UNE:
427 result = checkResults({llvm::APFloat::cmpLessThan,
428 llvm::APFloat::cmpGreaterThan,
429 llvm::APFloat::cmpUnordered});
431 case arith::CmpFPredicate::UNO:
432 result = checkResult(llvm::APFloat::cmpUnordered);
434 case arith::CmpFPredicate::AlwaysTrue:
436 arith::ConstantOp::create(rewriter, loc, i1Type,