Assembler questions
Rémi Forax
forax at univ-mlv.fr
Mon Apr 16 02:59:16 PDT 2012
Hi guys,
I'm trying to read some assembler dump printed by hsdis.
In the snippet below, I don't understand why there is a %r12 in the
middle of the mov.
Is some intermediary result stored in %r12 ?
Is it equivalent to
move 0x8(%r11), %r12
move 0x78(%r12), %rbp ?
Another question more related to the layout of the class in hotspot.
It seems there are two kinds of class pointer, the one with the type
java/lang/Class
and another one used by checkcast (oop('A')).
I suppose it's the same object at two different offsets perhaps the Java
one and the C++ one
but I don't understand why they both exist in the generated code.
And the last question is why the checkcast is not removed because
the test getClass() == A.class is just above.
Is the VM also lost with the double representation of a class ?
regards,
Rémi
0x00007f67a46e326c: mov 0x8(%rsi),%r11d ; implicit exception:
dispatches to 0x00007f67a46e32ea
;; B2: # B7 B3 <- B1 Freq: 0.999999
0x00007f67a46e3270: mov 0x78(%r12,%r11,8),%rbp ;*invokevirtual
getClass
; - RT::classCheck at 1
(line 102)
; -
java.lang.invoke.MethodHandle::invokeExact at 3
; -
java.lang.invoke.MethodHandle::invokeExact at 3
; - IndyTest::test at 1
0x00007f67a46e3275: mov $0x7d6bb4228,%r10 ; {oop(a
'java/lang/Class' = 'A')}
0x00007f67a46e327f: cmp %r10,%rbp
0x00007f67a46e3282: jne 0x00007f67a46e32c9 ;*if_acmpne
; - RT::classCheck at 5
(line 102)
; -
java.lang.invoke.MethodHandle::invokeExact at 3
; -
java.lang.invoke.MethodHandle::invokeExact at 3
; - IndyTest::test at 1
;; B3: # B6 B4 <- B2 Freq: 0.999999
0x00007f67a46e3284: mov 0x40(%r12,%r11,8),%r10
0x00007f67a46e3289: mov $0x77f280d58,%r11 ; {oop('A')}
0x00007f67a46e3293: cmp %r11,%r10
0x00007f67a46e3296: jne 0x00007f67a46e32b4 ;*checkcast
; -
java.lang.invoke.MethodHandle::invokeExact at 1
; -
java.lang.invoke.MethodHandle::invokeExact at 21
; - IndyTest::test at 1
More information about the hotspot-compiler-dev
mailing list