1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard//===-- AMDGPUInstructions.td - Common instruction defs ---*- tablegen -*-===//
2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//                     The LLVM Compiler Infrastructure
4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source
6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details.
7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
10fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard// This file contains instruction defs that are common to all hw codegen
11fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard// targets.
12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===//
14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass AMDGPUInst <dag outs, dag ins, string asm, list<dag> pattern> : Instruction {
16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  field bits<16> AMDILOp = 0;
17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  field bits<3> Gen = 0;
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1976b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard  let Namespace = "AMDGPU";
20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let OutOperandList = outs;
21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let InOperandList = ins;
22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let AsmString = asm;
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let Pattern = pattern;
24cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard  let Itinerary = NullALU;
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let TSFlags{42-40} = Gen;
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let TSFlags{63-48} = AMDILOp;
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass AMDGPUShaderInst <dag outs, dag ins, string asm, list<dag> pattern>
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    : AMDGPUInst<outs, ins, asm, pattern> {
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  field bits<32> Inst = 0xffffffff;
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
36ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_EQ : PatLeaf <
37ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
38ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
39ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETOEQ: case ISD::SETUEQ:
40ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETEQ: return true;}}}]
41ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
42ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard
43ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_NE : PatLeaf <
44ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
45ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
46ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETONE: case ISD::SETUNE:
47ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETNE: return true;}}}]
48ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
49ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_GT : PatLeaf <
50ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
51ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
52ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETOGT: case ISD::SETUGT:
53ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETGT: return true;}}}]
54ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
55ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard
56ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_GE : PatLeaf <
57ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
58ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
59ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETOGE: case ISD::SETUGE:
60ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETGE: return true;}}}]
61ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
62ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard
63ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_LT : PatLeaf <
64ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
65ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
66ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETOLT: case ISD::SETULT:
67ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETLT: return true;}}}]
68ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
69ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard
70ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_LE : PatLeaf <
71ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  (cond),
72ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard  [{switch(N->get()){{default: return false;
73ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETOLE: case ISD::SETULE:
74ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard                     case ISD::SETLE: return true;}}}]
75ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>;
76ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard
77d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardclass Constants {
78d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint TWO_PI = 0x40c90fdb;
79d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint PI = 0x40490fdb;
80d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint TWO_PI_INV = 0x3e22f983;
81d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellard}
82d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellarddef CONST : Constants;
83d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellard
84d784bc77405012b442ae9d68f200e9d115030b3cTom Stellarddef FP_ZERO : PatLeaf <
85d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  (fpimm),
86d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  [{return N->getValueAPF().isZero();}]
87d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>;
88d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard
89d784bc77405012b442ae9d68f200e9d115030b3cTom Stellarddef FP_ONE : PatLeaf <
90d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  (fpimm),
91d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  [{return N->isExactlyValue(1.0);}]
92d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>;
93d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard
94704eac09166aa6dc4c1aa82f8d0938c4060e51f4Tom Stellardlet isCodeGenOnly = 1, isPseudo = 1, usesCustomInserter = 1  in {
9517f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard
96d784bc77405012b442ae9d68f200e9d115030b3cTom Stellardclass CLAMP <RegisterClass rc> : AMDGPUShaderInst <
97d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  (outs rc:$dst),
98d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  (ins rc:$src0),
99d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  "CLAMP $dst, $src0",
100d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard  [(set rc:$dst, (int_AMDIL_clamp rc:$src0, (f32 FP_ZERO), (f32 FP_ONE)))]
101d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>;
102d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard
10317f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellardclass FABS <RegisterClass rc> : AMDGPUShaderInst <
10417f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard  (outs rc:$dst),
10517f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard  (ins rc:$src0),
10617f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard  "FABS $dst, $src0",
10717f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard  [(set rc:$dst, (fabs rc:$src0))]
10817f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard>;
10917f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard
110667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellardclass FNEG <RegisterClass rc> : AMDGPUShaderInst <
111667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard  (outs rc:$dst),
112667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard  (ins rc:$src0),
113667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard  "FNEG $dst, $src0",
114667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard  [(set rc:$dst, (fneg rc:$src0))]
115667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard>;
116667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard
117704eac09166aa6dc4c1aa82f8d0938c4060e51f4Tom Stellard} // End isCodeGenOnly = 1, isPseudo = 1, hasCustomInserter = 1
118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/* Generic helper patterns for intrinsics */
120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/* -------------------------------------- */
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst mul,
123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                  RegisterClass rc> : Pat <
124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  (int_AMDGPU_pow rc:$src0, rc:$src1),
125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  (exp_ieee (mul rc:$src1, (log_ieee rc:$src0)))
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard>;
127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
128519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Other helper patterns */
129519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* --------------------- */
130519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard
131519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Extract element pattern */
132519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellardclass Extract_Element <ValueType sub_type, ValueType vec_type,
133519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard                     RegisterClass vec_class, int sub_idx, 
134519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard                     SubRegIndex sub_reg>: Pat<
135519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard  (sub_type (vector_extract (vec_type vec_class:$src), sub_idx)),
136519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard  (EXTRACT_SUBREG vec_class:$src, sub_reg)
137519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard>;
138519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard
139519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Insert element pattern */
140519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellardclass Insert_Element <ValueType elem_type, ValueType vec_type,
141519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard                      RegisterClass elem_class, RegisterClass vec_class,
142519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard                      int sub_idx, SubRegIndex sub_reg> : Pat <
143519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard
144519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard  (vec_type (vector_insert (vec_type vec_class:$vec),
145519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard                           (elem_type elem_class:$elem), sub_idx)),
146519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard  (INSERT_SUBREG vec_class:$vec, elem_class:$elem, sub_reg)
147519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard>;
148519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard
149de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard// Vector Build pattern
150de7366701d21842787d65320c12e6b4ecaea3807Tom Stellardclass Vector_Build <ValueType vecType, RegisterClass elemClass> : Pat <
151de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard  (IL_vbuild elemClass:$src),
152de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard  (INSERT_SUBREG (vecType (IMPLICIT_DEF)), elemClass:$src, sel_x)
153de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard>;
154de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard
1554863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard// bitconvert pattern
1564863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellardclass BitConvert <ValueType dt, ValueType st, RegisterClass rc> : Pat <
1574863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard  (dt (bitconvert (st rc:$src0))),
1584863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard  (dt rc:$src0)
1594863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard>;
1604863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard
161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardinclude "R600Instructions.td"
162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardinclude "SIInstrInfo.td"
164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
165