OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [config/] [rs6000/] [8540.md] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
;; Pipeline description for Motorola PowerPC 8540 processor.
2
;;   Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
3
;;
4
;; This file is part of GCC.
5
 
6
;; GCC is free software; you can redistribute it and/or modify it
7
;; under the terms of the GNU General Public License as published
8
;; by the Free Software Foundation; either version 3, or (at your
9
;; option) any later version.
10
 
11
;; GCC is distributed in the hope that it will be useful, but WITHOUT
12
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13
;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14
;; License for more details.
15
 
16
;; You should have received a copy of the GNU General Public License
17
;; along with GCC; see the file COPYING3.  If not see
18
;; .
19
 
20
(define_automaton "ppc8540_most,ppc8540_long,ppc8540_retire")
21
(define_cpu_unit "ppc8540_decode_0,ppc8540_decode_1" "ppc8540_most")
22
 
23
;; We don't simulate general issue queue (GIC).  If we have SU insn
24
;; and then SU1 insn, they cannot be issued on the same cycle
25
;; (although SU1 insn and then SU insn can be issued) because the SU
26
;; insn will go to SU1 from GIC0 entry.  Fortunately, the first cycle
27
;; multipass insn scheduling will find the situation and issue the SU1
28
;; insn and then the SU insn.
29
(define_cpu_unit "ppc8540_issue_0,ppc8540_issue_1"   "ppc8540_most")
30
 
31
;; We could describe completion buffers slots in combination with the
32
;; retirement units and the order of completion but the result
33
;; automaton would behave in the same way because we cannot describe
34
;; real latency time with taking in order completion into account.
35
;; Actually we could define the real latency time by querying reserved
36
;; automaton units but the current scheduler uses latency time before
37
;; issuing insns and making any reservations.
38
;;
39
;; So our description is aimed to achieve a insn schedule in which the
40
;; insns would not wait in the completion buffer.
41
(define_cpu_unit "ppc8540_retire_0,ppc8540_retire_1" "ppc8540_retire")
42
 
43
;; Branch unit:
44
(define_cpu_unit "ppc8540_bu" "ppc8540_most")
45
 
46
;; SU:
47
(define_cpu_unit "ppc8540_su0_stage0,ppc8540_su1_stage0" "ppc8540_most")
48
 
49
;; We could describe here MU subunits for float multiply, float add
50
;; etc.  But the result automaton would behave the same way as the
51
;; described one pipeline below because MU can start only one insn
52
;; per cycle.  Actually we could simplify the automaton more not
53
;; describing stages 1-3, the result automata would be the same.
54
(define_cpu_unit "ppc8540_mu_stage0,ppc8540_mu_stage1" "ppc8540_most")
55
(define_cpu_unit "ppc8540_mu_stage2,ppc8540_mu_stage3" "ppc8540_most")
56
 
57
;; The following unit is used to describe non-pipelined division.
58
(define_cpu_unit "ppc8540_mu_div" "ppc8540_long")
59
 
60
;; Here we simplified LSU unit description not describing the stages.
61
(define_cpu_unit "ppc8540_lsu" "ppc8540_most")
62
 
63
;; The following units are used to make automata deterministic
64
(define_cpu_unit "present_ppc8540_decode_0" "ppc8540_most")
65
(define_cpu_unit "present_ppc8540_issue_0" "ppc8540_most")
66
(define_cpu_unit "present_ppc8540_retire_0" "ppc8540_retire")
67
(define_cpu_unit "present_ppc8540_su0_stage0" "ppc8540_most")
68
 
69
;; The following sets to make automata deterministic when option ndfa is used.
70
(presence_set "present_ppc8540_decode_0" "ppc8540_decode_0")
71
(presence_set "present_ppc8540_issue_0" "ppc8540_issue_0")
72
(presence_set "present_ppc8540_retire_0" "ppc8540_retire_0")
73
(presence_set "present_ppc8540_su0_stage0" "ppc8540_su0_stage0")
74
 
75
;; Some useful abbreviations.
76
(define_reservation "ppc8540_decode"
77
    "ppc8540_decode_0|ppc8540_decode_1+present_ppc8540_decode_0")
