:) thanks for make it perfectly clear.



----- Message d'origine ----
> De : Paolo Bonzini <bonz...@gnu.org>
> À : Mathieu Suen <mathieus...@yahoo.fr>
> Cc : help-smalltalk@gnu.org
> Envoyé le : Mar 12 octobre 2010, 16h 29min 14s
> Objet : Re: [Help-smalltalk] About no_opt macro
> 
> On 10/12/2010 03:28 PM, Mathieu Suen wrote:
> > Will reading the vm.def, I  cam across the no_opt macro.
> > I guess is to avoid some optimization but  but what kind of optimization 
> > and 
>why.
> > 
> > The macro is define  as:
> > 
> > #define no_opt(x)    ({ __typeof__ ((x)) _result;  \
> >               asm ("" : "=r"  (_result) : "0" ((x))); _result; })
> > 
> > 
> >  From what I  understand is that it define a variable _result and force to 
>move x
> > into  _result.
> > 
> > The macro is used in tha bytecode PLUS_SPECIAL an  MINUS SPECIAL ... :
> > 
> >   intptr_t iresult = no_opt (iop1 +  iop2);
> > 
> > Thanks for shading the light on this point.
> 
> Here  is the context:
> 
>       intptr_t iop1 = (intptr_t)  op1;
>       intptr_t iop2 = ((intptr_t) op2) - 1;
>        intptr_t iresult = no_opt (iop1 + iop2);
>        if (iresult < iop1)
> 
> Remember that these snippets are copied in many  places.  For example, when 
>compiling code for a superoperator (compound  bytecode) like
> 
>      PUSH_TEMPORARY(*)
>       PUSH_INTEGER(1)
>      PLUS_SPECIAL()
> 
> GCC would  have
> 
>       intptr_t iop1 = (intptr_t) op1;
>        intptr_t iresult = no_opt (iop1 + 2);
>       if  (iresult < iop1)
> 
> Without no_opt, "iop1 + 2 < iop1" would be  simplified to "false", thus 
> causing 
>the overflow check to  misbehave.
> 
> Paolo
> 




_______________________________________________
help-smalltalk mailing list
help-smalltalk@gnu.org
http://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to