Cleanup constant vector handling a bit.

This commit is contained in:
Zack Rusin 2007-10-29 13:42:58 -04:00
parent 75a9018fb9
commit a94251d081
3 changed files with 22 additions and 32 deletions

View file

@ -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

View file

@ -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);

View file

@ -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()) {