summaryrefslogtreecommitdiff
path: root/aarch64/mono/aarch64_integer_crc.sail
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64/mono/aarch64_integer_crc.sail')
-rw-r--r--aarch64/mono/aarch64_integer_crc.sail13
1 files changed, 13 insertions, 0 deletions
diff --git a/aarch64/mono/aarch64_integer_crc.sail b/aarch64/mono/aarch64_integer_crc.sail
new file mode 100644
index 00000000..729a05a1
--- /dev/null
+++ b/aarch64/mono/aarch64_integer_crc.sail
@@ -0,0 +1,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)))
+}