Commit 35238bb5 by Uros Bizjak

sync.md (UNSPEC_MOVA): Remove.

	* config/i386/sync.md (UNSPEC_MOVA): Remove.
	(atomic_load<mode>): Change operand 0 predicate to
	nonimmediate_operand and fix up the destination when needed.
	Use UNSPEC_LDA.
	(atomic_loaddi_fpu): Use UNSPEC_LDA.
	(atomic_store<mode>): Change operand 1 predicate to
	nonimmendate_operand and move the source to register when needed.
	Use UNSPEC_STA.
	(atomic_store<mode>_1): Use UNSPEC_STA.
	(atomic_storedi_fpu): Change operand 1 to nonimmediate_operand.
	Fix moves from memory operand.  Use UNSPEC_STA.

From-SVN: r221811
parent f87cb0b7
2015-04-01 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sync.md (UNSPEC_MOVA): Remove.
(atomic_load<mode>): Change operand 0 predicate to
nonimmediate_operand and fix up the destination when needed.
Use UNSPEC_LDA.
(atomic_loaddi_fpu): Use UNSPEC_LDA.
(atomic_store<mode>): Change operand 1 predicate to
nonimmendate_operand and move the source to register when needed.
Use UNSPEC_STA.
(atomic_store<mode>_1): Use UNSPEC_STA.
(atomic_storedi_fpu): Change operand 1 to nonimmediate_operand.
Fix moves from memory operand. Use UNSPEC_STA.
2015-04-01 Bernd Edlinger <bernd.edlinger@hotmail.de> 2015-04-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
* expmed.c (strict_volatile_bitfield_p): Check that the access will * expmed.c (strict_volatile_bitfield_p): Check that the access will
...@@ -8,8 +22,8 @@ ...@@ -8,8 +22,8 @@
2015-04-01 Max Ostapenko <m.ostapenko@partner.samsung.com> 2015-04-01 Max Ostapenko <m.ostapenko@partner.samsung.com>
PR target/65624 PR target/65624
* config/aarch64/aarch64-builtins.c (aarch64_simd_expand_builtin): Increase * config/aarch64/aarch64-builtins.c (aarch64_simd_expand_builtin):
args array size by one to avoid buffer overflow. Increase args array size by one to avoid buffer overflow.
2015-03-31 Jan Hubicka <hubicka@ucw.cz> 2015-03-31 Jan Hubicka <hubicka@ucw.cz>
......
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
UNSPEC_LFENCE UNSPEC_LFENCE
UNSPEC_SFENCE UNSPEC_SFENCE
UNSPEC_MFENCE UNSPEC_MFENCE
UNSPEC_MOVA ; For __atomic support
;; __atomic support
UNSPEC_LDA UNSPEC_LDA
UNSPEC_STA UNSPEC_STA
]) ])
...@@ -140,10 +141,10 @@ ...@@ -140,10 +141,10 @@
]) ])
(define_expand "atomic_load<mode>" (define_expand "atomic_load<mode>"
[(set (match_operand:ATOMIC 0 "register_operand") [(set (match_operand:ATOMIC 0 "nonimmediate_operand")
(unspec:ATOMIC [(match_operand:ATOMIC 1 "memory_operand") (unspec:ATOMIC [(match_operand:ATOMIC 1 "memory_operand")
(match_operand:SI 2 "const_int_operand")] (match_operand:SI 2 "const_int_operand")]
UNSPEC_MOVA))] UNSPEC_LDA))]
"" ""
{ {
/* For DImode on 32-bit, we can use the FPU to perform the load. */ /* For DImode on 32-bit, we can use the FPU to perform the load. */
...@@ -152,14 +153,25 @@ ...@@ -152,14 +153,25 @@
(operands[0], operands[1], (operands[0], operands[1],
assign_386_stack_local (DImode, SLOT_TEMP))); assign_386_stack_local (DImode, SLOT_TEMP)));
else else
emit_move_insn (operands[0], operands[1]); {
rtx dst = operands[0];
if (MEM_P (dst))
dst = gen_reg_rtx (<MODE>mode);
emit_move_insn (dst, operands[1]);
/* Fix up the destination if needed. */
if (dst != operands[0])
emit_move_insn (operands[0], dst);
}
DONE; DONE;
}) })
(define_insn_and_split "atomic_loaddi_fpu" (define_insn_and_split "atomic_loaddi_fpu"
[(set (match_operand:DI 0 "nonimmediate_operand" "=x,m,?r") [(set (match_operand:DI 0 "nonimmediate_operand" "=x,m,?r")
(unspec:DI [(match_operand:DI 1 "memory_operand" "m,m,m")] (unspec:DI [(match_operand:DI 1 "memory_operand" "m,m,m")]
UNSPEC_MOVA)) UNSPEC_LDA))
(clobber (match_operand:DI 2 "memory_operand" "=X,X,m")) (clobber (match_operand:DI 2 "memory_operand" "=X,X,m"))
(clobber (match_scratch:DF 3 "=X,xf,xf"))] (clobber (match_scratch:DF 3 "=X,xf,xf"))]
"!TARGET_64BIT && (TARGET_80387 || TARGET_SSE)" "!TARGET_64BIT && (TARGET_80387 || TARGET_SSE)"
...@@ -197,9 +209,9 @@ ...@@ -197,9 +209,9 @@
(define_expand "atomic_store<mode>" (define_expand "atomic_store<mode>"
[(set (match_operand:ATOMIC 0 "memory_operand") [(set (match_operand:ATOMIC 0 "memory_operand")
(unspec:ATOMIC [(match_operand:ATOMIC 1 "register_operand") (unspec:ATOMIC [(match_operand:ATOMIC 1 "nonimmediate_operand")
(match_operand:SI 2 "const_int_operand")] (match_operand:SI 2 "const_int_operand")]
UNSPEC_MOVA))] UNSPEC_STA))]
"" ""
{ {
enum memmodel model = (enum memmodel) (INTVAL (operands[2]) & MEMMODEL_MASK); enum memmodel model = (enum memmodel) (INTVAL (operands[2]) & MEMMODEL_MASK);
...@@ -215,6 +227,8 @@ ...@@ -215,6 +227,8 @@
} }
else else
{ {
operands[1] = force_reg (<MODE>mode, operands[1]);
/* For seq-cst stores, when we lack MFENCE, use XCHG. */ /* For seq-cst stores, when we lack MFENCE, use XCHG. */
if (model == MEMMODEL_SEQ_CST && !(TARGET_64BIT || TARGET_SSE2)) if (model == MEMMODEL_SEQ_CST && !(TARGET_64BIT || TARGET_SSE2))
{ {
...@@ -238,14 +252,14 @@ ...@@ -238,14 +252,14 @@
[(set (match_operand:SWI 0 "memory_operand" "=m") [(set (match_operand:SWI 0 "memory_operand" "=m")
(unspec:SWI [(match_operand:SWI 1 "<nonmemory_operand>" "<r><i>") (unspec:SWI [(match_operand:SWI 1 "<nonmemory_operand>" "<r><i>")
(match_operand:SI 2 "const_int_operand")] (match_operand:SI 2 "const_int_operand")]
UNSPEC_MOVA))] UNSPEC_STA))]
"" ""
"%K2mov{<imodesuffix>}\t{%1, %0|%0, %1}") "%K2mov{<imodesuffix>}\t{%1, %0|%0, %1}")
(define_insn_and_split "atomic_storedi_fpu" (define_insn_and_split "atomic_storedi_fpu"
[(set (match_operand:DI 0 "memory_operand" "=m,m,m") [(set (match_operand:DI 0 "memory_operand" "=m,m,m")
(unspec:DI [(match_operand:DI 1 "register_operand" "x,m,?r")] (unspec:DI [(match_operand:DI 1 "nonimmediate_operand" "x,m,?r")]
UNSPEC_MOVA)) UNSPEC_STA))
(clobber (match_operand:DI 2 "memory_operand" "=X,X,m")) (clobber (match_operand:DI 2 "memory_operand" "=X,X,m"))
(clobber (match_scratch:DF 3 "=X,xf,xf"))] (clobber (match_scratch:DF 3 "=X,xf,xf"))]
"!TARGET_64BIT && (TARGET_80387 || TARGET_SSE)" "!TARGET_64BIT && (TARGET_80387 || TARGET_SSE)"
...@@ -273,7 +287,7 @@ ...@@ -273,7 +287,7 @@
else else
{ {
adjust_reg_mode (tmp, DImode); adjust_reg_mode (tmp, DImode);
emit_move_insn (tmp, mem); emit_move_insn (tmp, src);
src = tmp; src = tmp;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment