(no commit message)
authorlkcl <lkcl@web>
Wed, 4 May 2022 00:15:05 +0000 (01:15 +0100)
committerIkiWiki <ikiwiki.info>
Wed, 4 May 2022 00:15:05 +0000 (01:15 +0100)
openpower/sv/bitmanip.mdwn

index d6f58e59574b4a7348c3911e3954be89409d7406..a1d3de1b2419d39360e6ffff816f7fab3eb6c53c 100644 (file)
@@ -560,6 +560,55 @@ uint64_t gorc64(uint64_t RA, uint64_t RB)
 }
 
 ```
+
+# bitmatrix
+
+```
+uint64_t bmatflip(uint64_t RA)
+{
+    uint64_t x = RA;
+    x = shfl64(x, 31);
+    x = shfl64(x, 31);
+    x = shfl64(x, 31);
+    return x;
+}
+uint64_t bmatxor(uint64_t RA, uint64_t RB)
+{
+    // transpose of RB
+    uint64_t RBt = bmatflip(RB);
+    uint8_t u[8]; // rows of RA
+    uint8_t v[8]; // cols of RB
+    for (int i = 0; i < 8; i++) {
+        u[i] = RA >> (i*8);
+        v[i] = RBt >> (i*8);
+    }
+    uint64_t x = 0;
+    for (int i = 0; i < 64; i++) {
+        if (pcnt(u[i / 8] & v[i % 8]) & 1)
+            x |= 1LL << i;
+    }
+    return x;
+}
+uint64_t bmator(uint64_t RA, uint64_t RB)
+{
+    // transpose of RB
+    uint64_t RBt = bmatflip(RB);
+    uint8_t u[8]; // rows of RA
+    uint8_t v[8]; // cols of RB
+    for (int i = 0; i < 8; i++) {
+        u[i] = RA >> (i*8);
+        v[i] = RBt >> (i*8);
+    }
+    uint64_t x = 0;
+    for (int i = 0; i < 64; i++) {
+        if ((u[i / 8] & v[i % 8]) != 0)
+            x |= 1LL << i;
+    }
+    return x;
+}
+
+```
+
 # Introduction to Carry-less and GF arithmetic
 
 * obligatory xkcd <https://xkcd.com/2595/>
@@ -732,54 +781,6 @@ q, r = cldivrem(n, d, width=XLEN)
 (RT) = r
 ```
 
-# bitmatrix
-
-```
-uint64_t bmatflip(uint64_t RA)
-{
-    uint64_t x = RA;
-    x = shfl64(x, 31);
-    x = shfl64(x, 31);
-    x = shfl64(x, 31);
-    return x;
-}
-uint64_t bmatxor(uint64_t RA, uint64_t RB)
-{
-    // transpose of RB
-    uint64_t RBt = bmatflip(RB);
-    uint8_t u[8]; // rows of RA
-    uint8_t v[8]; // cols of RB
-    for (int i = 0; i < 8; i++) {
-        u[i] = RA >> (i*8);
-        v[i] = RBt >> (i*8);
-    }
-    uint64_t x = 0;
-    for (int i = 0; i < 64; i++) {
-        if (pcnt(u[i / 8] & v[i % 8]) & 1)
-            x |= 1LL << i;
-    }
-    return x;
-}
-uint64_t bmator(uint64_t RA, uint64_t RB)
-{
-    // transpose of RB
-    uint64_t RBt = bmatflip(RB);
-    uint8_t u[8]; // rows of RA
-    uint8_t v[8]; // cols of RB
-    for (int i = 0; i < 8; i++) {
-        u[i] = RA >> (i*8);
-        v[i] = RBt >> (i*8);
-    }
-    uint64_t x = 0;
-    for (int i = 0; i < 64; i++) {
-        if ((u[i / 8] & v[i % 8]) != 0)
-            x |= 1LL << i;
-    }
-    return x;
-}
-
-```
-
 # Instructions for Binary Galois Fields `GF(2^m)`
 
 see: