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:
parent
9fa72756d9
commit
625eef42e3
2 changed files with 14 additions and 3 deletions
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue