aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Instructions/InstEmitHashHelper.cs
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /ARMeilleure/Instructions/InstEmitHashHelper.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'ARMeilleure/Instructions/InstEmitHashHelper.cs')
-rw-r--r--ARMeilleure/Instructions/InstEmitHashHelper.cs118
1 files changed, 0 insertions, 118 deletions
diff --git a/ARMeilleure/Instructions/InstEmitHashHelper.cs b/ARMeilleure/Instructions/InstEmitHashHelper.cs
deleted file mode 100644
index 55a03a4f..00000000
--- a/ARMeilleure/Instructions/InstEmitHashHelper.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-// https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf
-
-using ARMeilleure.IntermediateRepresentation;
-using ARMeilleure.Translation;
-using System;
-using System.Diagnostics;
-using static ARMeilleure.Instructions.InstEmitSimdHelper;
-using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
-
-namespace ARMeilleure.Instructions
-{
- static class InstEmitHashHelper
- {
- public const uint Crc32RevPoly = 0xedb88320;
- public const uint Crc32cRevPoly = 0x82f63b78;
-
- public static Operand EmitCrc32(ArmEmitterContext context, Operand crc, Operand value, int size, bool castagnoli)
- {
- Debug.Assert(crc.Type.IsInteger() && value.Type.IsInteger());
- Debug.Assert(size >= 0 && size < 4);
- Debug.Assert((size < 3) || (value.Type == OperandType.I64));
-
- if (castagnoli && Optimizations.UseSse42)
- {
- // The CRC32 instruction does not have an immediate variant, so ensure both inputs are in registers.
- value = (value.Kind == OperandKind.Constant) ? context.Copy(value) : value;
- crc = (crc.Kind == OperandKind.Constant) ? context.Copy(crc) : crc;
-
- Intrinsic op = size switch
- {
- 0 => Intrinsic.X86Crc32_8,
- 1 => Intrinsic.X86Crc32_16,
- _ => Intrinsic.X86Crc32,
- };
-
- return (size == 3) ? context.ConvertI64ToI32(context.AddIntrinsicLong(op, crc, value)) : context.AddIntrinsicInt(op, crc, value);
- }
- else if (Optimizations.UsePclmulqdq)
- {
- return size switch
- {
- 3 => EmitCrc32Optimized64(context, crc, value, castagnoli),
- _ => EmitCrc32Optimized(context, crc, value, castagnoli, size),
- };
- }
- else
- {
- string name = (size, castagnoli) switch
- {
- (0, false) => nameof(SoftFallback.Crc32b),
- (1, false) => nameof(SoftFallback.Crc32h),
- (2, false) => nameof(SoftFallback.Crc32w),
- (3, false) => nameof(SoftFallback.Crc32x),
- (0, true) => nameof(SoftFallback.Crc32cb),
- (1, true) => nameof(SoftFallback.Crc32ch),
- (2, true) => nameof(SoftFallback.Crc32cw),
- (3, true) => nameof(SoftFallback.Crc32cx),
- _ => throw new ArgumentOutOfRangeException(nameof(size))
- };
-
- return context.Call(typeof(SoftFallback).GetMethod(name), crc, value);
- }
- }
-
- private static Operand EmitCrc32Optimized(ArmEmitterContext context, Operand crc, Operand data, bool castagnoli, int size)
- {
- long mu = castagnoli ? 0x0DEA713F1 : 0x1F7011641; // mu' = floor(x^64/P(x))'
- long polynomial = castagnoli ? 0x105EC76F0 : 0x1DB710641; // P'(x) << 1
-
- crc = context.VectorInsert(context.VectorZero(), crc, 0);
-
- switch (size)
- {
- case 0: data = context.VectorInsert8(context.VectorZero(), data, 0); break;
- case 1: data = context.VectorInsert16(context.VectorZero(), data, 0); break;
- case 2: data = context.VectorInsert(context.VectorZero(), data, 0); break;
- }
-
- int bitsize = 8 << size;
-
- Operand tmp = context.AddIntrinsic(Intrinsic.X86Pxor, crc, data);
- tmp = context.AddIntrinsic(Intrinsic.X86Psllq, tmp, Const(64 - bitsize));
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, tmp, X86GetScalar(context, mu), Const(0));
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, tmp, X86GetScalar(context, polynomial), Const(0));
-
- if (bitsize < 32)
- {
- crc = context.AddIntrinsic(Intrinsic.X86Pslldq, crc, Const((64 - bitsize) / 8));
- tmp = context.AddIntrinsic(Intrinsic.X86Pxor, tmp, crc);
- }
-
- return context.VectorExtract(OperandType.I32, tmp, 2);
- }
-
- private static Operand EmitCrc32Optimized64(ArmEmitterContext context, Operand crc, Operand data, bool castagnoli)
- {
- long mu = castagnoli ? 0x0DEA713F1 : 0x1F7011641; // mu' = floor(x^64/P(x))'
- long polynomial = castagnoli ? 0x105EC76F0 : 0x1DB710641; // P'(x) << 1
-
- crc = context.VectorInsert(context.VectorZero(), crc, 0);
- data = context.VectorInsert(context.VectorZero(), data, 0);
-
- Operand tmp = context.AddIntrinsic(Intrinsic.X86Pxor, crc, data);
- Operand res = context.AddIntrinsic(Intrinsic.X86Pslldq, tmp, Const(4));
-
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, res, X86GetScalar(context, mu), Const(0));
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, tmp, X86GetScalar(context, polynomial), Const(0));
-
- tmp = context.AddIntrinsic(Intrinsic.X86Pxor, tmp, res);
- tmp = context.AddIntrinsic(Intrinsic.X86Psllq, tmp, Const(32));
-
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, tmp, X86GetScalar(context, mu), Const(1));
- tmp = context.AddIntrinsic(Intrinsic.X86Pclmulqdq, tmp, X86GetScalar(context, polynomial), Const(0));
-
- return context.VectorExtract(OperandType.I32, tmp, 2);
- }
- }
-}