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