xref: /dflybsd-src/contrib/gcc-8.0/gcc/config/i386/geode.md (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj;; Geode Scheduling
2*38fd1498Szrj;; Copyright (C) 2006-2018 Free Software Foundation, Inc.
3*38fd1498Szrj;;
4*38fd1498Szrj;; This file is part of GCC.
5*38fd1498Szrj;;
6*38fd1498Szrj;; GCC is free software; you can redistribute it and/or modify
7*38fd1498Szrj;; it under the terms of the GNU General Public License as published by
8*38fd1498Szrj;; the Free Software Foundation; either version 3, or (at your option)
9*38fd1498Szrj;; any later version.
10*38fd1498Szrj;;
11*38fd1498Szrj;; GCC is distributed in the hope that it will be useful,
12*38fd1498Szrj;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*38fd1498Szrj;; GNU General Public License for more details.
15*38fd1498Szrj;;
16*38fd1498Szrj;; You should have received a copy of the GNU General Public License
17*38fd1498Szrj;; along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj;; <http://www.gnu.org/licenses/>.
19*38fd1498Szrj;;
20*38fd1498Szrj;; The Geode architecture is one insn issue processor.
21*38fd1498Szrj;;
22*38fd1498Szrj;; This description is based on data from the following documents:
23*38fd1498Szrj;;
24*38fd1498Szrj;;    "AMD Geode GX Processor Data Book"
25*38fd1498Szrj;;    Advanced Micro Devices, Inc., Aug 2005.
26*38fd1498Szrj;;
27*38fd1498Szrj;;    "AMD Geode LX Processor Data Book"
28*38fd1498Szrj;;    Advanced Micro Devices, Inc., Jan 2006.
29*38fd1498Szrj;;
30*38fd1498Szrj;;
31*38fd1498Szrj;; CPU execution units of the Geode:
32*38fd1498Szrj;;
33*38fd1498Szrj;; issue	describes the issue pipeline.
34*38fd1498Szrj;; alu		describes the Integer unit
35*38fd1498Szrj;; fpu		describes the FP unit
36*38fd1498Szrj;;
37*38fd1498Szrj;; The fp unit is out of order execution unit with register renaming.
38*38fd1498Szrj;; There is also memory management unit and execution pipeline for
39*38fd1498Szrj;; load/store operations.  We ignore it and difference between insns
40*38fd1498Szrj;; using memory and registers.
41*38fd1498Szrj
42*38fd1498Szrj(define_automaton "geode")
43*38fd1498Szrj
44*38fd1498Szrj(define_cpu_unit "geode_issue,geode_alu,geode_fpu" "geode")
45*38fd1498Szrj
46*38fd1498Szrj(define_insn_reservation "alu" 1
47*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
48*38fd1498Szrj			      (eq_attr "type" "alu,alu1,negnot,icmp,lea,test,imov,imovx,icmov,incdec,setcc"))
49*38fd1498Szrj			 "geode_issue,geode_alu")
50*38fd1498Szrj
51*38fd1498Szrj(define_insn_reservation "shift" 2
52*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
53*38fd1498Szrj			      (eq_attr "type" "ishift,ishift1,rotate,rotate1"))
54*38fd1498Szrj			 "geode_issue,geode_alu*2")
55*38fd1498Szrj
56*38fd1498Szrj(define_insn_reservation "imul" 7
57*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
58*38fd1498Szrj			      (eq_attr "type" "imul"))
59*38fd1498Szrj			 "geode_issue,geode_alu*7")
60*38fd1498Szrj
61*38fd1498Szrj(define_insn_reservation "idiv" 40
62*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
63*38fd1498Szrj			      (eq_attr "type" "idiv"))
64*38fd1498Szrj			 "geode_issue,geode_alu*40")
65*38fd1498Szrj
66*38fd1498Szrj;; The branch unit.
67*38fd1498Szrj(define_insn_reservation "call" 2
68*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
69*38fd1498Szrj			      (eq_attr "type" "call,callv"))
70*38fd1498Szrj			 "geode_issue,geode_alu*2")
71*38fd1498Szrj
72*38fd1498Szrj(define_insn_reservation "geode_branch" 1
73*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
74*38fd1498Szrj			      (eq_attr "type" "ibr"))
75*38fd1498Szrj			 "geode_issue,geode_alu")
76*38fd1498Szrj
77*38fd1498Szrj(define_insn_reservation "geode_pop_push" 1
78*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
79*38fd1498Szrj			      (eq_attr "type" "pop,push"))
80*38fd1498Szrj			 "geode_issue,geode_alu")
81*38fd1498Szrj
82*38fd1498Szrj(define_insn_reservation "geode_leave" 2
83*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
84*38fd1498Szrj			      (eq_attr "type" "leave"))
85*38fd1498Szrj			 "geode_issue,geode_alu*2")
86*38fd1498Szrj
87*38fd1498Szrj(define_insn_reservation "geode_load_str" 4
88*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
89*38fd1498Szrj			      (and (eq_attr "type" "str")
90*38fd1498Szrj				   (eq_attr "memory" "load,both")))
91*38fd1498Szrj			 "geode_issue,geode_alu*4")
92*38fd1498Szrj
93*38fd1498Szrj(define_insn_reservation "geode_store_str" 2
94*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
95*38fd1498Szrj			      (and (eq_attr "type" "str")
96*38fd1498Szrj				   (eq_attr "memory" "store")))
97*38fd1498Szrj			 "geode_issue,geode_alu*2")
98*38fd1498Szrj
99*38fd1498Szrj;; Be optimistic
100*38fd1498Szrj(define_insn_reservation "geode_unknown" 1
101*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
102*38fd1498Szrj			      (eq_attr "type" "multi,other"))
103*38fd1498Szrj			 "geode_issue,geode_alu")
104*38fd1498Szrj
105*38fd1498Szrj;; FPU
106*38fd1498Szrj
107*38fd1498Szrj(define_insn_reservation "geode_fop" 6
108*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
109*38fd1498Szrj			      (eq_attr "type" "fop,fcmp"))
110*38fd1498Szrj			 "geode_issue,geode_fpu*6")
111*38fd1498Szrj
112*38fd1498Szrj(define_insn_reservation "geode_fsimple" 1
113*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
114*38fd1498Szrj			      (eq_attr "type" "fmov,fcmov,fsgn,fxch"))
115*38fd1498Szrj			 "geode_issue,geode_fpu")
116*38fd1498Szrj
117*38fd1498Szrj(define_insn_reservation "geode_fist" 4
118*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
119*38fd1498Szrj			      (eq_attr "type" "fistp,fisttp"))
120*38fd1498Szrj			 "geode_issue,geode_fpu*4")
121*38fd1498Szrj
122*38fd1498Szrj(define_insn_reservation "geode_fmul" 10
123*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
124*38fd1498Szrj			      (eq_attr "type" "fmul"))
125*38fd1498Szrj			 "geode_issue,geode_fpu*10")
126*38fd1498Szrj
127*38fd1498Szrj(define_insn_reservation "geode_fdiv" 47
128*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
129*38fd1498Szrj			      (eq_attr "type" "fdiv"))
130*38fd1498Szrj			 "geode_issue,geode_fpu*47")
131*38fd1498Szrj
132*38fd1498Szrj;; We use minimal latency (fsin) here
133*38fd1498Szrj(define_insn_reservation "geode_fpspc" 54
134*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
135*38fd1498Szrj			      (eq_attr "type" "fpspc"))
136*38fd1498Szrj			 "geode_issue,geode_fpu*54")
137*38fd1498Szrj
138*38fd1498Szrj(define_insn_reservation "geode_frndint" 12
139*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
140*38fd1498Szrj			      (eq_attr "type" "frndint"))
141*38fd1498Szrj			 "geode_issue,geode_fpu*12")
142*38fd1498Szrj
143*38fd1498Szrj(define_insn_reservation "geode_mmxmov" 1
144*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
145*38fd1498Szrj			      (eq_attr "type" "mmxmov"))
146*38fd1498Szrj			 "geode_issue,geode_fpu")
147*38fd1498Szrj
148*38fd1498Szrj(define_insn_reservation "geode_mmx" 2
149*38fd1498Szrj			 (and (eq_attr "cpu" "geode")
150*38fd1498Szrj			      (eq_attr "type" "mmx,mmxadd,mmxmul,mmxcmp,mmxcvt,mmxshft"))
151*38fd1498Szrj			 "geode_issue,geode_fpu*2")
152