Remove support for the (deprecated) openrisc and or32 configurations and replace
[external/binutils.git] / cpu / or1korbis.cpu
1 ; OpenRISC Basic Instruction Set 32-bit (ORBIS)  -*- Scheme -*-
2 ; Copyright 2000-2014 Free Software Foundation, Inc.
3 ; Contributed for OR32 by Johan Rydberg, jrydberg@opencores.org
4 ; Modified by Julius Baxter, juliusbaxter@gmail.com
5 ; Modified by Peter Gavin, pgavin@gmail.com
6 ;
7 ; This program is free software; you can redistribute it and/or modify
8 ; it under the terms of the GNU General Public License as published by
9 ; the Free Software Foundation; either version 3 of the License, or
10 ; (at your option) any later version.
11 ;
12 ; This program is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ; GNU General Public License for more details.
16 ;
17 ; You should have received a copy of the GNU General Public License
18 ; along with this program; if not, see <http://www.gnu.org/licenses/>
19
20 ; Instruction fields.
21
22 ; Hardware for immediate operands
23 (dnh h-simm16      "16-bit signed immediate"   ((MACH ORBIS-MACHS)) (immediate (INT 16)) () () ())
24 (dnh h-uimm16      "16-bit unsigned immediate" ()                   (immediate (UINT 16)) () () ())
25 (dnh h-uimm6       "6-bit unsigned immediate"  ()                   (immediate (UINT 6)) () () ())
26
27 ; Instruction classes.
28 (dnf f-opcode      "insn opcode"               ((MACH ORBIS-MACHS)) 31 6)
29
30 ; Register fields.
31 (dnf f-r1          "r1"                        ((MACH ORBIS-MACHS)) 25 5)
32 (dnf f-r2          "r2"                        ((MACH ORBIS-MACHS)) 20 5)
33 (dnf f-r3          "r3"                        ((MACH ORBIS-MACHS)) 15 5)
34
35 ; Sub fields
36 (dnf f-op-25-2     "op-25-2"                   ((MACH ORBIS-MACHS)) 25 2) ;; nop
37 (dnf f-op-25-5     "op-25-5"                   ((MACH ORBIS-MACHS)) 25 5) ;; sys, trap, *sync, sf*
38 (dnf f-op-16-1     "op-16-1"                   ((MACH ORBIS-MACHS)) 16 1) ;; movhi,macrc
39 (dnf f-op-7-4      "op-7-4"                    ((MACH ORBIS-MACHS)) 7 4)
40 (dnf f-op-3-4      "op-3-4"                    ((MACH ORBIS-MACHS)) 3 4)
41 (dnf f-op-9-2      "op-9-2"                    ((MACH ORBIS-MACHS)) 9 2) ;; alu ops upper opcode
42 (dnf f-op-9-4      "op-9-4"                    ((MACH ORBIS-MACHS)) 9 4) ;;
43 (dnf f-op-7-8      "op-7-8"                    ((MACH ORBIS-MACHS)) 7 8)
44 (dnf f-op-7-2      "op-7-2"                    ((MACH ORBIS-MACHS)) 7 2) ;; alu lower upper opc,shroti
45
46 ; Reserved fields
47 (dnf f-resv-25-26  "resv-25-26"                ((MACH ORBIS-MACHS) RESERVED) 25 26)
48 (dnf f-resv-25-10  "resv-25-10"                ((MACH ORBIS-MACHS) RESERVED) 25 10)
49 (dnf f-resv-25-5   "resv-25-5"                 ((MACH ORBIS-MACHS) RESERVED) 25 5)
50 (dnf f-resv-23-8   "resv-23-8"                 ((MACH ORBIS-MACHS) RESERVED) 23 8)
51 (dnf f-resv-20-5   "resv-20-5"                 ((MACH ORBIS-MACHS) RESERVED) 20 5)
52 (dnf f-resv-20-4   "resv-20-4"                 ((MACH ORBIS-MACHS) RESERVED) 20 4)
53 (dnf f-resv-15-8   "resv-15-8"                 ((MACH ORBIS-MACHS) RESERVED) 15 8)
54 (dnf f-resv-15-6   "resv-15-6"                 ((MACH ORBIS-MACHS) RESERVED) 15 6)
55 (dnf f-resv-10-11  "resv-10-11"                ((MACH ORBIS-MACHS) RESERVED) 10 11)
56 (dnf f-resv-10-7   "resv-10-7"                 ((MACH ORBIS-MACHS) RESERVED) 10 7)
57 (dnf f-resv-10-3   "resv-10-3"                 ((MACH ORBIS-MACHS) RESERVED) 10 3)
58 (dnf f-resv-10-1   "resv-10-1"                 ((MACH ORBIS-MACHS) RESERVED) 10 1)
59 (dnf f-resv-7-4    "resv-7-4"                  ((MACH ORBIS-MACHS) RESERVED) 7 4)
60 (dnf f-resv-5-2    "resv-5-2"                  ((MACH ORBIS-MACHS) RESERVED) 5 2)
61
62 (dnf f-imm16-25-5  "imm16-25-5"                ((MACH ORBIS-MACHS)) 25  5)
63 (dnf f-imm16-10-11 "imm16-10-11"               ((MACH ORBIS-MACHS)) 10 11)
64
65 ; PC relative, 26-bit (2 shifted to right)
66 (df f-disp26
67     "disp26"
68     ((MACH ORBIS-MACHS) PCREL-ADDR)
69     25
70     26
71     INT
72     ((value pc) (sra SI (sub IAI value pc) (const 2)))
73     ((value pc) (add IAI (sll IAI value (const 2)) pc))
74     )
75
76 ; Immediates.
77 (dnf f-uimm16    "uimm16"                      ((MACH ORBIS-MACHS))          15 16)
78 (df  f-simm16    "simm16"                      ((MACH ORBIS-MACHS) SIGN-OPT) 15 16 INT #f #f)
79 (dnf f-uimm6     "uimm6"                       ((MACH ORBIS-MACHS))          5  6) ;; shroti
80
81 (define-multi-ifield
82   (name f-uimm16-split)
83   (comment "16-bit split unsigned immediate")
84   (attrs (MACH ORBIS-MACHS))
85   (mode UINT)
86   (subfields f-imm16-25-5 f-imm16-10-11)
87   (insert (sequence ()
88                     (set (ifield f-imm16-25-5)
89                          (and (srl (ifield f-uimm16-split)
90                                    (const 11))
91                               (const #x1f)))
92                     (set (ifield f-imm16-10-11)
93                          (and (ifield f-uimm16-split)
94                               (const #x7ff)))))
95   (extract 
96            (set (ifield f-uimm16-split)
97                 (trunc UHI
98                        (or (sll (ifield f-imm16-25-5)
99                                 (const 11))
100                            (ifield f-imm16-10-11)))))
101   )
102
103 (define-multi-ifield
104   (name f-simm16-split)
105   (comment "16-bit split signed immediate")
106   (attrs (MACH ORBIS-MACHS) SIGN-OPT)
107   (mode INT)
108   (subfields f-imm16-25-5 f-imm16-10-11)
109   (insert (sequence ()
110                     (set (ifield f-imm16-25-5)
111                          (and (sra (ifield f-simm16-split)
112                                    (const 11))
113                               (const #x1f)))
114                     (set (ifield f-imm16-10-11)
115                          (and (ifield f-simm16-split)
116                               (const #x7ff)))))
117   (extract 
118            (set (ifield f-simm16-split)
119                 (trunc HI
120                        (or (sll (ifield f-imm16-25-5)
121                                 (const 11))
122                            (ifield f-imm16-10-11)))))
123   )
124
125 ; Enums.
126
127 ; insn-opcode: bits 31-26
128 (define-normal-insn-enum 
129   insn-opcode "insn main opcode enums" ((MACH ORBIS-MACHS)) OPC_ f-opcode
130   (("J"            #x00)
131    ("JAL"          #x01)
132    ("BNF"          #x03)
133    ("BF"           #x04)
134    ("NOP"          #x05)
135    ("MOVHIMACRC"   #x06)
136    ("SYSTRAPSYNCS" #x08)
137    ("RFE"          #x09)
138    ("VECTOR"       #x0a)
139    ("JR"           #x11)
140    ("JALR"         #x12)
141    ("MACI"         #x13)
142    ("CUST1"        #x1c)
143    ("CUST2"        #x1d)
144    ("CUST3"        #x1e)
145    ("CUST4"        #x1f)
146    ("LD"           #x20)
147    ("LWZ"          #x21)
148    ("LWS"          #x22)
149    ("LBZ"          #x23)
150    ("LBS"          #x24)
151    ("LHZ"          #x25)
152    ("LHS"          #x26)
153    ("ADDI"         #x27)
154    ("ADDIC"        #x28)
155    ("ANDI"         #x29)
156    ("ORI"          #x2a)
157    ("XORI"         #x2b)
158    ("MULI"         #x2c)
159    ("MFSPR"        #x2d)
160    ("SHROTI"       #x2e)
161    ("SFI"          #x2f)
162    ("MTSPR"        #x30)
163    ("MAC"          #x31)
164    ("FLOAT"        #x32)
165    ("SD"           #x34)
166    ("SW"           #x35)
167    ("SB"           #x36)
168    ("SH"           #x37)
169    ("ALU"          #x38)
170    ("SF"           #x39)
171    ("CUST5"        #x3c)
172    ("CUST6"        #x3d)
173    ("CUST7"        #x3e)
174    ("CUST8"        #x3f) 
175   )
176 )
177
178 (define-normal-insn-enum insn-opcode-systrapsyncs 
179   "systrapsync insn opcode enums" ((MACH ORBIS-MACHS)) 
180   OPC_SYSTRAPSYNCS_ f-op-25-5
181     (("SYSCALL" #x00 )
182      ("TRAP" #x08 )
183      ("MSYNC" #x10 )
184      ("PSYNC" #x14 )
185      ("CSYNC" #x18 )
186     )
187 )
188
189 (define-normal-insn-enum insn-opcode-movehimacrc
190   "movhi/macrc insn opcode enums" ((MACH ORBIS-MACHS))
191   OPC_MOVHIMACRC_ f-op-16-1
192   (("MOVHI" #x0)
193    ("MACRC" #x1)
194   )
195 )
196
197 (define-normal-insn-enum insn-opcode-mac
198   "multiply/accumulate insn opcode enums" ((MACH ORBIS-MACHS))
199   OPC_MAC_ f-op-3-4
200   (("MAC" #x1)
201    ("MSB" #x2)
202    )
203   )
204
205 (define-normal-insn-enum insn-opcode-shorts 
206   "shift/rotate insn opcode enums" ((MACH ORBIS-MACHS))
207   OPC_SHROTS_ f-op-7-2
208     (("SLL" #x0 )
209      ("SRL" #x1 )
210      ("SRA" #x2 )
211      ("ROR" #x3 )
212     )
213 )
214
215 (define-normal-insn-enum insn-opcode-extbhs
216   "extend byte/half opcode enums" ((MACH ORBIS-MACHS))
217   OPC_EXTBHS_ f-op-9-4
218   (("EXTHS" #x0)
219    ("EXTBS" #x1)
220    ("EXTHZ" #x2)
221    ("EXTBZ" #x3)
222    )
223 )
224
225 (define-normal-insn-enum insn-opcode-extws
226   "extend word opcode enums" ((MACH ORBIS-MACHS))
227   OPC_EXTWS_ f-op-9-4
228   (("EXTWS" #x0)
229    ("EXTWZ" #x1)
230    )
231 )
232
233 (define-normal-insn-enum insn-opcode-alu-regreg 
234   "alu reg/reg insn opcode enums" ((MACH ORBIS-MACHS))
235   OPC_ALU_REGREG_ f-op-3-4
236   (("ADD"   #x0)
237    ("ADDC"  #x1)
238    ("SUB"   #x2)
239    ("AND"   #x3)
240    ("OR"    #x4)
241    ("XOR"   #x5)
242    ("MUL"   #x6)
243    ("SHROT" #x8)
244    ("DIV"   #x9)
245    ("DIVU"  #xA)
246    ("MULU"  #xB)
247    ("EXTBH" #xC)
248    ("EXTW"  #xD)
249    ("CMOV"  #xE)
250    ("FFL1"  #xF)
251    )
252 )
253
254 (define-normal-insn-enum insn-opcode-setflag
255   "setflag insn opcode enums" ((MACH ORBIS-MACHS))
256   OPC_SF_ f-op-25-5
257     (("EQ"  #x00)
258      ("NE"  #x01)
259      ("GTU" #x02)
260      ("GEU" #x03)
261      ("LTU" #x04)
262      ("LEU" #x05)
263      ("GTS" #x0A)
264      ("GES" #x0B)
265      ("LTS" #x0C)
266      ("LES" #x0D)
267     )
268 )
269
270 \f
271 ; Instruction operands.
272
273 (dnop sys-sr            "supervision register"             ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr            f-nil)
274 (dnop sys-esr0          "exception supervision register 0" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-esr0          f-nil)
275 (dnop sys-epcr0         "exception PC register 0"          ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-epcr0         f-nil)
276
277 (dnop sys-sr-lee        "SR little endian enable bit"      ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-lee        f-nil)
278 (dnop sys-sr-f          "SR flag bit"                      ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-f          f-nil)
279 (dnop sys-sr-cy         "SR carry bit"                     ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-cy         f-nil)
280 (dnop sys-sr-ov         "SR overflow bit"                  ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-ov         f-nil)
281 (dnop sys-sr-ove        "SR overflow exception enable bit" ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-sr-ove        f-nil)
282 (dnop sys-cpucfgr-ob64s "CPUCFGR ORBIS64 supported bit"    ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-cpucfgr-ob64s f-nil)
283 (dnop sys-cpucfgr-nd    "CPUCFGR no delay bit"             ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-cpucfgr-nd    f-nil)
284 (dnop sys-fpcsr-rm      "floating point round mode"        ((MACH ORBIS-MACHS) SEM-ONLY) h-sys-fpcsr-rm      f-nil)
285
286 (dnop mac-machi         "MAC HI result register"           ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-machi         f-nil)
287 (dnop mac-maclo         "MAC LO result register"           ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-maclo         f-nil)
288
289 (dnop uimm6             "uimm6"                            ((MACH ORBIS-MACHS))          h-uimm6             f-uimm6)
290
291 (dnop rD                "destination register"             ((MACH ORBIS-MACHS))          h-gpr               f-r1)
292 (dnop rA                "source register A"                ((MACH ORBIS-MACHS))          h-gpr               f-r2)
293 (dnop rB                "source register B"                ((MACH ORBIS-MACHS))          h-gpr               f-r3)
294
295 (define-operand
296   (name disp26)
297   (comment "pc-rel 26 bit")
298   (attrs (MACH ORBIS-MACHS))
299   (type h-iaddr)
300   (index f-disp26)
301   (handlers (parse "disp26"))
302   )
303
304 (define-operand
305   (name simm16)
306   (comment "16-bit signed immediate")
307   (attrs (MACH ORBIS-MACHS) SIGN-OPT)
308   (type h-simm16)
309   (index f-simm16)
310   (handlers (parse "simm16"))
311   )
312
313 (define-operand
314   (name uimm16)
315   (comment "16-bit unsigned immediate")
316   (attrs (MACH ORBIS-MACHS))
317   (type h-uimm16)
318   (index f-uimm16)
319   (handlers (parse "uimm16"))
320   )
321
322 (define-operand
323   (name simm16-split)
324   (comment "split 16-bit signed immediate")
325   (attrs (MACH ORBIS-MACHS) SIGN-OPT)
326   (type h-simm16)
327   (index f-simm16-split)
328   (handlers (parse "simm16"))
329 )
330
331 (define-operand
332   (name uimm16-split)
333   (comment "split 16-bit unsigned immediate")
334   (attrs (MACH ORBIS-MACHS))
335   (type h-uimm16)
336   (index f-uimm16-split)
337   (handlers (parse "uimm16"))
338 )
339
340 ; Instructions.
341
342 ; Branch releated instructions 
343
344 (define-pmacro (cti-link-return)
345   (set IAI (reg h-gpr 9) (add pc (if sys-cpucfgr-nd 4 8)))
346   )
347 (define-pmacro (cti-transfer-control condition target)
348   ;; this mess is necessary because we're
349   ;; skipping the delay slot, but it's
350   ;; actually the start of the next basic
351   ;; block
352   (sequence ()
353             (if condition
354                 (delay 1 (set IAI pc target))
355                 (if sys-cpucfgr-nd
356                     (delay 1 (set IAI pc (add pc 4))))
357                 )
358             (if sys-cpucfgr-nd
359                 (skip 1)
360                 )
361             )
362   )
363
364 (define-pmacro
365   (define-cti
366     cti-name
367     cti-comment
368     cti-attrs
369     cti-syntax
370     cti-format
371     cti-semantics)
372   (begin
373     (dni
374       cti-name
375       cti-comment
376       (.splice (MACH ORBIS-MACHS) DELAYED-CTI NOT-IN-DELAY-SLOT (.unsplice cti-attrs))
377       cti-syntax
378       cti-format
379       (cti-semantics)
380       ()
381       )
382     )
383   )
384
385 (define-cti
386   l-j
387   "jump (pc-relative iaddr)"
388   (!COND-CTI UNCOND-CTI)
389   "l.j ${disp26}"
390   (+ OPC_J disp26)
391   (.pmacro ()
392            (cti-transfer-control 1 disp26)
393            )
394   )
395
396 (define-cti
397   l-jal
398   "jump and link (pc-relative iaddr)"
399   (!COND-CTI UNCOND-CTI)
400   "l.jal ${disp26}"
401   (+ OPC_JAL disp26)
402   (.pmacro ()
403            (sequence ()
404                      (cti-link-return)
405                      (cti-transfer-control 1 disp26)
406                      )
407            )
408   )
409
410 (define-cti
411   l-jr
412   "jump register (absolute iaddr)"
413   (!COND-CTI UNCOND-CTI)
414   "l.jr $rB"
415   (+ OPC_JR (f-resv-25-10 0) rB (f-resv-10-11 0))
416   (.pmacro ()
417            (cti-transfer-control 1 rB)
418            )
419   )
420
421 (define-cti
422   l-jalr
423   "jump register and link (absolute iaddr)"
424   (!COND-CTI UNCOND-CTI)
425   "l.jalr $rB"
426   (+ OPC_JALR (f-resv-25-10 0) rB (f-resv-10-11 0) )
427   (.pmacro ()
428            (sequence ()
429                      (cti-link-return)
430                      (cti-transfer-control 1 rB)
431                      )
432            )
433   )
434
435 (define-cti
436   l-bnf
437   "branch if condition bit not set (pc relative iaddr)"
438   (COND-CTI !UNCOND-CTI)
439   "l.bnf ${disp26}"
440   (+ OPC_BNF disp26)
441   (.pmacro ()
442            (cti-transfer-control (not sys-sr-f) disp26)
443            )
444   )
445
446 (define-cti
447   l-bf
448   "branch if condition bit set (pc relative iaddr)"
449   (COND-CTI !UNCOND-CTI)
450   "l.bf ${disp26}"
451   (+ OPC_BF disp26)
452   (.pmacro ()
453            (cti-transfer-control sys-sr-f disp26)
454            )
455   )
456
457 (dni l-trap "trap (exception)"
458      ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT)
459      "l.trap ${uimm16}"
460      (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_TRAP (f-resv-20-5 0) uimm16)
461      ; Do exception entry handling in C function, PC set based on SR state
462      (raise-exception EXCEPT-TRAP)
463      ()
464 )
465
466
467 (dni l-sys "syscall (exception)"
468      ; This function may not be in delay slot
469      ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT)
470
471      "l.sys ${uimm16}"
472      (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_SYSCALL (f-resv-20-5 0) uimm16)
473      ; Do exception entry handling in C function, PC set based on SR state
474      (raise-exception EXCEPT-SYSCALL)
475      ()
476 )
477
478
479 (dni l-rfe "return from exception"
480      ; This function may not be in delay slot
481      ((MACH ORBIS-MACHS) NOT-IN-DELAY-SLOT FORCED-CTI)
482
483      "l.rfe"
484      (+ OPC_RFE (f-resv-25-26 0))
485      (c-call VOID "@cpu@_rfe")
486      ()
487 )
488
489 \f
490 ; Misc instructions
491
492 ; l.nop with immediate must be first so it handles all l.nops in sim
493 (dni l-nop-imm "nop uimm16"
494      ((MACH ORBIS-MACHS))
495      "l.nop ${uimm16}"
496      (+ OPC_NOP (f-op-25-2 #x1) (f-resv-23-8 0) uimm16)
497      (c-call VOID "@cpu@_nop" (zext UWI uimm16))
498      ()
499      )
500
501 (if (application-is? SIMULATOR)
502     (begin)
503     (begin
504       (dni l-nop "nop"
505            ((MACH ORBIS-MACHS))
506            "l.nop"
507            (+ OPC_NOP (f-op-25-2 #x1) (f-resv-23-8 0) uimm16)
508            (nop)
509            ()
510            )
511       )
512 )
513
514 (dni l-movhi "movhi reg/uimm16"
515      ((MACH ORBIS-MACHS))
516      "l.movhi $rD,$uimm16"
517      (+ OPC_MOVHIMACRC rD (f-resv-20-4 0) OPC_MOVHIMACRC_MOVHI uimm16)
518      (set UWI rD (sll UWI (zext UWI uimm16) (const 16)))
519      ()
520 )
521
522 (dni l-macrc "macrc reg"
523      ((MACH ORBIS-MACHS))
524      "l.macrc $rD"
525      (+ OPC_MOVHIMACRC rD (f-resv-20-4 0) OPC_MOVHIMACRC_MACRC (f-uimm16 0))
526      (sequence ()
527                (set UWI rD mac-maclo)
528                (set UWI mac-maclo 0)
529                (set UWI mac-machi 0)
530                )
531      ()
532      )
533
534 \f
535 ; System releated instructions
536
537 (dni l-mfspr "mfspr"
538      ((MACH ORBIS-MACHS))
539      "l.mfspr $rD,$rA,${uimm16}"
540      (+ OPC_MFSPR rD rA uimm16)
541      (set UWI rD (c-call UWI "@cpu@_mfspr" (or rA (zext UWI uimm16))))
542      ()
543 )
544
545 (dni l-mtspr "mtspr"
546      ((MACH ORBIS-MACHS))
547      "l.mtspr $rA,$rB,${uimm16-split}"
548      (+ OPC_MTSPR rA rB uimm16-split )
549      (c-call VOID "@cpu@_mtspr" (or rA (zext WI uimm16-split)) rB)
550      ()
551 )
552
553 \f
554 ; Load instructions
555 (define-pmacro (load-store-addr base offset size)
556   (c-call AI "@cpu@_make_load_store_addr" base (ext SI offset) size))
557
558 (dni l-lwz "l.lwz reg/simm16(reg)"
559      ((MACH ORBIS-MACHS))
560      "l.lwz $rD,${simm16}($rA)"
561      (+ OPC_LWZ rD rA simm16)
562      (set UWI rD (zext UWI (mem USI (load-store-addr rA simm16 4))))
563      ()
564 )
565
566
567 (dni l-lws "l.lws reg/simm16(reg)"
568      ((MACH ORBIS-MACHS))
569      "l.lws $rD,${simm16}($rA)"
570      (+ OPC_LWS rD rA simm16)
571      (set WI rD (ext WI (mem SI (load-store-addr rA simm16 4))))
572      ()
573 )
574
575 (dni l-lbz "l.lbz reg/simm16(reg)"
576      ((MACH ORBIS-MACHS))
577      "l.lbz $rD,${simm16}($rA)"
578      (+ OPC_LBZ rD rA simm16)
579      (set UWI rD (zext UWI (mem UQI (load-store-addr rA simm16 1))))
580      ()
581 )
582
583 (dni l-lbs "l.lbz reg/simm16(reg)"
584      ((MACH ORBIS-MACHS))
585      "l.lbs $rD,${simm16}($rA)"
586      (+ OPC_LBS rD rA simm16)
587      (set WI rD (ext WI (mem QI (load-store-addr rA simm16 1))))
588      ()
589 )
590
591 (dni l-lhz "l.lhz reg/simm16(reg)"
592      ((MACH ORBIS-MACHS))
593      "l.lhz $rD,${simm16}($rA)"
594      (+ OPC_LHZ rD simm16 rA)
595      (set UWI rD (zext UWI (mem UHI (load-store-addr rA simm16 2))))
596      ()
597 )
598
599 (dni l-lhs "l.lhs reg/simm16(reg)"
600      ((MACH ORBIS-MACHS))
601      "l.lhs $rD,${simm16}($rA)"
602      (+ OPC_LHS rD rA simm16)
603      (set WI rD (ext WI (mem HI (load-store-addr rA simm16 2))))
604      ()
605 )
606
607 \f
608 ; Store instructions
609
610 (define-pmacro (store-insn mnemonic opc-op mode size)
611   (begin
612      (dni (.sym l- mnemonic)
613           (.str "l." mnemonic " simm16(reg)/reg")
614           ((MACH ORBIS-MACHS))
615           (.str "l." mnemonic " ${simm16-split}($rA),$rB")
616           (+ opc-op rB rD simm16-split)
617           (set mode (mem mode (load-store-addr rA simm16-split size)) (trunc mode rB))
618           ()
619      )
620    )
621 )
622
623 (store-insn sw OPC_SW USI 4)
624 (store-insn sb OPC_SB UQI 1)
625 (store-insn sh OPC_SH UHI 2)
626
627
628 \f
629 ; Shift and rotate instructions
630
631 (define-pmacro (shift-insn mnemonic)
632   (begin
633      (dni (.sym l- mnemonic)
634           (.str "l." mnemonic " reg/reg/reg")
635           ((MACH ORBIS-MACHS))
636           (.str "l." mnemonic " $rD,$rA,$rB")
637           (+ OPC_ALU rD rA rB (f-resv-10-3 0) (.sym OPC_SHROTS_ (.upcase mnemonic)) (f-resv-5-2 0) 
638              OPC_ALU_REGREG_SHROT )
639           (set UWI rD (mnemonic rA rB))
640           ()
641      )
642      (dni (.sym l- mnemonic "i")
643           (.str "l." mnemonic " reg/reg/uimm6")
644           ((MACH ORBIS-MACHS))
645           (.str "l." mnemonic "i $rD,$rA,${uimm6}")
646           (+ OPC_SHROTI rD rA (f-resv-15-8 0) (.sym OPC_SHROTS_ (.upcase mnemonic)) uimm6)
647           (set rD (mnemonic rA uimm6))
648           ()
649      )
650    )
651 )
652
653 (shift-insn sll)
654 (shift-insn srl)
655 (shift-insn sra)
656 (shift-insn ror)
657
658 \f
659 ; Arithmetic insns
660
661 ; ALU op macro
662 (define-pmacro (alu-insn mnemonic)
663   (begin
664      (dni (.sym l- mnemonic)
665           (.str "l." mnemonic " reg/reg/reg")
666           ((MACH ORBIS-MACHS))
667           (.str "l." mnemonic " $rD,$rA,$rB")
668           (+ OPC_ALU rD rA rB (f-resv-10-7 0) (.sym OPC_ALU_REGREG_ (.upcase mnemonic)))
669           (set rD (mnemonic rA rB))
670           ()
671      )
672   )
673 )
674
675 (alu-insn and)
676 (alu-insn or)
677 (alu-insn xor)
678
679 (define-pmacro (alu-carry-insn mnemonic)
680   (begin
681     (dni (.sym l- mnemonic)
682          (.str "l." mnemonic " reg/reg/reg")
683          ((MACH ORBIS-MACHS))
684          (.str "l." mnemonic " $rD,$rA,$rB")
685          (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) (.sym OPC_ALU_REGREG_ (.upcase mnemonic)))
686          (sequence ()
687                    (sequence ()
688                              (set BI sys-sr-cy ((.sym mnemonic "c-cflag") WI rA rB 0))
689                              (set BI sys-sr-ov ((.sym mnemonic "c-oflag") WI rA rB 0))
690                              (set rD (mnemonic WI rA rB))
691                              )
692                    (if (andif sys-sr-ov sys-sr-ove)
693                        (raise-exception EXCEPT-RANGE))
694                    )
695          ()
696          )
697     )
698   )
699
700 (alu-carry-insn add)
701 (alu-carry-insn sub)
702
703 (dni (l-addc) "l.addc reg/reg/reg"
704           ((MACH ORBIS-MACHS))
705           ("l.addc $rD,$rA,$rB")
706           (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) OPC_ALU_REGREG_ADDC)
707           (sequence ()
708                     (sequence ((BI tmp-sys-sr-cy))
709                               (set BI tmp-sys-sr-cy sys-sr-cy)
710                               (set BI sys-sr-cy (addc-cflag WI rA rB tmp-sys-sr-cy))
711                               (set BI sys-sr-ov (addc-oflag WI rA rB tmp-sys-sr-cy))
712                               (set rD (addc WI rA rB tmp-sys-sr-cy))
713                               )
714                    (if (andif sys-sr-ov sys-sr-ove)
715                        (raise-exception EXCEPT-RANGE))
716                    )
717           ()
718 )
719
720 (dni (l-mul) "l.mul reg/reg/reg"
721           ((MACH ORBIS-MACHS))
722           ("l.mul $rD,$rA,$rB")
723           (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MUL)
724           (sequence ()
725                     (sequence ()
726                               ; 2's complement overflow
727                               (set BI sys-sr-ov (mul-o2flag WI rA rB))
728                               ; 1's complement overflow
729                               (set BI sys-sr-cy (mul-o1flag WI rA rB))
730                               (set rD (mul WI rA rB))
731                               )
732                     (if (andif sys-sr-ov sys-sr-ove)
733                         (raise-exception EXCEPT-RANGE))
734                     )
735           ()
736 )
737
738 (dni (l-mulu) "l.mulu reg/reg/reg"
739           ((MACH ORBIS-MACHS))
740           ("l.mulu $rD,$rA,$rB")
741           (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_MULU)
742           (sequence ()
743                     (sequence ()
744                               ; 2's complement overflow
745                               (set BI sys-sr-ov 0)
746                               ; 1's complement overflow
747                               (set BI sys-sr-cy (mul-o1flag UWI rA rB))
748                               (set rD (mul UWI rA rB))
749                               )
750                     (if (andif sys-sr-ov sys-sr-ove)
751                         (raise-exception EXCEPT-RANGE))
752                     )
753           ()
754 )
755
756 (dni l-div "divide (signed)"
757           ((MACH ORBIS-MACHS))
758           "l.div $rD,$rA,$rB"
759           (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_DIV)
760           (sequence ()
761                     (if (ne rB 0)
762                         (sequence ()
763                                   (set BI sys-sr-cy 0)
764                                   (set WI rD (div WI rA rB))
765                                   )
766                         (set BI sys-sr-cy 1)
767                         )
768                     (set BI sys-sr-ov 0)
769                     (if (andif sys-sr-cy sys-sr-ove)
770                         (raise-exception EXCEPT-RANGE))
771                     )
772           ()
773 )
774
775 (dni l-divu "divide (unsigned)"
776           ((MACH ORBIS-MACHS))
777           "l.divu $rD,$rA,$rB"
778           (+ OPC_ALU rD rA rB (f-resv-10-7 #x30) OPC_ALU_REGREG_DIVU)
779           (sequence ()
780                     (if (ne rB 0)
781                         (sequence ()
782                                   (set BI sys-sr-cy 0)
783                                   (set rD (udiv UWI rA rB))
784                                   )
785                         (set BI sys-sr-cy 1)
786                         )
787                     (set BI sys-sr-ov 0)
788                     (if (andif sys-sr-cy sys-sr-ove)
789                         (raise-exception EXCEPT-RANGE))
790                     )
791           ()
792 )
793
794 (dni l-ff1 "find first '1'"
795           ((MACH ORBIS-MACHS))
796           "l.ff1 $rD,$rA"
797           (+ OPC_ALU rD rA rB (f-resv-10-7 #x00) OPC_ALU_REGREG_FFL1)
798           (set rD (c-call UWI "@cpu@_ff1" rA))
799           ()
800 )
801
802 (dni l-fl1 "find last '1'"
803           ((MACH ORBIS-MACHS))
804           "l.fl1 $rD,$rA"
805           (+ OPC_ALU rD rA rB (f-resv-10-7 #x10) OPC_ALU_REGREG_FFL1)
806           (set rD (c-call UWI "@cpu@_fl1" rA))
807           ()
808 )
809
810
811 (define-pmacro (alu-insn-simm  mnemonic)
812   (begin
813       (dni (.sym l- mnemonic "i")
814           (.str "l." mnemonic " reg/reg/simm16")
815           ((MACH ORBIS-MACHS))
816           (.str "l." mnemonic "i $rD,$rA,$simm16")
817           (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA simm16)
818           (set rD (mnemonic rA (ext WI simm16)))
819           ()
820      )
821    )
822 )
823
824 (define-pmacro (alu-insn-uimm  mnemonic)
825   (begin
826       (dni (.sym l- mnemonic "i")
827           (.str "l." mnemonic " reg/reg/uimm16")
828           ((MACH ORBIS-MACHS))
829           (.str "l." mnemonic "i $rD,$rA,$uimm16")
830           (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA uimm16)
831           (set rD (mnemonic rA (zext UWI uimm16)))
832           ()
833      )
834    )
835 )
836
837 (alu-insn-uimm and)
838 (alu-insn-uimm or)
839 (alu-insn-simm xor)
840
841 (define-pmacro (alu-carry-insn-simm mnemonic)
842   (begin
843     (dni (.sym l- mnemonic "i")
844          (.str "l." mnemonic "i reg/reg/simm16")
845          ((MACH ORBIS-MACHS))
846          (.str "l." mnemonic "i $rD,$rA,$simm16")
847          (+ (.sym OPC_ (.upcase mnemonic) "I") rD rA simm16)
848          (sequence ()
849                    (sequence ()
850                              (set BI sys-sr-cy ((.sym mnemonic "c-cflag") WI rA (ext WI simm16) 0))
851                              (set BI sys-sr-ov ((.sym mnemonic "c-oflag") WI rA (ext WI simm16) 0))
852                              (set rD (mnemonic WI rA (ext WI simm16)))
853                              )
854                    (if (andif sys-sr-ov sys-sr-ove)
855                        (raise-exception EXCEPT-RANGE))
856                    )
857          ()
858          )
859     )
860   )
861
862 (alu-carry-insn-simm add)
863
864 (dni (l-addic)
865      ("l.addic reg/reg/simm16")
866      ((MACH ORBIS-MACHS))
867      ("l.addic $rD,$rA,$simm16")
868      (+ OPC_ADDIC rD rA simm16)
869      (sequence ()
870                (sequence ((BI tmp-sys-sr-cy))
871                          (set BI tmp-sys-sr-cy sys-sr-cy)
872                          (set BI sys-sr-cy (addc-cflag WI rA (ext WI simm16) tmp-sys-sr-cy))
873                          (set BI sys-sr-ov (addc-oflag WI rA (ext WI simm16) tmp-sys-sr-cy))
874                          (set WI rD (addc WI rA (ext WI simm16) tmp-sys-sr-cy))
875                          )
876                (if (andif sys-sr-ov sys-sr-ove)
877                    (raise-exception EXCEPT-RANGE))
878                )
879      ()
880 )
881
882 (dni (l-muli)
883      "l.muli reg/reg/simm16"
884      ((MACH ORBIS-MACHS))
885      ("l.muli $rD,$rA,$simm16")
886      (+ OPC_MULI rD rA simm16)
887      (sequence ()
888                (sequence ()
889                          ; 2's complement overflow
890                          (set sys-sr-ov (mul-o2flag WI rA (ext WI simm16)))
891                          ; 1's complement overflow
892                          (set sys-sr-cy (mul-o1flag UWI rA (ext UWI simm16)))
893                          (set rD (mul WI rA (ext WI simm16)))
894                          )
895                (if (andif sys-sr-ov sys-sr-ove)
896                    (raise-exception EXCEPT-RANGE))
897                )
898      ()
899      )
900
901 (define-pmacro (extbh-insn mnemonic extop extmode truncmode)
902   (begin
903     (dni (.sym l- mnemonic)
904          (.str "l." mnemonic " reg/reg")
905          ((MACH ORBIS-MACHS))
906          (.str "l." mnemonic " $rD,$rA")
907          (+ OPC_ALU rD rA (f-resv-15-6 0) (.sym OPC_EXTBHS_ (.upcase mnemonic)) (f-resv-5-2 0) OPC_ALU_REGREG_EXTBH)
908          (set rD (extop extmode (trunc truncmode rA)))
909          ()
910          )
911     )
912   )
913
914 (extbh-insn exths ext  WI  HI)
915 (extbh-insn extbs ext  WI  QI)
916 (extbh-insn exthz zext UWI UHI)
917 (extbh-insn extbz zext UWI UQI)
918
919 (define-pmacro (extw-insn mnemonic extop extmode truncmode)
920   (begin
921     (dni (.sym l- mnemonic)
922          (.str "l." mnemonic " reg/reg")
923          ((MACH ORBIS-MACHS))
924          (.str "l." mnemonic " $rD,$rA")
925          (+ OPC_ALU rD rA (f-resv-15-6 0) (.sym OPC_EXTWS_ (.upcase mnemonic)) (f-resv-5-2 0) OPC_ALU_REGREG_EXTW)
926          (set rD (extop extmode (trunc truncmode rA)))
927          ()
928          )
929     )
930   )
931
932 (extw-insn extws ext  WI  SI)
933 (extw-insn extwz zext USI USI)
934
935 (dni l-cmov
936      "l.cmov reg/reg/reg"
937      ((MACH ORBIS-MACHS))
938      "l.cmov $rD,$rA,$rB"
939      (+ OPC_ALU rD rA rB (f-resv-10-1 0) (f-op-9-2 0) (f-resv-7-4 0) OPC_ALU_REGREG_CMOV)
940      (if sys-sr-f
941          (set UWI rD rA)
942          (set UWI rD rB)
943          )
944      ()
945      )
946
947 ; Compare instructions
948
949 ; Ordering compare
950 (define-pmacro (sf-insn op)
951   (begin
952      (dni (.sym l- "sf" op "s")                                               ; l-sfgts
953           (.str "l.sf" op "s reg/reg")                                        ; "l.sfgts reg/reg"
954           ((MACH ORBIS-MACHS))
955           (.str "l.sf" op "s $rA,$rB")                                        ; "l.sfgts $rA,$rB"
956           (+ OPC_SF (.sym "OPC_SF_" (.upcase op) "S") rA rB (f-resv-10-11 0)) ; (+ OPC_SF OPC_SF_GTS rA rB (f-resv-10-11 0))
957           (set sys-sr-f (op WI rA rB))                                        ; (set sys-sr-f (gt WI rA rB))
958           ()
959           )
960      (dni (.sym l- "sf" op "si")                                              ; l-sfgtsi
961           (.str "l.sf" op "si reg/simm16")                                    ; "l.sfgtsi reg/simm16"
962           ((MACH ORBIS-MACHS))
963           (.str "l.sf" op "si $rA,$simm16")                                   ; "l.sfgtsi $rA,$simm16"
964           (+ OPC_SFI (.sym "OPC_SF_" (.upcase op) "S") rA simm16)             ; (+ OPC_SFI OPC_SF_GTS rA simm16)
965           (set sys-sr-f (op WI rA (ext WI simm16)))                           ; (set sys-sr-f (gt WI rA (ext WI simm16)))
966           ()
967           )
968      (dni (.sym l- "sf" op "u")                                               ; l-sfgtu
969           (.str "l.sf" op "u reg/reg")                                        ; "l.sfgtu reg/reg"
970           ((MACH ORBIS-MACHS))
971           (.str "l.sf" op "u $rA,$rB")                                        ; "l.sfgtu $rA,$rB"
972           (+ OPC_SF (.sym "OPC_SF_" (.upcase op) "U") rA rB (f-resv-10-11 0)) ; (+ OPC_SF OPC_SF_GTU rA rB (f-resv-10-11 0))
973           (set sys-sr-f ((.sym op "u") WI rA rB))                             ; (set sys-sr-f (gtu WI rA rB))
974           ()
975           )
976      ; immediate is sign extended even for unsigned compare
977      (dni (.sym l- "sf" op "ui")                                              ; l-sfgtui
978           (.str "l.sf" op "ui reg/simm16")                                    ; "l.sfgtui reg/uimm16"
979           ((MACH ORBIS-MACHS))
980           (.str "l.sf" op "ui $rA,$simm16")                                   ; "l.sfgtui $rA,$simm16"
981           (+ OPC_SFI (.sym "OPC_SF_" (.upcase op) "U") rA simm16)             ; (+ OPC_SFI OPC_SF_GTU rA simm16)
982           (set sys-sr-f ((.sym op "u") WI rA (ext WI simm16)))                ; (set sys-sr-f (gtu WI rA (ext WI simm16)))
983           ()
984           )
985      )
986   )
987
988 (sf-insn gt)
989 (sf-insn ge)
990 (sf-insn lt)
991 (sf-insn le)
992
993 ; Equality compare
994 (define-pmacro (sf-insn-eq op)
995   (begin
996      (dni (.sym l- "sf" op)
997           (.str "l." op " reg/reg")
998           ((MACH ORBIS-MACHS))
999           (.str "l.sf" op " $rA,$rB")
1000           (+ OPC_SF (.sym "OPC_SF_" (.upcase op)) rA rB (f-resv-10-11 0))
1001           (set sys-sr-f (op WI rA rB))
1002           ()
1003      )
1004      (dni (.sym l- "sf" op "i")
1005           (.str "l.sf" op "i reg/simm16")
1006           ((MACH ORBIS-MACHS))
1007           (.str "l.sf" op "i $rA,$simm16")
1008           (+ OPC_SFI (.sym "OPC_SF_" (.upcase op)) rA simm16)
1009           (set sys-sr-f (op WI rA (ext WI simm16)))
1010           ()
1011      )
1012    )
1013 )
1014
1015 (sf-insn-eq eq)
1016 (sf-insn-eq ne)
1017
1018 (dni l-mac
1019      "l.mac reg/reg"
1020      ((MACH ORBIS-MACHS))
1021      "l.mac $rA,$rB"
1022      (+  OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MAC)
1023      (sequence ((WI prod) (DI result))
1024                (set WI prod (mul WI rA rB))
1025                (set DI result (add (join DI SI mac-machi mac-maclo) (ext DI prod)))
1026                (set SI mac-machi (subword SI result 0))
1027                (set SI mac-maclo (subword SI result 1))
1028                )
1029      ()
1030      )
1031
1032 (dni l-msb
1033      "l.msb reg/reg"
1034      ((MACH ORBIS-MACHS))
1035      "l.msb $rA,$rB"
1036      (+  OPC_MAC (f-op-25-5 0) rA rB (f-resv-10-7 0) OPC_MAC_MSB)
1037      (sequence ((WI prod) (DI result))
1038                (set WI prod (mul WI rA rB))
1039                (set DI result (sub (join DI SI mac-machi mac-maclo) (ext DI prod)))
1040                (set SI mac-machi (subword SI result 0))
1041                (set SI mac-maclo (subword SI result 1))
1042                )
1043      ()
1044      )
1045
1046 (dni l-maci
1047      "l.maci reg/simm16"
1048      ((MACH ORBIS-MACHS))
1049      "l.maci $rA,${simm16}"
1050      (+ OPC_MACI (f-resv-25-5 0) rA simm16)
1051      (sequence ((WI prod) (DI result))
1052                (set WI prod (mul WI (ext WI simm16) rA))
1053                (set DI result (add (join DI SI mac-machi mac-maclo) (ext DI prod)))
1054                (set SI mac-machi (subword SI result 0))
1055                (set SI mac-maclo (subword SI result 1))
1056                )
1057      ()
1058      )
1059
1060 (define-pmacro (cust-insn cust-num)
1061   (begin
1062     (dni (.sym l- "cust" cust-num)
1063          (.str "l.cust" cust-num)
1064          ((MACH ORBIS-MACHS))
1065          (.str "l.cust" cust-num)
1066          (+ (.sym OPC_CUST cust-num) (f-resv-25-26 0))
1067          (nop)
1068          ()
1069          )
1070     )
1071   )
1072
1073 (cust-insn "1")
1074 (cust-insn "2")
1075 (cust-insn "3")
1076 (cust-insn "4")
1077 (cust-insn "5")
1078 (cust-insn "6")
1079 (cust-insn "7")
1080 (cust-insn "8")