Commit f5027409 by Revital Eres Committed by Revital Eres

Add vec_init support for 750CL paired vectors and fix movv2sf_paired

From-SVN: r128952
parent 927171bf
2007-10-02 Revital Eres <eres@il.ibm.com>
* config/rs6000/predicates.md (easy_vector_constant): Return false
for 750CL paired vectors.
* config/rs6000/paired.md (movv2sf_paired): Fix move of easy
vector constant.
(vec_initv2sf): Add new description.
(vconcatsf): Likewise.
* config/rs6000/rs6000-protos.h: Declare paired_expand_vector_init.
2007-10-01 Alexandre Oliva <aoliva@redhat.com>
* tree-ssa-sink.c (sink_code_in_bb): Don't stop sinking after
......@@ -188,7 +188,7 @@
[(set_attr "type" "fp")])
(define_insn "*movv2sf_paired"
[(set (match_operand:V2SF 0 "nonimmediate_operand" "=Z,f,f,o,r,r,v")
[(set (match_operand:V2SF 0 "nonimmediate_operand" "=Z,f,f,o,r,r,f")
(match_operand:V2SF 1 "input_operand" "f,Z,f,r,o,r,W"))]
"TARGET_PAIRED_FLOAT
&& (register_operand (operands[0], V2SFmode)
......@@ -202,7 +202,7 @@
case 3: return "#";
case 4: return "#";
case 5: return "#";
case 6: return output_vec_const_move (operands);
case 6: return "#";
default: gcc_unreachable ();
}
}
......@@ -352,4 +352,21 @@
"ps_muls1 %0, %1, %2"
[(set_attr "type" "fp")])
(define_expand "vec_initv2sf"
[(match_operand:V2SF 0 "gpc_reg_operand" "=f")
(match_operand 1 "" "")]
"TARGET_PAIRED_FLOAT"
{
paired_expand_vector_init (operands[0], operands[1]);
DONE;
})
(define_insn "*vconcatsf"
[(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
(vec_concat:V2SF
(match_operand:SF 1 "gpc_reg_operand" "f")
(match_operand:SF 2 "gpc_reg_operand" "f")))]
"TARGET_PAIRED_FLOAT"
"ps_merge00 %0, %1, %2"
[(set_attr "type" "fp")])
......@@ -275,6 +275,11 @@
(define_predicate "easy_vector_constant"
(match_code "const_vector")
{
/* As the paired vectors are actually FPRs it seems that there is
no easy way to load a CONST_VECTOR without using memory. */
if (TARGET_PAIRED_FLOAT)
return false;
if (ALTIVEC_VECTOR_MODE (mode))
{
if (zero_constant (op, mode))
......
......@@ -48,6 +48,7 @@ extern rtx find_addr_reg (rtx);
extern rtx gen_easy_altivec_constant (rtx);
extern const char *output_vec_const_move (rtx *);
extern void rs6000_expand_vector_init (rtx, rtx);
extern void paired_expand_vector_init (rtx, rtx);
extern void rs6000_expand_vector_set (rtx, rtx, int);
extern void rs6000_expand_vector_extract (rtx, rtx, int);
extern void build_mask64_2_operands (rtx, rtx *);
......
......@@ -2716,6 +2716,59 @@ output_vec_const_move (rtx *operands)
return "li %0,%1\n\tevmergelo %0,%0,%0\n\tli %0,%2";
}
/* Initialize TARGET of vector PAIRED to VALS. */
void
paired_expand_vector_init (rtx target, rtx vals)
{
enum machine_mode mode = GET_MODE (target);
int n_elts = GET_MODE_NUNITS (mode);
int n_var = 0;
rtx x, new, tmp, constant_op, op1, op2;
int i;
for (i = 0; i < n_elts; ++i)
{
x = XVECEXP (vals, 0, i);
if (!CONSTANT_P (x))
++n_var;
}
if (n_var == 0)
{
/* Load from constant pool. */
emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
return;
}
if (n_var == 2)
{
/* The vector is initialized only with non-constants. */
new = gen_rtx_VEC_CONCAT (V2SFmode, XVECEXP (vals, 0, 0),
XVECEXP (vals, 0, 1));
emit_move_insn (target, new);
return;
}
/* One field is non-constant and the other one is a constant. Load the
constant from the constant pool and use ps_merge instruction to
construct the whole vector. */
op1 = XVECEXP (vals, 0, 0);
op2 = XVECEXP (vals, 0, 1);
constant_op = (CONSTANT_P (op1)) ? op1 : op2;
tmp = gen_reg_rtx (GET_MODE (constant_op));
emit_move_insn (tmp, constant_op);
if (CONSTANT_P (op1))
new = gen_rtx_VEC_CONCAT (V2SFmode, tmp, op2);
else
new = gen_rtx_VEC_CONCAT (V2SFmode, op1, tmp);
emit_move_insn (target, new);
}
/* Initialize vector TARGET to VALS. */
void
......
2007-10-02 Revital Eres <eres@il.ibm.com>
* gcc.target/powerpc/paired-8.c: New test.
* gcc.target/powerpc/paired-9.c: New test.
* gcc.target/powerpc/paired-10.c: New test.
2007-10-02 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33566
/* { dg-do compile { target powerpc-*-linux*paired* } } */
/* { dg-options "-mpaired -m32 -ffinite-math-only " } */
/* Test PowerPC PAIRED extensions. */
#include <paired.h>
static float out[2] __attribute__ ((aligned (8)));
void
test_api (float y, float x)
{
vector float c = {x, y};
vector float b = {0.0, 8.0};
vector float a;
a = paired_sub (b, c);
paired_stx (a, 0, out);
}
int main ()
{
test_api (6, 7);
return (0);
}
/* { dg-do compile { target powerpc-*-linux*paired* } } */
/* { dg-options "-mpaired -m32 -ffinite-math-only " } */
/* Test PowerPC PAIRED extensions. */
#include <paired.h>
static float out[2] __attribute__ ((aligned (8)));
void
test_api (float x)
{
vector float c = {x, x};
vector float b = {60.0, 88.0};
vector float a;
a = paired_sub (b, c);
paired_stx (a, 0, out);
}
int main ()
{
test_api (6);
return (0);
}
/* { dg-do compile { target powerpc-*-linux*paired* } } */
/* { dg-options "-mpaired -m32 -ffinite-math-only " } */
/* Test PowerPC PAIRED extensions. */
#include <paired.h>
static float out[2] __attribute__ ((aligned (8)));
void
test_api (float y, float x)
{
vector float c = {x, 7.0};
vector float b = {0.0, 8.0};
vector float a;
a = paired_sub (b, c);
paired_stx (a, 0, out);
}
int main ()
{
test_api (6, 7);
return (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