Commit 0b61703c by Andrew Pinski

rs6000-c.c (altivec_overloaded_builtins): Add Cell Altivec intrinsics.

2008-10-01  Andrew Pinski  <andrew_pinski@playstation.sony.com>
            Yukishige Shibata <shibata@rd.scei.sony.co.jp>
            Trevor Smigiel  <Trevor_Smigiel@playstation.sony.com>

        * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add Cell
        Altivec intrinsics.
        * config/rs6000/rs6000.c (altivec_expand_lv_builtin): Delete
        prototype.  Add new parameter, blk.
        Use BLKmode for the MEM if blk is true.
        (altivec_expand_builtin): Handle ALTIVEC_BUILTIN_STVLX,
        ALTIVEC_BUILTIN_STVLXL, ALTIVEC_BUILTIN_STVRX, and
        ALTIVEC_BUILTIN_STVRXL.
        Update usage of altivec_expand_lv_builtin.
        Handle ALTIVEC_BUILTIN_LVLX, ALTIVEC_BUILTIN_LVLXL,
        ALTIVEC_BUILTIN_LVRX, and ALTIVEC_BUILTIN_LVRXL.
        (altivec_init_builtins): If compiling for the Cell, also define the
        cell VMX builtins.
        * config/rs6000/rs6000.h (rs6000_builtins): Define
        ALTIVEC_BUILTIN_LVLX, ALTIVEC_BUILTIN_LVLXL, ALTIVEC_BUILTIN_LVRX,
        ALTIVEC_BUILTIN_LVRXL, ALTIVEC_BUILTIN_STVLX, ALTIVEC_BUILTIN_STVLXL,
        ALTIVEC_BUILTIN_STVRX, ALTIVEC_BUILTIN_STVRXL,
        ALTIVEC_BUILTIN_VEC_LVLX, ALTIVEC_BUILTIN_VEC_LVLXL,
        ALTIVEC_BUILTIN_VEC_LVRX, ALTIVEC_BUILTIN_VEC_LVRXL,
        ALTIVEC_BUILTIN_VEC_STVLX, ALTIVEC_BUILTIN_VEC_STVLXL,
        ALTIVEC_BUILTIN_VEC_STVRX, and ALTIVEC_BUILTIN_VEC_STVRXL.
        * config/rs6000/altivec.md (define_constants): Define UNSPEC_LVLX,
        UNSPEC_LVLXL, UNSPEC_LVRX, UNSPEC_LVRXL, UNSPEC_STVLX, UNSPEC_STVLXL,
        UNSPEC_STVRX, and UNSPEC_STVRXL.
        (altivec_lvlx): New pattern.
        (altivec_lvlxl): New pattern.
        (altivec_lvrx): New pattern.
        (altivec_lvrxl): New pattern.
        (altivec_stvlx): New pattern.
        (altivec_stvlxl): New pattern.
        (altivec_stvrx): New pattern.
        (altivec_stvrxl): New pattern.
        * config/rs6000/altivec.h (vec_lvlx): Define if PPU is defined.
        (vec_lvlxl): Likewise.
        (vec_lvrx): Define if PPU is defined.
        (vec_lvrxl): Likewise.
        (vec_stvlx): Define if PPU is defined.
        (vec_stvlxl): Likewise.
        (vec_stvrx): Define if PPU is defined.
        (vec_stvrxl): Likewise.

2008-10-01  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        * gcc.target/powerpc/altivec_check.h (altivec_cell_check): New function.
        * gcc.target/powerpc/altivec-cell-6.c: New test.
        * gcc.target/powerpc/altivec-cell-7.c: New test.
        * gcc.target/powerpc/altivec-cell-8.c: New test.

