(no commit message)
authorlkcl <lkcl@web>
Thu, 13 Oct 2022 16:45:42 +0000 (17:45 +0100)
committerIkiWiki <ikiwiki.info>
Thu, 13 Oct 2022 16:45:42 +0000 (17:45 +0100)
openpower/sv/ldst.mdwn

index 8562d32c20cdbeaa5d4c2c82e0e964779774e8fd..49682f8d8807c4c9104c4b18919d81eafda3abe8 100644 (file)
@@ -242,7 +242,11 @@ with the pseudocode below, the immediate can be used to give unit stride or elem
         if (RA.isvec) while (!(ps & 1<<i)) i++;
         if (RAupdate.isvec) while (!(ps & 1<<u)) u++;
         if (RT.isvec) while (!(pd & 1<<j)) j++;
-        if svctx.ldstmode == elementstride:
+        if postinc:
+            offs = 0; # added afterwards
+            if RA.isvec: srcbase = ireg[RA+i]
+            else         srcbase = ireg[RA]
+        elif svctx.ldstmode == elementstride:
           # element stride mode
           srcbase = ireg[RA]
           offs = i * immed              # j*immed for a ST
@@ -262,10 +266,12 @@ with the pseudocode below, the immediate can be used to give unit stride or elem
 
         # compute EA
         EA = srcbase + offs
-        # update RA?
-        if RAupdate: ireg[RAupdate+u] = EA;
         # load from memory
         ireg[RT+j] <= MEM[EA];
+        # check post-increment of EA
+        if postinc: EA = srcbase + immed;
+        # update RA?
+        if RAupdate: ireg[RAupdate+u] = EA;
         if (!RT.isvec)
             break # destination scalar, end now
         if (RA.isvec) i++;