[9] RFR(S): 8075136: Unnecessary sign extension for byte array access
Andrew Dinn
adinn at redhat.com
Tue Mar 17 16:32:07 UTC 2015
On 17/03/15 16:11, Andrew Dinn wrote:
> Apologies for jumping the gun wiht my previous comment. Having reviewed
> the earlier traffic in this thread I now understand why the two new
> rules are needed (i.e. to deal with the case where there is no LShift in
> the matched operand). Since they require use of an offset and an
> (unscaled) index register both these new operands will need to be
> encoded using two instructions. So that has two implications:
>
> The cost of the operand will need to be INSN_COST to account for the
> extra add.
>
> The encoding function loadStore (the first one which operates on integer
> registers but not the second one which operates on float registers) will
> need to be updated to recognise these two operand types and pass in a
> zero scaling:
>
> . . .
> switch (opcode) {
> case INDINDEXSCALEDOFFSETI2L:
> case INDINDEXSCALEDI2L:
> case INDINDEXSCALEDOFFSETI2LN:
> case INDINDEXSCALEDI2LN:
> scale = Address::sxtw(size);
> break;
> + case INDINDEXOFFSETI2L:
> + case INDINDEXOFFSETI2LN:
> + scale = Address::lsl(0);
> + break;
> default:
> scale = Address::lsl(size);
> . . .
>
> [as Andrew Haley's comment points out the need for case handling here is
> horribly ugly].
Doh, apologies -- I'm afraid I am still one step behind!
The two new rules both specify an unscaled 32-bit integer register as
index and, of course, the scale value is installed as 0 in the rule. So,
the correct patch to function storeLoad is to include these two switch
cases in the set which specify a sign-extend:
. . .
switch (opcode) {
case INDINDEXSCALEDOFFSETI2L:
case INDINDEXSCALEDI2L:
case INDINDEXSCALEDOFFSETI2LN:
case INDINDEXSCALEDI2LN:
+ case INDINDEXOFFSETI2L:
+ case INDINDEXOFFSETI2LN:
scale = Address::sxtw(size);
break;
default:
scale = Address::lsl(size);
. . .
regards,
Andrew Dinn
-----------
Senior Principal Software Engineer
Red Hat UK Ltd
Registered in UK and Wales under Company Registration No. 3798903
Directors: Michael Cunningham (USA), Matt Parson (USA), Charlie Peters
(USA), Michael O'Neill (Ireland)
More information about the hotspot-compiler-dev
mailing list