Commit 690f24b7 by Jose E. Marchesi Committed by Jose E. Marchesi

sparc: support for the SPARC M7 and VIS 4.0

    
gcc/ChangeLog:
    
2016-06-06  Jose E. Marchesi  <jose.marchesi@oracle.com>
    
    	* config/sparc/sparc.md (cpu): Add niagara7 cpu type.
    	Include the M7 SPARC DFA scheduler.
    	New attribute v3pipe.
    	Annotate insns with v3pipe where appropriate.
    	Define cpu_feature vis4.
    	Add lzd instruction type and set it on clzdi_sp64 and clzsi_sp64.
    	Add (V8QI "8") to vbits.
    	Add insns {add,sub}v8qi3
    	Add insns ss{add,sub}v8qi3
    	Add insns us{add,sub}{v8qi,v4hi}3
    	Add insns {min,max}{v8qi,v4hi,v2si}3
    	Add insns {minu,maxu}{v8qi,v4hi,v2si}3
    	Add insns fpcmp{le,gt,ule,ug,ule,ugt}{8,16,32}_vis.
    	* config/sparc/niagara4.md: Add a comment explaining the
    	discrepancy between the documented latenty numbers and the
    	implemented ones.
    	* config/sparc/niagara7.md: New file.
    	* configure.ac (HAVE_AS_SPARC5_VIS4): Define if the assembler
    	supports SPARC5 and VIS 4.0 instructions.
    	* configure: Regenerate.
    	* config.in: Likewise.
    	* config.gcc: niagara7 is a supported cpu in sparc*-*-* targets.
    	* config/sparc/sol2.h (ASM_CPU32_DEFAUILT_SPEC): Set for
    	TARGET_CPU_niagara7.
    	(ASM_CPU64_DEFAULT_SPEC): Likewise.
    	(CPP_CPU_SPEC): Handle niagara7.
    	(ASM_CPU_SPEC): Likewise.
    	* config/sparc/sparc-opts.h (processor_type): Add
    	PROCESSOR_NIAGARA7.
    	(mvis4): New option.
    	* config/sparc/sparc.h (TARGET_CPU_niagara7): Define.
    	(AS_NIAGARA7_FLAG): Define.
    	(ASM_CPU64_DEFAULT_SPEC): Set for niagara7.
    	(CPP_CPU64_DEFAULT_SPEC): Likewise.
    	(CPP_CPU_SPEC): Handle niagara7.
    	(ASM_CPU_SPEC): Likewise.
    	* config/sparc/sparc.c (niagara7_costs): Define.
    	(sparc_option_override): Handle niagara7 and adjust cache-related
    	parameters with better values for niagara cpus.  Also support VIS4.
    	(sparc32_initialize_trampoline): Likewise.
    	(sparc_use_sched_lookahead): Likewise.
    	(sparc_issue_rate): Likewise.
    	(sparc_register_move_cost): Likewise.
    	(dump_target_flag_bits): Support VIS4.
    	(sparc_vis_init_builtins): Likewise.
    	(sparc_builtins): Likewise.
    	* config/sparc/sparc-c.c (sparc_target_macros): Define __VIS__ for
    	VIS4 4.0.
    	* config/sparc/driver-sparc.c (cpu_names): Add SPARC-M7 and
    	UltraSparc M7.
    	* config/sparc/sparc.opt (sparc_processor_type): New value
    	niagara7.
    	* config/sparc/visintrin.h (__attribute__): Prototypes for the
    	VIS4 builtins.
    	* doc/invoke.texi (SPARC Options): Document -mcpu=niagara7 and
    	-mvis4.
    	* doc/extend.texi (SPARC VIS Built-in Functions): Document the
    	VIS4 builtins.
    
gcc/testsuite/ChangeLog:
    
2016-06-06  Jose E. Marchesi  <jose.marchesi@oracle.com>
    
    	* gcc.target/sparc/vis4misc.c: New file.
    	* gcc.target/sparc/fpcmp.c: Likewise.
    	* gcc.target/sparc/fpcmpu.c: Likewise.

