瀏覽代碼

nv50/ir/opt: extend handleCVT for nv50's SET u32 to f32 chain

tags/i965-primitive-restart-v2
Christoph Bumiller 13 年之前
父節點
當前提交
a6fcf14c23
共有 1 個文件被更改,包括 17 次插入1 次删除
  1. 17
    1
      src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp

+ 17
- 1
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp 查看文件

@@ -1078,6 +1078,8 @@ AlgebraicOpt::handleLOGOP(Instruction *logop)
}

// F2I(NEG(SET with result 1.0f/0.0f)) -> SET with result -1/0
// nv50:
// F2I(NEG(I2F(ABS(SET))))
void
AlgebraicOpt::handleCVT(Instruction *cvt)
{
@@ -1090,8 +1092,22 @@ AlgebraicOpt::handleCVT(Instruction *cvt)
if (insn->src(0).mod != Modifier(0))
return;
insn = insn->getSrc(0)->getInsn();
if (!insn || insn->op != OP_SET || insn->dType != TYPE_F32)

// check for nv50 SET(-1,0) -> SET(1.0f/0.0f) chain and nvc0's f32 SET
if (insn && insn->op == OP_CVT &&
insn->dType == TYPE_F32 &&
insn->sType == TYPE_S32) {
insn = insn->getSrc(0)->getInsn();
if (!insn || insn->op != OP_ABS || insn->sType != TYPE_S32 ||
insn->src(0).mod)
return;
insn = insn->getSrc(0)->getInsn();
if (!insn || insn->op != OP_SET || insn->dType != TYPE_U32)
return;
} else
if (!insn || insn->op != OP_SET || insn->dType != TYPE_F32) {
return;
}

Instruction *bset = cloneShallow(func, insn);
bset->dType = TYPE_U32;

Loading…
取消
儲存