Gallivm: port to llvm 2.4.
[mesa.git] / src / gallium / auxiliary / gallivm / instructions.h
1 /**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /*
29 * Authors:
30 * Zack Rusin zack@tungstengraphics.com
31 */
32
33 #ifndef INSTRUCTIONS_H
34 #define INSTRUCTIONS_H
35
36 #include <llvm/BasicBlock.h>
37 #include <llvm/Module.h>
38 #include <llvm/Value.h>
39 #include <llvm/Support/IRBuilder.h>
40
41 #include <map>
42 #include <stack>
43
44 namespace llvm {
45 class VectorType;
46 class Function;
47 }
48
49 class Storage;
50
51 class Instructions
52 {
53 public:
54 Instructions(llvm::Module *mod, llvm::Function *func, llvm::BasicBlock *block,
55 Storage *storage);
56
57 llvm::BasicBlock *currentBlock() const;
58
59 llvm::Value *abs(llvm::Value *in1);
60 llvm::Value *add(llvm::Value *in1, llvm::Value *in2);
61 llvm::Value *arl(llvm::Value *in1);
62 void beginLoop();
63 void bgnSub(unsigned);
64 void brk();
65 void cal(int label, llvm::Value *input);
66 llvm::Value *ceil(llvm::Value *in);
67 llvm::Value *clamp(llvm::Value *in);
68 llvm::Value *cmp(llvm::Value *in1, llvm::Value *in2, llvm::Value *in3);
69 llvm::Value *cnd(llvm::Value *in1, llvm::Value *in2, llvm::Value *in3);
70 llvm::Value *cnd0(llvm::Value *in1, llvm::Value *in2, llvm::Value *in3);
71 llvm::Value *cos(llvm::Value *in);
72 llvm::Value *cross(llvm::Value *in1, llvm::Value *in2);
73 llvm::Value *ddx(llvm::Value *in);
74 llvm::Value *ddy(llvm::Value *in);
75 llvm::Value *div(llvm::Value *in1, llvm::Value *in2);
76 llvm::Value *dot2add(llvm::Value *in, llvm::Value *in2, llvm::Value *in3);
77 llvm::Value *dp2(llvm::Value *in1, llvm::Value *in2);
78 llvm::Value *dp3(llvm::Value *in1, llvm::Value *in2);
79 llvm::Value *dp4(llvm::Value *in1, llvm::Value *in2);
80 llvm::Value *dph(llvm::Value *in1, llvm::Value *in2);
81 llvm::Value *dst(llvm::Value *in1, llvm::Value *in2);
82 void elseop();
83 void endif();
84 void endLoop();
85 void end();
86 void endSub();
87 llvm::Value *exp(llvm::Value *in);
88 llvm::Value *ex2(llvm::Value *in);
89 llvm::Value *floor(llvm::Value *in);
90 llvm::Value *frc(llvm::Value *in);
91 void ifop(llvm::Value *in);
92 llvm::Value *kil(llvm::Value *in);
93 llvm::Value *lerp(llvm::Value *in1, llvm::Value *in2,
94 llvm::Value *in3);
95 llvm::Value *lg2(llvm::Value *in);
96 llvm::Value *lit(llvm::Value *in);
97 llvm::Value *log(llvm::Value *in);
98 llvm::Value *madd(llvm::Value *in1, llvm::Value *in2,
99 llvm::Value *in3);
100 llvm::Value *max(llvm::Value *in1, llvm::Value *in2);
101 llvm::Value *min(llvm::Value *in1, llvm::Value *in2);
102 llvm::Value *mul(llvm::Value *in1, llvm::Value *in2);
103 llvm::Value *neg(llvm::Value *in);
104 llvm::Value *nrm(llvm::Value *in);
105 llvm::Value *pow(llvm::Value *in1, llvm::Value *in2);
106 llvm::Value *rcp(llvm::Value *in);
107 llvm::Value *rsq(llvm::Value *in);
108 llvm::Value *scs(llvm::Value *in);
109 llvm::Value *seq(llvm::Value *in1, llvm::Value *in2);
110 llvm::Value *sfl(llvm::Value *in1, llvm::Value *in2);
111 llvm::Value *sge(llvm::Value *in1, llvm::Value *in2);
112 llvm::Value *sgt(llvm::Value *in1, llvm::Value *in2);
113 llvm::Value *sin(llvm::Value *in);
114 llvm::Value *sle(llvm::Value *in1, llvm::Value *in2);
115 llvm::Value *slt(llvm::Value *in1, llvm::Value *in2);
116 llvm::Value *sne(llvm::Value *in1, llvm::Value *in2);
117 llvm::Value *str(llvm::Value *in1, llvm::Value *in2);
118 llvm::Value *sub(llvm::Value *in1, llvm::Value *in2);
119 llvm::Value *trunc(llvm::Value *in);
120 llvm::Value *x2d(llvm::Value *in1, llvm::Value *in2, llvm::Value *in3);
121
122 void printVector(llvm::Value *val);
123 private:
124 const char *name(const char *prefix);
125
126 llvm::Value *callCeil(llvm::Value *val);
127 llvm::Value *callFAbs(llvm::Value *val);
128 llvm::Value *callFExp(llvm::Value *val);
129 llvm::Value *callFLog(llvm::Value *val);
130 llvm::Value *callFloor(llvm::Value *val);
131 llvm::Value *callFSqrt(llvm::Value *val);
132 llvm::Value *callPow(llvm::Value *val1, llvm::Value *val2);
133
134 llvm::Value *vectorFromVals(llvm::Value *x, llvm::Value *y,
135 llvm::Value *z, llvm::Value *w=0);
136
137 llvm::Value *constVector(float x, float y, float z, float w);
138
139 llvm::Function *declarePrintf();
140 llvm::Function *declareFunc(int label);
141
142 llvm::Function *findFunction(int label);
143
144 std::vector<llvm::Value*> extractVector(llvm::Value *vec);
145 private:
146 llvm::Module *m_mod;
147 llvm::Function *m_func;
148 char m_name[32];
149 llvm::IRBuilder<> m_builder;
150 int m_idx;
151
152 llvm::VectorType *m_floatVecType;
153
154 llvm::Function *m_llvmCeil;
155 llvm::Function *m_llvmFSqrt;
156 llvm::Function *m_llvmFAbs;
157 llvm::Function *m_llvmPow;
158 llvm::Function *m_llvmFloor;
159 llvm::Function *m_llvmFlog;
160 llvm::Function *m_llvmFexp;
161 llvm::Function *m_llvmLit;
162
163 llvm::Constant *m_fmtPtr;
164
165 std::stack<llvm::BasicBlock*> m_ifStack;
166 struct Loop {
167 llvm::BasicBlock *begin;
168 llvm::BasicBlock *end;
169 };
170 std::stack<Loop> m_loopStack;
171 std::map<int, llvm::Function*> m_functions;
172 Storage *m_storage;
173 };
174
175 #endif