*** empty log message ***
[deliverable/binutils-gdb.git] / cpu / mep-fmax.cpu
1 ; Toshiba MeP FMAX Coprocessor description. -*- Scheme -*-
2 ; Copyright 2011 Free Software Foundation, Inc.
3 ;
4 ; Contributed by Red Hat Inc;
5 ;
6 ; This file is part of the GNU Binutils.
7 ;
8 ; This program is free software; you can redistribute it and/or modify
9 ; it under the terms of the GNU General Public License as published by
10 ; the Free Software Foundation; either version 3 of the License, or
11 ; (at your option) any later version.
12 ;
13 ; This program is distributed in the hope that it will be useful,
14 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ; GNU General Public License for more details.
17 ;
18 ; You should have received a copy of the GNU General Public License
19 ; along with this program; if not, write to the Free Software
20 ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 ; MA 02110-1301, USA.
22
23 ;------------------------------------------------------------------------------
24 ; MeP-Integrator will redefine the isa pmacros below to allow the bit widths
25 ; specified below for each ME_MODULE using this coprocessor.
26 ; This coprocessor requires only the 32 bit insns in the core.
27 ;------------------------------------------------------------------------------
28 ; begin-isas
29 (define-pmacro fmax-core-isa () (ISA ext_core2))
30 (define-pmacro all-fmax-isas () (ISA ext_core2))
31 ; end-isas
32
33 ;******************************************************************************
34 ; ifields
35 ;------------------------------------------------------------------------------
36 ; opcodes
37 (dnf f-fmax-0-4 "opcode" (all-fmax-isas) 0 4)
38 (dnf f-fmax-4-4 "opcode" (all-fmax-isas) 4 4)
39 (dnf f-fmax-8-4 "opcode" (all-fmax-isas) 8 4)
40 (dnf f-fmax-12-4 "opcode" (all-fmax-isas) 12 4)
41 (dnf f-fmax-16-4 "opcode" (all-fmax-isas) 16 4)
42 (dnf f-fmax-20-4 "opcode" (all-fmax-isas) 20 4)
43 (dnf f-fmax-24-4 "opcode" (all-fmax-isas) 24 4)
44 (dnf f-fmax-28-1 "opcode" (all-fmax-isas) 28 1)
45 (dnf f-fmax-29-1 "opcode" (all-fmax-isas) 29 1)
46 (dnf f-fmax-30-1 "opcode" (all-fmax-isas) 30 1)
47 (dnf f-fmax-31-1 "opcode" (all-fmax-isas) 31 1)
48
49 ;------------------------------------------------------------------------------
50 ; FR registers
51 (define-multi-ifield
52 (name f-fmax-frd)
53 (comment "FRd register")
54 (attrs all-fmax-isas)
55 (mode UINT)
56 (subfields f-fmax-28-1 f-fmax-4-4)
57 (insert (sequence ()
58 (set (ifield f-fmax-4-4) (and (ifield f-fmax-frd) #xf))
59 (set (ifield f-fmax-28-1) (srl (ifield f-fmax-frd) 4))))
60 (extract (set (ifield f-fmax-frd)
61 (or (sll (ifield f-fmax-28-1) 4) (ifield f-fmax-4-4))))
62 )
63 (define-multi-ifield
64 (name f-fmax-frn)
65 (comment "FRn register")
66 (attrs all-fmax-isas)
67 (mode UINT)
68 (subfields f-fmax-29-1 f-fmax-20-4)
69 (insert (sequence ()
70 (set (ifield f-fmax-20-4) (and (ifield f-fmax-frn) #xf))
71 (set (ifield f-fmax-29-1) (srl (ifield f-fmax-frn) 4))))
72 (extract (set (ifield f-fmax-frn)
73 (or (sll (ifield f-fmax-29-1) 4) (ifield f-fmax-20-4))))
74 )
75 (define-multi-ifield
76 (name f-fmax-frm)
77 (comment "FRm register")
78 (attrs all-fmax-isas)
79 (mode UINT)
80 (subfields f-fmax-30-1 f-fmax-24-4)
81 (insert (sequence ()
82 (set (ifield f-fmax-24-4) (and (ifield f-fmax-frm) #xf))
83 (set (ifield f-fmax-30-1) (srl (ifield f-fmax-frm) 4))))
84 (extract (set (ifield f-fmax-frm)
85 (or (sll (ifield f-fmax-30-1) 4) (ifield f-fmax-24-4))))
86 )
87
88 ;------------------------------------------------------------------------------
89 ; Core General registers
90 (dnf f-fmax-rm "opcode" (all-fmax-isas) 8 4)
91
92 ;------------------------------------------------------------------------------
93 ; Condition opcodes enum
94 (define-normal-insn-enum fmax-cond "condition opcode enum" (all-fmax-isas) FMAX_ f-fmax-8-4
95 ("f" "u" "e" "ue" "l" "ul" "le" "ule"
96 "fi" "ui" "ei" "uei" "li" "uli" "lei" "ulei")
97 )
98
99 ;******************************************************************************
100 ; Hardware
101 ;------------------------------------------------------------------------------
102 ; FR registers
103
104 ; Given a coprocessor register number N, expand to a
105 ; name/index pair: ($frN N)
106 (define-pmacro (-fmax-fr-reg-pair n) ((.sym "fr" n) n))
107 (define-pmacro (-fmax-cr-reg-pair n) ((.sym "c" n) n))
108
109 ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor.
110 ; GDB will use the hardware table generated from this declaration. The operands use h-cr
111 ; from mep-core.cpu so that SID's semantic trace will be consistent between
112 ; the core and the coprocessor but use parse/print handlers which reference the hardware table
113 ; generated from this declarations
114 (define-hardware
115 (name h-cr-fmax)
116 (comment "Floating point registers")
117 (attrs all-fmax-isas VIRTUAL IS_FLOAT)
118 (type register SF (32))
119 (indices keyword "$"
120 (.splice (.unsplice (.map -fmax-fr-reg-pair (.iota 32)))
121 (.unsplice (.map -fmax-cr-reg-pair (.iota 32))))
122 )
123 (get (index) (c-call SF "fmax_fr_get_handler" index))
124 (set (index newval) (c-call VOID "fmax_fr_set_handler" index newval))
125 )
126
127 ;------------------------------------------------------------------------------
128 ; Control registers
129 ; NOTE: This exists solely for the purpose of providing the proper register names for this coprocessor.
130 ; GDB will use the hardware table generated from this declaration. The operands use h-ccr
131 ; from mep-core.cpu so that SID's semantic trace will be consistent between
132 ; the core and the coprocessor but use parse/print handlers which reference the hardware table
133 ; generated from this declarations
134 (define-hardware
135 (name h-ccr-fmax)
136 (comment "Coprocessor Identifier and Revision Register")
137 (attrs all-fmax-isas VIRTUAL)
138 (type register USI (16))
139 (indices keyword "$" (
140 ("cirr" 0) ("fcr0" 0) ("ccr0" 0)
141 ("cbcr" 1) ("fcr1" 1) ("ccr1" 1)
142 ("cerr" 15) ("fcr15" 15) ("ccr15" 15)
143 )
144 )
145 (set (index newval) (c-call VOID "h_ccr_set" index newval))
146 (get (index) (c-call SI "h_ccr_get" index))
147 )
148
149 ;------------------------------------------------------------------------------
150 ; Misc
151 (define-hardware
152 (name h-fmax-compare-i-p)
153 (comment "flag")
154 (attrs all-fmax-isas)
155 (type register USI)
156 )
157
158 ;******************************************************************************
159 ; Operands
160 ;------------------------------------------------------------------------------
161 ; FR Registers
162 (define-full-operand fmax-FRd "FRd" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frd ((parse "fmax_cr") (print "fmax_cr")) () ())
163 (define-full-operand fmax-FRn "FRn" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frn ((parse "fmax_cr") (print "fmax_cr")) () ())
164 (define-full-operand fmax-FRm "FRm" (all-fmax-isas (CDATA FMAX_FLOAT)) h-cr SF f-fmax-frm ((parse "fmax_cr") (print "fmax_cr")) () ())
165
166 (define-full-operand fmax-FRd-int "FRd as an integer" (all-fmax-isas (CDATA FMAX_INT)) h-cr SI f-fmax-frd ((parse "fmax_cr") (print "fmax_cr")) () ())
167 (define-full-operand fmax-FRn-int "FRn as an integer" (all-fmax-isas (CDATA FMAX_INT)) h-cr SI f-fmax-frn ((parse "fmax_cr") (print "fmax_cr")) () ())
168
169 ;------------------------------------------------------------------------------
170 ; Control registers
171 (define-full-operand fmax-CCRn "CCRn" (all-fmax-isas (CDATA REGNUM)) h-ccr DFLT f-fmax-4-4 ((parse "fmax_ccr") (print "fmax_ccr")) () ())
172
173 (dnop fmax-CIRR "CIRR" (all-fmax-isas SEM-ONLY) h-ccr 0)
174 (dnop fmax-CBCR "CBCR" (all-fmax-isas SEM-ONLY) h-ccr 1)
175 (dnop fmax-CERR "CERR" (all-fmax-isas SEM-ONLY) h-ccr 15)
176
177 ;------------------------------------------------------------------------------
178 ; Core General Registers
179 (dnop fmax-Rm "Rm" (all-fmax-isas) h-gpr f-fmax-rm)
180
181 ;------------------------------------------------------------------------------
182 ; misc
183 (dnop fmax-Compare-i-p "flag" (all-fmax-isas SEM-ONLY) h-fmax-compare-i-p f-nil)
184
185 ;******************************************************************************
186 ; Instructions
187 ;------------------------------------------------------------------------------
188 ; Binary Arithmetic
189 (define-pmacro (fmax-binary-arith op opc sem)
190 (dni op
191 (.str op " FRd,FRn,FRm")
192 (all-fmax-isas MAY_TRAP)
193 (.str op " ${fmax-FRd},${fmax-FRn},${fmax-FRm}")
194 (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7) (f-fmax-16-4 0)
195 fmax-FRn fmax-FRm (f-fmax-31-1 0))
196 sem
197 ()
198 )
199 )
200
201 (fmax-binary-arith fadds #x0 (set fmax-FRd (add fmax-FRn fmax-FRm)))
202 (fmax-binary-arith fsubs #x1 (set fmax-FRd (sub fmax-FRn fmax-FRm)))
203 (fmax-binary-arith fmuls #x2 (set fmax-FRd (mul fmax-FRn fmax-FRm)))
204 (fmax-binary-arith fdivs #x3 (set fmax-FRd (div fmax-FRn fmax-FRm)))
205
206 ;------------------------------------------------------------------------------
207 ; Unary Arithmetic
208 (define-pmacro (fmax-unary-arith op opc sem)
209 (dni op
210 (.str op " FRd,FRn")
211 (all-fmax-isas MAY_TRAP)
212 (.str op " ${fmax-FRd},${fmax-FRn}")
213 (+ (f-fmax-0-4 #xF) fmax-FRd (f-fmax-8-4 opc) (f-fmax-12-4 #x7)
214 (f-fmax-16-4 0) fmax-FRn (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0))
215 sem
216 ()
217 )
218 )
219
220 (fmax-unary-arith fsqrts #x4 (set fmax-FRd (sqrt fmax-FRn)))
221 (fmax-unary-arith fabss #x5 (set fmax-FRd (abs fmax-FRn)))
222 (fmax-unary-arith fnegs #x7 (set fmax-FRd (neg fmax-FRn)))
223 (fmax-unary-arith fmovs #x6 (set fmax-FRd fmax-FRn))
224
225 ;------------------------------------------------------------------------------
226 ; Conversions
227 (define-pmacro (fmax-conv op opc1 opc2 opnd1 opnd2 sem)
228 (dni op
229 (.str op " FRd,FRn")
230 (all-fmax-isas MAY_TRAP)
231 (.str op " ${" opnd1 "},${" opnd2 "}")
232 (+ (f-fmax-0-4 #xF) opnd1 (f-fmax-8-4 opc1) (f-fmax-12-4 #x7)
233 (f-fmax-16-4 opc2) opnd2 (f-fmax-24-4 0) (f-fmax-30-1 0) (f-fmax-31-1 0))
234 sem
235 ()
236 )
237 )
238
239 (fmax-conv froundws #xC #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_froundws" fmax-FRn)))
240 (fmax-conv ftruncws #xD #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_ftruncws" fmax-FRn)))
241 (fmax-conv fceilws #xE #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_fceilws" fmax-FRn)))
242 (fmax-conv ffloorws #xF #x0 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_ffloorws" fmax-FRn)))
243 (fmax-conv fcvtws #x4 #x1 fmax-FRd-int fmax-FRn (set fmax-FRd-int (c-call SI "fmax_fcvtws" fmax-FRn)))
244 (fmax-conv fcvtsw #x0 #x9 fmax-FRd fmax-FRn-int (set fmax-FRd (float SF FPCONV-DEFAULT fmax-FRn-int)))
245
246 ;------------------------------------------------------------------------------
247 ; Comparisons
248 ;
249 ; Comparison with no exceptions
250 (define-pmacro (fmax-f-sem x y) (andif (gt x y) (lt x y))) ; do this to get exception detection
251 (define-pmacro (fmax-u-sem x y) (not (orif (lt x y) (orif (eq x y) (gt x y)))))
252 (define-pmacro (fmax-e-sem x y) (eq x y))
253 (define-pmacro (fmax-ue-sem x y) (not (orif (lt x y) (gt x y))))
254 (define-pmacro (fmax-l-sem x y) (lt x y))
255 (define-pmacro (fmax-ul-sem x y) (not (orif (gt x y) (eq x y))))
256 (define-pmacro (fmax-le-sem x y) (orif (lt x y) (eq x y)))
257 (define-pmacro (fmax-ule-sem x y) (not (gt x y)))
258
259 (define-pmacro (fmax-comp cond suffix exceptions)
260 (dni (.sym fcmp cond suffix s)
261 (.str "fcmp" cond suffix "s FRn,FRm")
262 ;; Even though the instruction doesn't really trap if EXCEPTIONS
263 ;; is zero, we don't want gcc to put it in a repeat or erepeat
264 ;; block because of the hazards between fcmp instructions and
265 ;; anything that reads CBCR.
266 (all-fmax-isas MAY_TRAP)
267 (.str "fcmp" cond suffix "s ${fmax-FRn},${fmax-FRm}")
268 (+ (f-fmax-0-4 #xF) (f-fmax-4-4 0) (.sym FMAX_ cond suffix) (f-fmax-12-4 #x7)
269 (f-fmax-16-4 #x2) (f-fmax-28-1 0) fmax-FRn fmax-FRm (f-fmax-31-1 0))
270 (sequence ()
271 (set fmax-Compare-i-p exceptions)
272 (set fmax-CBCR ((.sym fmax- cond -sem) fmax-FRn fmax-FRm))
273 (set fmax-Compare-i-p 0)
274 )
275 ()
276 )
277 )
278
279 ; Comparison with no exceptions
280 (fmax-comp f "" 0)
281 (fmax-comp u "" 0)
282 (fmax-comp e "" 0)
283 (fmax-comp ue "" 0)
284 (fmax-comp l "" 0)
285 (fmax-comp ul "" 0)
286 (fmax-comp le "" 0)
287 (fmax-comp ule "" 0)
288
289 ; Comparison with exceptions
290 (fmax-comp f i 1)
291 (fmax-comp u i 1)
292 (fmax-comp e i 1)
293 (fmax-comp ue i 1)
294 (fmax-comp l i 1)
295 (fmax-comp ul i 1)
296 (fmax-comp le i 1)
297 (fmax-comp ule i 1)
298
299 ;------------------------------------------------------------------------------
300 ; Move to/from core registers
301 (dni cmov-frn-rm
302 "cmov FRn,Rm"
303 (all-fmax-isas (INTRINSIC "cmov1"))
304 "cmov ${fmax-FRd-int},${fmax-Rm}"
305 (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7)
306 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0)
307 (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 0))
308 (set fmax-FRd-int fmax-Rm)
309 ()
310 )
311 (dni cmov-rm-frn
312 "cmov Rm,FRn"
313 (all-fmax-isas (INTRINSIC "cmov2"))
314 "cmov ${fmax-Rm},${fmax-FRd-int}"
315 (+ (f-fmax-0-4 #xF) fmax-FRd-int fmax-Rm (f-fmax-12-4 #x7)
316 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0)
317 (f-fmax-29-1 0) (f-fmax-30-1 0) (f-fmax-31-1 1))
318 (set fmax-Rm fmax-FRd-int)
319 ()
320 )
321 (dni cmovc-ccrn-rm
322 "cmovc CCRn,Rm"
323 (all-fmax-isas (INTRINSIC "cmovc1"))
324 "cmovc ${fmax-CCRn},${fmax-Rm}"
325 (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7)
326 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0)
327 (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 0))
328 (set fmax-CCRn fmax-Rm)
329 ()
330 )
331 (dni cmovc-rm-ccrn
332 "cmovc Rm,CCRn"
333 (all-fmax-isas (INTRINSIC "cmovc2"))
334 "cmovc ${fmax-Rm},${fmax-CCRn}"
335 (+ (f-fmax-0-4 #xF) fmax-CCRn fmax-Rm (f-fmax-12-4 #x7)
336 (f-fmax-16-4 #xF) (f-fmax-20-4 0) (f-fmax-24-4 0)
337 (f-fmax-28-1 0) (f-fmax-29-1 0) (f-fmax-30-1 1) (f-fmax-31-1 1))
338 (set fmax-Rm fmax-CCRn)
339 ()
340 )
This page took 0.036683 seconds and 4 git commands to generate.