update pseudo-code
authorKonstantinos Margaritis <konstantinos.margaritis@vectorcamp.gr>
Thu, 20 Jul 2023 16:36:58 +0000 (16:36 +0000)
committerKonstantinos Margaritis <konstantinos.margaritis@vectorcamp.gr>
Thu, 20 Jul 2023 16:36:58 +0000 (16:36 +0000)
openpower/sv/twin_butterfly.mdwn

index f700e21a0af65f3dbfefe31f9a4d6f270bbf20f0..26b2484efc9e0929e6810bb438d98b85e753f154 100644 (file)
@@ -106,22 +106,22 @@ Pseudo-code:
     sum <- (RT) + (RA)
     diff <- (RT) - (RA)
     prod1 <- MULS(RB, sum)
-    prod1_lo <- prod1[XLEN:(XLEN*2)-1]
     prod2 <- MULS(RB, diff)
-    prod2_lo <- prod2[XLEN:(XLEN*2)-1]
     if n = 0 then
+        prod1_lo <- prod1[XLEN:(XLEN*2) - 1]
+        prod2_lo <- prod2[XLEN:(XLEN*2) - 1]
         RT <- prod1_lo
         RS <- prod2_lo
     else
-        round <- [0]*XLEN
-        round[XLEN -n] <- 1
-        prod1_lo <- prod1_lo + round
-        prod2_lo <- prod2_lo + round
-        m <- MASK(n, (XLEN-1))
-        res1 <- ROTL64(prod1_lo, XLEN-n) & m
-        res2 <- ROTL64(prod2_lo, XLEN-n) & m
-        signbit1 <- prod1_lo[0]
-        signbit2 <- prod2_lo[0]
+        round <- [0]*(XLEN*2)
+        round[XLEN*2 - n] <- 1
+        prod1 <- prod1 + round
+        prod2 <- prod2 + round
+        m <- MASK(XLEN - n - 2, XLEN - 1)
+        res1 <- prod1[XLEN - n:XLEN*2 - n - 1]
+        res2 <- prod2[XLEN - n:XLEN*2 - n - 1]
+        signbit1 <- prod1[0]
+        signbit2 <- prod2[0]
         smask1 <- ([signbit1]*XLEN) & ¬m
         smask2 <- ([signbit2]*XLEN) & ¬m
         RT <- (res1 | smask1)
@@ -149,22 +149,29 @@ Pseudo-code:
 
     n <- SH
     prod <- MULS(RB, RA)
-    prod_lo <- prod[XLEN:(XLEN*2)-1]
     if n = 0 then
+        prod_lo <- prod[XLEN:(XLEN*2) - 1]
         RT <- (RT) + prod_lo
-        RS <- (RS) - prod_lo
+    n <- SH
+    sum <- (RT) + (RA)
+    diff <- (RT) - (RA)
+    prod1 <- MULS(RB, sum)
+    prod1_lo <- prod1[XLEN:(XLEN*2)-1]
+    prod2 <- MULS(RB, diff)
+    prod2_lo <- prod2[XLEN:(XLEN*2)-1]
+    if n = 0 then
+        RT <- prod1_lo
+        RS <- prod2_lo
     else
-        res1 <- (RT) + prod_lo
-        res2 <- (RS) - prod_lo
         round <- [0]*XLEN
         round[XLEN -n] <- 1
-        res1 <- res1 + round
-        res2 <- res2 + round
-        signbit1 <- res1[0]
-        signbit2 <- res2[0]
+        prod1_lo <- prod1_lo + round
+        prod2_lo <- prod2_lo + round
         m <- MASK(n, (XLEN-1))
-        res1 <- ROTL64(res1, XLEN-n) & m
-        res2 <- ROTL64(res2, XLEN-n) & m
+        res1 <- ROTL64(prod1_lo, XLEN-n) & m
+        res2 <- ROTL64(prod2_lo, XLEN-n) & m
+        signbit1 <- prod1_lo[0]
+        signbit2 <- prod2_lo[0]
         smask1 <- ([signbit1]*XLEN) & ¬m
         smask2 <- ([signbit2]*XLEN) & ¬m
         RT <- (res1 | smask1)