arch-power: Add fixed-point compare instructions
authorSandipan Das <sandipan@linux.vnet.ibm.com>
Thu, 7 Jun 2018 09:15:03 +0000 (14:45 +0530)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 24 Jan 2021 03:24:26 +0000 (03:24 +0000)
This adds the following compare instructions:
  * Compare Ranged Byte (cmprb)
  * Compare Equal Byte (cmpeqb)

Change-Id: I44765b3a9a8f0a3d81ecd6984efce3fd01ba4b24
Signed-off-by: Sandipan Das <sandipan@linux.vnet.ibm.com>
src/arch/power/isa/decoder.isa
src/arch/power/isa/formats/integer.isa

index bf1eaf941f3f323e65828b0bbf4543b9208ecdad..2154de279c211ec84fab5cb479109c17552b380c 100644 (file)
@@ -474,6 +474,28 @@ decode PO default Unknown::unknown() {
                     cr = makeCRField((uint32_t)Ra, (uint32_t)Rb, xer.so);
                 }
             }});
+
+            192: cmprb({{
+                uint32_t src1 = Ra_ub;
+                uint32_t src2 = Rb_uw;
+                uint8_t src2lo = src2 & 0xff;
+                uint8_t src2hi = (src2 >>= 8) & 0xff;
+                uint32_t res = (src2lo <= src1) & (src1 <= src2hi);
+                if (length) {
+                    src2lo = (src2 >>= 8) & 0xff;
+                    src2hi = (src2 >>= 8) & 0xff;
+                    res = ((src2lo <= src1) & (src1 <= src2hi)) | res;
+                }
+                cr = res << 2;
+            }});
+
+            224: cmpeqb({{
+                const uint64_t m1 = 0x0101010101010101;
+                const uint64_t m2 = 0x8080808080808080;
+                uint64_t res = Rb ^ (Ra_ub * m1);
+                res = (res - m1) & ~res & m2;
+                cr = (res != 0) << 2;
+            }});
         }
 
         // Integer logic instructions use source registers Rs and Rb,
index 3fa058befc3c9b70fa9fa459d36e72c2194fc136..a22e4fd95015dd4bc1c65568ec478ebc3fb7cf80 100644 (file)
@@ -65,7 +65,7 @@ def template IntRcOeConstructor {{
 
 let {{
 
-readXERCode = 'Xer xer = XER;'
+readXERCode = 'Xer xer M5_VAR_USED = XER;'
 
 setXERCode = 'XER = xer;'