src/hotspot/share/gc/z/zMarkStackEntry.hpp
changeset 58066 8407928b9fe5
parent 50875 2217b2fc29ea
equal deleted inserted replaced
58065:3fee0e6b54f5 58066:8407928b9fe5
    33 //
    33 //
    34 //  Object entry
    34 //  Object entry
    35 //  ------------
    35 //  ------------
    36 //
    36 //
    37 //   6
    37 //   6
    38 //   3                                                                   2 1 0
    38 //   3                                                                  3 2 1 0
    39 //  +---------------------------------------------------------------------+-+-+
    39 //  +--------------------------------------------------------------------+-+-+-+
    40 //  |11111111 11111111 11111111 11111111 11111111 11111111 11111111 111111|1|1|
    40 //  |11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111|1|1|1|
    41 //  +---------------------------------------------------------------------+-+-+
    41 //  +--------------------------------------------------------------------+-+-+-+
    42 //  |                                                                     | |
    42 //  |                                                                    | | |
    43 //  |                                      1-1 Partial Array Flag (1-bit) * |
    43 //  |                                            2-2 Follow Flag (1-bit) * | |
    44 //  |                                                                       |
    44 //  |                                                                      | |
    45 //  |                                                0-0 Final Flag (1-bit) *
    45 //  |                                       1-1 Partial Array Flag (1-bit) * |
       
    46 //  |                                                                        |
       
    47 //  |                                                 0-0 Final Flag (1-bit) *
    46 //  |
    48 //  |
    47 //  * 63-2 Object Address (62-bits)
    49 //  * 63-3 Object Address (61-bits)
    48 //
    50 //
    49 //
    51 //
    50 //  Partial array entry
    52 //  Partial array entry
    51 //  -------------------
    53 //  -------------------
    52 //
    54 //
    67 
    69 
    68 class ZMarkStackEntry  {
    70 class ZMarkStackEntry  {
    69 private:
    71 private:
    70   typedef ZBitField<uint64_t, bool,      0,  1>  field_finalizable;
    72   typedef ZBitField<uint64_t, bool,      0,  1>  field_finalizable;
    71   typedef ZBitField<uint64_t, bool,      1,  1>  field_partial_array;
    73   typedef ZBitField<uint64_t, bool,      1,  1>  field_partial_array;
    72   typedef ZBitField<uint64_t, uintptr_t, 2,  62> field_object_address;
    74   typedef ZBitField<uint64_t, bool,      2,  1>  field_follow;
       
    75   typedef ZBitField<uint64_t, uintptr_t, 3,  61> field_object_address;
    73   typedef ZBitField<uint64_t, size_t,    2,  30> field_partial_array_length;
    76   typedef ZBitField<uint64_t, size_t,    2,  30> field_partial_array_length;
    74   typedef ZBitField<uint64_t, size_t,    32, 32> field_partial_array_offset;
    77   typedef ZBitField<uint64_t, size_t,    32, 32> field_partial_array_offset;
    75 
    78 
    76   uint64_t _entry;
    79   uint64_t _entry;
    77 
    80 
    81     // _entry to allow it to be optimized out when instantiating ZMarkStack,
    84     // _entry to allow it to be optimized out when instantiating ZMarkStack,
    82     // which has a long array of ZMarkStackEntry elements, but doesn't care
    85     // which has a long array of ZMarkStackEntry elements, but doesn't care
    83     // what _entry is initialized to.
    86     // what _entry is initialized to.
    84   }
    87   }
    85 
    88 
    86   ZMarkStackEntry(uintptr_t object_address, bool finalizable) :
    89   ZMarkStackEntry(uintptr_t object_address, bool follow, bool finalizable) :
    87       _entry(field_object_address::encode(object_address) |
    90       _entry(field_object_address::encode(object_address) |
       
    91              field_follow::encode(follow) |
    88              field_partial_array::encode(false) |
    92              field_partial_array::encode(false) |
    89              field_finalizable::encode(finalizable)) {}
    93              field_finalizable::encode(finalizable)) {}
    90 
    94 
    91   ZMarkStackEntry(size_t partial_array_offset, size_t partial_array_length, bool finalizable) :
    95   ZMarkStackEntry(size_t partial_array_offset, size_t partial_array_length, bool finalizable) :
    92       _entry(field_partial_array_offset::encode(partial_array_offset) |
    96       _entry(field_partial_array_offset::encode(partial_array_offset) |
   108 
   112 
   109   size_t partial_array_length() const {
   113   size_t partial_array_length() const {
   110     return field_partial_array_length::decode(_entry);
   114     return field_partial_array_length::decode(_entry);
   111   }
   115   }
   112 
   116 
       
   117   bool follow() const {
       
   118     return field_follow::decode(_entry);
       
   119   }
       
   120 
   113   uintptr_t object_address() const {
   121   uintptr_t object_address() const {
   114     return field_object_address::decode(_entry);
   122     return field_object_address::decode(_entry);
   115   }
   123   }
   116 };
   124 };
   117 
   125