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