[Mesa-dev] [PATCH 05/20] i965/cfg: Add a foreach_inst_in_block_safe macro.

Pohjolainen, Topi topi.pohjolainen at intel.com
Wed Aug 6 05:22:52 PDT 2014


On Tue, Aug 05, 2014 at 09:14:55PM +0300, Pohjolainen, Topi wrote:
> On Thu, Jul 24, 2014 at 07:54:12PM -0700, Matt Turner wrote:
> > ---
> >  src/mesa/drivers/dri/i965/brw_cfg.h | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_cfg.h b/src/mesa/drivers/dri/i965/brw_cfg.h
> > index a5d2df5..913a1ed 100644
> > --- a/src/mesa/drivers/dri/i965/brw_cfg.h
> > +++ b/src/mesa/drivers/dri/i965/brw_cfg.h
> > @@ -120,6 +120,14 @@ struct cfg_t {
> >          __inst != __block->end->next;                          \
> >          __inst = (__type *)__inst->next)
> >  
> > +#define foreach_inst_in_block_safe(__type, __inst, __block)    \
> > +   for (__type *__inst = (__type *)__block->start,             \
> > +               *__next = (__type *)__inst->next,               \
> > +               *__end = (__type *)__block->end->next->next;    \
> 
> Patches 4 and 7 make sense but the double ->next->next here is not obvious
> to me.

I tried handwriting instructions into blocks (this is purely arbitrary):

ip    opcode
------------------
0  :  BRW_OPCODE_?
..
k  :  BRW_OPCODE_IF
k+1:  BRW_OPCODE_?
..
n  :  BRW_OPCODE_ELSE
n+1:  BRW_OPCODE_?
..
m  :  BRW_OPCODE_ENDIF
m+1:  BRW_OPCODE_?
..
t  :  BRW_OPCODE_?


Following the logic in the constructor of cfg_t, I would deduce this:

block 0:
   start_ip = 0
   num = 0    
   start = inst_0
   end = inst_k      (if)

block 1:
   start_ip = k+1
   num = 1
   start = inst_k+1
   end = inst_n      (else)

block 2:
   start_ip = n+1
   num = 2
   start = inst_n+1
   end = inst_m-1

block 3:
   start_ip = m
   num = 3
   start = inst_m    (endif)
   end = inst_t


And as instructions are inherited from exec_node, for block 3 end->next
should be NULL, right?

> 
> > +        __next != __end;                                       \
> > +        __inst = __next,                                       \
> > +        __next = (__type *)__next->next)
> > +
> >  #define foreach_inst_in_block_reverse(__type, __inst, __block) \
> >     for (__type *__inst = (__type *)__block->end;               \
> >          __inst != __block->start->prev;                        \
> > -- 
> > 1.8.5.5
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list