Author: zhuqing
Date: 2011-09-23 02:34:31 -0400 (Fri, 23 Sep 2011)
New Revision: 3741

Modified:
   trunk/osprey/be/cg/ia64/cgtarget.cxx
   trunk/osprey/be/cg/ia64/exp_loadstore.cxx
   trunk/osprey/be/cg/localize.cxx
   trunk/osprey/be/cg/whirl2ops.cxx
Log:
Fix bug792, support constraint "b" used in inline asm on IA-64.

Code Review:Jian-xin.


Modified: trunk/osprey/be/cg/ia64/cgtarget.cxx
===================================================================
--- trunk/osprey/be/cg/ia64/cgtarget.cxx        2011-09-22 08:42:08 UTC (rev 
3740)
+++ trunk/osprey/be/cg/ia64/cgtarget.cxx        2011-09-23 06:34:31 UTC (rev 
3741)
@@ -3650,6 +3650,13 @@
     ret_tn = (pref_tn ? pref_tn : Build_TN_Of_Mtype(rtype));
   }
 
+  else if (*constraint == 'b') {
+    TYPE_ID rtype = (load != NULL ? WN_rtype(load) : Pointer_Mtype);
+    FmtAssert(rtype == Pointer_Mtype,
+              ("ASM operand does not satisfy its constraint"));
+    ret_tn = (pref_tn ? pref_tn : Build_TN_Of_Mtype(MTYPE_A8));
+  }
+
   else {
     FmtAssert(FALSE, ("ASM constraint <%s> not supported", constraint));
   }

Modified: trunk/osprey/be/cg/ia64/exp_loadstore.cxx
===================================================================
--- trunk/osprey/be/cg/ia64/exp_loadstore.cxx   2011-09-22 08:42:08 UTC (rev 
3740)
+++ trunk/osprey/be/cg/ia64/exp_loadstore.cxx   2011-09-23 06:34:31 UTC (rev 
3741)
@@ -169,9 +169,14 @@
     Build_OP (top, result, True_TN, Gen_Enum_TN(ldhint), base, ops);
   } else {
     ISA_ENUM_CLASS_VALUE ldtype = Pick_Load_Type (variant, mtype);
-    Build_OP (top, result, True_TN, 
+    // can not load to branch register directly
+    TN* tmp_res = (TN_register_class(result) == ISA_REGISTER_CLASS_branch) ?
+                  Build_TN_Of_Mtype(mtype) : result;
+    Build_OP (top, tmp_res, True_TN, 
              Gen_Enum_TN(ldtype), Gen_Enum_TN(ldhint), 
              base, ops);
+    if (tmp_res != result)
+      Exp_COPY(result, tmp_res, ops);
   }
 }
 
@@ -260,8 +265,14 @@
     Build_OP (top, True_TN, Gen_Enum_TN(sthint), base, src, ops);
   } else {
     ISA_ENUM_CLASS_VALUE sttype = Pick_Store_Type (variant);
+    // can not store branch register to memory directly
+    TN* tmp_src = src;
+    if (TN_register_class(src) == ISA_REGISTER_CLASS_branch) {
+      tmp_src = Build_TN_Of_Mtype(mtype);
+      Exp_COPY(tmp_src, src, ops);
+    }
     Build_OP (top, True_TN, Gen_Enum_TN(sttype), Gen_Enum_TN(sthint),
-             base, src, ops);
+             base, tmp_src, ops);
   }
 }
 
@@ -491,8 +502,14 @@
     }
     Reset_TN_is_fpu_int(result);
   }
-  else
-    Expand_Composed_Load(op, result, base, disp, variant, ops);
+  else {
+    // can not load to branch register directly
+    TN* tmp_res = (TN_register_class(result) == ISA_REGISTER_CLASS_branch) ?
+                  Build_TN_Of_Mtype(rtype) : result;
+    Expand_Composed_Load(op, tmp_res, base, disp, variant, ops);
+    if (tmp_res != result)
+      Exp_COPY(result, tmp_res, ops);
+  }
 }
 
 
@@ -608,8 +625,15 @@
       /*NOTREACHED*/
     }
   }
-  else
-    Expand_Composed_Store(mtype, obj, base, disp, variant, ops);
+  else {
+    // can not store branch register to memory directly
+    TN* tmp_obj = obj;
+    if (TN_register_class(obj) == ISA_REGISTER_CLASS_branch) {
+      tmp_obj = Build_TN_Of_Mtype(mtype);
+      Exp_COPY(tmp_obj, obj, ops);
+    }
+    Expand_Composed_Store(mtype, tmp_obj, base, disp, variant, ops);
+  }
 }
 
 static void

Modified: trunk/osprey/be/cg/localize.cxx
===================================================================
--- trunk/osprey/be/cg/localize.cxx     2011-09-22 08:42:08 UTC (rev 3740)
+++ trunk/osprey/be/cg/localize.cxx     2011-09-23 06:34:31 UTC (rev 3741)
@@ -534,8 +534,11 @@
        {
                if (def && BB_call(current_bb))
                        ;       // okay
-               else if (def && BB_asm(current_bb))
+               else if (BB_asm(current_bb))
                        ;       // okay
+               else if (BB_prev(current_bb) != NULL
+                        && BB_asm(BB_prev(current_bb)))
+                        ;       // okay
                else if (def && !BB_call(current_bb)) {
                        Localize_Global_Param_Reg (current_bb, tn);
                } 

Modified: trunk/osprey/be/cg/whirl2ops.cxx
===================================================================
--- trunk/osprey/be/cg/whirl2ops.cxx    2011-09-22 08:42:08 UTC (rev 3740)
+++ trunk/osprey/be/cg/whirl2ops.cxx    2011-09-23 06:34:31 UTC (rev 3741)
@@ -1421,6 +1421,10 @@
   else {
     i += Int_Preg_Min_Offset;
   }
+#elif defined(TARG_IA64)
+  else if (TN_register_class(tn) == ISA_REGISTER_CLASS_branch) {
+    i += Branch_Preg_Min_Offset;
+  }
 #endif  
   return i;
 }


------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2dcopy2
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to