summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/pipe/llvm/instructions.cpp28
-rw-r--r--src/mesa/pipe/llvm/instructions.h2
-rw-r--r--src/mesa/pipe/llvm/storage.cpp24
3 files changed, 22 insertions, 32 deletions
diff --git a/src/mesa/pipe/llvm/instructions.cpp b/src/mesa/pipe/llvm/instructions.cpp
index 2eac0edbc4..3c68b764aa 100644
--- a/src/mesa/pipe/llvm/instructions.cpp
+++ b/src/mesa/pipe/llvm/instructions.cpp
@@ -466,12 +466,8 @@ llvm::Value * Instructions::lg2(llvm::Value *in)
ExtractElementInst *w = new ExtractElementInst(in, unsigned(3),
name("extractw"),
m_block);
- llvm::Value *const_vec = vectorFromVals(
- ConstantFP::get(Type::FloatTy, APFloat(1.442695f)),
- ConstantFP::get(Type::FloatTy, APFloat(1.442695f)),
- ConstantFP::get(Type::FloatTy, APFloat(1.442695f)),
- ConstantFP::get(Type::FloatTy, APFloat(1.442695f))
- );
+ llvm::Value *const_vec = constVector(1.442695f, 1.442695f,
+ 1.442695f, 1.442695f);
return mul(vectorFromVals(callFLog(x), callFLog(y),
callFLog(z), callFLog(w)), const_vec);
}
@@ -1016,14 +1012,7 @@ llvm::Value * Instructions::lerp(llvm::Value *in1, llvm::Value *in2,
llvm::Value *in3)
{
llvm::Value *m = mul(in1, in2);
- llvm::Value *vec1 = vectorFromVals(ConstantFP::get(Type::FloatTy,
- APFloat(1.f)),
- ConstantFP::get(Type::FloatTy,
- APFloat(1.f)),
- ConstantFP::get(Type::FloatTy,
- APFloat(1.f)),
- ConstantFP::get(Type::FloatTy,
- APFloat(1.f)));
+ llvm::Value *vec1 = constVector(1.f, 1.f, 1.f, 1.f);
llvm::Value *s = sub(vec1, in1);
return add(m, mul(s, in3));
}
@@ -1170,4 +1159,15 @@ llvm::Function * Instructions::findFunction(int label)
return func;
}
+llvm::Value * Instructions::constVector(float x, float y, float z, float w)
+{
+ std::vector<Constant*> vec(4);
+ vec[0] = ConstantFP::get(Type::FloatTy, APFloat(x));
+ vec[1] = ConstantFP::get(Type::FloatTy, APFloat(y));
+ vec[2] = ConstantFP::get(Type::FloatTy, APFloat(z));
+ vec[3] = ConstantFP::get(Type::FloatTy, APFloat(w));
+ return ConstantVector::get(m_floatVecType, vec);
+}
+
#endif //MESA_LLVM
+
diff --git a/src/mesa/pipe/llvm/instructions.h b/src/mesa/pipe/llvm/instructions.h
index 8a1aed3181..b7b5129694 100644
--- a/src/mesa/pipe/llvm/instructions.h
+++ b/src/mesa/pipe/llvm/instructions.h
@@ -107,6 +107,8 @@ private:
llvm::Value *vectorFromVals(llvm::Value *x, llvm::Value *y,
llvm::Value *z, llvm::Value *w=0);
+ llvm::Value *constVector(float x, float y, float z, float w);
+
llvm::Function *declarePrintf();
llvm::Function *declareFunc(int label);
diff --git a/src/mesa/pipe/llvm/storage.cpp b/src/mesa/pipe/llvm/storage.cpp
index 6ed243d9f3..1715bd4de4 100644
--- a/src/mesa/pipe/llvm/storage.cpp
+++ b/src/mesa/pipe/llvm/storage.cpp
@@ -68,24 +68,12 @@ Storage::Storage(llvm::BasicBlock *block, llvm::Value *out,
llvm::Constant *Storage::shuffleMask(int vec)
{
if (!m_extSwizzleVec) {
- Constant *const_vec = Constant::getNullValue(m_floatVecType);
- InsertElementInst *res = new InsertElementInst(const_vec,
- ConstantFP::get(Type::FloatTy, APFloat(0.f)),
- unsigned(0),
- name("extswx"), m_block);
- res = new InsertElementInst(res, ConstantFP::get(Type::FloatTy, APFloat(1.f)),
- unsigned(1),
- name("extswy"),
- m_block);
- res = new InsertElementInst(res, ConstantFP::get(Type::FloatTy, APFloat(0.f)),
- unsigned(2),
- name("extswz"),
- m_block);
- res = new InsertElementInst(res, ConstantFP::get(Type::FloatTy, APFloat(1.f)),
- unsigned(3),
- name("extsww"),
- m_block);
- m_extSwizzleVec = res;
+ std::vector<Constant*> elems;
+ elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(0.f)));
+ elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(1.f)));
+ elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(0.f)));
+ elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(1.f)));
+ m_extSwizzleVec = ConstantVector::get(m_floatVecType, elems);
}
if (m_intVecs.find(vec) != m_intVecs.end()) {