mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
Implement frc and floor
This commit is contained in:
parent
1c955171c8
commit
c6a1beb18f
3 changed files with 62 additions and 3 deletions
|
|
@ -16,6 +16,7 @@ Instructions::Instructions(llvm::Module *mod, llvm::BasicBlock *block)
|
|||
m_llvmFSqrt = 0;
|
||||
m_llvmFAbs = 0;
|
||||
m_llvmPow = 0;
|
||||
m_llvmFloor = 0;
|
||||
}
|
||||
|
||||
llvm::Value * Instructions::add(llvm::Value *in1, llvm::Value *in2)
|
||||
|
|
@ -311,3 +312,53 @@ llvm::Value * Instructions::ex2(llvm::Value *in)
|
|||
return vectorFromVals(val, val, val, val);
|
||||
}
|
||||
|
||||
llvm::Value * Instructions::callFloor(llvm::Value *val)
|
||||
{
|
||||
if (!m_llvmFloor) {
|
||||
// predeclare the intrinsic
|
||||
std::vector<const Type*> floorArgs;
|
||||
floorArgs.push_back(Type::FloatTy);
|
||||
ParamAttrsList *floorPal = 0;
|
||||
FunctionType* floorType = FunctionType::get(
|
||||
/*Result=*/Type::FloatTy,
|
||||
/*Params=*/floorArgs,
|
||||
/*isVarArg=*/false,
|
||||
/*ParamAttrs=*/floorPal);
|
||||
m_llvmFloor = new Function(
|
||||
/*Type=*/floorType,
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage,
|
||||
/*Name=*/"floorf", m_mod);
|
||||
m_llvmFloor->setCallingConv(CallingConv::C);
|
||||
}
|
||||
CallInst *call = new CallInst(m_llvmFloor, val,
|
||||
name("floorf"),
|
||||
m_block);
|
||||
call->setCallingConv(CallingConv::C);
|
||||
call->setTailCall(false);
|
||||
return call;
|
||||
}
|
||||
|
||||
llvm::Value * Instructions::floor(llvm::Value *in)
|
||||
{
|
||||
ExtractElementInst *x = new ExtractElementInst(in, unsigned(0),
|
||||
name("extractx"),
|
||||
m_block);
|
||||
ExtractElementInst *y = new ExtractElementInst(in, unsigned(1),
|
||||
name("extracty"),
|
||||
m_block);
|
||||
ExtractElementInst *z = new ExtractElementInst(in, unsigned(2),
|
||||
name("extractz"),
|
||||
m_block);
|
||||
ExtractElementInst *w = new ExtractElementInst(in, unsigned(3),
|
||||
name("extractw"),
|
||||
m_block);
|
||||
return vectorFromVals(callFloor(x), callFloor(y),
|
||||
callFloor(z), callFloor(w));
|
||||
}
|
||||
|
||||
llvm::Value * Instructions::frc(llvm::Value *in)
|
||||
{
|
||||
llvm::Value *flr = floor(in);
|
||||
return sub(in, flr);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ public:
|
|||
llvm::Value *dph(llvm::Value *in1, llvm::Value *in2);
|
||||
llvm::Value *dst(llvm::Value *in1, llvm::Value *in2);
|
||||
llvm::Value *ex2(llvm::Value *in1);
|
||||
llvm::Value *floor(llvm::Value *in1);
|
||||
llvm::Value *frc(llvm::Value *in1);
|
||||
llvm::Value *lit(llvm::Value *in1);
|
||||
llvm::Value *madd(llvm::Value *in1, llvm::Value *in2,
|
||||
llvm::Value *in2);
|
||||
|
|
@ -31,8 +33,9 @@ public:
|
|||
private:
|
||||
const char *name(const char *prefix);
|
||||
|
||||
llvm::Value *callFSqrt(llvm::Value *val);
|
||||
llvm::Value *callFAbs(llvm::Value *val);
|
||||
llvm::Value *callFloor(llvm::Value *val);
|
||||
llvm::Value *callFSqrt(llvm::Value *val);
|
||||
llvm::Value *callPow(llvm::Value *val1, llvm::Value *val2);
|
||||
|
||||
llvm::Value *vectorFromVals(llvm::Value *x, llvm::Value *y,
|
||||
|
|
@ -48,6 +51,7 @@ private:
|
|||
llvm::Function *m_llvmFSqrt;
|
||||
llvm::Function *m_llvmFAbs;
|
||||
llvm::Function *m_llvmPow;
|
||||
llvm::Function *m_llvmFloor;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -241,11 +241,15 @@ translate_instruction(llvm::Module *module,
|
|||
break;
|
||||
case TGSI_OPCODE_NEGATE:
|
||||
break;
|
||||
case TGSI_OPCODE_FRAC:
|
||||
case TGSI_OPCODE_FRAC: {
|
||||
out = instr->frc(inputs[0]);
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_CLAMP:
|
||||
break;
|
||||
case TGSI_OPCODE_FLOOR:
|
||||
case TGSI_OPCODE_FLOOR: {
|
||||
out = instr->floor(inputs[0]);
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_ROUND:
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue