Top


定義場所(file name)

hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp

名前(function name)

void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
                                               Register method,
                                               Register itable_index,
                                               Register flags,
                                               bool is_invokevirtual,
                                               bool is_invokevfinal, /*unused*/
                                               bool is_invokedynamic) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      // setup registers
      const Register cache = rcx;
      const Register index = rdx;

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert_different_registers(method, flags);
      assert_different_registers(method, cache, index);
      assert_different_registers(itable_index, flags);
      assert_different_registers(itable_index, cache, index);

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      // determine constant pool cache field offsets
      const int method_offset = in_bytes(
        constantPoolCacheOopDesc::base_offset() +
          (is_invokevirtual
           ? ConstantPoolCacheEntry::f2_offset()
           : ConstantPoolCacheEntry::f1_offset()));
      const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
                                        ConstantPoolCacheEntry::flags_offset());
      // access constant pool cache fields
      const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
                                        ConstantPoolCacheEntry::f2_offset());

  {- -------------------------------------------
  (1) コード生成:
      「対応する CPCache entry をロードした後 (ロード先は Rcache), 
        引数の Rmethod で指定されたレジスタに, CPCache entry の f1 または f2 フィールドの値をロード(??? #TODO)」
       (invokevirtual の場合には f2 フィールド, そうでない場合には f1 フィールドをロード)

       (なお, 引数の byte_no が...の場合には, ...#TODO)
      ---------------------------------------- -}

      if (byte_no == f1_oop) {
        // Resolved f1_oop goes directly into 'method' register.
        assert(is_invokedynamic, "");
        resolve_cache_and_index(byte_no, method, cache, index, sizeof(u4));
      } else {
        resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
        __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
      }

  {- -------------------------------------------
  (1) コード生成: (ただし, 引数の itable_index が noreg の場合には生成しない)
      「引数の itable_index で指定されたレジスタに, CPCache entry の f2 フィールドの値をロード」
      ---------------------------------------- -}

      if (itable_index != noreg) {
        __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
      }

  {- -------------------------------------------
  (1) コード生成:
      「引数の flags で指定されたレジスタに, CPCache entry の flags フィールドの値をロード」
      ---------------------------------------- -}

      __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.