Fix signed/unsigned issues of immediate version of brcond (malc)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4588 c046a42c-6fe2-441c-8c8c-71466251a162
diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c
index 13f0fe5..4bbedba 100644
--- a/tcg/ppc/tcg-target.c
+++ b/tcg/ppc/tcg-target.c
@@ -866,18 +866,55 @@
     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 ();
     }