Commit 61c76239 by Joseph Myers Committed by Joseph Myers

spe.md (SPE64): New mode macro.

	* config/rs6000/spe.md (SPE64): New mode macro.
	(mov_sidf_e500_subreg0): Change to mov_si<mode>_e500_subreg0.  Add
	memory load.
	(mov_si<mode>_e500_subreg0_2): New.
	(mov_sidf_e500_subreg4): Change to mov_si<mode>_e500_subreg4.  Add
	memory load.
	(mov_si<mode>_e500_subreg4_2): New.
	* config/rs6000/predicates.md (input_operand): Do not allow
	invalid E500 subregs.
	(rs6000_nonimmediate_operand): Check for invalid E500 subregs also
	if TARGET_SPE.
	* config/rs6000/rs6000.c (invalid_e500_subreg): Check for subregs
	involving DFmode if TARGET_E500_DOUBLE.  Check for subregs
	involving vector modes if TARGET_SPE.

From-SVN: r119094
parent 7c21975d
2006-11-22 Joseph Myers <joseph@codesourcery.com>
* config/rs6000/spe.md (SPE64): New mode macro.
(mov_sidf_e500_subreg0): Change to mov_si<mode>_e500_subreg0. Add
memory load.
(mov_si<mode>_e500_subreg0_2): New.
(mov_sidf_e500_subreg4): Change to mov_si<mode>_e500_subreg4. Add
memory load.
(mov_si<mode>_e500_subreg4_2): New.
* config/rs6000/predicates.md (input_operand): Do not allow
invalid E500 subregs.
(rs6000_nonimmediate_operand): Check for invalid E500 subregs also
if TARGET_SPE.
* config/rs6000/rs6000.c (invalid_e500_subreg): Check for subregs
involving DFmode if TARGET_E500_DOUBLE. Check for subregs
involving vector modes if TARGET_SPE.
2006-11-22 Kaz Kojima <kkojima@gcc.gnu.org> 2006-11-22 Kaz Kojima <kkojima@gcc.gnu.org>
Revert Revert
......
...@@ -722,6 +722,12 @@ ...@@ -722,6 +722,12 @@
&& easy_vector_constant (op, mode)) && easy_vector_constant (op, mode))
return 1; return 1;
/* Do not allow invalid E500 subregs. */
if ((TARGET_E500_DOUBLE || TARGET_SPE)
&& GET_CODE (op) == SUBREG
&& invalid_e500_subreg (op, mode))
return 0;
/* For floating-point or multi-word mode, the only remaining valid type /* For floating-point or multi-word mode, the only remaining valid type
is a register. */ is a register. */
if (SCALAR_FLOAT_MODE_P (mode) if (SCALAR_FLOAT_MODE_P (mode)
...@@ -756,7 +762,7 @@ ...@@ -756,7 +762,7 @@
(define_predicate "rs6000_nonimmediate_operand" (define_predicate "rs6000_nonimmediate_operand"
(match_code "reg,subreg,mem") (match_code "reg,subreg,mem")
{ {
if (TARGET_E500_DOUBLE if ((TARGET_E500_DOUBLE || TARGET_SPE)
&& GET_CODE (op) == SUBREG && GET_CODE (op) == SUBREG
&& invalid_e500_subreg (op, mode)) && invalid_e500_subreg (op, mode))
return 0; return 0;
......
...@@ -2713,18 +2713,29 @@ build_mask64_2_operands (rtx in, rtx *out) ...@@ -2713,18 +2713,29 @@ build_mask64_2_operands (rtx in, rtx *out)
bool bool
invalid_e500_subreg (rtx op, enum machine_mode mode) invalid_e500_subreg (rtx op, enum machine_mode mode)
{ {
/* Reject (subreg:SI (reg:DF)). */ if (TARGET_E500_DOUBLE)
if (GET_CODE (op) == SUBREG {
&& mode == SImode /* Reject (subreg:SI (reg:DF)). */
&& REG_P (SUBREG_REG (op)) if (GET_CODE (op) == SUBREG
&& GET_MODE (SUBREG_REG (op)) == DFmode) && mode == SImode
return true; && REG_P (SUBREG_REG (op))
&& GET_MODE (SUBREG_REG (op)) == DFmode)
return true;
/* Reject (subreg:DF (reg:DI)). */ /* Reject (subreg:DF (reg:DI)). */
if (GET_CODE (op) == SUBREG if (GET_CODE (op) == SUBREG
&& mode == DFmode && mode == DFmode
&& REG_P (SUBREG_REG (op))
&& GET_MODE (SUBREG_REG (op)) == DImode)
return true;
}
if (TARGET_SPE
&& GET_CODE (op) == SUBREG
&& mode == SImode
&& REG_P (SUBREG_REG (op)) && REG_P (SUBREG_REG (op))
&& GET_MODE (SUBREG_REG (op)) == DImode) && SPE_VECTOR_MODE (GET_MODE (SUBREG_REG (op)))
&& SUBREG_BYTE (op) != 4)
return true; return true;
return false; return false;
......
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
(E500_CR_IOR_COMPARE 1012) (E500_CR_IOR_COMPARE 1012)
]) ])
;; Modes using a 64-bit register.
(define_mode_macro SPE64 [DF V4HI V2SF V1DI V2SI])
(define_insn "*negsf2_gpr" (define_insn "*negsf2_gpr"
[(set (match_operand:SF 0 "gpc_reg_operand" "=r") [(set (match_operand:SF 0 "gpc_reg_operand" "=r")
(neg:SF (match_operand:SF 1 "gpc_reg_operand" "r")))] (neg:SF (match_operand:SF 1 "gpc_reg_operand" "r")))]
...@@ -2241,17 +2244,39 @@ ...@@ -2241,17 +2244,39 @@
}" }"
[(set_attr "length" "8,8")]) [(set_attr "length" "8,8")])
(define_insn "*mov_sidf_e500_subreg0" (define_insn "*mov_si<mode>_e500_subreg0"
[(set (subreg:SI (match_operand:DF 0 "register_operand" "+r") 0) [(set (subreg:SI (match_operand:SPE64 0 "register_operand" "+r,&r") 0)
(match_operand:SI 1 "register_operand" "r"))] (match_operand:SI 1 "input_operand" "r,m"))]
"TARGET_E500_DOUBLE" "(TARGET_E500_DOUBLE && <MODE>mode == DFmode) || (TARGET_SPE && <MODE>mode != DFmode)"
"evmergelo %0,%1,%0") "@
evmergelo %0,%1,%0
evmergelohi %0,%0,%0\;{l%U1%X1|lwz%U1%X1} %0,%1\;evmergelohi %0,%0,%0")
;; ??? Could use evstwwe for memory stores in some cases, depending on
;; the offset.
(define_insn "*mov_si<mode>_e500_subreg0_2"
[(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
(subreg:SI (match_operand:SPE64 1 "register_operand" "+r,&r") 0))]
"(TARGET_E500_DOUBLE && <MODE>mode == DFmode) || (TARGET_SPE && <MODE>mode != DFmode)"
"@
evmergehi %0,%0,%1
evmergelohi %1,%1,%1\;{st%U0%X0|stw%U0%X0} %1,%0")
(define_insn "*mov_sidf_e500_subreg4" (define_insn "*mov_si<mode>_e500_subreg4"
[(set (subreg:SI (match_operand:DF 0 "register_operand" "+r") 4) [(set (subreg:SI (match_operand:SPE64 0 "register_operand" "+r,r") 4)
(match_operand:SI 1 "register_operand" "r"))] (match_operand:SI 1 "input_operand" "r,m"))]
"TARGET_E500_DOUBLE" "(TARGET_E500_DOUBLE && <MODE>mode == DFmode) || (TARGET_SPE && <MODE>mode != DFmode)"
"mr %0,%1") "@
mr %0,%1
{l%U1%X1|lwz%U1%X1} %0,%1")
(define_insn "*mov_si<mode>_e500_subreg4_2"
[(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
(subreg:SI (match_operand:SPE64 1 "register_operand" "r,r") 4))]
"(TARGET_E500_DOUBLE && <MODE>mode == DFmode) || (TARGET_SPE && <MODE>mode != DFmode)"
"@
mr %0,%1
{st%U0%X0|stw%U0%X0} %1,%0")
;; FIXME: Allow r=CONST0. ;; FIXME: Allow r=CONST0.
(define_insn "*movdf_e500_double" (define_insn "*movdf_e500_double"
......
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