mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
broadcom/compiler: handle fp16 conversion ops
As long as fp16 isn't advertized it's not doing much, but it also doesn't hurt to add them. Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25362>
This commit is contained in:
parent
c2ec65eeda
commit
214121e9b0
1 changed files with 32 additions and 0 deletions
|
|
@ -1417,11 +1417,15 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr)
|
||||||
} else {
|
} else {
|
||||||
result = vir_FTOIZ(c, src[0]);
|
result = vir_FTOIZ(c, src[0]);
|
||||||
}
|
}
|
||||||
|
if (nir_src_bit_size(instr->src[0].src) == 16)
|
||||||
|
vir_set_unpack(c->defs[result.index], 0, V3D_QPU_UNPACK_L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nir_op_f2u32:
|
case nir_op_f2u32:
|
||||||
result = vir_FTOUZ(c, src[0]);
|
result = vir_FTOUZ(c, src[0]);
|
||||||
|
if (nir_src_bit_size(instr->src[0].src) == 16)
|
||||||
|
vir_set_unpack(c->defs[result.index], 0, V3D_QPU_UNPACK_L);
|
||||||
break;
|
break;
|
||||||
case nir_op_i2f32:
|
case nir_op_i2f32:
|
||||||
result = vir_ITOF(c, src[0]);
|
result = vir_ITOF(c, src[0]);
|
||||||
|
|
@ -1429,6 +1433,9 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr)
|
||||||
case nir_op_u2f32:
|
case nir_op_u2f32:
|
||||||
result = vir_UTOF(c, src[0]);
|
result = vir_UTOF(c, src[0]);
|
||||||
break;
|
break;
|
||||||
|
case nir_op_b2f16:
|
||||||
|
result = vir_AND(c, src[0], vir_uniform_ui(c, 0x3c00));
|
||||||
|
break;
|
||||||
case nir_op_b2f32:
|
case nir_op_b2f32:
|
||||||
result = vir_AND(c, src[0], vir_uniform_f(c, 1.0));
|
result = vir_AND(c, src[0], vir_uniform_f(c, 1.0));
|
||||||
break;
|
break;
|
||||||
|
|
@ -1436,6 +1443,31 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr)
|
||||||
result = vir_AND(c, src[0], vir_uniform_ui(c, 1));
|
result = vir_AND(c, src[0], vir_uniform_ui(c, 1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_op_i2f16: {
|
||||||
|
uint32_t bit_size = nir_src_bit_size(instr->src[0].src);
|
||||||
|
assert(bit_size <= 32);
|
||||||
|
if (bit_size < 32) {
|
||||||
|
uint32_t mask = bit_size == 16 ? 0xffff : 0xff;
|
||||||
|
result = vir_AND(c, src[0], vir_uniform_ui(c, mask));
|
||||||
|
result = sign_extend(c, result, bit_size, 32);
|
||||||
|
}
|
||||||
|
result = vir_ITOF(c, result);
|
||||||
|
vir_set_pack(c->defs[result.index], V3D_QPU_PACK_L);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case nir_op_u2f16: {
|
||||||
|
uint32_t bit_size = nir_src_bit_size(instr->src[0].src);
|
||||||
|
assert(bit_size <= 32);
|
||||||
|
if (bit_size < 32) {
|
||||||
|
uint32_t mask = bit_size == 16 ? 0xffff : 0xff;
|
||||||
|
result = vir_AND(c, src[0], vir_uniform_ui(c, mask));
|
||||||
|
}
|
||||||
|
result = vir_UTOF(c, result);
|
||||||
|
vir_set_pack(c->defs[result.index], V3D_QPU_PACK_L);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case nir_op_f2f16:
|
case nir_op_f2f16:
|
||||||
case nir_op_f2f16_rtne:
|
case nir_op_f2f16_rtne:
|
||||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue