blob: c91ae177c58abd0f9a9a3ffca6b720426e17df85 [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef sw_Nucleus_hpp
16#define sw_Nucleus_hpp
17
Nicolas Capens3bbc5e12016-09-27 10:49:52 -040018#include <cstdarg>
19#include <cstdint>
Nicolas Capens0bac2852016-05-07 06:09:58 -040020#include <vector>
Nicolas Capens0bac2852016-05-07 06:09:58 -040021
Nicolas Capens0bac2852016-05-07 06:09:58 -040022namespace sw
23{
Nicolas Capensac230122016-09-20 14:30:06 -040024 class Type;
Nicolas Capens19336542016-09-26 10:32:29 -040025 class Value;
Nicolas Capensc8b67a42016-09-25 15:02:52 -040026 class BasicBlock;
Nicolas Capensdaa5d912016-09-28 16:56:36 -040027 class Routine;
Nicolas Capensac230122016-09-20 14:30:06 -040028
Nicolas Capens0bac2852016-05-07 06:09:58 -040029 enum Optimization
30 {
31 Disabled = 0,
32 InstructionCombining = 1,
33 CFGSimplification = 2,
34 LICM = 3,
35 AggressiveDCE = 4,
36 GVN = 5,
37 Reassociate = 6,
38 DeadStoreElimination = 7,
39 SCCP = 8,
40 ScalarReplAggregates = 9,
41
42 OptimizationCount
43 };
44
45 extern Optimization optimization[10];
46
Nicolas Capens0bac2852016-05-07 06:09:58 -040047 class Nucleus
48 {
49 public:
50 Nucleus();
51
52 virtual ~Nucleus();
53
54 Routine *acquireRoutine(const wchar_t *name, bool runOptimizations = true);
55
Nicolas Capens19336542016-09-26 10:32:29 -040056 static Value *allocateStackVariable(Type *type, int arraySize = 0);
Nicolas Capensc8b67a42016-09-25 15:02:52 -040057 static BasicBlock *createBasicBlock();
58 static BasicBlock *getInsertBlock();
59 static void setInsertBlock(BasicBlock *basicBlock);
60 static BasicBlock *getPredecessor(BasicBlock *basicBlock);
Nicolas Capens0bac2852016-05-07 06:09:58 -040061
Nicolas Capensac230122016-09-20 14:30:06 -040062 static void createFunction(Type *ReturnType, std::vector<Type*> &Params);
Nicolas Capens19336542016-09-26 10:32:29 -040063 static Value *getArgument(unsigned int index);
Nicolas Capens0bac2852016-05-07 06:09:58 -040064
65 // Terminators
Nicolas Capens3d7c35f2016-09-28 10:36:57 -040066 static void createRetVoid();
67 static void createRet(Value *V);
68 static void createBr(BasicBlock *dest);
69 static void createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse);
Nicolas Capens0bac2852016-05-07 06:09:58 -040070
71 // Binary operators
Nicolas Capens19336542016-09-26 10:32:29 -040072 static Value *createAdd(Value *lhs, Value *rhs);
73 static Value *createSub(Value *lhs, Value *rhs);
74 static Value *createMul(Value *lhs, Value *rhs);
75 static Value *createUDiv(Value *lhs, Value *rhs);
76 static Value *createSDiv(Value *lhs, Value *rhs);
77 static Value *createFAdd(Value *lhs, Value *rhs);
78 static Value *createFSub(Value *lhs, Value *rhs);
79 static Value *createFMul(Value *lhs, Value *rhs);
80 static Value *createFDiv(Value *lhs, Value *rhs);
81 static Value *createURem(Value *lhs, Value *rhs);
82 static Value *createSRem(Value *lhs, Value *rhs);
83 static Value *createFRem(Value *lhs, Value *rhs);
84 static Value *createShl(Value *lhs, Value *rhs);
85 static Value *createLShr(Value *lhs, Value *rhs);
86 static Value *createAShr(Value *lhs, Value *rhs);
87 static Value *createAnd(Value *lhs, Value *rhs);
88 static Value *createOr(Value *lhs, Value *rhs);
89 static Value *createXor(Value *lhs, Value *rhs);
Nicolas Capensb955d5b2016-09-28 22:36:28 -040090
91 // Unary operators
Nicolas Capens19336542016-09-26 10:32:29 -040092 static Value *createNeg(Value *V);
93 static Value *createFNeg(Value *V);
94 static Value *createNot(Value *V);
Nicolas Capens0bac2852016-05-07 06:09:58 -040095
96 // Memory instructions
Nicolas Capense12780d2016-09-27 14:18:07 -040097 static Value *createLoad(Value *ptr, Type *type, bool isVolatile = false, unsigned int align = 0);
Nicolas Capens6d738712016-09-30 04:15:22 -040098 static Value *createStore(Value *value, Value *ptr, Type *type, bool isVolatile = false, unsigned int align = 0);
Nicolas Capens6d738712016-09-30 04:15:22 -040099 static Value *createGEP(Value *ptr, Type *type, Value *index);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400100
101 // Atomic instructions
Nicolas Capens19336542016-09-26 10:32:29 -0400102 static Value *createAtomicAdd(Value *ptr, Value *value);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400103
104 // Cast/Conversion Operators
Nicolas Capens19336542016-09-26 10:32:29 -0400105 static Value *createTrunc(Value *V, Type *destType);
106 static Value *createZExt(Value *V, Type *destType);
107 static Value *createSExt(Value *V, Type *destType);
108 static Value *createFPToSI(Value *V, Type *destType);
109 static Value *createUIToFP(Value *V, Type *destType);
110 static Value *createSIToFP(Value *V, Type *destType);
111 static Value *createFPTrunc(Value *V, Type *destType);
112 static Value *createFPExt(Value *V, Type *destType);
Nicolas Capens19336542016-09-26 10:32:29 -0400113 static Value *createBitCast(Value *V, Type *destType);
114 static Value *createIntCast(Value *V, Type *destType, bool isSigned);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400115
116 // Compare instructions
Nicolas Capens19336542016-09-26 10:32:29 -0400117 static Value *createICmpEQ(Value *lhs, Value *rhs);
118 static Value *createICmpNE(Value *lhs, Value *rhs);
119 static Value *createICmpUGT(Value *lhs, Value *rhs);
120 static Value *createICmpUGE(Value *lhs, Value *rhs);
121 static Value *createICmpULT(Value *lhs, Value *rhs);
122 static Value *createICmpULE(Value *lhs, Value *rhs);
123 static Value *createICmpSGT(Value *lhs, Value *rhs);
124 static Value *createICmpSGE(Value *lhs, Value *rhs);
125 static Value *createICmpSLT(Value *lhs, Value *rhs);
126 static Value *createICmpSLE(Value *lhs, Value *rhs);
127 static Value *createFCmpOEQ(Value *lhs, Value *rhs);
128 static Value *createFCmpOGT(Value *lhs, Value *rhs);
129 static Value *createFCmpOGE(Value *lhs, Value *rhs);
130 static Value *createFCmpOLT(Value *lhs, Value *rhs);
131 static Value *createFCmpOLE(Value *lhs, Value *rhs);
132 static Value *createFCmpONE(Value *lhs, Value *rhs);
133 static Value *createFCmpORD(Value *lhs, Value *rhs);
134 static Value *createFCmpUNO(Value *lhs, Value *rhs);
135 static Value *createFCmpUEQ(Value *lhs, Value *rhs);
136 static Value *createFCmpUGT(Value *lhs, Value *rhs);
137 static Value *createFCmpUGE(Value *lhs, Value *rhs);
138 static Value *createFCmpULT(Value *lhs, Value *rhs);
139 static Value *createFCmpULE(Value *lhs, Value *rhs);
140 static Value *createFCmpUNE(Value *lhs, Value *rhs);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400141
Nicolas Capens0bac2852016-05-07 06:09:58 -0400142 // Vector instructions
Nicolas Capense95d5342016-09-30 11:37:28 -0400143 static Value *createExtractElement(Value *vector, Type *type, int index);
Nicolas Capens19336542016-09-26 10:32:29 -0400144 static Value *createInsertElement(Value *vector, Value *element, int index);
Nicolas Capense89cd582016-09-30 14:23:47 -0400145 static Value *createShuffleVector(Value *V1, Value *V2, const int *select);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400146
147 // Other instructions
Nicolas Capens19336542016-09-26 10:32:29 -0400148 static Value *createSelect(Value *C, Value *ifTrue, Value *ifFalse);
149 static Value *createSwitch(Value *V, BasicBlock *Dest, unsigned NumCases);
150 static void addSwitchCase(Value *Switch, int Case, BasicBlock *Branch);
Nicolas Capens3d7c35f2016-09-28 10:36:57 -0400151 static void createUnreachable();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400152
Nicolas Capens0bac2852016-05-07 06:09:58 -0400153 // Constant values
Nicolas Capens13ac2322016-10-13 14:52:12 -0400154 static Value *createNullValue(Type *type);
155 static Value *createConstantLong(int64_t i);
156 static Value *createConstantInt(int i);
157 static Value *createConstantInt(unsigned int i);
158 static Value *createConstantBool(bool b);
159 static Value *createConstantByte(signed char i);
160 static Value *createConstantByte(unsigned char i);
161 static Value *createConstantShort(short i);
162 static Value *createConstantShort(unsigned short i);
163 static Value *createConstantFloat(float x);
164 static Value *createNullPointer(Type *type);
165 static Value *createConstantVector(const int64_t *constants, Type *type);
166 static Value *createConstantVector(const double *constants, Type *type);
Nicolas Capens73dd7a22016-10-20 13:20:34 -0400167 static Value *createConstantPointer(const void *external, Type *type, unsigned int align = 0);
Nicolas Capens0e33ae32016-09-23 17:37:27 -0400168
Nicolas Capens13ac2322016-10-13 14:52:12 -0400169 static Type *getPointerType(Type *elementType);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400170
171 private:
172 void optimize();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400173 };
Nicolas Capens0bac2852016-05-07 06:09:58 -0400174}
175
176#endif // sw_Nucleus_hpp