[Mesa-dev] [PATCH] gf100/ir: limms on gm107 are 19 bit
Ilia Mirkin
imirkin at alum.mit.edu
Sat Oct 8 19:26:24 UTC 2016
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...
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