Two threads going now, so I'm going to move exploration and discussion
to this one.
So, I'm reading through MLVM versus 5/13 macosx build amd64 ASM output...
First difference, the < operator logic:
On macosx build:
4619030327: jl 4619034359 ;*ifge
; -
org.jruby.RubyFixnum::op_lt@10 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
4619030333: mov 0x88(%r12,%r11,8),%r10d ;*areturn
; -
org.jruby.RubyBoolean::newBoolean@15 (line 104)
; -
org.jruby.RubyFixnum::op_lt@18 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
4619030341: shl $0x3,%r10 ;*invokevirtual call
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
...
4619034359: mov 0x84(%r12,%r11,8),%r10d ;*getfield trueObject
; -
org.jruby.Ruby::getTrue@1 (line 1750)
; -
org.jruby.RubyBoolean::newBoolean@5 (line 104)
; -
org.jruby.RubyFixnum::op_lt@18 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
4619034367: jmpq 4619030341
And on MLVM:
0x00000001028ac459: jl 0x00000001028ac465 ;*ifge
; -
org.jruby.RubyFixnum::op_lt@10 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
0x00000001028ac45b: mov 0x88(%r12,%r11,8),%r10d ;*getfield falseObject
; -
org.jruby.Ruby::getFalse@1 (line 1757)
; -
org.jruby.RubyBoolean::newBoolean@12 (line 104)
; -
org.jruby.RubyFixnum::op_lt@18 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
0x00000001028ac463: jmp 0x00000001028ac46d
0x00000001028ac465: mov 0x84(%r12,%r11,8),%r10d ;*areturn
; -
org.jruby.RubyBoolean::newBoolean@15 (line 104)
; -
org.jruby.RubyFixnum::op_lt@18 (line 883)
; -
org.jruby.runtime.callsite.LtCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@14 (line 4)
So for whatever reason, macosx and mlvm differ in whether they decide
to load the falseObject or the trueObject for the result of the test.
FWIW, I do intend to use invokedynamic to patch through
boolean-returning calls wherever I'm looking for a boolean value, so
hopefully the use of RubyBoolean and the interface call to isTrue will
go away soon.
Difference number two, how much logic is there before we reach the
first GWT test for recursive fib_ruby call...
On macosx, starting from the end of the RubyFixnum::op_minus call:
4619030611: shl $0x3,%r9 ;*invokevirtual op_minus
; -
org.jruby.runtime.callsite.MinusCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@48 (line 7)
4619030615: mov %r9,0x98(%rsp) ;*invokevirtual call
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@48 (line 7)
4619030623: movsd -0x1df(%rip),%xmm1 # 4619030152
; {section_word}
4619030631: movabs $0x7dc80ac78,%r10 ; {oop(cache [57]
for constant pool [260]/invokedynamic/operands[4] for
'bench/bench_fib_recursive' cache=0x00000007dc80ac78)}
4619030641: mov 0x628(%r10),%r10
4619030648: mov 0x14(%r10),%r8d
4619030652: cmp $0xfebb3c3a,%r8d ; {oop(a
'java/lang/invoke/AdapterMethodHandle')}
4619030659: jne 4619040931 ;*invokedynamic
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
4619030665: mov 0x88(%rsp),%r10
4619030673: mov 0x8(%r10),%r11d ; implicit exception:
dispatches to 4619042117
4619030677: mov 0x40(%r12,%r11,8),%r10
4619030682: mov %r10,0x18(%rsp)
4619030687: movabs $0x7dbcfe460,%r11 ;
{oop('org/jruby/RubyBasicObject')}
4619030697: cmp %r11,%r10
4619030700: jne 4619036937
4619030706: mov 0x88(%rsp),%r10 ;*checkcast
; -
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::test@2 (line
854)
; -
java.lang.invoke.MethodHandle::invokeExact@15
; -
java.lang.invoke.MethodHandleImpl$GuardWithTest::invoke_L5@11 (line
865)
; -
java.lang.invoke.MethodHandle::invokeExact@8
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
And now on MLVM:
0x00000001028ac57e: shl $0x3,%rax ;*invokevirtual op_minus
; -
org.jruby.runtime.callsite.MinusCallSite::call@24 (line 16)
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@48 (line 7)
0x00000001028ac582: mov %rax,0x98(%rsp) ;*invokevirtual call
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@48 (line 7)
0x00000001028ac58a: movabs $0x7dc7991b8,%r10 ; {oop(cache [57]
for constant pool [260]/invokedynamic/operands[4] for
'bench/bench_fib_recursive' cache=0x00000007dc7991b8)}
0x00000001028ac594: mov 0x628(%r10),%r10
0x00000001028ac59b: mov 0x14(%r10),%r8d
0x00000001028ac59f: cmp $0xfeba9520,%r8d ; {oop(a
'java/lang/invoke/AdapterMethodHandle')}
0x00000001028ac5a6: jne 0x00000001028b00d9 ;*invokedynamic
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
0x00000001028ac5ac: mov 0x98(%rsp),%r10
0x00000001028ac5b4: mov 0x8(%r10),%r10d ; implicit exception:
dispatches to 4337632029
0x00000001028ac5b8: mov 0x28(%r12,%r10,8),%r9
0x00000001028ac5bd: lea (%r12,%r10,8),%r11
0x00000001028ac5c1: movabs $0x7dbccf760,%r8 ;
{oop('org/jruby/runtime/builtin/IRubyObject')}
0x00000001028ac5cb: cmp %r8,%r9
0x00000001028ac5ce: jne 0x00000001028adae3 ;*checkcast
; -
java.lang.invoke.MethodHandle::invokeExact@2
; -
java.lang.invoke.MethodHandleImpl$GuardWithTest::invoke_L5@11 (line
987)
; -
java.lang.invoke.MethodHandle::invokeExact@9
; -
java.lang.invoke.MethodHandle::invokeExact@8
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
0x00000001028ac5d4: mov 0x70(%rsp),%r8
0x00000001028ac5d9: mov 0x8(%r8),%r8d ; implicit exception:
dispatches to 4337632069
0x00000001028ac5dd: mov %r8d,0x18(%rsp)
0x00000001028ac5e2: mov 0x28(%r12,%r8,8),%r8
0x00000001028ac5e7: mov 0x18(%rsp),%ebx
0x00000001028ac5eb: lea (%r12,%rbx,8),%rcx
0x00000001028ac5ef: mov %rcx,0x20(%rsp)
0x00000001028ac5f4: movabs $0x7dbccf760,%rcx ;
{oop('org/jruby/runtime/builtin/IRubyObject')}
0x00000001028ac5fe: cmp %rcx,%r8
0x00000001028ac601: jne 0x00000001028adb29 ;*checkcast
; -
java.lang.invoke.MethodHandle::invokeExact@15
; -
java.lang.invoke.MethodHandleImpl$GuardWithTest::invoke_L5@11 (line
987)
; -
java.lang.invoke.MethodHandle::invokeExact@9
; -
java.lang.invoke.MethodHandle::invokeExact@8
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
0x00000001028ac607: movabs $0x7dbccf760,%rcx ;
{oop('org/jruby/runtime/builtin/IRubyObject')}
0x00000001028ac611: cmp %rcx,%r8
0x00000001028ac614: jne 0x00000001028adb75 ;*checkcast
; -
java.lang.invoke.MethodHandle::invokeExact@20
; -
java.lang.invoke.MethodHandleImpl$GuardWithTest::invoke_L5@11 (line
987)
; -
java.lang.invoke.MethodHandle::invokeExact@9
; -
java.lang.invoke.MethodHandle::invokeExact@8
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
0x00000001028ac61a: mov 0x40(%r12,%rbx,8),%rcx
0x00000001028ac61f: mov %rcx,0x28(%rsp)
0x00000001028ac624: movabs $0x7dbd12300,%rbx ;
{oop('org/jruby/RubyBasicObject')}
0x00000001028ac62e: cmp %rbx,%rcx
0x00000001028ac631: jne 0x00000001028af5a5
0x00000001028ac637: mov 0x70(%rsp),%rcx ;*checkcast
; -
org.jruby.runtime.invokedynamic.InvokeDynamicSupport::test@2 (line
854)
; -
java.lang.invoke.MethodHandle::invokeExact@32
; -
java.lang.invoke.MethodHandleImpl$GuardWithTest::invoke_L5@11 (line
987)
; -
java.lang.invoke.MethodHandle::invokeExact@9
; -
java.lang.invoke.MethodHandle::invokeExact@8
; -
bench.bench_fib_recursive::method__0$RUBY$fib_ruby@51 (line 7)
There's substantially more code here. I don't see any jumps that would
short-circuit this logic. Am I reading right?
Now the good news is that after the test is completed I don't see much
additional logic on MLVM before it's back into the inlined recursive
call. Both versions inline a single level of fib_ruby recursion and
then callq the next level of recursion.
So what's up with that logic leading up to test? I assume that's the
new GWT logic, but am I getting that it's a lot more heavyweight than
the old version? Or is some intermediate handle doing extra work?
- Charlie
_______________________________________________
mlvm-dev mailing list
[email protected]
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev