(no commit message)
[libreriscv.git] / openpower / sv / bitmanip / appendix.mdwn
index e87166043b46f4721d7f1c6bd22dcf26d9f6c09d..026a28179f942a318d9612e4fe7ed59e41197c61 100644 (file)
@@ -22,6 +22,33 @@ of Knuth M: <https://git.libre-soc.org/?p=libreriscv.git;a=blob;f=openpower/sv/b
       }
 ```
 
+**maddx RT, RA, RB, RC** (RS=RT+VL for SVP64, RS=RT+1 for scalar)
+
+    prod[0:127] = (RA) * (RB)
+    sub[0:127] = EXTZ(RC) + prod
+    RT <- sub[64:127]
+    RS <- sub[0:63]
+
+**weirdaddx RT, RA, RB** (RS=RB+VL for SVP64, RS=RB+1 for scalar)
+
+    cat[0:127] = (RS) || (RB)
+    sum[0:127] = cat + EXTZ(RA)
+    rhi[0:63] = sum[0:63]
+    RA = rhi
+    RT = sum[64:127]
+
+These two combine as, simply:
+
+    # assume VL=8, therefore RS starts at r8.v
+    # q       : r16
+    # dividend: r20.v
+    # divisor : r28.v
+    # carry   : r40
+    li r17, 0
+    sv.msubx r0.v, r16, r20.v, r28.v
+    # here, RS=RB+VL, therefore again RS starts at r8.v
+    sv.weirdsubx r0.v, r17, r0.v
+
 # big integer division
 
 links
@@ -139,10 +166,10 @@ in order to carry on the algorithm.
     RT <- sub[64:127]
     RS <- sub[0:63]
 
-**weirdaddx RT, RA, RB** (RS=RB+VL for SVP64, RS=RB+1 for scalar)
+**weirdsubx RT, RA, RB** (RS=RB+VL for SVP64, RS=RB+1 for scalar)
 
     cat[0:127] = (RS) || (RB)
-    sum[0:127] = cat - EXTZ(RA)
+    sum[0:127] = cat - EXTS(RA)
     rhi[0:63] = sum[0:63]
     RA = ~rhi + 1
     RT = sum[64:127]
@@ -157,7 +184,7 @@ These two combine as, simply:
     li r17, 0
     sv.msubx r0.v, r16, r20.v, r28.v
     # here, RS=RB+VL, therefore again RS starts at r8.v
-    sv.weirdaddx r0.v, r17, r0.v
+    sv.weirdsubx r0.v, r17, r0.v
 
 As a result, a big-integer subtract and multiply may be carried out
 in only 3 instructions, one of which is setting a scalar integer to