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