From-SVN: r237132
parent 8964d5aa
2016-06-06 Jose E. Marchesi <jose.marchesi@oracle.com>
* config/sparc/sparc.md (cpu): Add niagara7 cpu type.
Include the M7 SPARC DFA scheduler.
New attribute v3pipe.
Annotate insns with v3pipe where appropriate.
Define cpu_feature vis4.
Add lzd instruction type and set it on clzdi_sp64 and clzsi_sp64.
Add (V8QI "8") to vbits.
Add insns {add,sub}v8qi3
Add insns ss{add,sub}v8qi3
Add insns us{add,sub}{v8qi,v4hi}3
Add insns {min,max}{v8qi,v4hi,v2si}3
Add insns {minu,maxu}{v8qi,v4hi,v2si}3
Add insns fpcmp{le,gt,ule,ug,ule,ugt}{8,16,32}_vis.
* config/sparc/niagara4.md: Add a comment explaining the
discrepancy between the documented latenty numbers and the
implemented ones.
* config/sparc/niagara7.md: New file.
* configure.ac (HAVE_AS_SPARC5_VIS4): Define if the assembler
supports SPARC5 and VIS 4.0 instructions.
* configure: Regenerate.
* config.in: Likewise.
* config.gcc: niagara7 is a supported cpu in sparc*-*-* targets.
* config/sparc/sol2.h (ASM_CPU32_DEFAUILT_SPEC): Set for
TARGET_CPU_niagara7.
(ASM_CPU64_DEFAULT_SPEC): Likewise.
(CPP_CPU_SPEC): Handle niagara7.
(ASM_CPU_SPEC): Likewise.
* config/sparc/sparc-opts.h (processor_type): Add
PROCESSOR_NIAGARA7.
(mvis4): New option.
* config/sparc/sparc.h (TARGET_CPU_niagara7): Define.
(AS_NIAGARA7_FLAG): Define.
(ASM_CPU64_DEFAULT_SPEC): Set for niagara7.
(CPP_CPU64_DEFAULT_SPEC): Likewise.
(CPP_CPU_SPEC): Handle niagara7.
(ASM_CPU_SPEC): Likewise.
* config/sparc/sparc.c (niagara7_costs): Define.
(sparc_option_override): Handle niagara7 and adjust cache-related
parameters with better values for niagara cpus. Also support VIS4.
(sparc32_initialize_trampoline): Likewise.
(sparc_use_sched_lookahead): Likewise.
(sparc_issue_rate): Likewise.
(sparc_register_move_cost): Likewise.
(dump_target_flag_bits): Support VIS4.
(sparc_vis_init_builtins): Likewise.
(sparc_builtins): Likewise.
* config/sparc/sparc-c.c (sparc_target_macros): Define __VIS__ for
VIS4 4.0.
* config/sparc/driver-sparc.c (cpu_names): Add SPARC-M7 and
UltraSparc M7.
* config/sparc/sparc.opt (sparc_processor_type): New value
niagara7.
* config/sparc/visintrin.h (__attribute__): Prototypes for the
VIS4 builtins.
* doc/invoke.texi (SPARC Options): Document -mcpu=niagara7 and
-mvis4.
* doc/extend.texi (SPARC VIS Built-in Functions): Document the
VIS4 builtins.
2016-06-06 Jonathan Wakely <jwakely@redhat.com> 2016-06-06 Jonathan Wakely <jwakely@redhat.com>
* doc/sourcebuild.texi (Directives): Remove extra closing braces. * doc/sourcebuild.texi (Directives): Remove extra closing braces.
......
...@@ -4259,7 +4259,7 @@ case "${target}" in ...@@ -4259,7 +4259,7 @@ case "${target}" in
| sparclite | f930 | f934 | sparclite86x \ | sparclite | f930 | f934 | sparclite86x \
| sparclet | tsc701 \ | sparclet | tsc701 \
| v9 | ultrasparc | ultrasparc3 | niagara | niagara2 \ | v9 | ultrasparc | ultrasparc3 | niagara | niagara2 \
| niagara3 | niagara4) | niagara3 | niagara4 | niagara7)
# OK # OK
;; ;;
*) *)
......
...@@ -628,6 +628,11 @@ ...@@ -628,6 +628,11 @@
#undef HAVE_AS_SPARC4 #undef HAVE_AS_SPARC4
#endif #endif
/* Define if your assembler supports SPARC5 and VIS4.0 instructions. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_SPARC5_VIS4
#endif
/* Define if your assembler and linker support GOTDATA_OP relocs. */ /* Define if your assembler and linker support GOTDATA_OP relocs. */
#ifndef USED_FOR_TARGET #ifndef USED_FOR_TARGET
......
...@@ -57,6 +57,7 @@ static const struct cpu_names { ...@@ -57,6 +57,7 @@ static const struct cpu_names {
{ "UltraSPARC-T2+", "niagara2" }, { "UltraSPARC-T2+", "niagara2" },
{ "SPARC-T3", "niagara3" }, { "SPARC-T3", "niagara3" },
{ "SPARC-T4", "niagara4" }, { "SPARC-T4", "niagara4" },
{ "SPARC-M7", "niagara7" },
#else #else
{ "SuperSparc", "supersparc" }, { "SuperSparc", "supersparc" },
{ "HyperSparc", "hypersparc" }, { "HyperSparc", "hypersparc" },
...@@ -73,6 +74,7 @@ static const struct cpu_names { ...@@ -73,6 +74,7 @@ static const struct cpu_names {
{ "UltraSparc T2", "niagara2" }, { "UltraSparc T2", "niagara2" },
{ "UltraSparc T3", "niagara3" }, { "UltraSparc T3", "niagara3" },
{ "UltraSparc T4", "niagara4" }, { "UltraSparc T4", "niagara4" },
{ "UltraSparc M7", "niagara7" },
{ "LEON", "leon3" }, { "LEON", "leon3" },
#endif #endif
{ NULL, NULL } { NULL, NULL }
......
...@@ -75,6 +75,13 @@ ...@@ -75,6 +75,13 @@
(eq_attr "fptype" "double"))) (eq_attr "fptype" "double")))
"n4_slot1") "n4_slot1")
;; The latency numbers for VIS instructions in the reservations below
;; reflect empirical results, and don't match with the documented
;; latency numbers in the T4 Processor Supplement. This is because
;; the HW chaps didn't feel it necessary to document the complexity in
;; the PRM, and just assigned a latency of 11 to all/most of the VIS
;; instructions.
(define_insn_reservation "n4_vis_move_11cycle" 11 (define_insn_reservation "n4_vis_move_11cycle" 11
(and (eq_attr "cpu" "niagara4") (and (eq_attr "cpu" "niagara4")
(and (eq_attr "type" "vismv") (and (eq_attr "type" "vismv")
......
;; Scheduling description for Niagara-7
;; Copyright (C) 2016 Free Software Foundation, Inc.
;;
;; This file is part of GCC.
;;
;; GCC is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;;
;; GCC is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GCC; see the file COPYING3. If not see
;; <http://www.gnu.org/licenses/>.
(define_automaton "niagara7_0")
(define_cpu_unit "n7_slot0,n7_slot1,n7_slot2" "niagara7_0")
(define_reservation "n7_single_issue" "n7_slot0 + n7_slot1 + n7_slot2")
(define_cpu_unit "n7_load_store" "niagara7_0")
(define_insn_reservation "n7_single" 1
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "multi,savew,flushw,trap"))
"n7_single_issue")
(define_insn_reservation "n7_iflush" 27
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "iflush"))
"(n7_slot0 | n7_slot1), nothing*26")
(define_insn_reservation "n7_integer" 1
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "ialu,ialuX,shift,cmove,compare"))
"(n7_slot0 | n7_slot1)")
(define_insn_reservation "n7_imul" 12
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "imul"))
"n7_slot1, nothing*11")
(define_insn_reservation "n7_idiv" 35
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "idiv"))
"n7_slot1, nothing*34")
(define_insn_reservation "n7_load" 5
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "load,fpload,sload"))
"(n7_slot0 + n7_load_store), nothing*4")
(define_insn_reservation "n7_store" 1
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "store,fpstore"))
"(n7_slot0 | n7_slot2) + n7_load_store")
(define_insn_reservation "n7_cti" 1
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "cbcond,uncond_cbcond,branch,call,sibcall,call_no_delay_slot,uncond_branch,return"))
"n7_slot1")
(define_insn_reservation "n7_fp" 11
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "fpmove,fpcmove,fpcrmove,fp,fpcmp,fpmul"))
"n7_slot1, nothing*10")
(define_insn_reservation "n7_array" 12
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "array,edge,edgen"))
"n7_slot1, nothing*11")
(define_insn_reservation "n7_fpdivs" 24
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "fpdivs,fpsqrts"))
"n7_slot1, nothing*23")
(define_insn_reservation "n7_fpdivd" 37
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "fpdivd,fpsqrtd"))
"n7_slot1, nothing*36")
(define_insn_reservation "n7_lzd" 12
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "lzd"))
"(n7_slot0 | n7_slot1), nothing*11")
;; There is an internal unit called the "V3 pipe", that was originally
;; intended to process some of the short cryptographic instructions.
;; However, as soon as in the T4 several of the VIS instructions
;; (notably non-FP instructions) have been moved to the V3 pipe.
;; Consequently, these instructions feature a latency of 3 instead of
;; 11 or 12 cycles, provided their consumers also execute in the V3
;; pipe.
;;
;; This is modelled here with a bypass.
(define_insn_reservation "n7_vis_fga" 11
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "fga,gsr"))
"n7_slot1, nothing*10")
(define_insn_reservation "n7_vis_fgm" 11
(and (eq_attr "cpu" "niagara7")
(eq_attr "type" "fgm_pack,fgm_mul,pdist"))
"n7_slot1, nothing*10")
(define_insn_reservation "n7_vis_move_v3pipe" 11
(and (eq_attr "cpu" "niagara7")
(and (eq_attr "type" "vismv")
(eq_attr "v3pipe" "true")))
"n7_slot1")
(define_insn_reservation "n7_vis_move_11cycle" 11
(and (eq_attr "cpu" "niagara7")
(and (eq_attr "type" "vismv")
(eq_attr "v3pipe" "false")))
"n7_slot1, nothing*10")
(define_insn_reservation "n7_vis_logical_v3pipe" 11
(and (eq_attr "cpu" "niagara7")
(and (eq_attr "type" "visl,pdistn")
(eq_attr "v3pipe" "true")))
"n7_slot1, nothing*2")
(define_insn_reservation "n7_vis_logical_11cycle" 11
(and (eq_attr "cpu" "niagara7")
(and (eq_attr "type" "visl")
(eq_attr "v3pipe" "false")))
"n7_slot1, nothing*10")
(define_bypass 3 "*_v3pipe" "*_v3pipe")
...@@ -165,13 +165,22 @@ along with GCC; see the file COPYING3. If not see ...@@ -165,13 +165,22 @@ along with GCC; see the file COPYING3. If not see
#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG AS_NIAGARA4_FLAG #define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG AS_NIAGARA4_FLAG
#endif #endif
#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
#undef CPP_CPU64_DEFAULT_SPEC
#define CPP_CPU64_DEFAULT_SPEC ""
#undef ASM_CPU32_DEFAULT_SPEC
#define ASM_CPU32_DEFAUILT_SPEC AS_SPARC32_FLAG AS_NIAGARA7_FLAG
#undef ASM_CPU64_DEFAULT_SPEC
#define ASM_CPU64_DEFAULT_SPEC AS_SPARC64_FLAG AS_NIAGARA7_FLAG
#endif
#undef CPP_CPU_SPEC #undef CPP_CPU_SPEC
#define CPP_CPU_SPEC "\ #define CPP_CPU_SPEC "\
%{mcpu=sparclet|mcpu=tsc701:-D__sparclet__} \ %{mcpu=sparclet|mcpu=tsc701:-D__sparclet__} \
%{mcpu=sparclite|mcpu-f930|mcpu=f934:-D__sparclite__} \ %{mcpu=sparclite|mcpu-f930|mcpu=f934:-D__sparclite__} \
%{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ %{mcpu=v8:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
%{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \ %{mcpu=supersparc:-D__supersparc__ " DEF_ARCH32_SPEC("-D__sparcv8") "} \
%{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3|mcpu=niagara|mcpu=niagara2|mcpu=niagara3|mcpu=niagara4:" DEF_ARCH32_SPEC("-D__sparcv8") "} \ %{mcpu=v9|mcpu=ultrasparc|mcpu=ultrasparc3|mcpu=niagara|mcpu=niagara2|mcpu=niagara3|mcpu=niagara4|mcpu=niagara7:" DEF_ARCH32_SPEC("-D__sparcv8") "} \
%{!mcpu*:%(cpp_cpu_default)} \ %{!mcpu*:%(cpp_cpu_default)} \
" "
...@@ -280,7 +289,8 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); ...@@ -280,7 +289,8 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
%{mcpu=niagara2:" DEF_ARCH32_SPEC("-xarch=v8plusb") DEF_ARCH64_SPEC("-xarch=v9b") "} \ %{mcpu=niagara2:" DEF_ARCH32_SPEC("-xarch=v8plusb") DEF_ARCH64_SPEC("-xarch=v9b") "} \
%{mcpu=niagara3:" DEF_ARCH32_SPEC("-xarch=v8plus" AS_NIAGARA3_FLAG) DEF_ARCH64_SPEC("-xarch=v9" AS_NIAGARA3_FLAG) "} \ %{mcpu=niagara3:" DEF_ARCH32_SPEC("-xarch=v8plus" AS_NIAGARA3_FLAG) DEF_ARCH64_SPEC("-xarch=v9" AS_NIAGARA3_FLAG) "} \
%{mcpu=niagara4:" DEF_ARCH32_SPEC(AS_SPARC32_FLAG AS_NIAGARA4_FLAG) DEF_ARCH64_SPEC(AS_SPARC64_FLAG AS_NIAGARA4_FLAG) "} \ %{mcpu=niagara4:" DEF_ARCH32_SPEC(AS_SPARC32_FLAG AS_NIAGARA4_FLAG) DEF_ARCH64_SPEC(AS_SPARC64_FLAG AS_NIAGARA4_FLAG) "} \
%{!mcpu=niagara4:%{!mcpu=niagara3:%{!mcpu=niagara2:%{!mcpu=niagara:%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC("-xarch=v9") "}}}}}}}} \ %{mcpu=niagara7:" DEF_ARCH32_SPEC(AS_SPARC32_FLAG AS_NIAGARA7_FLAG) DEF_ARCH64_SPEC(AS_SPARC64_FLAG AS_NIAGARA7_FLAG) "} \
%{!mcpu=niagara7:%{!mcpu=niagara4:%{!mcpu=niagara3:%{!mcpu=niagara2:%{!mcpu=niagara:%{!mcpu=ultrasparc3:%{!mcpu=ultrasparc:%{!mcpu=v9:%{mcpu*:" DEF_ARCH32_SPEC("-xarch=v8") DEF_ARCH64_SPEC("-xarch=v9") "}}}}}}}}} \
%{!mcpu*:%(asm_cpu_default)} \ %{!mcpu*:%(asm_cpu_default)} \
" "
......
...@@ -40,7 +40,12 @@ sparc_target_macros (void) ...@@ -40,7 +40,12 @@ sparc_target_macros (void)
cpp_assert (parse_in, "machine=sparc"); cpp_assert (parse_in, "machine=sparc");
} }
if (TARGET_VIS3) if (TARGET_VIS4)
{
cpp_define (parse_in, "__VIS__=0x400");
cpp_define (parse_in, "__VIS__=0x400");
}
else if (TARGET_VIS3)
{ {
cpp_define (parse_in, "__VIS__=0x300"); cpp_define (parse_in, "__VIS__=0x300");
cpp_define (parse_in, "__VIS=0x300"); cpp_define (parse_in, "__VIS=0x300");
......
...@@ -45,6 +45,7 @@ enum processor_type { ...@@ -45,6 +45,7 @@ enum processor_type {
PROCESSOR_NIAGARA2, PROCESSOR_NIAGARA2,
PROCESSOR_NIAGARA3, PROCESSOR_NIAGARA3,
PROCESSOR_NIAGARA4, PROCESSOR_NIAGARA4,
PROCESSOR_NIAGARA7,
PROCESSOR_NATIVE PROCESSOR_NATIVE
}; };
......
...@@ -142,6 +142,7 @@ extern enum cmodel sparc_cmodel; ...@@ -142,6 +142,7 @@ extern enum cmodel sparc_cmodel;
#define TARGET_CPU_niagara2 14 #define TARGET_CPU_niagara2 14
#define TARGET_CPU_niagara3 15 #define TARGET_CPU_niagara3 15
#define TARGET_CPU_niagara4 16 #define TARGET_CPU_niagara4 16
#define TARGET_CPU_niagara7 19
#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
|| TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \
...@@ -149,7 +150,8 @@ extern enum cmodel sparc_cmodel; ...@@ -149,7 +150,8 @@ extern enum cmodel sparc_cmodel;
|| TARGET_CPU_DEFAULT == TARGET_CPU_niagara \ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara \
|| TARGET_CPU_DEFAULT == TARGET_CPU_niagara2 \ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara2 \
|| TARGET_CPU_DEFAULT == TARGET_CPU_niagara3 \ || TARGET_CPU_DEFAULT == TARGET_CPU_niagara3 \
|| TARGET_CPU_DEFAULT == TARGET_CPU_niagara4 || TARGET_CPU_DEFAULT == TARGET_CPU_niagara4 \
|| TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
#define CPP_CPU32_DEFAULT_SPEC "" #define CPP_CPU32_DEFAULT_SPEC ""
#define ASM_CPU32_DEFAULT_SPEC "" #define ASM_CPU32_DEFAULT_SPEC ""
...@@ -186,6 +188,10 @@ extern enum cmodel sparc_cmodel; ...@@ -186,6 +188,10 @@ extern enum cmodel sparc_cmodel;
#define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__" #define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
#define ASM_CPU64_DEFAULT_SPEC AS_NIAGARA4_FLAG #define ASM_CPU64_DEFAULT_SPEC AS_NIAGARA4_FLAG
#endif #endif
#if TARGET_CPU_DEFAULT == TARGET_CPU_niagara7
#define CPP_CPU64_DEFAULT_SPEC "-D__sparc_v9__"
#define ASM_CPU64_DEFAULT_SPEC AS_NIAGARA7_FLAG
#endif
#else #else
...@@ -288,6 +294,7 @@ extern enum cmodel sparc_cmodel; ...@@ -288,6 +294,7 @@ extern enum cmodel sparc_cmodel;
%{mcpu=niagara2:-D__sparc_v9__} \ %{mcpu=niagara2:-D__sparc_v9__} \
%{mcpu=niagara3:-D__sparc_v9__} \ %{mcpu=niagara3:-D__sparc_v9__} \
%{mcpu=niagara4:-D__sparc_v9__} \ %{mcpu=niagara4:-D__sparc_v9__} \
%{mcpu=niagara7:-D__sparc_v9__} \
%{!mcpu*:%(cpp_cpu_default)} \ %{!mcpu*:%(cpp_cpu_default)} \
" "
#define CPP_ARCH32_SPEC "" #define CPP_ARCH32_SPEC ""
...@@ -339,6 +346,7 @@ extern enum cmodel sparc_cmodel; ...@@ -339,6 +346,7 @@ extern enum cmodel sparc_cmodel;
%{mcpu=niagara2:%{!mv8plus:-Av9b}} \ %{mcpu=niagara2:%{!mv8plus:-Av9b}} \
%{mcpu=niagara3:%{!mv8plus:-Av9" AS_NIAGARA3_FLAG "}} \ %{mcpu=niagara3:%{!mv8plus:-Av9" AS_NIAGARA3_FLAG "}} \
%{mcpu=niagara4:%{!mv8plus:" AS_NIAGARA4_FLAG "}} \ %{mcpu=niagara4:%{!mv8plus:" AS_NIAGARA4_FLAG "}} \
%{mcpu=niagara7:%{!mv8plus:" AS_NIAGARA7_FLAG "}} \
%{!mcpu*:%(asm_cpu_default)} \ %{!mcpu*:%(asm_cpu_default)} \
" "
...@@ -1777,6 +1785,12 @@ extern int sparc_indent_opcode; ...@@ -1777,6 +1785,12 @@ extern int sparc_indent_opcode;
#define AS_NIAGARA4_FLAG "-Av9" AS_NIAGARA3_FLAG #define AS_NIAGARA4_FLAG "-Av9" AS_NIAGARA3_FLAG
#endif #endif
#ifdef HAVE_AS_SPARC5_VIS4
#define AS_NIAGARA7_FLAG "-xarch=sparc5"
#else
#define AS_NIAGARA7_FLAG AS_NIAGARA4_FLAG
#endif
#ifdef HAVE_AS_LEON #ifdef HAVE_AS_LEON
#define AS_LEON_FLAG "-Aleon" #define AS_LEON_FLAG "-Aleon"
#define AS_LEONV7_FLAG "-Aleon" #define AS_LEONV7_FLAG "-Aleon"
......
...@@ -73,6 +73,10 @@ mvis3 ...@@ -73,6 +73,10 @@ mvis3
Target Report Mask(VIS3) Target Report Mask(VIS3)
Use UltraSPARC Visual Instruction Set version 3.0 extensions. Use UltraSPARC Visual Instruction Set version 3.0 extensions.
mvis4
Target Report Mask(VIS4)
Use UltraSPARC Visual Instruction Set version 4.0 extensions.
mcbcond mcbcond
Target Report Mask(CBCOND) Target Report Mask(CBCOND)
Use UltraSPARC Compare-and-Branch extensions. Use UltraSPARC Compare-and-Branch extensions.
...@@ -194,6 +198,9 @@ Enum(sparc_processor_type) String(niagara3) Value(PROCESSOR_NIAGARA3) ...@@ -194,6 +198,9 @@ Enum(sparc_processor_type) String(niagara3) Value(PROCESSOR_NIAGARA3)
EnumValue EnumValue
Enum(sparc_processor_type) String(niagara4) Value(PROCESSOR_NIAGARA4) Enum(sparc_processor_type) String(niagara4) Value(PROCESSOR_NIAGARA4)
EnumValue
Enum(sparc_processor_type) String(niagara7) Value(PROCESSOR_NIAGARA7)
mcmodel= mcmodel=
Target RejectNegative Joined Var(sparc_cmodel_string) Target RejectNegative Joined Var(sparc_cmodel_string)
Use given SPARC-V9 code model. Use given SPARC-V9 code model.
......
...@@ -704,6 +704,192 @@ __vis_xmulxhi (__i64 __A, __i64 __B) ...@@ -704,6 +704,192 @@ __vis_xmulxhi (__i64 __A, __i64 __B)
#endif /* __VIS__ >= 0x300 */ #endif /* __VIS__ >= 0x300 */
#if __VIS__ >= 0x400
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpadd8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpadd8 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpadds8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpadds8 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpaddus8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpaddus8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpaddus16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpaddus16 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmple8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpcmple8 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmpgt8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpcmpgt8 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmpule16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpcmpule16 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmpugt16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpcmpugt16 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmpule32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpcmpule32 (__A, __B);
}
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpcmpugt32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpcmpugt32 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmax8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpmax8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmax16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpmax16 (__A, __B);
}
extern __inline __v2si
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmax32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpmax32 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmaxu8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpmaxu8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmaxu16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpmaxu16 (__A, __B);
}
extern __inline __v2si
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmaxu32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpmaxu32 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmin8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpmin8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmin16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpmin16 (__A, __B);
}
extern __inline __v2si
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpmin32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpmin32 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpminu8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpminu8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpminu16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpminu16 (__A, __B);
}
extern __inline __v2si
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpminu32 (__v2si __A, __v2si __B)
{
return __builtin_vis_fpminu32 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpsub8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpsub8 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpsubs8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpsubs8 (__A, __B);
}
extern __inline __v8qi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpsubus8 (__v8qi __A, __v8qi __B)
{
return __builtin_vis_fpsubus8 (__A, __B);
}
extern __inline __v4hi
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__vis_fpsubus16 (__v4hi __A, __v4hi __B)
{
return __builtin_vis_fpsubus16 (__A, __B);
}
#endif /* __VIS__ >= 0x400 */
#endif /* __VIS__ */ #endif /* __VIS__ */
#endif /* _VISINTRIN_H_INCLUDED */ #endif /* _VISINTRIN_H_INCLUDED */
...@@ -25124,6 +25124,42 @@ $as_echo "#define HAVE_AS_SPARC4 1" >>confdefs.h ...@@ -25124,6 +25124,42 @@ $as_echo "#define HAVE_AS_SPARC4 1" >>confdefs.h
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for SPARC5 and VIS 4.0 instructions" >&5
$as_echo_n "checking assembler for SPARC5 and VIS 4.0 instructions... " >&6; }
if test "${gcc_cv_as_sparc_sparc5+set}" = set; then :
$as_echo_n "(cached) " >&6
else
gcc_cv_as_sparc_sparc5=no
if test x$gcc_cv_as != x; then
$as_echo '.text
.register %g2, #scratch
.register %g3, #scratch
.align 4
subxc %g1, %g2, %g3
fpadd8 %f0, %f2, %f4' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -xarch=sparc5 -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }
then
gcc_cv_as_sparc_sparc5=yes
else
echo "configure: failed program was" >&5
cat conftest.s >&5
fi
rm -f conftest.o conftest.s
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_sparc_sparc5" >&5
$as_echo "$gcc_cv_as_sparc_sparc5" >&6; }
if test $gcc_cv_as_sparc_sparc5 = yes; then
$as_echo "#define HAVE_AS_SPARC5_VIS4 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for LEON instructions" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for LEON instructions" >&5
$as_echo_n "checking assembler for LEON instructions... " >&6; } $as_echo_n "checking assembler for LEON instructions... " >&6; }
if test "${gcc_cv_as_sparc_leon+set}" = set; then : if test "${gcc_cv_as_sparc_leon+set}" = set; then :
......
...@@ -3928,6 +3928,18 @@ foo: ...@@ -3928,6 +3928,18 @@ foo:
[AC_DEFINE(HAVE_AS_SPARC4, 1, [AC_DEFINE(HAVE_AS_SPARC4, 1,
[Define if your assembler supports SPARC4 instructions.])]) [Define if your assembler supports SPARC4 instructions.])])
gcc_GAS_CHECK_FEATURE([SPARC5 and VIS 4.0 instructions],
gcc_cv_as_sparc_sparc5,,
[-xarch=sparc5],
[.text
.register %g2, #scratch
.register %g3, #scratch
.align 4
subxc %g1, %g2, %g3
fpadd8 %f0, %f2, %f4],,
[AC_DEFINE(HAVE_AS_SPARC5_VIS4, 1,
[Define if your assembler supports SPARC5 and VIS 4.0 instructions.])])
gcc_GAS_CHECK_FEATURE([LEON instructions], gcc_GAS_CHECK_FEATURE([LEON instructions],
gcc_cv_as_sparc_leon,, gcc_cv_as_sparc_leon,,
[-Aleon], [-Aleon],
......
...@@ -18163,6 +18163,45 @@ int64_t __builtin_vis_xmulx (int64_t, int64_t); ...@@ -18163,6 +18163,45 @@ int64_t __builtin_vis_xmulx (int64_t, int64_t);
int64_t __builtin_vis_xmulxhi (int64_t, int64_t); int64_t __builtin_vis_xmulxhi (int64_t, int64_t);
@end smallexample @end smallexample
When you use the @option{-mvis4} switch, the VIS version 4.0 built-in
functions also become available:
@smallexample
v8qi __builtin_vis_fpadd8 (v8qi, v8qi);
v8qi __builtin_vis_fpadds8 (v8qi, v8qi);
v8qi __builtin_vis_fpaddus8 (v8qi, v8qi);
v4hi __builtin_vis_fpaddus16 (v4hi, v4hi);
v8qi __builtin_vis_fpsub8 (v8qi, v8qi);
v8qi __builtin_vis_fpsubs8 (v8qi, v8qi);
v8qi __builtin_vis_fpsubus8 (v8qi, v8qi);
v4hi __builtin_vis_fpsubus16 (v4hi, v4hi);
long __builtin_vis_fpcmple8 (v8qi, v8qi);
long __builtin_vis_fpcmpgt8 (v8qi, v8qi);
long __builtin_vis_fpcmpule16 (v4hi, v4hi);
long __builtin_vis_fpcmpugt16 (v4hi, v4hi);
long __builtin_vis_fpcmpule32 (v2si, v2si);
long __builtin_vis_fpcmpugt32 (v2si, v2si);
v8qi __builtin_vis_fpmax8 (v8qi, v8qi);
v4hi __builtin_vis_fpmax16 (v4hi, v4hi);
v2si __builtin_vis_fpmax32 (v2si, v2si);
v8qi __builtin_vis_fpmaxu8 (v8qi, v8qi);
v4hi __builtin_vis_fpmaxu16 (v4hi, v4hi);
v2si __builtin_vis_fpmaxu32 (v2si, v2si);
v8qi __builtin_vis_fpmin8 (v8qi, v8qi);
v4hi __builtin_vis_fpmin16 (v4hi, v4hi);
v2si __builtin_vis_fpmin32 (v2si, v2si);
v8qi __builtin_vis_fpminu8 (v8qi, v8qi);
v4hi __builtin_vis_fpminu16 (v4hi, v4hi);
v2si __builtin_vis_fpminu32 (v2si, v2si);
@end smallexample
@node SPU Built-in Functions @node SPU Built-in Functions
@subsection SPU Built-in Functions @subsection SPU Built-in Functions
......
...@@ -22197,7 +22197,7 @@ for machine type @var{cpu_type}. Supported values for @var{cpu_type} are ...@@ -22197,7 +22197,7 @@ for machine type @var{cpu_type}. Supported values for @var{cpu_type} are
@samp{leon}, @samp{leon3}, @samp{leon3v7}, @samp{sparclite}, @samp{f930}, @samp{leon}, @samp{leon3}, @samp{leon3v7}, @samp{sparclite}, @samp{f930},
@samp{f934}, @samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9}, @samp{f934}, @samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9},
@samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2}, @samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
@samp{niagara3} and @samp{niagara4}. @samp{niagara3}, @samp{niagara4} and @samp{niagara7}.
Native Solaris and GNU/Linux toolchains also support the value @samp{native}, Native Solaris and GNU/Linux toolchains also support the value @samp{native},
which selects the best architecture option for the host processor. which selects the best architecture option for the host processor.
...@@ -22225,7 +22225,7 @@ f930, f934, sparclite86x ...@@ -22225,7 +22225,7 @@ f930, f934, sparclite86x
tsc701 tsc701
@item v9 @item v9
ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4 ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4, niagara7
@end table @end table
By default (unless configured otherwise), GCC generates code for the V7 By default (unless configured otherwise), GCC generates code for the V7
...@@ -22267,7 +22267,9 @@ Sun UltraSPARC T1 chips. With @option{-mcpu=niagara2}, the compiler ...@@ -22267,7 +22267,9 @@ Sun UltraSPARC T1 chips. With @option{-mcpu=niagara2}, the compiler
additionally optimizes it for Sun UltraSPARC T2 chips. With additionally optimizes it for Sun UltraSPARC T2 chips. With
@option{-mcpu=niagara3}, the compiler additionally optimizes it for Sun @option{-mcpu=niagara3}, the compiler additionally optimizes it for Sun
UltraSPARC T3 chips. With @option{-mcpu=niagara4}, the compiler UltraSPARC T3 chips. With @option{-mcpu=niagara4}, the compiler
additionally optimizes it for Sun UltraSPARC T4 chips. additionally optimizes it for Sun UltraSPARC T4 chips. With
@option{-mcpu=niagara7}, the compiler additionally optimizes it for
Oracle SPARC M7 chips.
@item -mtune=@var{cpu_type} @item -mtune=@var{cpu_type}
@opindex mtune @opindex mtune
...@@ -22277,12 +22279,13 @@ option @option{-mcpu=@var{cpu_type}} does. ...@@ -22277,12 +22279,13 @@ option @option{-mcpu=@var{cpu_type}} does.
The same values for @option{-mcpu=@var{cpu_type}} can be used for The same values for @option{-mcpu=@var{cpu_type}} can be used for
@option{-mtune=@var{cpu_type}}, but the only useful values are those @option{-mtune=@var{cpu_type}}, but the only useful values are those
that select a particular CPU implementation. Those are @samp{cypress}, that select a particular CPU implementation. Those are
@samp{supersparc}, @samp{hypersparc}, @samp{leon}, @samp{leon3}, @samp{cypress}, @samp{supersparc}, @samp{hypersparc}, @samp{leon},
@samp{leon3v7}, @samp{f930}, @samp{f934}, @samp{sparclite86x}, @samp{tsc701}, @samp{leon3}, @samp{leon3v7}, @samp{f930}, @samp{f934},
@samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2}, @samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc},
@samp{niagara3} and @samp{niagara4}. With native Solaris and GNU/Linux @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2}, @samp{niagara3},
toolchains, @samp{native} can also be used. @samp{niagara4} and @samp{niagara7}. With native Solaris and
GNU/Linux toolchains, @samp{native} can also be used.
@item -mv8plus @item -mv8plus
@itemx -mno-v8plus @itemx -mno-v8plus
...@@ -22320,6 +22323,16 @@ default is @option{-mvis3} when targeting a cpu that supports such ...@@ -22320,6 +22323,16 @@ default is @option{-mvis3} when targeting a cpu that supports such
instructions, such as niagara-3 and later. Setting @option{-mvis3} instructions, such as niagara-3 and later. Setting @option{-mvis3}
also sets @option{-mvis2} and @option{-mvis}. also sets @option{-mvis2} and @option{-mvis}.
@item -mvis4
@itemx -mno-vis4
@opindex mvis4
@opindex mno-vis4
With @option{-mvis4}, GCC generates code that takes advantage of
version 4.0 of the UltraSPARC Visual Instruction Set extensions. The
default is @option{-mvis4} when targeting a cpu that supports such
instructions, such as niagara-7 and later. Setting @option{-mvis4}
also sets @option{-mvis3}, @option{-mvis2} and @option{-mvis}.
@item -mcbcond @item -mcbcond
@itemx -mno-cbcond @itemx -mno-cbcond
@opindex mcbcond @opindex mcbcond
......
2016-06-06 Jose E. Marchesi <jose.marchesi@oracle.com>
* gcc.target/sparc/vis4misc.c: New file.
* gcc.target/sparc/fpcmp.c: Likewise.
* gcc.target/sparc/fpcmpu.c: Likewise.
2016-06-06 Alan Hayward <alan.hayward@arm.com> 2016-06-06 Alan Hayward <alan.hayward@arm.com>
* gcc.dg/vect/vect-live-1.c: Use additional-options. * gcc.dg/vect/vect-live-1.c: Use additional-options.
......
/* { dg-do compile } */
/* { dg-options "-mvis4" } */
typedef unsigned char vec8 __attribute__((vector_size(8)));
long test_fpcmple8 (vec8 a, vec8 b)
{
return __builtin_vis_fpcmple8 (a, b);
}
long test_fpcmpgt8 (vec8 a, vec8 b)
{
return __builtin_vis_fpcmpgt8 (a, b);
}
/* { dg-final { scan-assembler "fpcmple8\t%" } } */
/* { dg-final { scan-assembler "fpcmpgt8\t%" } } */
/* { dg-do compile } */
/* { dg-options "-mvis4" } */
typedef short vec16 __attribute__((vector_size(8)));
typedef int vec32 __attribute__((vector_size(8)));
long test_fpcmpule16 (vec16 a, vec16 b)
{
return __builtin_vis_fpcmpule16 (a, b);
}
long test_fpcmpugt16 (vec16 a, vec16 b)
{
return __builtin_vis_fpcmpugt16 (a, b);
}
long test_fpcmpule32 (vec32 a, vec32 b)
{
return __builtin_vis_fpcmpule32 (a, b);
}
long test_fpcmpugt32 (vec32 a, vec32 b)
{
return __builtin_vis_fpcmpugt32 (a, b);
}
/* { dg-final { scan-assembler "fpcmpule16\t%" } } */
/* { dg-final { scan-assembler "fpcmpugt16\t%" } } */
/* { dg-final { scan-assembler "fpcmpule32\t%" } } */
/* { dg-final { scan-assembler "fpcmpugt32\t%" } } */
/* { dg-do compile } */
/* { dg-options "-mvis4" } */
typedef int __v2si __attribute__((vector_size(8)));
typedef short __v4hi __attribute__((vector_size(8)));
typedef unsigned char __v8qi __attribute__((vector_size(8)));
__v8qi test_fpadd8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpadd8 (x, y);
}
__v8qi test_fpadds8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpadds8 (x, y);
}
__v8qi test_fpaddus8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpaddus8 (x, y);
}
__v4hi test_fpaddus16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpaddus16 (x, y);
}
__v8qi test_fpsub8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpsub8 (x, y);
}
__v8qi test_fpsubs8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpsubs8 (x, y);
}
__v8qi test_fpsubus8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpsubus8 (x, y);
}
__v4hi test_fpsubus16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpsubus16 (x, y);
}
__v8qi test_fpmax8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpmax8 (x, y);
}
__v4hi test_fpmax16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpmax16 (x, y);
}
__v2si test_fpmax32 (__v2si x, __v2si y)
{
return __builtin_vis_fpmax32 (x, y);
}
__v8qi test_fpmaxu8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpmaxu8 (x, y);
}
__v4hi test_fpmaxu16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpmaxu16 (x, y);
}
__v2si test_fpmaxu32 (__v2si x, __v2si y)
{
return __builtin_vis_fpmaxu32 (x, y);
}
__v8qi test_fpmin8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpmin8 (x, y);
}
__v4hi test_fpmin16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpmin16 (x, y);
}
__v2si test_fpmin32 (__v2si x, __v2si y)
{
return __builtin_vis_fpmin32 (x, y);
}
__v8qi test_fpminu8 (__v8qi x, __v8qi y)
{
return __builtin_vis_fpminu8 (x, y);
}
__v4hi test_fpminu16 (__v4hi x, __v4hi y)
{
return __builtin_vis_fpminu16 (x, y);
}
__v2si test_fpminu32 (__v2si x, __v2si y)
{
return __builtin_vis_fpminu32 (x, y);
}
/* { dg-final { scan-assembler "fpadd8\t%" } } */
/* { dg-final { scan-assembler "fpadds8\t%" } } */
/* { dg-final { scan-assembler "fpaddus8\t%" } } */
/* { dg-final { scan-assembler "fpaddus16\t%" } } */
/* { dg-final { scan-assembler "fpsub8\t%" } } */
/* { dg-final { scan-assembler "fpsubs8\t%" } } */
/* { dg-final { scan-assembler "fpsubus8\t%" } } */
/* { dg-final { scan-assembler "fpsubus16\t%" } } */
/* { dg-final { scan-assembler "fpmax8\t%" } } */
/* { dg-final { scan-assembler "fpmax16\t%" } } */
/* { dg-final { scan-assembler "fpmax32\t%" } } */
/* { dg-final { scan-assembler "fpmaxu8\t%" } } */
/* { dg-final { scan-assembler "fpmaxu16\t%" } } */
/* { dg-final { scan-assembler "fpmaxu32\t%" } } */
/* { dg-final { scan-assembler "fpmin8\t%" } } */
/* { dg-final { scan-assembler "fpmin16\t%" } } */
/* { dg-final { scan-assembler "fpmin32\t%" } } */
/* { dg-final { scan-assembler "fpminu8\t%" } } */
/* { dg-final { scan-assembler "fpminu16\t%" } } */
/* { dg-final { scan-assembler "fpminu32\t%" } } */
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