brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 5a2836e Raw
109 lines · cpp
1//===- FloatingPointMode.cpp ------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/FloatingPointMode.h"10#include "llvm/ADT/StringExtras.h"11 12using namespace llvm;13 14FPClassTest llvm::fneg(FPClassTest Mask) {15  FPClassTest NewMask = Mask & fcNan;16  if (Mask & fcNegInf)17    NewMask |= fcPosInf;18  if (Mask & fcNegNormal)19    NewMask |= fcPosNormal;20  if (Mask & fcNegSubnormal)21    NewMask |= fcPosSubnormal;22  if (Mask & fcNegZero)23    NewMask |= fcPosZero;24  if (Mask & fcPosZero)25    NewMask |= fcNegZero;26  if (Mask & fcPosSubnormal)27    NewMask |= fcNegSubnormal;28  if (Mask & fcPosNormal)29    NewMask |= fcNegNormal;30  if (Mask & fcPosInf)31    NewMask |= fcNegInf;32  return NewMask;33}34 35FPClassTest llvm::inverse_fabs(FPClassTest Mask) {36  FPClassTest NewMask = Mask & fcNan;37  if (Mask & fcPosZero)38    NewMask |= fcZero;39  if (Mask & fcPosSubnormal)40    NewMask |= fcSubnormal;41  if (Mask & fcPosNormal)42    NewMask |= fcNormal;43  if (Mask & fcPosInf)44    NewMask |= fcInf;45  return NewMask;46}47 48FPClassTest llvm::unknown_sign(FPClassTest Mask) {49  FPClassTest NewMask = Mask & fcNan;50  if (Mask & fcZero)51    NewMask |= fcZero;52  if (Mask & fcSubnormal)53    NewMask |= fcSubnormal;54  if (Mask & fcNormal)55    NewMask |= fcNormal;56  if (Mask & fcInf)57    NewMask |= fcInf;58  return NewMask;59}60 61// Every bitfield has a unique name and one or more aliasing names that cover62// multiple bits. Names should be listed in order of preference, with higher63// popcounts listed first.64//65// Bits are consumed as printed. Each field should only be represented in one66// printed field.67static constexpr std::pair<FPClassTest, StringLiteral> NoFPClassName[] = {68  {fcAllFlags, "all"},69  {fcNan, "nan"},70  {fcSNan, "snan"},71  {fcQNan, "qnan"},72  {fcInf, "inf"},73  {fcNegInf, "ninf"},74  {fcPosInf, "pinf"},75  {fcZero, "zero"},76  {fcNegZero, "nzero"},77  {fcPosZero, "pzero"},78  {fcSubnormal, "sub"},79  {fcNegSubnormal, "nsub"},80  {fcPosSubnormal, "psub"},81  {fcNormal, "norm"},82  {fcNegNormal, "nnorm"},83  {fcPosNormal, "pnorm"}84};85 86raw_ostream &llvm::operator<<(raw_ostream &OS, FPClassTest Mask) {87  OS << '(';88 89  if (Mask == fcNone) {90    OS << "none)";91    return OS;92  }93 94  ListSeparator LS(" ");95  for (auto [BitTest, Name] : NoFPClassName) {96    if ((Mask & BitTest) == BitTest) {97      OS << LS << Name;98 99      // Clear the bits so we don't print any aliased names later.100      Mask &= ~BitTest;101    }102  }103 104  assert(Mask == 0 && "didn't print some mask bits");105 106  OS << ')';107  return OS;108}109