]> xenbits.xensource.com Git - qemu-xen-4.4-testing.git/commitdiff
Fix signed/unsigned issues of immediate version of brcond (malc)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 26 May 2008 19:11:07 +0000 (19:11 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 26 May 2008 19:11:07 +0000 (19:11 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4588 c046a42c-6fe2-441c-8c8c-71466251a162

tcg/ppc/tcg-target.c

index 13f0fe55de14148fd6916bdce45e99a9f718e457..4bbedba3c8bf99651c9365eca0382616607e61d2 100644 (file)
@@ -866,18 +866,55 @@ static void tcg_out_brcond(TCGContext *s, int cond,
     int imm;
     uint32_t op;
 
-    imm = const_arg2 ? ((int16_t) arg2 == arg2) : 0;
     switch (cond) {
-    case TCG_COND_EQ: op = imm ? CMPLI : CMPL; break;
-    case TCG_COND_NE: op = imm ? CMPLI : CMPL; break;
-    case TCG_COND_LT: op = imm ? CMPI : CMP; break;
-    case TCG_COND_GE: op = imm ? CMPI : CMP; break;
-    case TCG_COND_LE: op = imm ? CMPI : CMP; break;
-    case TCG_COND_GT: op = imm ? CMPI : CMP; break;
-    case TCG_COND_LTU: op = imm ? CMPLI : CMPL; break;
-    case TCG_COND_GEU: op = imm ? CMPLI : CMPL; break;
-    case TCG_COND_LEU: op = imm ? CMPLI : CMPL; break;
-    case TCG_COND_GTU: op = imm ? CMPLI : CMPL; break;
+    case TCG_COND_EQ:
+    case TCG_COND_NE:
+        if (const_arg2) {
+            if ((int16_t) arg2 == arg2) {
+                op = CMPI;
+                imm = 1;
+                break;
+            }
+            else if ((uint16_t) arg2 == arg2) {
+                op = CMPLI;
+                imm = 1;
+                break;
+            }
+        }
+        op = CMPL;
+        imm = 0;
+        break;
+
+    case TCG_COND_LT:
+    case TCG_COND_GE:
+    case TCG_COND_LE:
+    case TCG_COND_GT:
+        if (const_arg2) {
+            if ((int16_t) arg2 == arg2) {
+                op = CMPI;
+                imm = 1;
+                break;
+            }
+        }
+        op = CMP;
+        imm = 0;
+        break;
+
+    case TCG_COND_LTU:
+    case TCG_COND_GEU:
+    case TCG_COND_LEU:
+    case TCG_COND_GTU:
+        if (const_arg2) {
+            if ((uint16_t) arg2 == arg2) {
+                op = CMPLI;
+                imm = 1;
+                break;
+            }
+        }
+        op = CMPL;
+        imm = 0;
+        break;
+
     default:
         tcg_abort ();
     }