//===- MachineFloatingPointPredicateUtils.cpp -----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/CodeGen/MachineFloatingPointPredicateUtils.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/LowLevelTypeUtils.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/MachineSSAContext.h"
#include "llvm/IR/Constants.h"
#include <optional>

namespace llvm {

using namespace MIPatternMatch;

template <>
DenormalMode
MachineFloatingPointPredicateUtils::queryDenormalMode(const MachineFunction &MF,
                                                      Register Val) {
  const MachineRegisterInfo &MRI = MF.getRegInfo();
  LLT Ty = MRI.getType(Val).getScalarType();
  return MF.getDenormalMode(getFltSemanticForLLT(Ty));
}

template <>
bool MachineFloatingPointPredicateUtils::lookThroughFAbs(
    const MachineFunction &MF, Register LHS, Register &Src) {
  const MachineRegisterInfo &MRI = MF.getRegInfo();
  return mi_match(LHS, MRI, m_GFabs(m_Reg(Src)));
}

template <>
std::optional<APFloat> MachineFloatingPointPredicateUtils::matchConstantFloat(
    const MachineFunction &MF, Register Val) {
  const MachineRegisterInfo &MRI = MF.getRegInfo();
  const ConstantFP *ConstVal;
  if (mi_match(Val, MRI, m_GFCst(ConstVal)))
    return ConstVal->getValueAPF();

  return std::nullopt;
}

} // namespace llvm
