Da Vinci MLVM: Interest for an very old language running on an extended JVM

John Rose John.Rose at Sun.COM
Wed Apr 23 00:30:37 PDT 2008


On Apr 18, 2008, at 3:34 AM, Francis ANDRE wrote:

>> The performance story is better too, since whether it's a bytecode or
>> subroutine, you may have to wait for the compiler team to cook up the
>> desired optimizations, but it's usually a shorter wait for the
>> subroutine.  And now that we are open source, you can submit your own
>> patch for the desired compiler intrinsic.  That will always be easier
>> than submitting a patch for a new bytecode.
>
> I am not requesting new opcodes but just relaxing the array type  
> contraint
> of the already existing xALOAD & xASTORE when the VM run a Cobol or  
> C class.

It really amounts to the same complexity as a new opcode, since every  
tool or JVM phase that looks at opcodes may need to know the new usages.

(And in this case, we probably already have intrinsic methods which  
compile to the code you want.  See below.)

> Moreover, the optimization you mention works only with the JIT  
> generation
> while using a relaxed identical opcode will work also in  
> interpreted mode
> (which is a important point for the debugging tool to align the  
> generated
> code with the original source while getting an optimal performance).

It seems to me just as easy to align source code to a BCI which  
contains an invokestatic as a BCI which contains an iaload.

> The problem for packed/zoned data is identical as for integer: just  
> inefficiency
> and performance.

With very few exceptions, the fastest way to get performance on some  
operation is first to name it (as a method), then have the compiler  
treat it as an intrinsic.  Here is a list of all the intrinsics in  
HotSpot (start 50% down around line 416):
   http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/8b0b3490194f/src/ 
share/vm/classfile/vmSymbols.hpp

Some of these have in the past been requested as special bytecodes,  
but they all work better as methods.

By the way, aligned (or on Intel unaligned little-endian) accesses  
can be performed in VM-specific code by operations like  
Unsafe.getInt.  For example, those are used for fast type-punning  
access in NIO buffers.  A NIO byte buffer can be punned (in a type- 
safe way) with an int buffer, to get the kind of accesses you want.   
It is implemented with intrinsics in Unsafe.  There is no need for  
special bytecodes.

> As for integer, there is no problem for getting the rigth semantic  
> with a metadata of the packed/zoned data and subroutines with  
> signature like (byte[], offset, precision, scale and sign) but the  
> assignement/retrieval of value is done on a byte to byte basis  
> which is highly inefficient while a interpreted/compiled opcode  
> could do it efficiently.

And so also do compiled intrinsics provide a way to do these things  
efficiently.  Think of bytecodes as low-level IR, which is very  
expensive to extend, and intrinsic method calls as a higher-level  
extensible part of the IR, which is it easy to extend compatibly.

If there really is a need for interpreted performance (which is in  
practice very rarely demonstrated) the interpreter has ways to treat  
methods as intrinsics also.  This is almost never done.  See enum  
MethodKind in:
   http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/8b0b3490194f/src/ 
share/vm/interpreter/abstractInterpreter.hpp

> More on packed/zoned cobol data in a following mail...
Thank you!

-- John



More information about the mlvm-dev mailing list