Very cool stuff, Jim and Rickard! I guess people are going to start missing NaN 
encoded tagged value/pointers now that there's something real to play with ;-) 
@Remi The subclass suggestion sounds a lot like Maxine's Hybrid objects, where 
named fields and an untyped array is bundled into a single object. Which pretty 
much emulates what people like to do in C/C++, something nice to have. > I 
think that getValue()/setValue() should return the long with the bit set 
because > If i want to execute x + 1, I can convert it to x + 2 at compile time 
thus avoid the shifts at runtime. Even without changing the API, this kind of 
transformation could easily be intrinsified in the JITs, not a big worry. 
Cheers, Raven ------------------ Original ------------------ From:  "Rémi 
Fora"; Date:  Mon, Jul 2, 2012 09:57 PM To:  "mlvm-dev";  Subject:  Re: 
TaggedArrays (Proposal) On 07/02/2012 03:05 PM, Jim Laskey wrote: > During a 
week in the rarefied air of Stockholm back in May, a  > sleepless night got me 
thinking.  The day after that, the thinking  > became a reality.  I've been 
sitting on the code since, not sure what  > to do next.  So..., why not start 
the month leading up to the JVMLS  > with a discussion about dynamic values. > 
> Every jLanguage developer knows that primitive boxing is the enemy.  >  Even 
more so for untyped languages.  We need a way to interleave  > primitive types 
with references. > > Tagged values (value types) for dynamic languages have 
been approached  > from a dozen different angles over the history of Java.  
However, no  > one seems to be satisfied with any of the proposals so far.  
Either  > the implementation is too limiting for the language developer or too  
> complex to implement. > > Most recently, John (Rose) proposed hiding value 
tagging in the JVM  > via the Integer/Long/Float/Double.valueof methods.  I saw 
a few issues  > with this proposal.  First, the implementation works 
differently on 32  > bit and 64 bit platforms (only half a solution on each).  
Secondly,  > control of the tag bits is hidden such that it doesn't give a 
language  > implementor any leeway on bit usage.  Finally, it will take a long  
> time for it to get introduced into the JVM.  The implementation is  > 
complex, scattered all over the VM and will lead to a significant  > multiplier 
for testing coverage. but it will also help Java perf. > > It occurred to me on 
that sleepless Monday night, that the solution  > for most dynamic languages 
could be so much simpler.  First, we have  > to look at what it is we really 
need.  Ultimately it's about boxing.  >  We want to avoid allocating memory 
whenever we need to store a  > primitive value in an object.  Concerning 
ourselves with passing  > around tagged values in registers and storing in 
stack frames is all  > red herring.  All that is needed is a mechanism for 
storing tagged  > values (or compressed values) in a no-type slot of a generic 
object.  >  Thinking about it in these terms isolates all issues to a single  > 
array-like class, and thus simplifies implementation and simplifies  > testing. 
 Instances of this class can be used as objects, as stack  > frames and even 
full stacks.  A good percentage of a dynamic language  > needs are covered. 
using it as a stack frames will require a pretty good escape analysis if  you 
want same perf as the native stack or is there a trick somewhere ? But given 
that there is a trick to avoid boxing for local variables (see  my talk at next 
JVM Summit), having an array like this just for storing fields is enough to 
pull its  weight. > > So, Rickard Bäckman (also of Oracle) and I defined an API 
and  > implemented (in HotSpot) an interface called TaggedArray.  >  
Conceptional, TaggedArray is a fixed array of no-type slots (64-bit),  > where 
each slot can contain either a reference or a tagged long value  > (least 
significant bit set.)  Internally, TaggedArray class's doOop  > method knows 
that it should skip any 64-bit value with the least  > significant bit set.  
How the language developer uses the other 63  > bits is up to them.  References 
are just addresses.  On 32 bit  > machines, the address (or packed address) is 
stored in the high  > 32-bits (user has no access)  So there is no interference 
with the tag  > bit. > > We supply four implementations of the API.  1) is a 
naive two parallel  > arrays (one Object[], one long[]) implementation for 
platforms not  > supporting TaggedArrays (and JDK 1.7), 2) an optimized version 
of 1)  >  that allocates each array on demand, 3) a JNI implementation  > 
(minimally needed for the interpreter) that uses the native  > implementation 
and 4) the native implementation that is recognized by  > both the C1/C2 
compilers (effort only partially completed.)  In  > general, the implementation 
choice is transparent to the user (optimal  > choice.) Being able to subclass 
it in order to add fixed field like a metaclass  field, i.e a field that is 
always a reference, would be cool too. About the API, the two method set should 
be setValue()/setReference(). I think that getValue()/setValue() should return 
the long with the bit  set because If i want to execute x + 1, I can convert it 
to x + 2 at compile time  thus avoid the shifts at runtime. > > I've enclosed a 
JavaDoc and the roughed out source.  For discussion.  >  Fire away. > > Cheers, 
> > -- Jim cheers, Rémi _______________________________________________ 
mlvm-dev mailing list mlvm-dev@openjdk.java.net 
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to