i386: Remove atomic_storedi_fpu and atomic_loaddi_fpu peepholes [PR100182]
These patterns result in non-atomic sequence. 2021-07-21 Uroš Bizjak <ubizjak@gmail.com> gcc/ PR target/100182 * config/i386/sync.md (define_peephole2 atomic_storedi_fpu): Remove. (define_peephole2 atomic_loaddi_fpu): Ditto. gcc/testsuite/ PR target/100182 * gcc.target/i386/pr71245-1.c: Remove. * gcc.target/i386/pr71245-2.c: Ditto.
This commit is contained in:
parent
e695f0101a
commit
6d4da4aeef
|
@ -219,82 +219,6 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "fp_register_operand")
|
||||
(unspec:DF [(match_operand:DI 1 "memory_operand")]
|
||||
UNSPEC_FILD_ATOMIC))
|
||||
(set (match_operand:DI 2 "memory_operand")
|
||||
(unspec:DI [(match_dup 0)]
|
||||
UNSPEC_FIST_ATOMIC))
|
||||
(set (match_operand:DF 3 "sse_reg_operand")
|
||||
(match_operand:DF 4 "memory_operand"))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (2, operands[0])
|
||||
&& rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))"
|
||||
[(set (match_dup 3) (match_dup 5))
|
||||
(set (match_dup 4) (match_dup 3))]
|
||||
"operands[5] = gen_lowpart (DFmode, operands[1]);")
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "fp_register_operand")
|
||||
(unspec:DF [(match_operand:DI 1 "memory_operand")]
|
||||
UNSPEC_FILD_ATOMIC))
|
||||
(set (match_operand:DI 2 "memory_operand")
|
||||
(unspec:DI [(match_dup 0)]
|
||||
UNSPEC_FIST_ATOMIC))
|
||||
(set (mem:BLK (scratch:SI))
|
||||
(unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE))
|
||||
(set (match_operand:DF 3 "sse_reg_operand")
|
||||
(match_operand:DF 4 "memory_operand"))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (2, operands[0])
|
||||
&& rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))"
|
||||
[(const_int 0)]
|
||||
{
|
||||
emit_move_insn (operands[3], gen_lowpart (DFmode, operands[1]));
|
||||
emit_move_insn (operands[4], operands[3]);
|
||||
emit_insn (gen_memory_blockage ());
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "sse_reg_operand")
|
||||
(unspec:DF [(match_operand:DI 1 "memory_operand")]
|
||||
UNSPEC_LDX_ATOMIC))
|
||||
(set (match_operand:DI 2 "memory_operand")
|
||||
(unspec:DI [(match_dup 0)]
|
||||
UNSPEC_STX_ATOMIC))
|
||||
(set (match_operand:DF 3 "sse_reg_operand")
|
||||
(match_operand:DF 4 "memory_operand"))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (2, operands[0])
|
||||
&& rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))"
|
||||
[(set (match_dup 3) (match_dup 5))
|
||||
(set (match_dup 4) (match_dup 3))]
|
||||
"operands[5] = gen_lowpart (DFmode, operands[1]);")
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "sse_reg_operand")
|
||||
(unspec:DF [(match_operand:DI 1 "memory_operand")]
|
||||
UNSPEC_LDX_ATOMIC))
|
||||
(set (match_operand:DI 2 "memory_operand")
|
||||
(unspec:DI [(match_dup 0)]
|
||||
UNSPEC_STX_ATOMIC))
|
||||
(set (mem:BLK (scratch:SI))
|
||||
(unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE))
|
||||
(set (match_operand:DF 3 "sse_reg_operand")
|
||||
(match_operand:DF 4 "memory_operand"))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (2, operands[0])
|
||||
&& rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))"
|
||||
[(const_int 0)]
|
||||
{
|
||||
emit_move_insn (operands[3], gen_lowpart (DFmode, operands[1]));
|
||||
emit_move_insn (operands[4], operands[3]);
|
||||
emit_insn (gen_memory_blockage ());
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "atomic_store<mode>"
|
||||
[(set (match_operand:ATOMIC 0 "memory_operand")
|
||||
(unspec:ATOMIC [(match_operand:ATOMIC 1 "nonimmediate_operand")
|
||||
|
@ -384,82 +308,6 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "memory_operand")
|
||||
(match_operand:DF 1 "any_fp_register_operand"))
|
||||
(set (match_operand:DF 2 "fp_register_operand")
|
||||
(unspec:DF [(match_operand:DI 3 "memory_operand")]
|
||||
UNSPEC_FILD_ATOMIC))
|
||||
(set (match_operand:DI 4 "memory_operand")
|
||||
(unspec:DI [(match_dup 2)]
|
||||
UNSPEC_FIST_ATOMIC))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (3, operands[2])
|
||||
&& rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))"
|
||||
[(set (match_dup 0) (match_dup 1))
|
||||
(set (match_dup 5) (match_dup 1))]
|
||||
"operands[5] = gen_lowpart (DFmode, operands[4]);")
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "memory_operand")
|
||||
(match_operand:DF 1 "any_fp_register_operand"))
|
||||
(set (mem:BLK (scratch:SI))
|
||||
(unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE))
|
||||
(set (match_operand:DF 2 "fp_register_operand")
|
||||
(unspec:DF [(match_operand:DI 3 "memory_operand")]
|
||||
UNSPEC_FILD_ATOMIC))
|
||||
(set (match_operand:DI 4 "memory_operand")
|
||||
(unspec:DI [(match_dup 2)]
|
||||
UNSPEC_FIST_ATOMIC))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (4, operands[2])
|
||||
&& rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))"
|
||||
[(const_int 0)]
|
||||
{
|
||||
emit_move_insn (operands[0], operands[1]);
|
||||
emit_insn (gen_memory_blockage ());
|
||||
emit_move_insn (gen_lowpart (DFmode, operands[4]), operands[1]);
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "memory_operand")
|
||||
(match_operand:DF 1 "any_fp_register_operand"))
|
||||
(set (match_operand:DF 2 "sse_reg_operand")
|
||||
(unspec:DF [(match_operand:DI 3 "memory_operand")]
|
||||
UNSPEC_LDX_ATOMIC))
|
||||
(set (match_operand:DI 4 "memory_operand")
|
||||
(unspec:DI [(match_dup 2)]
|
||||
UNSPEC_STX_ATOMIC))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (3, operands[2])
|
||||
&& rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))"
|
||||
[(set (match_dup 0) (match_dup 1))
|
||||
(set (match_dup 5) (match_dup 1))]
|
||||
"operands[5] = gen_lowpart (DFmode, operands[4]);")
|
||||
|
||||
(define_peephole2
|
||||
[(set (match_operand:DF 0 "memory_operand")
|
||||
(match_operand:DF 1 "any_fp_register_operand"))
|
||||
(set (mem:BLK (scratch:SI))
|
||||
(unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE))
|
||||
(set (match_operand:DF 2 "sse_reg_operand")
|
||||
(unspec:DF [(match_operand:DI 3 "memory_operand")]
|
||||
UNSPEC_LDX_ATOMIC))
|
||||
(set (match_operand:DI 4 "memory_operand")
|
||||
(unspec:DI [(match_dup 2)]
|
||||
UNSPEC_STX_ATOMIC))]
|
||||
"!TARGET_64BIT
|
||||
&& peep2_reg_dead_p (4, operands[2])
|
||||
&& rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))"
|
||||
[(const_int 0)]
|
||||
{
|
||||
emit_move_insn (operands[0], operands[1]);
|
||||
emit_insn (gen_memory_blockage ());
|
||||
emit_move_insn (gen_lowpart (DFmode, operands[4]), operands[1]);
|
||||
DONE;
|
||||
})
|
||||
|
||||
;; ??? You'd think that we'd be able to perform this via FLOAT + FIX_TRUNC
|
||||
;; operations. But the fix_trunc patterns want way more setup than we want
|
||||
;; to provide. Note that the scratch is DFmode instead of XFmode in order
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
/* PR target/71245 */
|
||||
/* { dg-do compile { target ia32 } } */
|
||||
/* { dg-options "-O2 -march=pentium -mno-sse -mfpmath=387" } */
|
||||
|
||||
typedef union
|
||||
{
|
||||
unsigned long long ll;
|
||||
double d;
|
||||
} u_t;
|
||||
|
||||
u_t d = { .d = 5.0 };
|
||||
|
||||
void foo_d (void)
|
||||
{
|
||||
u_t tmp;
|
||||
|
||||
tmp.ll = __atomic_load_n (&d.ll, __ATOMIC_SEQ_CST);
|
||||
tmp.d += 1.0;
|
||||
__atomic_store_n (&d.ll, tmp.ll, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "(fistp|fild)" { xfail *-*-* } } } */
|
|
@ -1,22 +0,0 @@
|
|||
/* PR target/71245 */
|
||||
/* { dg-do compile { target ia32 } } */
|
||||
/* { dg-options "-O2 -march=pentium -msse -mno-sse2 -mfpmath=387" } */
|
||||
|
||||
typedef union
|
||||
{
|
||||
unsigned long long ll;
|
||||
double d;
|
||||
} u_t;
|
||||
|
||||
u_t d = { .d = 5.0 };
|
||||
|
||||
void foo_d (void)
|
||||
{
|
||||
u_t tmp;
|
||||
|
||||
tmp.ll = __atomic_load_n (&d.ll, __ATOMIC_SEQ_CST);
|
||||
tmp.d += 1.0;
|
||||
__atomic_store_n (&d.ll, tmp.ll, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "movlps" { xfail *-*-* } } } */
|
Loading…
Reference in New Issue