While fiddling around with the VIS intrinsic builtins I noticed that none of them have TREE_READONLY set, so the resulting code can be terrible.
We can't currently do this for alignaddr and faligndata because we don't model the way those instructions use the %gsr register. Committed to trunk. gcc/ * config/sparc/sparc.c (def_builtin): Change from macro into function. (def_builtin_const): New. (sparc_vis_init_builtins): Use def_builtin_const for all VIS builtins other than alignaddr and falignaddr. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 68b5961..7533307 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -9100,9 +9100,21 @@ sparc_init_libfuncs (void) } } -#define def_builtin(NAME, CODE, TYPE) \ - add_builtin_function((NAME), (TYPE), (CODE), BUILT_IN_MD, NULL, \ - NULL_TREE) +static tree def_builtin(const char *name, int code, tree type) +{ + return add_builtin_function(name, type, code, BUILT_IN_MD, NULL, + NULL_TREE); +} + +static tree def_builtin_const(const char *name, int code, tree type) +{ + tree t = def_builtin(name, code, type); + + if (t) + TREE_READONLY (t) = 1; + + return t; +} /* Implement the TARGET_INIT_BUILTINS target hook. Create builtin functions for special SPARC instructions. */ @@ -9154,30 +9166,32 @@ sparc_vis_init_builtins (void) ptr_type_node, 0); /* Packing and expanding vectors. */ - def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis, v4qi_ftype_v4hi); - def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis, - v8qi_ftype_v2si_v8qi); - def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis, - v2hi_ftype_v2si); - def_builtin ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis, v4hi_ftype_v4qi); - def_builtin ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis, - v8qi_ftype_v4qi_v4qi); + def_builtin_const ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis, + v4qi_ftype_v4hi); + def_builtin_const ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis, + v8qi_ftype_v2si_v8qi); + def_builtin_const ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis, + v2hi_ftype_v2si); + def_builtin_const ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis, + v4hi_ftype_v4qi); + def_builtin_const ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis, + v8qi_ftype_v4qi_v4qi); /* Multiplications. */ - def_builtin ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis, - v4hi_ftype_v4qi_v4hi); - def_builtin ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis, - v4hi_ftype_v4qi_v2hi); - def_builtin ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis, - v4hi_ftype_v4qi_v2hi); - def_builtin ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis, - v4hi_ftype_v8qi_v4hi); - def_builtin ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis, - v4hi_ftype_v8qi_v4hi); - def_builtin ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis, - v2si_ftype_v4qi_v2hi); - def_builtin ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis, - v2si_ftype_v4qi_v2hi); + def_builtin_const ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis, + v4hi_ftype_v4qi_v4hi); + def_builtin_const ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis, + v4hi_ftype_v4qi_v2hi); + def_builtin_const ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis, + v4hi_ftype_v4qi_v2hi); + def_builtin_const ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis, + v4hi_ftype_v8qi_v4hi); + def_builtin_const ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis, + v4hi_ftype_v8qi_v4hi); + def_builtin_const ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis, + v2si_ftype_v4qi_v2hi); + def_builtin_const ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis, + v2si_ftype_v4qi_v2hi); /* Data aligning. */ def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis, @@ -9187,7 +9201,7 @@ sparc_vis_init_builtins (void) def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis, v2si_ftype_v2si_v2si); def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatadi_vis, - di_ftype_di_di); + di_ftype_di_di); if (TARGET_ARCH64) { def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis, @@ -9204,39 +9218,39 @@ sparc_vis_init_builtins (void) } /* Pixel distance. */ - def_builtin ("__builtin_vis_pdist", CODE_FOR_pdist_vis, - di_ftype_v8qi_v8qi_di); + def_builtin_const ("__builtin_vis_pdist", CODE_FOR_pdist_vis, + di_ftype_v8qi_v8qi_di); /* Edge handling. */ if (TARGET_ARCH64) { - def_builtin ("__builtin_vis_edge8", CODE_FOR_edge8di_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge16", CODE_FOR_edge16di_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge32", CODE_FOR_edge32di_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis, - si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8di_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16di_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32di_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis, + si_ftype_ptr_ptr); } else { - def_builtin ("__builtin_vis_edge8", CODE_FOR_edge8si_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge16", CODE_FOR_edge16si_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge32", CODE_FOR_edge32si_vis, - si_ftype_ptr_ptr); - def_builtin ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis, - si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8si_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16si_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32si_vis, + si_ftype_ptr_ptr); + def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis, + si_ftype_ptr_ptr); } } -- 1.7.6.401.g6a319