added english language description for lbzsx instruction
[openpower-isa.git] / openpower / isa / prefix_codes.mdwn
index f5cb1b508502aa8aa2b31fefdbbb388b3a7e107c..8d6415436cbc9cc6f5051334751e07b37812ba19 100644 (file)
@@ -1,51 +1,82 @@
 <!-- https://libre-soc.org/openpower/prefix_codes/ -->
 
-# [DRBFT] Prefix-code decode
+# [DRAFT] Prefix-code decode
 
-VA2-Form
+VA-Form
 
-* pcdec. RT,RA,RB,RC,once
+* pcdec. RT,RA,RB,RC
 
 Pseudo-code:
 
     tree[0:63] <- (RB)
-    rb_used <- 0b0
+    mode <- tree[62:63]
+    tree[62:63] <- 0
+    ra_used <- 0b0
     in_bits[0:63] <- (RC|0)
     if in_bits = 0 then
         in_bits[0:63] <- 1
-    final_in_bits <- in_bits
-    final_rb_used <- rb_used
-    output <- [0] * 64
-    out_byte <- 0
-    decoded[0:7] <- 1
-    so_bit <- 0b0
-    do while out_byte < 8
+    orig_in_bits <- in_bits
+    tree_index <- 1
+    found <- 0b0
+    hit_end <- 0b0
+    do bit_length = 1 to 6
         in_bit <- in_bits[63]
         if in_bits = 1 then
-            if rb_used | (_RA = 0) then
+            if ra_used | (_RA = 0) then
+                hit_end <- 0b1
                 leave
-            rb_used <- 0b1
+            ra_used <- 0b1
             in_bit <- (RA)[63]
             in_bits <- 0b1 || (RA)[0:62]
         else
             in_bits <- 0b0 || in_bits[0:62]
         # walk the binary tree in `tree` from parent to the selected child
-        decoded <- decoded[1:7] || in_bit
-        if decoded <u 64 then
-            if tree[63 - decoded] then
-                final_in_bits <- in_bits
-                final_rb_used <- rb_used
-                output[56 - 8 * out_byte:63 - 8 * out_byte] <- decoded
-                decoded[0:7] <- 1
-                out_byte <- out_byte + 1
-                if once then
-                    leave
-        else
-            so_bit <- 0b1
+        tree_index <- tree_index * 2
+        if in_bit = 1 then
+            tree_index <- tree_index + 1
+        if tree_index < 64 then
+            if tree[63 - tree_index] then
+                found <- 0b1
+                leave
+    compressed_index <- 0
+    do i = 0 to 127
+        possible <- 1
+        j <- i
+        do while j >= 4
+            j <- j / 2
+            if tree[63 - j] then
+                possible <- 0
+                leave
+        if i = tree_index then
             leave
-    RT <- output
-    RS <- final_in_bits
-    CR0 <- final_rb_used || 0b0 || (output = 0) || so_bit
+        else if i >= 64 then
+            compressed_index <- compressed_index + possible
+        else if tree[63 - i] = 1 then
+            compressed_index <- compressed_index + possible
+    switch(mode)
+        case(0):
+            RT[0:63] <- tree_index
+            if ¬found then
+                in_bits <- orig_in_bits
+                ra_used <- 0b0
+        case(1):
+            RT[0:63] <- tree_index
+            if hit_end then
+                in_bits <- orig_in_bits
+                ra_used <- 0b0
+        case(2):
+            RT[0:63] <- compressed_index
+            if ¬found then
+                in_bits <- orig_in_bits
+                ra_used <- 0b0
+                RT[0:63] <- tree_index
+        default:
+            RT[0:63] <- compressed_index
+            if hit_end then
+                in_bits <- orig_in_bits
+                ra_used <- 0b0
+    RS <- in_bits
+    CR0 <- ra_used || (tree_index >= 64) || found || hit_end
 
 Special Registers Altered: