summaryrefslogtreecommitdiff
path: root/cgen/play.cpu
blob: 3ef3775f22a99489cd473cdc53ff4eef83ab0e36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
; cpu description for debugging and experimental purposes. -*- Scheme -*-
; This file is part of CGEN.
; See file COPYING.CGEN for details.
; Copyright (C) 2000 Red Hat, Inc.
;
; This file is for experimental purposes.  Don't expect it to be correct
; or up to date.

(include "simplify.inc")

(define-arch
  (name play) ; name of cpu
  (comment "experimental .cpu file")
  (insn-lsb0? #f)
  (machs playb)
  (isas play)
)

(define-isa
  (name play)
  (base-insn-bitsize 16)
  (decode-assist (0 1 2 3))
)
  
(define-cpu
  (name cpuf)
  (comment "experimental cpu family")
  (endian little)
  (word-bitsize 32)
)

(define-mach
  (name playb)
  (comment "experimental mach")
  (cpu cpuf)
)

(define-model
  (name test) (comment "test") (attrs)
  (mach playb)
  ;(pipeline all "" () ((fetch) (decode) (execute) (writeback)))
  (unit u-exec "Execution Unit" () 1 1
	() () () ())
)

; Instruction fields.

(dnf f-op1       "op1"                 () 0 4)
(dnf f-op2       "op2"                 () 4 4)
(dnf f-op3       "op3"                 () 8 4)
(dnf f-op4       "op4"                 () 12 4)
(dnf f-r1        "r1"                  () 8 4)
(dnf f-r2        "r2"                  () 12 4)
(df  f-simm16     "simm16"             () 16 16 INT #f #f)

(define-normal-insn-enum insn-op1 "insn format enums" () OP1_ f-op1
  (.map .str (.iota 16))
)

(define-normal-insn-enum insn-op2 "insn format enums (2)" () OP2_ f-op2
  (.map .str (.iota 16))
)

(define-normal-insn-enum insn-op3 "insn format enums (3)" () OP3_ f-op3
  (.map .str (.iota 16))
)

(define-normal-insn-enum insn-op4 "insn format enums (4)" () OP4_ f-op4
  (.map .str (.iota 16))
)

; Hardware.

(dnh h-pc "program counter" (PC PROFILE) (pc) () () ())

(define-hardware
  (name h-gr)
  (comment "general registers")
  (attrs PROFILE );CACHE-ADDR)
  (type register WI (16))
  (indices keyword ""
	   ( (fp 13) (lr 14) (sp 15)
	     (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7)
	     (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15)
	     ))
)

(define-hardware
  (name h-status)
  (comment "status reg")
  (type register SI)
  (get () (const 0))
  (set (newval) (nop))
)

; These bits are actualy part of the PS register
(dsh h-nbit "negative bit" () (register BI))
(dsh h-zbit "zero     bit" () (register BI))
(dsh h-vbit "overflow bit" () (register BI))
(dsh h-cbit "carry    bit" () (register BI))

(dsh h-df "df test" () (register DF))
(dsh h-tf "tf test" () (register TF))

; Operand attributes.

(define-attr
  (for operand)
  (type boolean)
  (name HASH-PREFIX)
  (comment "immediates have a '#' prefix")
)

; Operands.

(dnop nbit "negative bit" (SEM-ONLY) h-nbit f-nil)
(dnop vbit "overflow bit" (SEM-ONLY) h-vbit f-nil)
(dnop zbit "zero     bit" (SEM-ONLY) h-zbit f-nil)
(dnop cbit "carry    bit" (SEM-ONLY) h-cbit f-nil)

(dnop dr     "destination register"    () h-gr   f-r1)
(dnop sr     "source register"         () h-gr   f-r2)
(dnop simm-16 "16 bit signed immediate" (HASH-PREFIX) h-sint f-simm16)

; Note that `df' doesn't work as that is a pmacro.
(dnop df-reg "df reg" () h-df f-nil)
(dnop tf-reg "tf reg" () h-tf f-nil)

; Instructions.

(dni add "add"
     ()
     "add $dr,$sr"
     (+ OP1_4 OP2_0 dr sr)
     (sequence ()
	       (set vbit (add-oflag dr sr (const 0)))
	       (set cbit (add-cflag dr sr (const 0)))
	       (set dr (add dr sr))
	       (set zbit (zflag dr))
	       (set nbit (nflag dr)))
     ()
)

(dni addv2 "add version 2"
     ()
     "add $dr,$sr"
     (+ OP1_4 OP2_1 dr sr)
     (sequence ((WI tmp1))
	       (parallel ()
			 (set tmp1 (add dr sr))
			 (set vbit (add-oflag dr sr (const 0)))
			 (set cbit (add-cflag dr sr (const 0))))
	       (set zbit (zflag tmp1))
	       (set nbit (nflag tmp1))
	       (set dr tmp1)
	       )
     ()
)

(dni addi "addi"
     ()
     "addi $dr,$sr,$simm-16"
     (+ OP1_4 OP2_2 dr sr simm-16)
     (set dr (add sr simm-16))
     ()
)

(define-pmacro (reg+ oprnd n)
  (reg h-gr (add (index-of oprnd) (const n)))
)

(dni ldm "ldm"
     ()
     "ldm $dr,$sr"
     (+ OP1_5 OP2_2 dr sr)
     (sequence ()
	       (set dr sr)
	       (set (reg+ dr 1) (reg+ sr 1))
	       )
     ()
)

(dni use-ifield "use-ifield"
     ()
     "foo $dr,$sr"
     (+ OP1_5 OP2_3 dr sr)
     (sequence ()
	       (set dr (ifield f-r2))
	       )
     ()
)

(dni use-index-of "index-of"
     ()
     "index-of $dr,$sr"
     (+ OP1_5 OP2_4 dr sr)
     (set dr (reg h-gr (add (index-of sr) (const 1))))
     ()
)

(dni load-df "use df"
     ()
     "load-df df,[$sr]"
     (+ OP1_6 OP2_0 OP3_0 sr)
     (set df-reg (mem DF sr))
     ()
)

(dni make-df "use df"
     ()
     "make-df df,[$sr]"
     (+ OP1_6 OP2_1 OP3_0 sr)
     (set df-reg (join DF SI (mem SI sr) (mem SI (add sr (const 4)))))
     ()
)

(dni split-df "use df"
     ()
     "split-df df,[$sr]"
     (+ OP1_6 OP2_2 OP3_0 sr)
     (sequence ((DF temp))
	       (set temp df-reg)
	       (set (concat (SI SI)
			     sr
			     (reg h-gr (add (regno sr) (const 1))))
		    (split DF SI temp))
	       )
     ()
)

(dni load-tf "use tf"
     ()
     "load-tf tf,[$sr]"
     (+ OP1_6 OP2_3 OP3_0 sr)
     (set tf-reg (mem TF sr))
     ()
)

(dni make-tf "use tf"
     ()
     "make-tf tf,[$sr]"
     (+ OP1_6 OP2_4 OP3_0 sr)
     (set tf-reg (join TF SI
		    sr
		    (reg h-gr (add (regno sr) (const 1)))
		    (reg h-gr (add (regno sr) (const 2)))
		    (reg h-gr (add (regno sr) (const 3)))))
     ()
)

(dni split-tf "use tf"
     ()
     "split-tf tf,[$sr]"
     (+ OP1_6 OP2_5 OP3_0 sr)
     (sequence ((TF temp))
	       (set temp tf-reg)
	       (set (concat (SI SI SI SI)
			     sr
			     (reg h-gr (add (regno sr) (const 1)))
			     (reg h-gr (add (regno sr) (const 2)))
			     (reg h-gr (add (regno sr) (const 3))))
		    (split TF SI temp))
	       )
     ()
)