[Mesa-dev] [PATCH] gf100/ir: limms on gm107 are 19 bit

Karol Herbst karolherbst at gmail.com
Sat Oct 8 19:45:23 UTC 2016


2016-10-08 21:26 GMT+02:00 Ilia Mirkin <imirkin at alum.mit.edu>:
> Pretty sure that the float one is fine. And there's a 20th bit, it
> just behaves differently than one might expect. I don't remember all
> the details though...

ohh I think you are right, just took a loot inside
CodeEmitterGM107::emitIMMD and it indeed does some magic there.

>
> On Sat, Oct 8, 2016 at 3:23 PM, Karol Herbst <karolherbst at gmail.com> wrote:
>> the emit code uses 19 everywhere, so we should let
>> CodeEmitterGM107::longIMMD and TargetNVC0::insnCanLoad check against
>> this too
>>
>> Signed-off-by: Karol Herbst <karolherbst at gmail.com>
>> ---
>>  src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp  |  6 +++---
>>  src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp | 13 ++++++++++---
>>  2 files changed, 13 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>> index 3fedafd..fbc2e15 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>> @@ -311,11 +311,11 @@ CodeEmitterGM107::longIMMD(const ValueRef &ref)
>>     if (ref.getFile() == FILE_IMMEDIATE) {
>>        const ImmediateValue *imm = ref.get()->asImm();
>>        if (isFloatType(insn->sType)) {
>> -         if ((imm->reg.data.u32 & 0x00000fff) != 0x00000000)
>> +         if ((imm->reg.data.u32 & 0x00001fff) != 0x00000000)
>>              return true;
>>        } else {
>> -         if ((imm->reg.data.u32 & 0xfff00000) != 0x00000000 &&
>> -             (imm->reg.data.u32 & 0xfff00000) != 0xfff00000)
>> +         if ((imm->reg.data.u32 & 0xfff80000) != 0x00000000 &&
>> +             (imm->reg.data.u32 & 0xfff80000) != 0xfff80000)
>>              return true;
>>        }
>>     }
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> index 2d1f1b45..944b072 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> @@ -356,13 +356,17 @@ TargetNVC0::insnCanLoad(const Instruction *i, int s,
>>                 return false;
>>              break;
>>           case TYPE_F32:
>> -            if (reg.data.u32 & 0xfff)
>> +            if (getChipset() < NVISA_GM107_CHIPSET && reg.data.u32 & 0xfff)
>> +               return false;
>> +            else if (getChipset() >= NVISA_GM107_CHIPSET && reg.data.u32 & 0x1fff)
>>                 return false;
>>              break;
>>           case TYPE_S32:
>>           case TYPE_U32:
>>              // with u32, 0xfffff counts as 0xffffffff as well
>> -            if (reg.data.s32 > 0x7ffff || reg.data.s32 < -0x80000)
>> +            if (getChipset() < NVISA_GM107_CHIPSET && (reg.data.s32 > 0x7ffff || reg.data.s32 < -0x80000))
>> +               return false;
>> +            else if (getChipset() >= NVISA_GM107_CHIPSET && (reg.data.s32 > 0x3ffff || reg.data.s32 < -0x40000))
>>                 return false;
>>              break;
>>           case TYPE_U8:
>> @@ -378,7 +382,10 @@ TargetNVC0::insnCanLoad(const Instruction *i, int s,
>>        if (i->op == OP_MAD || i->op == OP_FMA) {
>>           // requires src == dst, cannot decide before RA
>>           // (except if we implement more constraints)
>> -         if (ld->getSrc(0)->asImm()->reg.data.u32 & 0xfff)
>> +         uint32_t data = ld->getSrc(0)->asImm()->reg.data.u32;
>> +         if (getChipset() < NVISA_GM107_CHIPSET && (data & 0xfff))
>> +            return false;
>> +         else if (getChipset() >= NVISA_GM107_CHIPSET && (data & 0x1fff))
>>              return false;
>>        } else
>>        if (i->op == OP_ADD && i->sType == TYPE_F32) {
>> --
>> 2.10.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list