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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [cgen/] [cpu/] [i960.cpu] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 jlechner
; Intel 80960 CPU description.  -*- Scheme -*-
2
; Copyright (C) 2000 Red Hat, Inc.
3
; This file is part of CGEN.
4
; See file COPYING.CGEN for details.
5
 
6
; Misc CGEN related problems.
7
 
8
; ??? CGEN assumes that the program counter is called PC.  On the i960, it
9
; is called IP (Instruction Pointer).
10
 
11
; ??? Try using (f-m3 1) instead of M3_1.
12
 
13
; ??? Try using the RESERVED attribute for instruction fields.
14
 
15
(include "simplify.inc")
16
 
17
 
18
; Architecture and cpu family definitions.
19
 
20
; ??? This should be using (insn-lsb0? #t), but it doesn't work yet.
21
 
22
(define-arch
23
  (name i960)
24
  (comment "Intel 80960 architecture")
25
  (machs i960:ka_sa i960:ca)
26
  (isas i960)
27
)
28
 
29
(define-isa
30
  (name i960)
31
  (base-insn-bitsize 32)
32
  (decode-assist (0 1 2 3 4 5 6 7))
33
  (liw-insns 1)
34
  (parallel-insns 1)
35
)
36
 
37
(define-cpu
38
  (name i960base)
39
  (comment "Intel 80960 cpu family")
40
  (endian little)
41
  (word-bitsize 32)
42
)
43
 
44
(define-mach
45
  (name i960:ka_sa)
46
  (comment "I960 KA and SA processors")
47
  (cpu i960base)
48
)
49
 
50
; ??? Incomplete.  Pipeline and unit info wrong.
51
 
52
(define-model
53
  (name i960KA)
54
  (comment "I960 KA processor")
55
  (mach i960:ka_sa)
56
  (pipeline all "" () ((fetch) (decode) (execute) (writeback)))
57
  (unit u-exec "Execution Unit" () 1 1
58
        () () () ())
59
)
60
 
61
(define-mach
62
  (name i960:ca)
63
  (comment "I960 CA processor")
64
  (cpu i960base)
65
)
66
 
67
; ??? Incomplete.  Pipeline and unit info wrong.
68
 
69
(define-model
70
  (name i960CA)
71
  (comment "I960 CA processor")
72
  (mach i960:ca)
73
  (pipeline all "" () ((fetch) (decode) (execute) (writeback)))
74
  (unit u-exec "Execution Unit" () 1 1
75
        () () () ())
76
)
77
 
78
; Instruction fields.
79
;
80
; Attributes:
81
; PCREL-ADDR: pc relative value (for reloc and disassembly purposes)
82
; ABS-ADDR: absolute address (for reloc and disassembly purposes?)
83
; RESERVED: bits are not used to decode insn, must be all 0
84
 
85
; All of the fields for a REG format instruction.
86
 
87
(dnf f-opcode   "opcode"                () 0 8)
88
(dnf f-srcdst   "src/dst"               () 8 5)
89
(dnf f-src2     "src2"                  () 13 5)
90
(dnf f-m3       "m3"                    () 18 1)
91
(dnf f-m2       "m2"                    () 19 1)
92
(dnf f-m1       "m1"                    () 20 1)
93
(dnf f-opcode2  "opcode2"               () 21 4)
94
(dnf f-zero     "zero"                  () 25 2)
95
(dnf f-src1     "src1"                  () 27 5)
96
 
97
; Extra fields needed for a MEMA format instruction.
98
 
99
(dnf f-abase    "abase"                 () 13 5)
100
(dnf f-modea    "modea"                 () 18 1)
101
(dnf f-zeroa    "zeroa"                 () 19 1)
102
(dnf f-offset   "offset"                () 20 12)
103
 
104
; Extra fields needed for a MEMB format instruction.
105
 
106
(dnf f-modeb    "modeb"                 () 18 4)
107
(dnf f-scale    "scale"                 () 22 3)
108
(dnf f-zerob    "zerob"                 () 25 2)
109
(dnf f-index    "index"                 () 27 5)
110
(dnf f-optdisp  "optional displacement" () 32 32)
111
 
112
; Extra fields needed for a COBR format instruction.
113
 
114
(dnf f-br-src1  "branch src1"           () 8 5)
115
(dnf f-br-src2  "branch src2"           () 13 5)
116
(dnf f-br-m1    "branch m1"             () 18 1)
117
(df  f-br-disp  "branch displacement"   (PCREL-ADDR) 19 11 INT
118
     ((value pc) (sra WI (sub WI value pc) (const 2)))
119
     ((value pc) (add WI (sll WI value (const 2)) pc)))
120
(dnf f-br-zero  "branch zero"           () 30 2)
121
 
122
; Extra fields needed for a CRTL format instruction.
123
 
124
(df  f-ctrl-disp "ctrl branch disp"     (PCREL-ADDR) 8 22 INT
125
     ((value pc) (sra WI (sub WI value pc) (const 2)))
126
     ((value pc) (add WI (sll WI value (const 2)) pc)))
127
(dnf f-ctrl-zero "ctrl branch zero"     () 30 2)
128
 
129
 
130
; Enums.
131
 
132
(define-pmacro (build-hex2 num) (.hex num 2))
133
 
134
; insn-opcode
135
(define-normal-insn-enum insn-opcode "insn opcode enums" () OPCODE_ f-opcode
136
  (.map .upcase (.map build-hex2 (.iota 256))) ; "00" -> "FF"
137
)
138
 
139
(define-normal-insn-enum insn-opcode2 "insn opcode2 enums" () OPCODE2_
140
  f-opcode2
141
  (.map .upcase (.map .hex (.iota 16))) ; "0" -> "F"
142
)
143
 
144
(define-normal-insn-enum insn-m3 "insn m3 enums" () M3_
145
  f-m3
146
  ("0" "1")
147
)
148
 
149
(define-normal-insn-enum insn-m2 "insn m3 enums" () M2_
150
  f-m2
151
  ("0" "1")
152
)
153
 
154
(define-normal-insn-enum insn-m1 "insn m1 enums" () M1_
155
  f-m1
156
  ("0" "1")
157
)
158
 
159
(define-normal-insn-enum insn-zero "insn zero enums" () ZERO_
160
  f-zero
161
  ("0")
162
)
163
 
164
(define-normal-insn-enum insn-modea "insn mode a enums" () MODEA_
165
  f-modea
166
  ("OFFSET" "INDIRECT-OFFSET")
167
)
168
 
169
(define-normal-insn-enum insn-zeroa "insn zero a enums" () ZEROA_
170
  f-zeroa
171
  ("0")
172
)
173
 
174
(define-normal-insn-enum insn-modeb "insn mode b enums" () MODEB_
175
  f-modeb
176
  ("ILL0" "ILL1" "ILL2" "ILL3" "INDIRECT" "IP-DISP" "RES6" "INDIRECT-INDEX"
177
   "ILL8" "ILL9" "ILL10" "ILL11" "DISP" "INDIRECT-DISP" "INDEX-DISP"
178
   "INDIRECT-INDEX-DISP")
179
)
180
 
181
(define-normal-insn-enum insn-zerob "insn zero b enums" () ZEROB_
182
  f-zerob
183
  ("0")
184
)
185
 
186
(define-normal-insn-enum insn-br-m1 "insn branch m1 enums" () BR_M1_
187
  f-br-m1
188
  ("0" "1")
189
)
190
 
191
(define-normal-insn-enum insn-br-zero "insn branch zero enums" () BR_ZERO_
192
  f-br-zero
193
  ("0")
194
)
195
 
196
(define-normal-insn-enum insn-ctrl-zero "insn ctrl zero enums" () CTRL_ZERO_
197
  f-ctrl-zero
198
  ("0")
199
)
200
 
201
 
202
; Hardware pieces
203
 
204
(dnh h-pc "program counter" (PC PROFILE) (pc) () () ())
205
 
206
(define-hardware
207
  (name h-gr)
208
  (comment "general registers")
209
  (attrs PROFILE CACHE-ADDR)
210
  (type register WI (32))
211
  (indices keyword ""
212
           ((fp 31) (sp 1)
213
            (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7)
214
            (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15)
215
            (g0 16) (g1 17) (g2 18) (g3 19) (g4 20) (g5 21) (g6 22) (g7 23)
216
            (g8 24) (g9 25) (g10 26) (g11 27) (g12 28) (g13 29) (g14 30) (g15 31)
217
            ))
218
)
219
 
220
; ??? This is actually part of the AC register.
221
 
222
(define-hardware
223
  (name h-cc)
224
  (comment "condition code")
225
  (attrs PROFILE CACHE-ADDR)
226
  (type register WI)
227
  (indices keyword "" ((cc 0)))
228
)
229
 
230
;(define-hardware
231
;  (name h-pc)
232
;  (comment "program counter")
233
;  (attrs PC)
234
;  (type register WI)
235
;  ; (handlers (print "ip"))
236
;)
237
 
238
; ??? Incomplete.
239
 
240
 
241
; Instruction Operands.
242
; These entries provide a layer between the assembler and the raw hardware
243
; description, and are used to refer to hardware elements in the semantic
244
; code.  Usually there's a bit of over-specification, but in more complicated
245
; instruction sets there isn't.
246
 
247
; Operand fields for a REG format instruction.
248
 
249
(dnop src1      "source register 1"     () h-gr   f-src1)
250
(dnop src2      "source register 2"     () h-gr   f-src2)
251
(dnop dst       "source/dest register"  () h-gr   f-srcdst)
252
 
253
(dnop lit1      "literal 1"             () h-uint f-src1)
254
(dnop lit2      "literal 2"             () h-uint f-src2)
255
 
256
; Operand fields for a MEMA format instruction.
257
 
258
(dnop st_src    "store src"             () h-gr   f-srcdst)
259
(dnop abase     "abase"                 () h-gr   f-abase)
260
(dnop offset    "offset"                () h-uint f-offset)
261
 
262
; Operand fields for a MEMB format instruction.
263
 
264
(dnop scale     "scale"                 () h-uint f-scale)
265
(dnop indx      "index"                 () h-gr   f-index)
266
(dnop optdisp   "optional displacement" () h-uint f-optdisp)
267
 
268
; Operand fields for a COBR format instruction.
269
 
270
(dnop br_src1   "branch src1"           () h-gr   f-br-src1)
271
(dnop br_src2   "branch src2"           () h-gr   f-br-src2)
272
(dnop br_disp   "branch displacement"   () h-iaddr f-br-disp)
273
 
274
(dnop br_lit1   "branch literal 1"      () h-uint f-br-src1)
275
 
276
; Operand fields for a CRTL format instruction.
277
 
278
(dnop ctrl_disp "ctrl branch disp"      () h-iaddr f-ctrl-disp)
279
 
280
 
281
; Instruction definitions.
282
 
283
; IDOC attribute for instruction documentation.
284
 
285
(define-attr
286
  (for insn)
287
  (type enum)
288
  (name IDOC)
289
  (comment "insn kind for documentation")
290
  (attrs META)
291
  (values
292
   (MEM - () "Memory")
293
   (ALU - () "ALU")
294
   (FPU - () "FPU")
295
   (BR - () "Branch")
296
   (PRIV - () "Priviledged")
297
   (MISC - () "Miscellaneous")
298
  )
299
)
300
 
301
; ??? Maybe I should just reverse the operands in the alu-op macro.
302
 
303
(define-pmacro (divo-expr expr1 expr2) (udiv expr2 expr1))
304
(define-pmacro (divi-expr expr1 expr2) (div expr2 expr1))
305
(define-pmacro (remo-expr expr1 expr2) (umod expr2 expr1))
306
(define-pmacro (remi-expr expr1 expr2) (mod expr2 expr1))
307
 
308
(define-pmacro (sub-expr expr1 expr2) (sub expr2 expr1))
309
 
310
(define-pmacro (notbit-expr expr1 expr2)
311
  (xor (sll (const 1) expr1) expr2))
312
(define-pmacro (andnot-expr expr1 expr2)
313
  (and expr2 (inv expr1)))
314
(define-pmacro (setbit-expr expr1 expr2)
315
  (or (sll (const 1) expr1) expr2))
316
(define-pmacro (notand-expr expr1 expr2)
317
  (and (inv expr2) expr1))
318
(define-pmacro (nor-expr expr1 expr2)
319
  (and (inv expr2) (inv expr1)))
320
(define-pmacro (xnor-expr expr1 expr2)
321
  (inv (xor expr1 expr2)))
322
(define-pmacro (not-expr expr1 expr2)
323
  (inv expr1))
324
(define-pmacro (ornot-expr expr1 expr2)
325
  (or expr2 (inv expr1)))
326
(define-pmacro (clrbit-expr expr1 expr2)
327
  (and (inv (sll (const 1) expr1)) expr2))
328
 
329
; A shift of 32 or more shifts out all input bits.
330
 
331
(define-pmacro (sll-expr expr1 expr2)
332
  (cond WI
333
         ((geu UWI expr1 (const 32)) (const 0))
334
         (else (sll expr2 expr1))))
335
(define-pmacro (srl-expr expr1 expr2)
336
  (cond WI
337
         ((geu UWI expr1 (const 32)) (const 0))
338
         (else (srl expr2 expr1))))
339
(define-pmacro (sra-expr expr1 expr2)
340
  (cond WI
341
         ((geu UWI expr1 (const 32)) (sra expr2 (const 31)))
342
         (else (sra expr2 expr1))))
343
 
344
(define-pmacro (alu-op mnemonic opcode-op opcode2-op sem-op)
345
  (begin
346
    (dni mnemonic
347
         (.str mnemonic " reg/reg")
348
         ()
349
         (.str mnemonic " $src1, $src2, $dst")
350
         (+ opcode-op dst src2 M3_0 M2_0 M1_0 opcode2-op ZERO_0 src1)
351
         (set dst (sem-op src1 src2))
352
         ()
353
    )
354
    (dni (.sym mnemonic "1")
355
         (.str mnemonic " lit/reg")
356
         ()
357
         (.str mnemonic " $lit1, $src2, $dst")
358
         (+ opcode-op dst src2 M3_0 M2_0 M1_1 opcode2-op ZERO_0 lit1)
359
         (set dst (sem-op lit1 src2))
360
         ()
361
    )
362
    (dni (.sym mnemonic "2")
363
         (.str mnemonic " reg/lit")
364
         ()
365
         (.str mnemonic " $src1, $lit2, $dst")
366
         (+ opcode-op dst lit2 M3_0 M2_1 M1_0 opcode2-op ZERO_0 src1)
367
         (set dst (sem-op src1 lit2))
368
         ()
369
    )
370
    (dni (.sym mnemonic "3")
371
         (.str mnemonic " lit/lit")
372
         ()
373
         (.str mnemonic " $lit1, $lit2, $dst")
374
         (+ opcode-op dst lit2 M3_0 M2_1 M1_1 opcode2-op ZERO_0 lit1)
375
         (set dst (sem-op lit1 lit2))
376
         ()
377
    )
378
  )
379
)
380
 
381
(alu-op mulo OPCODE_70 OPCODE2_1 mul)
382
(alu-op remo OPCODE_70 OPCODE2_8 remo-expr)
383
(alu-op divo OPCODE_70 OPCODE2_B divo-expr)
384
(alu-op remi OPCODE_74 OPCODE2_8 remi-expr)
385
(alu-op divi OPCODE_74 OPCODE2_B divi-expr)
386
 
387
(alu-op addo OPCODE_59 OPCODE2_0 add)
388
(alu-op subo OPCODE_59 OPCODE2_2 sub-expr)
389
 
390
(alu-op notbit OPCODE_58 OPCODE2_0 notbit-expr)
391
(alu-op and  OPCODE_58 OPCODE2_1 and)
392
(alu-op andnot OPCODE_58 OPCODE2_2 andnot-expr)
393
(alu-op setbit OPCODE_58 OPCODE2_3 setbit-expr)
394
(alu-op notand OPCODE_58 OPCODE2_4 notand-expr)
395
(alu-op xor  OPCODE_58 OPCODE2_6 xor)
396
(alu-op or   OPCODE_58 OPCODE2_7 or)
397
(alu-op nor  OPCODE_58 OPCODE2_8 nor-expr)
398
(alu-op xnor OPCODE_58 OPCODE2_9 xnor-expr)
399
(alu-op not  OPCODE_58 OPCODE2_A not-expr)
400
(alu-op ornot OPCODE_58 OPCODE2_B ornot-expr)
401
(alu-op clrbit OPCODE_58 OPCODE2_C clrbit-expr)
402
 
403
; ??? Incomplete.  Does not handle overflow for integer shifts.
404
 
405
(alu-op shlo OPCODE_59 OPCODE2_C sll-expr)
406
(alu-op shro OPCODE_59 OPCODE2_8 srl-expr)
407
(alu-op shli OPCODE_59 OPCODE2_E sll-expr)
408
(alu-op shri OPCODE_59 OPCODE2_B sra-expr)
409
 
410
 
411
; ??? Does not verify alignment of dest reg.
412
 
413
(define-pmacro (emul-expr dest expr1 expr2)
414
  (sequence ((DI temp) (SI dregno))
415
            (set temp (mul DI (zext DI expr1) (zext DI expr2)))
416
            ; ??? Workaround cgen s-i-o-o bug.
417
            (set dregno (ifield f-srcdst))
418
            (set dest (trunc SI temp))
419
            (set (reg h-gr (add (index-of dest) (const 1)))
420
                 (trunc SI (srl temp (const 32))))))
421
 
422
; ??? Needless duplicate of alu-op.  Should eliminate alu-op.
423
 
424
(define-pmacro (alu2-op mnemonic opcode-op opcode2-op sem-op)
425
  (begin
426
    (dni mnemonic
427
         (.str mnemonic " reg/reg")
428
         ()
429
         (.str mnemonic " $src1, $src2, $dst")
430
         (+ opcode-op dst src2 M3_0 M2_0 M1_0 opcode2-op ZERO_0 src1)
431
         (sem-op dst src1 src2)
432
         ()
433
    )
434
    (dni (.sym mnemonic "1")
435
         (.str mnemonic " lit/reg")
436
         ()
437
         (.str mnemonic " $lit1, $src2, $dst")
438
         (+ opcode-op dst src2 M3_0 M2_0 M1_1 opcode2-op ZERO_0 lit1)
439
         (sem-op dst lit1 src2)
440
         ()
441
    )
442
    (dni (.sym mnemonic "2")
443
         (.str mnemonic " reg/lit")
444
         ()
445
         (.str mnemonic " $src1, $lit2, $dst")
446
         (+ opcode-op dst lit2 M3_0 M2_1 M1_0 opcode2-op ZERO_0 src1)
447
         (sem-op dst src1 lit2)
448
         ()
449
    )
450
    (dni (.sym mnemonic "3")
451
         (.str mnemonic " lit/lit")
452
         ()
453
         (.str mnemonic " $lit1, $lit2, $dst")
454
         (+ opcode-op dst lit2 M3_0 M2_1 M1_1 opcode2-op ZERO_0 lit1)
455
         (sem-op dst lit1 lit2)
456
         ()
457
    )
458
  )
459
)
460
 
461
(alu2-op emul OPCODE_67 OPCODE2_0 emul-expr)
462
 
463
 
464
 
465
; ??? lit2 must be zero.
466
; ??? should verify multi-word reg alignment.
467
 
468
(define-pmacro (mov-expr expr1 expr2)
469
  (set expr1 expr2))
470
(define-pmacro (movl-expr expr1 expr2)
471
  (sequence ((SI dregno) (SI sregno))
472
            ; ??? Workaround cgen s-i-o-o bug.
473
            (set dregno (ifield f-srcdst))
474
            (set sregno (ifield f-src1))
475
            (set expr1 expr2)
476
            (set (reg h-gr (add (index-of expr1) (const 1)))
477
                 (reg h-gr (add (index-of expr2) (const 1))))))
478
(define-pmacro (movllit-expr expr1 expr2)
479
  (sequence ((SI dregno))
480
            ; ??? Workaround cgen s-i-o-o bug.
481
            (set dregno (ifield f-srcdst))
482
            (set expr1 expr2)
483
            (set (reg h-gr (add (index-of expr1) (const 1)))
484
                 (const 0))))
485
(define-pmacro (movt-expr expr1 expr2)
486
  (sequence ((SI dregno) (SI sregno))
487
            ; ??? Workaround cgen s-i-o-o bug.
488
            (set dregno (ifield f-srcdst))
489
            (set sregno (ifield f-src1))
490
            (set expr1 expr2)
491
            (set (reg h-gr (add (index-of expr1) (const 1)))
492
                 (reg h-gr (add (index-of expr2) (const 1))))
493
            (set (reg h-gr (add (index-of expr1) (const 2)))
494
                 (reg h-gr (add (index-of expr2) (const 2))))))
495
(define-pmacro (movtlit-expr expr1 expr2)
496
  (sequence ((SI dregno))
497
            ; ??? Workaround cgen s-i-o-o bug.
498
            (set dregno (ifield f-srcdst))
499
            (set expr1 expr2)
500
            (set (reg h-gr (add (index-of expr1) (const 1)))
501
                 (const 0))
502
            (set (reg h-gr (add (index-of expr1) (const 2)))
503
                 (const 0))))
504
(define-pmacro (movq-expr expr1 expr2)
505
  (sequence ((SI dregno) (SI sregno))
506
            ; ??? Workaround cgen s-i-o-o bug.
507
            (set dregno (ifield f-srcdst))
508
            (set sregno (ifield f-src1))
509
            (set expr1 expr2)
510
            (set (reg h-gr (add (index-of expr1) (const 1)))
511
                 (reg h-gr (add (index-of expr2) (const 1))))
512
            (set (reg h-gr (add (index-of expr1) (const 2)))
513
                 (reg h-gr (add (index-of expr2) (const 2))))
514
            (set (reg h-gr (add (index-of expr1) (const 3)))
515
                 (reg h-gr (add (index-of expr2) (const 3))))))
516
(define-pmacro (movqlit-expr expr1 expr2)
517
  (sequence ((SI dregno))
518
            ; ??? Workaround cgen s-i-o-o bug.
519
            (set dregno (ifield f-srcdst))
520
            (set expr1 expr2)
521
            (set (reg h-gr (add (index-of expr1) (const 1)))
522
                 (const 0))
523
            (set (reg h-gr (add (index-of expr1) (const 2)))
524
                 (const 0))
525
            (set (reg h-gr (add (index-of expr1) (const 3)))
526
                 (const 0))))
527
 
528
(define-pmacro (move-op mnemonic opcode-op opcode2-op sem-op semlit-op)
529
  (begin
530
    (dni mnemonic
531
         (.str mnemonic " reg")
532
         ()
533
         (.str mnemonic " $src1, $dst")
534
         (+ opcode-op dst lit2 M3_0 M2_1 M1_0 opcode2-op ZERO_0 src1)
535
         (sem-op dst src1)
536
         ()
537
    )
538
    (dni (.sym mnemonic "1")
539
         (.str mnemonic " lit")
540
         ()
541
         (.str mnemonic " $lit1, $dst")
542
         (+ opcode-op dst lit2 M3_0 M2_1 M1_1 opcode2-op ZERO_0 lit1)
543
         (semlit-op dst lit1)
544
         ()
545
    )
546
  )
547
)
548
 
549
(move-op mov OPCODE_5C OPCODE2_C mov-expr mov-expr)
550
(move-op movl OPCODE_5D OPCODE2_C movl-expr movllit-expr)
551
(move-op movt OPCODE_5E OPCODE2_C movt-expr movtlit-expr)
552
(move-op movq OPCODE_5F OPCODE2_C movq-expr movqlit-expr)
553
 
554
; ??? This is very incomplete.  This does not handle src1 or src2 as literals.
555
; This doesn't implement any of the effects of the instruction.
556
(dni modpc "modpc"
557
     ()
558
     "modpc $src1, $src2, $dst"
559
     (+ OPCODE_65 dst src1 M3_0 M2_0 M1_0 OPCODE2_5 ZERO_0 src2)
560
     (set dst src2)
561
     ()
562
)
563
 
564
; ??? This is very incomplete.  This does not handle src1 or src2 as literals.
565
; This doesn't implement any of the effects of the instruction.
566
(dni modac "modac"
567
     ()
568
     "modac $src1, $src2, $dst"
569
     (+ OPCODE_64 dst src1 M3_0 M2_0 M1_0 OPCODE2_5 ZERO_0 src2)
570
     (set dst src2)
571
     ()
572
)
573
 
574
; ??? Incomplete.  Only handles 8 of the 10 addressing modes.
575
; Does not handle sign/zero extend operations.  Does not handle
576
; different modes.
577
 
578
; ??? should verify multi-word reg alignment.
579
 
580
; ??? index-index scale disasssembles wrong
581
 
582
; ??? See also the store-op macro below.
583
 
584
(define-pmacro (lda-expr expr1 expr2)
585
  (set expr1 expr2))
586
 
587
(define-pmacro (ld-expr expr1 expr2)
588
  (set expr1 (mem WI expr2)))
589
(define-pmacro (ldob-expr expr1 expr2)
590
  (set expr1 (mem UQI expr2)))
591
(define-pmacro (ldos-expr expr1 expr2)
592
  (set expr1 (mem UHI expr2)))
593
(define-pmacro (ldib-expr expr1 expr2)
594
  (set expr1 (mem QI expr2)))
595
(define-pmacro (ldis-expr expr1 expr2)
596
  (set expr1 (mem HI expr2)))
597
(define-pmacro (ldl-expr expr1 expr2)
598
  (sequence ((WI temp) (SI dregno))
599
            ; ??? Workaround cgen s-i-o-o bug.
600
            (set dregno (ifield f-srcdst))
601
            (set temp expr2)
602
            (set expr1 (mem WI temp))
603
            (set (reg h-gr (add (index-of expr1) (const 1)))
604
                 (mem WI (add temp (const 4))))))
605
(define-pmacro (ldt-expr expr1 expr2)
606
  (sequence ((WI temp) (SI dregno))
607
            ; ??? Workaround cgen s-i-o-o bug.
608
            (set dregno (ifield f-srcdst))
609
            (set temp expr2)
610
            (set expr1 (mem WI temp))
611
            (set (reg h-gr (add (index-of expr1) (const 1)))
612
                 (mem WI (add temp (const 4))))
613
            (set (reg h-gr (add (index-of expr1) (const 2)))
614
                 (mem WI (add temp (const 8))))))
615
(define-pmacro (ldq-expr expr1 expr2)
616
  (sequence ((WI temp) (SI dregno))
617
            ; ??? Workaround cgen s-i-o-o bug.
618
            (set dregno (ifield f-srcdst))
619
            ; Evaluate the address first, for correctness, in case an address
620
            ; reg will be loaded into.  Also, makes the simulator faster.
621
            (set temp expr2)
622
            (set expr1 (mem WI temp))
623
            (set (reg h-gr (add (index-of expr1) (const 1)))
624
                 (mem WI (add temp (const 4))))
625
            (set (reg h-gr (add (index-of expr1) (const 2)))
626
                 (mem WI (add temp (const 8))))
627
            (set (reg h-gr (add (index-of expr1) (const 3)))
628
                 (mem WI (add temp (const 12))))))
629
 
630
(define-pmacro (load-op suffix opcode-op sem-op)
631
  (begin
632
    (dni (.sym ld suffix -offset) (.str "ld" suffix "-offset")
633
         ()
634
         (.str "ld" suffix " $offset, $dst")
635
         (+ opcode-op dst abase MODEA_OFFSET ZEROA_0 offset)
636
         (sem-op dst offset)
637
         ()
638
    )
639
    (dni (.sym ld suffix -indirect-offset)
640
         (.str "ld" suffix "-indirect-offset")
641
         ()
642
         (.str "ld" suffix " $offset($abase), $dst")
643
         (+ opcode-op dst abase MODEA_INDIRECT-OFFSET ZEROA_0 offset)
644
         (sem-op dst (add offset abase))
645
         ()
646
    )
647
    (dni (.sym ld suffix -indirect) (.str "ld" suffix "-indirect")
648
         ()
649
         (.str "ld" suffix " ($abase), $dst")
650
         (+ opcode-op dst abase MODEB_INDIRECT scale ZEROB_0 indx)
651
         (sem-op dst abase)
652
         ()
653
    )
654
    (dni (.sym ld suffix -indirect-index) (.str "ld" suffix "-indirect-index")
655
         ()
656
         (.str "ld" suffix " ($abase)[$indx*S$scale], $dst")
657
         (+ opcode-op dst abase MODEB_INDIRECT-INDEX scale ZEROB_0 indx)
658
         (sem-op dst (add abase (mul indx (sll (const 1) scale))))
659
         ()
660
    )
661
    (dni (.sym ld suffix -disp) (.str "ld" suffix "-disp")
662
         ()
663
         (.str "ld" suffix " $optdisp, $dst")
664
         (+ opcode-op dst abase MODEB_DISP scale ZEROB_0 indx optdisp)
665
         (sem-op dst optdisp)
666
         ()
667
    )
668
    (dni (.sym ld suffix -indirect-disp) (.str "ld" suffix "-indirect-disp")
669
         ()
670
         (.str "ld" suffix " $optdisp($abase), $dst")
671
         (+ opcode-op dst abase MODEB_INDIRECT-DISP scale ZEROB_0 indx optdisp)
672
         (sem-op dst (add optdisp abase))
673
         ()
674
    )
675
    (dni (.sym ld suffix -index-disp) (.str "ld" suffix "-index-disp")
676
         ()
677
         (.str "ld" suffix " $optdisp[$indx*S$scale], $dst")
678
         (+ opcode-op dst abase MODEB_INDEX-DISP scale ZEROB_0 indx optdisp)
679
         (sem-op dst (add optdisp (mul indx (sll (const 1) scale))))
680
         ()
681
    )
682
    (dni (.sym ld suffix -indirect-index-disp)
683
         (.str "ld" suffix "-indirect-index-disp")
684
         ()
685
         (.str "ld" suffix " $optdisp($abase)[$indx*S$scale], $dst")
686
         (+ opcode-op dst abase MODEB_INDIRECT-INDEX-DISP scale ZEROB_0 indx optdisp)
687
         (sem-op dst (add optdisp (add abase
688
                                       (mul indx (sll (const 1) scale)))))
689
         ()
690
    )
691
  )
692
)
693
 
694
(load-op "a" OPCODE_8C lda-expr)
695
 
696
(load-op ""  OPCODE_90 ld-expr)
697
(load-op "ob" OPCODE_80 ldob-expr)
698
(load-op "os" OPCODE_88 ldos-expr)
699
(load-op "ib" OPCODE_C0 ldib-expr)
700
(load-op "is" OPCODE_C8 ldis-expr)
701
(load-op "l" OPCODE_98 ldl-expr)
702
(load-op "t" OPCODE_A0 ldt-expr)
703
(load-op "q" OPCODE_B0 ldq-expr)
704
 
705
; ??? Incomplete.  This is a near duplicate of the above load-op macro.
706
 
707
; ??? For efficiency, should eval the address only once.  See the load patterns
708
; above.
709
 
710
(define-pmacro (st-expr expr1 expr2)
711
  (set (mem WI expr1) expr2))
712
(define-pmacro (stob-expr expr1 expr2)
713
  (set (mem QI expr1) expr2))
714
(define-pmacro (stos-expr expr1 expr2)
715
  (set (mem HI expr1) expr2))
716
(define-pmacro (stl-expr expr1 expr2)
717
  (sequence ((SI sregno))
718
            ; ??? Workaround cgen s-i-o-o bug.
719
            (set sregno (ifield f-srcdst))
720
            (set (mem WI expr1) expr2)
721
            (set (mem WI (add expr1 (const 4)))
722
                 (reg h-gr (add (index-of expr2) (const 1))))))
723
(define-pmacro (stt-expr expr1 expr2)
724
  (sequence ((SI sregno))
725
            ; ??? Workaround cgen s-i-o-o bug.
726
            (set sregno (ifield f-srcdst))
727
            (set (mem WI expr1) expr2)
728
            (set (mem WI (add expr1 (const 4)))
729
                 (reg h-gr (add (index-of expr2) (const 1))))
730
            (set (mem WI (add expr1 (const 8)))
731
                 (reg h-gr (add (index-of expr2) (const 2))))))
732
(define-pmacro (stq-expr expr1 expr2)
733
  (sequence ((SI sregno))
734
            ; ??? Workaround cgen s-i-o-o bug.
735
            (set sregno (ifield f-srcdst))
736
            (set (mem WI expr1) expr2)
737
            (set (mem WI (add expr1 (const 4)))
738
                 (reg h-gr (add (index-of expr2) (const 1))))
739
            (set (mem WI (add expr1 (const 8)))
740
                 (reg h-gr (add (index-of expr2) (const 2))))
741
            (set (mem WI (add expr1 (const 12)))
742
                 (reg h-gr (add (index-of expr2) (const 3))))))
743
 
744
(define-pmacro (store-op suffix opcode-op sem-op)
745
  (begin
746
    (dni (.sym st suffix -offset) (.str "st" suffix "-offset")
747
         ()
748
         (.str "st" suffix " $st_src, $offset")
749
         (+ opcode-op st_src abase MODEA_OFFSET ZEROA_0 offset)
750
         (sem-op offset st_src)
751
         ()
752
    )
753
    (dni (.sym st suffix -indirect-offset)
754
         (.str "st" suffix "-indirect-offset")
755
         ()
756
         (.str "st" suffix " $st_src, $offset($abase)")
757
         (+ opcode-op st_src abase MODEA_INDIRECT-OFFSET ZEROA_0 offset)
758
         (sem-op (add offset abase) st_src)
759
         ()
760
    )
761
    (dni (.sym st suffix -indirect) (.str "st" suffix "-indirect")
762
         ()
763
         (.str "st" suffix " $st_src, ($abase)")
764
         (+ opcode-op st_src abase MODEB_INDIRECT scale ZEROB_0 indx)
765
         (sem-op abase st_src)
766
         ()
767
    )
768
    (dni (.sym st suffix -indirect-index) (.str "st" suffix "-indirect-index")
769
         ()
770
         (.str "st" suffix " $st_src, ($abase)[$indx*S$scale]")
771
         (+ opcode-op st_src abase MODEB_INDIRECT-INDEX scale ZEROB_0 indx)
772
         (sem-op (add abase (mul indx (sll (const 1) scale))) st_src)
773
         ()
774
    )
775
    (dni (.sym st suffix -disp) (.str "st" suffix "-disp")
776
         ()
777
         (.str "st" suffix " $st_src, $optdisp")
778
         (+ opcode-op st_src abase MODEB_DISP scale ZEROB_0 indx optdisp)
779
         (sem-op optdisp st_src)
780
         ()
781
    )
782
    (dni (.sym st suffix -indirect-disp) (.str "st" suffix "-indirect-disp")
783
         ()
784
         (.str "st" suffix " $st_src, $optdisp($abase)")
785
         (+ opcode-op st_src abase MODEB_INDIRECT-DISP scale ZEROB_0 indx optdisp)
786
         (sem-op (add optdisp abase) st_src)
787
         ()
788
    )
789
    (dni (.sym st suffix -index-disp) (.str "st" suffix "-index-disp")
790
         ()
791
         (.str "st" suffix " $st_src, $optdisp[$indx*S$scale")
792
         (+ opcode-op st_src abase MODEB_INDEX-DISP scale ZEROB_0 indx optdisp)
793
         (sem-op (add optdisp (mul indx (sll (const 1) scale))) st_src)
794
         ()
795
    )
796
    (dni (.sym st suffix -indirect-index-disp)
797
         (.str "st" suffix "-indirect-index-disp")
798
         ()
799
         (.str "st" suffix " $st_src, $optdisp($abase)[$indx*S$scale]")
800
         (+ opcode-op st_src abase MODEB_INDIRECT-INDEX-DISP scale ZEROB_0 indx optdisp)
801
         (sem-op (add optdisp (add abase (mul indx (sll (const 1) scale))))
802
                 st_src)
803
         ()
804
    )
805
  )
806
)
807
 
808
(store-op "" OPCODE_92 st-expr)
809
(store-op "ob" OPCODE_82 stob-expr)
810
(store-op "os" OPCODE_8A stos-expr)
811
(store-op "l" OPCODE_9A stl-expr)
812
(store-op "t" OPCODE_A2 stt-expr)
813
(store-op "q" OPCODE_B2 stq-expr)
814
 
815
; ??? Incomplete, does not set condition code register.
816
 
817
; ??? Without these functions, I end up with a call to the undefined
818
; function EQUSI, because br_lit1 is an unsigned field.  Should be a better
819
; way to solve this.
820
 
821
(define-pmacro (eq-expr expr1 expr2) (eq WI expr1 expr2))
822
(define-pmacro (ne-expr expr1 expr2) (ne WI expr1 expr2))
823
(define-pmacro (ltu-expr expr1 expr2) (ltu UWI expr1 expr2))
824
(define-pmacro (leu-expr expr1 expr2) (leu UWI expr1 expr2))
825
(define-pmacro (gtu-expr expr1 expr2) (gtu UWI expr1 expr2))
826
(define-pmacro (geu-expr expr1 expr2) (geu UWI expr1 expr2))
827
(define-pmacro (lt-expr expr1 expr2) (lt WI expr1 expr2))
828
(define-pmacro (le-expr expr1 expr2) (le WI expr1 expr2))
829
(define-pmacro (gt-expr expr1 expr2) (gt WI expr1 expr2))
830
(define-pmacro (ge-expr expr1 expr2) (ge WI expr1 expr2))
831
 
832
; ??? Does not handle shifts greater than 32 correctly.
833
 
834
(define-pmacro (bbc-expr expr1 expr2)
835
  (eq WI (and (sll (const 1) expr1) expr2) (const 0)))
836
(define-pmacro (bbs-expr expr1 expr2)
837
  (ne WI (and (sll (const 1) expr1) expr2) (const 0)))
838
 
839
(define-pmacro (cmp-op mnemonic opcode-op sem-op)
840
  (begin
841
    (dni (.sym mnemonic -reg)
842
         (.str mnemonic " reg")
843
         ()
844
         (.str mnemonic " $br_src1, $br_src2, $br_disp")
845
         (+ opcode-op br_src1 br_src2 BR_M1_0 br_disp BR_ZERO_0)
846
         (if (sem-op br_src1 br_src2) (set pc br_disp))
847
         ()
848
    )
849
    (dni (.sym mnemonic -lit)
850
         (.str mnemonic " lit")
851
         ()
852
         (.str mnemonic " $br_lit1, $br_src2, $br_disp")
853
         (+ opcode-op br_lit1 br_src2 BR_M1_1 br_disp BR_ZERO_0)
854
         (if (sem-op br_lit1 br_src2) (set pc br_disp))
855
         ()
856
    )
857
  )
858
)
859
 
860
(cmp-op "cmpobe" OPCODE_32 eq-expr)
861
(cmp-op "cmpobne" OPCODE_35 ne-expr)
862
(cmp-op "cmpobl" OPCODE_34 ltu-expr)
863
(cmp-op "cmpoble" OPCODE_36 leu-expr)
864
(cmp-op "cmpobg" OPCODE_31 gtu-expr)
865
(cmp-op "cmpobge" OPCODE_33 geu-expr)
866
 
867
(cmp-op "cmpibe" OPCODE_3A eq-expr)
868
(cmp-op "cmpibne" OPCODE_3D ne-expr)
869
(cmp-op "cmpibl" OPCODE_3C lt-expr)
870
(cmp-op "cmpible" OPCODE_3E le-expr)
871
(cmp-op "cmpibg" OPCODE_39 gt-expr)
872
(cmp-op "cmpibge" OPCODE_3B ge-expr)
873
 
874
(cmp-op "bbc" OPCODE_30 bbc-expr)
875
(cmp-op "bbs" OPCODE_37 bbs-expr)
876
 
877
; ??? This is a near copy of alu-op, but without the dst field.
878
; ??? Should create fake operands instead of using h-cc.
879
; ??? M3 can be either 0 or 1.  We only handle a value of 1 here.
880
 
881
; ??? The else clause if not optional.
882
 
883
(define-pmacro (cmpi-expr expr1 expr2)
884
  (cond WI
885
   ((lt WI expr1 expr2) (const 4))
886
   ((eq WI expr1 expr2) (const 2))
887
   ; gt: WI
888
   (else (const 1))))
889
(define-pmacro (cmpo-expr expr1 expr2)
890
  (cond WI
891
   ((ltu UWI expr1 expr2) (const 4))
892
   ((eq  WI expr1 expr2) (const 2))
893
   ; gtu: UWI
894
   (else (const 1))))
895
 
896
(define-pmacro (cc-op mnemonic opcode-op opcode2-op sem-op)
897
  (begin
898
    (dni mnemonic
899
         (.str mnemonic " reg/reg")
900
         ()
901
         (.str mnemonic " $src1, $src2")
902
         (+ opcode-op dst src2 M3_1 M2_0 M1_0 opcode2-op ZERO_0 src1)
903
         (set (reg h-cc 0) (sem-op src1 src2))
904
         ()
905
    )
906
    (dni (.sym mnemonic "1")
907
         (.str mnemonic " lit/reg")
908
         ()
909
         (.str mnemonic " $lit1, $src2")
910
         (+ opcode-op dst src2 M3_1 M2_0 M1_1 opcode2-op ZERO_0 lit1)
911
         (set (reg h-cc 0) (sem-op lit1 src2))
912
         ()
913
    )
914
    (dni (.sym mnemonic "2")
915
         (.str mnemonic " reg/lit")
916
         ()
917
         (.str mnemonic " $src1, $lit2")
918
         (+ opcode-op dst lit2 M3_1 M2_1 M1_0 opcode2-op ZERO_0 src1)
919
         (set (reg h-cc 0) (sem-op src1 lit2))
920
         ()
921
    )
922
    (dni (.sym mnemonic "3")
923
         (.str mnemonic " lit/lit")
924
         ()
925
         (.str mnemonic " $lit1, $lit2")
926
         (+ opcode-op dst lit2 M3_1 M2_1 M1_1 opcode2-op ZERO_0 lit1)
927
         (set (reg h-cc 0) (sem-op lit1 lit2))
928
         ()
929
    )
930
  )
931
)
932
 
933
(cc-op "cmpi" OPCODE_5A OPCODE2_1 cmpi-expr)
934
(cc-op "cmpo" OPCODE_5A OPCODE2_0 cmpo-expr)
935
 
936
; ??? The M1 field should be ignored.
937
 
938
(define-pmacro (testno-expr)
939
  (eq WI (reg h-cc 0) (const 0)))
940
(define-pmacro (testg-expr)
941
  (ne WI (and (reg h-cc 0) (const 1)) (const 0)))
942
(define-pmacro (teste-expr)
943
  (ne WI (and (reg h-cc 0) (const 2)) (const 0)))
944
(define-pmacro (testge-expr)
945
  (ne WI (and (reg h-cc 0) (const 3)) (const 0)))
946
(define-pmacro (testl-expr)
947
  (ne WI (and (reg h-cc 0) (const 4)) (const 0)))
948
(define-pmacro (testne-expr)
949
  (ne WI (and (reg h-cc 0) (const 5)) (const 0)))
950
(define-pmacro (testle-expr)
951
  (ne WI (and (reg h-cc 0) (const 6)) (const 0)))
952
(define-pmacro (testo-expr)
953
  (ne WI (and (reg h-cc 0) (const 7)) (const 0)))
954
 
955
 
956
(define-pmacro (test-op mnemonic opcode-op sem-op)
957
  (dni (.sym mnemonic -reg)
958
       (.str mnemonic " reg")
959
       ()
960
       (.str mnemonic " $br_src1")
961
       (+ opcode-op br_src1 br_src2 BR_M1_0 br_disp BR_ZERO_0)
962
       (set br_src1 (sem-op))
963
       ()
964
  )
965
)
966
 
967
(test-op "testno" OPCODE_20 testno-expr)
968
(test-op "testg" OPCODE_21 testg-expr)
969
(test-op "teste" OPCODE_22 teste-expr)
970
(test-op "testge" OPCODE_23 testge-expr)
971
(test-op "testl" OPCODE_24 testl-expr)
972
(test-op "testne" OPCODE_25 testne-expr)
973
(test-op "testle" OPCODE_26 testle-expr)
974
(test-op "testo" OPCODE_27 testo-expr)
975
 
976
(define-pmacro (branch-op mnemonic opcode-op sem-op)
977
  (dni (.sym mnemonic) (.str mnemonic)
978
       ()
979
       (.str mnemonic " $ctrl_disp")
980
       (+ opcode-op ctrl_disp CTRL_ZERO_0)
981
       (if (sem-op) (set pc ctrl_disp))
982
       ()
983
  )
984
)
985
 
986
(branch-op "bno" OPCODE_10 testno-expr)
987
(branch-op "bg" OPCODE_11 testg-expr)
988
(branch-op "be" OPCODE_12 teste-expr)
989
(branch-op "bge" OPCODE_13 testge-expr)
990
(branch-op "bl" OPCODE_14 testl-expr)
991
(branch-op "bne" OPCODE_15 testne-expr)
992
(branch-op "ble" OPCODE_16 testle-expr)
993
(branch-op "bo" OPCODE_17 testo-expr)
994
 
995
(dni b "b"
996
     ()
997
     "b $ctrl_disp"
998
     (+ OPCODE_08 ctrl_disp CTRL_ZERO_0)
999
     (set pc ctrl_disp)
1000
     ()
1001
)
1002
 
1003
; ??? Incomplete.  Only handles 5 of 10 addressing modes.
1004
; Should be a macro.
1005
 
1006
(dni bx-indirect-offset "bx-indirect-offset"
1007
     ()
1008
     "bx $offset($abase)"
1009
     (+ OPCODE_84 dst abase MODEA_INDIRECT-OFFSET ZEROA_0 offset)
1010
     (set pc (add offset abase))
1011
     ()
1012
)
1013
 
1014
(dni bx-indirect "bx-indirect"
1015
     ()
1016
     "bx ($abase)"
1017
     (+ OPCODE_84 dst abase MODEB_INDIRECT scale ZEROB_0 indx)
1018
     (set pc abase)
1019
     ()
1020
)
1021
 
1022
(dni bx-indirect-index "bx-indirect-index"
1023
     ()
1024
     "bx ($abase)[$indx*S$scale]"
1025
     (+ OPCODE_84 dst abase MODEB_INDIRECT-INDEX scale ZEROB_0 indx)
1026
     (set pc (add abase (mul indx (sll (const 1) scale))))
1027
     ()
1028
)
1029
 
1030
(dni bx-disp "bx-disp"
1031
     ()
1032
     "bx $optdisp"
1033
     (+ OPCODE_84 dst abase MODEB_DISP scale ZEROB_0 indx optdisp)
1034
     (set pc optdisp)
1035
     ()
1036
)
1037
 
1038
(dni bx-indirect-disp "bx-indirect-disp"
1039
     ()
1040
     "bx $optdisp($abase)"
1041
     (+ OPCODE_84 dst abase MODEB_INDIRECT-DISP scale ZEROB_0 indx optdisp)
1042
     (set pc (add optdisp abase))
1043
     ()
1044
)
1045
 
1046
; ??? Incomplete.  Only handles 3 of 10 addressing modes.  Only handles
1047
; one local register set.
1048
 
1049
; ??? If we don't want all of the set-quiet calls, then we need to increase
1050
; SIZE_TRACE_BUF in sim/common/cgen-trace.c.
1051
 
1052
(dni callx-disp "callx-disp"
1053
     ()
1054
     "callx $optdisp"
1055
     (+ OPCODE_86 dst abase MODEB_DISP scale ZEROB_0 indx optdisp)
1056
     (sequence ((WI temp))
1057
               (set temp (and (add (reg h-gr 1) (const 63)) (inv (const 63))))
1058
               ; ??? This doesn't seem right.  Why do I have to add 8?.
1059
               (set (reg h-gr 2) (add pc (const 8)))
1060
               ; Save current local reg set on stack.
1061
               (set-quiet (mem WI (add (reg h-gr 31) (const 0)))
1062
                          (reg h-gr 0))
1063
               (set-quiet (mem WI (add (reg h-gr 31) (const 4)))
1064
                          (reg h-gr 1))
1065
               (set-quiet (mem WI (add (reg h-gr 31) (const 8)))
1066
                          (reg h-gr 2))
1067
               (set-quiet (mem WI (add (reg h-gr 31) (const 12)))
1068
                          (reg h-gr 3))
1069
               (set-quiet (mem WI (add (reg h-gr 31) (const 16)))
1070
                          (reg h-gr 4))
1071
               (set-quiet (mem WI (add (reg h-gr 31) (const 20)))
1072
                          (reg h-gr 5))
1073
               (set-quiet (mem WI (add (reg h-gr 31) (const 24)))
1074
                          (reg h-gr 6))
1075
               (set-quiet (mem WI (add (reg h-gr 31) (const 28)))
1076
                          (reg h-gr 7))
1077
               (set-quiet (mem WI (add (reg h-gr 31) (const 32)))
1078
                          (reg h-gr 8))
1079
               (set-quiet (mem WI (add (reg h-gr 31) (const 36)))
1080
                          (reg h-gr 9))
1081
               (set-quiet (mem WI (add (reg h-gr 31) (const 40)))
1082
                          (reg h-gr 10))
1083
               (set-quiet (mem WI (add (reg h-gr 31) (const 44)))
1084
                          (reg h-gr 11))
1085
               (set-quiet (mem WI (add (reg h-gr 31) (const 48)))
1086
                          (reg h-gr 12))
1087
               (set-quiet (mem WI (add (reg h-gr 31) (const 52)))
1088
                          (reg h-gr 13))
1089
               (set-quiet (mem WI (add (reg h-gr 31) (const 56)))
1090
                          (reg h-gr 14))
1091
               (set-quiet (mem WI (add (reg h-gr 31) (const 60)))
1092
                          (reg h-gr 15))
1093
               (set pc optdisp)
1094
               ; Allocate new local reg set.
1095
               (set-quiet (reg h-gr 0) (const #xDEADBEEF))
1096
               (set-quiet (reg h-gr 1) (const #xDEADBEEF))
1097
               (set-quiet (reg h-gr 2) (const #xDEADBEEF))
1098
               (set-quiet (reg h-gr 3) (const #xDEADBEEF))
1099
               (set-quiet (reg h-gr 4) (const #xDEADBEEF))
1100
               (set-quiet (reg h-gr 5) (const #xDEADBEEF))
1101
               (set-quiet (reg h-gr 6) (const #xDEADBEEF))
1102
               (set-quiet (reg h-gr 7) (const #xDEADBEEF))
1103
               (set-quiet (reg h-gr 8) (const #xDEADBEEF))
1104
               (set-quiet (reg h-gr 9) (const #xDEADBEEF))
1105
               (set-quiet (reg h-gr 10) (const #xDEADBEEF))
1106
               (set-quiet (reg h-gr 11) (const #xDEADBEEF))
1107
               (set-quiet (reg h-gr 12) (const #xDEADBEEF))
1108
               (set-quiet (reg h-gr 13) (const #xDEADBEEF))
1109
               (set-quiet (reg h-gr 14) (const #xDEADBEEF))
1110
               (set-quiet (reg h-gr 15) (const #xDEADBEEF))
1111
               (set (reg h-gr 0) (reg h-gr 31))
1112
               (set (reg h-gr 31) temp)
1113
               (set (reg h-gr 1) (add temp (const 64))))
1114
     ()
1115
)
1116
 
1117
; ??? This should be macro-ized somehow.
1118
 
1119
; ??? This adds 4 to pc.  The above pattern adds 8.
1120
 
1121
(dni callx-indirect "callx-indirect"
1122
     ()
1123
     "callx ($abase)"
1124
     (+ OPCODE_86 dst abase MODEB_INDIRECT scale ZEROB_0 indx)
1125
     (sequence ((WI temp))
1126
               (set temp (and (add (reg h-gr 1) (const 63)) (inv (const 63))))
1127
               ; ??? This doesn't seem right.  Why do I have to add 4?.
1128
               (set (reg h-gr 2) (add pc (const 4)))
1129
               ; Save current local reg set on stack.
1130
               (set-quiet (mem WI (add (reg h-gr 31) (const 0)))
1131
                          (reg h-gr 0))
1132
               (set-quiet (mem WI (add (reg h-gr 31) (const 4)))
1133
                          (reg h-gr 1))
1134
               (set-quiet (mem WI (add (reg h-gr 31) (const 8)))
1135
                          (reg h-gr 2))
1136
               (set-quiet (mem WI (add (reg h-gr 31) (const 12)))
1137
                          (reg h-gr 3))
1138
               (set-quiet (mem WI (add (reg h-gr 31) (const 16)))
1139
                          (reg h-gr 4))
1140
               (set-quiet (mem WI (add (reg h-gr 31) (const 20)))
1141
                          (reg h-gr 5))
1142
               (set-quiet (mem WI (add (reg h-gr 31) (const 24)))
1143
                          (reg h-gr 6))
1144
               (set-quiet (mem WI (add (reg h-gr 31) (const 28)))
1145
                          (reg h-gr 7))
1146
               (set-quiet (mem WI (add (reg h-gr 31) (const 32)))
1147
                          (reg h-gr 8))
1148
               (set-quiet (mem WI (add (reg h-gr 31) (const 36)))
1149
                          (reg h-gr 9))
1150
               (set-quiet (mem WI (add (reg h-gr 31) (const 40)))
1151
                          (reg h-gr 10))
1152
               (set-quiet (mem WI (add (reg h-gr 31) (const 44)))
1153
                          (reg h-gr 11))
1154
               (set-quiet (mem WI (add (reg h-gr 31) (const 48)))
1155
                          (reg h-gr 12))
1156
               (set-quiet (mem WI (add (reg h-gr 31) (const 52)))
1157
                          (reg h-gr 13))
1158
               (set-quiet (mem WI (add (reg h-gr 31) (const 56)))
1159
                          (reg h-gr 14))
1160
               (set-quiet (mem WI (add (reg h-gr 31) (const 60)))
1161
                          (reg h-gr 15))
1162
               ; We do this first, because abase might be a local reg.
1163
               (set pc abase)
1164
               ; Allocate new local reg set.
1165
               (set-quiet (reg h-gr 0) (const #xDEADBEEF))
1166
               (set-quiet (reg h-gr 1) (const #xDEADBEEF))
1167
               (set-quiet (reg h-gr 2) (const #xDEADBEEF))
1168
               (set-quiet (reg h-gr 3) (const #xDEADBEEF))
1169
               (set-quiet (reg h-gr 4) (const #xDEADBEEF))
1170
               (set-quiet (reg h-gr 5) (const #xDEADBEEF))
1171
               (set-quiet (reg h-gr 6) (const #xDEADBEEF))
1172
               (set-quiet (reg h-gr 7) (const #xDEADBEEF))
1173
               (set-quiet (reg h-gr 8) (const #xDEADBEEF))
1174
               (set-quiet (reg h-gr 9) (const #xDEADBEEF))
1175
               (set-quiet (reg h-gr 10) (const #xDEADBEEF))
1176
               (set-quiet (reg h-gr 11) (const #xDEADBEEF))
1177
               (set-quiet (reg h-gr 12) (const #xDEADBEEF))
1178
               (set-quiet (reg h-gr 13) (const #xDEADBEEF))
1179
               (set-quiet (reg h-gr 14) (const #xDEADBEEF))
1180
               (set-quiet (reg h-gr 15) (const #xDEADBEEF))
1181
               (set (reg h-gr 0) (reg h-gr 31))
1182
               (set (reg h-gr 31) temp)
1183
               (set (reg h-gr 1) (add temp (const 64))))
1184
     ()
1185
)
1186
 
1187
; ??? This adds 4 to pc.
1188
 
1189
; ??? This should be macro-ized somehow.
1190
 
1191
(dni callx-indirect-offset "callx-indirect-offset"
1192
     ()
1193
     "callx $offset($abase)"
1194
     (+ OPCODE_86 dst abase MODEA_INDIRECT-OFFSET ZEROA_0 offset)
1195
     (sequence ((WI temp))
1196
               (set temp (and (add (reg h-gr 1) (const 63)) (inv (const 63))))
1197
               ; ??? This doesn't seem right.  Why do I have to add 4?.
1198
               (set (reg h-gr 2) (add pc (const 4)))
1199
               ; Save current local reg set on stack.
1200
               (set-quiet (mem WI (add (reg h-gr 31) (const 0)))
1201
                          (reg h-gr 0))
1202
               (set-quiet (mem WI (add (reg h-gr 31) (const 4)))
1203
                          (reg h-gr 1))
1204
               (set-quiet (mem WI (add (reg h-gr 31) (const 8)))
1205
                          (reg h-gr 2))
1206
               (set-quiet (mem WI (add (reg h-gr 31) (const 12)))
1207
                          (reg h-gr 3))
1208
               (set-quiet (mem WI (add (reg h-gr 31) (const 16)))
1209
                          (reg h-gr 4))
1210
               (set-quiet (mem WI (add (reg h-gr 31) (const 20)))
1211
                          (reg h-gr 5))
1212
               (set-quiet (mem WI (add (reg h-gr 31) (const 24)))
1213
                          (reg h-gr 6))
1214
               (set-quiet (mem WI (add (reg h-gr 31) (const 28)))
1215
                          (reg h-gr 7))
1216
               (set-quiet (mem WI (add (reg h-gr 31) (const 32)))
1217
                          (reg h-gr 8))
1218
               (set-quiet (mem WI (add (reg h-gr 31) (const 36)))
1219
                          (reg h-gr 9))
1220
               (set-quiet (mem WI (add (reg h-gr 31) (const 40)))
1221
                          (reg h-gr 10))
1222
               (set-quiet (mem WI (add (reg h-gr 31) (const 44)))
1223
                          (reg h-gr 11))
1224
               (set-quiet (mem WI (add (reg h-gr 31) (const 48)))
1225
                          (reg h-gr 12))
1226
               (set-quiet (mem WI (add (reg h-gr 31) (const 52)))
1227
                          (reg h-gr 13))
1228
               (set-quiet (mem WI (add (reg h-gr 31) (const 56)))
1229
                          (reg h-gr 14))
1230
               (set-quiet (mem WI (add (reg h-gr 31) (const 60)))
1231
                          (reg h-gr 15))
1232
               ; We do this first, because abase might be a local reg.
1233
               (set pc (add offset abase))
1234
               ; Allocate new local reg set.
1235
               (set-quiet (reg h-gr 0) (const #xDEADBEEF))
1236
               (set-quiet (reg h-gr 1) (const #xDEADBEEF))
1237
               (set-quiet (reg h-gr 2) (const #xDEADBEEF))
1238
               (set-quiet (reg h-gr 3) (const #xDEADBEEF))
1239
               (set-quiet (reg h-gr 4) (const #xDEADBEEF))
1240
               (set-quiet (reg h-gr 5) (const #xDEADBEEF))
1241
               (set-quiet (reg h-gr 6) (const #xDEADBEEF))
1242
               (set-quiet (reg h-gr 7) (const #xDEADBEEF))
1243
               (set-quiet (reg h-gr 8) (const #xDEADBEEF))
1244
               (set-quiet (reg h-gr 9) (const #xDEADBEEF))
1245
               (set-quiet (reg h-gr 10) (const #xDEADBEEF))
1246
               (set-quiet (reg h-gr 11) (const #xDEADBEEF))
1247
               (set-quiet (reg h-gr 12) (const #xDEADBEEF))
1248
               (set-quiet (reg h-gr 13) (const #xDEADBEEF))
1249
               (set-quiet (reg h-gr 14) (const #xDEADBEEF))
1250
               (set-quiet (reg h-gr 15) (const #xDEADBEEF))
1251
               (set (reg h-gr 0) (reg h-gr 31))
1252
               (set (reg h-gr 31) temp)
1253
               (set (reg h-gr 1) (add temp (const 64))))
1254
     ()
1255
)
1256
 
1257
; ??? Incomplete.  Does not handle return status in PFP.
1258
 
1259
(dni ret "ret"
1260
     ()
1261
     "ret"
1262
     (+ OPCODE_0A ctrl_disp CTRL_ZERO_0)
1263
     (sequence ()
1264
               (set (reg h-gr 31) (reg h-gr 0))
1265
               (set-quiet (reg h-gr 0)
1266
                          (mem WI (add (reg h-gr 31) (const 0))))
1267
               (set-quiet (reg h-gr 1)
1268
                          (mem WI (add (reg h-gr 31) (const 4))))
1269
               (set-quiet (reg h-gr 2)
1270
                          (mem WI (add (reg h-gr 31) (const 8))))
1271
               (set-quiet (reg h-gr 3)
1272
                          (mem WI (add (reg h-gr 31) (const 12))))
1273
               (set-quiet (reg h-gr 4)
1274
                          (mem WI (add (reg h-gr 31) (const 16))))
1275
               (set-quiet (reg h-gr 5)
1276
                          (mem WI (add (reg h-gr 31) (const 20))))
1277
               (set-quiet (reg h-gr 6)
1278
                          (mem WI (add (reg h-gr 31) (const 24))))
1279
               (set-quiet (reg h-gr 7)
1280
                          (mem WI (add (reg h-gr 31) (const 28))))
1281
               (set-quiet (reg h-gr 8)
1282
                          (mem WI (add (reg h-gr 31) (const 32))))
1283
               (set-quiet (reg h-gr 9)
1284
                          (mem WI (add (reg h-gr 31) (const 36))))
1285
               (set-quiet (reg h-gr 10)
1286
                          (mem WI (add (reg h-gr 31) (const 40))))
1287
               (set-quiet (reg h-gr 11)
1288
                          (mem WI (add (reg h-gr 31) (const 44))))
1289
               (set-quiet (reg h-gr 12)
1290
                          (mem WI (add (reg h-gr 31) (const 48))))
1291
               (set-quiet (reg h-gr 13)
1292
                          (mem WI (add (reg h-gr 31) (const 52))))
1293
               (set-quiet (reg h-gr 14)
1294
                          (mem WI (add (reg h-gr 31) (const 56))))
1295
               (set-quiet (reg h-gr 15)
1296
                          (mem WI (add (reg h-gr 31) (const 60))))
1297
               (set pc (reg h-gr 2)))
1298
     ()
1299
)
1300
 
1301
; ??? Incomplete, does not do any system operations.
1302
 
1303
; ??? Should accept either reg or lit for src1.
1304
 
1305
; ??? M3/M2 should not matter.
1306
 
1307
(dni calls "calls"
1308
     ()
1309
     "calls $src1"
1310
     (+ OPCODE_66 dst src2 M3_1 M2_1 M1_0 OPCODE2_0 ZERO_0 src1)
1311
     (set WI pc (c-call WI "i960_trap" pc src1))
1312
     ()
1313
)
1314
 
1315
; ??? Incomplete, does not do any system operations.
1316
 
1317
; ??? M3/M2/M1 should not matter.
1318
 
1319
(dni fmark "fmark"
1320
     ()
1321
     "fmark"
1322
     (+ OPCODE_66 dst src2 M3_1 M2_1 M1_1 OPCODE2_C ZERO_0 src1)
1323
     (set WI pc (c-call WI "i960_breakpoint" pc))
1324
     ()
1325
)
1326
 
1327
; ??? Incomplete.  This doesn't actually have to do anything, because we
1328
; currently support only one set of local registers.
1329
 
1330
; ??? The settings of the M1/2/3 bits shouldn't matter.
1331
 
1332
(dni flushreg "flushreg"
1333
     ()
1334
     "flushreg"
1335
     (+ OPCODE_66 dst src2 M3_1 M2_1 M1_1 OPCODE2_D ZERO_0 src1)
1336
     (nop)
1337
     ()
1338
)

powered by: WebSVN 2.1.0

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