xref: /netbsd-src/external/gpl3/binutils.old/dist/cpu/sh.cpu (revision 16dce51364ebe8aeafbae46bc5aa167b8115bc45)
1*16dce513Schristos; Hitachi SH architecture description.  -*- Scheme -*-
2*16dce513Schristos;
3*16dce513Schristos; Copyright 2000, 2001, 2007, 2009 Free Software Foundation, Inc.
4*16dce513Schristos;
5*16dce513Schristos; Contributed by Red Hat Inc; developed under contract from Hitachi
6*16dce513Schristos; Semiconductor (America) Inc.
7*16dce513Schristos;
8*16dce513Schristos; This file is part of the GNU Binutils.
9*16dce513Schristos;
10*16dce513Schristos; This program is free software; you can redistribute it and/or modify
11*16dce513Schristos; it under the terms of the GNU General Public License as published by
12*16dce513Schristos; the Free Software Foundation; either version 3 of the License, or
13*16dce513Schristos; (at your option) any later version.
14*16dce513Schristos;
15*16dce513Schristos; This program is distributed in the hope that it will be useful,
16*16dce513Schristos; but WITHOUT ANY WARRANTY; without even the implied warranty of
17*16dce513Schristos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*16dce513Schristos; GNU General Public License for more details.
19*16dce513Schristos;
20*16dce513Schristos; You should have received a copy of the GNU General Public License
21*16dce513Schristos; along with this program; if not, write to the Free Software
22*16dce513Schristos; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23*16dce513Schristos; MA 02110-1301, USA.
24*16dce513Schristos
25*16dce513Schristos
26*16dce513Schristos(include "simplify.inc")
27*16dce513Schristos
28*16dce513Schristos(define-arch
29*16dce513Schristos  (name sh)
30*16dce513Schristos  (comment "Hitachi SuperH (SH)")
31*16dce513Schristos  (insn-lsb0? #t)
32*16dce513Schristos  (machs sh2 sh3 sh3e sh4 sh5)
33*16dce513Schristos  (isas compact media)
34*16dce513Schristos)
35*16dce513Schristos
36*16dce513Schristos
37*16dce513Schristos; Instruction sets.
38*16dce513Schristos
39*16dce513Schristos(define-isa
40*16dce513Schristos  (name media)
41*16dce513Schristos  (comment "SHmedia 32-bit instruction set")
42*16dce513Schristos  (base-insn-bitsize 32)
43*16dce513Schristos)
44*16dce513Schristos
45*16dce513Schristos(define-isa
46*16dce513Schristos  (name compact)
47*16dce513Schristos  (comment "SHcompact 16-bit instruction set")
48*16dce513Schristos  (base-insn-bitsize 16)
49*16dce513Schristos)
50*16dce513Schristos
51*16dce513Schristos
52*16dce513Schristos; CPU family.
53*16dce513Schristos
54*16dce513Schristos(define-cpu
55*16dce513Schristos  (name sh64)
56*16dce513Schristos  (comment "SH 64-bit family")
57*16dce513Schristos  (endian either)
58*16dce513Schristos  (word-bitsize 32)
59*16dce513Schristos)
60*16dce513Schristos
61*16dce513Schristos
62*16dce513Schristos(define-mach
63*16dce513Schristos  (name sh2)
64*16dce513Schristos  (comment "SH-2 CPU core")
65*16dce513Schristos  (cpu sh64)
66*16dce513Schristos  (isas compact)
67*16dce513Schristos)
68*16dce513Schristos
69*16dce513Schristos(define-mach
70*16dce513Schristos  (name sh3)
71*16dce513Schristos  (comment "SH-3 CPU core")
72*16dce513Schristos  (cpu sh64)
73*16dce513Schristos  (isas compact)
74*16dce513Schristos)
75*16dce513Schristos
76*16dce513Schristos(define-mach
77*16dce513Schristos  (name sh3e)
78*16dce513Schristos  (comment "SH-3e CPU core")
79*16dce513Schristos  (cpu sh64)
80*16dce513Schristos  (isas compact)
81*16dce513Schristos)
82*16dce513Schristos
83*16dce513Schristos(define-mach
84*16dce513Schristos  (name sh4)
85*16dce513Schristos  (comment "SH-4 CPU core")
86*16dce513Schristos  (cpu sh64)
87*16dce513Schristos  (isas compact)
88*16dce513Schristos)
89*16dce513Schristos
90*16dce513Schristos(define-mach
91*16dce513Schristos  (name sh5)
92*16dce513Schristos  (comment "SH-5 CPU core")
93*16dce513Schristos  (cpu sh64)
94*16dce513Schristos  (isas compact media)
95*16dce513Schristos)
96*16dce513Schristos
97*16dce513Schristos(define-model
98*16dce513Schristos  (name sh5)
99*16dce513Schristos  (comment "SH-5 reference implementation")
100*16dce513Schristos  (mach sh5)
101*16dce513Schristos  (unit u-exec "Execution unit" ()
102*16dce513Schristos	1 1 ; issue done
103*16dce513Schristos	() () () ())
104*16dce513Schristos)
105*16dce513Schristos
106*16dce513Schristos; Hardware elements.
107*16dce513Schristos
108*16dce513Schristos(define-hardware
109*16dce513Schristos  (name h-pc)
110*16dce513Schristos  (comment "Program counter")
111*16dce513Schristos  (attrs PC (ISA compact,media))
112*16dce513Schristos  (type pc UDI)
113*16dce513Schristos  (get () (raw-reg h-pc))
114*16dce513Schristos  (set (newval) (sequence ()
115*16dce513Schristos			  (set (raw-reg h-ism) (and newval 1))
116*16dce513Schristos			  (set (raw-reg h-pc) (and newval (inv UDI 1)))))
117*16dce513Schristos)
118*16dce513Schristos
119*16dce513Schristos(define-pmacro (-build-greg-name n) ((.sym r n) n))
120*16dce513Schristos
121*16dce513Schristos(define-hardware
122*16dce513Schristos  (name h-gr)
123*16dce513Schristos  (comment "General purpose integer registers")
124*16dce513Schristos  (attrs (ISA media,compact))
125*16dce513Schristos  (type register DI (64))
126*16dce513Schristos  (indices keyword "" (.map -build-greg-name (.iota 64)))
127*16dce513Schristos  (get (index)
128*16dce513Schristos       (if DI (eq index 63)
129*16dce513Schristos	   (const 0)
130*16dce513Schristos	   (raw-reg h-gr index)))
131*16dce513Schristos  (set (index newval)
132*16dce513Schristos       (if (ne index 63)
133*16dce513Schristos	   (set (raw-reg h-gr index) newval)
134*16dce513Schristos	   (nop)))
135*16dce513Schristos)
136*16dce513Schristos
137*16dce513Schristos(define-hardware
138*16dce513Schristos  (name h-grc)
139*16dce513Schristos  (comment "General purpose integer registers (SHcompact view)")
140*16dce513Schristos  (attrs VIRTUAL (ISA compact))
141*16dce513Schristos  (type register SI (16))
142*16dce513Schristos  (indices keyword "" (.map -build-greg-name (.iota 16)))
143*16dce513Schristos  (get (index)
144*16dce513Schristos	(and (raw-reg h-gr index) (zext DI #xFFFFFFFF)))
145*16dce513Schristos  (set (index newval)
146*16dce513Schristos       (set (raw-reg h-gr index) (ext DI newval)))
147*16dce513Schristos)
148*16dce513Schristos
149*16dce513Schristos(define-pmacro (-build-creg-name n) ((.sym cr n) n))
150*16dce513Schristos
151*16dce513Schristos(define-hardware
152*16dce513Schristos  (name h-cr)
153*16dce513Schristos  (comment "Control registers")
154*16dce513Schristos  (attrs (ISA media))
155*16dce513Schristos  (type register DI (64))
156*16dce513Schristos  (indices keyword "" (.map -build-creg-name (.iota 64)))
157*16dce513Schristos  (get (index)
158*16dce513Schristos       (if DI (eq index 0)
159*16dce513Schristos	   (zext DI (reg h-sr))
160*16dce513Schristos	   (raw-reg h-cr index)))
161*16dce513Schristos  (set (index newval)
162*16dce513Schristos       (if (eq index 0)
163*16dce513Schristos	   (set (reg h-sr) newval)
164*16dce513Schristos	   (set (raw-reg h-cr index) newval)))
165*16dce513Schristos)
166*16dce513Schristos
167*16dce513Schristos(define-hardware
168*16dce513Schristos  (name h-sr)
169*16dce513Schristos  (comment "Status register")
170*16dce513Schristos  (attrs (ISA compact,media))
171*16dce513Schristos  (type register SI)
172*16dce513Schristos)
173*16dce513Schristos
174*16dce513Schristos(define-hardware
175*16dce513Schristos  (name h-fpscr)
176*16dce513Schristos  (comment "Floating point status and control register")
177*16dce513Schristos  (attrs (ISA compact,media))
178*16dce513Schristos  (type register SI)
179*16dce513Schristos)
180*16dce513Schristos
181*16dce513Schristos(define-hardware
182*16dce513Schristos  (name h-frbit)
183*16dce513Schristos  (comment "Floating point register file bit")
184*16dce513Schristos  (attrs (ISA media,compact) VIRTUAL)
185*16dce513Schristos  (type register BI)
186*16dce513Schristos  (get () (and (srl (reg h-sr) 14) 1))
187*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 14))) (sll SI newvalue 14))))
188*16dce513Schristos)
189*16dce513Schristos
190*16dce513Schristos(define-hardware
191*16dce513Schristos  (name h-szbit)
192*16dce513Schristos  (comment "Floating point transfer size bit")
193*16dce513Schristos  (attrs (ISA media,compact) VIRTUAL)
194*16dce513Schristos  (type register BI)
195*16dce513Schristos  (get () (and (srl (reg h-sr) 13) 1))
196*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 13))) (sll SI newvalue 13))))
197*16dce513Schristos)
198*16dce513Schristos
199*16dce513Schristos(define-hardware
200*16dce513Schristos  (name h-prbit)
201*16dce513Schristos  (comment "Floating point precision bit")
202*16dce513Schristos  (attrs (ISA media,compact) VIRTUAL)
203*16dce513Schristos  (type register BI)
204*16dce513Schristos  (get () (and (srl (reg h-sr) 12) 1))
205*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 12))) (sll SI newvalue 12))))
206*16dce513Schristos)
207*16dce513Schristos
208*16dce513Schristos(define-hardware
209*16dce513Schristos  (name h-sbit)
210*16dce513Schristos  (comment "Multiply-accumulate saturation flag")
211*16dce513Schristos  (attrs (ISA compact) VIRTUAL)
212*16dce513Schristos  (type register BI)
213*16dce513Schristos  (get () (and (srl (reg h-sr) 1) 1))
214*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv 2)) (sll SI newvalue 1))))
215*16dce513Schristos)
216*16dce513Schristos
217*16dce513Schristos(define-hardware
218*16dce513Schristos  (name h-mbit)
219*16dce513Schristos  (comment "Divide-step M flag")
220*16dce513Schristos  (attrs (ISA compact) VIRTUAL)
221*16dce513Schristos  (type register BI)
222*16dce513Schristos  (get () (and (srl (reg h-sr) 9) 1))
223*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 9))) (sll SI newvalue 9))))
224*16dce513Schristos)
225*16dce513Schristos
226*16dce513Schristos(define-hardware
227*16dce513Schristos  (name h-qbit)
228*16dce513Schristos  (comment "Divide-step Q flag")
229*16dce513Schristos  (attrs (ISA compact) VIRTUAL)
230*16dce513Schristos  (type register BI)
231*16dce513Schristos  (get () (and (srl (reg h-sr) 8) 1))
232*16dce513Schristos  (set (newvalue) (set (reg h-sr) (or (and (reg h-sr) (inv (sll 1 8))) (sll SI newvalue 8))))
233*16dce513Schristos)
234*16dce513Schristos
235*16dce513Schristos(define-pmacro (-build-freg-name n) ((.sym fr n) n))
236*16dce513Schristos
237*16dce513Schristos(define-hardware
238*16dce513Schristos  (name h-fr)
239*16dce513Schristos  (comment "Single precision floating point registers")
240*16dce513Schristos  (attrs (ISA media,compact))
241*16dce513Schristos  (type register SF (64))
242*16dce513Schristos  (indices keyword "" (.map -build-freg-name (.iota 64)))
243*16dce513Schristos)
244*16dce513Schristos
245*16dce513Schristos
246*16dce513Schristos(define-pmacro (-build-fpair-name n) ((.sym fp n) n))
247*16dce513Schristos
248*16dce513Schristos(define-hardware
249*16dce513Schristos  (name h-fp)
250*16dce513Schristos  (comment "Single precision floating point register pairs")
251*16dce513Schristos  (attrs (ISA media,compact))
252*16dce513Schristos  (type register DF (32))
253*16dce513Schristos  (indices keyword "" (.map -build-fpair-name (.iota 32)))
254*16dce513Schristos)
255*16dce513Schristos
256*16dce513Schristos(define-pmacro (-build-fvec-name n) ((.sym fv n) n))
257*16dce513Schristos
258*16dce513Schristos(define-hardware
259*16dce513Schristos  (name h-fv)
260*16dce513Schristos  (comment "Single precision floating point vectors")
261*16dce513Schristos  (attrs VIRTUAL (ISA media,compact))
262*16dce513Schristos  (type register SF (16))
263*16dce513Schristos  (indices keyword "" (.map -build-fvec-name (.iota 16)))
264*16dce513Schristos  ; Mask with $F to ensure 0 <= index < 15.
265*16dce513Schristos  (get (index) (reg h-fr (mul (and UQI index 15) 4)))
266*16dce513Schristos  (set (index newval) (set (reg h-fr (mul (and UQI index 15) 4)) newval))
267*16dce513Schristos)
268*16dce513Schristos
269*16dce513Schristos(define-hardware
270*16dce513Schristos  (name h-fmtx)
271*16dce513Schristos  (comment "Single precision floating point matrices")
272*16dce513Schristos  (attrs VIRTUAL (ISA media))
273*16dce513Schristos  (type register SF (4))
274*16dce513Schristos  (indices keyword "" ((mtrx0 0) (mtrx1 1) (mtrx2 2) (mtrx3 3)))
275*16dce513Schristos  ; Mask with $3 to ensure 0 <= index < 4.
276*16dce513Schristos  (get (index) (reg h-fr (mul (and UQI index 3) 16)))
277*16dce513Schristos  (set (index newval) (set (reg h-fr (mul (and UQI index 3) 16)) newval))
278*16dce513Schristos)
279*16dce513Schristos
280*16dce513Schristos(define-pmacro (-build-dreg-name n) ((.sym dr n) n))
281*16dce513Schristos
282*16dce513Schristos(define-hardware
283*16dce513Schristos  (name h-dr)
284*16dce513Schristos  (comment "Double precision floating point registers")
285*16dce513Schristos  (attrs (ISA media,compact) VIRTUAL)
286*16dce513Schristos  (type register DF (32))
287*16dce513Schristos  (indices keyword "" (.map -build-dreg-name (.iota 64)))
288*16dce513Schristos  (get (index)
289*16dce513Schristos       (subword DF
290*16dce513Schristos		(or
291*16dce513Schristos		 (sll DI (zext DI (subword SI (reg h-fr index) 0)) 32)
292*16dce513Schristos		 (zext DI (subword SI (reg h-fr (add index 1)) 0))) 0))
293*16dce513Schristos  (set (index newval)
294*16dce513Schristos       (sequence ()
295*16dce513Schristos		 (set (reg h-fr index)
296*16dce513Schristos		      (subword SF (subword SI newval 0) 0))
297*16dce513Schristos		 (set (reg h-fr (add index 1))
298*16dce513Schristos		      (subword SF (subword SI newval 1) 0))))
299*16dce513Schristos)
300*16dce513Schristos
301*16dce513Schristos(define-hardware
302*16dce513Schristos  (name h-tr)
303*16dce513Schristos  (comment "Branch target registers")
304*16dce513Schristos  (attrs (ISA media))
305*16dce513Schristos  (type register DI (8))
306*16dce513Schristos  (indices keyword "" ((tr0 0) (tr1 1) (tr2 2) (tr3 3) (tr4 4) (tr5 5) (tr6 6) (tr7 7)))
307*16dce513Schristos)
308*16dce513Schristos
309*16dce513Schristos(define-hardware
310*16dce513Schristos  (name h-endian)
311*16dce513Schristos  (comment "Current endian mode")
312*16dce513Schristos  (attrs (ISA compact,media) VIRTUAL)
313*16dce513Schristos  (type register BI)
314*16dce513Schristos  (get () (c-call BI "sh64_endian"))
315*16dce513Schristos  (set (newval) (error "cannot alter target byte order mid-program"))
316*16dce513Schristos)
317*16dce513Schristos
318*16dce513Schristos(define-hardware
319*16dce513Schristos  (name h-ism)
320*16dce513Schristos  (comment "Current instruction set mode")
321*16dce513Schristos  (attrs (ISA compact,media))
322*16dce513Schristos  (type register BI)
323*16dce513Schristos  (get () (raw-reg h-ism))
324*16dce513Schristos  (set (newval) (error "cannot set ism directly"))
325*16dce513Schristos)
326*16dce513Schristos
327*16dce513Schristos
328*16dce513Schristos; Operands.
329*16dce513Schristos
330*16dce513Schristos(dnop endian "Endian mode" ((ISA compact,media)) h-endian f-nil)
331*16dce513Schristos(dnop ism    "Instruction set mode" ((ISA compact,media)) h-ism f-nil)
332*16dce513Schristos
333*16dce513Schristos; Universally useful macros.
334*16dce513Schristos
335*16dce513Schristos; A pmacro for use in semantic bodies of unimplemented insns.
336*16dce513Schristos(define-pmacro (unimp mnemonic) (nop))
337*16dce513Schristos
338*16dce513Schristos; Join 2 ints together in natural bit order.
339*16dce513Schristos(define-pmacro (-join-si s1 s0)
340*16dce513Schristos  (or (sll (zext DI s1) 32)
341*16dce513Schristos      (zext DI s0)))
342*16dce513Schristos
343*16dce513Schristos; Join 4 half-ints together in natural bit order.
344*16dce513Schristos(define-pmacro (-join-hi h3 h2 h1 h0)
345*16dce513Schristos  (or (sll (zext DI h3) 48)
346*16dce513Schristos      (or (sll (zext DI h2) 32)
347*16dce513Schristos	  (or (sll (zext DI h1) 16)
348*16dce513Schristos	      (zext DI h0)))))
349*16dce513Schristos
350*16dce513Schristos; Join 8 quarter-ints together in natural bit order.
351*16dce513Schristos(define-pmacro (-join-qi b7 b6 b5 b4 b3 b2 b1 b0)
352*16dce513Schristos  (or (sll (zext DI b7) 56)
353*16dce513Schristos      (or (sll (zext DI b6) 48)
354*16dce513Schristos	  (or (sll (zext DI b5) 40)
355*16dce513Schristos	      (or (sll (zext DI b4) 32)
356*16dce513Schristos		  (or (sll (zext DI b3) 24)
357*16dce513Schristos		      (or (sll (zext DI b2) 16)
358*16dce513Schristos			  (or (sll (zext DI b1) 8)
359*16dce513Schristos			      (zext DI b0)))))))))
360*16dce513Schristos
361*16dce513Schristos
362*16dce513Schristos; Include the two instruction set descriptions from their respective
363*16dce513Schristos; source files.
364*16dce513Schristos
365*16dce513Schristos(if (keep-isa? (compact))
366*16dce513Schristos    (include "sh64-compact.cpu"))
367*16dce513Schristos
368*16dce513Schristos(if (keep-isa? (media))
369*16dce513Schristos    (include "sh64-media.cpu"))
370