< prev index next >

src/share/vm/opto/type.cpp

Print this page




1911 const TypeTuple *TypeTuple::MEMBAR;
1912 const TypeTuple *TypeTuple::STORECONDITIONAL;
1913 const TypeTuple *TypeTuple::START_I2C;
1914 const TypeTuple *TypeTuple::INT_PAIR;
1915 const TypeTuple *TypeTuple::LONG_PAIR;
1916 const TypeTuple *TypeTuple::INT_CC_PAIR;
1917 const TypeTuple *TypeTuple::LONG_CC_PAIR;
1918 
1919 static void collect_value_fields(ciValueKlass* vk, const Type** field_array, uint& pos) {
1920   for (int j = 0; j < vk->nof_nonstatic_fields(); j++) {
1921     ciField* f = vk->nonstatic_field_at(j);
1922     BasicType bt = f->type()->basic_type();
1923     assert(bt < T_VALUETYPE && bt >= T_BOOLEAN, "not yet supported");
1924     field_array[pos++] = Type::get_const_type(f->type());
1925     if (bt == T_LONG || bt == T_DOUBLE) {
1926       field_array[pos++] = Type::HALF;
1927     }
1928   }
1929 }
1930 
1931 // Can a value type instance of this type be returned as multiple
1932 // returned values?
1933 static bool vt_can_be_returned_as_fields(ciValueKlass* vk) {
1934   if (vk == ciEnv::current()->___Value_klass()) {
1935     return false;
1936   }
1937 
1938   ResourceMark rm;
1939   uint args = vk->value_arg_slots() + 1 /* return vk as well */;
1940 
1941   BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, args);
1942   VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, args);
1943 
1944   sig_bt[0] = T_METADATA;
1945   for (uint i = 0, j = 1; i < (uint)vk->nof_nonstatic_fields(); i++) {
1946     BasicType bt = vk->nonstatic_field_at(i)->layout_type();
1947     assert(i+j < args, "out of bounds access");
1948     sig_bt[i+j] = bt;
1949     if (bt == T_LONG || bt == T_DOUBLE) {
1950       j++;
1951       assert(i+j < args, "out of bounds access");
1952       sig_bt[i+j] = T_VOID;
1953     }
1954   }
1955 
1956   if (SharedRuntime::java_return_convention(sig_bt, regs, args) <= 0) {
1957     return false;
1958   }
1959 
1960   return true;
1961 }
1962 
1963 
1964 //------------------------------make-------------------------------------------
1965 // Make a TypeTuple from the range of a method signature
1966 const TypeTuple *TypeTuple::make_range(ciSignature* sig, bool ret_vt_fields) {
1967   ciType* return_type = sig->return_type();
1968   uint arg_cnt = 0;
1969   if (ret_vt_fields) {
1970     ret_vt_fields = return_type->is_valuetype() && vt_can_be_returned_as_fields((ciValueKlass*)return_type);
1971   }
1972   if (ret_vt_fields) {
1973     ciValueKlass* vk = (ciValueKlass*)return_type;
1974     arg_cnt = vk->value_arg_slots()+1;
1975   } else {
1976     arg_cnt = return_type->size();
1977   }
1978 
1979   const Type **field_array = fields(arg_cnt);
1980   switch (return_type->basic_type()) {
1981   case T_LONG:
1982     field_array[TypeFunc::Parms]   = TypeLong::LONG;
1983     field_array[TypeFunc::Parms+1] = Type::HALF;
1984     break;
1985   case T_DOUBLE:
1986     field_array[TypeFunc::Parms]   = Type::DOUBLE;
1987     field_array[TypeFunc::Parms+1] = Type::HALF;
1988     break;
1989   case T_OBJECT:
1990   case T_ARRAY:




1911 const TypeTuple *TypeTuple::MEMBAR;
1912 const TypeTuple *TypeTuple::STORECONDITIONAL;
1913 const TypeTuple *TypeTuple::START_I2C;
1914 const TypeTuple *TypeTuple::INT_PAIR;
1915 const TypeTuple *TypeTuple::LONG_PAIR;
1916 const TypeTuple *TypeTuple::INT_CC_PAIR;
1917 const TypeTuple *TypeTuple::LONG_CC_PAIR;
1918 
1919 static void collect_value_fields(ciValueKlass* vk, const Type** field_array, uint& pos) {
1920   for (int j = 0; j < vk->nof_nonstatic_fields(); j++) {
1921     ciField* f = vk->nonstatic_field_at(j);
1922     BasicType bt = f->type()->basic_type();
1923     assert(bt < T_VALUETYPE && bt >= T_BOOLEAN, "not yet supported");
1924     field_array[pos++] = Type::get_const_type(f->type());
1925     if (bt == T_LONG || bt == T_DOUBLE) {
1926       field_array[pos++] = Type::HALF;
1927     }
1928   }
1929 }
1930 

































1931 //------------------------------make-------------------------------------------
1932 // Make a TypeTuple from the range of a method signature
1933 const TypeTuple *TypeTuple::make_range(ciSignature* sig, bool ret_vt_fields) {
1934   ciType* return_type = sig->return_type();
1935   uint arg_cnt = 0;
1936   if (ret_vt_fields) {
1937     ret_vt_fields = return_type->is_valuetype() && ((ciValueKlass*)return_type)->can_be_returned_as_fields();
1938   }
1939   if (ret_vt_fields) {
1940     ciValueKlass* vk = (ciValueKlass*)return_type;
1941     arg_cnt = vk->value_arg_slots()+1;
1942   } else {
1943     arg_cnt = return_type->size();
1944   }
1945 
1946   const Type **field_array = fields(arg_cnt);
1947   switch (return_type->basic_type()) {
1948   case T_LONG:
1949     field_array[TypeFunc::Parms]   = TypeLong::LONG;
1950     field_array[TypeFunc::Parms+1] = Type::HALF;
1951     break;
1952   case T_DOUBLE:
1953     field_array[TypeFunc::Parms]   = Type::DOUBLE;
1954     field_array[TypeFunc::Parms+1] = Type::HALF;
1955     break;
1956   case T_OBJECT:
1957   case T_ARRAY:


< prev index next >