OSDN Git Service

* symbols.c (resolve_symbol_value): Remove "finalize" param,
[pf3gnuchains/pf3gnuchains3x.git] / cgen / sparc32.cpu
1 ; SPARC32 CPU description.  -*- Scheme -*-
2 ; This file contains elements specific to sparc32.
3 ; Copyright (C) 2000 Red Hat, Inc.
4 ; This file is part of CGEN.
5 ; See file COPYING.CGEN for details.
6
7 ; Notes:
8 ; - sparc64 support wip
9 ; - fp support todo
10 ; - source file layout wip
11 ; - cpu family layout wip
12
13 ; ??? For the nonce there is one cpu family to cover all 32 bit sparcs.
14 ; It's not clear this will work, but following the goal of incremental
15 ; complication ....
16
17 (define-cpu
18   (name sparc32)
19   (comment "SPARC 32 bit architecture")
20   (endian big)
21   (word-bitsize 32)
22   ; Generated files have a "32" suffix.
23   (file-transform "32")
24 )
25
26 (define-mach
27   (name sparc-v8)
28   (comment "sparc v8")
29   (cpu sparc32)
30   (bfd-name "sparc")
31 )
32
33 (define-mach
34   (name sparclite)
35   (comment "Fujitsu sparclite")
36   (cpu sparc32)
37   (bfd-name "sparc_sparclite")
38 )
39
40 ; sparc32 models
41
42 (define-model
43   (name sparc32-def)
44   (comment "sparc32 default")
45   (attrs)
46   (mach sparc-v8)
47   ; wip
48   (pipeline p-foo "" () ((fetch) (decode) (execute) (memory) (writeback)))
49   (unit u-exec "Execution Unit" ()
50         1 1 ; issue done
51         () () () ())
52 )
53 \f
54 ; sparc32 enums of opcodes, special insn values, etc.
55 \f
56 ; sparc32 hardware pieces.
57
58 ; ??? impl,ver are left as part of h-psr (change maybe later)
59 (define-hardware
60   (name h-psr)
61   (comment "psr register")
62   (type register USI)
63   (get () (c-call USI "@cpu@_get_h_psr_handler"))
64   (set (newval) (c-call VOID "@cpu@_set_h_psr_handler" newval))
65 )
66
67 (dsh h-s "supervisor bit" () (register BI))
68 (dsh h-ps "previous supervisor bit" () (register BI))
69
70 (dsh h-pil "processor interrupt level" () (register UQI))
71
72 (dsh h-et "enable traps bit" () (register BI))
73
74 (define-hardware
75   (name h-tbr)
76   (comment "trap base register")
77   (type register WI)
78   ;CPU (h_tbr) = (CPU (h_tbr) & 0xff0) | ((newval) & 0xfffff000);
79   (set (newval) (set (raw-reg WI h-tbr)
80                      (or WI (and WI (raw-reg WI h-tbr) (const #xff0))
81                           (and WI newval (const #xfffff000)))))
82 )
83
84 (define-hardware
85   (name h-cwp)
86   (comment "current window pointer")
87   (type register UQI)
88   (set (newval) (c-call VOID "@cpu@_set_h_cwp_handler" newval))
89 )
90
91 (define-hardware
92   (name h-wim)
93   (comment "window invalid mask")
94   (type register USI)
95   ; ??? These just put ideas down so I can play with them.  Ignore.
96   ;(get (value index) (and SI value (c-code SI "((1 << NWINDOWS) - 1)")))
97   ;(get (self mode index insn)
98   ;     (c-code USI "(CPU (h_wim) & ((1 << NWINDOWS) - 1))"))
99   ;(set (self mode index insn newval)
100   ;    (s-eval `(set SI ,self (and SI ,newval (const #xff)))))
101   (get () (and (raw-reg USI h-wim)
102                (sub (sll (const 1) (c-raw-call SI "GET_NWINDOWS")) (const 1))))
103 )
104
105 (dsh h-ag "alternate global indicator" () (register QI))
106
107 ; Coprocessor support.
108
109 (dsh h-ec "enable coprocessor bit" () (register BI))
110
111 ; Floating point support.
112 ; wip.
113 ; - currently evaluating the various possibilities
114
115 (dsh h-ef "enable fpu bit" () (register BI))
116
117 (dsh h-fsr "floating point status register" () (register USI))
118 \f
119 ; sparc32 instruction definitions.
120
121 ; Special register move operations.
122
123 ; %y is handled by the asr insns
124
125 (dni rd-asr "read asr" ()
126      "rd $rdasr,$rd" ; note: `rdasr' is for ReaD asr, `rd' is for Reg Dest.
127      (+ OP_2 OP3_RDASR rd rdasr (f-i 0) (f-simm13 0))
128      (set rd rdasr)
129      ())
130 (dni wr-asr "write asr" ()
131      "wr $rs1,$rs2,$wrasr"
132      (+ OP_2 OP3_WRASR wrasr rs1 rs2 (f-i 0) (f-res-asi 0))
133      (set wrasr (xor rs1 rs2))
134      ())
135 (dni wr-asr-imm "write-imm asr" ()
136      "wr $rs1,$simm13,$wrasr"
137      (+ OP_2 OP3_WRASR wrasr rs1 (f-i 1) simm13)
138      (set wrasr (xor rs1 simm13))
139      ())
140
141 (define-pmacro (rdwr-op name op3 asm-name reg-name)
142   (begin
143      (dni (.sym rd- name) (.str "read " name) ()
144           (.str "rd " asm-name ",$rd")
145           (+ OP_2 (.sym OP3_RD op3) rd (f-rs1 0) (f-i 0) (f-simm13 0))
146           (set rd (reg WI reg-name))
147           ())
148      (dni (.sym wr- name) (.str "write " name) ()
149           (.str "wr $rs1,$rs2," asm-name)
150           (+ OP_2 (.sym OP3_WR op3) (f-rd 0) rs1 rs2 (f-i 0) (f-res-asi 0))
151           (set (reg WI reg-name) (xor rs1 rs2))
152           ())
153      (dni (.sym wr- name -imm) (.str "write-imm " name) ()
154           (.str "wr $rs1,$simm13," asm-name)
155           (+ OP_2 (.sym OP3_WR op3) (f-rd 0) rs1 (f-i 1) simm13)
156           (set (reg WI reg-name) (xor rs1 simm13))
157           ())
158      )
159 )
160
161 (rdwr-op psr PSR "%psr" h-psr)
162 (rdwr-op wim WIM "%wim" h-wim)
163 (rdwr-op tbr TBR "%tbr" h-tbr)
164 \f
165 ; TODO:
166 ; - rdy,wry
167 ; - stbar
168 ; - flush
169 ; - ldc, lddc, ldcsr, stc, stdc, stcsr, stdcq
170 ; - cbccc, cpop