products/sources/formale Sprachen/Java/openjdk-20-36_src/src/hotspot/share/prims image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: vmstorage.hpp   Sprache: C

/*
 * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


#ifndef SHARE_PRIMS_VMSTORAGE_HPP
#define SHARE_PRIMS_VMSTORAGE_HPP

#include <cstdint>

#include "code/vmreg.hpp"
#include "utilities/debug.hpp"
#include "utilities/ostream.hpp"

enum class StorageType : int8_t; // defined in arch specific headers

class VMStorage {
public:
  constexpr static StorageType INVALID_TYPE = static_cast<StorageType>(-1);
private:
  StorageType _type;
  // 1 byte of padding
  uint16_t _segment_mask_or_size;
  uint32_t _index_or_offset; // stack offset in bytes for stack storage

  friend bool operator==(const VMStorage& a, const VMStorage& b);

  constexpr inline static bool is_reg(StorageType type);
  constexpr inline static StorageType stack_type();
  constexpr inline static StorageType placeholder_type();
  constexpr inline static StorageType frame_data_type();
public:
  constexpr VMStorage() : _type(INVALID_TYPE), _segment_mask_or_size(0), _index_or_offset(0) {};
  constexpr VMStorage(StorageType type, uint16_t segment_mask_or_size, uint32_t index_or_offset)
    : _type(type), _segment_mask_or_size(segment_mask_or_size), _index_or_offset(index_or_offset) {};

  constexpr static VMStorage reg_storage(StorageType type, uint16_t segment_mask, uint32_t index) {
    assert(is_reg(type), "must be reg");
    return VMStorage(type, segment_mask, index);
  }

  constexpr static VMStorage stack_storage(uint16_t size, uint32_t offset) {
    return VMStorage(stack_type(), size, offset);
  }

  static VMStorage stack_storage(VMReg reg) {
    return stack_storage(BytesPerWord, checked_cast<uint16_t>(reg->reg2stack() * VMRegImpl::stack_slot_size));
  }

  constexpr static VMStorage invalid() {
    VMStorage result;
    result._type = INVALID_TYPE;
    return result;
  }

  StorageType type() const { return _type; }

  // type specific accessors to make calling code more readable
  uint16_t segment_mask()    const { assert(is_reg(), "must be reg");                  return _segment_mask_or_size; }
  uint16_t stack_size()      const { assert(is_stack() || is_frame_data(), "must be"); return _segment_mask_or_size; }
  uint32_t index()           const { assert(is_reg() || is_placeholder(), "must be");  return _index_or_offset; }
  uint32_t offset()          const { assert(is_stack() || is_frame_data(), "must be"); return _index_or_offset; }
  uint32_t index_or_offset() const { assert(is_valid(), "must be valid");              return _index_or_offset; }

  bool is_valid()       const { return _type != INVALID_TYPE; }
  bool is_reg()         const { return is_reg(_type); }
  bool is_stack()       const { return _type == stack_type(); }
  bool is_placeholder() const { return _type == placeholder_type(); }
  bool is_frame_data()  const { return _type == frame_data_type(); }

  void print_on(outputStream* os) const;
};

inline bool operator==(const VMStorage& a, const VMStorage& b) {
  return a._type == b._type
    && a._index_or_offset == b._index_or_offset
    && a._segment_mask_or_size == b._segment_mask_or_size;
}

#include CPU_HEADER(vmstorage)

#endif // SHARE_PRIMS_VMSTORAGE_HPP

¤ Dauer der Verarbeitung: 0.19 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff