> On Feb 19, 2016, at 9:03 AM, John Rose <john.r.r...@oracle.com> wrote:
> 
> On Feb 19, 2016, at 9:57 AM, Christian Thalinger 
> <christian.thalin...@oracle.com <mailto:christian.thalin...@oracle.com>> 
> wrote:
>> 
>> Why don’t you change the values to:
>> 
>>    static final byte LATIN1 = 1;
>>    static final byte UTF16  = 2;
> 
> 
> Not sure what you are asking, but here's my take on why 0,1 is the (slight) 
> winner.
> The values 0,1 are the log2 of the array element sizes 1,2, so they can be 
> used with shift instructions.
> With 1,2 they would have to be used with multiply instructions, or else 
> tweaked back to shift inputs.
> Most loops will speculate on the scale factor, but those loops which must 
> work with a non-constant scale will be slightly cleaner with 0,1.

I see what you are saying:

  int len = val.length >> coder;  // assume LATIN1=0/UTF16=1;

But if coder is stable for both values the compiler can constant fold the 
if-statement for the shift value:

  int len = val.length >> (coder == LATIN1 ? 0 : 1);

That should produce the same code and we would avoid:

143      * Constant-folding this field is handled internally in VM.

Reply via email to