1.1 --- a/src/share/vm/opto/vectornode.cpp Mon Oct 22 16:56:03 2012 -0700 1.2 +++ b/src/share/vm/opto/vectornode.cpp Tue Oct 23 13:06:37 2012 -0700 1.3 @@ -103,9 +103,9 @@ 1.4 return Op_LShiftVL; 1.5 case Op_RShiftI: 1.6 switch (bt) { 1.7 - case T_BOOLEAN: 1.8 + case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value 1.9 + case T_CHAR: return Op_URShiftVS; // char is unsigned value 1.10 case T_BYTE: return Op_RShiftVB; 1.11 - case T_CHAR: 1.12 case T_SHORT: return Op_RShiftVS; 1.13 case T_INT: return Op_RShiftVI; 1.14 } 1.15 @@ -115,10 +115,14 @@ 1.16 return Op_RShiftVL; 1.17 case Op_URShiftI: 1.18 switch (bt) { 1.19 - case T_BOOLEAN: 1.20 - case T_BYTE: return Op_URShiftVB; 1.21 - case T_CHAR: 1.22 - case T_SHORT: return Op_URShiftVS; 1.23 + case T_BOOLEAN:return Op_URShiftVB; 1.24 + case T_CHAR: return Op_URShiftVS; 1.25 + case T_BYTE: 1.26 + case T_SHORT: return 0; // Vector logical right shift for signed short 1.27 + // values produces incorrect Java result for 1.28 + // negative data because java code should convert 1.29 + // a short value into int value with sign 1.30 + // extension before a shift. 1.31 case T_INT: return Op_URShiftVI; 1.32 } 1.33 ShouldNotReachHere();