1//- DXIL.td - Describe DXIL operation -------------------------*- tablegen -*-//
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-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This is a target description file for DXIL operation.
11///
12//===----------------------------------------------------------------------===//
13
14include "llvm/IR/Intrinsics.td"
15
16class dxil_class<string _name> {
17  string name = _name;
18}
19class dxil_category<string _name> {
20  string name = _name;
21}
22
23def Unary : dxil_class<"Unary">;
24def Binary : dxil_class<"Binary">;
25def FlattenedThreadIdInGroupClass : dxil_class<"FlattenedThreadIdInGroup">;
26def ThreadIdInGroupClass : dxil_class<"ThreadIdInGroup">;
27def ThreadIdClass : dxil_class<"ThreadId">;
28def GroupIdClass : dxil_class<"GroupId">;
29
30def binary_uint : dxil_category<"Binary uint">;
31def unary_float : dxil_category<"Unary float">;
32def ComputeID : dxil_category<"Compute/Mesh/Amplification shader">;
33
34
35// The parameter description for a DXIL instruction
36class dxil_param<int _pos, string type, string _name, string _doc,
37                 bit _is_const = 0, string _enum_name = "",
38                 int _max_value = 0> {
39  int pos = _pos;           // position in parameter list
40  string llvm_type = type; // llvm type name, $o for overload, $r for resource
41                           // type, $cb for legacy cbuffer, $u4 for u4 struct
42  string name = _name;      // short, unique name
43  string doc = _doc;        // the documentation description of this parameter
44  bit is_const =
45      _is_const; // whether this argument requires a constant value in the IR
46  string enum_name = _enum_name; // the name of the enum type if applicable
47  int max_value =
48      _max_value; // the maximum value for this parameter if applicable
49}
50
51// A representation for a DXIL instruction
52class dxil_inst<string _name> {
53  string name = _name; // short, unique name
54
55  string dxil_op = "";       // name of DXIL operation
56  int dxil_opid = 0;         // ID of DXIL operation
57  dxil_class  op_class;      // name of the opcode class
58  dxil_category category;    // classification for this instruction
59  string doc = "";           // the documentation description of this instruction
60  list<dxil_param> ops = []; // the operands that this instruction takes
61  string oload_types = "";   // overload types if applicable
62  string fn_attr = "";       // attribute shorthands: rn=does not access
63                             // memory,ro=only reads from memory,
64  bit is_deriv = 0;          // whether this is some kind of derivative
65  bit is_gradient = 0;       // whether this requires a gradient calculation
66  bit is_feedback = 0;       // whether this is a sampler feedback op
67  bit is_wave = 0; // whether this requires in-wave, cross-lane functionality
68  bit requires_uniform_inputs = 0; // whether this operation requires that all
69                                   // of its inputs are uniform across the wave
70  // Group dxil operation for stats.
71  // Like how many atomic/float/uint/int/... instructions used in the program.
72  list<string> stats_group = [];
73}
74
75class dxil_op<string name, int code_id, dxil_class code_class, dxil_category op_category, string _doc,
76              string _oload_types, string _fn_attr, list<dxil_param> op_params,
77              list<string> _stats_group = []> : dxil_inst<name> {
78  let dxil_op = name;
79  let dxil_opid = code_id;
80  let doc = _doc;
81  let ops = op_params;
82  let op_class = code_class;
83  let category = op_category;
84  let oload_types = _oload_types;
85  let fn_attr = _fn_attr;
86  let stats_group = _stats_group;
87}
88
89// The intrinsic which map directly to this dxil op.
90class dxil_map_intrinsic<Intrinsic llvm_intrinsic_> { Intrinsic llvm_intrinsic = llvm_intrinsic_; }
91
92def Sin : dxil_op<"Sin", 13, Unary, unary_float, "returns sine(theta) for theta in radians.",
93  "half;float;", "rn",
94  [
95    dxil_param<0, "$o", "", "operation result">,
96    dxil_param<1, "i32", "opcode", "DXIL opcode">,
97    dxil_param<2, "$o", "value", "input value">
98  ],
99  ["floats"]>,
100  dxil_map_intrinsic<int_sin>;
101
102def UMax :dxil_op< "UMax", 39,  Binary,  binary_uint, "unsigned integer maximum. UMax(a,b) = a > b ? a : b",
103    "i16;i32;i64;",  "rn",
104  [
105    dxil_param<0,  "$o",  "",  "operation result">,
106    dxil_param<1,  "i32",  "opcode",  "DXIL opcode">,
107    dxil_param<2,  "$o",  "a",  "input value">,
108    dxil_param<3,  "$o",  "b",  "input value">
109  ],
110  ["uints"]>,
111  dxil_map_intrinsic<int_umax>;
112
113def ThreadId :dxil_op< "ThreadId", 93,  ThreadIdClass, ComputeID, "reads the thread ID", "i32;",  "rn",
114  [
115    dxil_param<0,  "i32",  "",  "thread ID component">,
116    dxil_param<1,  "i32",  "opcode",  "DXIL opcode">,
117    dxil_param<2,  "i32",  "component",  "component to read (x,y,z)">
118  ]>,
119  dxil_map_intrinsic<int_dx_thread_id>;
120
121def GroupId :dxil_op< "GroupId", 94,  GroupIdClass, ComputeID, "reads the group ID (SV_GroupID)", "i32;",  "rn",
122  [
123    dxil_param<0,  "i32",  "",  "group ID component">,
124    dxil_param<1,  "i32",  "opcode",  "DXIL opcode">,
125    dxil_param<2,  "i32",  "component",  "component to read">
126  ]>,
127  dxil_map_intrinsic<int_dx_group_id>;
128
129def ThreadIdInGroup :dxil_op< "ThreadIdInGroup", 95,  ThreadIdInGroupClass, ComputeID,
130  "reads the thread ID within the group (SV_GroupThreadID)", "i32;",  "rn",
131  [
132    dxil_param<0,  "i32",  "",  "thread ID in group component">,
133    dxil_param<1,  "i32",  "opcode",  "DXIL opcode">,
134    dxil_param<2,  "i32",  "component",  "component to read (x,y,z)">
135  ]>,
136  dxil_map_intrinsic<int_dx_thread_id_in_group>;
137
138def FlattenedThreadIdInGroup :dxil_op< "FlattenedThreadIdInGroup", 96,  FlattenedThreadIdInGroupClass, ComputeID,
139   "provides a flattened index for a given thread within a given group (SV_GroupIndex)", "i32;",  "rn",
140  [
141    dxil_param<0,  "i32",  "",  "result">,
142    dxil_param<1,  "i32",  "opcode",  "DXIL opcode">
143  ]>,
144  dxil_map_intrinsic<int_dx_flattened_thread_id_in_group>;
145