c3b28e9746982109da992716209c9fdc4697c311
1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
30 * Zack Rusin zack@tungstengraphics.com
33 #ifndef INSTRUCTIONS_H
34 #define INSTRUCTIONS_H
36 #include <llvm/BasicBlock.h>
37 #include <llvm/Module.h>
38 #include <llvm/Value.h>
39 #include <llvm/Support/IRBuilder.h>
54 Instructions(llvm::Module
*mod
, llvm::Function
*func
, llvm::BasicBlock
*block
,
57 llvm::BasicBlock
*currentBlock() const;
59 llvm::Value
*abs(llvm::Value
*in1
);
60 llvm::Value
*add(llvm::Value
*in1
, llvm::Value
*in2
);
61 llvm::Value
*arl(llvm::Value
*in1
);
63 void bgnSub(unsigned);
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
);
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
,
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
,
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
);
122 void printVector(llvm::Value
*val
);
124 const char *name(const char *prefix
);
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
);
134 llvm::Value
*vectorFromVals(llvm::Value
*x
, llvm::Value
*y
,
135 llvm::Value
*z
, llvm::Value
*w
=0);
137 llvm::Value
*constVector(float x
, float y
, float z
, float w
);
139 llvm::Function
*declarePrintf();
140 llvm::Function
*declareFunc(int label
);
142 llvm::Function
*findFunction(int label
);
144 std::vector
<llvm::Value
*> extractVector(llvm::Value
*vec
);
147 llvm::Function
*m_func
;
149 llvm::IRBuilder m_builder
;
152 llvm::VectorType
*m_floatVecType
;
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
;
163 llvm::Constant
*m_fmtPtr
;
165 std::stack
<llvm::BasicBlock
*> m_ifStack
;
167 llvm::BasicBlock
*begin
;
168 llvm::BasicBlock
*end
;
170 std::stack
<Loop
> m_loopStack
;
171 std::map
<int, llvm::Function
*> m_functions
;