(no commit message)
authorlkcl <lkcl@web>
Tue, 15 Feb 2022 06:07:23 +0000 (06:07 +0000)
committerIkiWiki <ikiwiki.info>
Tue, 15 Feb 2022 06:07:23 +0000 (06:07 +0000)
openpower/sv/bitmanip.mdwn

index c7821f1309e216e8e128c4aefd7531b22beb1593..a3248d8308d5f7aba79b7f4c9219d5cc6d64c7bf 100644 (file)
@@ -318,14 +318,28 @@ uint_xlen_t bmextrev(RA, RB, sh)
 
 # grevlut
 
-    lut2(imm, a, b):
-        idx = b << 1 | a
-        return imm[idx] # idx by LSB0 order
+```
+lut2(imm, a, b):
+    idx = b << 1 | a
+    return imm[idx] # idx by LSB0 order
+
+dorow(imm, step_i, chunksize):
+    for j in 0 to 63:
+        step_o[j] = lut2(imm, step_i[j], step_i[j ^ chunk_size])
+    return step_o
+
+uint64_t grevlut64(uint64_t RA, uint64_t RB, uint8 lut2)
+{
+    uint64_t x = RA;
+    int shamt = RB & 63;
+    int imm = lut2 & 0b1111;
+    for i in 0 to 6
+        step = 1<<i
+        if (shamt & step) x = dorow(imm, x, step)
+    return x;
+}
 
-     dorow(imm, step_i, chunksize):
-        for j in 0 to 63:
-            step_o[j] = lut2(imm, step_i[j], step_i[j ^ chunk_size])
-        return step_o
+```
 
 # grev