5

私はJavaで非常にばかげたテストクラスを書きました:

public class Vector3 {
   public double x,y,z ;

   public Vector3(double x, double y, double z) {
       this.x=x ; this.y=y ; this.z=z ;
   }

   public Vector3 subst(Vector3 v) {
      return new Vector3(x-v.x,y-v.y,z-v.z) ;
   }
}

次に、Java Hotspot JIT (クライアント VM ビルド 23.7-b01) によって生成されたコードを見たいと思いました。「-XX:+PrintAssembly」オプションとhttp://classparser.blogspot.dk/2010/03/hsdis-i386dll.htmlの hsdis-i386.dll を使用しました

生成されたコードの興味深い部分を次に示します (新しいオブジェクトの初期化をスキップしました。編集: subst メソッドのコード)。明らかに、ebx は「this」ポインターであり、edx は引数へのポインターです。

lds    edi,(bad)
sti    
adc    BYTE PTR [ebx+8],al  ;*getfield x
mov    edx,DWORD PTR [esp+56]
lds    edi,(bad)          ; implicit exception: dispatches to 0x02611f2d
sti    
adc    BYTE PTR [edx+8],cl  ;*getfield x
lds    edi,(bad)
sti    
adc    BYTE PTR [ebx+16],dl  ;*getfield y
lds    edi,(bad)
sti    
adc    BYTE PTR [edx+16],bl  ;*getfield y
lds    edi,(bad)
sti    
adc    BYTE PTR [ebx+24],ah  ;*getfield z
lds    edi,(bad)
sti    
adc    BYTE PTR [edx+24],ch  ;*getfield z
lds    edi,(bad)
sti    
pop    esp
rol    ebp,0xfb
adc    DWORD PTR [eax+8],eax  ;*putfield x
lds    ebp,(bad)
jmp    0x02611f66
rol    ebp,cl
sti    
adc    DWORD PTR [eax+16],edx  ;*putfield y
lds    ebx,(bad)
fistp  DWORD PTR [ebp-59]
sti    
adc    DWORD PTR [eax+24],esp  ;*putfield z

正直なところ、私は x86 アセンブリにあまり詳しくありませんが、そのコードは理解できますか? 「adc BYTE PTR [edx+8],cl」のような奇妙な命令は何をしているのですか? 私はいくつかのFPU命令を期待していたでしょう。

4

1 に答える 1

6

私は再び。最新の binutils 2.23 を使用して hsdis-i386.dll をビルドしました。http://dropzone.nfshost.com/hsdis.htmの指示のおかげで、予想よりも簡単でした (少なくとも x86 バージョンの場合。64 ビット バージョンはコンパイルされますが、エラー メッセージが表示されずに JVM がすぐに停止します)。

出力の見栄えが良くなりました。

vmovsd xmm0,QWORD PTR [ebx+0x8]  ;*getfield x
mov    edx,DWORD PTR [esp+0x40]
vmovsd xmm1,QWORD PTR [edx+0x8]  ;*getfield x
vmovsd xmm2,QWORD PTR [ebx+0x10] ;*getfield y
vmovsd xmm3,QWORD PTR [edx+0x10] ;*getfield y
vmovsd xmm4,QWORD PTR [ebx+0x18] ;*getfield z
vmovsd xmm5,QWORD PTR [edx+0x18] ;*getfield z
vsubsd xmm0,xmm0,xmm1
vmovsd QWORD PTR [eax+0x8],xmm0  ;*putfield x
vsubsd xmm2,xmm2,xmm3
vmovsd QWORD PTR [eax+0x10],xmm2 ;*putfield y
vsubsd xmm4,xmm4,xmm5
vmovsd QWORD PTR [eax+0x18],xmm4 ;*putfield z
于 2013-03-12T09:12:38.937 に答える