xref: /freebsd/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetTransformInfo.cpp (revision b7daab8be1d4555f23a297e60e4128c01caabf82)
1 //===- DirectXTargetTransformInfo.cpp - DirectX TTI ---------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 //===----------------------------------------------------------------------===//
11 
12 #include "DirectXTargetTransformInfo.h"
13 #include "llvm/IR/Intrinsics.h"
14 #include "llvm/IR/IntrinsicsDirectX.h"
15 
16 using namespace llvm;
17 
18 bool DirectXTTIImpl::isTargetIntrinsicWithScalarOpAtArg(
19     Intrinsic::ID ID, unsigned ScalarOpdIdx) const {
20   switch (ID) {
21   case Intrinsic::dx_wave_readlane:
22     return ScalarOpdIdx == 1;
23   default:
24     return false;
25   }
26 }
27 
28 bool DirectXTTIImpl::isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID,
29                                                             int OpdIdx) const {
30   switch (ID) {
31   case Intrinsic::dx_asdouble:
32   case Intrinsic::dx_isinf:
33   case Intrinsic::dx_firstbitlow:
34   case Intrinsic::dx_firstbituhigh:
35   case Intrinsic::dx_firstbitshigh:
36     return OpdIdx == 0;
37   default:
38     return OpdIdx == -1;
39   }
40 }
41 
42 bool DirectXTTIImpl::isTargetIntrinsicTriviallyScalarizable(
43     Intrinsic::ID ID) const {
44   switch (ID) {
45   case Intrinsic::dx_asdouble:
46   case Intrinsic::dx_firstbitlow:
47   case Intrinsic::dx_firstbitshigh:
48   case Intrinsic::dx_firstbituhigh:
49   case Intrinsic::dx_frac:
50   case Intrinsic::dx_isinf:
51   case Intrinsic::dx_rsqrt:
52   case Intrinsic::dx_saturate:
53   case Intrinsic::dx_splitdouble:
54   case Intrinsic::dx_wave_readlane:
55   case Intrinsic::dx_wave_reduce_max:
56   case Intrinsic::dx_wave_reduce_sum:
57   case Intrinsic::dx_wave_reduce_umax:
58   case Intrinsic::dx_wave_reduce_usum:
59     return true;
60   default:
61     return false;
62   }
63 }
64