mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 23:25:24 +02:00
i386: Fix up x86 atomic_bit_test* expanders for !TARGET_HIMODE_MATH [PR103205]
With !TARGET_HIMODE_MATH, the OPTAB_DIRECT expand_simple_binop fail and so we ICE. We don't really care if they are done promoted in SImode instead. 2021-11-15 Jakub Jelinek <jakub@redhat.com> PR target/103205 * config/i386/sync.md (atomic_bit_test_and_set<mode>, atomic_bit_test_and_complement<mode>, atomic_bit_test_and_reset<mode>): Use OPTAB_WIDEN instead of OPTAB_DIRECT. * gcc.target/i386/pr103205.c: New test.
This commit is contained in:
@@ -726,7 +726,7 @@
|
||||
rtx result = convert_modes (<MODE>mode, QImode, tem, 1);
|
||||
if (operands[4] == const0_rtx)
|
||||
result = expand_simple_binop (<MODE>mode, ASHIFT, result,
|
||||
operands[2], operands[0], 0, OPTAB_DIRECT);
|
||||
operands[2], operands[0], 0, OPTAB_WIDEN);
|
||||
if (result != operands[0])
|
||||
emit_move_insn (operands[0], result);
|
||||
DONE;
|
||||
@@ -763,7 +763,7 @@
|
||||
rtx result = convert_modes (<MODE>mode, QImode, tem, 1);
|
||||
if (operands[4] == const0_rtx)
|
||||
result = expand_simple_binop (<MODE>mode, ASHIFT, result,
|
||||
operands[2], operands[0], 0, OPTAB_DIRECT);
|
||||
operands[2], operands[0], 0, OPTAB_WIDEN);
|
||||
if (result != operands[0])
|
||||
emit_move_insn (operands[0], result);
|
||||
DONE;
|
||||
@@ -801,7 +801,7 @@
|
||||
rtx result = convert_modes (<MODE>mode, QImode, tem, 1);
|
||||
if (operands[4] == const0_rtx)
|
||||
result = expand_simple_binop (<MODE>mode, ASHIFT, result,
|
||||
operands[2], operands[0], 0, OPTAB_DIRECT);
|
||||
operands[2], operands[0], 0, OPTAB_WIDEN);
|
||||
if (result != operands[0])
|
||||
emit_move_insn (operands[0], result);
|
||||
DONE;
|
||||
|
||||
11
gcc/testsuite/gcc.target/i386/pr103205.c
Normal file
11
gcc/testsuite/gcc.target/i386/pr103205.c
Normal file
@@ -0,0 +1,11 @@
|
||||
/* PR target/103205 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mtune-ctrl=^himode_math" } */
|
||||
|
||||
unsigned short a;
|
||||
|
||||
unsigned short
|
||||
foo (void)
|
||||
{
|
||||
return __sync_fetch_and_and (&a, ~1) & 1;
|
||||
}
|
||||
Reference in New Issue
Block a user