78
(define_reservation "ppc8540_issue"
79
    "ppc8540_issue_0|ppc8540_issue_1+present_ppc8540_issue_0")
80
(define_reservation "ppc8540_retire"
81
   "ppc8540_retire_0|ppc8540_retire_1+present_ppc8540_retire_0")
82
(define_reservation "ppc8540_su_stage0"
83
   "ppc8540_su0_stage0|ppc8540_su1_stage0+present_ppc8540_su0_stage0")
84
 
85
;; Simple SU insns
86
(define_insn_reservation "ppc8540_su" 1
87
  (and (eq_attr "type" "integer,insert_word,cmp,compare,delayed_compare,fast_compare")
88
       (eq_attr "cpu" "ppc8540"))
89
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
90
 
91
(define_insn_reservation "ppc8540_two" 1
92
  (and (eq_attr "type" "two")
93
       (eq_attr "cpu" "ppc8540"))
94
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire,\
95
   ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
96
 
97
(define_insn_reservation "ppc8540_three" 1
98
  (and (eq_attr "type" "three")
99
       (eq_attr "cpu" "ppc8540"))
100
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire,\
101
   ppc8540_issue+ppc8540_su_stage0+ppc8540_retire,\
102
   ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
103
 
104
;; Branch.  Actually this latency time is not used by the scheduler.
105
(define_insn_reservation "ppc8540_branch" 1
106
  (and (eq_attr "type" "jmpreg,branch,isync")
107
       (eq_attr "cpu" "ppc8540"))
108
  "ppc8540_decode,ppc8540_bu,ppc8540_retire")
109
 
110
;; Multiply
111
(define_insn_reservation "ppc8540_multiply" 4
112
  (and (eq_attr "type" "imul,imul2,imul3,imul_compare")
113
       (eq_attr "cpu" "ppc8540"))
114
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0,ppc8540_mu_stage1,\
115
   ppc8540_mu_stage2,ppc8540_mu_stage3+ppc8540_retire")
116
 
117
;; Divide.  We use the average latency time here.  We omit reserving a
118
;; retire unit because of the result automata will be huge.  We ignore
119
;; reservation of miu_stage3 here because we use the average latency
120
;; time.
121
(define_insn_reservation "ppc8540_divide" 14
122
  (and (eq_attr "type" "idiv")
123
       (eq_attr "cpu" "ppc8540"))
124
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0+ppc8540_mu_div,\
125
   ppc8540_mu_div*13")
126
 
127
;; CR logical
128
(define_insn_reservation "ppc8540_cr_logical" 1
129
  (and (eq_attr "type" "cr_logical,delayed_cr")
130
       (eq_attr "cpu" "ppc8540"))
131
  "ppc8540_decode,ppc8540_bu,ppc8540_retire")
132
 
133
;; Mfcr
134
(define_insn_reservation "ppc8540_mfcr" 1
135
  (and (eq_attr "type" "mfcr")
136
       (eq_attr "cpu" "ppc8540"))
137
  "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
138
 
139
;; Mtcrf
140
(define_insn_reservation "ppc8540_mtcrf" 1
141
  (and (eq_attr "type" "mtcr")
142
       (eq_attr "cpu" "ppc8540"))
143
  "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
144
 
145
;; Mtjmpr
146
(define_insn_reservation "ppc8540_mtjmpr" 1
147
  (and (eq_attr "type" "mtjmpr,mfjmpr")
148
       (eq_attr "cpu" "ppc8540"))
149
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
150
 
151
;; Loads
152
(define_insn_reservation "ppc8540_load" 3
153
  (and (eq_attr "type" "load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u,\
154
                        load_l,sync")
155
       (eq_attr "cpu" "ppc8540"))
156
  "ppc8540_decode,ppc8540_issue+ppc8540_lsu,nothing,ppc8540_retire")
157
 
158
;; Stores.
159
(define_insn_reservation "ppc8540_store" 3
160
  (and (eq_attr "type" "store,store_ux,store_u,store_c")
161
       (eq_attr "cpu" "ppc8540"))
162
  "ppc8540_decode,ppc8540_issue+ppc8540_lsu,nothing,ppc8540_retire")
163
 
164
;; Simple FP
165
(define_insn_reservation "ppc8540_simple_float" 1
166
  (and (eq_attr "type" "fpsimple")
167
       (eq_attr "cpu" "ppc8540"))
168
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
169
 
170
;; FP
171
(define_insn_reservation "ppc8540_float" 4
172
  (and (eq_attr "type" "fp")
173
       (eq_attr "cpu" "ppc8540"))
174
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0,ppc8540_mu_stage1,\
175
   ppc8540_mu_stage2,ppc8540_mu_stage3+ppc8540_retire")
176
 
177
;; float divides.  We omit reserving a retire unit and miu_stage3
178
;; because of the result automata will be huge.
179
(define_insn_reservation "ppc8540_float_vector_divide" 29
180
  (and (eq_attr "type" "vecfdiv")
181
       (eq_attr "cpu" "ppc8540"))
182
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0+ppc8540_mu_div,\
183
   ppc8540_mu_div*28")
184
 
185
;; Brinc
186
(define_insn_reservation "ppc8540_brinc" 1
187
  (and (eq_attr "type" "brinc")
188
       (eq_attr "cpu" "ppc8540"))
189
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
190
 
191
;; Simple vector
192
(define_insn_reservation "ppc8540_simple_vector" 1
193
  (and (eq_attr "type" "vecsimple")
194
       (eq_attr "cpu" "ppc8540"))
195
  "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
196
 
197
;; Simple vector compare
198
(define_insn_reservation "ppc8540_simple_vector_compare" 1
199
  (and (eq_attr "type" "veccmpsimple")
200
       (eq_attr "cpu" "ppc8540"))
201
  "ppc8540_decode,ppc8540_issue+ppc8540_su_stage0+ppc8540_retire")
202
 
203
;; Vector compare
204
(define_insn_reservation "ppc8540_vector_compare" 1
205
  (and (eq_attr "type" "veccmp")
206
       (eq_attr "cpu" "ppc8540"))
207
  "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
208
 
209
;; evsplatfi evsplati
210
(define_insn_reservation "ppc8540_vector_perm" 1
211
  (and (eq_attr "type" "vecperm")
212
       (eq_attr "cpu" "ppc8540"))
213
  "ppc8540_decode,ppc8540_issue+ppc8540_su1_stage0+ppc8540_retire")
214
 
215
;; Vector float
216
(define_insn_reservation "ppc8540_float_vector" 4
217
  (and (eq_attr "type" "vecfloat")
218
       (eq_attr "cpu" "ppc8540"))
219
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0,ppc8540_mu_stage1,\
220
   ppc8540_mu_stage2,ppc8540_mu_stage3+ppc8540_retire")
221
 
222
;; Vector divides: Use the average.  We omit reserving a retire unit
223
;; because of the result automata will be huge.  We ignore reservation
224
;; of miu_stage3 here because we use the average latency time.
225
(define_insn_reservation "ppc8540_vector_divide" 14
226
  (and (eq_attr "type" "vecdiv")
227
       (eq_attr "cpu" "ppc8540"))
228
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0+ppc8540_mu_div,\
229
   ppc8540_mu_div*13")
230
 
231
;; Complex vector.
232
(define_insn_reservation "ppc8540_complex_vector" 4
233
  (and (eq_attr "type" "veccomplex")
234
       (eq_attr "cpu" "ppc8540"))
235
  "ppc8540_decode,ppc8540_issue+ppc8540_mu_stage0,ppc8540_mu_stage1,\
236
   ppc8540_mu_stage2,ppc8540_mu_stage3+ppc8540_retire")
237
 
238
;; Vector load
239
(define_insn_reservation "ppc8540_vector_load" 3
240
  (and (eq_attr "type" "vecload")
241
       (eq_attr "cpu" "ppc8540"))
242
  "ppc8540_decode,ppc8540_issue+ppc8540_lsu,nothing,ppc8540_retire")
243
 
244
;; Vector store
245
(define_insn_reservation "ppc8540_vector_store" 3
246
  (and (eq_attr "type" "vecstore")
247
       (eq_attr "cpu" "ppc8540"))
248
  "ppc8540_decode,ppc8540_issue+ppc8540_lsu,nothing,ppc8540_retire")

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.