LLVM 23.0.0git
DirectXTargetTransformInfo.cpp
Go to the documentation of this file.
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
13#include "llvm/IR/Intrinsics.h"
14#include "llvm/IR/IntrinsicsDirectX.h"
15
16using namespace llvm;
17
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
29 int OpdIdx) const {
30 switch (ID) {
31 case Intrinsic::dx_asdouble:
32 case Intrinsic::dx_firstbitlow:
33 case Intrinsic::dx_firstbitshigh:
34 case Intrinsic::dx_firstbituhigh:
35 case Intrinsic::dx_isinf:
36 case Intrinsic::dx_isnan:
37 case Intrinsic::dx_legacyf16tof32:
38 case Intrinsic::dx_legacyf32tof16:
39 case Intrinsic::dx_wave_all_equal:
40 return OpdIdx == 0;
41 default:
42 // All DX intrinsics are overloaded on return type unless specified
43 // otherwise
44 return OpdIdx == -1;
45 }
46}
47
49 Intrinsic::ID ID) const {
50 switch (ID) {
51 case Intrinsic::dx_asdouble:
52 case Intrinsic::dx_firstbitlow:
53 case Intrinsic::dx_firstbitshigh:
54 case Intrinsic::dx_firstbituhigh:
55 case Intrinsic::dx_frac:
56 case Intrinsic::dx_isinf:
57 case Intrinsic::dx_isnan:
58 case Intrinsic::dx_legacyf16tof32:
59 case Intrinsic::dx_legacyf32tof16:
60 case Intrinsic::dx_rsqrt:
61 case Intrinsic::dx_saturate:
62 case Intrinsic::dx_splitdouble:
63 case Intrinsic::dx_wave_all_equal:
64 case Intrinsic::dx_wave_readlane:
65 case Intrinsic::dx_wave_reduce_or:
66 case Intrinsic::dx_wave_reduce_max:
67 case Intrinsic::dx_wave_reduce_min:
68 case Intrinsic::dx_wave_reduce_sum:
69 case Intrinsic::dx_wave_product:
70 case Intrinsic::dx_wave_prefix_sum:
71 case Intrinsic::dx_wave_prefix_product:
72 case Intrinsic::dx_wave_reduce_umax:
73 case Intrinsic::dx_wave_reduce_umin:
74 case Intrinsic::dx_wave_reduce_usum:
75 case Intrinsic::dx_wave_uproduct:
76 case Intrinsic::dx_wave_prefix_usum:
77 case Intrinsic::dx_wave_prefix_uproduct:
78 case Intrinsic::dx_imad:
79 case Intrinsic::dx_umad:
80 case Intrinsic::dx_ddx_coarse:
81 case Intrinsic::dx_ddy_coarse:
82 case Intrinsic::dx_ddx_fine:
83 case Intrinsic::dx_ddy_fine:
84 return true;
85 default:
86 return false;
87 }
88}
bool isTargetIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx) const override
bool isTargetIntrinsicTriviallyScalarizable(Intrinsic::ID ID) const override
bool isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID, int OpdIdx) const override
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26