aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2008-11-21 08:28:27 +0100
committerUros Bizjak <uros@gcc.gnu.org>2008-11-21 08:28:27 +0100
commit974920dc2411fd05a1ff946e30ad76f396f8fca9 (patch)
tree44c85f248e4d5e6310554b3a6ed9ba19321e9597 /gcc
parent941bcbde52dcef1efc4184d83832a1cb0787c2e4 (diff)
downloadgcc-974920dc2411fd05a1ff946e30ad76f396f8fca9.zip
gcc-974920dc2411fd05a1ff946e30ad76f396f8fca9.tar.gz
gcc-974920dc2411fd05a1ff946e30ad76f396f8fca9.tar.bz2
re PR middle-end/37908 (atomic NAND op generate wrong code; __sync_nand_and_fetch, __sync_fetch_and_nand)
PR middle-end/37908 * config/ia64/ia64.c (ia64_expand_atomic_ope): Properly handle NAND case by calculating ~(new_reg & val) instead of (~new_reg & val). * config/ia64/sync.md (sync_nand<mode>): Change insn RTX to (not:IMODE (and:IMODE (...))). (sync_old_nand<mode>): Ditto. (sync_new_nand<mode>): Ditto. From-SVN: r142082
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/config/ia64/ia64.c10
-rw-r--r--gcc/config/ia64/sync.md17
-rw-r--r--gcc/testsuite/ChangeLog2
4 files changed, 29 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dff82f4..d10c08a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,8 +1,17 @@
+2008-11-21 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/37908
+ * config/ia64/ia64.c (ia64_expand_atomic_ope): Properly handle NAND
+ case by calculating ~(new_reg & val) instead of (~new_reg & val).
+ * config/ia64/sync.md (sync_nand<mode>): Change insn RTX
+ to (not:IMODE (and:IMODE (...))).
+ (sync_old_nand<mode>): Ditto.
+ (sync_new_nand<mode>): Ditto.
+
2008-11-20 Joseph Myers <joseph@codesourcery.com>
* config/arm/thumb2.md (thumb2_casesi_internal,
- thumb2_casesi_internal_pic): Use earlyclobber for scratch operand
- 4.
+ thumb2_casesi_internal_pic): Use earlyclobber for scratch operand 4.
2008-11-20 Andreas Krebbel <krebbel1@de.ibm.com>
@@ -102,8 +111,7 @@
PR bootstrap/37790
* ira-int.h (ira_copy_allocno_live_range_list,
- ira_merge_allocno_live_ranges,
- ira_allocno_live_ranges_intersect_p,
+ ira_merge_allocno_live_ranges, ira_allocno_live_ranges_intersect_p,
ira_finish_allocno_live_range_list): New prototypes.
(ira_allocno_live_ranges_intersect_p,
ira_pseudo_live_ranges_intersect_p): Remove.
@@ -176,6 +184,7 @@
are only reductions.
2008-11-19 Hariharan Sandanagobalane <hariharan@picochip.com>
+
* config/picochip/picochip.c (headers): Remove an unnecessary
header file.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 34a37d2..ae77a98 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -2141,11 +2141,13 @@ ia64_expand_atomic_op (enum rtx_code code, rtx mem, rtx val,
new_reg = cmp_reg;
if (code == NOT)
{
- new_reg = expand_simple_unop (DImode, NOT, new_reg, NULL_RTX, true);
- code = AND;
+ new_reg = expand_simple_binop (DImode, AND, new_reg, val, NULL_RTX,
+ true, OPTAB_DIRECT);
+ new_reg = expand_simple_unop (DImode, code, new_reg, NULL_RTX, true);
}
- new_reg = expand_simple_binop (DImode, code, new_reg, val, NULL_RTX,
- true, OPTAB_DIRECT);
+ else
+ new_reg = expand_simple_binop (DImode, code, new_reg, val, NULL_RTX,
+ true, OPTAB_DIRECT);
if (mode != DImode)
new_reg = gen_lowpart (mode, new_reg);
diff --git a/gcc/config/ia64/sync.md b/gcc/config/ia64/sync.md
index c467b0d..69b5d08 100644
--- a/gcc/config/ia64/sync.md
+++ b/gcc/config/ia64/sync.md
@@ -57,8 +57,9 @@
(define_expand "sync_nand<mode>"
[(set (match_operand:IMODE 0 "memory_operand" "")
- (and:IMODE (not:IMODE (match_dup 0))
- (match_operand:IMODE 1 "general_operand" "")))]
+ (not:IMODE
+ (and:IMODE (match_dup 0)
+ (match_operand:IMODE 1 "general_operand" ""))))]
""
{
ia64_expand_atomic_op (NOT, operands[0], operands[1], NULL, NULL);
@@ -78,9 +79,9 @@
(define_expand "sync_old_nand<mode>"
[(set (match_operand:IMODE 0 "gr_register_operand" "")
- (and:IMODE
- (not:IMODE (match_operand:IMODE 1 "memory_operand" ""))
- (match_operand:IMODE 2 "general_operand" "")))]
+ (not:IMODE
+ (and:IMODE (match_operand:IMODE 1 "memory_operand" "")
+ (match_operand:IMODE 2 "general_operand" ""))))]
""
{
ia64_expand_atomic_op (NOT, operands[1], operands[2], operands[0], NULL);
@@ -100,9 +101,9 @@
(define_expand "sync_new_nand<mode>"
[(set (match_operand:IMODE 0 "gr_register_operand" "")
- (and:IMODE
- (not:IMODE (match_operand:IMODE 1 "memory_operand" ""))
- (match_operand:IMODE 2 "general_operand" "")))]
+ (not:IMODE
+ (and:IMODE (match_operand:IMODE 1 "memory_operand" "")
+ (match_operand:IMODE 2 "general_operand" ""))))]
""
{
ia64_expand_atomic_op (NOT, operands[1], operands[2], NULL, operands[0]);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b0901eb..38c36f2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -15,7 +15,7 @@
memcpy optimized into ref-all store.
* gcc.dg/pr29215.c: New test.
-2008-11-19 Uros Bizjak <ubizjak@gmail.com>
+2008-11-20 Uros Bizjak <ubizjak@gmail.com>
PR target/38151
* gcc.target/i386/pr38151-1.c: New test.