/ src / ARMeilleure / Instructions / InstEmitHash.cs
InstEmitHash.cs
 1  using ARMeilleure.Decoders;
 2  using ARMeilleure.IntermediateRepresentation;
 3  using ARMeilleure.Translation;
 4  
 5  using static ARMeilleure.Instructions.InstEmitHashHelper;
 6  using static ARMeilleure.Instructions.InstEmitHelper;
 7  
 8  namespace ARMeilleure.Instructions
 9  {
10      static partial class InstEmit
11      {
12          private const int ByteSizeLog2 = 0;
13          private const int HWordSizeLog2 = 1;
14          private const int WordSizeLog2 = 2;
15          private const int DWordSizeLog2 = 3;
16  
17          public static void Crc32b(ArmEmitterContext context)
18          {
19              EmitCrc32Call(context, ByteSizeLog2, false);
20          }
21  
22          public static void Crc32h(ArmEmitterContext context)
23          {
24              EmitCrc32Call(context, HWordSizeLog2, false);
25          }
26  
27          public static void Crc32w(ArmEmitterContext context)
28          {
29              EmitCrc32Call(context, WordSizeLog2, false);
30          }
31  
32          public static void Crc32x(ArmEmitterContext context)
33          {
34              EmitCrc32Call(context, DWordSizeLog2, false);
35          }
36  
37          public static void Crc32cb(ArmEmitterContext context)
38          {
39              EmitCrc32Call(context, ByteSizeLog2, true);
40          }
41  
42          public static void Crc32ch(ArmEmitterContext context)
43          {
44              EmitCrc32Call(context, HWordSizeLog2, true);
45          }
46  
47          public static void Crc32cw(ArmEmitterContext context)
48          {
49              EmitCrc32Call(context, WordSizeLog2, true);
50          }
51  
52          public static void Crc32cx(ArmEmitterContext context)
53          {
54              EmitCrc32Call(context, DWordSizeLog2, true);
55          }
56  
57          private static void EmitCrc32Call(ArmEmitterContext context, int size, bool c)
58          {
59              OpCodeAluBinary op = (OpCodeAluBinary)context.CurrOp;
60  
61              Operand n = GetIntOrZR(context, op.Rn);
62              Operand m = GetIntOrZR(context, op.Rm);
63  
64              Operand d = EmitCrc32(context, n, m, size, c);
65  
66              SetIntOrZR(context, op.Rd, d);
67          }
68      }
69  }