OSDN Git Service

2003-04-25 H.J. Lu <hjl@gnu.org>
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Apr 2003 22:09:12 +0000 (22:09 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Apr 2003 22:09:12 +0000 (22:09 +0000)
* config/ia64/ia64.c (ia64_expand_compare_and_swap): Add rmode
for return mode.
(ia64_expand_builtin): Set rmode to SImode for
IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI,
IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI and
IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI. Set remode to DImode
for IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66077 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 7cee62a..43cab67 100644 (file)
@@ -1,3 +1,13 @@
+2003-04-25  H.J. Lu <hjl@gnu.org>
+
+       * config/ia64/ia64.c (ia64_expand_compare_and_swap): Add rmode
+       for return mode.
+       (ia64_expand_builtin): Set rmode to SImode for
+       IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI,
+       IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI and
+       IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI. Set remode to DImode
+       for IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI.
+
 2003-04-25  Phil Edwards  <pme@gcc.gnu.org>
 
        * configure.in (make_compare_target):  Test for GNU cmp and set this
index 3fb27dd..eed9a7b 100644 (file)
@@ -197,8 +197,9 @@ static rtx ia64_expand_fetch_and_op PARAMS ((optab, enum machine_mode,
                                             tree, rtx));
 static rtx ia64_expand_op_and_fetch PARAMS ((optab, enum machine_mode,
                                             tree, rtx));
-static rtx ia64_expand_compare_and_swap PARAMS ((enum machine_mode, int,
-                                                tree, rtx));
+static rtx ia64_expand_compare_and_swap PARAMS ((enum machine_mode,
+                                                enum machine_mode,
+                                                int, tree, rtx));
 static rtx ia64_expand_lock_test_and_set PARAMS ((enum machine_mode,
                                                  tree, rtx));
 static rtx ia64_expand_lock_release PARAMS ((enum machine_mode, tree, rtx));
@@ -8026,7 +8027,8 @@ ia64_expand_op_and_fetch (binoptab, mode, arglist, target)
 */
 
 static rtx
-ia64_expand_compare_and_swap (mode, boolp, arglist, target)
+ia64_expand_compare_and_swap (rmode, mode, boolp, arglist, target)
+     enum machine_mode rmode;
      enum machine_mode mode;
      int boolp;
      tree arglist;
@@ -8074,7 +8076,7 @@ ia64_expand_compare_and_swap (mode, boolp, arglist, target)
   if (boolp)
     {
       if (! target)
-       target = gen_reg_rtx (mode);
+       target = gen_reg_rtx (rmode);
       return emit_store_flag_force (target, EQ, tmp, old, mode, 1, 1);
     }
   else
@@ -8149,11 +8151,16 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
   tree arglist = TREE_OPERAND (exp, 1);
+  enum machine_mode rmode;
 
   switch (fcode)
     {
     case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI:
     case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI:
+      mode = SImode;
+      rmode = SImode;
+      break;
+
     case IA64_BUILTIN_LOCK_TEST_AND_SET_SI:
     case IA64_BUILTIN_LOCK_RELEASE_SI:
     case IA64_BUILTIN_FETCH_AND_ADD_SI:
@@ -8172,7 +8179,15 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
       break;
 
     case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI:
+      mode = DImode;
+      rmode = SImode;
+      break;
+
     case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI:
+      mode = DImode;
+      rmode = DImode;
+      break;
+
     case IA64_BUILTIN_LOCK_TEST_AND_SET_DI:
     case IA64_BUILTIN_LOCK_RELEASE_DI:
     case IA64_BUILTIN_FETCH_AND_ADD_DI:
@@ -8198,11 +8213,13 @@ ia64_expand_builtin (exp, target, subtarget, mode, ignore)
     {
     case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_SI:
     case IA64_BUILTIN_BOOL_COMPARE_AND_SWAP_DI:
-      return ia64_expand_compare_and_swap (mode, 1, arglist, target);
+      return ia64_expand_compare_and_swap (rmode, mode, 1, arglist,
+                                          target);
 
     case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_SI:
     case IA64_BUILTIN_VAL_COMPARE_AND_SWAP_DI:
-      return ia64_expand_compare_and_swap (mode, 0, arglist, target);
+      return ia64_expand_compare_and_swap (rmode, mode, 0, arglist,
+                                          target);
 
     case IA64_BUILTIN_SYNCHRONIZE:
       emit_insn (gen_mf ());