2013-03-11 6 views
5

मैं जावा में एक बहुत ही बेवकूफ परीक्षण वर्ग ने लिखा है:मुद्रण जावा हॉटस्पॉट JIT विधानसभा कोड

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

तब मैं जावा हॉटस्पॉट JIT (क्लाइंट वी एम का निर्माण 23.7-B01) द्वारा बनाया गया कोड देखना चाहती थी। मैंने "-XX: + PrintAssembly" विकल्प और hsdis-i386.dll http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html

यहां जेनरेट कोड का दिलचस्प हिस्सा है (मैंने नई ऑब्जेक्ट की शुरुआत को छोड़ दिया है। संपादित करें: कोड के लिए कोड सबस्ट विधि)। जाहिर है, ईबीएक्स "यह" सूचक है और 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 असेंबली के साथ बहुत familar नहीं हूँ, लेकिन क्या यह कोड आपको समझ में आता है? "एडीसी BYTE पीटीआर [edx + 8], सीएल" जैसे उन अजीब निर्देश क्या हैं? मुझे कुछ एफपीयू निर्देशों की उम्मीद होगी।

+0

यदि आप अपना प्रश्न 'असेंबली' टैग करते हैं तो आपको बेहतर उत्तर मिल सकते हैं। – assylias

+0

मेरे लिए, इस असेंबली कोड को कोई समझ नहीं आता है। मुझे संदेह है कि यह हॉटस्पॉट द्वारा उत्पन्न वास्तविक निष्पादन योग्य कोड है। – NPE

+3

मुझे संदेह है कि आपका डिस्सेबलर मशीन कोड को सही तरीके से समझने में असमर्थ है। 'एलडीएस' के लिए ओपोड' 0xc5' है, लेकिन यह एक नए x86 CPUs पर एक [2-बाइट वेक्स उपसर्ग] (http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes) भी हो सकता है। – Michael

उत्तर

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

ऐसा लगता है * बहुत * अधिक व्यावहारिक (+1) – NPE

+0

दरअसल :) मैंने एक साधारण रेट्रेटर प्रोग्राम किया है और यह देखना अच्छा लगता है कि जेआईटी इस सुविधा के लिए धन्यवाद कैसे काम करता है। वेक्टर 3 जैसी कक्षाएं पूरी तरह से रेखांकित हैं क्योंकि उनके पास कोई सबक्लास नहीं है। एसएसई 2 एक्सटेंशन का उपयोग "सुपर एफपीयू" के रूप में किया जाता है। कुछ निराशाजनक: वेक्टर 3 के कन्स्ट्रक्टर में, जेआईटी कोड हमेशा पहले यह .x, this.y, this.z से 0.0 सेट करता है, यहां तक ​​कि "नया वेक्टर 3 (xv.x, yv.y, zv.z) में भी "। तीन अनियंत्रित स्मृति प्रत्येक 8 बाइट्स का उपयोग करती है। – trunklop

+0

बहुत बढ़िया। जवाब पोस्ट करने के लिए समय निकालने के लिए अच्छा किया। – NPE

संबंधित मुद्दे