From-SVN: r140820
parent 522aa637
2008-10-01 Andrew Pinski <andrew_pinski@playstation.sony.com>
Yukishige Shibata <shibata@rd.scei.sony.co.jp>
Trevor Smigiel <Trevor_Smigiel@playstation.sony.com>
* config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add Cell
Altivec intrinsics.
* config/rs6000/rs6000.c (altivec_expand_lv_builtin): Delete
prototype. Add new parameter, blk.
Use BLKmode for the MEM if blk is true.
(altivec_expand_builtin): Handle ALTIVEC_BUILTIN_STVLX,
ALTIVEC_BUILTIN_STVLXL, ALTIVEC_BUILTIN_STVRX, and
ALTIVEC_BUILTIN_STVRXL.
Update usage of altivec_expand_lv_builtin.
Handle ALTIVEC_BUILTIN_LVLX, ALTIVEC_BUILTIN_LVLXL,
ALTIVEC_BUILTIN_LVRX, and ALTIVEC_BUILTIN_LVRXL.
(altivec_init_builtins): If compiling for the Cell, also define the
cell VMX builtins.
* config/rs6000/rs6000.h (rs6000_builtins): Define
ALTIVEC_BUILTIN_LVLX, ALTIVEC_BUILTIN_LVLXL, ALTIVEC_BUILTIN_LVRX,
ALTIVEC_BUILTIN_LVRXL, ALTIVEC_BUILTIN_STVLX, ALTIVEC_BUILTIN_STVLXL,
ALTIVEC_BUILTIN_STVRX, ALTIVEC_BUILTIN_STVRXL,
ALTIVEC_BUILTIN_VEC_LVLX, ALTIVEC_BUILTIN_VEC_LVLXL,
ALTIVEC_BUILTIN_VEC_LVRX, ALTIVEC_BUILTIN_VEC_LVRXL,
ALTIVEC_BUILTIN_VEC_STVLX, ALTIVEC_BUILTIN_VEC_STVLXL,
ALTIVEC_BUILTIN_VEC_STVRX, and ALTIVEC_BUILTIN_VEC_STVRXL.
* config/rs6000/altivec.md (define_constants): Define UNSPEC_LVLX,
UNSPEC_LVLXL, UNSPEC_LVRX, UNSPEC_LVRXL, UNSPEC_STVLX, UNSPEC_STVLXL,
UNSPEC_STVRX, and UNSPEC_STVRXL.
(altivec_lvlx): New pattern.
(altivec_lvlxl): New pattern.
(altivec_lvrx): New pattern.
(altivec_lvrxl): New pattern.
(altivec_stvlx): New pattern.
(altivec_stvlxl): New pattern.
(altivec_stvrx): New pattern.
(altivec_stvrxl): New pattern.
* config/rs6000/altivec.h (vec_lvlx): Define if PPU is defined.
(vec_lvlxl): Likewise.
(vec_lvrx): Define if PPU is defined.
(vec_lvrxl): Likewise.
(vec_stvlx): Define if PPU is defined.
(vec_stvlxl): Likewise.
(vec_stvrx): Define if PPU is defined.
(vec_stvrxl): Likewise.
2008-10-01 Geert Bosch <bosch@adacore.com> 2008-10-01 Geert Bosch <bosch@adacore.com>
* tree.c (contains_placeholder_p): Return 0 for a SAVE_EXPR. * tree.c (contains_placeholder_p): Return 0 for a SAVE_EXPR.
...@@ -10,10 +55,10 @@ ...@@ -10,10 +55,10 @@
2008-10-01 Richard Guenther <rguenther@suse.de> 2008-10-01 Richard Guenther <rguenther@suse.de>
PR middle-end/37285 PR middle-end/37285
* tree-vrp.c (execute_vrp): If we optimized away the default * tree-vrp.c (execute_vrp): If we optimized away the default
case make sure to promote the label that got in place of it case make sure to promote the label that got in place of it
to a default case label. to a default case label.
2008-10-01 Richard Henderson <rth@redhat.com> 2008-10-01 Richard Henderson <rth@redhat.com>
...@@ -220,7 +265,7 @@ ...@@ -220,7 +265,7 @@
2008-09-26 Vladimir Makarov <vmakarov@redhat.com> 2008-09-26 Vladimir Makarov <vmakarov@redhat.com>
Revert: Revert:
2008-09-25 Vladimir Makarov <vmakarov@redhat.com> 2008-09-25 Vladimir Makarov <vmakarov@redhat.com>
* ira-lives.c:... * ira-lives.c:...
* doc/rtl.texi:... * doc/rtl.texi:...
......
...@@ -205,6 +205,13 @@ ...@@ -205,6 +205,13 @@
#define vec_lvebx __builtin_vec_lvebx #define vec_lvebx __builtin_vec_lvebx
#define vec_lvehx __builtin_vec_lvehx #define vec_lvehx __builtin_vec_lvehx
#define vec_lvewx __builtin_vec_lvewx #define vec_lvewx __builtin_vec_lvewx
/* Cell only intrinsics. */
#ifdef __PPU__
#define vec_lvlx __builtin_vec_lvlx
#define vec_lvlxl __builtin_vec_lvlxl
#define vec_lvrx __builtin_vec_lvrx
#define vec_lvrxl __builtin_vec_lvrxl
#endif
#define vec_lvsl __builtin_vec_lvsl #define vec_lvsl __builtin_vec_lvsl
#define vec_lvsr __builtin_vec_lvsr #define vec_lvsr __builtin_vec_lvsr
#define vec_max __builtin_vec_max #define vec_max __builtin_vec_max
...@@ -239,6 +246,13 @@ ...@@ -239,6 +246,13 @@
#define vec_stvebx __builtin_vec_stvebx #define vec_stvebx __builtin_vec_stvebx
#define vec_stvehx __builtin_vec_stvehx #define vec_stvehx __builtin_vec_stvehx
#define vec_stvewx __builtin_vec_stvewx #define vec_stvewx __builtin_vec_stvewx
/* Cell only intrinsics. */
#ifdef __PPU__
#define vec_stvlx __builtin_vec_stvlx
#define vec_stvlxl __builtin_vec_stvlxl
#define vec_stvrx __builtin_vec_stvrx
#define vec_stvrxl __builtin_vec_stvrxl
#endif
#define vec_sub __builtin_vec_sub #define vec_sub __builtin_vec_sub
#define vec_subs __builtin_vec_subs #define vec_subs __builtin_vec_subs
#define vec_sum __builtin_vec_sum #define vec_sum __builtin_vec_sum
......
...@@ -130,6 +130,14 @@ ...@@ -130,6 +130,14 @@
(UNSPEC_INTERLO_V8HI 233) (UNSPEC_INTERLO_V8HI 233)
(UNSPEC_INTERLO_V16QI 234) (UNSPEC_INTERLO_V16QI 234)
(UNSPEC_INTERLO_V4SF 235) (UNSPEC_INTERLO_V4SF 235)
(UNSPEC_LVLX 236)
(UNSPEC_LVLXL 237)
(UNSPEC_LVRX 238)
(UNSPEC_LVRXL 239)
(UNSPEC_STVLX 240)
(UNSPEC_STVLXL 241)
(UNSPEC_STVRX 242)
(UNSPEC_STVRXL 243)
(UNSPEC_VMULWHUB 308) (UNSPEC_VMULWHUB 308)
(UNSPEC_VMULWLUB 309) (UNSPEC_VMULWLUB 309)
(UNSPEC_VMULWHSB 310) (UNSPEC_VMULWHSB 310)
...@@ -2677,6 +2685,76 @@ ...@@ -2677,6 +2685,76 @@
DONE; DONE;
}") }")
;; Vector SIMD PEM v2.06c defines LVLX, LVLXL, LVRX, LVRXL,
;; STVLX, STVLXL, STVVRX, STVRXL are available only on Cell.
(define_insn "altivec_lvlx"
[(set (match_operand:V16QI 0 "register_operand" "=v")
(unspec:V16QI [(match_operand 1 "memory_operand" "Z")]
UNSPEC_LVLX))]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"lvlx %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvlxl"
[(set (match_operand:V16QI 0 "register_operand" "=v")
(unspec:V16QI [(match_operand 1 "memory_operand" "Z")]
UNSPEC_LVLXL))]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"lvlxl %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvrx"
[(set (match_operand:V16QI 0 "register_operand" "=v")
(unspec:V16QI [(match_operand 1 "memory_operand" "Z")]
UNSPEC_LVRX))]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"lvrx %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_lvrxl"
[(set (match_operand:V16QI 0 "register_operand" "=v")
(unspec:V16QI [(match_operand 1 "memory_operand" "Z")]
UNSPEC_LVRXL))]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"lvrxl %0,%y1"
[(set_attr "type" "vecload")])
(define_insn "altivec_stvlx"
[(parallel
[(set (match_operand:V4SI 0 "memory_operand" "=Z")
(match_operand:V4SI 1 "register_operand" "v"))
(unspec [(const_int 0)] UNSPEC_STVLX)])]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"stvlx %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvlxl"
[(parallel
[(set (match_operand:V4SI 0 "memory_operand" "=Z")
(match_operand:V4SI 1 "register_operand" "v"))
(unspec [(const_int 0)] UNSPEC_STVLXL)])]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"stvlxl %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvrx"
[(parallel
[(set (match_operand:V4SI 0 "memory_operand" "=Z")
(match_operand:V4SI 1 "register_operand" "v"))
(unspec [(const_int 0)] UNSPEC_STVRX)])]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"stvrx %1,%y0"
[(set_attr "type" "vecstore")])
(define_insn "altivec_stvrxl"
[(parallel
[(set (match_operand:V4SI 0 "memory_operand" "=Z")
(match_operand:V4SI 1 "register_operand" "v"))
(unspec [(const_int 0)] UNSPEC_STVRXL)])]
"TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
"stvrxl %1,%y0"
[(set_attr "type" "vecstore")])
(define_expand "vec_extract_evenv4si" (define_expand "vec_extract_evenv4si"
[(set (match_operand:V4SI 0 "register_operand" "") [(set (match_operand:V4SI 0 "register_operand" "")
(unspec:V8HI [(match_operand:V4SI 1 "register_operand" "") (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "")
......
...@@ -905,7 +905,6 @@ static rtx altivec_expand_dst_builtin (tree, rtx, bool *); ...@@ -905,7 +905,6 @@ static rtx altivec_expand_dst_builtin (tree, rtx, bool *);
static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx); static rtx altivec_expand_abs_builtin (enum insn_code, tree, rtx);
static rtx altivec_expand_predicate_builtin (enum insn_code, static rtx altivec_expand_predicate_builtin (enum insn_code,
const char *, tree, rtx); const char *, tree, rtx);
static rtx altivec_expand_lv_builtin (enum insn_code, tree, rtx);
static rtx altivec_expand_stv_builtin (enum insn_code, tree); static rtx altivec_expand_stv_builtin (enum insn_code, tree);
static rtx altivec_expand_vec_init_builtin (tree, tree, rtx); static rtx altivec_expand_vec_init_builtin (tree, tree, rtx);
static rtx altivec_expand_vec_set_builtin (tree); static rtx altivec_expand_vec_set_builtin (tree);
...@@ -8065,7 +8064,7 @@ paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target) ...@@ -8065,7 +8064,7 @@ paired_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
} }
static rtx static rtx
altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target) altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target, bool blk)
{ {
rtx pat, addr; rtx pat, addr;
tree arg0 = CALL_EXPR_ARG (exp, 0); tree arg0 = CALL_EXPR_ARG (exp, 0);
...@@ -8093,12 +8092,12 @@ altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target) ...@@ -8093,12 +8092,12 @@ altivec_expand_lv_builtin (enum insn_code icode, tree exp, rtx target)
if (op0 == const0_rtx) if (op0 == const0_rtx)
{ {
addr = gen_rtx_MEM (tmode, op1); addr = gen_rtx_MEM (blk ? BLKmode : tmode, op1);
} }
else else
{ {
op0 = copy_to_mode_reg (mode0, op0); op0 = copy_to_mode_reg (mode0, op0);
addr = gen_rtx_MEM (tmode, gen_rtx_PLUS (Pmode, op0, op1)); addr = gen_rtx_MEM (blk ? BLKmode : tmode, gen_rtx_PLUS (Pmode, op0, op1));
} }
pat = GEN_FCN (icode) (target, addr); pat = GEN_FCN (icode) (target, addr);
...@@ -8605,6 +8604,15 @@ altivec_expand_builtin (tree exp, rtx target, bool *expandedp) ...@@ -8605,6 +8604,15 @@ altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
case ALTIVEC_BUILTIN_STVXL: case ALTIVEC_BUILTIN_STVXL:
return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp); return altivec_expand_stv_builtin (CODE_FOR_altivec_stvxl, exp);
case ALTIVEC_BUILTIN_STVLX:
return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlx, exp);
case ALTIVEC_BUILTIN_STVLXL:
return altivec_expand_stv_builtin (CODE_FOR_altivec_stvlxl, exp);
case ALTIVEC_BUILTIN_STVRX:
return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrx, exp);
case ALTIVEC_BUILTIN_STVRXL:
return altivec_expand_stv_builtin (CODE_FOR_altivec_stvrxl, exp);
case ALTIVEC_BUILTIN_MFVSCR: case ALTIVEC_BUILTIN_MFVSCR:
icode = CODE_FOR_altivec_mfvscr; icode = CODE_FOR_altivec_mfvscr;
tmode = insn_data[icode].operand[0].mode; tmode = insn_data[icode].operand[0].mode;
...@@ -8707,25 +8715,37 @@ altivec_expand_builtin (tree exp, rtx target, bool *expandedp) ...@@ -8707,25 +8715,37 @@ altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
{ {
case ALTIVEC_BUILTIN_LVSL: case ALTIVEC_BUILTIN_LVSL:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsl,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVSR: case ALTIVEC_BUILTIN_LVSR:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvsr,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVEBX: case ALTIVEC_BUILTIN_LVEBX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvebx,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVEHX: case ALTIVEC_BUILTIN_LVEHX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvehx,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVEWX: case ALTIVEC_BUILTIN_LVEWX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvewx,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVXL: case ALTIVEC_BUILTIN_LVXL:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvxl,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVX: case ALTIVEC_BUILTIN_LVX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx, return altivec_expand_lv_builtin (CODE_FOR_altivec_lvx,
exp, target); exp, target, false);
case ALTIVEC_BUILTIN_LVLX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlx,
exp, target, true);
case ALTIVEC_BUILTIN_LVLXL:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvlxl,
exp, target, true);
case ALTIVEC_BUILTIN_LVRX:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrx,
exp, target, true);
case ALTIVEC_BUILTIN_LVRXL:
return altivec_expand_lv_builtin (CODE_FOR_altivec_lvrxl,
exp, target, true);
default: default:
break; break;
/* Fall through. */ /* Fall through. */
...@@ -9910,6 +9930,28 @@ altivec_init_builtins (void) ...@@ -9910,6 +9930,28 @@ altivec_init_builtins (void)
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX); def_builtin (MASK_ALTIVEC, "__builtin_vec_stvebx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEBX);
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX); def_builtin (MASK_ALTIVEC, "__builtin_vec_stvehx", void_ftype_opaque_long_pvoid, ALTIVEC_BUILTIN_VEC_STVEHX);
if (rs6000_cpu == PROCESSOR_CELL)
{
def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVLXL);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_LVRXL);
def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLX);
def_builtin (MASK_ALTIVEC, "__builtin_vec_lvlxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVLXL);
def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrx", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRX);
def_builtin (MASK_ALTIVEC, "__builtin_vec_lvrxl", v16qi_ftype_long_pcvoid, ALTIVEC_BUILTIN_VEC_LVRXL);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVLXL);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRX);
def_builtin (MASK_ALTIVEC, "__builtin_altivec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_STVRXL);
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLX);
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvlxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVLXL);
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrx", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRX);
def_builtin (MASK_ALTIVEC, "__builtin_vec_stvrxl", void_ftype_v16qi_long_pvoid, ALTIVEC_BUILTIN_VEC_STVRXL);
}
def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP); def_builtin (MASK_ALTIVEC, "__builtin_vec_step", int_ftype_opaque, ALTIVEC_BUILTIN_VEC_STEP);
def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD); def_builtin (MASK_ALTIVEC, "__builtin_vec_sld", opaque_ftype_opaque_opaque_int, ALTIVEC_BUILTIN_VEC_SLD);
......
...@@ -2543,10 +2543,18 @@ enum rs6000_builtins ...@@ -2543,10 +2543,18 @@ enum rs6000_builtins
ALTIVEC_BUILTIN_LVXL, ALTIVEC_BUILTIN_LVXL,
ALTIVEC_BUILTIN_LVX, ALTIVEC_BUILTIN_LVX,
ALTIVEC_BUILTIN_STVX, ALTIVEC_BUILTIN_STVX,
ALTIVEC_BUILTIN_LVLX,
ALTIVEC_BUILTIN_LVLXL,
ALTIVEC_BUILTIN_LVRX,
ALTIVEC_BUILTIN_LVRXL,
ALTIVEC_BUILTIN_STVEBX, ALTIVEC_BUILTIN_STVEBX,
ALTIVEC_BUILTIN_STVEHX, ALTIVEC_BUILTIN_STVEHX,
ALTIVEC_BUILTIN_STVEWX, ALTIVEC_BUILTIN_STVEWX,
ALTIVEC_BUILTIN_STVXL, ALTIVEC_BUILTIN_STVXL,
ALTIVEC_BUILTIN_STVLX,
ALTIVEC_BUILTIN_STVLXL,
ALTIVEC_BUILTIN_STVRX,
ALTIVEC_BUILTIN_STVRXL,
ALTIVEC_BUILTIN_VCMPBFP_P, ALTIVEC_BUILTIN_VCMPBFP_P,
ALTIVEC_BUILTIN_VCMPEQFP_P, ALTIVEC_BUILTIN_VCMPEQFP_P,
ALTIVEC_BUILTIN_VCMPEQUB_P, ALTIVEC_BUILTIN_VCMPEQUB_P,
...@@ -2621,6 +2629,10 @@ enum rs6000_builtins ...@@ -2621,6 +2629,10 @@ enum rs6000_builtins
ALTIVEC_BUILTIN_VEC_LVEBX, ALTIVEC_BUILTIN_VEC_LVEBX,
ALTIVEC_BUILTIN_VEC_LVEHX, ALTIVEC_BUILTIN_VEC_LVEHX,
ALTIVEC_BUILTIN_VEC_LVEWX, ALTIVEC_BUILTIN_VEC_LVEWX,
ALTIVEC_BUILTIN_VEC_LVLX,
ALTIVEC_BUILTIN_VEC_LVLXL,
ALTIVEC_BUILTIN_VEC_LVRX,
ALTIVEC_BUILTIN_VEC_LVRXL,
ALTIVEC_BUILTIN_VEC_LVSL, ALTIVEC_BUILTIN_VEC_LVSL,
ALTIVEC_BUILTIN_VEC_LVSR, ALTIVEC_BUILTIN_VEC_LVSR,
ALTIVEC_BUILTIN_VEC_MADD, ALTIVEC_BUILTIN_VEC_MADD,
...@@ -2680,6 +2692,10 @@ enum rs6000_builtins ...@@ -2680,6 +2692,10 @@ enum rs6000_builtins
ALTIVEC_BUILTIN_VEC_STVEBX, ALTIVEC_BUILTIN_VEC_STVEBX,
ALTIVEC_BUILTIN_VEC_STVEHX, ALTIVEC_BUILTIN_VEC_STVEHX,
ALTIVEC_BUILTIN_VEC_STVEWX, ALTIVEC_BUILTIN_VEC_STVEWX,
ALTIVEC_BUILTIN_VEC_STVLX,
ALTIVEC_BUILTIN_VEC_STVLXL,
ALTIVEC_BUILTIN_VEC_STVRX,
ALTIVEC_BUILTIN_VEC_STVRXL,
ALTIVEC_BUILTIN_VEC_SUB, ALTIVEC_BUILTIN_VEC_SUB,
ALTIVEC_BUILTIN_VEC_SUBC, ALTIVEC_BUILTIN_VEC_SUBC,
ALTIVEC_BUILTIN_VEC_SUBS, ALTIVEC_BUILTIN_VEC_SUBS,
......
2008-10-01 Andrew Pinski <andrew_pinski@playstation.sony.com>
* gcc.target/powerpc/altivec_check.h (altivec_cell_check): New function.
* gcc.target/powerpc/altivec-cell-6.c: New test.
* gcc.target/powerpc/altivec-cell-7.c: New test.
* gcc.target/powerpc/altivec-cell-8.c: New test.
2008-10-01 Richard Guenther <rguenther@suse.de> 2008-10-01 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37617 PR tree-optimization/37617
...@@ -5,8 +12,8 @@ ...@@ -5,8 +12,8 @@
2008-10-01 Richard Guenther <rguenther@suse.de> 2008-10-01 Richard Guenther <rguenther@suse.de>
PR middle-end/37285 PR middle-end/37285
* gcc.c-torture/compile/pr37285.c: New testcase. * gcc.c-torture/compile/pr37285.c: New testcase.
2008-10-01 Kai Tietz <kai.tietz@onevision.com> 2008-10-01 Kai Tietz <kai.tietz@onevision.com>
......
/* { dg-do compile } */
/* { dg-require-effective-target powerpc_altivec_ok } */
/* { dg-options "-O2 -maltivec -mabi=altivec -mcpu=cell" } */
#include <altivec.h>
/* This used to ICE with reloading of a constant address. */
vector float f(void)
{
vector float * a = (void*)16;
return vec_lvlx (0, a);
}
/* { dg-do compile } */
/* { dg-require-effective-target powerpc_altivec_ok } */
/* { dg-options "-O2 -maltivec -mabi=altivec -mcpu=cell" } */
/* { dg-final { scan-assembler-times "vor" 2 } } */
#include <altivec.h>
/* Make sure that lvlx and lvrx are not combined into one insn and
we still get a vor. */
vector unsigned char
lvx_float (long off, float *p)
{
vector unsigned char l, r;
l = (vector unsigned char) vec_lvlx (off, p);
r = (vector unsigned char) vec_lvrx (off, p);
return vec_or(l, r);
}
vector unsigned char
lvxl_float (long off, float *p)
{
vector unsigned char l, r;
l = (vector unsigned char) vec_lvlxl (off, p);
r = (vector unsigned char) vec_lvrxl (off, p);
return vec_or(l, r);
}
/* { dg-do run } */
/* { dg-require-effective-target powerpc_altivec_ok } */
/* { dg-options "-O2 -maltivec -mabi=altivec -mcpu=cell" } */
#include <altivec.h>
#include <string.h>
#include "altivec_check.h"
typedef short int sint16;
typedef signed char int8;
int main1(void) __attribute__((noinline));
int main1(void)
{
sint16 test_vector[4] = { 1678, -2356, 19246, -17892 };
int8 test_dst[128] __attribute__(( aligned( 16 )));
float test_out[4] __attribute__(( aligned( 16 )));
int p;
for( p = 0; p < 24; ++p )
{
memset( test_dst, 0, 128 );
memcpy( &test_dst[p], test_vector, 8 );
{
vector float VR, VL, V;
/* load the righthand section of the misaligned vector */
VR = (vector float) vec_lvrx( 8, &test_dst[p] );
VL = (vector float) vec_lvlx( 0, &test_dst[p] );
/* Vector Shift Left Double by Octet Immediate, move the right hand section into the bytes */
VR = vec_vsldoi( VR, VR, 2 << 2 );
/* or those two together */
V = vec_vor( VL, VR );
/* sign extend */
V = (vector float) vec_vupkhsh((vector bool short)V );
/* fixed to float by S16_SHIFT_BITS bits */
V = (vector float) vec_vcfsx ((vector signed int)V, 5 );
vec_stvx( V, 0, &test_out[0] );
if (test_out[0] != 52.437500)
abort ();
if (test_out[1] != -73.625000)
abort ();
if (test_out[2] != 601.437500)
abort ();
if (test_out[3] != -559.125000)
abort ();
}
}
return 0;
}
int main(void)
{
altivec_cell_check ();
return main1();
}
...@@ -22,3 +22,17 @@ void altivec_check(void) { ...@@ -22,3 +22,17 @@ void altivec_check(void) {
#endif #endif
signal (SIGILL, SIG_DFL); signal (SIGILL, SIG_DFL);
} }
void altivec_cell_check (void)
{
/* Exit on systems without the Cell Altivec instructions. */
signal (SIGILL, sig_ill_handler);
#ifdef __MACH__
asm volatile ("vor v0,v0,v0");
asm volatile ("lvlx v0,r0,r0");
#else
asm volatile ("vor 0,0,0");
asm volatile ("lvlx 0,0,0");
#endif
signal (SIGILL, SIG_DFL);
}
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