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