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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user