Mercurial > hg > truffle
diff src/share/vm/opto/vectornode.cpp @ 6893:b2c669fd8114
8001183: incorrect results of char vectors right shift operaiton
Summary: do vector right shift operation for small int types only after loads
Reviewed-by: jrose, dlong
author | kvn |
---|---|
date | Tue, 23 Oct 2012 13:06:37 -0700 |
parents | aaeb9add1ab3 |
children |
line wrap: on
line diff
--- a/src/share/vm/opto/vectornode.cpp Mon Oct 22 16:56:03 2012 -0700 +++ b/src/share/vm/opto/vectornode.cpp Tue Oct 23 13:06:37 2012 -0700 @@ -103,9 +103,9 @@ return Op_LShiftVL; case Op_RShiftI: switch (bt) { - case T_BOOLEAN: + case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value + case T_CHAR: return Op_URShiftVS; // char is unsigned value case T_BYTE: return Op_RShiftVB; - case T_CHAR: case T_SHORT: return Op_RShiftVS; case T_INT: return Op_RShiftVI; } @@ -115,10 +115,14 @@ return Op_RShiftVL; case Op_URShiftI: switch (bt) { - case T_BOOLEAN: - case T_BYTE: return Op_URShiftVB; - case T_CHAR: - case T_SHORT: return Op_URShiftVS; + case T_BOOLEAN:return Op_URShiftVB; + case T_CHAR: return Op_URShiftVS; + case T_BYTE: + case T_SHORT: return 0; // Vector logical right shift for signed short + // values produces incorrect Java result for + // negative data because java code should convert + // a short value into int value with sign + // extension before a shift. case T_INT: return Op_URShiftVI; } ShouldNotReachHere();