猿を
木から
落とさない
JIT-Aware AVM+ Programming



                              2007/03/23
                   omo <omo@dodgson.or...
Tamarin↓   (w/ JIT)




                       SpiderMonkey↑          (w/o JIT)




                      http://flickr.co...
JIT 結果を確認する


# avmplus_sd.exe -Dverbose Hello.abc
JIT 0/2   package {
            ...
AS→ABC      public class Hello {
              prototype.hello
                 = func...
JIT 1/2   verify <function> ()
            ...
            0:findpropstrict {...}::System

ABC→MIR
                  @25  ...
JIT 2/2   generate <function> ()
             ...
             @8 alloc 48

MIR→x86      @9 ldop 0(@5)
                 03...
本題 : JIT-Aware Programming
    JIT されないところ
●


    似た or 同じバイトコードで異なる JIT 結果
●
JIT されないところ
●


    似た or 同じバイトコードで異なる JIT 結果
●
JIT されないところ
package {
  ...
  public class Hello {
    // Hello$cinit
    prototype.hello
       = function() {
     Syste...
JIT されないところ
●


    似た or 同じバイトコードで異なる JIT 結果
●




    例題 :
➢

    メソッド呼び出し w/ メソッド定義いろいろ
メソッド w/ property
...
function Hello1() {
  this.hello = function()
    { System.write(quot;Helloquot;); };
}

function gre...
メソッド w/ property
       ...
 0:getlocal1
       @37   use  @29 [1]
 1:callproperty {public,Hello1.as$1,avmplus}::hello 0
 ...
メソッド w/ type
 ...
 dynamic public class Hello2 {
   public function Hello2() {
     this.hello = function() { System.write...
メソッド w/ type
   ...
 0:getlocal0
       @33   use  @17 [0]
 1:pushscope
 2:getlocal1
       @34   use  @22 [1]
 3:callprop...
Toplevel::callproperty()
Atom Toplevel::callproperty(...) {
  Binding b = getBinding(...); // ハッシュ検索
  switch (b&7) {
    ...
メソッド w/ 1 -class method
                  st

 ...
 public class Hello3 {
   public function hello() : void
     { System....
メソッド w/ 1 -class method st

...
  0:getlocal0
        @33 use   @17 [0]
  1:pushscope
  2:getlocal1
        @34 use   @22 ...
仕組み : アーリーバインド
                                                         per-class
                                        ...
まとめ : JIT-Aware Programming
    一見同じバイトコードでも JIT 結果は色々
●


        型やアーリーバインドを意識する
    ●

        ( type, method, slot )
 ...
Happy JIT-ing!


             おしまい
Upcoming SlideShare
Loading in …5
×

Stop Monkeys Fall

939 views
888 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
939
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Stop Monkeys Fall

  1. 1. 猿を 木から 落とさない JIT-Aware AVM+ Programming 2007/03/23 omo <omo@dodgson.org> http://www.dodgson.org/omo/
  2. 2. Tamarin↓ (w/ JIT) SpiderMonkey↑ (w/o JIT) http://flickr.com/photos/andrewn/125332736/ http://flickr.com/photos/subindie/336599998/
  3. 3. JIT 結果を確認する # avmplus_sd.exe -Dverbose Hello.abc
  4. 4. JIT 0/2 package { ... AS→ABC public class Hello { prototype.hello = function() { System.write(quot;Helloquot;); }; ... } } var h = new Hello(); h.hello(); ... 0:findpropstrict {...}::System 2:getproperty {...}::System 4:pushstring quot;Helloquot; 6:callproperty {...}::write 1 9:pop 10:returnvoid ...
  5. 5. JIT 1/2 verify <function> () ... 0:findpropstrict {...}::System ABC→MIR @25 imm 13782760 @26 imm 14133232 @27 cmop MethodEnv::finddefNsset (@3, @26, @25) 2:getproperty {...}::System @29 ld 60(@27) 4:pushstring quot;Byequot; @30 imm 14150032 6:callproperty {...}::write 1 @31 ucmp @29 @11 @32 jeq @31 -> 0 @33 st 13490120(0) <- @3 @34 ldop 4(@3) @35 ldop 24(@34) @36 lea 8(@35) @37 st 13489476(0) <- @36 @38 ldop 40(@29) @39 ldop 108(@38) @40 alloc 4 @41 st 0(@40) <- @29 @42 st 4(@40) <- @30 @43 lea 12(@39) @44 lea 0(@40) save state: @45 def @29 @46 def @30 @47 ci @43 (@39, @14, @44, @-1) 9:pop 10:returnvoid ...
  6. 6. JIT 2/2 generate <function> () ... @8 alloc 48 MIR→x86 @9 ldop 0(@5) 03D800E5 mov eax, 16(ebp) 03D800E8 mov ecx, 0(eax) ... @40 alloc 8 @41 st 0(@40) <- @29 03D80156 mov -72(ebp), eax @42 st 4(@40) <- @30 03D80159 mov -68(ebp), 14150032 @43 lea 12(@39) @44 lea 0(@40) 03D80160 lea edx, -72(ebp) @45 def @29 @46 def @30 @47 ci @43 (@39, @14, @44, 0) 03D80163 push edx 03D80164 push 1 03D80166 push ecx 03D80167 call 12(ecx) 03D8016A add esp, 12 ... 03D8018B leave 03D8018C ret ...
  7. 7. 本題 : JIT-Aware Programming JIT されないところ ● 似た or 同じバイトコードで異なる JIT 結果 ●
  8. 8. JIT されないところ ● 似た or 同じバイトコードで異なる JIT 結果 ●
  9. 9. JIT されないところ package { ... public class Hello { // Hello$cinit prototype.hello = function() { System.write(quot;Helloquot;); }; ... } } // global$init var h = new Hello(); h.hello();
  10. 10. JIT されないところ ● 似た or 同じバイトコードで異なる JIT 結果 ● 例題 : ➢ メソッド呼び出し w/ メソッド定義いろいろ
  11. 11. メソッド w/ property ... function Hello1() { this.hello = function() { System.write(quot;Helloquot;); }; } function greeting(h) { h.hello(); } greeting(new Hello1()); ... 0:getlocal1 1:callproperty {...}::hello 0 4 ABC Ins. 4:pop 5:returnvoid ...
  12. 12. メソッド w/ property ... 0:getlocal1 @37 use @29 [1] 1:callproperty {public,Hello1.as$1,avmplus}::hello 0 @38 def @37 @39 cm MethodEnv::nullcheck (@3, @37) ... @56 ldop 12(@42) @57 cmop Toplevel::toVTable (@56, @53) ... @61 cm Toplevel::callproperty (@56, ...) 4:pop 5:returnvoid ... @66 ret @18 MIR 命令 : 約 66 ランタイム呼出 : 3
  13. 13. メソッド w/ type ... dynamic public class Hello2 { public function Hello2() { this.hello = function() { System.write(quot;Helloquot;); }; } public static function greeting(h:Hello2) : void { h.hello(); } } ... ... 0:getlocal0 1:pushscope 6 ABC Ins. 2:getlocal1 3:callproperty {...}::hello 0 6:pop 7:returnvoid ...
  14. 14. メソッド w/ type ... 0:getlocal0 @33 use @17 [0] 1:pushscope 2:getlocal1 @34 use @22 [1] 3:callproperty {...}::hello 0 ... @61 cm Toplevel::callproperty (@54, @50, ...) 6:pop 7:returnvoid ...; error handling follows ... @66 ret @11 ... @68 cm MethodEnv::npe (@3); null-pointer exception ... MIR 命令 : 約 61 (Hello1 - 5) ランタイム呼出 : 1(Hello1 - 2)
  15. 15. Toplevel::callproperty() Atom Toplevel::callproperty(...) { Binding b = getBinding(...); // ハッシュ検索 switch (b&7) { case BIND_METHOD: ... default: ... return AvmCore::atomToScriptObject(base)->callProperty(...); ... } Atom ScriptObject::callProperty(...) {    ...    Atom method = getMultinameProperty(multiname); // ハッシュ検索    ...    return toplevel->op_call(method, argc, argv); } 2 回ハッシュをひく!
  16. 16. メソッド w/ 1 -class method st ... public class Hello3 { public function hello() : void { System.write(quot;Helloquot;); } public static function greeting(h:Hello3) : void { h.hello(); } } ... ... 0:getlocal0 1:pushscope 6 ABC Ins. 2:getlocal1 (== Hello2) 3:callproperty {...}::hello 0 6:pop 7:returnvoid ...
  17. 17. メソッド w/ 1 -class method st ... 0:getlocal0 @33 use @17 [0] 1:pushscope 2:getlocal1 @34 use @22 [1] 3:callproperty {...}::hello 0 ... @35 ucmp @34 @12 ... @47 ci @41 (@38, @12, @42, @-1); call indirect 6:pop 7:returnvoid ... ; error handling follows ... @51 ret @11 ... @53 cm MethodEnv::npe (@3) ... MIR 命令 : 約 53 (Hello2 - 8) ランタイム呼出 : 0 (Hello2 - 1)
  18. 18. 仕組み : アーリーバインド per-class Traits ScriptObject VTable ... method size slot size traits ... GC, etc ... methods... code vtable delegate Another Object instances GCHashtable “foo” slots... Another Object ... Another Object
  19. 19. まとめ : JIT-Aware Programming 一見同じバイトコードでも JIT 結果は色々 ● 型やアーリーバインドを意識する ● ( type, method, slot ) JIT 結果をのぞく ● 速度計測を忘れずに ● (今回やってないけど。)
  20. 20. Happy JIT-ing! おしまい

×