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:
Jakub Jelinek 2021-11-15 09:30:08 +01:00
parent 9fa72756d9
commit 625eef42e3
2 changed files with 14 additions and 3 deletions

View file

@ -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;

View 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;
}