xref: /netbsd-src/external/gpl3/gdb/dist/cpu/lm32.cpu (revision 8dffb485a119f39f727115fa0bcb569045caf7cb)
14e98e3e1Schristos; Lattice Mico32 CPU description.  -*- Scheme -*-
2a2e2270fSchristos; Copyright 2008-2013  Free Software Foundation, Inc.
34e98e3e1Schristos; Contributed by Jon Beniston <jon@beniston.com>
44e98e3e1Schristos;
54e98e3e1Schristos; This file is part of the GNU Binutils.
64e98e3e1Schristos;
74e98e3e1Schristos; This program is free software; you can redistribute it and/or modify
84e98e3e1Schristos; it under the terms of the GNU General Public License as published by
94e98e3e1Schristos; the Free Software Foundation; either version 3 of the License, or
104e98e3e1Schristos; (at your option) any later version.
114e98e3e1Schristos;
124e98e3e1Schristos; This program is distributed in the hope that it will be useful,
134e98e3e1Schristos; but WITHOUT ANY WARRANTY; without even the implied warranty of
144e98e3e1Schristos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
154e98e3e1Schristos; GNU General Public License for more details.
164e98e3e1Schristos;
174e98e3e1Schristos; You should have received a copy of the GNU General Public License
184e98e3e1Schristos; along with this program; if not, write to the Free Software
194e98e3e1Schristos; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
204e98e3e1Schristos; MA 02110-1301, USA.
214e98e3e1Schristos
224e98e3e1Schristos(include "simplify.inc")
234e98e3e1Schristos
244e98e3e1Schristos(define-arch
254e98e3e1Schristos  (name lm32) ; name of cpu family
264e98e3e1Schristos  (comment "Lattice Mico32")
274e98e3e1Schristos  (default-alignment aligned)
284e98e3e1Schristos  (insn-lsb0? #t)
294e98e3e1Schristos  (machs lm32)
304e98e3e1Schristos  (isas lm32)
314e98e3e1Schristos)
324e98e3e1Schristos
334e98e3e1Schristos
344e98e3e1Schristos; Instruction sets.
354e98e3e1Schristos
364e98e3e1Schristos(define-isa
374e98e3e1Schristos  (name lm32)
384e98e3e1Schristos  (comment "Lattice Mico32 ISA")
394e98e3e1Schristos  (default-insn-word-bitsize 32)
404e98e3e1Schristos  (default-insn-bitsize 32)
414e98e3e1Schristos  (base-insn-bitsize 32)
424e98e3e1Schristos  (decode-assist (31 30 29 28 27 26))
434e98e3e1Schristos)
444e98e3e1Schristos
454e98e3e1Schristos
464e98e3e1Schristos; Cpu family definitions.
474e98e3e1Schristos
484e98e3e1Schristos(define-cpu
494e98e3e1Schristos  ; cpu names must be distinct from the architecture name and machine name
504e98e3e1Schristos  (name lm32bf)
514e98e3e1Schristos  (comment "Lattice Mico32 CPU")
524e98e3e1Schristos  (endian big)
534e98e3e1Schristos  (word-bitsize 32)
544e98e3e1Schristos)
554e98e3e1Schristos
564e98e3e1Schristos(define-mach
574e98e3e1Schristos  (name lm32)
584e98e3e1Schristos  (comment "Lattice Mico32 MACH")
594e98e3e1Schristos  (cpu lm32bf)
604e98e3e1Schristos)
614e98e3e1Schristos
624e98e3e1Schristos(define-model
634e98e3e1Schristos  (name lm32)
644e98e3e1Schristos  (comment "Lattice Mico32 reference implementation")
654e98e3e1Schristos  (mach lm32)
664e98e3e1Schristos  (unit u-exec "Execution unit" ()
674e98e3e1Schristos    1 1 () () () ())
684e98e3e1Schristos)
694e98e3e1Schristos
704e98e3e1Schristos
714e98e3e1Schristos; Hardware elements.
724e98e3e1Schristos
734e98e3e1Schristos(dnh h-pc "Program counter" (PC) (pc) () () ())
744e98e3e1Schristos
754e98e3e1Schristos(dnh h-gr "General purpose registers"
764e98e3e1Schristos  ()
774e98e3e1Schristos  (register SI (32))
784e98e3e1Schristos  (keyword "" (
794e98e3e1Schristos               (gp 26) (fp 27) (sp 28) (ra 29) (ea 30) (ba 31)
804e98e3e1Schristos               (r0 0) (r1 1) (r2 2) (r3 3)
814e98e3e1Schristos               (r4 4) (r5 5) (r6 6) (r7 7)
824e98e3e1Schristos               (r8 8) (r9 9) (r10 10) (r11 11)
834e98e3e1Schristos               (r12 12) (r13 13) (r14 14) (r15 15)
844e98e3e1Schristos               (r16 16) (r17 17) (r18 18) (r19 19)
854e98e3e1Schristos               (r20 20) (r21 21) (r22 22) (r23 23)
864e98e3e1Schristos               (r24 24) (r25 25) (r26 26) (r27 27)
874e98e3e1Schristos               (r28 28) (r29 29) (r30 30) (r31 31)
884e98e3e1Schristos              )
894e98e3e1Schristos  )
904e98e3e1Schristos  () ()
914e98e3e1Schristos)
924e98e3e1Schristos
934e98e3e1Schristos(dnh h-csr "Control and status registers"
944e98e3e1Schristos  ()
954e98e3e1Schristos  (register SI (32))
964e98e3e1Schristos  (keyword "" (
974e98e3e1Schristos               (IE 0) (IM 1) (IP 2)
984e98e3e1Schristos               (ICC 3) (DCC 4)
994e98e3e1Schristos               (CC 5)
1004e98e3e1Schristos               (CFG 6)
1014e98e3e1Schristos               (EBA 7)
1024e98e3e1Schristos               (DC 8)
1034e98e3e1Schristos               (DEBA 9)
104a2e2270fSchristos	       (CFG2 10)
1054e98e3e1Schristos               (JTX 14) (JRX 15)
1064e98e3e1Schristos               (BP0 16) (BP1 17) (BP2 18) (BP3 19)
1074e98e3e1Schristos               (WP0 24) (WP1 25) (WP2 26) (WP3 27)
108a2e2270fSchristos               (PSW 29) (TLBVADDR 30) (TLBPADDR 31) (TLBBADVADDR 31)
1094e98e3e1Schristos              )
1104e98e3e1Schristos  )
1114e98e3e1Schristos  () ()
1124e98e3e1Schristos)
1134e98e3e1Schristos
1144e98e3e1Schristos
1154e98e3e1Schristos; Instruction fields.
1164e98e3e1Schristos
1174e98e3e1Schristos(dnf f-opcode   "opcode field"                () 31  6)
1184e98e3e1Schristos(dnf f-r0       "register index 0 field"      () 25  5)
1194e98e3e1Schristos(dnf f-r1       "register index 1 field"      () 20  5)
1204e98e3e1Schristos(dnf f-r2       "register index 2 field"      () 15  5)
1214e98e3e1Schristos(dnf f-resv0    "reserved"                    (RESERVED) 10 11)
1224e98e3e1Schristos(dnf f-shift    "shift amount field"          ()  4  5)
1234e98e3e1Schristos(df  f-imm      "signed immediate field"      () 15 16 INT #f #f)
1244e98e3e1Schristos(dnf f-uimm     "unsigned immediate field"    () 15 16)
1254e98e3e1Schristos(dnf f-csr      "csr field"                   () 25  5)
1264e98e3e1Schristos(dnf f-user     "user defined field"          () 10 11)
1274e98e3e1Schristos(dnf f-exception "exception field"            () 25 26)
1284e98e3e1Schristos
1294e98e3e1Schristos(df f-branch "branch offset field" (PCREL-ADDR) 15 16 INT
1304e98e3e1Schristos        ((value pc) (sra SI (sub SI value pc) 2))
131*8dffb485Schristos	((value pc) (add SI pc (sub (xor (sll (and value #xffff) 2)
132*8dffb485Schristos					 #x20000)
133*8dffb485Schristos				    #x20000)))
1344e98e3e1Schristos)
1354e98e3e1Schristos(df f-call "call offset field" (PCREL-ADDR) 25 26 INT
1364e98e3e1Schristos        ((value pc) (sra SI (sub SI value pc) 2))
137*8dffb485Schristos	((value pc) (add SI pc (sub (xor (sll (and value #x3ffffff) 2)
138*8dffb485Schristos					 #x8000000)
139*8dffb485Schristos				    #x8000000)))
1404e98e3e1Schristos)
1414e98e3e1Schristos
1424e98e3e1Schristos
1434e98e3e1Schristos; Operands.
1444e98e3e1Schristos
1454e98e3e1Schristos(dnop r0        "register 0"            () h-gr         f-r0)
1464e98e3e1Schristos(dnop r1        "register 1"            () h-gr         f-r1)
1474e98e3e1Schristos(dnop r2        "register 2"            () h-gr         f-r2)
1484e98e3e1Schristos(dnop shift     "shift amout"           () h-uint       f-shift)
1494e98e3e1Schristos(dnop imm       "signed immediate"      () h-sint       f-imm)
1504e98e3e1Schristos(dnop uimm      "unsigned immediate"    () h-uint       f-uimm)
1514e98e3e1Schristos(dnop branch    "branch offset"         () h-iaddr      f-branch)
1524e98e3e1Schristos(dnop call      "call offset"           () h-iaddr      f-call)
1534e98e3e1Schristos(dnop csr       "csr"                   () h-csr        f-csr)
1544e98e3e1Schristos(dnop user      "user"                  () h-uint       f-user)
1554e98e3e1Schristos(dnop exception "exception"             () h-uint       f-exception)
1564e98e3e1Schristos
1574e98e3e1Schristos(define-operand
1584e98e3e1Schristos  (name hi16)
1594e98e3e1Schristos  (comment "high 16-bit immediate")
1604e98e3e1Schristos  (attrs)
1614e98e3e1Schristos  (type h-uint)
1624e98e3e1Schristos  (index f-uimm)
1634e98e3e1Schristos  (handlers (parse "hi16"))
1644e98e3e1Schristos)
1654e98e3e1Schristos
1664e98e3e1Schristos(define-operand
1674e98e3e1Schristos  (name lo16)
1684e98e3e1Schristos  (comment "low 16-bit immediate")
1694e98e3e1Schristos  (attrs)
1704e98e3e1Schristos  (type h-uint)
1714e98e3e1Schristos  (index f-uimm)
1724e98e3e1Schristos  (handlers (parse "lo16"))
1734e98e3e1Schristos)
1744e98e3e1Schristos
1754e98e3e1Schristos(define-operand
1764e98e3e1Schristos  (name gp16)
1774e98e3e1Schristos  (comment "gp relative 16-bit immediate")
1784e98e3e1Schristos  (attrs)
1794e98e3e1Schristos  (type h-sint)
1804e98e3e1Schristos  (index f-imm)
1814e98e3e1Schristos  (handlers (parse "gp16"))
1824e98e3e1Schristos)
1834e98e3e1Schristos
1844e98e3e1Schristos(define-operand
1854e98e3e1Schristos  (name got16)
1864e98e3e1Schristos  (comment "got 16-bit immediate")
1874e98e3e1Schristos  (attrs)
1884e98e3e1Schristos  (type h-sint)
1894e98e3e1Schristos  (index f-imm)
1904e98e3e1Schristos  (handlers (parse "got16"))
1914e98e3e1Schristos)
1924e98e3e1Schristos
1934e98e3e1Schristos(define-operand
1944e98e3e1Schristos  (name gotoffhi16)
1954e98e3e1Schristos  (comment "got offset high 16-bit immediate")
1964e98e3e1Schristos  (attrs)
1974e98e3e1Schristos  (type h-sint)
1984e98e3e1Schristos  (index f-imm)
1994e98e3e1Schristos  (handlers (parse "gotoff_hi16"))
2004e98e3e1Schristos)
2014e98e3e1Schristos
2024e98e3e1Schristos(define-operand
2034e98e3e1Schristos  (name gotofflo16)
2044e98e3e1Schristos  (comment "got offset low 16-bit immediate")
2054e98e3e1Schristos  (attrs)
2064e98e3e1Schristos  (type h-sint)
2074e98e3e1Schristos  (index f-imm)
2084e98e3e1Schristos  (handlers (parse "gotoff_lo16"))
2094e98e3e1Schristos)
2104e98e3e1Schristos
2114e98e3e1Schristos
2124e98e3e1Schristos; Enumerations.
2134e98e3e1Schristos
2144e98e3e1Schristos(define-normal-insn-enum
2154e98e3e1Schristos  opcodes "opcodes" () OP_ f-opcode
2164e98e3e1Schristos  (("ADD"       45)
2174e98e3e1Schristos   ("ADDI"      13)
2184e98e3e1Schristos   ("AND"       40)
2194e98e3e1Schristos   ("ANDI"      8)
2204e98e3e1Schristos   ("ANDHI"     24)
2214e98e3e1Schristos   ("B"         48)
2224e98e3e1Schristos   ("BI"        56)
2234e98e3e1Schristos   ("BE"        17)
2244e98e3e1Schristos   ("BG"        18)
2254e98e3e1Schristos   ("BGE"       19)
2264e98e3e1Schristos   ("BGEU"      20)
2274e98e3e1Schristos   ("BGU"       21)
2284e98e3e1Schristos   ("BNE"       23)
2294e98e3e1Schristos   ("CALL"      54)
2304e98e3e1Schristos   ("CALLI"     62)
2314e98e3e1Schristos   ("CMPE"      57)
2324e98e3e1Schristos   ("CMPEI"     25)
2334e98e3e1Schristos   ("CMPG"      58)
2344e98e3e1Schristos   ("CMPGI"     26)
2354e98e3e1Schristos   ("CMPGE"     59)
2364e98e3e1Schristos   ("CMPGEI"    27)
2374e98e3e1Schristos   ("CMPGEU"    60)
2384e98e3e1Schristos   ("CMPGEUI"   28)
2394e98e3e1Schristos   ("CMPGU"     61)
2404e98e3e1Schristos   ("CMPGUI"    29)
2414e98e3e1Schristos   ("CMPNE"     63)
2424e98e3e1Schristos   ("CMPNEI"    31)
2434e98e3e1Schristos   ("DIVU"      35)
2444e98e3e1Schristos   ("LB"        4)
2454e98e3e1Schristos   ("LBU"       16)
2464e98e3e1Schristos   ("LH"        7)
2474e98e3e1Schristos   ("LHU"       11)
2484e98e3e1Schristos   ("LW"        10)
2494e98e3e1Schristos   ("MODU"      49)
2504e98e3e1Schristos   ("MUL"       34)
2514e98e3e1Schristos   ("MULI"      2)
2524e98e3e1Schristos   ("NOR"       33)
2534e98e3e1Schristos   ("NORI"      1)
2544e98e3e1Schristos   ("OR"        46)
2554e98e3e1Schristos   ("ORI"       14)
2564e98e3e1Schristos   ("ORHI"      30)
2574e98e3e1Schristos   ("RAISE"     43)
2584e98e3e1Schristos   ("RCSR"      36)
2594e98e3e1Schristos   ("SB"        12)
2604e98e3e1Schristos   ("SEXTB"     44)
2614e98e3e1Schristos   ("SEXTH"     55)
2624e98e3e1Schristos   ("SH"        3)
2634e98e3e1Schristos   ("SL"        47)
2644e98e3e1Schristos   ("SLI"       15)
2654e98e3e1Schristos   ("SR"        37)
2664e98e3e1Schristos   ("SRI"       5)
2674e98e3e1Schristos   ("SRU"       32)
2684e98e3e1Schristos   ("SRUI"      0)
2694e98e3e1Schristos   ("SUB"       50)
2704e98e3e1Schristos   ("SW"        22)
2714e98e3e1Schristos   ("USER"      51)
2724e98e3e1Schristos   ("WCSR"      52)
2734e98e3e1Schristos   ("XNOR"      41)
2744e98e3e1Schristos   ("XNORI"     9)
2754e98e3e1Schristos   ("XOR"       38)
2764e98e3e1Schristos   ("XORI"      6)
2774e98e3e1Schristos  )
2784e98e3e1Schristos)
2794e98e3e1Schristos
2804e98e3e1Schristos
2814e98e3e1Schristos; Instructions. Note: Reg-reg must come before reg-imm.
2824e98e3e1Schristos
2834e98e3e1Schristos(dni add "add" ()
2844e98e3e1Schristos        "add $r2,$r0,$r1"
2854e98e3e1Schristos        (+ OP_ADD r0 r1 r2 (f-resv0 0))
2864e98e3e1Schristos        (set r2 (add r0 r1))
2874e98e3e1Schristos        ()
2884e98e3e1Schristos)
2894e98e3e1Schristos
2904e98e3e1Schristos(dni addi "add immediate" ()
2914e98e3e1Schristos        "addi $r1,$r0,$imm"
2924e98e3e1Schristos        (+ OP_ADDI r0 r1 imm)
2934e98e3e1Schristos        (set r1 (add r0 (ext SI (trunc HI imm))))
2944e98e3e1Schristos        ()
2954e98e3e1Schristos)
2964e98e3e1Schristos
2974e98e3e1Schristos(dni and "and" ()
2984e98e3e1Schristos        "and $r2,$r0,$r1"
2994e98e3e1Schristos        (+ OP_AND r0 r1 r2 (f-resv0 0))
3004e98e3e1Schristos        (set r2 (and r0 r1))
3014e98e3e1Schristos        ()
3024e98e3e1Schristos)
3034e98e3e1Schristos
3044e98e3e1Schristos(dni andi "and immediate" ()
3054e98e3e1Schristos        "andi $r1,$r0,$uimm"
3064e98e3e1Schristos        (+ OP_ANDI r0 r1 uimm)
3074e98e3e1Schristos        (set r1 (and r0 (zext SI uimm)))
3084e98e3e1Schristos        ()
3094e98e3e1Schristos)
3104e98e3e1Schristos
3114e98e3e1Schristos(dni andhii "and high immediate" ()
3124e98e3e1Schristos        "andhi $r1,$r0,$hi16"
3134e98e3e1Schristos        (+ OP_ANDHI r0 r1 hi16)
3144e98e3e1Schristos        (set r1 (and r0 (sll SI hi16 16)))
3154e98e3e1Schristos        ()
3164e98e3e1Schristos)
3174e98e3e1Schristos
3184e98e3e1Schristos(dni b "branch" ()
3194e98e3e1Schristos        "b $r0"
3204e98e3e1Schristos        (+ OP_B r0 (f-r1 0) (f-r2 0) (f-resv0 0))
3214e98e3e1Schristos        (set pc (c-call USI "@cpu@_b_insn" r0 f-r0))
3224e98e3e1Schristos        ()
3234e98e3e1Schristos)
3244e98e3e1Schristos
3254e98e3e1Schristos(dni bi "branch immediate" ()
3264e98e3e1Schristos        "bi $call"
3274e98e3e1Schristos        (+ OP_BI call)
3284e98e3e1Schristos        (set pc (ext SI call))
3294e98e3e1Schristos        ()
3304e98e3e1Schristos)
3314e98e3e1Schristos
3324e98e3e1Schristos(dni be "branch equal" ()
3334e98e3e1Schristos        "be $r0,$r1,$branch"
3344e98e3e1Schristos        (+ OP_BE r0 r1 branch)
3354e98e3e1Schristos        (if (eq r0 r1)
3364e98e3e1Schristos            (set pc branch)
3374e98e3e1Schristos        )
3384e98e3e1Schristos        ()
3394e98e3e1Schristos)
3404e98e3e1Schristos
3414e98e3e1Schristos(dni bg "branch greater" ()
3424e98e3e1Schristos        "bg $r0,$r1,$branch"
3434e98e3e1Schristos        (+ OP_BG r0 r1 branch)
3444e98e3e1Schristos        (if (gt r0 r1)
3454e98e3e1Schristos            (set pc branch)
3464e98e3e1Schristos        )
3474e98e3e1Schristos        ()
3484e98e3e1Schristos)
3494e98e3e1Schristos
3504e98e3e1Schristos(dni bge "branch greater or equal" ()
3514e98e3e1Schristos        "bge $r0,$r1,$branch"
3524e98e3e1Schristos        (+ OP_BGE r0 r1 branch)
3534e98e3e1Schristos        (if (ge r0 r1)
3544e98e3e1Schristos            (set pc branch)
3554e98e3e1Schristos        )
3564e98e3e1Schristos        ()
3574e98e3e1Schristos)
3584e98e3e1Schristos
3594e98e3e1Schristos(dni bgeu "branch greater or equal unsigned" ()
3604e98e3e1Schristos        "bgeu $r0,$r1,$branch"
3614e98e3e1Schristos        (+ OP_BGEU r0 r1 branch)
3624e98e3e1Schristos        (if (geu r0 r1)
3634e98e3e1Schristos            (set pc branch)
3644e98e3e1Schristos        )
3654e98e3e1Schristos        ()
3664e98e3e1Schristos)
3674e98e3e1Schristos
3684e98e3e1Schristos(dni bgu "branch greater unsigned" ()
3694e98e3e1Schristos        "bgu $r0,$r1,$branch"
3704e98e3e1Schristos        (+ OP_BGU r0 r1 branch)
3714e98e3e1Schristos        (if (gtu r0 r1)
3724e98e3e1Schristos            (set pc branch)
3734e98e3e1Schristos        )
3744e98e3e1Schristos        ()
3754e98e3e1Schristos)
3764e98e3e1Schristos
3774e98e3e1Schristos(dni bne "branch not equal" ()
3784e98e3e1Schristos        "bne $r0,$r1,$branch"
3794e98e3e1Schristos        (+ OP_BNE r0 r1 branch)
3804e98e3e1Schristos        (if (ne r0 r1)
3814e98e3e1Schristos            (set pc branch)
3824e98e3e1Schristos        )
3834e98e3e1Schristos        ()
3844e98e3e1Schristos)
3854e98e3e1Schristos
3864e98e3e1Schristos(dni call "call" ()
3874e98e3e1Schristos        "call $r0"
3884e98e3e1Schristos        (+ OP_CALL r0 (f-r1 0) (f-r2 0) (f-resv0 0))
3894e98e3e1Schristos        (sequence ()
3904e98e3e1Schristos                (set (reg h-gr 29) (add pc 4))
3914e98e3e1Schristos                (set pc r0)
3924e98e3e1Schristos        )
3934e98e3e1Schristos        ()
3944e98e3e1Schristos)
3954e98e3e1Schristos
3964e98e3e1Schristos(dni calli "call immediate" ()
3974e98e3e1Schristos        "calli $call"
3984e98e3e1Schristos        (+ OP_CALLI call)
3994e98e3e1Schristos        (sequence ()
4004e98e3e1Schristos                (set (reg h-gr 29) (add pc 4))
4014e98e3e1Schristos                (set pc (ext SI call))
4024e98e3e1Schristos        )
4034e98e3e1Schristos        ()
4044e98e3e1Schristos)
4054e98e3e1Schristos
4064e98e3e1Schristos(dni cmpe "compare equal" ()
4074e98e3e1Schristos        "cmpe $r2,$r0,$r1"
4084e98e3e1Schristos        (+ OP_CMPE r0 r1 r2 (f-resv0 0))
4094e98e3e1Schristos        (set r2 (eq SI r0 r1))
4104e98e3e1Schristos        ()
4114e98e3e1Schristos)
4124e98e3e1Schristos
4134e98e3e1Schristos(dni cmpei "compare equal immediate" ()
4144e98e3e1Schristos        "cmpei $r1,$r0,$imm"
4154e98e3e1Schristos        (+ OP_CMPEI r0 r1 imm)
4164e98e3e1Schristos        (set r1 (eq SI r0 (ext SI (trunc HI imm))))
4174e98e3e1Schristos        ()
4184e98e3e1Schristos)
4194e98e3e1Schristos
4204e98e3e1Schristos(dni cmpg "compare greater than" ()
4214e98e3e1Schristos        "cmpg $r2,$r0,$r1"
4224e98e3e1Schristos        (+ OP_CMPG r0 r1 r2 (f-resv0 0))
4234e98e3e1Schristos        (set r2 (gt SI r0 r1))
4244e98e3e1Schristos        ()
4254e98e3e1Schristos)
4264e98e3e1Schristos
4274e98e3e1Schristos(dni cmpgi "compare greater than immediate" ()
4284e98e3e1Schristos        "cmpgi $r1,$r0,$imm"
4294e98e3e1Schristos        (+ OP_CMPGI r0 r1 imm)
4304e98e3e1Schristos        (set r1 (gt SI r0 (ext SI (trunc HI imm))))
4314e98e3e1Schristos        ()
4324e98e3e1Schristos)
4334e98e3e1Schristos
4344e98e3e1Schristos(dni cmpge "compare greater or equal" ()
4354e98e3e1Schristos        "cmpge $r2,$r0,$r1"
4364e98e3e1Schristos        (+ OP_CMPGE r0 r1 r2 (f-resv0 0))
4374e98e3e1Schristos        (set r2 (ge SI r0 r1))
4384e98e3e1Schristos        ()
4394e98e3e1Schristos)
4404e98e3e1Schristos
4414e98e3e1Schristos(dni cmpgei "compare greater or equal immediate" ()
4424e98e3e1Schristos        "cmpgei $r1,$r0,$imm"
4434e98e3e1Schristos        (+ OP_CMPGEI r0 r1 imm)
4444e98e3e1Schristos        (set r1 (ge SI r0 (ext SI (trunc HI imm))))
4454e98e3e1Schristos        ()
4464e98e3e1Schristos)
4474e98e3e1Schristos
4484e98e3e1Schristos(dni cmpgeu "compare greater or equal unsigned" ()
4494e98e3e1Schristos        "cmpgeu $r2,$r0,$r1"
4504e98e3e1Schristos        (+ OP_CMPGEU r0 r1 r2 (f-resv0 0))
4514e98e3e1Schristos        (set r2 (geu SI r0 r1))
4524e98e3e1Schristos        ()
4534e98e3e1Schristos)
4544e98e3e1Schristos
4554e98e3e1Schristos(dni cmpgeui "compare greater or equal unsigned immediate" ()
4564e98e3e1Schristos        "cmpgeui $r1,$r0,$uimm"
4574e98e3e1Schristos        (+ OP_CMPGEUI r0 r1 uimm)
4584e98e3e1Schristos        (set r1 (geu SI r0 (zext SI uimm)))
4594e98e3e1Schristos        ()
4604e98e3e1Schristos)
4614e98e3e1Schristos
4624e98e3e1Schristos(dni cmpgu "compare greater than unsigned" ()
4634e98e3e1Schristos        "cmpgu $r2,$r0,$r1"
4644e98e3e1Schristos        (+ OP_CMPGU r0 r1 r2 (f-resv0 0))
4654e98e3e1Schristos        (set r2 (gtu SI r0 r1))
4664e98e3e1Schristos        ()
4674e98e3e1Schristos)
4684e98e3e1Schristos
4694e98e3e1Schristos(dni cmpgui "compare greater than unsigned immediate" ()
4704e98e3e1Schristos        "cmpgui $r1,$r0,$uimm"
4714e98e3e1Schristos        (+ OP_CMPGUI r0 r1 uimm)
4724e98e3e1Schristos        (set r1 (gtu SI r0 (zext SI uimm)))
4734e98e3e1Schristos        ()
4744e98e3e1Schristos)
4754e98e3e1Schristos
4764e98e3e1Schristos(dni cmpne "compare not equal" ()
4774e98e3e1Schristos        "cmpne $r2,$r0,$r1"
4784e98e3e1Schristos        (+ OP_CMPNE r0 r1 r2 (f-resv0 0))
4794e98e3e1Schristos        (set r2 (ne SI r0 r1))
4804e98e3e1Schristos        ()
4814e98e3e1Schristos)
4824e98e3e1Schristos
4834e98e3e1Schristos(dni cmpnei "compare not equal immediate" ()
4844e98e3e1Schristos        "cmpnei $r1,$r0,$imm"
4854e98e3e1Schristos        (+ OP_CMPNEI r0 r1 imm)
4864e98e3e1Schristos        (set r1 (ne SI r0 (ext SI (trunc HI imm))))
4874e98e3e1Schristos        ()
4884e98e3e1Schristos)
4894e98e3e1Schristos
4904e98e3e1Schristos(dni divu "unsigned divide" ()
4914e98e3e1Schristos        "divu $r2,$r0,$r1"
4924e98e3e1Schristos        (+ OP_DIVU r0 r1 r2 (f-resv0 0))
4934e98e3e1Schristos        (set pc (c-call USI "@cpu@_divu_insn" pc f-r0 f-r1 f-r2))
4944e98e3e1Schristos        ()
4954e98e3e1Schristos)
4964e98e3e1Schristos
4974e98e3e1Schristos(dni lb "load byte" ()
4984e98e3e1Schristos        "lb $r1,($r0+$imm)"
4994e98e3e1Schristos        (+ OP_LB r0 r1 imm)
5004e98e3e1Schristos        (set r1 (ext SI (mem QI (add r0 (ext SI (trunc HI imm))))))
5014e98e3e1Schristos        ()
5024e98e3e1Schristos)
5034e98e3e1Schristos
5044e98e3e1Schristos(dni lbu "load byte unsigned" ()
5054e98e3e1Schristos        "lbu $r1,($r0+$imm)"
5064e98e3e1Schristos        (+ OP_LBU r0 r1 imm)
5074e98e3e1Schristos        (set r1 (zext SI (mem QI (add r0 (ext SI (trunc HI imm))))))
5084e98e3e1Schristos        ()
5094e98e3e1Schristos)
5104e98e3e1Schristos
5114e98e3e1Schristos(dni lh "load halfword" ()
5124e98e3e1Schristos        "lh $r1,($r0+$imm)"
5134e98e3e1Schristos        (+ OP_LH r0 r1 imm)
5144e98e3e1Schristos        (set r1 (ext SI (mem HI (add r0 (ext SI (trunc HI imm))))))
5154e98e3e1Schristos        ()
5164e98e3e1Schristos)
5174e98e3e1Schristos
5184e98e3e1Schristos(dni lhu "load halfword unsigned" ()
5194e98e3e1Schristos        "lhu $r1,($r0+$imm)"
5204e98e3e1Schristos        (+ OP_LHU r0 r1 imm)
5214e98e3e1Schristos        (set r1 (zext SI (mem HI (add r0 (ext SI (trunc HI imm))))))
5224e98e3e1Schristos        ()
5234e98e3e1Schristos)
5244e98e3e1Schristos
5254e98e3e1Schristos(dni lw "load word" ()
5264e98e3e1Schristos        "lw $r1,($r0+$imm)"
5274e98e3e1Schristos        (+ OP_LW r0 r1 imm)
5284e98e3e1Schristos        (set r1 (mem SI (add r0 (ext SI (trunc HI imm)))))
5294e98e3e1Schristos        ()
5304e98e3e1Schristos)
5314e98e3e1Schristos
5324e98e3e1Schristos(dni modu "unsigned modulus" ()
5334e98e3e1Schristos        "modu $r2,$r0,$r1"
5344e98e3e1Schristos        (+ OP_MODU r0 r1 r2 (f-resv0 0))
5354e98e3e1Schristos        (set pc (c-call USI "@cpu@_modu_insn" pc f-r0 f-r1 f-r2))
5364e98e3e1Schristos        ()
5374e98e3e1Schristos)
5384e98e3e1Schristos
5394e98e3e1Schristos(dni mul "mulitply" ()
5404e98e3e1Schristos        "mul $r2,$r0,$r1"
5414e98e3e1Schristos        (+ OP_MUL r0 r1 r2 (f-resv0 0))
5424e98e3e1Schristos        (set r2 (mul r0 r1))
5434e98e3e1Schristos        ()
5444e98e3e1Schristos)
5454e98e3e1Schristos
5464e98e3e1Schristos(dni muli "multiply immediate" ()
5474e98e3e1Schristos        "muli $r1,$r0,$imm"
5484e98e3e1Schristos        (+ OP_MULI r0 r1 imm)
5494e98e3e1Schristos        (set r1 (mul r0 (ext SI (trunc HI imm))))
5504e98e3e1Schristos        ()
5514e98e3e1Schristos)
5524e98e3e1Schristos
5534e98e3e1Schristos(dni nor "nor" ()
5544e98e3e1Schristos        "nor $r2,$r0,$r1"
5554e98e3e1Schristos        (+ OP_NOR r0 r1 r2 (f-resv0 0))
5564e98e3e1Schristos        (set r2 (inv (or r0 r1)))
5574e98e3e1Schristos        ()
5584e98e3e1Schristos)
5594e98e3e1Schristos
5604e98e3e1Schristos(dni nori "nor immediate" ()
5614e98e3e1Schristos        "nori $r1,$r0,$uimm"
5624e98e3e1Schristos        (+ OP_NORI r0 r1 uimm)
5634e98e3e1Schristos        (set r1 (inv (or r0 (zext SI uimm))))
5644e98e3e1Schristos        ()
5654e98e3e1Schristos)
5664e98e3e1Schristos
5674e98e3e1Schristos(dni or "or" ()
5684e98e3e1Schristos        "or $r2,$r0,$r1"
5694e98e3e1Schristos        (+ OP_OR r0 r1 r2 (f-resv0 0))
5704e98e3e1Schristos        (set r2 (or r0 r1))
5714e98e3e1Schristos        ()
5724e98e3e1Schristos)
5734e98e3e1Schristos
5744e98e3e1Schristos(dni ori "or immediate" ()
5754e98e3e1Schristos        "ori $r1,$r0,$lo16"
5764e98e3e1Schristos        (+ OP_ORI r0 r1 lo16)
5774e98e3e1Schristos        (set r1 (or r0 (zext SI lo16)))
5784e98e3e1Schristos        ()
5794e98e3e1Schristos)
5804e98e3e1Schristos
5814e98e3e1Schristos(dni orhii "or high immediate" ()
5824e98e3e1Schristos        "orhi $r1,$r0,$hi16"
5834e98e3e1Schristos        (+ OP_ORHI r0 r1 hi16)
5844e98e3e1Schristos        (set r1 (or r0 (sll SI hi16 16)))
5854e98e3e1Schristos        ()
5864e98e3e1Schristos)
5874e98e3e1Schristos
5884e98e3e1Schristos(dni rcsr "read control or status register" ()
5894e98e3e1Schristos        "rcsr $r2,$csr"
5904e98e3e1Schristos        (+ OP_RCSR csr (f-r1 0) r2 (f-resv0 0))
5914e98e3e1Schristos        (set r2 csr)
5924e98e3e1Schristos        ()
5934e98e3e1Schristos)
5944e98e3e1Schristos
5954e98e3e1Schristos(dni sb "store byte" ()
5964e98e3e1Schristos        "sb ($r0+$imm),$r1"
5974e98e3e1Schristos        (+ OP_SB r0 r1 imm)
5984e98e3e1Schristos        (set (mem QI (add r0 (ext SI (trunc HI imm)))) r1)
5994e98e3e1Schristos        ()
6004e98e3e1Schristos)
6014e98e3e1Schristos
6024e98e3e1Schristos(dni sextb "sign extend byte" ()
6034e98e3e1Schristos        "sextb $r2,$r0"
6044e98e3e1Schristos        (+ OP_SEXTB r0 (f-r1 0) r2 (f-resv0 0))
6054e98e3e1Schristos        (set r2 (ext SI (trunc QI r0)))
6064e98e3e1Schristos        ()
6074e98e3e1Schristos)
6084e98e3e1Schristos
6094e98e3e1Schristos(dni sexth "sign extend half-word" ()
6104e98e3e1Schristos        "sexth $r2,$r0"
6114e98e3e1Schristos        (+ OP_SEXTH r0 (f-r1 0) r2 (f-resv0 0))
6124e98e3e1Schristos        (set r2 (ext SI (trunc HI r0)))
6134e98e3e1Schristos        ()
6144e98e3e1Schristos)
6154e98e3e1Schristos
6164e98e3e1Schristos(dni sh "store halfword" ()
6174e98e3e1Schristos        "sh ($r0+$imm),$r1"
6184e98e3e1Schristos        (+ OP_SH r0 r1 imm)
6194e98e3e1Schristos        (set (mem HI (add r0 (ext SI (trunc HI imm)))) r1)
6204e98e3e1Schristos        ()
6214e98e3e1Schristos)
6224e98e3e1Schristos
6234e98e3e1Schristos(dni sl "shift left" ()
6244e98e3e1Schristos        "sl $r2,$r0,$r1"
6254e98e3e1Schristos        (+ OP_SL r0 r1 r2 (f-resv0 0))
6264e98e3e1Schristos        (set r2 (sll SI r0 r1))
6274e98e3e1Schristos        ()
6284e98e3e1Schristos)
6294e98e3e1Schristos
6304e98e3e1Schristos(dni sli "shift left immediate" ()
6314e98e3e1Schristos        "sli $r1,$r0,$imm"
6324e98e3e1Schristos        (+ OP_SLI r0 r1 imm)
6334e98e3e1Schristos        (set r1 (sll SI r0 imm))
6344e98e3e1Schristos        ()
6354e98e3e1Schristos)
6364e98e3e1Schristos
6374e98e3e1Schristos(dni sr "shift right" ()
6384e98e3e1Schristos        "sr $r2,$r0,$r1"
6394e98e3e1Schristos        (+ OP_SR r0 r1 r2 (f-resv0 0))
6404e98e3e1Schristos        (set r2 (sra SI r0 r1))
6414e98e3e1Schristos        ()
6424e98e3e1Schristos)
6434e98e3e1Schristos
6444e98e3e1Schristos(dni sri "shift right immediate" ()
6454e98e3e1Schristos        "sri $r1,$r0,$imm"
6464e98e3e1Schristos        (+ OP_SRI r0 r1 imm)
6474e98e3e1Schristos        (set r1 (sra SI r0 imm))
6484e98e3e1Schristos        ()
6494e98e3e1Schristos)
6504e98e3e1Schristos
6514e98e3e1Schristos(dni sru "shift right unsigned" ()
6524e98e3e1Schristos        "sru $r2,$r0,$r1"
6534e98e3e1Schristos        (+ OP_SRU r0 r1 r2 (f-resv0 0))
6544e98e3e1Schristos        (set r2 (srl SI r0 r1))
6554e98e3e1Schristos        ()
6564e98e3e1Schristos)
6574e98e3e1Schristos
6584e98e3e1Schristos(dni srui "shift right unsigned immediate" ()
6594e98e3e1Schristos        "srui $r1,$r0,$imm"
6604e98e3e1Schristos        (+ OP_SRUI r0 r1 imm)
6614e98e3e1Schristos        (set r1 (srl SI r0 imm))
6624e98e3e1Schristos        ()
6634e98e3e1Schristos)
6644e98e3e1Schristos
6654e98e3e1Schristos(dni sub "subtract" ()
6664e98e3e1Schristos        "sub $r2,$r0,$r1"
6674e98e3e1Schristos        (+ OP_SUB r0 r1 r2 (f-resv0 0))
6684e98e3e1Schristos        (set r2 (sub r0 r1))
6694e98e3e1Schristos        ()
6704e98e3e1Schristos)
6714e98e3e1Schristos
6724e98e3e1Schristos(dni sw "store word" ()
6734e98e3e1Schristos        "sw ($r0+$imm),$r1"
6744e98e3e1Schristos        (+ OP_SW r0 r1 imm)
6754e98e3e1Schristos        (set (mem SI (add r0 (ext SI (trunc HI imm)))) r1)
6764e98e3e1Schristos        ()
6774e98e3e1Schristos)
6784e98e3e1Schristos
6794e98e3e1Schristos(dni user "user defined instruction" ()
6804e98e3e1Schristos        "user $r2,$r0,$r1,$user"
6814e98e3e1Schristos        (+ OP_USER r0 r1 r2 user)
6824e98e3e1Schristos        (set r2 (c-call SI "@cpu@_user_insn" r0 r1 user))
6834e98e3e1Schristos        ()
6844e98e3e1Schristos)
6854e98e3e1Schristos
6864e98e3e1Schristos(dni wcsr "write control or status register" ()
6874e98e3e1Schristos        "wcsr $csr,$r1"
6884e98e3e1Schristos        (+ OP_WCSR csr r1 (f-r2 0) (f-resv0 0))
6894e98e3e1Schristos        (c-call VOID "@cpu@_wcsr_insn" f-csr r1)
6904e98e3e1Schristos        ()
6914e98e3e1Schristos)
6924e98e3e1Schristos
6934e98e3e1Schristos(dni xor "xor" ()
6944e98e3e1Schristos        "xor $r2,$r0,$r1"
6954e98e3e1Schristos        (+ OP_XOR r0 r1 r2 (f-resv0 0))
6964e98e3e1Schristos        (set r2 (xor r0 r1))
6974e98e3e1Schristos        ()
6984e98e3e1Schristos)
6994e98e3e1Schristos
7004e98e3e1Schristos(dni xori "xor immediate" ()
7014e98e3e1Schristos        "xori $r1,$r0,$uimm"
7024e98e3e1Schristos        (+ OP_XORI r0 r1 uimm)
7034e98e3e1Schristos        (set r1 (xor r0 (zext SI uimm)))
7044e98e3e1Schristos        ()
7054e98e3e1Schristos)
7064e98e3e1Schristos
7074e98e3e1Schristos(dni xnor "xnor" ()
7084e98e3e1Schristos        "xnor $r2,$r0,$r1"
7094e98e3e1Schristos        (+ OP_XNOR r0 r1 r2 (f-resv0 0))
7104e98e3e1Schristos        (set r2 (inv (xor r0 r1)))
7114e98e3e1Schristos        ()
7124e98e3e1Schristos)
7134e98e3e1Schristos
7144e98e3e1Schristos(dni xnori "xnor immediate" ()
7154e98e3e1Schristos        "xnori $r1,$r0,$uimm"
7164e98e3e1Schristos        (+ OP_XNORI r0 r1 uimm)
7174e98e3e1Schristos        (set r1 (inv (xor r0 (zext SI uimm))))
7184e98e3e1Schristos        ()
7194e98e3e1Schristos)
7204e98e3e1Schristos
7214e98e3e1Schristos; Pseudo instructions
7224e98e3e1Schristos
7234e98e3e1Schristos(dni break "breakpoint" ()
7244e98e3e1Schristos        "break"
7254e98e3e1Schristos        (+ OP_RAISE (f-exception 2))
7264e98e3e1Schristos        (set pc (c-call USI "@cpu@_break_insn" pc))
7274e98e3e1Schristos        ()
7284e98e3e1Schristos)
7294e98e3e1Schristos
7304e98e3e1Schristos(dni scall "system call" ()
7314e98e3e1Schristos        "scall"
7324e98e3e1Schristos        (+ OP_RAISE (f-exception 7))
7334e98e3e1Schristos        (set pc (c-call USI "@cpu@_scall_insn" pc))
7344e98e3e1Schristos        ()
7354e98e3e1Schristos)
7364e98e3e1Schristos
7374e98e3e1Schristos(dni bret "return from breakpoint" (ALIAS)
7384e98e3e1Schristos        "bret"
7394e98e3e1Schristos        (+ OP_B (f-r0 31) (f-r1 0) (f-r2 0) (f-resv0 0))
7404e98e3e1Schristos        (set pc (c-call USI "@cpu@_bret_insn" r0))
7414e98e3e1Schristos        ()
7424e98e3e1Schristos)
7434e98e3e1Schristos
7444e98e3e1Schristos(dni eret "return from exception" (ALIAS)
7454e98e3e1Schristos        "eret"
7464e98e3e1Schristos        (+ OP_B (f-r0 30) (f-r1 0) (f-r2 0) (f-resv0 0))
7474e98e3e1Schristos        (set pc (c-call USI "@cpu@_eret_insn" r0))
7484e98e3e1Schristos        ()
7494e98e3e1Schristos)
7504e98e3e1Schristos
7514e98e3e1Schristos(dni ret "return" (ALIAS)
7524e98e3e1Schristos        "ret"
7534e98e3e1Schristos        (+ OP_B (f-r0 29) (f-r1 0) (f-r2 0) (f-resv0 0))
7544e98e3e1Schristos        (set pc r0)
7554e98e3e1Schristos        ()
7564e98e3e1Schristos)
7574e98e3e1Schristos
7584e98e3e1Schristos(dni mv "move" (ALIAS)
7594e98e3e1Schristos        "mv $r2,$r0"
7604e98e3e1Schristos        (+ OP_OR r0 (f-r1 0) r2 (f-resv0 0))
7614e98e3e1Schristos        (set r2 r0)
7624e98e3e1Schristos        ()
7634e98e3e1Schristos)
7644e98e3e1Schristos
7654e98e3e1Schristos(dni mvi "move immediate" (ALIAS)
7664e98e3e1Schristos        "mvi $r1,$imm"
7674e98e3e1Schristos        (+ OP_ADDI (f-r0 0) r1 imm)
7684e98e3e1Schristos        (set r1 (add r0 (ext SI (trunc HI imm))))
7694e98e3e1Schristos        ()
7704e98e3e1Schristos)
7714e98e3e1Schristos
7724e98e3e1Schristos(dni mvui "move unsigned immediate" (ALIAS)
7734e98e3e1Schristos        "mvu $r1,$lo16"
7744e98e3e1Schristos        (+ OP_ORI (f-r0 0) r1 lo16)
7754e98e3e1Schristos        (set r1 (zext SI lo16))
7764e98e3e1Schristos        ()
7774e98e3e1Schristos)
7784e98e3e1Schristos
7794e98e3e1Schristos(dni mvhi "move high immediate" (ALIAS)
7804e98e3e1Schristos        "mvhi $r1,$hi16"
7814e98e3e1Schristos        (+ OP_ORHI (f-r0 0) r1 hi16)
7824e98e3e1Schristos        (set r1 (or r0 (sll SI hi16 16)))
7834e98e3e1Schristos        ()
7844e98e3e1Schristos)
7854e98e3e1Schristos
7864e98e3e1Schristos(dni mva "move address" (ALIAS)
7874e98e3e1Schristos        "mva $r1,$gp16"
7884e98e3e1Schristos        (+ OP_ADDI (f-r0 26) r1 gp16)
7894e98e3e1Schristos        (set r1 (add r0 (ext SI (trunc HI gp16))))
7904e98e3e1Schristos        ()
7914e98e3e1Schristos)
7924e98e3e1Schristos
7934e98e3e1Schristos(dni not "not" (ALIAS)
7944e98e3e1Schristos        "not $r2,$r0"
7954e98e3e1Schristos        (+ OP_XNOR r0 (f-r1 0) r2 (f-resv0 0))
7964e98e3e1Schristos        (set r2 (inv r0))
7974e98e3e1Schristos        ()
7984e98e3e1Schristos)
7994e98e3e1Schristos
8004e98e3e1Schristos(dni nop "nop" (ALIAS)
8014e98e3e1Schristos        "nop"
8024e98e3e1Schristos        (+ OP_ADDI (f-r0 0) (f-r1 0) (f-imm 0))
8034e98e3e1Schristos        (set r0 r0)
8044e98e3e1Schristos        ()
8054e98e3e1Schristos)
8064e98e3e1Schristos
8074e98e3e1Schristos(dni lbgprel "load byte gp relative" (ALIAS)
8084e98e3e1Schristos        "lb $r1,$gp16"
8094e98e3e1Schristos        (+ OP_LB (f-r0 26) r1 gp16)
8104e98e3e1Schristos        (set r1 (ext SI (mem QI (add r0 (ext SI (trunc HI gp16))))))
8114e98e3e1Schristos        ()
8124e98e3e1Schristos)
8134e98e3e1Schristos
8144e98e3e1Schristos(dni lbugprel "load byte unsigned gp relative" (ALIAS)
8154e98e3e1Schristos        "lbu $r1,$gp16"
8164e98e3e1Schristos        (+ OP_LBU (f-r0 26) r1 gp16)
8174e98e3e1Schristos        (set r1 (zext SI (mem QI (add r0 (ext SI (trunc HI gp16))))))
8184e98e3e1Schristos        ()
8194e98e3e1Schristos)
8204e98e3e1Schristos
8214e98e3e1Schristos(dni lhgprel "load halfword gp relative" (ALIAS)
8224e98e3e1Schristos        "lh $r1,$gp16"
8234e98e3e1Schristos        (+ OP_LH (f-r0 26) r1 gp16)
8244e98e3e1Schristos        (set r1 (ext SI (mem HI (add r0 (ext SI (trunc HI gp16))))))
8254e98e3e1Schristos        ()
8264e98e3e1Schristos)
8274e98e3e1Schristos
8284e98e3e1Schristos(dni lhugprel "load halfword unsigned gp relative" (ALIAS)
8294e98e3e1Schristos        "lhu $r1,$gp16"
8304e98e3e1Schristos        (+ OP_LHU (f-r0 26) r1 gp16)
8314e98e3e1Schristos        (set r1 (zext SI (mem HI (add r0 (ext SI (trunc HI gp16))))))
8324e98e3e1Schristos        ()
8334e98e3e1Schristos)
8344e98e3e1Schristos
8354e98e3e1Schristos(dni lwgprel "load word gp relative" (ALIAS)
8364e98e3e1Schristos        "lw $r1,$gp16"
8374e98e3e1Schristos        (+ OP_LW (f-r0 26) r1 gp16)
8384e98e3e1Schristos        (set r1 (mem SI (add r0 (ext SI (trunc HI gp16)))))
8394e98e3e1Schristos        ()
8404e98e3e1Schristos)
8414e98e3e1Schristos
8424e98e3e1Schristos(dni sbgprel "store byte gp relative" (ALIAS)
8434e98e3e1Schristos        "sb $gp16,$r1"
8444e98e3e1Schristos        (+ OP_SB (f-r0 26) r1 gp16)
8454e98e3e1Schristos        (set (mem QI (add r0 (ext SI (trunc HI gp16)))) r1)
8464e98e3e1Schristos        ()
8474e98e3e1Schristos)
8484e98e3e1Schristos
8494e98e3e1Schristos(dni shgprel "store halfword gp relative" (ALIAS)
8504e98e3e1Schristos        "sh $gp16,$r1"
8514e98e3e1Schristos        (+ OP_SH (f-r0 26) r1 gp16)
8524e98e3e1Schristos        (set (mem HI (add r0 (ext SI (trunc HI gp16)))) r1)
8534e98e3e1Schristos        ()
8544e98e3e1Schristos)
8554e98e3e1Schristos
8564e98e3e1Schristos(dni swgprel "store word gp relative" (ALIAS)
8574e98e3e1Schristos        "sw $gp16,$r1"
8584e98e3e1Schristos        (+ OP_SW (f-r0 26) r1 gp16)
8594e98e3e1Schristos        (set (mem SI (add r0 (ext SI (trunc HI gp16)))) r1)
8604e98e3e1Schristos        ()
8614e98e3e1Schristos)
8624e98e3e1Schristos
8634e98e3e1Schristos(dni lwgotrel "load word got relative" (ALIAS)
8644e98e3e1Schristos        "lw $r1,(gp+$got16)"
8654e98e3e1Schristos        (+ OP_LW (f-r0 26) r1 got16)
8664e98e3e1Schristos        (set r1 (mem SI (add r0 (ext SI (trunc HI got16)))))
8674e98e3e1Schristos        ()
8684e98e3e1Schristos)
8694e98e3e1Schristos
8704e98e3e1Schristos(dni orhigotoffi "or high got offset immediate" (ALIAS)
8714e98e3e1Schristos        "orhi $r1,$r0,$gotoffhi16"
8724e98e3e1Schristos        (+ OP_ORHI r0 r1 gotoffhi16)
8734e98e3e1Schristos        (set r1 (or r0 (sll SI gotoffhi16 16)))
8744e98e3e1Schristos        ()
8754e98e3e1Schristos)
8764e98e3e1Schristos
8774e98e3e1Schristos(dni addgotoff "add got offset" (ALIAS)
8784e98e3e1Schristos        "addi $r1,$r0,$gotofflo16"
8794e98e3e1Schristos        (+ OP_ADDI r0 r1 gotofflo16)
8804e98e3e1Schristos        (set r1 (add r0 (ext SI (trunc HI gotofflo16))))
8814e98e3e1Schristos        ()
8824e98e3e1Schristos)
8834e98e3e1Schristos
8844e98e3e1Schristos(dni swgotoff "store word got offset" (ALIAS)
8854e98e3e1Schristos        "sw ($r0+$gotofflo16),$r1"
8864e98e3e1Schristos        (+ OP_SW r0 r1 gotofflo16)
8874e98e3e1Schristos        (set (mem SI (add r0 (ext SI (trunc HI gotofflo16)))) r1)
8884e98e3e1Schristos        ()
8894e98e3e1Schristos)
8904e98e3e1Schristos
8914e98e3e1Schristos(dni lwgotoff "load word got offset" (ALIAS)
8924e98e3e1Schristos        "lw $r1,($r0+$gotofflo16)"
8934e98e3e1Schristos        (+ OP_LW r0 r1 gotofflo16)
8944e98e3e1Schristos        (set r1 (mem SI (add r0 (ext SI (trunc HI gotofflo16)))))
8954e98e3e1Schristos        ()
8964e98e3e1Schristos)
8974e98e3e1Schristos
8984e98e3e1Schristos(dni shgotoff "store half word got offset" (ALIAS)
8994e98e3e1Schristos        "sh ($r0+$gotofflo16),$r1"
9004e98e3e1Schristos        (+ OP_SH r0 r1 gotofflo16)
9014e98e3e1Schristos        (set (mem HI (add r0 (ext SI (trunc HI gotofflo16)))) r1)
9024e98e3e1Schristos        ()
9034e98e3e1Schristos)
9044e98e3e1Schristos
9054e98e3e1Schristos(dni lhgotoff "load half word got offset" (ALIAS)
9064e98e3e1Schristos        "lh $r1,($r0+$gotofflo16)"
9074e98e3e1Schristos        (+ OP_LH r0 r1 gotofflo16)
9084e98e3e1Schristos        (set r1 (ext SI (mem HI (add r0 (ext SI (trunc HI gotofflo16))))))
9094e98e3e1Schristos        ()
9104e98e3e1Schristos)
9114e98e3e1Schristos
9124e98e3e1Schristos(dni lhugotoff "load half word got offset unsigned" (ALIAS)
9134e98e3e1Schristos        "lhu $r1,($r0+$gotofflo16)"
9144e98e3e1Schristos        (+ OP_LHU r0 r1 gotofflo16)
9154e98e3e1Schristos        (set r1 (zext SI (mem HI (add r0 (ext SI (trunc HI gotofflo16))))))
9164e98e3e1Schristos        ()
9174e98e3e1Schristos)
9184e98e3e1Schristos
9194e98e3e1Schristos(dni sbgotoff "store byte got offset" (ALIAS)
9204e98e3e1Schristos        "sb ($r0+$gotofflo16),$r1"
9214e98e3e1Schristos        (+ OP_SB r0 r1 gotofflo16)
9224e98e3e1Schristos        (set (mem QI (add r0 (ext SI (trunc HI gotofflo16)))) r1)
9234e98e3e1Schristos        ()
9244e98e3e1Schristos)
9254e98e3e1Schristos
9264e98e3e1Schristos(dni lbgotoff "load byte got offset" (ALIAS)
9274e98e3e1Schristos        "lb $r1,($r0+$gotofflo16)"
9284e98e3e1Schristos        (+ OP_LB r0 r1 gotofflo16)
9294e98e3e1Schristos        (set r1 (ext SI (mem QI (add r0 (ext SI (trunc HI gotofflo16))))))
9304e98e3e1Schristos        ()
9314e98e3e1Schristos)
9324e98e3e1Schristos
9334e98e3e1Schristos(dni lbugotoff "load byte got offset unsigned" (ALIAS)
9344e98e3e1Schristos        "lbu $r1,($r0+$gotofflo16)"
9354e98e3e1Schristos        (+ OP_LBU r0 r1 gotofflo16)
9364e98e3e1Schristos        (set r1 (zext SI (mem QI (add r0 (ext SI (trunc HI gotofflo16))))))
9374e98e3e1Schristos        ()
9384e98e3e1Schristos)
939