< prev index next >

src/cpu/x86/vm/sharedRuntime_x86_64.cpp

Print this page

        

@@ -481,10 +481,11 @@
       break;
     case T_LONG:
       assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
       // fall through
     case T_OBJECT:
+    case T_VALUETYPE:
     case T_ARRAY:
     case T_ADDRESS:
     case T_VALUETYPEPTR:
       if (int_args < Argument::n_int_register_parameters_j) {
         regs[i].set2(INT_ArgReg[int_args++]->as_VMReg());

@@ -891,11 +892,11 @@
           ignored++;
         } else {
           int off = sig_extended.at(next_arg_comp)._offset;
           assert(off > 0, "offset in object should be positive");
           size_t size_in_bytes = is_java_primitive(bt) ? type2aelembytes(bt) : wordSize;
-          bool is_oop = (bt == T_OBJECT || bt == T_ARRAY);
+          bool is_oop = (bt == T_OBJECT || bt == T_VALUETYPEPTR || bt == T_ARRAY);
           has_oop_field = has_oop_field || is_oop;
           gen_c2i_adapter_helper(masm, bt, next_arg_comp > 0 ? sig_extended.at(next_arg_comp-1)._bt : T_ILLEGAL,
                                  size_in_bytes, regs[next_arg_comp-ignored], Address(r11, off), extraspace, is_oop);
         }
       } while (vt != 0);

@@ -1150,11 +1151,11 @@
           ignored++;
         } else {
           int off = sig_extended.at(next_arg_comp)._offset;
           assert(off > 0, "offset in object should be positive");
           size_t size_in_bytes = is_java_primitive(bt) ? type2aelembytes(bt) : wordSize;
-          bool is_oop = (bt == T_OBJECT || bt == T_ARRAY);
+          bool is_oop = (bt == T_OBJECT || bt == T_VALUETYPEPTR || bt == T_ARRAY);
           gen_i2c_adapter_helper(masm, bt, prev_bt, size_in_bytes, regs[next_arg_comp - ignored], Address(r10, off), is_oop);
         }
       } while (vt != 0);
     }
   }

@@ -1245,10 +1246,14 @@
     sig_str[idx++] = '(';
     for (int index = 0; index < length; index++) {
       BasicType bt = sig_extended.at(index)._bt;
       if (bt == T_VALUETYPE) {
         has_value_argument = true;
+      } else if (bt == T_VALUETYPEPTR) {
+        // non-flattened value type field
+        sig_str[idx++] = type2char(T_VALUETYPE);
+        sig_str[idx++] = ';';
       } else if (bt == T_VOID) {
         // Ignore
       } else {
         if (bt == T_ARRAY) {
           bt = T_OBJECT; // We don't know the element type, treat as Object

@@ -4198,11 +4203,11 @@
     Address to(rax, off);
     if (bt == T_FLOAT) {
       __ movflt(to, r_1->as_XMMRegister());
     } else if (bt == T_DOUBLE) {
       __ movdbl(to, r_1->as_XMMRegister());
-    } else if (bt == T_OBJECT || bt == T_ARRAY) {
+    } else if (bt == T_OBJECT || bt == T_VALUETYPEPTR || bt == T_ARRAY) {
       __ store_heap_oop(to, r_1->as_Register());
     } else {
       assert(is_java_primitive(bt), "unexpected basic type");
       size_t size_in_bytes = type2aelembytes(bt);
       __ store_sized_value(to, r_1->as_Register(), size_in_bytes);

@@ -4235,11 +4240,11 @@
     Address from(rax, off);
     if (bt == T_FLOAT) {
       __ movflt(r_1->as_XMMRegister(), from);
     } else if (bt == T_DOUBLE) {
       __ movdbl(r_1->as_XMMRegister(), from);
-    } else if (bt == T_OBJECT || bt == T_ARRAY) {
+    } else if (bt == T_OBJECT || bt == T_VALUETYPEPTR || bt == T_ARRAY) {
       __ load_heap_oop(r_1->as_Register(), from);
     } else {
       assert(is_java_primitive(bt), "unexpected basic type");
       size_t size_in_bytes = type2aelembytes(bt);
       __ load_sized_value(r_1->as_Register(), from, size_in_bytes, bt != T_CHAR && bt != T_BOOLEAN);
< prev index next >