Sfoglia il codice sorgente

intel/fs: Promote execution type to 32-bit when any half-float conversion is needed.

The docs are fairly incomplete and inconsistent about it, but this
seems to be the reason why half-float destinations are required to be
DWORD-aligned on BDW+ projects.  This way the regioning lowering pass
will make sure that the destination components of W to HF and HF to W
conversions are aligned like the corresponding conversion operation
with 32-bit execution data type.

Tested-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
tags/19.0-branchpoint
Francisco Jerez 6 anni fa
parent
commit
c84ec70b3a
1 ha cambiato i file con 21 aggiunte e 0 eliminazioni
  1. 21
    0
      src/intel/compiler/brw_ir_fs.h

+ 21
- 0
src/intel/compiler/brw_ir_fs.h Vedi File

@@ -477,6 +477,27 @@ get_exec_type(const fs_inst *inst)

assert(exec_type != BRW_REGISTER_TYPE_B);

/* Promotion of the execution type to 32-bit for conversions from or to
* half-float seems to be consistent with the following text from the
* Cherryview PRM Vol. 7, "Execution Data Type":
*
* "When single precision and half precision floats are mixed between
* source operands or between source and destination operand [..] single
* precision float is the execution datatype."
*
* and from "Register Region Restrictions":
*
* "Conversion between Integer and HF (Half Float) must be DWord aligned
* and strided by a DWord on the destination."
*/
if (type_sz(exec_type) == 2 &&
inst->dst.type != exec_type) {
if (exec_type == BRW_REGISTER_TYPE_HF)
exec_type = BRW_REGISTER_TYPE_F;
else if (inst->dst.type == BRW_REGISTER_TYPE_HF)
exec_type = BRW_REGISTER_TYPE_D;
}

return exec_type;
}


Loading…
Annulla
Salva