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:
|