]> git.proxmox.com Git - qemu.git/commitdiff
Fix and improve 64 bit immediate loading
authormalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 26 Jul 2008 11:20:50 +0000 (11:20 +0000)
committermalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 26 Jul 2008 11:20:50 +0000 (11:20 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4946 c046a42c-6fe2-441c-8c8c-71466251a162

tcg/ppc64/tcg-target.c

index e45021bde4f7d338bc5b3f86db907541cb314a08..83604ad82fc6b5b4e6e06034a2a46857b57a8ff5 100644 (file)
@@ -448,15 +448,18 @@ static void tcg_out_movi (TCGContext *s, TCGType type,
     }
     else {
         if ((uint64_t) arg >> 32) {
+            uint16_t h16 = arg >> 16;
+            uint16_t l16 = arg;
+
             tcg_out_movi32 (s, ret, (arg >> 32) + (arg32 < 0));
             tcg_out_rld (s, RLDICR, ret, ret, 32, 31);
-            if (arg32) {
-                tcg_out_movi32 (s, 0, arg32);
-                tcg_out32 (s, ADD | TAB (ret, ret, 0));
-            }
+            if (h16) tcg_out32 (s, ORIS | RS (ret) | RA (ret) | h16);
+            if (l16) tcg_out32 (s, ORI | RS (ret) | RA (ret) | l16);
         }
         else {
             tcg_out_movi32 (s, ret, arg32);
+            if (arg32 < 0)
+                tcg_out_rld (s, RLDICL, ret, ret, 0, 32);
         }
     }
 }