i386: Fix up ix86_md_asm_adjust for TImode [PR98086]

ix86_md_asm_adjust assumes that dest_mode can be only [QHSD]Imode
and nothing else.  The patch rewrites zero-extension part to use
convert_to_mode to handle TImode and hypothetically even wider modes.

2020-12-03  Uroš Bizjak  <ubizjak@gmail.com>
	    Jakub Jelinek  <jakub@redhat.com>

gcc/
	PR target/98086
	* config/i386/i386.c (ix86_md_asm_adjustmd): Rewrite
	zero-extension part to use convert_to_mode.

gcc/testsuite/
	PR target/98086
	* gcc.target/i386/pr98086.c: New test.
This commit is contained in:
Uros Bizjak 2020-12-03 17:49:42 +01:00
parent 7254a78cf4
commit 756f55e62f
2 changed files with 27 additions and 32 deletions

View File

@ -21508,40 +21508,18 @@ ix86_md_asm_adjust (vec<rtx> &outputs, vec<rtx> &/*inputs*/,
continue;
}
if (dest_mode == DImode && !TARGET_64BIT)
dest_mode = SImode;
if (dest_mode != QImode)
{
rtx destqi = gen_reg_rtx (QImode);
emit_insn (gen_rtx_SET (destqi, x));
if (TARGET_ZERO_EXTEND_WITH_AND
&& optimize_function_for_speed_p (cfun))
{
x = force_reg (dest_mode, const0_rtx);
emit_insn (gen_movstrictqi (gen_lowpart (QImode, x), destqi));
}
else
{
x = gen_rtx_ZERO_EXTEND (dest_mode, destqi);
if (dest_mode == GET_MODE (dest)
&& !register_operand (dest, GET_MODE (dest)))
x = force_reg (dest_mode, x);
}
}
if (dest_mode != GET_MODE (dest))
{
rtx tmp = gen_reg_rtx (SImode);
emit_insn (gen_rtx_SET (tmp, x));
emit_insn (gen_zero_extendsidi2 (dest, tmp));
}
else
if (dest_mode == QImode)
emit_insn (gen_rtx_SET (dest, x));
else
{
rtx reg = gen_reg_rtx (QImode);
emit_insn (gen_rtx_SET (reg, x));
reg = convert_to_mode (dest_mode, reg, 1);
emit_move_insn (dest, reg);
}
}
rtx_insn *seq = get_insns ();
end_sequence ();

View File

@ -0,0 +1,17 @@
/* PR target/98086 */
/* { dg-do compile } */
/* { dg-options "" } */
#ifdef __x86_64__
typedef __int128 T;
#else
typedef long long T;
#endif
T x;
void
foo (void)
{
__asm ("" : "=@ccc" (x));
}