impression du code d'assemblage Java hotspot JIT
J'ai écrit une classe de test très stupide en 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) ;
}
}
Ensuite, je voulais voir le code généré par le Java Hotspot JIT (Client VM build 23.7-b01). J'ai utilisé l'option"-XX:+PrintAssembly " et le hsdis-i386.dll à partir de http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html
Voici la partie intéressante du code généré (j'ai sauté l'initialisation du nouvel objet. EDIT: le code de la méthode subst). Évidemment, ebx est le pointeur "this" et edx est le pointeur vers l'argument.
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
Honnêtement, je ne suis pas très familier avec l'assemblage x86 mais ce code a-t-il un sens pour vous? Que font ces instructions étranges comme "adc BYTE PTR [edx + 8], cl"? Je me serais attendu à quelques instructions FPU.
1 answers
Encore moi. J'ai construit le hsdis-i386.dll utilisant la dernière version de binutils 2.23. C'était plus facile que prévu grâce aux instructions dans http://dropzone.nfshost.com/hsdis.htm (au moins pour la version x86. La version 64 bits compile mais arrête immédiatement la JVM sans aucun message d'erreur)
La sortie semble maintenant beaucoup mieux:
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