• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_COMPILER_BARRIER_STUB_BUILDER_H
17 #define ECMASCRIPT_COMPILER_BARRIER_STUB_BUILDER_H
18 
19 #include "ecmascript/compiler/stub_builder.h"
20 
21 namespace panda::ecmascript::kungfu {
22 class BarrierStubBuilder : public StubBuilder {
23 public:
BarrierStubBuilder(StubBuilder * parent,GateRef glue,GateRef obj,GateRef startAddr,GateRef slotCount)24     BarrierStubBuilder(StubBuilder *parent, GateRef glue, GateRef obj, GateRef startAddr, GateRef slotCount)
25         : StubBuilder(parent),
26           glue_(glue),
27           dstObj_(obj),
28           dstAddr_(startAddr),
29           slotCount_(slotCount),
30           objectRegion_(ObjectAddressToRange(obj)) {}
31 
32     ~BarrierStubBuilder() override = default;
33     NO_MOVE_SEMANTIC(BarrierStubBuilder);
34     NO_COPY_SEMANTIC(BarrierStubBuilder);
35 
GenerateCircuit()36     void GenerateCircuit() override {}
37 
38     void DoMoveBarrierCrossRegion(GateRef srcAddr, GateRef srcRegion);
39 
40     void DoBatchBarrier();
41 
42     void DoMoveBarrierInRegion(GateRef srcAddr);
43 
44     void DoReverseBarrier();
45 private:
46     enum BitSetSelect {
47         LocalToShared = 0b1,
48         OldToNew = 0b10,
49     };
50 
51     enum RegionKind {
52         InSameRegion,
53         CrossRegion,
54     };
55 
56     GateRef GetBitSetDataAddr(GateRef objectRegion, GateRef loadOffset, int32_t createFunID);
57     void HandleMark();
58     void DoBatchBarrierInternal();
59     void BarrierBatchBitSet(uint8_t select);
60     void FlushBatchBitSet(uint8_t bitSetSelect, GateRef quadIdx,
61                           Variable &localToShareBitSetVar, Variable &oldToNewBitSetVar, Label *next);
62     GateRef IsLocalToShareSwapped(GateRef region);
63     GateRef IsOldToNewSwapped(GateRef region);
64     void BitSetRangeMove(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart, GateRef length);
65     void BitSetRangeMoveForward(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart,
66                                 GateRef length);
67     void BitSetRangeMoveBackward(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart,
68                                  GateRef length);
69     void DoReverseBarrierInternal();
70     void BitSetRangeReverse(GateRef bitSet, GateRef startIdx, GateRef length);
71     void DoMoveBarrierSameRegionKind(GateRef srcAddr, GateRef srcRegion, RegionKind regionKind);
72     const GateRef glue_;
73     const GateRef dstObj_;
74     const GateRef dstAddr_;
75     const GateRef slotCount_;
76     const GateRef objectRegion_;
77 
78     static constexpr int64_t BIT_PER_QUAD_MASK = 63;
79     static constexpr int64_t BIT_PER_QUAD_LOG2 = 6;
80     static constexpr int64_t BYTE_PER_QUAD_LOG2 = 3;
81     static constexpr int64_t BYTE_PER_QUAD = 8;
82     static constexpr int64_t BIT_PER_BYTE_LOG2 = 3;
83     static constexpr int64_t BIT_PER_QUAD = 64;
84     static constexpr int64_t ALL_ONE_MASK = -1;
85     static constexpr size_t FLUSH_RANGE = GCBitset::BIT_PER_WORD * GCBitset::BIT_PER_BYTE;
86 
87     static constexpr int8_t LOCAL_TO_SHARE_SWAPPED_MASK =
88         static_cast<int8_t>(RSetSwapFlag::LOCAL_TO_SHARE_SWAPPED_MASK) |
89         static_cast<int8_t>(RSetSwapFlag::LOCAL_TO_SHARE_COLLECTED_MASK);
90     static constexpr int8_t OLD_TO_NEW_SWAPPED_MASK = static_cast<int8_t>(RSetSwapFlag::OLD_TO_NEW_SWAPPED_MASK);
91 };
92 }
93 
94 #endif //ECMASCRIPT_COMPILER_BARRIER_STUB_BUILDER_H
95