thanks for the clarifications;

attached an updated patch including some tests.

I left out += and friends for now.

kjs

On Fri, Mar 28, 2008 at 4:18 PM, Patrick R. Michaud <[EMAIL PROTECTED]> wrote:
> On Fri, Mar 28, 2008 at 02:41:28PM +0100, Klaas-Jan Stol wrote:
>  > On Fri, Mar 28, 2008 at 1:41 PM, Patrick R. Michaud <[EMAIL PROTECTED]> 
> wrote:
>
> > >  It really needs to be inc/dec.  And not only that, but the output
>  > >  value of postfix ++ and --  needs to be the value _before_ the
>  > >  inc/dec operation.  So the PIR code for postfix:++ should be
>  > >  something like:
>  > >
>  > >     %r = clone %0
>  > >     inc %0
>  > >
>  >
>  > Yes, that's right. I was too quick.
>  >
>  > >  Also, they need to have the "is lvalue(1)" trait so that PAST
>  > >  knows that the operand is to be treated as an lvalue.
>  >
>  > is this really necessary? It seems to work without. This is also a
>  > problem when writing "1++"; not sure if this is allowed, but the
>  > grammar allows it. PAST::Val doesn't have an lvalue method.
>
>  I know it's often necessary in the general case, it might not
>  be necessary for NQP.  Consider:
>
>     our $a;
>     $a++;
>
>  The "our $a" defines $a as having package scope, but doesn't bind
>  the variable to a value.  The "$a++" will then automatically create
>  an Undef value for $a (since it's not vivified yet), but unless
>  something says it's to be an lvalue it won't bind that auto-generated
>  Undef back to the $a symbol in the namespace.
>
>  But now that you've mentioned it, ISTR that Parrot Undef objects
>  throw an exception on inc/dec anyway, so perhaps we don't need
>  to worry about this case in NQP.
>
>  > >  [...]  We can get close with
>
> > >
>  > >     add_p_p %0, %1
>  > >
>  > >  but of course that means that an expression like += 2 would end up
>  > >  creating a PMC for the 2 constant.
>  >
>
> > maybe the PCT can include optimizations to remove the creation of PMCs
>  > for constants?
>
>  Actually, PCT tends to work the other way -- it uses constants whenever
>  it can and PMCs when told otherwise (or can't figure it out).  In the
>  above case, 'add_p_p' explicitly indicates that the second operand is
>  a PMC, so PCT would feel obligated to create one.
>
>  In the general case we can't do a global "remove creation of PMCs
>  for constants" because not all opcodes work with all operand types.
>  So, before we choose to optimize or not optimize, we have to know
>  how the operand is going to be used.  The PAST compiler handles this
>  through its %piropsig table, which indicates what kinds of operands
>  are allowed for each opcode.
>
>
>  > >  > * <, <=, > and >= operators
>  > >
>  > >  The relational ops in the patch appear to be using iseq and
>  > >  isne; I think it would make more sense for them to use islt,
>  > >  isle, isgt, isge.
>  >
>  > is there any reason that == and != have to use cmp_num, and not use
>  > iseq and isne directly on the operands?
>
>  Yes, because iseq, isne, islt, isgt, etc. aren't guaranteed to
>  do numeric comparisons.  They do comparisons based on the underlying
>  PMC type (which might not be numeric).
>
>
>  > reasons I used iseq and isne, is that cmp_num returns -1, 0 or 1, so I
>  > checked for these return values.
>  >
>  > I think, if the new rel.ops can use islt and friends, then == and !=
>  > can use iseq and isne directly too without cmp_num, right?
>
>  I think my previous message was unclear... I wasn't aiming to
>  eliminate the cmp_num, but rather to use islt and friends on
>  the result of cmp_num (instead of iseq and isne).  For example:
>
>     ## infix:<
>     $I0 = cmp_num %0, %1
>     $I0 = islt $I0, 0
>
>     ## infix:<=
>     $I0 = cmp_num %0, %1
>     $I0 = isle $I0, 0
>
>     ## etc.
>
>  Pm
>

Attachment: nqp_proposals.patch
Description: Binary data

Reply via email to