arch-power: Add MSR and associated dependencies
[gem5.git] / src / arch / power / isa / formats / integer.isa
index 3ab9ad9236fdc6ffbbb48615439af144390b9930..5a353d0ae2085b71e3a56c6435b48cd229e6c7a8 100644 (file)
@@ -76,38 +76,60 @@ readXERCode = 'M5_VAR_USED Xer xer = XER;'
 setXERCode = 'XER = xer;'
 
 computeCR0Code = '''
+{
     Cr cr = CR;
-    cr.cr0 = makeCRField((int64_t)%(result)s, (int64_t)0, xer.so);
+    Msr msr = MSR;
+    cr.cr0 = msr.sf ?
+             makeCRField((int64_t)%(result)s, (int64_t)0, xer.so) :
+             makeCRField((int32_t)%(result)s, (int32_t)0, xer.so);
     CR = cr;
+}
 '''
 
 computeCACode = '''
-    if (findCarry(64, %(result)s, %(inputa)s, %(inputb)s)) {
+{
+    Msr msr = MSR;
+    if (findCarry(32, %(result)s, %(inputa)s, %(inputb)s)) {
         xer.ca = 1;
+        xer.ca32 = 1;
     } else {
         xer.ca = 0;
+        xer.ca32 = 0;
     }
 
-    if (findCarry(32, %(result)s, %(inputa)s, %(inputb)s)) {
-        xer.ca32 = 1;
-    } else {
-        xer.ca32 = 0;
+    if (msr.sf) {
+        if (findCarry(64, %(result)s, %(inputa)s, %(inputb)s)) {
+            xer.ca = 1;
+        } else {
+            xer.ca = 0;
+        }
     }
+}
 '''
 
 computeOVCode = '''
-    if (findOverflow(64, %(result)s, %(inputa)s, %(inputb)s)) {
+{
+    Msr msr = MSR;
+    if (findOverflow(32, %(result)s, %(inputa)s, %(inputb)s)) {
         xer.ov = 1;
-        xer.so = 1;
+        xer.ov32 = 1;
     } else {
         xer.ov = 0;
+        xer.ov32 = 0;
     }
 
-    if (findOverflow(32, %(result)s, %(inputa)s, %(inputb)s)) {
-        xer.ov32 = 1;
-    } else {
-        xer.ov32 = 0;
+    if (msr.sf) {
+        if (findOverflow(64, %(result)s, %(inputa)s, %(inputb)s)) {
+            xer.ov = 1;
+        } else {
+            xer.ov = 0;
+        }
+    }
+
+    if (xer.ov) {
+        xer.so = 1;
     }
+}
 '''
 
 setCACode = '''