make attn OP_ATTN and set NOP to pipeline NONE
[libreriscv.git] / openpower / isa / fixedarith.mdwn
index 5f5a33e8d7fbb1830ddaca42f5fbba5c38797b56..295014da693b4218a310ba50b6dcb0d6d363192e 100644 (file)
@@ -4,6 +4,8 @@ D-Form
 
 * addi RT,RA,SI
 
+Pseudo-code:
+
     if RA = 0 then RT <- EXTS(SI)
     else           RT <- (RA) + EXTS(SI)
 
@@ -17,6 +19,8 @@ D-Form
 
 * addis RT,RA,SI
 
+Pseudo-code:
+
     if RA = 0 then RT <- EXTS(SI || [0]*16)
     else           RT <- (RA) + EXTS(SI || [0]*16)
 
@@ -30,6 +34,8 @@ DX-Form
 
 * addpcis RT,D
 
+Pseudo-code:
+
     D <- d0||d1||d2
     RT <- NIA + EXTS(D || [0]*16)
 
@@ -46,6 +52,8 @@ XO-Form
 * addo RT,RA,RB (OE=1 Rc=0)
 * addo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- (RA) + (RB)
 
 Special Registers Altered:
@@ -62,6 +70,8 @@ XO-Form
 * subfo RT,RA,RB (OE=1 Rc=0)
 * subfo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + (RB) + 1
 
 Special Registers Altered:
@@ -75,6 +85,8 @@ D-Form
 
 * addic RT,RA,SI
 
+Pseudo-code:
+
     RT <- (RA) + EXTS(SI)
 
 Special Registers Altered:
@@ -87,6 +99,8 @@ D-Form
 
 * addic. RT,RA,SI
 
+Pseudo-code:
+
     RT <- (RA) + EXTS(SI)
 
 Special Registers Altered:
@@ -99,6 +113,8 @@ D-Form
 
 * subfic RT,RA,SI
 
+Pseudo-code:
+
     RT <- ¬(RA) + EXTS(SI) + 1
 
 Special Registers Altered:
@@ -114,6 +130,8 @@ XO-Form
 * addco RT,RA,RB (OE=1 Rc=0)
 * addco.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- (RA) + (RB)
 
 Special Registers Altered:
@@ -131,6 +149,8 @@ XO-Form
 * subfco RT,RA,RB (OE=1 Rc=0)
 * subfco.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + (RB) + 1
 
 Special Registers Altered:
@@ -148,6 +168,8 @@ XO-Form
 * addeo RT,RA,RB (OE=1 Rc=0)
 * addeo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- (RA) + (RB) + CA
 
 Special Registers Altered:
@@ -165,6 +187,8 @@ XO-Form
 * subfeo RT,RA,RB (OE=1 Rc=0)
 * subfeo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + (RB) + CA
 
 Special Registers Altered:
