summaryrefslogtreecommitdiff
path: root/aarch64/mono/aarch64_integer_crc.sail
blob: 729a05a1bd0e0a66743c280d9d8c38c48958aa40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
val aarch64_integer_crc : forall ('size : Int).
  (bool, int, int, int, atom('size)) -> unit effect {escape, undef, rreg, wreg}

function aarch64_integer_crc (crc32c, d, m, n, size) = {
  assert(constraint('size in {8,16,32,64}));
  if ~(HaveCRCExt()) then UnallocatedEncoding() else ();
  acc : bits(32) = aget_X(n);
  val_name : bits('size) = aget_X(m);
  poly : bits(32) = __GetSlice_int(32, if crc32c then 517762881 else 79764919, 0);
  tempacc : bits('size + 32) = BitReverse(acc) @ Zeros(size);
  tempval : bits('size + 32) = BitReverse(val_name) @ Zeros(32);
  aset_X(d, BitReverse(Poly32Mod2(tempacc ^ tempval, poly)))
}