[Nouveau] [PATCH 3/4] nvc0/ir: optimize set & 1.0 to produce boolean-float sets
Ilia Mirkin
imirkin at alum.mit.edu
Sat May 9 10:53:38 PDT 2015
On Sat, May 9, 2015 at 11:27 AM, Tobias Klausmann
<tobias.johannes.klausmann at mni.thm.de> wrote:
>
>
> On 09.05.2015 07:35, Ilia Mirkin wrote:
>>
>> This has started to happen more now that the backend is producing
>> KILL_IF more often.
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> .../drivers/nouveau/codegen/nv50_ir_peephole.cpp | 29
>> ++++++++++++++++++++++
>> .../nouveau/codegen/nv50_ir_target_nv50.cpp | 2 ++
>> 2 files changed, 31 insertions(+)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> index 14446b6..d8af19a 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> @@ -973,6 +973,35 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue
>> &imm0, int s)
>> }
>> break;
>> + case OP_AND:
>> + {
>> + CmpInstruction *cmp = i->getSrc(t)->getInsn()->asCmp();
>> + if (!cmp || cmp->op == OP_SLCT)
>
>
> how about if (cmp == NULL || ...) and kill the same condition later?
I just killed the other one. I think the usual style tends to be if
(!ptr) rather than if (ptr == NULL) in codegen. Both are acceptable
though.
>
>
>> + return;
>> + if (!prog->getTarget()->isOpSupported(cmp->op, TYPE_F32))
>> + return;
>> + if (imm0.reg.data.f32 != 1.0)
>> + return;
>> + if (cmp == NULL)
>> + return;
>> + if (i->getSrc(t)->getInsn()->dType != TYPE_U32)
>> + return;
>> +
>> + i->getSrc(t)->getInsn()->dType = TYPE_F32;
>> + if (i->src(t).mod != Modifier(0)) {
>> + assert(i->src(t).mod == Modifier(NV50_IR_MOD_NOT));
>> + i->src(t).mod = Modifier(0);
>> + cmp->setCond = reverseCondCode(cmp->setCond);
>> + }
>> + i->op = OP_MOV;
>> + i->setSrc(s, NULL);
>> + if (t) {
>> + i->setSrc(0, i->getSrc(t));
>> + i->setSrc(t, NULL);
>> + }
>> + }
>> + break;
>> +
>> case OP_SHL:
>> {
>> if (s != 1 || i->src(0).mod != Modifier(0))
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
>> b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
>> index 178a167..70180eb 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
>> @@ -413,6 +413,8 @@ TargetNV50::isOpSupported(operation op, DataType ty)
>> const
>> return false;
>> case OP_SAD:
>> return ty == TYPE_S32;
>> + case OP_SET:
>> + return !isFloatType(ty);
>> default:
>> return true;
>> }
>
>
More information about the Nouveau
mailing list