src/share/vm/opto/vectornode.cpp

changeset 4204
b2c669fd8114
parent 4201
aaeb9add1ab3
child 6876
710a3c8b516e
child 7859
c1c199dde5c9
     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();

mercurial