[Mesa-dev] [PATCHv3 09/20] i965/fs: Get 64-bit indirect moves working on IVB.
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Fri Feb 10 08:06:17 UTC 2017
On Thu, 2017-02-09 at 18:28 -0800, Francisco Jerez wrote:
> Francisco Jerez <currojerez at riseup.net> writes:
>
> > ---
> > This replaces "[PATCH v2 09/20] i965/fs: indirect addressing with
> > doubles is not supported in IVB/BYT".
> >
>
> Note that some of the fp64 indirect addressing test-cases still fail
> on
> IVB even with this patch applied, but the reason doesn't seem to have
> anything to do with indirect addressing. Apparently the remaining
> failures are caused by illegal code like:
>
> > sel(8) g30<1>D g9<0,2,1>DF g8.3<0,2,1>DF {
> > align1 1Q };
>
> The problem is that the SEL instruction doesn't support most datatype
> conversions, so this leads to data corruption on at least IVB.
> According to the hardware docs, the only valid destination type of
> SEL
> is DF if the execution type is DF, and F (or HF on CHV+) if the
> execution type is F. Integer 16 or 32-bit execution types seem to
> allow
> converting to other single-precision integer types.
>
Some weeks ago I saw this issue while working in a solution for IVB's
MOV INDIRECT. That SEL is added by opt_peephole_sel():
https://lists.freedesktop.org/archives/mesa-dev/2017-January/142023.htm
l
However, I did it very restrictive by just don't allowing any
conversion between different data type sizes. I am going to improve
that patch to include all the allowed cases.
> I'm not sure why we haven't seen this cause massive breakage on HSW+,
> but I think we need some sort of legalization pass to do the type
> conversion in a separate MOV for any instruction with an invalid
> destination conversion. You may be able to do it within the d2x pass
> but then it would make sense to rename it to something more
> appropriate
> like destination conversion lowering (lower_cvt? :P).
>
:)
> In addition there seem to be other issues with your d2x lowering code
> (I'm bringing this up here because you don't seem to have sent the
> d2x
> changes for review to the mailing list yet) -- It removes the
> original
> instruction and creates a new one with the same opcode and first few
> sources, which will miscompile the program if the original
> instruction
> had a larger number of sources or any other instruction controls
> set. I
> suggest you modify the original instruction in-place to point it to
> the
> temporary you've allocated, and then copy the data into the original
> destination by using a strided move.
>
OK.
Thanks,
Sam
> > src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 27
> > ++++++++++++++++++++++++--
> > 1 file changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > index ea4a3fe1399..0e2dbe23571 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > @@ -440,7 +440,7 @@ fs_generator::generate_mov_indirect(fs_inst
> > *inst,
> > brw_MOV(p, dst, reg);
> > } else {
> > /* Prior to Broadwell, there are only 8 address registers.
> > */
> > - assert(inst->exec_size == 8 || devinfo->gen >= 8);
> > + assert(inst->exec_size <= 8 || devinfo->gen >= 8);
> >
> > /* We use VxH indirect addressing, clobbering a0.0 through
> > a0.7. */
> > struct brw_reg addr = vec8(brw_address_reg(0));
> > @@ -478,7 +478,30 @@ fs_generator::generate_mov_indirect(fs_inst
> > *inst,
> > * code, using it saves us 0 instructions and would require
> > quite a bit
> > * of case-by-case work. It's just not worth it.
> > */
> > - brw_ADD(p, addr, indirect_byte_offset,
> > brw_imm_uw(imm_byte_offset));
> > + if (devinfo->gen >= 8 || devinfo->is_haswell ||
> > type_sz(reg.type) < 8) {
> > + brw_ADD(p, addr, indirect_byte_offset,
> > brw_imm_uw(imm_byte_offset));
> > + } else {
> > + /* IVB reads two address register components per channel
> > for
> > + * indirectly addressed 64-bit sources, so we need to
> > initialize
> > + * adjacent address components to consecutive dwords of
> > the source
> > + * region by emitting two separate ADD
> > instructions. Found
> > + * empirically.
> > + */
> > + assert(inst->exec_size <= 4);
> > + brw_push_insn_state(p);
> > + brw_set_default_exec_size(p, cvt(inst->exec_size) - 1);
> > +
> > + brw_ADD(p, spread(addr, 2), indirect_byte_offset,
> > + brw_imm_uw(imm_byte_offset));
> > + brw_inst_set_no_dd_clear(devinfo, brw_last_inst, true);
> > +
> > + brw_ADD(p, spread(suboffset(addr, 1), 2),
> > indirect_byte_offset,
> > + brw_imm_uw(imm_byte_offset + 4));
> > + brw_inst_set_no_dd_check(devinfo, brw_last_inst, true);
> > +
> > + brw_pop_insn_state(p);
> > + }
> > +
> > struct brw_reg ind_src = brw_VxH_indirect(0, 0);
> >
> > brw_inst *mov = brw_MOV(p, dst, retype(ind_src, dst.type));
> > --
> > 2.11.0
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170210/4e210722/attachment.sig>
More information about the mesa-dev
mailing list