@@ -182,6 +206,8 @@ XO-Form
 * addmeo RT,RA (OE=1 Rc=0)
 * addmeo.  RT,RA (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- (RA) + CA - 1
 
 Special Registers Altered:
@@ -199,6 +225,8 @@ XO-Form
 * subfmeo RT,RA (OE=1 Rc=0)
 * subfmeo.  RT,RA (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + CA - 1
 
 Special Registers Altered:
@@ -213,6 +241,8 @@ Z23-Form
 
 * addex RT,RA,RB,CY
 
+Pseudo-code:
+
     if CY=0 then RT <- (RA) + (RB) + OV
 
 Special Registers Altered:
@@ -228,6 +258,8 @@ XO-Form
 * subfzeo RT,RA (OE=1 Rc=0)
 * subfzeo.  RT,RA (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + CA
 
 Special Registers Altered:
@@ -245,6 +277,8 @@ XO-Form
 * addzeo RT,RA (OE=1 Rc=0)
 * addzeo.  RT,RA (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- (RA) + CA
 
 Special Registers Altered:
@@ -262,6 +296,8 @@ XO-Form
 * nego RT,RA (OE=1 Rc=0)
 * nego.  RT,RA (OE=1 Rc=1)
 
+Pseudo-code:
+
     RT <- ¬(RA) + 1
 
 Special Registers Altered:
@@ -275,6 +311,8 @@ D-Form
 
 * mulli RT,RA,SI
 
+Pseudo-code:
+
     prod[0:127] <- (RA) * EXTS(SI)
     RT <- prod[64:127]
 
@@ -289,6 +327,8 @@ XO-Form
 * mulhw RT,RA,RB (Rc=0)
 * mulhw.  RT,RA,RB (Rc=1)
 
+Pseudo-code:
+
     prod[0:63] <- (RA)[32:63] *  (RB)[32:63]
     RT[32:63] <- prod[0:31]
     RT[0:31] <- undefined[0:31]
@@ -306,7 +346,10 @@ XO-Form
 * mullwo RT,RA,RB (OE=1 Rc=0)
 * mullwo.  RT,RA,RB (OE=1 Rc=1)
 
-    RT <- (RA)[32:63] * (RB)[32:63]
+Pseudo-code:
+
+    prod[0:63] <- (RA)[32:63] * (RB)[32:63]
+    RT <- prod
 
 Special Registers Altered:
 
@@ -320,6 +363,8 @@ XO-Form
 * mulhwu RT,RA,RB (Rc=0)
 * mulhwu.  RT,RA,RB (Rc=1)
 
+Pseudo-code:
+
     prod[0:63] <- (RA)[32:63] *  (RB)[32:63]
     RT[32:63] <- prod[0:31]
     RT[0:31] <- undefined[0:31]
@@ -337,10 +382,19 @@ XO-Form
 * divwo RT,RA,RB (OE=1 Rc=0)
 * divwo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:31] <-  (RA)[32:63]
     divisor[0:31] <- (RB) [32:63]
-    RT[32:63] <- dividend / divisor
-    RT[0:31] <- undefined[0:31]
+    if (((dividend = 0x8000_0000) &
+         (divisor = 0xffff_ffff)) |
+         (divisor = 0x0000_0000)) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT[32:63] <- dividend / divisor
+        RT[0:31] <- undefined[0:31]
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -356,10 +410,17 @@ XO-Form
 * divwuo RT,RA,RB (OE=1 Rc=0)
 * divwuo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:31] <- (RA)[32:63]
     divisor[0:31] <- (RB)[32:63]
-    RT[32:63] <-  dividend / divisor
-    RT[0:31] <- undefined[0:31]
+    if divisor != 0 then
+        RT[32:63] <-  dividend / divisor
+        RT[0:31] <- undefined[0:31]
+        overflow <- 0
+    else
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
 
 Special Registers Altered:
 
@@ -375,10 +436,22 @@ XO-Form
 * divweo RT,RA,RB (OE=1 Rc=0)
 * divweo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:63] <- (RA)[32:63] || [0]*32
-    divisor[0:31] <- (RB)[32:63]
-    RT[32:63] <- dividend /  divisor
-    RT[0:31] <- undefined[0:31]
+    divisor[0:63] <- [0]*32 || (RB)[32:63]
+    if (divisor = 0x0000_0000_0000_0000) then
+        overflow <- 1
+    else
+        result <- dividend /  divisor
+        if (result[32:63] = 0) then
+            RT[32:63] <- result[0:31]
+            RT[0:31] <- undefined[0:31]
+            overflow <- 0
+        else
+            overflow <- 1
+    if overflow = 1 then
+        RT[0:63] <- undefined[0:63]
 
 Special Registers Altered:
 
@@ -394,10 +467,22 @@ XO-Form
 * divweuo RT,RA,RB (OE=1 Rc=0)
 * divweuo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:63] <- (RA)[32:63] || [0]*32
-    divisor[0:31] <- (RB)[32:63]
-    RT[32:63] <- dividend / divisor
-    RT[0:31] <- undefined[0:31]
+    divisor[0:63] <- [0]*32 || (RB)[32:63]
+    if (divisor = 0x0000_0000_0000_0000) then
+        overflow <- 1
+    else
+        result <- dividend /  divisor
+        if (RA) < (RB) then
+            RT[32:63] <- result[0:31]
+            RT[0:31] <- undefined[0:31]
+            overflow <- 0
+        else
+            overflow <- 1
+    if overflow = 1 then
+        RT[0:63] <- undefined[0:63]
 
 Special Registers Altered:
 
@@ -410,10 +495,19 @@ X-Form
 
 * modsw RT,RA,RB
 
+Pseudo-code:
+
     dividend[0:31] <- (RA)[32:63]
-    divisor [0:31] <- (RB)[32:63]-
-    RT[32:63] <- dividend % divisor
-    RT[0:31 ] <- undefined[0:31]
+    divisor [0:31] <- (RB)[32:63]
+    if (((dividend = 0x8000_0000) &
+         (divisor = 0xffff_ffff)) |
+         (divisor = 0x0000_0000)) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT[32:63] <- dividend % divisor
+        RT[0:31] <- undefined[0:31]
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -425,10 +519,17 @@ X-Form
 
 * moduw RT,RA,RB
 
+Pseudo-code:
+
     dividend[0:31] <- (RA) [32:63]
     divisor [0:31] <- (RB) [32:63]
-    RT[32:63] <- dividend % divisor
-    RT[0:31 ] <- undefined[0:31]
+    if divisor = 0x0000_0000 then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT[32:63] <- dividend % divisor
+        RT[0:31] <- undefined[0:31]
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -440,6 +541,8 @@ X-Form
 
 * darn RT,L
 
+Pseudo-code:
+
     RT <- random(L)
 
 Special Registers Altered:
