diff options
Diffstat (limited to 'gcc/config/sparc/sparc.md')
-rw-r--r-- | gcc/config/sparc/sparc.md | 164 |
1 files changed, 144 insertions, 20 deletions
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index 56d4f63017..29e4966fcc 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -234,7 +234,8 @@ niagara, niagara2, niagara3, - niagara4" + niagara4, + niagara7" (const (symbol_ref "sparc_cpu_attr"))) ;; Attribute for the instruction set. @@ -247,7 +248,7 @@ (symbol_ref "TARGET_SPARCLET") (const_string "sparclet")] (const_string "v7")))) -(define_attr "cpu_feature" "none,fpu,fpunotv9,v9,vis,vis3" (const_string "none")) +(define_attr "cpu_feature" "none,fpu,fpunotv9,v9,vis,vis3,vis4" (const_string "none")) (define_attr "enabled" "" (cond [(eq_attr "cpu_feature" "none") (const_int 1) @@ -255,7 +256,8 @@ (eq_attr "cpu_feature" "fpunotv9") (symbol_ref "TARGET_FPU && ! TARGET_V9") (eq_attr "cpu_feature" "v9") (symbol_ref "TARGET_V9") (eq_attr "cpu_feature" "vis") (symbol_ref "TARGET_VIS") - (eq_attr "cpu_feature" "vis3") (symbol_ref "TARGET_VIS3")] + (eq_attr "cpu_feature" "vis3") (symbol_ref "TARGET_VIS3") + (eq_attr "cpu_feature" "vis4") (symbol_ref "TARGET_VIS4")] (const_int 0))) ;; Insn type. @@ -274,7 +276,7 @@ fga,visl,vismv,fgm_pack,fgm_mul,pdist,pdistn,edge,edgen,gsr,array, cmove, ialuX, - multi,savew,flushw,iflush,trap" + multi,savew,flushw,iflush,trap,lzd" (const_string "ialu")) ;; True if branch/call has empty delay slot and will emit a nop in it @@ -476,6 +478,10 @@ (const_string "true") ] (const_string "false"))) +;; True if the instruction executes in the V3 pipeline, in M7 and +;; later processors. +(define_attr "v3pipe" "false,true" (const_string "false")) + (define_delay (eq_attr "type" "call") [(eq_attr "in_call_delay" "true") (nil) (nil)]) @@ -504,6 +510,7 @@ (include "niagara.md") (include "niagara2.md") (include "niagara4.md") +(include "niagara7.md") ;; Operand and operator predicates and constraints @@ -1457,6 +1464,7 @@ fzeros\t%0 fones\t%0" [(set_attr "type" "*,*,load,store,vismv,vismv,fpmove,fpload,fpstore,visl,visl") + (set_attr "v3pipe" "*,*,*,*,true,true,*,*,*,true,true") (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")]) (define_insn "*movsi_lo_sum" @@ -1622,6 +1630,7 @@ fzero\t%0 fone\t%0" [(set_attr "type" "store,store,store,load,*,*,*,*,fpstore,fpload,*,*,fpmove,*,*,*,fpload,fpstore,visl,visl") + (set_attr "v3pipe" "false, false, false, false,false,false,false,false,false,false,false,false,false,false,false,false,false,false, true, true") (set_attr "length" "*,2,*,*,2,2,2,2,*,*,2,2,*,2,2,2,*,*,*,*") (set_attr "fptype" "*,*,*,*,*,*,*,*,*,*,*,*,double,*,*,*,*,*,double,double") (set_attr "cpu_feature" "v9,*,*,*,*,*,*,*,fpu,fpu,fpu,fpu,v9,fpunotv9,vis3,vis3,fpu,fpu,vis,vis")]) @@ -1645,6 +1654,7 @@ fzero\t%0 fone\t%0" [(set_attr "type" "*,*,load,store,vismv,vismv,fpmove,fpload,fpstore,visl,visl") + (set_attr "v3pipe" "*, *, *, *, *, *, *, *, *, true, true") (set_attr "fptype" "*,*,*,*,*,*,double,*,*,double,double") (set_attr "cpu_feature" "*,*,*,*,vis3,vis3,*,*,*,vis,vis")]) @@ -2208,6 +2218,7 @@ } } [(set_attr "type" "visl,visl,fpmove,*,*,*,vismv,vismv,fpload,load,fpstore,store") + (set_attr "v3pipe" "true, true, *, *, *, *, true, true, *, *, *, *") (set_attr "cpu_feature" "vis,vis,fpu,*,*,*,vis3,vis3,fpu,*,fpu,*")]) ;; The following 3 patterns build SFmode constants in integer registers. @@ -2276,6 +2287,7 @@ # #" [(set_attr "type" "visl,visl,fpmove,*,*,*,fpload,store,fpstore,load,store,*,*,*,*") + (set_attr "v3pipe" "true, true, *, *, *, *, *, *, *, *, *, *, *, *, *") (set_attr "length" "*,*,*,2,2,2,*,*,*,*,*,2,2,2,2") (set_attr "fptype" "double,double,double,*,*,*,*,*,*,*,*,*,*,*,*") (set_attr "cpu_feature" "vis,vis,v9,fpunotv9,vis3,vis3,fpu,v9,fpu,*,*,fpu,*,*,fpu")]) @@ -2299,6 +2311,7 @@ stx\t%r1, %0 #" [(set_attr "type" "visl,visl,fpmove,vismv,vismv,load,store,*,load,store,*") + (set_attr "v3pipe" "true, true, *, *, *, *, *, *, *, *, *") (set_attr "length" "*,*,*,*,*,*,*,*,*,*,2") (set_attr "fptype" "double,double,double,double,double,*,*,*,*,*,*") (set_attr "cpu_feature" "vis,vis,fpu,vis3,vis3,fpu,fpu,*,*,*,*")]) @@ -2980,6 +2993,7 @@ lduw\t%1, %0 movstouw\t%1, %0" [(set_attr "type" "shift,load,*") + (set_attr "v3pipe" "*,*,true") (set_attr "cpu_feature" "*,*,vis3")]) (define_insn_and_split "*zero_extendsidi2_insn_sp32" @@ -3294,6 +3308,7 @@ ldsw\t%1, %0 movstosw\t%1, %0" [(set_attr "type" "shift,sload,*") + (set_attr "v3pipe" "*,*,true") (set_attr "us3load_type" "*,3cycle,*") (set_attr "cpu_feature" "*,*,vis3")]) @@ -6770,7 +6785,8 @@ [(set (match_operand:DI 0 "register_operand" "=r") (clz:DI (match_operand:DI 1 "register_operand" "r")))] "TARGET_VIS3 && TARGET_ARCH64" - "lzd\t%1, %0") + "lzd\t%1, %0" + [(set_attr "type" "lzd")]) (define_insn "clzdi_v8plus" [(set (match_operand:DI 0 "register_operand" "=r") @@ -6811,7 +6827,8 @@ (truncate:SI (clz:DI (match_operand:DI 1 "register_operand" "r"))))] "TARGET_VIS3 && TARGET_ARCH64" - "lzd\t%1, %0") + "lzd\t%1, %0" + [(set_attr "type" "lzd")]) (define_insn "clzsi_v8plus" [(set (match_operand:SI 0 "register_operand" "=r") @@ -7777,7 +7794,7 @@ (define_mode_iterator VM64 [V1DI V2SI V4HI V8QI]) (define_mode_iterator VMALL [V1SI V2HI V4QI V1DI V2SI V4HI V8QI]) -(define_mode_attr vbits [(V2SI "32") (V4HI "16") (V1SI "32s") (V2HI "16s")]) +(define_mode_attr vbits [(V2SI "32") (V4HI "16") (V1SI "32s") (V2HI "16s") (V8QI "8")]) (define_mode_attr vconstr [(V1SI "f") (V2HI "f") (V4QI "f") (V1DI "e") (V2SI "e") (V4HI "e") (V8QI "e")]) (define_mode_attr vfptype [(V1SI "single") (V2HI "single") (V4QI "single") @@ -7812,6 +7829,7 @@ movstouw\t%1, %0 movwtos\t%1, %0" [(set_attr "type" "visl,visl,vismv,fpload,fpstore,store,load,store,*,vismv,vismv") + (set_attr "v3pipe" "true,true,true,false,false,false,false,false,false,true,true") (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,*,vis3,vis3")]) (define_insn "*mov<VM64:mode>_insn_sp64" @@ -7834,6 +7852,7 @@ movxtod\t%1, %0 mov\t%1, %0" [(set_attr "type" "visl,visl,vismv,fpload,fpstore,store,load,store,vismv,vismv,*") + (set_attr "v3pipe" "true, true, true, false, false, false, false, false, false, false, false") (set_attr "cpu_feature" "vis,vis,vis,*,*,*,*,*,vis3,vis3,*")]) (define_insn "*mov<VM64:mode>_insn_sp32" @@ -7857,6 +7876,7 @@ # #" [(set_attr "type" "visl,visl,vismv,*,*,fpload,fpstore,store,load,store,*,*") + (set_attr "v3pipe" "true, true, true, false, false, false, false, false, false, false, false, false") (set_attr "length" "*,*,*,2,2,*,*,*,*,*,2,2") (set_attr "cpu_feature" "vis,vis,vis,vis3,vis3,*,*,*,*,*,*,*")]) @@ -7936,7 +7956,8 @@ "TARGET_VIS" "fp<plusminus_insn><vbits>\t%1, %2, %0" [(set_attr "type" "fga") - (set_attr "fptype" "<vfptype>")]) + (set_attr "fptype" "<vfptype>") + (set_attr "v3pipe" "true")]) (define_mode_iterator VL [V1SI V2HI V4QI V1DI V2SI V4HI V8QI]) (define_mode_attr vlsuf [(V1SI "s") (V2HI "s") (V4QI "s") @@ -7952,6 +7973,7 @@ "TARGET_VIS" "f<vlinsn><vlsuf>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) (define_insn "*not_<code><mode>3" @@ -7961,6 +7983,7 @@ "TARGET_VIS" "f<vlninsn><vlsuf>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) ;; (ior (not (op1)) (not (op2))) is the canonical form of NAND. @@ -7971,6 +7994,7 @@ "TARGET_VIS" "fnand<vlsuf>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) (define_code_iterator vlnotop [ior and]) @@ -7982,6 +8006,7 @@ "TARGET_VIS" "f<vlinsn>not1<vlsuf>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) (define_insn "*<code>_not2<mode>_vis" @@ -7991,6 +8016,7 @@ "TARGET_VIS" "f<vlinsn>not2<vlsuf>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) (define_insn "one_cmpl<mode>2" @@ -7999,6 +8025,7 @@ "TARGET_VIS" "fnot1<vlsuf>\t%1, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") (set_attr "fptype" "<vfptype>")]) ;; Hard to generate VIS instructions. We have builtins for these. @@ -8225,7 +8252,8 @@ "TARGET_VIS" "faligndata\t%1, %2, %0" [(set_attr "type" "fga") - (set_attr "fptype" "double")]) + (set_attr "fptype" "double") + (set_attr "v3pipe" "true")]) (define_insn "alignaddrsi_vis" [(set (match_operand:SI 0 "register_operand" "=r") @@ -8235,7 +8263,8 @@ (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))] "TARGET_VIS" "alignaddr\t%r1, %r2, %0" - [(set_attr "type" "gsr")]) + [(set_attr "type" "gsr") + (set_attr "v3pipe" "true")]) (define_insn "alignaddrdi_vis" [(set (match_operand:DI 0 "register_operand" "=r") @@ -8245,7 +8274,8 @@ (plus:DI (match_dup 1) (match_dup 2)))] "TARGET_VIS" "alignaddr\t%r1, %r2, %0" - [(set_attr "type" "gsr")]) + [(set_attr "type" "gsr") + (set_attr "v3pipe" "true")]) (define_insn "alignaddrlsi_vis" [(set (match_operand:SI 0 "register_operand" "=r") @@ -8256,7 +8286,8 @@ (const_int 7)))] "TARGET_VIS" "alignaddrl\t%r1, %r2, %0" - [(set_attr "type" "gsr")]) + [(set_attr "type" "gsr") + (set_attr "v3pipe" "true")]) (define_insn "alignaddrldi_vis" [(set (match_operand:DI 0 "register_operand" "=r") @@ -8267,7 +8298,8 @@ (const_int 7)))] "TARGET_VIS" "alignaddrl\t%r1, %r2, %0" - [(set_attr "type" "gsr")]) + [(set_attr "type" "gsr") + (set_attr "v3pipe" "true")]) (define_insn "pdist_vis" [(set (match_operand:DI 0 "register_operand" "=e") @@ -8360,6 +8392,17 @@ "TARGET_VIS" "fcmp<code><GCM:gcm_name>\t%1, %2, %0" [(set_attr "type" "visl") + (set_attr "v3pipe" "true") + (set_attr "fptype" "double")]) + +(define_insn "fpcmp<code>8<P:mode>_vis" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e") + (match_operand:V8QI 2 "register_operand" "e"))] + UNSPEC_FCMP))] + "TARGET_VIS4" + "fpcmp<code>8\t%1, %2, %0" + [(set_attr "type" "visl") (set_attr "fptype" "double")]) (define_expand "vcond<mode><mode>" @@ -8427,7 +8470,8 @@ (plus:DI (match_dup 1) (match_dup 2)))] "TARGET_VIS2" "bmask\t%r1, %r2, %0" - [(set_attr "type" "array")]) + [(set_attr "type" "array") + (set_attr "v3pipe" "true")]) (define_insn "bmasksi_vis" [(set (match_operand:SI 0 "register_operand" "=r") @@ -8437,7 +8481,8 @@ (zero_extend:DI (plus:SI (match_dup 1) (match_dup 2))))] "TARGET_VIS2" "bmask\t%r1, %r2, %0" - [(set_attr "type" "array")]) + [(set_attr "type" "array") + (set_attr "v3pipe" "true")]) (define_insn "bshuffle<VM64:mode>_vis" [(set (match_operand:VM64 0 "register_operand" "=e") @@ -8448,7 +8493,8 @@ "TARGET_VIS2" "bshuffle\t%1, %2, %0" [(set_attr "type" "fga") - (set_attr "fptype" "double")]) + (set_attr "fptype" "double") + (set_attr "v3pipe" "true")]) ;; The rtl expanders will happily convert constant permutations on other ;; modes down to V8QI. Rely on this to avoid the complexity of the byte @@ -8550,7 +8596,8 @@ UNSPEC_CMASK8))] "TARGET_VIS3" "cmask8\t%r0" - [(set_attr "type" "fga")]) + [(set_attr "type" "fga") + (set_attr "v3pipe" "true")]) (define_insn "cmask16<P:mode>_vis" [(set (reg:DI GSR_REG) @@ -8559,7 +8606,8 @@ UNSPEC_CMASK16))] "TARGET_VIS3" "cmask16\t%r0" - [(set_attr "type" "fga")]) + [(set_attr "type" "fga") + (set_attr "v3pipe" "true")]) (define_insn "cmask32<P:mode>_vis" [(set (reg:DI GSR_REG) @@ -8568,7 +8616,8 @@ UNSPEC_CMASK32))] "TARGET_VIS3" "cmask32\t%r0" - [(set_attr "type" "fga")]) + [(set_attr "type" "fga") + (set_attr "v3pipe" "true")]) (define_insn "fchksm16_vis" [(set (match_operand:V4HI 0 "register_operand" "=e") @@ -8601,6 +8650,7 @@ "TARGET_VIS3" "pdistn\t%1, %2, %0" [(set_attr "type" "pdistn") + (set_attr "v3pipe" "true") (set_attr "fptype" "double")]) (define_insn "fmean16_vis" @@ -8628,6 +8678,14 @@ "fp<plusminus_insn>64\t%1, %2, %0" [(set_attr "type" "fga")]) +(define_insn "<plusminus_insn>v8qi3" + [(set (match_operand:V8QI 0 "register_operand" "=e") + (plusminus:V8QI (match_operand:V8QI 1 "register_operand" "e") + (match_operand:V8QI 2 "register_operand" "e")))] + "TARGET_VIS4" + "fp<plusminus_insn>8\t%1, %2, %0" + [(set_attr "type" "fga")]) + (define_mode_iterator VASS [V4HI V2SI V2HI V1SI]) (define_code_iterator vis3_addsub_ss [ss_plus ss_minus]) (define_code_attr vis3_addsub_ss_insn @@ -8641,8 +8699,63 @@ (match_operand:VASS 2 "register_operand" "<vconstr>")))] "TARGET_VIS3" "<vis3_addsub_ss_insn><vbits>\t%1, %2, %0" + [(set_attr "type" "fga") + (set_attr "v3pipe" "true")]) + +(define_mode_iterator VMMAX [V8QI V4HI V2SI]) +(define_code_iterator vis4_minmax [smin smax]) +(define_code_attr vis4_minmax_insn + [(smin "fpmin") (smax "fpmax")]) +(define_code_attr vis4_minmax_patname + [(smin "min") (smax "max")]) + +(define_insn "<vis4_minmax_patname><mode>3" + [(set (match_operand:VMMAX 0 "register_operand" "=<vconstr>") + (vis4_minmax:VMMAX (match_operand:VMMAX 1 "register_operand" "<vconstr>") + (match_operand:VMMAX 2 "register_operand" "<vconstr>")))] + "TARGET_VIS4" + "<vis4_minmax_insn><vbits>\t%1, %2, %0" + [(set_attr "type" "fga")]) + +(define_code_iterator vis4_uminmax [umin umax]) +(define_code_attr vis4_uminmax_insn + [(umin "fpminu") (umax "fpmaxu")]) +(define_code_attr vis4_uminmax_patname + [(umin "minu") (umax "maxu")]) + +(define_insn "<vis4_uminmax_patname><mode>3" + [(set (match_operand:VMMAX 0 "register_operand" "=<vconstr>") + (vis4_uminmax:VMMAX (match_operand:VMMAX 1 "register_operand" "<vconstr>") + (match_operand:VMMAX 2 "register_operand" "<vconstr>")))] + "TARGET_VIS4" + "<vis4_uminmax_insn><vbits>\t%1, %2, %0" [(set_attr "type" "fga")]) +;; The use of vis3_addsub_ss_patname in the VIS4 instruction below is +;; intended. +(define_insn "<vis3_addsub_ss_patname>v8qi3" + [(set (match_operand:V8QI 0 "register_operand" "=e") + (vis3_addsub_ss:V8QI (match_operand:V8QI 1 "register_operand" "e") + (match_operand:V8QI 2 "register_operand" "e")))] + "TARGET_VIS4" + "<vis3_addsub_ss_insn>8\t%1, %2, %0" + [(set_attr "type" "fga")]) + +(define_mode_iterator VAUS [V4HI V8QI]) +(define_code_iterator vis4_addsub_us [us_plus us_minus]) +(define_code_attr vis4_addsub_us_insn + [(us_plus "fpaddus") (us_minus "fpsubus")]) +(define_code_attr vis4_addsub_us_patname + [(us_plus "usadd") (us_minus "ussub")]) + +(define_insn "<vis4_addsub_us_patname><mode>3" + [(set (match_operand:VAUS 0 "register_operand" "=<vconstr>") + (vis4_addsub_us:VAUS (match_operand:VAUS 1 "register_operand" "<vconstr>") + (match_operand:VAUS 2 "register_operand" "<vconstr>")))] + "TARGET_VIS4" + "<vis4_addsub_us_insn><vbits>\t%1, %2, %0" + [(set_attr "type" "fga")]) + (define_insn "fucmp<code>8<P:mode>_vis" [(set (match_operand:P 0 "register_operand" "=r") (unspec:P [(gcond:V8QI (match_operand:V8QI 1 "register_operand" "e") @@ -8650,7 +8763,18 @@ UNSPEC_FUCMP))] "TARGET_VIS3" "fucmp<code>8\t%1, %2, %0" - [(set_attr "type" "visl")]) + [(set_attr "type" "visl") + (set_attr "v3pipe" "true")]) + +(define_insn "fpcmpu<code><GCM:gcm_name><P:mode>_vis" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec:P [(gcond:GCM (match_operand:GCM 1 "register_operand" "e") + (match_operand:GCM 2 "register_operand" "e"))] + UNSPEC_FUCMP))] + "TARGET_VIS4" + "fpcmpu<code><GCM:gcm_name>\t%1, %2, %0" + [(set_attr "type" "visl") + (set_attr "fptype" "double")]) (define_insn "*naddsf3" [(set (match_operand:SF 0 "register_operand" "=f") |