mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 01:50:34 +08:00
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:
parent
7254a78cf4
commit
756f55e62f
@ -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 ();
|
||||
|
||||
|
17
gcc/testsuite/gcc.target/i386/pr98086.c
Normal file
17
gcc/testsuite/gcc.target/i386/pr98086.c
Normal 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));
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user