@@ -455,6 +558,8 @@ XO-Form
 * mulldo RT,RA,RB (OE=1 Rc=0)
 * mulldo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     prod[0:127] <- (RA) * (RB)
     RT <- prod[64:127]
 
@@ -470,6 +575,8 @@ XO-Form
 * mulhd RT,RA,RB (Rc=0)
 * mulhd.  RT,RA,RB (Rc=1)
 
+Pseudo-code:
+
     prod[0:127] <- (RA) *  (RB)
     RT <- prod[0:63]
 
@@ -484,6 +591,8 @@ XO-Form
 * mulhdu RT,RA,RB (Rc=0)
 * mulhdu.  RT,RA,RB (Rc=1)
 
+Pseudo-code:
+
     prod[0:127] <- (RA) *  (RB)
     RT <- prod[0:63]
 
@@ -497,6 +606,8 @@ VA-Form
 
 * maddhd RT,RA.RB,RC
 
+Pseudo-code:
+
     prod[0:127] <- (RA) * (RB)
     sum[0:127] <- prod + EXTS(RC)
     RT <- sum[0:63]
@@ -511,6 +622,8 @@ VA-Form
 
 * maddhdu RT,RA.RB,RC
 
+Pseudo-code:
+
     prod[0:127] <- (RA) * (RB)
     sum[0:127] <- prod + EXTZ(RC)
     RT <- sum[0:63]
@@ -525,6 +638,8 @@ VA-Form
 
 * maddld RT,RA.RB,RC
 
+Pseudo-code:
+
     prod[0:127] <- (RA) * (RB)
     sum[0:127] <- prod + EXTS(RC)
     RT <- sum[64:127]
@@ -542,9 +657,18 @@ XO-Form
 * divdo RT,RA,RB (OE=1 Rc=0)
 * divdo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:63] <- (RA)
     divisor[0:63] <- (RB)
-    RT <- dividend / divisor
+    if (((dividend = 0x8000_0000_0000_0000) &
+         (divisor = 0xffff_ffff_ffff_ffff)) |
+         (divisor = 0x0000_0000_0000_0000)) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT <- dividend / divisor
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -560,9 +684,16 @@ XO-Form
 * divduo RT,RA,RB (OE=1 Rc=0)
 * divduo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:63] <- (RA)
     divisor[0:63] <- (RB)
-    RT <- dividend / divisor
+    if (divisor = 0x0000_0000_0000_0000) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT <- dividend / divisor
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -578,9 +709,21 @@ XO-Form
 * divdeo RT,RA,RB (OE=1 Rc=0)
 * divdeo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:127] <-  (RA) || [0]*64
-    divisor[0:63] <- (RB)
-    RT <- dividend / divisor
+    divisor[0:127] <- [0*64] || (RB)
+    if divisor = [0]*128 then
+        overflow <- 1
+    else
+        result <- dividend /  divisor
+        if result[64:127] = 0x0000_0000_0000_0000 then
+            RT <- result[63:127]
+            overflow <- 0
+        else
+            overflow <- 1
+    if overflow = 1 then
+        RT[0:63] <- undefined[0:63]
 
 Special Registers Altered:
 
@@ -596,9 +739,21 @@ XO-Form
 * divdeuo RT,RA,RB (OE=1 Rc=0)
 * divdeuo.  RT,RA,RB (OE=1 Rc=1)
 
+Pseudo-code:
+
     dividend[0:127] <-  (RA) || [0]*64
-    divisor[0:63] <- (RB)
-    RT <- dividend / divisor
+    divisor[0:127] <- [0*64] || (RB)
+    if divisor = [0]*128 then
+        overflow <- 1
+    else
+        result <- dividend /  divisor
+        if (RA) < (RB) then
+            RT <- result[63:127]
+            overflow <- 0
+        else
+            overflow <- 1
+    if overflow = 1 then
+        RT[0:63] <- undefined[0:63]
 
 Special Registers Altered:
 
@@ -611,9 +766,18 @@ X-Form
 
 * modsd RT,RA,RB
 
+Pseudo-code:
+
     dividend <- (RA)
     divisor  <- (RB)
-    RT       <- dividend % divisor
+    if (((dividend = 0x8000_0000_0000_0000) &
+         (divisor = 0xffff_ffff_ffff_ffff)) |
+         (divisor = 0x0000_0000_0000_0000)) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT       <- dividend % divisor
+        overflow <- 0
 
 Special Registers Altered:
 
@@ -625,9 +789,16 @@ X-Form
 
 * modud RT,RA,RB
 
+Pseudo-code:
+
     dividend <- (RA)
     divisor  <- (RB)
-    RT       <- dividend % divisor
+    if (divisor = 0x0000_0000_0000_0000) then
+        RT[0:63] <- undefined[0:63]
+        overflow <- 1
+    else
+        RT       <- dividend % divisor
+        overflow <- 0
 
 Special Registers Altered: