Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 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 | #ifndef INSTRUCTIONSSOA_H |
| 29 | #define INSTRUCTIONSSOA_H |
| 30 | |
Zack Rusin | cac037d | 2008-03-12 22:51:57 -0400 | [diff] [blame] | 31 | #include <pipe/p_shader_tokens.h> |
Zack Rusin | fb1c093 | 2008-04-21 15:15:31 -0400 | [diff] [blame] | 32 | #include <llvm/Support/IRBuilder.h> |
Zack Rusin | 53c2963 | 2008-02-13 00:36:31 -0500 | [diff] [blame] | 33 | |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 34 | #include <map> |
Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 35 | #include <vector> |
| 36 | |
| 37 | namespace llvm { |
| 38 | class Module; |
| 39 | class Function; |
| 40 | class BasicBlock; |
| 41 | class Value; |
| 42 | } |
| 43 | class StorageSoa; |
| 44 | |
| 45 | class InstructionsSoa |
| 46 | { |
| 47 | public: |
| 48 | InstructionsSoa(llvm::Module *mod, llvm::Function *func, |
| 49 | llvm::BasicBlock *block, StorageSoa *storage); |
| 50 | |
Zack Rusin | 59766ac | 2008-05-15 17:46:20 -0400 | [diff] [blame] | 51 | std::vector<llvm::Value*> abs(const std::vector<llvm::Value*> in1); |
Zack Rusin | f70cc89 | 2008-02-14 22:42:57 -0500 | [diff] [blame] | 52 | std::vector<llvm::Value*> arl(const std::vector<llvm::Value*> in); |
Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 53 | std::vector<llvm::Value*> add(const std::vector<llvm::Value*> in1, |
| 54 | const std::vector<llvm::Value*> in2); |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 55 | std::vector<llvm::Value*> dp3(const std::vector<llvm::Value*> in1, |
| 56 | const std::vector<llvm::Value*> in2); |
Zack Rusin | a9c40f8 | 2008-03-01 09:50:41 -0500 | [diff] [blame] | 57 | std::vector<llvm::Value*> dp4(const std::vector<llvm::Value*> in1, |
| 58 | const std::vector<llvm::Value*> in2); |
Zack Rusin | 1d1cf8e | 2008-05-16 16:06:59 -0400 | [diff] [blame] | 59 | std::vector<llvm::Value*> lit(const std::vector<llvm::Value*> in); |
Zack Rusin | f70cc89 | 2008-02-14 22:42:57 -0500 | [diff] [blame] | 60 | std::vector<llvm::Value*> madd(const std::vector<llvm::Value*> in1, |
| 61 | const std::vector<llvm::Value*> in2, |
| 62 | const std::vector<llvm::Value*> in3); |
Zack Rusin | ea1a607 | 2008-05-16 14:54:40 -0400 | [diff] [blame] | 63 | std::vector<llvm::Value*> max(const std::vector<llvm::Value*> in1, |
| 64 | const std::vector<llvm::Value*> in2); |
| 65 | std::vector<llvm::Value*> min(const std::vector<llvm::Value*> in1, |
| 66 | const std::vector<llvm::Value*> in2); |
Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 67 | std::vector<llvm::Value*> mul(const std::vector<llvm::Value*> in1, |
| 68 | const std::vector<llvm::Value*> in2); |
Zack Rusin | cac037d | 2008-03-12 22:51:57 -0400 | [diff] [blame] | 69 | std::vector<llvm::Value*> pow(const std::vector<llvm::Value*> in1, |
| 70 | const std::vector<llvm::Value*> in2); |
Zack Rusin | 02e45b2 | 2008-05-16 17:10:52 -0400 | [diff] [blame] | 71 | std::vector<llvm::Value*> rsq(const std::vector<llvm::Value*> in1); |
Stephane Marchesin | 8bdb4d2 | 2008-10-01 00:00:58 +0200 | [diff] [blame] | 72 | std::vector<llvm::Value*> slt(const std::vector<llvm::Value*> in1, |
| 73 | const std::vector<llvm::Value*> in2); |
Zack Rusin | 59766ac | 2008-05-15 17:46:20 -0400 | [diff] [blame] | 74 | std::vector<llvm::Value*> sub(const std::vector<llvm::Value*> in1, |
| 75 | const std::vector<llvm::Value*> in2); |
Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 76 | void end(); |
Zack Rusin | 135d232 | 2008-02-13 03:18:37 -0500 | [diff] [blame] | 77 | |
Zack Rusin | cf51d5c | 2008-02-14 23:50:39 -0500 | [diff] [blame] | 78 | std::vector<llvm::Value*> extractVector(llvm::Value *vector); |
Stephane Marchesin | 94ba48b | 2008-10-07 21:11:01 +0200 | [diff] [blame] | 79 | llvm::IRBuilder<>* getIRBuilder(); |
Zack Rusin | 135d232 | 2008-02-13 03:18:37 -0500 | [diff] [blame] | 80 | private: |
| 81 | const char * name(const char *prefix) const; |
Zack Rusin | f70cc89 | 2008-02-14 22:42:57 -0500 | [diff] [blame] | 82 | llvm::Value *vectorFromVals(llvm::Value *x, llvm::Value *y, |
| 83 | llvm::Value *z, llvm::Value *w); |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 84 | void createFunctionMap(); |
| 85 | void createBuiltins(); |
Zack Rusin | cac037d | 2008-03-12 22:51:57 -0400 | [diff] [blame] | 86 | void createDependencies(); |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 87 | llvm::Function *function(int); |
| 88 | llvm::Module *currentModule() const; |
| 89 | llvm::Value *allocaTemp(); |
Zack Rusin | a9c40f8 | 2008-03-01 09:50:41 -0500 | [diff] [blame] | 90 | std::vector<llvm::Value*> allocaToResult(llvm::Value *allocaPtr); |
| 91 | std::vector<llvm::Value*> callBuiltin(llvm::Function *func, |
| 92 | const std::vector<llvm::Value*> in1); |
| 93 | std::vector<llvm::Value*> callBuiltin(llvm::Function *func, |
| 94 | const std::vector<llvm::Value*> in1, |
| 95 | const std::vector<llvm::Value*> in2); |
| 96 | std::vector<llvm::Value*> callBuiltin(llvm::Function *func, |
| 97 | const std::vector<llvm::Value*> in1, |
| 98 | const std::vector<llvm::Value*> in2, |
| 99 | const std::vector<llvm::Value*> in3); |
Zack Rusin | cac037d | 2008-03-12 22:51:57 -0400 | [diff] [blame] | 100 | void injectFunction(llvm::Function *originalFunc, int op = TGSI_OPCODE_LAST); |
Zack Rusin | 53c2963 | 2008-02-13 00:36:31 -0500 | [diff] [blame] | 101 | private: |
Stephane Marchesin | 3f4b67f | 2008-09-30 20:50:49 +0200 | [diff] [blame] | 102 | llvm::IRBuilder<> m_builder; |
Zack Rusin | f70cc89 | 2008-02-14 22:42:57 -0500 | [diff] [blame] | 103 | StorageSoa *m_storage; |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 104 | |
| 105 | std::map<int, std::string> m_functionsMap; |
| 106 | std::map<int, llvm::Function*> m_functions; |
| 107 | llvm::Module *m_builtins; |
Zack Rusin | cac037d | 2008-03-12 22:51:57 -0400 | [diff] [blame] | 108 | std::map<std::string, std::vector<std::string> > m_builtinDependencies; |
Zack Rusin | e884c7e | 2008-03-01 08:04:21 -0500 | [diff] [blame] | 109 | |
Zack Rusin | 135d232 | 2008-02-13 03:18:37 -0500 | [diff] [blame] | 110 | private: |
| 111 | mutable int m_idx; |
| 112 | mutable char m_name[32]; |
Zack Rusin | e761161 | 2008-02-11 09:43:59 -0500 | [diff] [blame] | 113 | }; |
| 114 | |
| 115 | |
| 116 | #endif |