I've just discovered that while the spec specified that vaload and vastore takes a constant class as parameter, the implementation use vaload and vastore with no parameter (like aaload, aastore).
Let see the tradeoffs: 1/ vaload/vastore <empty> has the same bytecode shape as the other *aload/*astore, need to get the header of the array to find how to shift from one array cell to another, it also mean you call the same vaload/vastore at a bci with array of different value types, which is pure evil from the JIT POV. I believe it's only true if the verifier is deactivated otherwise, you need to have a stackframe when joining two different kinds of array. 2/ vaload/vastore valueref has the same model as the other *aload/*astore bytecode, you can precompute the shift from one array cell to another. so apart from the size of the opcodes, i think i prefer the solution 2. Do i miss something ? regards, RĂ©mi