Nicholas Clark wrote:

> On Fri, Oct 11, 2002 at 05:01:49PM -0400, Dan Sugalski wrote:
> 
>>At 9:02 PM +0100 10/11/02, Nicholas Clark wrote:
>>
> 
>>>I would like to kill all generated variants of all the 3 argument opcodes
>>>where both input arguments are constants. They truly are superfluous.

>>Where both operands are ints or nums, I think it's a good idea. I'm 
>>less sure in the case where there's a PMC or string involved, as 
>>there may be some assumption of runtime behaviour (in the case of 
>>constant PMCs that might have some methods overloaded) or strings 
>>where the compiler is expecting runtime conversion to happen before 
>>whatever gets done.


Ok, we need 2 + 3 args PMC ops becaus of overloading.


> I think I agree with this reasoning. I was really thinking of the ints
> as being easiest to bump off, providing we can be sure that things will
> consistently for bytecode compile on a 32 bit parrot, but run by a 64
> bit parrot (or likewise for different length floating point)


By preprocessing ints and nums, we would move overflow/precision issues 
from the running machine to the compiling machine. But the issue itself 
would remain.

So we could end up with:

add_i_ic        add_n_nc
add_i_i_i       add_n_n_n
add_i_i_ic      add_n_n_nc
add_i_ic_i      add_n_nc_n

where the latter could be tossed, when the assebler/imcc swaps 
arguments. This saves 6 opcodes for each <add> and <mul> and  ~2 opcodes 
for each <sub>, <div> and <mod>. <sub> with constants could be rewritten 
to <add>. Saving a total of ~20 ops.

Some 2 operand bitwise operations are there some not - there is no 
consistency - I would remove the to operand bitwise integer ops.


> More free speedup. I had this crazier idea - experiment with splitting
> every parrot function out into its own object file, and see what happens
> with permuting the order of all of them.


I have s small shell script (attached), which generates opcode coverage 
for all PBC files in the parrot tree:


total ops 866
ops types 177
op usage stat
     540 op-list-all
     161 op-list-s

So only ~2/3 opcodes are currently used/tested (ops types/op-list-s are 
ops short names w/o variants).

To run the script do:
   make test
   cd languages/perl6
   make
   perl6 --test
   cd -
   make disassemble
   ./op-stat


> But I think I need a lot of tuits, and a decent way of doing permutations
> with genetic algorithms. (I've got access to a fast machine, but it will
> have to stop smoking perl5 for the duration). 


This would keep the machine busy for some time ;-) Interesting idea.


> Nicholas Clark


leo


#!/bin/sh
DIS=disassemble
[ -e .op-list1 ] && rm .op-list1
[ -e op-list-all ] && rm op-list-all
[ -e op-list-s ] && rm op-list-s
find . -name '*.pbc' -fprint /dev/stderr -exec $DIS {} \; |
  sed -e's/^[[:blank:]]*L[0-9]*://' | \
  sed -e's/^[[:blank:]]+//' | cut -d\  -f1 >> .op-list1
sort < .op-list1 | uniq -c | sort -rg > op-list-all
sort < .op-list1 | sed -e's/_.*//' | uniq -c | sort -rg > op-list-s
echo
T=`grep NAME lib/Parrot/OpLib/core.pm | wc -l`
S=`grep NAME lib/Parrot/OpLib/core.pm | sort | uniq | wc -l`
echo total ops $T
echo ops types $S
echo op usage stat
wc -l op-list* | head -2

Reply via email to