//===- DirectXTargetTransformInfo.cpp - DirectX TTI ---------------*- C++
//-*-===//
//
// 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 "DirectXTargetTransformInfo.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicsDirectX.h"

using namespace llvm;

bool DirectXTTIImpl::isTargetIntrinsicWithScalarOpAtArg(
    Intrinsic::ID ID, unsigned ScalarOpdIdx) const {
  switch (ID) {
  case Intrinsic::dx_wave_readlane:
    return ScalarOpdIdx == 1;
  default:
    return false;
  }
}

bool DirectXTTIImpl::isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID,
                                                            int OpdIdx) const {
  switch (ID) {
  case Intrinsic::dx_asdouble:
  case Intrinsic::dx_firstbitlow:
  case Intrinsic::dx_firstbitshigh:
  case Intrinsic::dx_firstbituhigh:
  case Intrinsic::dx_isinf:
  case Intrinsic::dx_isnan:
  case Intrinsic::dx_legacyf16tof32:
  case Intrinsic::dx_legacyf32tof16:
  case Intrinsic::dx_wave_all_equal:
    return OpdIdx == 0;
  default:
    // All DX intrinsics are overloaded on return type unless specified
    // otherwise
    return OpdIdx == -1;
  }
}

bool DirectXTTIImpl::isTargetIntrinsicTriviallyScalarizable(
    Intrinsic::ID ID) const {
  switch (ID) {
  case Intrinsic::dx_asdouble:
  case Intrinsic::dx_firstbitlow:
  case Intrinsic::dx_firstbitshigh:
  case Intrinsic::dx_firstbituhigh:
  case Intrinsic::dx_frac:
  case Intrinsic::dx_isinf:
  case Intrinsic::dx_isnan:
  case Intrinsic::dx_legacyf16tof32:
  case Intrinsic::dx_legacyf32tof16:
  case Intrinsic::dx_rsqrt:
  case Intrinsic::dx_saturate:
  case Intrinsic::dx_splitdouble:
  case Intrinsic::dx_wave_all_equal:
  case Intrinsic::dx_wave_readlane:
  case Intrinsic::dx_wave_reduce_or:
  case Intrinsic::dx_wave_reduce_xor:
  case Intrinsic::dx_wave_reduce_max:
  case Intrinsic::dx_wave_reduce_min:
  case Intrinsic::dx_wave_reduce_sum:
  case Intrinsic::dx_wave_product:
  case Intrinsic::dx_wave_prefix_sum:
  case Intrinsic::dx_wave_prefix_product:
  case Intrinsic::dx_wave_reduce_umax:
  case Intrinsic::dx_wave_reduce_umin:
  case Intrinsic::dx_wave_reduce_usum:
  case Intrinsic::dx_wave_uproduct:
  case Intrinsic::dx_wave_prefix_usum:
  case Intrinsic::dx_wave_prefix_uproduct:
  case Intrinsic::dx_imad:
  case Intrinsic::dx_umad:
  case Intrinsic::dx_ddx_coarse:
  case Intrinsic::dx_ddy_coarse:
  case Intrinsic::dx_ddx_fine:
  case Intrinsic::dx_ddy_fine:
    return true;
  default:
    return false;
  }
}
