brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · cf60a04 Raw
82 lines · cpp
1//===- AttrToLLVMConverter.cpp - Arith attributes conversion to LLVM ------===//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 "mlir/Conversion/ArithCommon/AttrToLLVMConverter.h"10 11using namespace mlir;12 13LLVM::FastmathFlags14mlir::arith::convertArithFastMathFlagsToLLVM(arith::FastMathFlags arithFMF) {15  LLVM::FastmathFlags llvmFMF{};16  const std::pair<arith::FastMathFlags, LLVM::FastmathFlags> flags[] = {17      {arith::FastMathFlags::nnan, LLVM::FastmathFlags::nnan},18      {arith::FastMathFlags::ninf, LLVM::FastmathFlags::ninf},19      {arith::FastMathFlags::nsz, LLVM::FastmathFlags::nsz},20      {arith::FastMathFlags::arcp, LLVM::FastmathFlags::arcp},21      {arith::FastMathFlags::contract, LLVM::FastmathFlags::contract},22      {arith::FastMathFlags::afn, LLVM::FastmathFlags::afn},23      {arith::FastMathFlags::reassoc, LLVM::FastmathFlags::reassoc}};24  for (auto [arithFlag, llvmFlag] : flags) {25    if (bitEnumContainsAny(arithFMF, arithFlag))26      llvmFMF = llvmFMF | llvmFlag;27  }28  return llvmFMF;29}30 31LLVM::FastmathFlagsAttr32mlir::arith::convertArithFastMathAttrToLLVM(arith::FastMathFlagsAttr fmfAttr) {33  arith::FastMathFlags arithFMF = fmfAttr.getValue();34  return LLVM::FastmathFlagsAttr::get(35      fmfAttr.getContext(), convertArithFastMathFlagsToLLVM(arithFMF));36}37 38LLVM::IntegerOverflowFlags mlir::arith::convertArithOverflowFlagsToLLVM(39    arith::IntegerOverflowFlags arithFlags) {40  LLVM::IntegerOverflowFlags llvmFlags{};41  const std::pair<arith::IntegerOverflowFlags, LLVM::IntegerOverflowFlags>42      flags[] = {43          {arith::IntegerOverflowFlags::nsw, LLVM::IntegerOverflowFlags::nsw},44          {arith::IntegerOverflowFlags::nuw, LLVM::IntegerOverflowFlags::nuw}};45  for (auto [arithFlag, llvmFlag] : flags) {46    if (bitEnumContainsAny(arithFlags, arithFlag))47      llvmFlags = llvmFlags | llvmFlag;48  }49  return llvmFlags;50}51 52LLVM::RoundingMode53mlir::arith::convertArithRoundingModeToLLVM(arith::RoundingMode roundingMode) {54  switch (roundingMode) {55  case arith::RoundingMode::downward:56    return LLVM::RoundingMode::TowardNegative;57  case arith::RoundingMode::to_nearest_away:58    return LLVM::RoundingMode::NearestTiesToAway;59  case arith::RoundingMode::to_nearest_even:60    return LLVM::RoundingMode::NearestTiesToEven;61  case arith::RoundingMode::toward_zero:62    return LLVM::RoundingMode::TowardZero;63  case arith::RoundingMode::upward:64    return LLVM::RoundingMode::TowardPositive;65  }66  llvm_unreachable("Unhandled rounding mode");67}68 69LLVM::RoundingModeAttr mlir::arith::convertArithRoundingModeAttrToLLVM(70    arith::RoundingModeAttr roundingModeAttr) {71  assert(roundingModeAttr && "Expecting valid attribute");72  return LLVM::RoundingModeAttr::get(73      roundingModeAttr.getContext(),74      convertArithRoundingModeToLLVM(roundingModeAttr.getValue()));75}76 77LLVM::FPExceptionBehaviorAttr78mlir::arith::getLLVMDefaultFPExceptionBehavior(MLIRContext &context) {79  return LLVM::FPExceptionBehaviorAttr::get(&context,80                                            LLVM::FPExceptionBehavior::Ignore);81}82