• 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           dstAddr_(startAddr),
28           slotCount_(slotCount),
29           objectRegion_(ObjectAddressToRange(obj)) {}
30 
31     ~BarrierStubBuilder() override = default;
32     NO_MOVE_SEMANTIC(BarrierStubBuilder);
33     NO_COPY_SEMANTIC(BarrierStubBuilder);
34 
GenerateCircuit()35     void GenerateCircuit() override {}
36 
37     void DoMoveBarrierCrossRegion(GateRef srcAddr, GateRef srcRegion);
38 
39     void DoBatchBarrier();
40 
41     void DoMoveBarrierInRegion(GateRef srcAddr);
42 
43     void DoReverseBarrier();
44 private:
45     enum BitSetSelect {
46         LocalToShared = 0b1,
47         OldToNew = 0b10,
48     };
49 
50     enum RegionKind {
51         InSameRegion,
52         CrossRegion,
53     };
54 
55     GateRef GetBitSetDataAddr(GateRef objectRegion, GateRef loadOffset, int32_t createFunID);
56     void HandleMark();
57     void DoBatchBarrierInternal();
58     void BarrierBatchBitSet(uint8_t select);
59     void FlushBatchBitSet(uint8_t bitSetSelect, GateRef quadIdx,
60                           Variable &localToShareBitSetVar, Variable &oldToNewBitSetVar, Label *next);
61     GateRef IsLocalToShareSwapped(GateRef region);
62     GateRef IsOldToNewSwapped(GateRef region);
63     void BitSetRangeMove(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart, GateRef length);
64     void BitSetRangeMoveForward(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart,
65                                 GateRef length);
66     void BitSetRangeMoveBackward(GateRef srcBitSet, GateRef dstBitSet, GateRef srcStart, GateRef dstStart,
67                                  GateRef length);
68     void DoReverseBarrierInternal();
69     void BitSetRangeReverse(GateRef bitSet, GateRef startIdx, GateRef length);
70     void DoMoveBarrierSameRegionKind(GateRef srcAddr, GateRef srcRegion, RegionKind regionKind);
71     const GateRef glue_;
72     const GateRef dstAddr_;
73     const GateRef slotCount_;
74     const GateRef objectRegion_;
75 
76     static constexpr int64_t BIT_PER_QUAD_MASK = 63;
77     static constexpr int64_t BIT_PER_QUAD_LOG2 = 6;
78     static constexpr int64_t BYTE_PER_QUAD_LOG2 = 3;
79     static constexpr int64_t BYTE_PER_QUAD = 8;
80     static constexpr int64_t BIT_PER_BYTE_LOG2 = 3;
81     static constexpr int64_t BIT_PER_QUAD = 64;
82     static constexpr int64_t ALL_ONE_MASK = -1;
83     static constexpr size_t FLUSH_RANGE = GCBitset::BIT_PER_WORD * GCBitset::BIT_PER_BYTE;
84 
85     static constexpr int8_t LOCAL_TO_SHARE_SWAPPED_MASK =
86         static_cast<int8_t>(RSetSwapFlag::LOCAL_TO_SHARE_SWAPPED_MASK) |
87         static_cast<int8_t>(RSetSwapFlag::LOCAL_TO_SHARE_COLLECTED_MASK);
88     static constexpr int8_t OLD_TO_NEW_SWAPPED_MASK = static_cast<int8_t>(RSetSwapFlag::OLD_TO_NEW_SWAPPED_MASK);
89 };
90 }
91 
92 #endif //ECMASCRIPT_COMPILER_BARRIER_STUB_BUILDER_H
93