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
*arl(llvm::Value
*in1
);
61 llvm::Value
*add(llvm::Value
*in1
, llvm::Value
*in2
);
63 void bgnSub(unsigned);
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
);
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
,
85 llvm::Value
*lit(llvm::Value
*in
);
86 llvm::Value
*lg2(llvm::Value
*in
);
87 llvm::Value
*madd(llvm::Value
*in1
, 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
);
103 void printVector(llvm::Value
*val
);
105 const char *name(const char *prefix
);
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
);
113 llvm::Value
*vectorFromVals(llvm::Value
*x
, llvm::Value
*y
,
114 llvm::Value
*z
, llvm::Value
*w
=0);
116 llvm::Value
*constVector(float x
, float y
, float z
, float w
);
118 llvm::Function
*declarePrintf();
119 llvm::Function
*declareFunc(int label
);
121 llvm::Function
*findFunction(int label
);
123 std::vector
<llvm::Value
*> extractVector(llvm::Value
*vec
);
126 llvm::Function
*m_func
;
128 llvm::IRBuilder m_builder
;
131 llvm::VectorType
*m_floatVecType
;
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
;
140 llvm::Constant
*m_fmtPtr
;
142 std::stack
<llvm::BasicBlock
*> m_ifStack
;
144 llvm::BasicBlock
*begin
;
145 llvm::BasicBlock
*end
;
147 std::stack
<Loop
> m_loopStack
;
148 std::map
<int, llvm::Function
*> m_functions
;