compiler/spirv: implement 16-bit bitcasts
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
2d648e5ba3
commit
1dacb56279
|
@ -251,10 +251,17 @@ vtn_handle_bitcast(struct vtn_builder *b, struct vtn_ssa_value *dest,
|
||||||
vtn_assert(src_bit_size % dest_bit_size == 0);
|
vtn_assert(src_bit_size % dest_bit_size == 0);
|
||||||
unsigned divisor = src_bit_size / dest_bit_size;
|
unsigned divisor = src_bit_size / dest_bit_size;
|
||||||
for (unsigned comp = 0; comp < src_components; comp++) {
|
for (unsigned comp = 0; comp < src_components; comp++) {
|
||||||
vtn_assert(src_bit_size == 64);
|
nir_ssa_def *split;
|
||||||
vtn_assert(dest_bit_size == 32);
|
if (src_bit_size == 64) {
|
||||||
nir_ssa_def *split =
|
assert(dest_bit_size == 32 || dest_bit_size == 16);
|
||||||
nir_unpack_64_2x32(&b->nb, nir_channel(&b->nb, src, comp));
|
split = dest_bit_size == 32 ?
|
||||||
|
nir_unpack_64_2x32(&b->nb, nir_channel(&b->nb, src, comp)) :
|
||||||
|
nir_unpack_64_4x16(&b->nb, nir_channel(&b->nb, src, comp));
|
||||||
|
} else {
|
||||||
|
vtn_assert(src_bit_size == 32);
|
||||||
|
vtn_assert(dest_bit_size == 16);
|
||||||
|
split = nir_unpack_32_2x16(&b->nb, nir_channel(&b->nb, src, comp));
|
||||||
|
}
|
||||||
for (unsigned i = 0; i < divisor; i++)
|
for (unsigned i = 0; i < divisor; i++)
|
||||||
dest_chan[divisor * comp + i] = nir_channel(&b->nb, split, i);
|
dest_chan[divisor * comp + i] = nir_channel(&b->nb, split, i);
|
||||||
}
|
}
|
||||||
|
@ -263,11 +270,17 @@ vtn_handle_bitcast(struct vtn_builder *b, struct vtn_ssa_value *dest,
|
||||||
unsigned divisor = dest_bit_size / src_bit_size;
|
unsigned divisor = dest_bit_size / src_bit_size;
|
||||||
for (unsigned comp = 0; comp < dest_components; comp++) {
|
for (unsigned comp = 0; comp < dest_components; comp++) {
|
||||||
unsigned channels = ((1 << divisor) - 1) << (comp * divisor);
|
unsigned channels = ((1 << divisor) - 1) << (comp * divisor);
|
||||||
nir_ssa_def *src_chan =
|
nir_ssa_def *src_chan = nir_channels(&b->nb, src, channels);
|
||||||
nir_channels(&b->nb, src, channels);
|
if (dest_bit_size == 64) {
|
||||||
vtn_assert(dest_bit_size == 64);
|
assert(src_bit_size == 32 || src_bit_size == 16);
|
||||||
vtn_assert(src_bit_size == 32);
|
dest_chan[comp] = src_bit_size == 32 ?
|
||||||
dest_chan[comp] = nir_pack_64_2x32(&b->nb, src_chan);
|
nir_pack_64_2x32(&b->nb, src_chan) :
|
||||||
|
nir_pack_64_4x16(&b->nb, src_chan);
|
||||||
|
} else {
|
||||||
|
vtn_assert(dest_bit_size == 32);
|
||||||
|
vtn_assert(src_bit_size == 16);
|
||||||
|
dest_chan[comp] = nir_pack_32_2x16(&b->nb, src_chan);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dest->def = nir_vec(&b->nb, dest_chan, dest_components);
|
dest->def = nir_vec(&b->nb, dest_chan, dest_components);
|
||||||
|
|
Loading…
Reference in New Issue