| //===- 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/GlobalISel/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 |