2013-03-11 23 views
5

Java Çok aptal bir test sınıfı yazdı: baskı Java hotspot JIT derleme kod

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) ; 
    } 
} 

Sonra Java Hotspot JIT (Müşteri VM 23.7-b01 inşa) tarafından oluşturulan kodu görmek istedim. üretilen kod ilginç kısmı (yeni nesnenin başlatma atlanır edilir: "+ PrintAssembly -XX" seçeneğini ve burada http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html

gelen hsdis-i386.dll EDIT: Ben kullandı. kod için alt yöntem). Açıkçası, ebx "bu" işaretçisidir ve edx argümanın işaretçisidir.

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 

Açıkçası, x86 ile birlikte çok bildik değilim ama bu kod size mantıklı geliyor? "Adc BYTE PTR [edx + 8], cl" gibi garip talimatlar neler yapıyor? Bazı FPU talimatlarını beklerdim.

+0

"Assembly" sorunuzu etiketlerseniz daha iyi yanıtlar alabilirsiniz. – assylias

+0

Bana göre bu derleme kodu bir anlam ifade etmiyor. HotSpot tarafından üretilen gerçek yürütülebilir kod olduğundan şüphem var. – NPE

+3

Sökücünüzün makine kodunu doğru bir şekilde yorumlayamadığından şüpheleniyorum. 'LDS'' için opcode' 0xc5'' dir, ancak bu aynı zamanda daha yeni x86 CPU'larda bir [2 baytlık VEX öneki] (http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes) olabilir. – Michael

cevap

6

Yine ben. En son binutils 2.23 kullanarak hsdis-i386.dll oluşturduk. O (. 64-bit sürümü derler en azından x86 sürümü için ancak herhangi bir hata iletisi hemen JVM durdurur) Ben http://dropzone.nfshost.com/hsdis.htm talimatlara sayesinde beklenenden daha kolaydı çıktı şimdi çok daha iyi görünüyor

:

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 
+0

* Çok * daha makul görünüyor (+1) – NPE

+0

Gerçekten :) Basit bir raytracer programladım ve bu özellik sayesinde JIT'in nasıl çalıştığını görmek güzel. Vector3 gibi sınıflar, alt sınıfları olmadığı için tamamen satır içidir. SSE2 uzantıları bir çeşit "süper FPU" olarak kullanılır. Biraz hayal kırıklığı yaratan bir şey: Vector3'ün yapıcısında, JIT kodu her zaman ilk olarak this.x, this.y, this.z değerini "yeni Vector3" te (xv.x, yv.y, zv.z) bile ayarlar. ". Her biri 8 baytlık üç adet gereksiz bellek girişi. – trunklop

+0

Müthiş. Cevabı göndermek için zaman ayırdığınız için aferin. – NPE