nvc0/ir: handle zero and negative sqrt arguments
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -1567,10 +1567,22 @@ NVC0LoweringPass::handleMOD(Instruction *i)
|
||||
bool
|
||||
NVC0LoweringPass::handleSQRT(Instruction *i)
|
||||
{
|
||||
Instruction *rsq = bld.mkOp1(OP_RSQ, i->dType,
|
||||
bld.getSSA(typeSizeof(i->dType)), i->getSrc(0));
|
||||
Value *pred = bld.getSSA(1, FILE_PREDICATE);
|
||||
Value *zero = bld.getSSA();
|
||||
Instruction *rsq;
|
||||
|
||||
bld.mkOp1(OP_MOV, TYPE_U32, zero, bld.mkImm(0));
|
||||
if (i->dType == TYPE_F64)
|
||||
zero = bld.mkOp2v(OP_MERGE, TYPE_U64, bld.getSSA(8), zero, zero);
|
||||
bld.mkCmp(OP_SET, CC_LE, i->dType, pred, i->dType, i->getSrc(0), zero);
|
||||
bld.mkOp1(OP_MOV, i->dType, i->getDef(0), zero)->setPredicate(CC_P, pred);
|
||||
rsq = bld.mkOp1(OP_RSQ, i->dType,
|
||||
bld.getSSA(typeSizeof(i->dType)), i->getSrc(0));
|
||||
rsq->setPredicate(CC_NOT_P, pred);
|
||||
i->op = OP_MUL;
|
||||
i->setSrc(1, rsq->getDef(0));
|
||||
i->setPredicate(CC_NOT_P, pred);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user