OSDN Git Service

radeonsi: initial WIP SI code
[android-x86/external-mesa.git] / src / gallium / drivers / radeon / AMDILFormats.td
1 //==- AMDILFormats.td - AMDIL Instruction Formats ----*- tablegen -*-==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //==-----------------------------------------------------------------------===//
9 //
10 //===--------------------------------------------------------------------===//
11 include "AMDILTokenDesc.td"
12
13 //===--------------------------------------------------------------------===//
14 // The parent IL instruction class that inherits the Instruction class. This
15 // class sets the corresponding namespace, the out and input dag lists the
16 // pattern to match to and the string to print out for the assembly printer.
17 //===--------------------------------------------------------------------===//
18 class ILFormat<ILOpCode op, dag outs, dag ins, string asmstr, list<dag> pattern>
19 : Instruction {
20
21      let Namespace = "AMDIL";
22      dag OutOperandList = outs;
23      dag InOperandList = ins;
24      ILOpCode operation = op;
25      let Pattern = pattern;
26      let AsmString = !strconcat(asmstr, "\n");
27      let isPseudo = 1;
28      bit hasIEEEFlag = 0;
29      bit hasZeroOpFlag = 0;
30 }
31
32 //===--------------------------------------------------------------------===//
33 // The base class for vector insert instructions. It is a single dest, quad
34 // source instruction where the last two source operands must be 32bit
35 // immediate values that are encoding the swizzle of the source register
36 // The src2 and src3 instructions must also be inversion of each other such
37 // that if src2 is 0x1000300(x0z0), src3 must be 0x20004(0y0w). The values
38 // are encoded as 32bit integer with each 8 char representing a swizzle value.
39 // The encoding is as follows for 32bit register types:
40 // 0x00 -> '_'
41 // 0x01 -> 'x'
42 // 0x02 -> 'y'
43 // 0x03 -> 'z'
44 // 0x04 -> 'w'
45 // 0x05 -> 'x'
46 // 0x06 -> 'y'
47 // 0x07 -> 'z'
48 // 0x08 -> 'w'
49 // 0x09 -> '0'
50 // The encoding is as follows for 64bit register types:
51 // 0x00 -> "__"
52 // 0x01 -> "xy"
53 // 0x02 -> "zw"
54 // 0x03 -> "xy"
55 // 0x04 -> "zw"
56 // 0x05 -> "00"
57 //===--------------------------------------------------------------------===//
58 class InsertVectorClass<ILOpCode op, RegisterClass DReg, RegisterClass SReg,
59       SDNode OpNode, string asmstr> :
60       ILFormat<op, (outs DReg:$dst),
61       (ins DReg:$src0, SReg:$src1, i32imm:$src2, i32imm:$src3),
62       !strconcat(asmstr, " $dst, $src0, $src1"),
63       [(set DReg:$dst, (OpNode DReg:$src0, SReg:$src1,
64                      timm:$src2, timm:$src3))]>;
65
66 //===--------------------------------------------------------------------===//
67 // Class that has one input parameters and one output parameter.
68 // The basic pattern for this class is "Opcode Dst, Src0" and
69 // handles the unary math operators.
70 // It sets the binary token ILSrc, ILSrcMod, ILRelAddr and ILSrc and ILSrcMod
71 // if the addressing is register relative for input and output register 0.
72 //===--------------------------------------------------------------------===//
73 class OneInOneOut<ILOpCode op, dag outs, dag ins,
74       string asmstr, list<dag> pattern>
75       : ILFormat<op, outs, ins, asmstr, pattern>
76 {
77      ILDst       dst_reg;
78      ILDstMod    dst_mod;
79      ILRelAddr   dst_rel;
80      ILSrc       dst_reg_rel;
81      ILSrcMod    dst_reg_rel_mod;
82      ILSrc       src0_reg;
83      ILSrcMod    src0_mod;
84      ILRelAddr   src0_rel;
85      ILSrc       src0_reg_rel;
86      ILSrcMod    src0_reg_rel_mod;
87 }
88
89 //===--------------------------------------------------------------------===//
90 // A simplified version of OneInOneOut class where the pattern is standard
91 // and does not need special cases. This requires that the pattern has
92 // a SDNode and takes a source and destination register that is of type
93 // RegisterClass. This is the standard unary op class.
94 //===--------------------------------------------------------------------===//
95 class UnaryOp<ILOpCode op, SDNode OpNode,
96       RegisterClass dRegs, RegisterClass sRegs>
97       : OneInOneOut<op, (outs dRegs:$dst), (ins sRegs:$src),
98       !strconcat(op.Text, " $dst, $src"),
99       [(set dRegs:$dst, (OpNode sRegs:$src))]>;
100
101 //===--------------------------------------------------------------------===//
102 // This class is similiar to the UnaryOp class, however, there is no
103 // result value to assign.
104 //===--------------------------------------------------------------------===//
105 class UnaryOpNoRet<ILOpCode op, dag outs, dag ins,
106       string asmstr, list<dag> pattern>
107       : ILFormat<op, outs, ins, asmstr, pattern>
108 {
109      ILSrc       src0_reg;
110      ILSrcMod    src0_mod;
111      ILRelAddr   src0_rel;
112      ILSrc       src0_reg_rel;
113      ILSrcMod    src0_reg_rel_mod;
114 }
115
116 //===--------------------------------------------------------------------===//
117 // Set of classes that have two input parameters and one output parameter.
118 // The basic pattern for this class is "Opcode Dst, Src0, Src1" and
119 // handles the binary math operators and comparison operations.
120 // It sets the binary token ILSrc, ILSrcMod, ILRelAddr and ILSrc and ILSrcMod
121 // if the addressing is register relative for input register 1.
122 //===--------------------------------------------------------------------===//
123 class TwoInOneOut<ILOpCode op, dag outs, dag ins,
124       string asmstr, list<dag> pattern>
125       : OneInOneOut<op, outs, ins, asmstr, pattern>
126 {
127      ILSrc       src1_reg;
128      ILSrcMod    src1_mod;
129      ILRelAddr   src1_rel;
130      ILSrc       src1_reg_rel;
131      ILSrcMod    src1_reg_rel_mod;
132 }
133 //===--------------------------------------------------------------------===//
134 // A simplification of the TwoInOneOut pattern for Binary Operations.
135 // This class is a helper class that assumes the simple pattern of
136 // $dst = op $src0 $src1.
137 // Other type of matching patterns need to use the TwoInOneOut class.
138 //===--------------------------------------------------------------------===//
139 class BinaryOp<ILOpCode op, SDNode OpNode, RegisterClass dReg,
140       RegisterClass sReg0, RegisterClass sReg1>
141       : TwoInOneOut<op, (outs dReg:$dst), (ins sReg0:$src0, sReg1:$src1),
142       !strconcat(op.Text, " $dst, $src0, $src1"),
143       [(set dReg:$dst, (OpNode sReg0:$src0, sReg1:$src1))]>;
144
145 //===--------------------------------------------------------------------===//
146 // The base class for vector extract instructions. The vector extract
147 // instructions take as an input value a source register and a 32bit integer
148 // with the same encoding as specified in InsertVectorClass and produces
149 // a result with only the swizzled component in the destination register.
150 //===--------------------------------------------------------------------===//
151 class ExtractVectorClass<RegisterClass DReg, RegisterClass SReg, SDNode OpNode>
152 : TwoInOneOut<IL_OP_MOV, (outs DReg:$dst), (ins SReg:$src0, i32imm:$src1),
153      "mov $dst, $src0",
154      [(set DReg:$dst, (OpNode SReg:$src0, timm:$src1))]>;
155
156 //===--------------------------------------------------------------------===//
157 // The base class for vector concatenation. This class creates either a vec2
158 // or a vec4 of 32bit data types or a vec2 of 64bit data types. This is done
159 // by swizzling either the 'x' or 'xy' components of the source operands
160 // into the destination register.
161 //===--------------------------------------------------------------------===//
162 class VectorConcatClass<RegisterClass Dst, RegisterClass Src, SDNode OpNode>
163       : TwoInOneOut<IL_OP_I_ADD, (outs Dst:$dst), (ins Src:$src0, Src:$src1),
164       "iadd $dst, $src0, $src1",
165       [(set Dst:$dst, (OpNode Src:$src0, Src:$src1))]>;
166
167 //===--------------------------------------------------------------------===//
168 // Similiar to the UnaryOpNoRet class, but takes as arguments two input
169 // operands. Used mainly for barrier instructions on PC platform.
170 //===--------------------------------------------------------------------===//
171 class BinaryOpNoRet<ILOpCode op, dag outs, dag ins,
172       string asmstr, list<dag> pattern>
173       : UnaryOpNoRet<op, outs, ins, asmstr, pattern>
174 {
175      ILSrc       src1_reg;
176      ILSrcMod    src1_mod;
177      ILRelAddr   src1_rel;
178      ILSrc       src1_reg_rel;
179      ILSrcMod    src1_reg_rel_mod;
180 }
181
182 //===--------------------------------------------------------------------===//
183 // Set of classes that have three input parameters and one output parameter.
184 // The basic pattern for this class is "Opcode Dst, Src0, Src1, Src2" and
185 // handles the mad and conditional mov instruction.
186 // It sets the binary token ILSrc, ILSrcMod, ILRelAddr and ILSrc and ILSrcMod
187 // if the addressing is register relative.
188 // This class is the parent class of TernaryOp
189 //===--------------------------------------------------------------------===//
190 class ThreeInOneOut<ILOpCode op, dag outs, dag ins,
191       string asmstr, list<dag> pattern>
192       : TwoInOneOut<op, outs, ins, asmstr, pattern> {
193            ILSrc       src2_reg;
194            ILSrcMod    src2_mod;
195            ILRelAddr   src2_rel;
196            ILSrc       src2_reg_rel;
197            ILSrcMod    src2_reg_rel_mod;
198       }
199
200 //===--------------------------------------------------------------------===//
201 // The g version of the Three Input pattern uses a standard pattern but
202 // but allows specification of the register to further generalize the class
203 // This class is mainly used in the generic multiclasses in AMDILMultiClass.td
204 //===--------------------------------------------------------------------===//
205 class TernaryOp<ILOpCode op, SDNode OpNode,
206       RegisterClass dReg,
207       RegisterClass sReg0,
208       RegisterClass sReg1,
209       RegisterClass sReg2>
210       : ThreeInOneOut<op, (outs dReg:$dst),
211       (ins sReg0:$src0, sReg1:$src1, sReg2:$src2),
212       !strconcat(op.Text, " $dst, $src0, $src1, $src2"),
213       [(set dReg:$dst,
214                 (OpNode sReg0:$src0, sReg1:$src1, sReg2:$src2))]>;
215
216 //===--------------------------------------------------------------------===//
217 // Set of classes that have three input parameters and one output parameter.
218 // The basic pattern for this class is "Opcode Dst, Src0, Src1, Src2" and
219 // handles the mad and conditional mov instruction.
220 // It sets the binary token ILSrc, ILSrcMod, ILRelAddr and ILSrc and ILSrcMod
221 // if the addressing is register relative.
222 // This class is the parent class of TernaryOp
223 //===--------------------------------------------------------------------===//
224 class FourInOneOut<ILOpCode op, dag outs, dag ins,
225       string asmstr, list<dag> pattern>
226       : ThreeInOneOut<op, outs, ins, asmstr, pattern> {
227            ILSrc       src3_reg;
228            ILSrcMod    src3_mod;
229            ILRelAddr   src3_rel;
230            ILSrc       src3_reg_rel;
231            ILSrcMod    src3_reg_rel_mod;
232       }
233
234
235 //===--------------------------------------------------------------------===//
236 // The macro class that is an extension of OneInOneOut but is tailored for
237 // macros only where all the register types are the same
238 //===--------------------------------------------------------------------===//
239 class UnaryMacro<RegisterClass Dst, RegisterClass Src0, SDNode OpNode>
240 : OneInOneOut<IL_OP_MACRO, (outs Dst:$dst),
241      (ins Src0:$src0),
242      "($dst),($src0)",
243      [(set Dst:$dst, (OpNode Src0:$src0))]>;
244
245 //===--------------------------------------------------------------------===//
246 // The macro class is an extension of TwoInOneOut but is tailored for
247 // macros only where all the register types are the same
248 //===--------------------------------------------------------------------===//
249 class BinaryMacro<RegisterClass Dst,
250       RegisterClass Src0,
251       RegisterClass Src1,
252       SDNode OpNode>
253       : TwoInOneOut<IL_OP_MACRO, (outs Dst:$dst),
254       (ins Src0: $src0, Src1:$src1),
255       "($dst),($src0, $src1)",
256       [(set Dst:$dst, (OpNode Src0:$src0, Src1:$src1))]>;
257
258 //===--------------------------------------------------------------------===//
259 // Classes for dealing with atomic instructions w/ 32bit pointers
260 //===--------------------------------------------------------------------===//
261 class Append<ILOpCode op, string idType, SDNode intr>
262       : ILFormat<op, (outs GPRI32:$dst),
263       (ins MEMI32:$id),
264       !strconcat(op.Text, !strconcat(idType," $dst")),
265       [(set GPRI32:$dst, (intr ADDR:$id))]>;
266
267
268 // TODO: Need to get this working without dst...
269 class AppendNoRet<ILOpCode op, string idType, SDNode intr>
270       : ILFormat<op, (outs GPRI32:$dst),
271       (ins MEMI32:$id),
272       !strconcat(op.Text, !strconcat(idType," $dst")),
273       [(set GPRI32:$dst, (intr ADDR:$id))]>;
274
275 class UniAtom<ILOpCode op, string idType, SDNode intr>
276       : ILFormat<op, (outs GPRI32:$dst),
277       (ins MEMI32:$ptr, i32imm:$id),
278       !strconcat(op.Text, !strconcat(idType," $dst, $ptr")),
279       [(set GPRI32:$dst, (intr ADDR:$ptr, timm:$id))]>;
280
281
282 // TODO: Need to get this working without dst...
283 class UniAtomNoRet<ILOpCode op, string idType, SDNode intr>
284       : ILFormat<op, (outs GPRI32:$dst), (ins MEMI32:$ptr, i32imm:$id),
285       !strconcat(op.Text, !strconcat(idType," $ptr")),
286       [(set GPRI32:$dst, (intr ADDR:$ptr, timm:$id))]>;
287
288 class BinAtom<ILOpCode op, string idType, SDNode intr>
289       : ILFormat<op, (outs GPRI32:$dst),
290       (ins MEMI32:$ptr, GPRI32:$src, i32imm:$id),
291       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src")),
292       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, timm:$id))]>;
293
294
295 // TODO: Need to get this working without dst...
296 class BinAtomNoRet<ILOpCode op, string idType, SDNode intr>
297       : ILFormat<op, (outs GPRI32:$dst), (ins MEMI32:$ptr, GPRI32:$src, i32imm:$id),
298       !strconcat(op.Text, !strconcat(idType," $ptr, $src")),
299       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, timm:$id))]>;
300
301 class TriAtom<ILOpCode op, string idType, SDNode intr>
302       : ILFormat<op, (outs GPRI32:$dst),
303       (ins MEMI32:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
304       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src, $src1")),
305       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
306
307 class CmpXChg<ILOpCode op, string idType, SDNode intr>
308       : ILFormat<op, (outs GPRI32:$dst),
309       (ins MEMI32:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
310       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src1, $src")),
311       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
312
313 // TODO: Need to get this working without dst...
314 class TriAtomNoRet<ILOpCode op, string idType, SDNode intr>
315       : ILFormat<op, (outs GPRI32:$dst),
316       (ins MEMI32:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
317       !strconcat(op.Text, !strconcat(idType," $ptr, $src, $src1")),
318       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
319
320 // TODO: Need to get this working without dst...
321 class CmpXChgNoRet<ILOpCode op, string idType, SDNode intr>
322       : ILFormat<op, (outs GPRI32:$dst),
323       (ins MEMI32:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
324       !strconcat(op.Text, !strconcat(idType," $ptr, $src1, $src")),
325       [(set GPRI32:$dst, (intr ADDR:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
326
327
328 //===--------------------------------------------------------------------===//
329 // Classes for dealing with atomic instructions w/ 64bit pointers
330 //===--------------------------------------------------------------------===//
331 class Append64<ILOpCode op, string idType, SDNode intr>
332       : ILFormat<op, (outs GPRI32:$dst),
333       (ins MEMI64:$id),
334       !strconcat(op.Text, !strconcat(idType," $dst")),
335       [(set GPRI32:$dst, (intr ADDR64:$id))]>;
336
337
338 // TODO: Need to get this working without dst...
339 class AppendNoRet64<ILOpCode op, string idType, SDNode intr>
340       : ILFormat<op, (outs GPRI32:$dst),
341       (ins MEMI64:$id),
342       !strconcat(op.Text, !strconcat(idType," $dst")),
343       [(set GPRI32:$dst, (intr ADDR64:$id))]>;
344
345 class UniAtom64<ILOpCode op, string idType, SDNode intr>
346       : ILFormat<op, (outs GPRI32:$dst),
347       (ins MEMI64:$ptr, i32imm:$id),
348       !strconcat(op.Text, !strconcat(idType," $dst, $ptr")),
349       [(set GPRI32:$dst, (intr ADDR64:$ptr, timm:$id))]>;
350
351
352 // TODO: Need to get this working without dst...
353 class UniAtomNoRet64<ILOpCode op, string idType, SDNode intr>
354       : ILFormat<op, (outs GPRI32:$dst), (ins MEMI64:$ptr, i32imm:$id),
355       !strconcat(op.Text, !strconcat(idType," $ptr")),
356       [(set GPRI32:$dst, (intr ADDR64:$ptr, timm:$id))]>;
357
358 class BinAtom64<ILOpCode op, string idType, SDNode intr>
359       : ILFormat<op, (outs GPRI32:$dst),
360       (ins MEMI64:$ptr, GPRI32:$src, i32imm:$id),
361       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src")),
362       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, timm:$id))]>;
363
364
365 // TODO: Need to get this working without dst...
366 class BinAtomNoRet64<ILOpCode op, string idType, SDNode intr>
367       : ILFormat<op, (outs GPRI32:$dst), (ins MEMI64:$ptr, GPRI32:$src, i32imm:$id),
368       !strconcat(op.Text, !strconcat(idType," $ptr, $src")),
369       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, timm:$id))]>;
370
371 class TriAtom64<ILOpCode op, string idType, SDNode intr>
372       : ILFormat<op, (outs GPRI32:$dst),
373       (ins MEMI64:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
374       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src, $src1")),
375       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
376
377 class CmpXChg64<ILOpCode op, string idType, SDNode intr>
378       : ILFormat<op, (outs GPRI32:$dst),
379       (ins MEMI64:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
380       !strconcat(op.Text, !strconcat(idType," $dst, $ptr, $src1, $src")),
381       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
382
383 // TODO: Need to get this working without dst...
384 class TriAtomNoRet64<ILOpCode op, string idType, SDNode intr>
385       : ILFormat<op, (outs GPRI32:$dst),
386       (ins MEMI64:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
387       !strconcat(op.Text, !strconcat(idType," $ptr, $src, $src1")),
388       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
389
390 // TODO: Need to get this working without dst...
391 class CmpXChgNoRet64<ILOpCode op, string idType, SDNode intr>
392       : ILFormat<op, (outs GPRI32:$dst),
393       (ins MEMI64:$ptr, GPRI32:$src, GPRI32:$src1, i32imm:$id),
394       !strconcat(op.Text, !strconcat(idType," $ptr, $src1, $src")),
395       [(set GPRI32:$dst, (intr ADDR64:$ptr, GPRI32:$src, GPRI32:$src1, timm:$id))]>;
396
397 //===--------------------------------------------------------------------===//
398 // Intrinsic classes
399 // Generic versions of the above classes but for Target specific intrinsics
400 // instead of SDNode patterns.
401 //===--------------------------------------------------------------------===//
402 let TargetPrefix = "AMDIL", isTarget = 1 in {
403      class VoidIntLong :
404           Intrinsic<[llvm_i64_ty], [], []>;
405      class VoidIntInt :
406           Intrinsic<[llvm_i32_ty], [], []>;
407      class VoidIntBool :
408           Intrinsic<[llvm_i32_ty], [], []>;
409      class UnaryIntInt :
410           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], []>;
411      class UnaryIntFloat :
412           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], []>;
413      class ConvertIntFTOI :
414           Intrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], []>;
415      class ConvertIntITOF :
416           Intrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty], []>;
417      class UnaryIntNoRetInt :
418           Intrinsic<[], [llvm_anyint_ty], []>;
419      class UnaryIntNoRetFloat :
420           Intrinsic<[], [llvm_anyfloat_ty], []>;
421      class BinaryIntInt :
422           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>], []>;
423      class BinaryIntFloat :
424           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>], []>;
425      class BinaryIntNoRetInt :
426           Intrinsic<[], [llvm_anyint_ty, LLVMMatchType<0>], []>;
427      class BinaryIntNoRetFloat :
428           Intrinsic<[], [llvm_anyfloat_ty, LLVMMatchType<0>], []>;
429      class TernaryIntInt :
430           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
431           LLVMMatchType<0>, LLVMMatchType<0>], []>;
432      class TernaryIntFloat :
433           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>,
434           LLVMMatchType<0>, LLVMMatchType<0>], []>;
435      class QuaternaryIntInt :
436           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
437           LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], []>;
438      class UnaryAtomicInt :
439           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
440      class BinaryAtomicInt :
441           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
442      class TernaryAtomicInt :
443           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
444      class UnaryAtomicIntNoRet :
445           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
446      class BinaryAtomicIntNoRet :
447           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
448      class TernaryAtomicIntNoRet :
449           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
450 }