[lworld] Calling convention - C2 to C1 (oop params)

XMLWordPrintable

    • Type: Sub-task
    • Resolution: Fixed
    • Priority: P4
    • repo-valhalla
    • Affects Version/s: repo-valhalla
    • Component/s: hotspot
    • None

      Implement Method::verified_entry and Method::verified_value_ro_entry for C1-compiled methods. This will take multiple steps.

      For this step, support the passing of scalarized oop parameters. E.g.,

      inline class V {
          Object x = null, y = null;
      }

      class Test {
          static void test(V v1, V v2) {...}
      }

      When C2 calls Test.test, it scalarizes the outgoing parameters to

           param0 = v1.x
           param1 = v1.y
           param2 = v2.x
           param3 = v2.y

      If the method is compiled by C1, it expects the incoming parameters to be

          param0 = v1
          param1 = v2

      So we need to shuffle the parameters like

           V tmp = new V();
           tmp.x = param0; // GC barrier!
           tmp.y = param1; // GC barrier!
           param0 = tmp;
           tmp = new V();
           tmp.x = param2; // GC barrier!
           tmp.y = param3; // GC barrier!
           param1 = tmp;

      Note that GC barrier operations need to be applied when the oop fields of the tmp object are modified.

            Assignee:
            Ioi Lam
            Reporter:
            Ioi Lam
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: