Commit 0c2d2371 by Uros Bizjak Committed by Uros Bizjak

reg-stack.c: Include regs.h.

	* reg-stack.c: Include regs.h.
	(replace_reg): Assert that mode is MODE_FLOAT or MODE_COMPLEX_FLOAT.
	(emit_pop_insn): Default pop insn mode to the reg_raw_mode of
	FIRST_STACK_REG, not DFmode.
	(emit_swap_insn): Default swap insn mode to the reg_raw_mode of
	FIRST_STACK_REG, not XFmode.  Explicitly construct swap RTX.
	(change stack): Default register mode to the reg_raw_mode of
	FIRST_STACK_REG, not DFmode.
	* config/i386/i386.md (*swap<mode>): Remove insn pattern.
	(*swapxf): Rename from swapxf.

From-SVN: r264319
parent 8cafacb5
2018-09-14 Uros Bizjak <ubizjak@gmail.com>
* reg-stack.c: Include regs.h.
(replace_reg): Assert that mode is MODE_FLOAT or MODE_COMPLEX_FLOAT.
(emit_pop_insn): Default pop insn mode to the reg_raw_mode of
FIRST_STACK_REG, not DFmode.
(emit_swap_insn): Default swap insn mode to the reg_raw_mode of
FIRST_STACK_REG, not XFmode. Explicitly construct swap RTX.
(change stack): Default register mode to the reg_raw_mode of
FIRST_STACK_REG, not DFmode.
* config/i386/i386.md (*swap<mode>): Remove insn pattern.
(*swapxf): Rename from swapxf.
2018-09-14 Carl Love <cel@us.ibm.com> 2018-09-14 Carl Love <cel@us.ibm.com>
* config/rs6000/emmintrin.h: Add _MM_SHUFFLE2. * config/rs6000/emmintrin.h: Add _MM_SHUFFLE2.
......
...@@ -3864,7 +3864,7 @@ ...@@ -3864,7 +3864,7 @@
operands[1] = CONST1_RTX (<MODE>mode); operands[1] = CONST1_RTX (<MODE>mode);
}) })
(define_insn "swapxf" (define_insn "*swapxf"
[(set (match_operand:XF 0 "register_operand" "+f") [(set (match_operand:XF 0 "register_operand" "+f")
(match_operand:XF 1 "register_operand" "+f")) (match_operand:XF 1 "register_operand" "+f"))
(set (match_dup 1) (set (match_dup 1)
...@@ -3878,22 +3878,8 @@ ...@@ -3878,22 +3878,8 @@
} }
[(set_attr "type" "fxch") [(set_attr "type" "fxch")
(set_attr "mode" "XF")]) (set_attr "mode" "XF")])
(define_insn "*swap<mode>"
[(set (match_operand:MODEF 0 "fp_register_operand" "+f")
(match_operand:MODEF 1 "fp_register_operand" "+f"))
(set (match_dup 1)
(match_dup 0))]
"TARGET_80387 || reload_completed"
{
if (STACK_TOP_P (operands[0]))
return "fxch\t%1";
else
return "fxch\t%0";
}
[(set_attr "type" "fxch")
(set_attr "mode" "<MODE>")])
;; Zero extension instructions ;; Zero extension instructions
(define_expand "zero_extendsidi2" (define_expand "zero_extendsidi2"
......
...@@ -162,6 +162,7 @@ ...@@ -162,6 +162,7 @@
#include "df.h" #include "df.h"
#include "insn-config.h" #include "insn-config.h"
#include "memmodel.h" #include "memmodel.h"
#include "regs.h"
#include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */ #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
#include "recog.h" #include "recog.h"
#include "varasm.h" #include "varasm.h"
...@@ -711,7 +712,7 @@ replace_reg (rtx *reg, int regno) ...@@ -711,7 +712,7 @@ replace_reg (rtx *reg, int regno)
gcc_assert (IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG)); gcc_assert (IN_RANGE (regno, FIRST_STACK_REG, LAST_STACK_REG));
gcc_assert (STACK_REG_P (*reg)); gcc_assert (STACK_REG_P (*reg));
gcc_assert (SCALAR_FLOAT_MODE_P (GET_MODE (*reg)) gcc_assert (GET_MODE_CLASS (GET_MODE (*reg)) == MODE_FLOAT
|| GET_MODE_CLASS (GET_MODE (*reg)) == MODE_COMPLEX_FLOAT); || GET_MODE_CLASS (GET_MODE (*reg)) == MODE_COMPLEX_FLOAT);
*reg = FP_MODE_REG (regno, GET_MODE (*reg)); *reg = FP_MODE_REG (regno, GET_MODE (*reg));
...@@ -765,8 +766,10 @@ get_hard_regnum (stack_ptr regstack, rtx reg) ...@@ -765,8 +766,10 @@ get_hard_regnum (stack_ptr regstack, rtx reg)
cases the movdf pattern to pop. */ cases the movdf pattern to pop. */
static rtx_insn * static rtx_insn *
emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg, enum emit_where where) emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg,
enum emit_where where)
{ {
machine_mode raw_mode = reg_raw_mode[FIRST_STACK_REG];
rtx_insn *pop_insn; rtx_insn *pop_insn;
rtx pop_rtx; rtx pop_rtx;
int hard_regno; int hard_regno;
...@@ -775,8 +778,8 @@ emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg, enum emit_where wher ...@@ -775,8 +778,8 @@ emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg, enum emit_where wher
CLOBBER and USE expressions. */ CLOBBER and USE expressions. */
if (COMPLEX_MODE_P (GET_MODE (reg))) if (COMPLEX_MODE_P (GET_MODE (reg)))
{ {
rtx reg1 = FP_MODE_REG (REGNO (reg), DFmode); rtx reg1 = FP_MODE_REG (REGNO (reg), raw_mode);
rtx reg2 = FP_MODE_REG (REGNO (reg) + 1, DFmode); rtx reg2 = FP_MODE_REG (REGNO (reg) + 1, raw_mode);
pop_insn = NULL; pop_insn = NULL;
if (get_hard_regnum (regstack, reg1) >= 0) if (get_hard_regnum (regstack, reg1) >= 0)
...@@ -791,15 +794,15 @@ emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg, enum emit_where wher ...@@ -791,15 +794,15 @@ emit_pop_insn (rtx_insn *insn, stack_ptr regstack, rtx reg, enum emit_where wher
gcc_assert (hard_regno >= FIRST_STACK_REG); gcc_assert (hard_regno >= FIRST_STACK_REG);
pop_rtx = gen_rtx_SET (FP_MODE_REG (hard_regno, DFmode), pop_rtx = gen_rtx_SET (FP_MODE_REG (hard_regno, raw_mode),
FP_MODE_REG (FIRST_STACK_REG, DFmode)); FP_MODE_REG (FIRST_STACK_REG, raw_mode));
if (where == EMIT_AFTER) if (where == EMIT_AFTER)
pop_insn = emit_insn_after (pop_rtx, insn); pop_insn = emit_insn_after (pop_rtx, insn);
else else
pop_insn = emit_insn_before (pop_rtx, insn); pop_insn = emit_insn_before (pop_rtx, insn);
add_reg_note (pop_insn, REG_DEAD, FP_MODE_REG (FIRST_STACK_REG, DFmode)); add_reg_note (pop_insn, REG_DEAD, FP_MODE_REG (FIRST_STACK_REG, raw_mode));
regstack->reg[regstack->top - (hard_regno - FIRST_STACK_REG)] regstack->reg[regstack->top - (hard_regno - FIRST_STACK_REG)]
= regstack->reg[regstack->top]; = regstack->reg[regstack->top];
...@@ -820,7 +823,6 @@ static void ...@@ -820,7 +823,6 @@ static void
emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg) emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg)
{ {
int hard_regno; int hard_regno;
rtx swap_rtx;
int other_reg; /* swap regno temps */ int other_reg; /* swap regno temps */
rtx_insn *i1; /* the stack-reg insn prior to INSN */ rtx_insn *i1; /* the stack-reg insn prior to INSN */
rtx i1set = NULL_RTX; /* the SET rtx within I1 */ rtx i1set = NULL_RTX; /* the SET rtx within I1 */
...@@ -978,9 +980,13 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg) ...@@ -978,9 +980,13 @@ emit_swap_insn (rtx_insn *insn, stack_ptr regstack, rtx reg)
return; return;
} }
swap_rtx = gen_swapxf (FP_MODE_REG (hard_regno, XFmode), machine_mode raw_mode = reg_raw_mode[FIRST_STACK_REG];
FP_MODE_REG (FIRST_STACK_REG, XFmode)); rtx op1 = FP_MODE_REG (hard_regno, raw_mode);
rtx op2 = FP_MODE_REG (FIRST_STACK_REG, raw_mode);
rtx swap_rtx
= gen_rtx_PARALLEL (VOIDmode,
gen_rtvec (2, gen_rtx_SET (op1, op2),
gen_rtx_SET (op2, op1)));
if (i1) if (i1)
emit_insn_after (swap_rtx, i1); emit_insn_after (swap_rtx, i1);
else if (current_block) else if (current_block)
...@@ -2487,6 +2493,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack, ...@@ -2487,6 +2493,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack,
enum emit_where where) enum emit_where where)
{ {
int reg; int reg;
machine_mode raw_mode = reg_raw_mode[FIRST_STACK_REG];
rtx_insn *update_end = NULL; rtx_insn *update_end = NULL;
int i; int i;
...@@ -2588,7 +2595,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack, ...@@ -2588,7 +2595,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack,
next--; next--;
dest = next--; dest = next--;
} }
emit_pop_insn (insn, old, FP_MODE_REG (old->reg[dest], DFmode), emit_pop_insn (insn, old, FP_MODE_REG (old->reg[dest], raw_mode),
EMIT_BEFORE); EMIT_BEFORE);
} }
} }
...@@ -2610,11 +2617,11 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack, ...@@ -2610,11 +2617,11 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack,
{ {
while (TEST_HARD_REG_BIT (new_stack->reg_set, old->reg[next])) while (TEST_HARD_REG_BIT (new_stack->reg_set, old->reg[next]))
next--; next--;
emit_pop_insn (insn, old, FP_MODE_REG (old->reg[next], DFmode), emit_pop_insn (insn, old, FP_MODE_REG (old->reg[next], raw_mode),
EMIT_BEFORE); EMIT_BEFORE);
} }
else else
emit_pop_insn (insn, old, FP_MODE_REG (old->reg[old->top], DFmode), emit_pop_insn (insn, old, FP_MODE_REG (old->reg[old->top], raw_mode),
EMIT_BEFORE); EMIT_BEFORE);
} }
...@@ -2661,7 +2668,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack, ...@@ -2661,7 +2668,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack,
gcc_assert (reg != -1); gcc_assert (reg != -1);
emit_swap_insn (insn, old, emit_swap_insn (insn, old,
FP_MODE_REG (old->reg[reg], DFmode)); FP_MODE_REG (old->reg[reg], raw_mode));
} }
/* See if any regs remain incorrect. If so, bring an /* See if any regs remain incorrect. If so, bring an
...@@ -2672,7 +2679,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack, ...@@ -2672,7 +2679,7 @@ change_stack (rtx_insn *insn, stack_ptr old, stack_ptr new_stack,
if (new_stack->reg[reg] != old->reg[reg]) if (new_stack->reg[reg] != old->reg[reg])
{ {
emit_swap_insn (insn, old, emit_swap_insn (insn, old,
FP_MODE_REG (old->reg[reg], DFmode)); FP_MODE_REG (old->reg[reg], raw_mode));
break; break;
} }
} while (reg >= 0); } while (reg >= 0);
......
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