blob: 8574f7554e3ac0f16e99f6283dddeef5c59600c9 [file] [log] [blame]
Zack Rusin02cf3172007-10-24 12:48:06 -04001/**************************************************************************
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
Zack Rusinb0f80692007-10-17 11:28:26 -040033#ifndef STORAGE_H
34#define STORAGE_H
35
36#include <map>
Zack Rusin1d17cb72007-10-25 09:03:53 -040037#include <set>
Zack Rusin67e4b822007-10-26 14:52:10 -040038#include <stack>
Zack Rusinb0f80692007-10-17 11:28:26 -040039#include <vector>
40
41namespace llvm {
42 class BasicBlock;
43 class Constant;
44 class ConstantInt;
45 class LoadInst;
46 class Value;
47 class VectorType;
48}
49
50class Storage
51{
Zack Rusinb0f80692007-10-17 11:28:26 -040052public:
53 Storage(llvm::BasicBlock *block,
Zack Rusin8681ded2007-11-05 13:41:56 -050054 llvm::Value *input);
Zack Rusinb0f80692007-10-17 11:28:26 -040055
Zack Rusin67e4b822007-10-26 14:52:10 -040056 llvm::Value *inputPtr() const;
Zack Rusin67e4b822007-10-26 14:52:10 -040057
Zack Rusin5040eef2007-10-24 07:49:24 -040058 void setCurrentBlock(llvm::BasicBlock *block);
59
Zack Rusinb0f80692007-10-17 11:28:26 -040060 llvm::ConstantInt *constantInt(int);
61 llvm::Constant *shuffleMask(int vec);
Zack Rusin5040eef2007-10-24 07:49:24 -040062 llvm::Value *inputElement(int idx, llvm::Value *indIdx =0);
63 llvm::Value *constElement(int idx, llvm::Value *indIdx =0);
Zack Rusin5022ee42007-10-24 19:26:09 -040064 llvm::Value *outputElement(int idx, llvm::Value *indIdx =0);
Zack Rusinfd908ce2007-10-29 11:42:22 -040065 llvm::Value *tempElement(int idx, llvm::Value *indIdx =0);
Zack Rusinb0f3b592007-10-29 10:59:24 -040066 llvm::Value *immediateElement(int idx);
Zack Rusinb0f80692007-10-17 11:28:26 -040067
Zack Rusinfd908ce2007-10-29 11:42:22 -040068 void setOutputElement(int dstIdx, llvm::Value *val, int mask);
Zack Rusind4d8d7c2007-10-20 16:55:23 -040069 void setTempElement(int idx, llvm::Value *val, int mask);
Zack Rusinb0f80692007-10-17 11:28:26 -040070
Zack Rusin5040eef2007-10-24 07:49:24 -040071 llvm::Value *addrElement(int idx) const;
72 void setAddrElement(int idx, llvm::Value *val, int mask);
73
Zack Rusin1f30efb2007-11-06 06:06:04 -050074 void setKilElement(llvm::Value *val);
75
Zack Rusinb0f80692007-10-17 11:28:26 -040076 llvm::Value *shuffleVector(llvm::Value *vec, int shuffle);
77
Zack Rusin5040eef2007-10-24 07:49:24 -040078 llvm::Value *extractIndex(llvm::Value *vec);
Zack Rusinb0f80692007-10-17 11:28:26 -040079
Zack Rusind4d8d7c2007-10-20 16:55:23 -040080 int numConsts() const;
Zack Rusin1d26e9c2007-10-25 07:52:59 -040081
Zack Rusin8681ded2007-11-05 13:41:56 -050082 void pushArguments(llvm::Value *input);
Zack Rusin67e4b822007-10-26 14:52:10 -040083 void popArguments();
Zack Rusin789d2482007-10-26 19:12:02 -040084 void pushTemps();
85 void popTemps();
Zack Rusin67e4b822007-10-26 14:52:10 -040086
Zack Rusinb0f3b592007-10-29 10:59:24 -040087 void addImmediate(float *val);
88
Zack Rusind4d8d7c2007-10-20 16:55:23 -040089private:
90 llvm::Value *maskWrite(llvm::Value *src, int mask, llvm::Value *templ);
91 const char *name(const char *prefix);
Zack Rusin1d26e9c2007-10-25 07:52:59 -040092
Zack Rusin8681ded2007-11-05 13:41:56 -050093 enum Args {
94 DestsArg = 0,
95 InputsArg = 1,
96 TempsArg = 2,
97 ConstsArg = 3,
98 KilArg = 4
99 };
100 llvm::Value *elemPtr(Args arg);
101 llvm::Value *elemIdx(llvm::Value *ptr, int idx,
102 llvm::Value *indIdx = 0);
103 llvm::Value *element(Args arg, int idx, llvm::Value *indIdx = 0);
104
Zack Rusinb0f80692007-10-17 11:28:26 -0400105private:
106 llvm::BasicBlock *m_block;
Zack Rusin8681ded2007-11-05 13:41:56 -0500107 llvm::Value *m_INPUT;
Zack Rusinb0f80692007-10-17 11:28:26 -0400108
109 std::map<int, llvm::ConstantInt*> m_constInts;
110 std::map<int, llvm::Constant*> m_intVecs;
Zack Rusin5040eef2007-10-24 07:49:24 -0400111 std::vector<llvm::Value*> m_addrs;
Zack Rusinb0f3b592007-10-29 10:59:24 -0400112 std::vector<llvm::Constant*> m_immediates;
Zack Rusinb0f80692007-10-17 11:28:26 -0400113
114 llvm::VectorType *m_floatVecType;
115 llvm::VectorType *m_intVecType;
116
Zack Rusind4d8d7c2007-10-20 16:55:23 -0400117 char m_name[32];
118 int m_idx;
119
120 int m_numConsts;
Zack Rusin1d17cb72007-10-25 09:03:53 -0400121
122 std::map<int, bool > m_destWriteMap;
Zack Rusinfd908ce2007-10-29 11:42:22 -0400123 std::map<int, bool > m_tempWriteMap;
Zack Rusin67e4b822007-10-26 14:52:10 -0400124
Zack Rusinabe8cd12007-10-26 19:53:53 -0400125 llvm::Value *m_undefFloatVec;
126 llvm::Value *m_undefIntVec;
127 llvm::Value *m_extSwizzleVec;
128
Zack Rusin8681ded2007-11-05 13:41:56 -0500129 std::stack<llvm::Value*> m_argStack;
Zack Rusin789d2482007-10-26 19:12:02 -0400130 std::stack<std::vector<llvm::Value*> > m_tempStack;
Zack Rusinb0f80692007-10-17 11:28:26 -0400131};
132
133#endif