Commit a8caf351 by Uros Bizjak Committed by Uros Bizjak

sync.md (UNSPEC_FILD_ATOMIC, [...]): New.

	* config/i386/sync.md (UNSPEC_FILD_ATOMIC, UNSPEC_FIST_ATOMIC): New.
	(loaddi_via_fpu): Use UNSPEC_FILD_ATOMIC.
	(storedi_via_fpu): Use UNSPEC_FIST_ATOMIC.
	* reg-stack.c (get_true_reg): Change UNSPEC_LDA to UNSPEC_FILD_ATOMIC.
	(subst_stack_regs_pat): Change UNSPEC_STA to UNSPEC_FIST_ATOMIC.

From-SVN: r221830
parent ed6ef490
2015-04-02 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sync.md (UNSPEC_FILD_ATOMIC, UNSPEC_FIST_ATOMIC): New.
(loaddi_via_fpu): Use UNSPEC_FILD_ATOMIC.
(storedi_via_fpu): Use UNSPEC_FIST_ATOMIC.
* reg-stack.c (get_true_reg): Change UNSPEC_LDA to UNSPEC_FILD_ATOMIC.
(subst_stack_regs_pat): Change UNSPEC_STA to UNSPEC_FIST_ATOMIC.
2015-04-01 Uros Bizjak <ubizjak@gmail.com> 2015-04-01 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sync.md (UNSPEC_MOVA): Remove. * config/i386/sync.md (UNSPEC_MOVA): Remove.
......
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
UNSPEC_SFENCE UNSPEC_SFENCE
UNSPEC_MFENCE UNSPEC_MFENCE
UNSPEC_FILD_ATOMIC
UNSPEC_FIST_ATOMIC
;; __atomic support ;; __atomic support
UNSPEC_LDA UNSPEC_LDA
UNSPEC_STA UNSPEC_STA
...@@ -302,7 +305,8 @@ ...@@ -302,7 +305,8 @@
(define_insn "loaddi_via_fpu" (define_insn "loaddi_via_fpu"
[(set (match_operand:DF 0 "register_operand" "=f") [(set (match_operand:DF 0 "register_operand" "=f")
(unspec:DF [(match_operand:DI 1 "memory_operand" "m")] UNSPEC_LDA))] (unspec:DF [(match_operand:DI 1 "memory_operand" "m")]
UNSPEC_FILD_ATOMIC))]
"TARGET_80387" "TARGET_80387"
"fild%Z1\t%1" "fild%Z1\t%1"
[(set_attr "type" "fmov") [(set_attr "type" "fmov")
...@@ -311,7 +315,8 @@ ...@@ -311,7 +315,8 @@
(define_insn "storedi_via_fpu" (define_insn "storedi_via_fpu"
[(set (match_operand:DI 0 "memory_operand" "=m") [(set (match_operand:DI 0 "memory_operand" "=m")
(unspec:DI [(match_operand:DF 1 "register_operand" "f")] UNSPEC_STA))] (unspec:DI [(match_operand:DF 1 "register_operand" "f")]
UNSPEC_FIST_ATOMIC))]
"TARGET_80387" "TARGET_80387"
{ {
gcc_assert (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != NULL_RTX); gcc_assert (find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != NULL_RTX);
......
...@@ -448,7 +448,7 @@ get_true_reg (rtx *pat) ...@@ -448,7 +448,7 @@ get_true_reg (rtx *pat)
case UNSPEC: case UNSPEC:
if (XINT (*pat, 1) == UNSPEC_TRUNC_NOOP if (XINT (*pat, 1) == UNSPEC_TRUNC_NOOP
|| XINT (*pat, 1) == UNSPEC_LDA) || XINT (*pat, 1) == UNSPEC_FILD_ATOMIC)
pat = & XVECEXP (*pat, 0, 0); pat = & XVECEXP (*pat, 0, 0);
return pat; return pat;
...@@ -1670,8 +1670,8 @@ subst_stack_regs_pat (rtx_insn *insn, stack_ptr regstack, rtx pat) ...@@ -1670,8 +1670,8 @@ subst_stack_regs_pat (rtx_insn *insn, stack_ptr regstack, rtx pat)
case UNSPEC: case UNSPEC:
switch (XINT (pat_src, 1)) switch (XINT (pat_src, 1))
{ {
case UNSPEC_STA:
case UNSPEC_FIST: case UNSPEC_FIST:
case UNSPEC_FIST_ATOMIC:
case UNSPEC_FIST_FLOOR: case UNSPEC_FIST_FLOOR:
case UNSPEC_FIST_CEIL: case UNSPEC_FIST_CEIL:
......
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