Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ BitArray() [4/6]

unsafe System.Collections.BitArray.BitArray ( bool[] values)
inline

Definition at line 200 of file BitArray.cs.

201 {
202 if (values == null)
203 {
204 throw new ArgumentNullException("values");
205 }
207 m_length = values.Length;
208 uint num = 0u;
209 if (values.Length >= Vector256<byte>.Count)
210 {
211 if (Avx2.IsSupported)
212 {
214 fixed (bool* ptr = values)
215 {
216 for (; num + 32 <= (uint)values.Length; num += 32)
217 {
218 Vector256<byte> left = Avx.LoadVector256((byte*)(ptr + num));
220 int num2 = Avx2.MoveMask(value);
221 m_array[num / 32] = ~num2;
222 }
223 }
224 }
225 else if (Sse2.IsSupported)
226 {
228 fixed (bool* ptr2 = values)
229 {
230 for (; num + 32 <= (uint)values.Length; num += 32)
231 {
232 Vector128<byte> left2 = Sse2.LoadVector128((byte*)(ptr2 + num));
233 Vector128<byte> value2 = Sse2.CompareEqual(left2, zero2);
234 int num3 = Sse2.MoveMask(value2);
235 Vector128<byte> left3 = Sse2.LoadVector128((byte*)(ptr2 + num + Vector128<byte>.Count));
236 Vector128<byte> value3 = Sse2.CompareEqual(left3, zero2);
237 int num4 = Sse2.MoveMask(value3);
238 m_array[num / 32] = ~((num4 << 16) | num3);
239 }
240 }
241 }
242 else if (AdvSimd.Arm64.IsSupported)
243 {
245 Vector128<byte> right = (BitConverter.IsLittleEndian ? Vector128.Create(9241421688590303745uL).AsByte() : Vector128.Create(72624976668147840L).AsByte());
246 fixed (bool* ptr3 = values)
247 {
248 for (; num + 32 <= (uint)values.Length; num += 32)
249 {
250 Vector128<byte> left4 = AdvSimd.LoadVector128((byte*)(ptr3 + num));
251 Vector128<byte> left5 = AdvSimd.CompareEqual(left4, zero3);
252 Vector128<byte> vector = AdvSimd.And(left5, right);
253 vector = AdvSimd.Arm64.AddPairwise(vector, vector);
254 vector = AdvSimd.Arm64.AddPairwise(vector, vector);
255 vector = AdvSimd.Arm64.AddPairwise(vector, vector);
256 Vector128<short> left6 = vector.AsInt16();
257 Vector128<byte> left7 = AdvSimd.LoadVector128((byte*)(ptr3 + num + Vector128<byte>.Count));
258 Vector128<byte> left8 = AdvSimd.CompareEqual(left7, zero3);
259 Vector128<byte> vector2 = AdvSimd.And(left8, right);
260 vector2 = AdvSimd.Arm64.AddPairwise(vector2, vector2);
261 vector2 = AdvSimd.Arm64.AddPairwise(vector2, vector2);
262 vector2 = AdvSimd.Arm64.AddPairwise(vector2, vector2);
263 Vector128<short> right2 = vector2.AsInt16();
264 int num5 = AdvSimd.Arm64.ZipLow(left6, right2).AsInt32().ToScalar();
265 if (!BitConverter.IsLittleEndian)
266 {
268 }
269 m_array[num / 32] = ~num5;
270 }
271 }
272 }
273 }
274 for (; num < (uint)values.Length; num++)
275 {
276 if (values[num])
277 {
278 int remainder;
279 int num6 = Div32Rem((int)num, out remainder);
280 m_array[num6] |= 1 << remainder;
281 }
282 }
283 _version = 0;
284 }
static sbyte ReverseEndianness(sbyte value)
static int GetInt32ArrayLengthFromBitLength(int n)
Definition BitArray.cs:988
static int Div32Rem(int number, out int remainder)
Definition BitArray.cs:1003
static Vector64< byte > ZipLow(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:2879
static Vector128< byte > AddPairwise(Vector128< byte > left, Vector128< byte > right)
Definition AdvSimd.cs:239
static Vector64< byte > CompareEqual(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:4239
static unsafe Vector128< byte > LoadVector128(byte *address)
Definition AdvSimd.cs:6034
static Vector64< byte > And(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:3919
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static int MoveMask(Vector256< sbyte > value)
Definition Avx2.cs:1578
static Vector256< sbyte > CompareEqual(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:512
static new bool IsSupported
Definition Avx2.cs:15
static unsafe Vector256< sbyte > LoadVector256(sbyte *address)
Definition Avx.cs:462
static unsafe Vector128< sbyte > LoadVector128(sbyte *address)
Definition Sse2.cs:582
static int MoveMask(Vector128< sbyte > value)
Definition Sse2.cs:772
static Vector128< sbyte > CompareEqual(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:232
static new bool IsSupported
Definition Sse2.cs:60

References System.Collections.BitArray._version, System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.AddPairwise(), System.Runtime.Intrinsics.Arm.AdvSimd.And(), System.Runtime.Intrinsics.X86.Sse2.CompareEqual(), System.Runtime.Intrinsics.X86.Avx2.CompareEqual(), System.Runtime.Intrinsics.Arm.AdvSimd.CompareEqual(), System.Runtime.Intrinsics.Vector128< T >.Count, System.Runtime.Intrinsics.Vector256< T >.Count, System.Runtime.Intrinsics.Vector128< T >.Create(), System.Collections.BitArray.Div32Rem(), System.Collections.BitArray.GetInt32ArrayLengthFromBitLength(), System.BitConverter.IsLittleEndian, System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.IsSupported, System.Runtime.Intrinsics.X86.Avx2.IsSupported, System.Runtime.Intrinsics.X86.Sse2.IsSupported, System.L, System.Runtime.Intrinsics.Arm.AdvSimd.LoadVector128(), System.Runtime.Intrinsics.X86.Sse2.LoadVector128(), System.Runtime.Intrinsics.X86.Avx.LoadVector256(), System.Collections.BitArray.m_array, System.Collections.BitArray.m_length, System.Runtime.Intrinsics.X86.Sse2.MoveMask(), System.Runtime.Intrinsics.X86.Avx2.MoveMask(), System.Buffers.Binary.BinaryPrimitives.ReverseEndianness(), System.value, System.values, System.Runtime.Intrinsics.Vector128< T >.Zero, System.Runtime.Intrinsics.Vector256< T >.Zero, and System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.ZipLow().