From bf2874ef80676a71cf39dcfec5052b07f5d2c027 Mon Sep 17 00:00:00 2001 From: Hannes Greule Date: Sat, 28 Sep 2024 21:39:09 +0200 Subject: [PATCH] Implement vectorization of #existing and inverse masks (#2927) --- .../core/internal/simd/SimdSupport.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/simd/SimdSupport.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/simd/SimdSupport.java index 23d135fa6..5f2d6a711 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/simd/SimdSupport.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/internal/simd/SimdSupport.java @@ -2,14 +2,17 @@ package com.fastasyncworldedit.core.internal.simd; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.extent.filter.block.DelegateFilter; +import com.fastasyncworldedit.core.function.mask.InverseMask; import com.fastasyncworldedit.core.function.mask.SingleBlockStateMask; import com.fastasyncworldedit.core.queue.Filter; +import com.sk89q.worldedit.function.mask.ExistingBlockMask; import com.sk89q.worldedit.function.mask.InverseSingleBlockStateMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockTypesCache; import jdk.incubator.vector.ShortVector; import jdk.incubator.vector.VectorOperators; @@ -44,10 +47,23 @@ public class SimdSupport { return switch (mask) { case SingleBlockStateMask single -> vectorizedTargetMask(single.getBlockState().getOrdinalChar()); case InverseSingleBlockStateMask inverse -> vectorizedTargetMaskInverse(inverse.getBlockState().getOrdinalChar()); + case ExistingBlockMask ignored -> vectorizedTargetMaskNonAir(); + case InverseMask inverse -> { + final VectorizedMask base = vectorizedTargetMask(inverse.inverse()); + if (base == null) { + yield null; + } + yield (set, get) -> base.compareVector(set, get).not(); + } default -> null; }; } + private static VectorizedMask vectorizedTargetMaskNonAir() { + // everything > VOID_AIR is not air + return (set, get) -> get.compare(VectorOperators.UNSIGNED_GT, BlockTypesCache.ReservedIDs.VOID_AIR); + } + private static VectorizedMask vectorizedTargetMask(char ordinal) { return (set, get) -> get.compare(VectorOperators.EQ, (short) ordinal); }