Fix PR target/43154
From-SVN: r157074
This commit is contained in:
parent
f61ae06585
commit
2fcd8e02d6
7 changed files with 91 additions and 19 deletions
|
@ -1,3 +1,22 @@
|
|||
2010-02-25 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
PR target/43154
|
||||
* config/rs6000/vector.md (VEC_64): New iterator for V2DF, V2DI.
|
||||
(vec_interleave_high<mode>): Rename from vec_interleave_highv2df
|
||||
and support both V2DF and V2DI modes.
|
||||
(vec_interleave_low<mode>): Rename from vec_interleave_lowv2df and
|
||||
support both V2DF and V2DI modes.
|
||||
(general): Delete trailing whitespace from a few patterns.
|
||||
|
||||
* config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
|
||||
V2DF/V2DI interleave high/low builtins.
|
||||
|
||||
* config/rs6000/rs6000-builtin.def (VSX_BUILTIN_VEC_MERGE*): Add
|
||||
new VSX builtins.
|
||||
|
||||
* config/rs6000/rs6000.c (bdesc_2arg): Add support for V2DF/V2DI
|
||||
interleave high/low functions.
|
||||
|
||||
2010-02-25 Gerald Pfeifer <gerald@pfeifer.com>
|
||||
|
||||
* doc/extend.texi (Symbol-Renaming Pragmas): Fix spelling of
|
||||
|
|
|
@ -955,6 +955,10 @@ RS6000_BUILTIN(VSX_BUILTIN_VEC_SET_V2DF, RS6000_BTC_CONST)
|
|||
RS6000_BUILTIN(VSX_BUILTIN_VEC_SET_V2DI, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_EXT_V2DF, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_EXT_V2DI, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_MERGEL_V2DF, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_MERGEL_V2DI, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_MERGEH_V2DF, RS6000_BTC_CONST)
|
||||
RS6000_BUILTIN(VSX_BUILTIN_VEC_MERGEH_V2DI, RS6000_BTC_CONST)
|
||||
|
||||
/* VSX overloaded builtins, add the overloaded functions not present in
|
||||
Altivec. */
|
||||
|
|
|
@ -1372,6 +1372,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = {
|
|||
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEH, ALTIVEC_BUILTIN_VMRGHW,
|
||||
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEH, VSX_BUILTIN_VEC_MERGEH_V2DF,
|
||||
RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEH, VSX_BUILTIN_VEC_MERGEH_V2DI,
|
||||
RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_VMRGHW, ALTIVEC_BUILTIN_VMRGHW,
|
||||
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_VMRGHW, ALTIVEC_BUILTIN_VMRGHW,
|
||||
|
@ -1416,6 +1420,10 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = {
|
|||
RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_V4SI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEL, ALTIVEC_BUILTIN_VMRGLW,
|
||||
RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEL, VSX_BUILTIN_VEC_MERGEL_V2DF,
|
||||
RS6000_BTI_V2DF, RS6000_BTI_V2DF, RS6000_BTI_V2DF, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_MERGEL, VSX_BUILTIN_VEC_MERGEL_V2DI,
|
||||
RS6000_BTI_V2DI, RS6000_BTI_V2DI, RS6000_BTI_V2DI, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_VMRGLW, ALTIVEC_BUILTIN_VMRGLW,
|
||||
RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_V4SF, 0 },
|
||||
{ ALTIVEC_BUILTIN_VEC_VMRGLW, ALTIVEC_BUILTIN_VMRGLW,
|
||||
|
|
|
@ -8950,6 +8950,10 @@ static struct builtin_description bdesc_2arg[] =
|
|||
{ MASK_VSX, CODE_FOR_vsx_xxmrghw_v4si, "__builtin_vsx_xxmrghw_4si", VSX_BUILTIN_XXMRGHW_4SI },
|
||||
{ MASK_VSX, CODE_FOR_vsx_xxmrglw_v4sf, "__builtin_vsx_xxmrglw", VSX_BUILTIN_XXMRGLW_4SF },
|
||||
{ MASK_VSX, CODE_FOR_vsx_xxmrglw_v4si, "__builtin_vsx_xxmrglw_4si", VSX_BUILTIN_XXMRGLW_4SI },
|
||||
{ MASK_VSX, CODE_FOR_vec_interleave_lowv2df, "__builtin_vsx_mergel_2df", VSX_BUILTIN_VEC_MERGEL_V2DF },
|
||||
{ MASK_VSX, CODE_FOR_vec_interleave_lowv2di, "__builtin_vsx_mergel_2di", VSX_BUILTIN_VEC_MERGEL_V2DI },
|
||||
{ MASK_VSX, CODE_FOR_vec_interleave_highv2df, "__builtin_vsx_mergeh_2df", VSX_BUILTIN_VEC_MERGEH_V2DF },
|
||||
{ MASK_VSX, CODE_FOR_vec_interleave_highv2di, "__builtin_vsx_mergeh_2di", VSX_BUILTIN_VEC_MERGEH_V2DI },
|
||||
|
||||
{ MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_add", ALTIVEC_BUILTIN_VEC_ADD },
|
||||
{ MASK_ALTIVEC|MASK_VSX, CODE_FOR_nothing, "__builtin_vec_vaddfp", ALTIVEC_BUILTIN_VEC_VADDFP },
|
||||
|
|
|
@ -51,6 +51,9 @@
|
|||
;; Vector init/extract modes
|
||||
(define_mode_iterator VEC_E [V16QI V8HI V4SI V2DI V4SF V2DF])
|
||||
|
||||
;; Vector modes for 64-bit base types
|
||||
(define_mode_iterator VEC_64 [V2DI V2DF])
|
||||
|
||||
;; Vector reload iterator
|
||||
(define_mode_iterator VEC_R [V16QI V8HI V4SI V2DI V4SF V2DF DF TI])
|
||||
|
||||
|
@ -480,7 +483,7 @@
|
|||
(eq:SI (reg:CC 74)
|
||||
(const_int 0)))]
|
||||
"TARGET_ALTIVEC || TARGET_VSX"
|
||||
"")
|
||||
"")
|
||||
|
||||
(define_expand "cr6_test_for_zero_reverse"
|
||||
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||
|
@ -533,7 +536,7 @@
|
|||
(not:VEC_L (match_operand:VEC_L 1 "vlogical_operand" "")))]
|
||||
"VECTOR_MEM_ALTIVEC_OR_VSX_P (<MODE>mode)"
|
||||
"")
|
||||
|
||||
|
||||
(define_expand "nor<mode>3"
|
||||
[(set (match_operand:VEC_L 0 "vlogical_operand" "")
|
||||
(not:VEC_L (ior:VEC_L (match_operand:VEC_L 1 "vlogical_operand" "")
|
||||
|
@ -668,24 +671,24 @@
|
|||
"VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)"
|
||||
"")
|
||||
|
||||
(define_expand "vec_interleave_highv2df"
|
||||
[(set (match_operand:V2DF 0 "vfloat_operand" "")
|
||||
(vec_concat:V2DF
|
||||
(vec_select:DF (match_operand:V2DF 1 "vfloat_operand" "")
|
||||
(parallel [(const_int 0)]))
|
||||
(vec_select:DF (match_operand:V2DF 2 "vfloat_operand" "")
|
||||
(parallel [(const_int 0)]))))]
|
||||
"VECTOR_UNIT_VSX_P (V2DFmode)"
|
||||
(define_expand "vec_interleave_high<mode>"
|
||||
[(set (match_operand:VEC_64 0 "vfloat_operand" "")
|
||||
(vec_concat:VEC_64
|
||||
(vec_select:<VEC_base> (match_operand:VEC_64 1 "vfloat_operand" "")
|
||||
(parallel [(const_int 0)]))
|
||||
(vec_select:<VEC_base> (match_operand:VEC_64 2 "vfloat_operand" "")
|
||||
(parallel [(const_int 0)]))))]
|
||||
"VECTOR_UNIT_VSX_P (<MODE>mode)"
|
||||
"")
|
||||
|
||||
(define_expand "vec_interleave_lowv2df"
|
||||
[(set (match_operand:V2DF 0 "vfloat_operand" "")
|
||||
(vec_concat:V2DF
|
||||
(vec_select:DF (match_operand:V2DF 1 "vfloat_operand" "")
|
||||
(parallel [(const_int 1)]))
|
||||
(vec_select:DF (match_operand:V2DF 2 "vfloat_operand" "")
|
||||
(parallel [(const_int 1)]))))]
|
||||
"VECTOR_UNIT_VSX_P (V2DFmode)"
|
||||
(define_expand "vec_interleave_low<mode>"
|
||||
[(set (match_operand:VEC_64 0 "vfloat_operand" "")
|
||||
(vec_concat:VEC_64
|
||||
(vec_select:<VEC_base> (match_operand:VEC_64 1 "vfloat_operand" "")
|
||||
(parallel [(const_int 1)]))
|
||||
(vec_select:<VEC_base> (match_operand:VEC_64 2 "vfloat_operand" "")
|
||||
(parallel [(const_int 1)]))))]
|
||||
"VECTOR_UNIT_VSX_P (<MODE>mode)"
|
||||
"")
|
||||
|
||||
|
||||
|
@ -889,7 +892,7 @@
|
|||
rtx insn;
|
||||
HOST_WIDE_INT bitshift_val;
|
||||
HOST_WIDE_INT byteshift_val;
|
||||
|
||||
|
||||
if (! CONSTANT_P (bitshift))
|
||||
FAIL;
|
||||
bitshift_val = INTVAL (bitshift);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-02-25 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
PR target/43154
|
||||
* gcc.target/powerpc/pr43154.c: New file.
|
||||
|
||||
2010-02-25 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR debug/43166
|
||||
|
|
29
gcc/testsuite/gcc.target/powerpc/pr43154.c
Normal file
29
gcc/testsuite/gcc.target/powerpc/pr43154.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* { dg-do compile { target { powerpc*-*-* } } } */
|
||||
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
|
||||
/* { dg-require-effective-target powerpc_vsx_ok } */
|
||||
/* { dg-options "-O2 -mcpu=power7" } */
|
||||
|
||||
/* Make sure that vec_mergel and vec_mergeh are supported for V2DF/V2DI types. */
|
||||
/* { dg-final { scan-assembler-times "xxpermdi" 4 } } */
|
||||
|
||||
#include <altivec.h>
|
||||
|
||||
void vec_high_v2df (vector double *a, vector double *b, vector double *c)
|
||||
{
|
||||
*a = vec_mergeh (*b, *c);
|
||||
}
|
||||
|
||||
void vec_low_v2df (vector double *a, vector double *b, vector double *c)
|
||||
{
|
||||
*a = vec_mergel (*b, *c);
|
||||
}
|
||||
|
||||
void vec_high_v2di (vector long long *a, vector long long *b, vector long long *c)
|
||||
{
|
||||
*a = vec_mergeh (*b, *c);
|
||||
}
|
||||
|
||||
void vec_low_v2di (vector long long *a, vector long long *b, vector long long *c)
|
||||
{
|
||||
*a = vec_mergel (*b, *c);
|
||||
}
|
Loading…
Add table
Reference in a new issue