gallium: move sampler_unit field to pstip_fragment_shader since it's per-shader
[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/LLVMBuilder.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 *arl(llvm::Value *in1);
61 llvm::Value *add(llvm::Value *in1, llvm::Value *in2);
62 void beginLoop();
63 void bgnSub(unsigned);
64 void brk();
65 void cal(int label, llvm::Value *input);
66 llvm::Value *cmp(llvm::Value *in1, llvm::Value *in2, llvm::Value *in3);
67 llvm::Value *cos(llvm::Value *in);
68 llvm::Value *cross(llvm::Value *in1, llvm::Value *in2);
69 llvm::Value *dp3(llvm::Value *in1, llvm::Value *in2);
70 llvm::Value *dp4(llvm::Value *in1, llvm::Value *in2);
71 llvm::Value *dph(llvm::Value *in1, llvm::Value *in2);
72 llvm::Value *dst(llvm::Value *in1, llvm::Value *in2);
73 void elseop();
74 void endif();
75 void endLoop();
76 void end();
77 void endSub();
78 llvm::Value *ex2(llvm::Value *in);
79 llvm::Value *floor(llvm::Value *in);
80 llvm::Value *frc(llvm::Value *in);
81 void ifop(llvm::Value *in);
82 llvm::Value *kilp(llvm::Value *in);
83 llvm::Value *lerp(llvm::Value *in1, llvm::Value *in2,
84 llvm::Value *in3);
85 llvm::Value *lit(llvm::Value *in);
86 llvm::Value *lg2(llvm::Value *in);
87 llvm::Value *madd(llvm::Value *in1, llvm::Value *in2,
88 llvm::Value *in2);
89 llvm::Value *min(llvm::Value *in1, llvm::Value *in2);
90 llvm::Value *max(llvm::Value *in1, llvm::Value *in2);
91 llvm::Value *mul(llvm::Value *in1, llvm::Value *in2);
92 llvm::Value *pow(llvm::Value *in1, llvm::Value *in2);
93 llvm::Value *rcp(llvm::Value *in);
94 llvm::Value *rsq(llvm::Value *in);
95 llvm::Value *scs(llvm::Value *in);
96 llvm::Value *sge(llvm::Value *in1, llvm::Value *in2);
97 llvm::Value *sgt(llvm::Value *in1, llvm::Value *in2);
98 llvm::Value *sin(llvm::Value *in);
99 llvm::Value *slt(llvm::Value *in1, llvm::Value *in2);
100 llvm::Value *sub(llvm::Value *in1, llvm::Value *in2);
101 llvm::Value *trunc(llvm::Value *in);
102
103 void printVector(llvm::Value *val);
104 private:
105 const char *name(const char *prefix);
106
107 llvm::Value *callFAbs(llvm::Value *val);
108 llvm::Value *callFloor(llvm::Value *val);
109 llvm::Value *callFSqrt(llvm::Value *val);
110 llvm::Value *callFLog(llvm::Value *val);
111 llvm::Value *callPow(llvm::Value *val1, llvm::Value *val2);
112
113 llvm::Value *vectorFromVals(llvm::Value *x, llvm::Value *y,
114 llvm::Value *z, llvm::Value *w=0);
115
116 llvm::Value *constVector(float x, float y, float z, float w);
117
118 llvm::Function *declarePrintf();
119 llvm::Function *declareFunc(int label);
120
121 llvm::Function *findFunction(int label);
122
123 std::vector<llvm::Value*> extractVector(llvm::Value *vec);
124 private:
125 llvm::Module *m_mod;
126 llvm::Function *m_func;
127 char m_name[32];
128 llvm::LLVMFoldingBuilder m_builder;
129 int m_idx;
130
131 llvm::VectorType *m_floatVecType;
132
133 llvm::Function *m_llvmFSqrt;
134 llvm::Function *m_llvmFAbs;
135 llvm::Function *m_llvmPow;
136 llvm::Function *m_llvmFloor;
137 llvm::Function *m_llvmFlog;
138 llvm::Function *m_llvmLit;
139
140 llvm::Constant *m_fmtPtr;
141
142 std::stack<llvm::BasicBlock*> m_ifStack;
143 struct Loop {
144 llvm::BasicBlock *begin;
145 llvm::BasicBlock *end;
146 };
147 std::stack<Loop> m_loopStack;
148 std::map<int, llvm::Function*> m_functions;
149 Storage *m_storage;
150 };
151
152 #endif