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 }