src/share/vm/interpreter/abstractInterpreter.hpp

changeset 1161
be93aad57795
parent 1145
e5b0439ef4ae
child 1335
9987d9d5eb0e
     1.1 --- a/src/share/vm/interpreter/abstractInterpreter.hpp	Mon Apr 20 14:48:03 2009 -0700
     1.2 +++ b/src/share/vm/interpreter/abstractInterpreter.hpp	Tue Apr 21 23:21:04 2009 -0700
     1.3 @@ -217,6 +217,73 @@
     1.4              stackElementSize()) + tag_offset_in_bytes();
     1.5    }
     1.6  
     1.7 +  // access to stacked values according to type:
     1.8 +  static oop* oop_addr_in_slot(intptr_t* slot_addr) {
     1.9 +    return (oop*) slot_addr;
    1.10 +  }
    1.11 +  static jint* int_addr_in_slot(intptr_t* slot_addr) {
    1.12 +    if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different())
    1.13 +      // big-endian LP64
    1.14 +      return (jint*)(slot_addr + 1) - 1;
    1.15 +    else
    1.16 +      return (jint*) slot_addr;
    1.17 +  }
    1.18 +  static jlong long_in_slot(intptr_t* slot_addr) {
    1.19 +    if (sizeof(intptr_t) >= sizeof(jlong)) {
    1.20 +      return *(jlong*) slot_addr;
    1.21 +    } else if (!TaggedStackInterpreter) {
    1.22 +      return Bytes::get_native_u8((address)slot_addr);
    1.23 +    } else {
    1.24 +      assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
    1.25 +      // assemble the long in memory order (not arithmetic order)
    1.26 +      union { jlong j; jint i[2]; } u;
    1.27 +      u.i[0] = (jint) slot_addr[0*stackElementSize()];
    1.28 +      u.i[1] = (jint) slot_addr[1*stackElementSize()];
    1.29 +      return u.j;
    1.30 +    }
    1.31 +  }
    1.32 +  static void set_long_in_slot(intptr_t* slot_addr, jlong value) {
    1.33 +    if (sizeof(intptr_t) >= sizeof(jlong)) {
    1.34 +      *(jlong*) slot_addr = value;
    1.35 +    } else if (!TaggedStackInterpreter) {
    1.36 +      Bytes::put_native_u8((address)slot_addr, value);
    1.37 +    } else {
    1.38 +      assert(sizeof(intptr_t) * 2 == sizeof(jlong), "ILP32");
    1.39 +      // assemble the long in memory order (not arithmetic order)
    1.40 +      union { jlong j; jint i[2]; } u;
    1.41 +      u.j = value;
    1.42 +      slot_addr[0*stackElementSize()] = (intptr_t) u.i[0];
    1.43 +      slot_addr[1*stackElementSize()] = (intptr_t) u.i[1];
    1.44 +    }
    1.45 +  }
    1.46 +  static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
    1.47 +    switch (type) {
    1.48 +    case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr);            break;
    1.49 +    case T_CHAR:    value->c = *int_addr_in_slot(slot_addr);            break;
    1.50 +    case T_BYTE:    value->b = *int_addr_in_slot(slot_addr);            break;
    1.51 +    case T_SHORT:   value->s = *int_addr_in_slot(slot_addr);            break;
    1.52 +    case T_INT:     value->i = *int_addr_in_slot(slot_addr);            break;
    1.53 +    case T_LONG:    value->j = long_in_slot(slot_addr);                 break;
    1.54 +    case T_FLOAT:   value->f = *(jfloat*)int_addr_in_slot(slot_addr);   break;
    1.55 +    case T_DOUBLE:  value->d = jdouble_cast(long_in_slot(slot_addr));   break;
    1.56 +    case T_OBJECT:  value->l = (jobject)*oop_addr_in_slot(slot_addr);   break;
    1.57 +    default:        ShouldNotReachHere();
    1.58 +    }
    1.59 +  }
    1.60 +  static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) {
    1.61 +    switch (type) {
    1.62 +    case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0);     break;
    1.63 +    case T_CHAR:    *int_addr_in_slot(slot_addr) = value->c;            break;
    1.64 +    case T_BYTE:    *int_addr_in_slot(slot_addr) = value->b;            break;
    1.65 +    case T_SHORT:   *int_addr_in_slot(slot_addr) = value->s;            break;
    1.66 +    case T_INT:     *int_addr_in_slot(slot_addr) = value->i;            break;
    1.67 +    case T_LONG:    set_long_in_slot(slot_addr, value->j);              break;
    1.68 +    case T_FLOAT:   *(jfloat*)int_addr_in_slot(slot_addr) = value->f;   break;
    1.69 +    case T_DOUBLE:  set_long_in_slot(slot_addr, jlong_cast(value->d));  break;
    1.70 +    case T_OBJECT:  *oop_addr_in_slot(slot_addr) = (oop) value->l;      break;
    1.71 +    default:        ShouldNotReachHere();
    1.72 +    }
    1.73 +  }
    1.74  };
    1.75  
    1.76  //------------------------------------------------------------------------------------------------------------------------

mercurial