bool saturate = inst->saturate;
if (supports_type_conversion(inst)) {
- if (type_sz(inst->dst.type) < get_exec_type_size(inst)) {
+ if (get_exec_type_size(inst) == 8 && type_sz(inst->dst.type) < 8) {
/* From the Broadwell PRM, 3D Media GPGPU, "Double Precision Float to
* Single Precision Float":
*
* So we need to allocate a temporary that's two registers, and then do
* a strided MOV to get the lower DWord of every Qword that has the
* result.
- *
- * This restriction applies, in general, whenever we convert to
- * a type with a smaller bit-size.
*/
fs_reg temp = ibld.vgrf(get_exec_type(inst));
fs_reg strided_temp = subscript(temp, dst.type, 0);
*/
case nir_op_f2f16_undef:
- inst = bld.MOV(result, op[0]);
+ case nir_op_i2i16:
+ case nir_op_u2u16: {
+ /* TODO: Fixing aligment rules for conversions from 32-bits to
+ * 16-bit types should be moved to lower_conversions
+ */
+ fs_reg tmp = bld.vgrf(op[0].type, 1);
+ tmp = subscript(tmp, result.type, 0);
+ inst = bld.MOV(tmp, op[0]);
+ inst->saturate = instr->dest.saturate;
+ inst = bld.MOV(result, tmp);
inst->saturate = instr->dest.saturate;
break;
+ }
case nir_op_f2f64:
case nir_op_f2i64:
case nir_op_f2u16:
case nir_op_i2i32:
case nir_op_u2u32:
- case nir_op_i2i16:
- case nir_op_u2u16:
case nir_op_i2f16:
case nir_op_u2f16:
inst = bld.MOV(result, op[0]);