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