diff options
author | H.J. Lu <hjl@gnu.org> | 2003-04-25 22:09:12 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2003-04-25 15:09:12 -0700 |
commit | 60986d641cd605023d4535d342c19ae1bbbe7db6 (patch) | |
tree | 04921574615e213a6f07b3d82e9412da50b6118a | |
parent | d45148c102f8f563cd11194972ce46c95dbc696f (diff) | |
download | gcc-60986d641cd605023d4535d342c19ae1bbbe7db6.zip gcc-60986d641cd605023d4535d342c19ae1bbbe7db6.tar.gz gcc-60986d641cd605023d4535d342c19ae1bbbe7db6.tar.bz2 |
ia64.c (ia64_expand_compare_and_swap): Add rmode for return mode.
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.
From-SVN: r66077
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 29 |
2 files changed, 33 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7cee62a..43cab67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 3fb27dd..eed9a7b 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -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 ()); |