[pypy-dev] CLI code generation

Antonio Cuni anto.cuni at gmail.com
Mon Mar 20 21:32:21 CET 2006


Hi Armin,

Armin Rigo wrote:

 > I wonder how important this is at the moment.  Maybe the .NET JIT
 > compiler is good enough to remove all this.  How does the resulting
 > machine code look like?

I have not tried the CLR by Microsoft yet but in this stage I'm using 
mono under linux, just because I'd like to stay in windows as less as 
possibile ;-).

BTW, mono doesn't seems smart enough to optimize the code; consider the 
following IL methods: the first is generated by my compiler, the second 
is written by hand:

.method static public int32 slow(int32 a_1, int32 b_1) il managed
{
     .locals (int32 v6, int32 v12)

block0:
     ldarg.s 'a_1'
     ldarg.s 'b_1'
     add
     stloc.s 'v12'
     ldloc.s 'v12'
     stloc.s 'v6'
     br.s block1

block1:
     ldloc.s 'v6'
     ret
}

.method static public int32 fast(int32 a_1, int32 b_1) il managed
{
     ldarg.s 'a_1'
     ldarg.s 'b_1'
     add
     ret
}

I used mono's ahead-of-time compiler with all optimizations enabled, 
then I disassembled the result with "objdump -d"; here is an extract of 
the output:

Disassembly of section .text:

000004f0 <methods>:
  4f0:   55                      push   %ebp
  4f1:   8b ec                   mov    %esp,%ebp
  4f3:   8b 45 08                mov    0x8(%ebp),%eax
  4f6:   03 45 0c                add    0xc(%ebp),%eax
  4f9:   c9                      leave
  4fa:   c3                      ret
  4fb:   90                      nop
  4fc:   8d 74 26 00             lea    0x0(%esi,1),%esi
  500:   55                      push   %ebp
  501:   8b ec                   mov    %esp,%ebp
  503:   57                      push   %edi
  504:   8b 45 08                mov    0x8(%ebp),%eax
  507:   8b f8                   mov    %eax,%edi
  509:   03 7d 0c                add    0xc(%ebp),%edi
  50c:   8b c7                   mov    %edi,%eax
  50e:   8d 65 fc                lea    0xfffffffc(%ebp),%esp
  511:   5f                      pop    %edi
  512:   c9                      leave
  513:   c3                      ret
  514:   8d 74 26 00             lea    0x0(%esi,1),%esi

I don't know x86 assembly very well (to be honest I don't know it at all 
;-) but it seems that the 'fast' method spans from 4f0 to 4fc and the 
'slow' methods spans from 500 to 514, and I think that the first should 
be more efficient than the latter, don't I?

I don't know how smart are the JIT and AOT shipped with MS CLR, but 
perhaps it is worth the pain of trying to generate smarter code, so that 
it can run efficiently even under mono.

Sure, it is not the task with the highest priority.

 > It would probably make sense to write this as a function that takes a
 > single block and produces a list of "complex expression" objects -- to
 > be defined in a custom way, instead of trying to push this into the
 > existing flow graph model.

I agree, I think this is the simplest solution.

ciao Anto




More information about the Pypy-dev mailing list