|  | ; Toshiba MeP Media Engine architecture description.  -*- Scheme -*- | 
|  | ; Copyright 2011 Free Software Foundation, Inc. | 
|  | ; | 
|  | ; Contributed by Red Hat Inc; | 
|  | ; | 
|  | ; This file is part of the GNU Binutils. | 
|  | ; | 
|  | ; This program is free software; you can redistribute it and/or modify | 
|  | ; it under the terms of the GNU General Public License as published by | 
|  | ; the Free Software Foundation; either version 3 of the License, or | 
|  | ; (at your option) any later version. | 
|  | ; | 
|  | ; This program is distributed in the hope that it will be useful, | 
|  | ; but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | ; GNU General Public License for more details. | 
|  | ; | 
|  | ; You should have received a copy of the GNU General Public License | 
|  | ; along with this program; if not, write to the Free Software | 
|  | ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
|  | ; MA 02110-1301, USA. | 
|  |  | 
|  | (include "simplify.inc") | 
|  |  | 
|  | (define-pmacro isa-enum () | 
|  | (isas mep | 
|  | ; begin-isa-enum | 
|  | ext_core1 ext_cop1_16 ext_cop1_32 ext_cop1_48 ext_cop1_64 | 
|  | ; end-isa-enum | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (define-arch | 
|  | (name mep) | 
|  | (comment "Toshiba MeP Media Engine") | 
|  | (insn-lsb0? #f) ;; work around cgen limitation | 
|  | (machs mep h1 c5) | 
|  | isa-enum | 
|  | ) | 
|  |  | 
|  | (define-isa | 
|  | (name mep) | 
|  | (comment "MeP core instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | ; begin-isas | 
|  | (define-isa | 
|  | (name ext_core1) | 
|  | (comment "MeP core extension instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-isa | 
|  | (name ext_cop1_16) | 
|  | (comment "MeP coprocessor instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-isa | 
|  | (name ext_cop1_32) | 
|  | (comment "MeP coprocessor instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-isa | 
|  | (name ext_cop1_48) | 
|  | (comment "MeP coprocessor instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-isa | 
|  | (name ext_cop1_64) | 
|  | (comment "MeP coprocessor instruction set") | 
|  | (default-insn-word-bitsize 32) | 
|  | (default-insn-bitsize 32) | 
|  | (base-insn-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-pmacro all-mep-isas () (ISA mep,ext_core1,ext_cop1_16,ext_cop1_32,ext_cop1_48,ext_cop1_64)) | 
|  |  | 
|  | (define-pmacro all-mep-core-isas () (ISA mep,ext_core1,ext_cop1_32)) | 
|  |  | 
|  | (define-pmacro all-core-isa-list () mep,ext_core1) | 
|  | ; end-isas | 
|  |  | 
|  | (define-cpu | 
|  | (name mepf) | 
|  | (comment "MeP family") | 
|  | (endian either) | 
|  | (insn-chunk-bitsize 16) | 
|  | (word-bitsize 32) | 
|  | ) | 
|  |  | 
|  | (define-mach | 
|  | (name mep) | 
|  | (comment "MeP media engine") | 
|  | (cpu mepf) | 
|  | isa-enum | 
|  | ) | 
|  |  | 
|  | (define-mach | 
|  | (name h1) | 
|  | (comment "H1 media engine") | 
|  | (cpu mepf) | 
|  | isa-enum | 
|  | ) | 
|  |  | 
|  | (define-mach | 
|  | (name c5) | 
|  | (comment "C5 media engine") | 
|  | (cpu mepf) | 
|  | isa-enum | 
|  | ) | 
|  |  | 
|  | (define-model | 
|  | (name mep) | 
|  | (comment "MeP media engine processor") | 
|  | (mach c5) ; mach gets changed by MeP-Integrator | 
|  |  | 
|  | (unit u-exec "execution unit" () | 
|  | 1 1 ; issue done | 
|  | () () () ()) | 
|  |  | 
|  | ; Branch unit | 
|  | (unit u-branch "Branch Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | ((pc)) ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Multiply unit | 
|  | (unit u-multiply "Multiply Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Divide unit | 
|  | (unit u-divide "Divide Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Stcb unit | 
|  | (unit u-stcb "stcb Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Ldcb unit | 
|  | (unit u-ldcb "ldcb Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Load gpr unit | 
|  | (unit u-load-gpr "Load into GPR Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | ((loadreg INT -1)) ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | (unit u-ldcb-gpr "Ldcb into GPR Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | ((loadreg INT -1)) ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Multiply into GPR unit | 
|  | (unit u-mul-gpr "Multiply into GPR Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | ((resultreg INT -1)) ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Use gpr unit -- stalls if GPR not ready | 
|  | (unit u-use-gpr "Use GPR Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | ((usereg INT -1)) ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Use ctrl-reg unit -- stalls if CTRL-REG not ready | 
|  | (unit u-use-ctrl-reg "Use CTRL-REG Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | ((usereg INT -1)) ; inputs | 
|  | () ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  |  | 
|  | ; Store ctrl-reg unit -- stalls if CTRL-REG not ready | 
|  | (unit u-store-ctrl-reg "Store CTRL-REG Unit" () | 
|  | 0 0 ; issue done | 
|  | () ; state | 
|  | () ; inputs | 
|  | ((storereg INT -1)) ; outputs | 
|  | () ; profile action (default) | 
|  | ) | 
|  | ) | 
|  |  | 
|  | ; Hardware elements. | 
|  |  | 
|  | (dnh h-pc "program counter" (PC PROFILE all-mep-isas) (pc) () () ()) | 
|  |  | 
|  | (define-hardware | 
|  | (name h-gpr) | 
|  | (comment "General purpose registers") | 
|  | (attrs all-mep-isas CACHE-ADDR PROFILE) | 
|  | (type register SI (16)) | 
|  | (indices keyword "$" | 
|  | (("0" 0) ("1" 1) ("2" 2) ("3" 3) ("4" 4) ("5" 5) | 
|  | ("6" 6) ("7" 7) ("8" 8) ("9" 9) ("10" 10) ("11" 11) | 
|  | ; "$8" is the preferred name for register 8, but "$tp", "$gp" | 
|  | ; and "$sp" are preferred for their respective registers. | 
|  | (fp  8) (tp 13) (gp 14) (sp 15) | 
|  | ("12" 12) ("13" 13) ("14" 14) ("15" 15))) | 
|  | ) | 
|  |  | 
|  | (define-hardware | 
|  | (name h-csr) | 
|  | (comment "Control/special registers") | 
|  | (attrs all-mep-isas PROFILE) | 
|  | (type register SI (32)) | 
|  | (indices keyword "$" | 
|  | ((pc 0)   (lp 1)   (sar 2)   (rpb  4) (rpe 5)   (rpc 6) | 
|  | (hi 7)   (lo 8)   (mb0 12)  (me0 13) (mb1 14)  (me1 15) | 
|  | (psw 16) (id 17)  (tmp 18)  (epc 19) (exc 20)  (cfg 21) | 
|  | (npc 23) (dbg 24) (depc 25) (opt 26) (rcfg 27) (ccfg 28) | 
|  | ; begin-extra-csr-registers | 
|  | (vid 22) | 
|  | ; end-extra-csr-registers | 
|  | )) | 
|  | (get (index) (c-call SI "cgen_get_csr_value" index)) | 
|  | (set (index newval) (c-call VOID "cgen_set_csr_value" index newval)) | 
|  | ) | 
|  |  | 
|  | (define-pmacro (-reg-pair n) ((.sym n) n)) | 
|  | (define-hardware | 
|  | (name h-cr64) | 
|  | (comment "64-bit coprocessor registers") | 
|  | (attrs all-mep-isas) | 
|  | ; This assumes that the data path of the co-pro is 64 bits. | 
|  | (type register DI (32)) | 
|  | (indices keyword "$c" (.map -reg-pair (.iota 32))) | 
|  | (set (index newval) (c-call VOID "h_cr64_queue_set" index newval)) | 
|  | ) | 
|  | (define-hardware | 
|  | (name h-cr64-w) | 
|  | (comment "64-bit coprocessor registers, pending writes") | 
|  | (attrs all-mep-isas) | 
|  | ; This assumes that the data path of the co-pro is 64 bits. | 
|  | (type register DI (32)) | 
|  | ) | 
|  |  | 
|  | (define-hardware | 
|  | (name h-cr) | 
|  | (comment "32-bit coprocessor registers") | 
|  | (attrs all-mep-isas VIRTUAL) | 
|  | (type register SI (32)) | 
|  | (indices keyword "$c" (.map -reg-pair (.iota 32))) | 
|  | (set (index newval) (c-call VOID "h_cr64_set" index (ext DI newval))) | 
|  | (get (index) (trunc SI (c-call DI "h_cr64_get" index))) | 
|  | ) | 
|  |  | 
|  | ;; Given a coprocessor control register number N, expand to a | 
|  | ;; name/index pair: ($ccrN N) | 
|  | (define-pmacro (-ccr-reg-pair n) ((.sym "$ccr" n) n)) | 
|  |  | 
|  | (define-hardware | 
|  | (name h-ccr) | 
|  | (comment "Coprocessor control registers") | 
|  | (attrs all-mep-isas) | 
|  | (type register SI (64)) | 
|  | (indices keyword "" (.map -ccr-reg-pair (.iota 64))) | 
|  | (set (index newval) (c-call VOID "h_ccr_queue_set" index newval)) | 
|  | ) | 
|  | (define-hardware | 
|  | (name h-ccr-w) | 
|  | (comment "Coprocessor control registers, pending writes") | 
|  | (attrs all-mep-isas) | 
|  | (type register SI (64)) | 
|  | ) | 
|  |  | 
|  |  | 
|  | ; Instruction fields.  Bit numbering reversed. | 
|  |  | 
|  | ; Conventions: | 
|  | ; | 
|  | ; N = number of bits in value | 
|  | ; A = alignment (2 or 4, omit for 1) | 
|  | ; B = leftmost (i.e. closest to zero) bit position | 
|  | ; | 
|  | ; -- Generic Fields (f-*) -- | 
|  | ; N		number of bits in *value* (1-24) | 
|  | ; [us]		signed vs unsigned | 
|  | ; B		position of left-most bit (4-16) | 
|  | ; aA		opt. alignment (2=drop 1 lsb, 4=drop 2 lsbs, etc) | 
|  | ; n		opt. for noncontiguous fields | 
|  | ; f-foo-{hi,lo}	msb/lsb parts of field f-foo | 
|  | ; | 
|  | ; -- Operands -- | 
|  | ; pcrelNaA	PC-relative branch target (signed) | 
|  | ; pcabsNaA	Absolute branch target (unsigned) | 
|  | ; | 
|  | ; [us]dispNaA	[un]signed displacement | 
|  | ; [us]immN	[un]signed immediate value | 
|  | ; addrNaA	absolute address (unsigned) | 
|  | ; | 
|  | ; Additional prefixes may be used for special cases. | 
|  |  | 
|  | (dnf f-major   "major opcode"            (all-mep-core-isas)    0  4) | 
|  |  | 
|  | (dnf f-rn      "register n"              (all-mep-core-isas)    4  4) | 
|  | (dnf f-rn3     "register 0-7"            (all-mep-core-isas)    5  3) | 
|  | (dnf f-rm      "register m"              (all-mep-core-isas)    8  4) | 
|  | (dnf f-rl      "register l"              (all-mep-core-isas)   12  4) | 
|  | (dnf f-sub2    "sub opcode (2 bits)"     (all-mep-core-isas)   14  2) | 
|  | (dnf f-sub3    "sub opcode (3 bits)"     (all-mep-core-isas)   13  3) | 
|  | (dnf f-sub4    "sub opcode (4 bits)"     (all-mep-core-isas)   12  4) | 
|  | (dnf f-ext     "extended field"          (all-mep-core-isas)   16  8) | 
|  | (dnf f-ext4    "extended field 16:4"     (all-mep-core-isas)   16  4) | 
|  | (dnf f-ext62   "extended field 20:2"     (all-mep-core-isas)   20  2) | 
|  | (dnf f-crn     "copro register n"        (all-mep-core-isas)    4  4) | 
|  |  | 
|  | (df f-csrn-hi "cr hi 1u15" (all-mep-core-isas) 15 1 UINT #f #f) | 
|  | (df f-csrn-lo "cr lo 4u8"  (all-mep-core-isas)  8 4 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-csrn) | 
|  | (comment "control reg") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-csrn-hi f-csrn-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-csrn-lo) (and (ifield f-csrn) #xf)) | 
|  | (set (ifield f-csrn-hi) (srl (ifield f-csrn) 4)))) | 
|  | (extract (set (ifield f-csrn) | 
|  | (or (sll (ifield f-csrn-hi) 4) (ifield f-csrn-lo)))) | 
|  | ) | 
|  |  | 
|  | (df f-crnx-hi "crx hi 1u28" (all-mep-core-isas) 28 1 UINT #f #f) | 
|  | (df f-crnx-lo "crx lo 4u4"  (all-mep-core-isas)  4 4 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-crnx) | 
|  | (comment "copro register n (0-31)") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-crnx-hi f-crnx-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-crnx-lo) (and (ifield f-crnx) #xf)) | 
|  | (set (ifield f-crnx-hi) (srl (ifield f-crnx) 4)))) | 
|  | (extract (set (ifield f-crnx) | 
|  | (or (sll (ifield f-crnx-hi) 4) (ifield f-crnx-lo)))) | 
|  | ) | 
|  |  | 
|  | ; Miscellaneous fields. | 
|  |  | 
|  | (define-pmacro (dnfb n) | 
|  | (dnf (.sym f- n) (.str "bit " n) (all-mep-isas) n 1)) | 
|  |  | 
|  | ; Define small fields used throughout the instruction set description. | 
|  | ; Each field (eg. `f-N') is at single bit field at position N. | 
|  |  | 
|  | (dnfb  0) | 
|  | (dnfb  1) | 
|  | (dnfb  2) | 
|  | (dnfb  3) | 
|  | (dnfb  4) | 
|  | (dnfb  5) | 
|  | (dnfb  6) | 
|  | (dnfb  7) | 
|  | (dnfb  8) | 
|  | (dnfb  9) | 
|  | (dnfb  10) | 
|  | (dnfb  11) | 
|  | (dnfb  12) | 
|  | (dnfb  13) | 
|  | (dnfb  14) | 
|  | (dnfb  15) | 
|  | (dnfb  16) | 
|  | (dnfb  17) | 
|  | (dnfb  18) | 
|  | (dnfb  19) | 
|  | (dnfb  20) | 
|  | (dnfb  21) | 
|  | (dnfb  22) | 
|  | (dnfb  23) | 
|  | (dnfb  24) | 
|  | (dnfb  25) | 
|  | (dnfb  26) | 
|  | (dnfb  27) | 
|  | (dnfb  28) | 
|  | (dnfb  29) | 
|  | (dnfb  30) | 
|  | (dnfb  31) | 
|  |  | 
|  | ; Branch/Jump target addresses | 
|  |  | 
|  | (df f-8s8a2 "pc-rel addr (8 bits)"    (all-mep-core-isas PCREL-ADDR)  8  7 INT | 
|  | ((value pc) (sra SI (sub SI value    pc) 1)) | 
|  | ((value pc) (add SI (mul SI value 2) pc))) | 
|  |  | 
|  | (df f-12s4a2 "pc-rel addr (12 bits)"  (all-mep-core-isas PCREL-ADDR)  4 11 INT | 
|  | ((value pc) (sra SI (sub SI value    pc) 1)) | 
|  | ((value pc) (add SI (mul SI value 2) pc))) | 
|  |  | 
|  | (df f-17s16a2 "pc-rel addr (17 bits)" (all-mep-core-isas PCREL-ADDR) 16 16 INT | 
|  | ((value pc) (sra SI (sub SI value    pc) 1)) | 
|  | ((value pc) (add SI (mul SI value 2) pc))) | 
|  |  | 
|  | (df f-24s5a2n-hi "24s5a2n hi 16s16" (all-mep-core-isas PCREL-ADDR) 16 16  INT #f #f) | 
|  | (df f-24s5a2n-lo "24s5a2n lo 7s5a2" (all-mep-core-isas PCREL-ADDR)  5  7 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-24s5a2n) | 
|  | (comment "pc-rel addr (24 bits align 2)") | 
|  | (attrs all-mep-core-isas PCREL-ADDR) | 
|  | (mode INT) | 
|  | (subfields f-24s5a2n-hi f-24s5a2n-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-24s5a2n) | 
|  | (sub (ifield f-24s5a2n) pc)) | 
|  | (set (ifield f-24s5a2n-lo) | 
|  | (srl (and (ifield f-24s5a2n) #xfe) 1)) | 
|  | (set (ifield f-24s5a2n-hi) | 
|  | (sra INT (ifield f-24s5a2n) 8)))) | 
|  | (extract (set (ifield f-24s5a2n) | 
|  | (add SI (or (mul (ifield f-24s5a2n-hi) 256) | 
|  | (sll (ifield f-24s5a2n-lo) 1)) | 
|  | pc))) | 
|  | ) | 
|  |  | 
|  | (df f-24u5a2n-hi "24u5a2n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) | 
|  | (df f-24u5a2n-lo "24u5a2n lo 7u5a2" (all-mep-core-isas)  5  7 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-24u5a2n) | 
|  | (comment "abs jump target (24 bits, alignment 2)") | 
|  | (attrs all-mep-core-isas ABS-ADDR) | 
|  | (mode UINT) | 
|  | (subfields f-24u5a2n-hi f-24u5a2n-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-24u5a2n-lo) | 
|  | (srl (and (ifield f-24u5a2n) #xff) 1)) | 
|  | (set (ifield f-24u5a2n-hi) | 
|  | (srl (ifield f-24u5a2n) 8)) | 
|  | )) | 
|  | (extract (set (ifield f-24u5a2n) | 
|  | (or (sll (ifield f-24u5a2n-hi) 8) | 
|  | (sll (ifield f-24u5a2n-lo) 1)))) | 
|  | ) | 
|  |  | 
|  | ; Displacement fields. | 
|  |  | 
|  | (df f-2u6     "SAR offset (2 bits)"    (all-mep-core-isas)  6  2 UINT #f #f) | 
|  | (df f-7u9     "tp-rel b (7 bits)"      (all-mep-core-isas)  9  7 UINT #f #f) | 
|  | (df f-7u9a2   "tp-rel h (7 bits)"      (all-mep-core-isas)  9  6 UINT | 
|  | ((value pc) (srl SI value 1)) | 
|  | ((value pc) (mul SI value 2))) | 
|  | (df f-7u9a4   "tp/sp-rel w (7 bits)"   (all-mep-core-isas)  9  5 UINT | 
|  | ((value pc) (srl SI value 2)) | 
|  | ((value pc) (sll SI value 2))) | 
|  | (df f-16s16   "general 16-bit s-val"   (all-mep-core-isas) 16 16  INT #f #f) | 
|  |  | 
|  | ; Immediate fields. | 
|  |  | 
|  | (df f-2u10   "swi level (2 bits)"      (all-mep-core-isas) 10  2 UINT #f #f) | 
|  | (df f-3u5    "bit offset (3 bits)"     (all-mep-core-isas)  5  3 UINT #f #f) | 
|  | (df f-4u8    "bCC const (4 bits)"      (all-mep-core-isas)  8  4 UINT #f #f) | 
|  | (df f-5u8    "slt & shifts (5 bits)"   (all-mep-core-isas)  8  5 UINT #f #f) | 
|  | (df f-5u24   "clip immediate (5 bits)" (all-mep-core-isas) 24  5 UINT #f #f) | 
|  | (df f-6s8    "add immediate (6 bits)"  (all-mep-core-isas)  8  6  INT #f #f) | 
|  | (df f-8s8    "add imm (8 bits)"        (all-mep-core-isas)  8  8  INT #f #f) | 
|  | (df f-16u16  "general 16-bit u-val"    (all-mep-core-isas) 16 16 UINT #f #f) | 
|  | (df f-12u16  "cmov fixed 1"            (all-mep-core-isas) 16 12 UINT #f #f) | 
|  | (df f-3u29   "cmov fixed 2"            (all-mep-core-isas) 29  3 UINT #f #f) | 
|  |  | 
|  |  | 
|  | ; These are all for the coprocessor opcodes | 
|  |  | 
|  | ; The field is like IJKiiiiiii where I and J are toggled if K is set, | 
|  | ; for compatibility with older cores. | 
|  | (define-pmacro (compute-cdisp10 val) | 
|  | (cond SI | 
|  | ((and SI (cond SI ((and SI val #x80) (xor SI val #x300)) (else val)) #x200) | 
|  | (sub (cond SI ((and SI val #x80) (xor SI val #x300)) (else val)) #x400)) | 
|  | (else | 
|  | (cond SI ((and SI val #x80) (xor SI val #x300)) (else val))) | 
|  | ) | 
|  | ) | 
|  | (define-pmacro (extend-cdisp10 val) | 
|  | (cond SI | 
|  | ((and SI (compute-cdisp10 val) #x200) | 
|  | (sub (and SI (compute-cdisp10 val) #x3ff) #x400)) | 
|  | (else | 
|  | (and SI (compute-cdisp10 val) #x3ff)) | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (df f-cdisp10    "cop imm10"          (all-mep-core-isas)   22  10 INT | 
|  | ((value pc) (extend-cdisp10 value)) | 
|  | ((value pc) (extend-cdisp10 value)) | 
|  | ) | 
|  |  | 
|  | ; Non-contiguous fields. | 
|  |  | 
|  | (df f-24u8a4n-hi "24u8a4n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) | 
|  | (df f-24u8a4n-lo "24u8a4n lo 8u8a4" (all-mep-core-isas)  8  6 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-24u8a4n) | 
|  | (comment "absolute 24-bit address") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-24u8a4n-hi f-24u8a4n-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-24u8a4n-hi) (srl (ifield f-24u8a4n) 8)) | 
|  | (set (ifield f-24u8a4n-lo) (srl (and (ifield f-24u8a4n) #xfc) 2)))) | 
|  | (extract (set (ifield f-24u8a4n) | 
|  | (or (sll (ifield f-24u8a4n-hi) 8) | 
|  | (sll (ifield f-24u8a4n-lo) 2)))) | 
|  | ) | 
|  |  | 
|  | (df f-24u8n-hi "24u8n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) | 
|  | (df f-24u8n-lo "24u8n lo  8u8"  (all-mep-core-isas)  8  8 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-24u8n) | 
|  | (comment "24-bit constant") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-24u8n-hi f-24u8n-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-24u8n-hi) (srl (ifield f-24u8n) 8)) | 
|  | (set (ifield f-24u8n-lo) (and (ifield f-24u8n) #xff)))) | 
|  | (extract (set (ifield f-24u8n) | 
|  | (or (sll (ifield f-24u8n-hi) 8) | 
|  | (ifield f-24u8n-lo)))) | 
|  | ) | 
|  |  | 
|  | (df f-24u4n-hi "24u4n hi  8u4"  (all-mep-core-isas)  4  8 UINT #f #f) | 
|  | (df f-24u4n-lo "24u4n lo 16u16" (all-mep-core-isas) 16 16 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-24u4n) | 
|  | (comment "coprocessor code") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-24u4n-hi f-24u4n-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-24u4n-hi) (srl (ifield f-24u4n) 16)) | 
|  | (set (ifield f-24u4n-lo) (and (ifield f-24u4n) #xffff)))) | 
|  | (extract (set (ifield f-24u4n) | 
|  | (or (sll (ifield f-24u4n-hi) 16) | 
|  | (ifield f-24u4n-lo)))) | 
|  | ) | 
|  |  | 
|  | (define-multi-ifield | 
|  | (name f-callnum) | 
|  | (comment "system call number field") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-5 f-6 f-7 f-11) | 
|  | (insert (sequence () | 
|  | (set (ifield f-5)  (and (srl (ifield f-callnum) 3) 1)) | 
|  | (set (ifield f-6)  (and (srl (ifield f-callnum) 2) 1)) | 
|  | (set (ifield f-7)  (and (srl (ifield f-callnum) 1) 1)) | 
|  | (set (ifield f-11) (and (ifield f-callnum) 1)))) | 
|  | (extract (set (ifield f-callnum) | 
|  | (or (sll (ifield f-5) 3) | 
|  | (or (sll (ifield f-6) 2) | 
|  | (or (sll (ifield f-7) 1) | 
|  | (ifield f-11)))))) | 
|  | ) | 
|  |  | 
|  | (df f-ccrn-hi "ccrn hi  2u28" (all-mep-core-isas) 28 2 UINT #f #f) | 
|  | (df f-ccrn-lo "ccrn lo  4u4"  (all-mep-core-isas)  4 4 UINT #f #f) | 
|  | (define-multi-ifield | 
|  | (name f-ccrn) | 
|  | (comment "Coprocessor register number field") | 
|  | (attrs all-mep-core-isas) | 
|  | (mode UINT) | 
|  | (subfields f-ccrn-hi f-ccrn-lo) | 
|  | (insert (sequence () | 
|  | (set (ifield f-ccrn-hi)  (and (srl (ifield f-ccrn) 4) #x3)) | 
|  | (set (ifield f-ccrn-lo)  (and (ifield f-ccrn) #xf)))) | 
|  | (extract (set (ifield f-ccrn) | 
|  | (or (sll (ifield f-ccrn-hi) 4) | 
|  | (ifield f-ccrn-lo)))) | 
|  | ) | 
|  |  | 
|  | ; Operands. | 
|  |  | 
|  | ;; Only LABEL, REGNUM, FMAX_FLOAT and FMAX_INT are now relevant for correct | 
|  | ;; operation.  The others are mostly kept for backwards compatibility, | 
|  | ;; although they do affect the dummy prototypes in | 
|  | ;; gcc/config/mep/intrinsics.h. | 
|  | (define-attr | 
|  | (type enum) | 
|  | (for operand) | 
|  | (name CDATA) | 
|  | (comment "datatype to use for C intrinsics mapping") | 
|  | (values LABEL REGNUM FMAX_FLOAT FMAX_INT | 
|  | POINTER LONG ULONG SHORT USHORT CHAR UCHAR CP_DATA_BUS_INT) | 
|  | (default LONG)) | 
|  |  | 
|  | (define-attr | 
|  | (type enum) | 
|  | (for insn) | 
|  | (name CPTYPE) | 
|  | (comment "datatype to use for coprocessor values") | 
|  | (values CP_DATA_BUS_INT VECT V2SI V4HI V8QI V2USI V4UHI V8UQI) | 
|  | (default CP_DATA_BUS_INT)) | 
|  |  | 
|  | (define-attr | 
|  | (type enum) | 
|  | (for insn) | 
|  | (name CRET) | 
|  | ;; VOID - all arguments are passed as parameters; if any are written, pointers to them are passed. | 
|  | ;; FIRST - the first argument is the return value. | 
|  | ;; FIRSTCOPY - the first argument is the return value, but a copy is also the first parameter. | 
|  | (values VOID FIRST FIRSTCOPY) | 
|  | (default VOID) | 
|  | (comment "Insn's intrinsic returns void, or the first argument rather than (or in addition to) passing it.")) | 
|  |  | 
|  | (define-attr | 
|  | (type integer) | 
|  | (for operand) | 
|  | (name ALIGN) | 
|  | (comment "alignment of immediate operands") | 
|  | (default 1)) | 
|  |  | 
|  | (define-attr | 
|  | (for operand) | 
|  | (type boolean) | 
|  | (name RELOC_IMPLIES_OVERFLOW) | 
|  | (comment "Operand should not be considered as a candidate for relocs")) | 
|  |  | 
|  | (define-attr | 
|  | (for hardware) | 
|  | (type boolean) | 
|  | (name IS_FLOAT) | 
|  | (comment "Register contains a floating point value")) | 
|  |  | 
|  | (define-pmacro (dpop name commment attrib hwr field func) | 
|  | (define-full-operand name comment attrib | 
|  | hwr DFLT field ((parse func)) () ())) | 
|  | (define-pmacro (dprp name commment attrib hwr field pafunc prfunc) | 
|  | (define-full-operand name comment attrib | 
|  | hwr DFLT field ((parse pafunc) (print prfunc)) () ())) | 
|  |  | 
|  | (dnop r0        "register 0"              (all-mep-core-isas) h-gpr   0) | 
|  | (dnop rn        "register Rn"             (all-mep-core-isas) h-gpr   f-rn) | 
|  | (dnop rm        "register Rm"             (all-mep-core-isas) h-gpr   f-rm) | 
|  | (dnop rl        "register Rl"             (all-mep-core-isas) h-gpr   f-rl) | 
|  | (dnop rn3       "register 0-7"            (all-mep-core-isas) h-gpr   f-rn3) | 
|  |  | 
|  | ;; Variants of RM/RN with different CDATA attributes.  See comment above | 
|  | ;; CDATA for more details. | 
|  |  | 
|  | (dnop rma       "register Rm holding pointer"          (all-mep-core-isas (CDATA POINTER)) h-gpr   f-rm) | 
|  |  | 
|  | (dnop rnc       "register Rn holding char"             (all-mep-core-isas (CDATA LONG))    h-gpr   f-rn) | 
|  | (dnop rnuc      "register Rn holding unsigned char"    (all-mep-core-isas (CDATA LONG))    h-gpr   f-rn) | 
|  | (dnop rns       "register Rn holding short"            (all-mep-core-isas (CDATA LONG))    h-gpr   f-rn) | 
|  | (dnop rnus      "register Rn holding unsigned short"   (all-mep-core-isas (CDATA LONG))    h-gpr   f-rn) | 
|  | (dnop rnl       "register Rn holding long"             (all-mep-core-isas (CDATA LONG))    h-gpr   f-rn) | 
|  | (dnop rnul      "register Rn holding unsigned  long"   (all-mep-core-isas (CDATA ULONG))   h-gpr   f-rn) | 
|  |  | 
|  | (dnop rn3c       "register 0-7 holding unsigned char"    (all-mep-core-isas (CDATA LONG))  h-gpr   f-rn3) | 
|  | (dnop rn3uc      "register 0-7 holding byte"             (all-mep-core-isas (CDATA LONG))  h-gpr   f-rn3) | 
|  | (dnop rn3s       "register 0-7 holding unsigned short"   (all-mep-core-isas (CDATA LONG))  h-gpr   f-rn3) | 
|  | (dnop rn3us      "register 0-7 holding short"            (all-mep-core-isas (CDATA LONG))  h-gpr   f-rn3) | 
|  | (dnop rn3l       "register 0-7 holding unsigned long"    (all-mep-core-isas (CDATA LONG))  h-gpr   f-rn3) | 
|  | (dnop rn3ul      "register 0-7 holding long"             (all-mep-core-isas (CDATA ULONG)) h-gpr   f-rn3) | 
|  |  | 
|  |  | 
|  | (dnop lp        "link pointer"            (all-mep-core-isas) h-csr   1) | 
|  | (dnop sar       "shift amount register"   (all-mep-core-isas) h-csr   2) | 
|  | (dnop hi        "high result"             (all-mep-core-isas) h-csr   7) | 
|  | (dnop lo        "low result"              (all-mep-core-isas) h-csr   8) | 
|  | (dnop mb0       "modulo begin register 0" (all-mep-core-isas) h-csr  12) | 
|  | (dnop me0       "modulo end register 0"   (all-mep-core-isas) h-csr  13) | 
|  | (dnop mb1       "modulo begin register 1" (all-mep-core-isas) h-csr  14) | 
|  | (dnop me1       "modulo end register 1"   (all-mep-core-isas) h-csr  15) | 
|  | (dnop psw       "program status word"     (all-mep-core-isas) h-csr  16) | 
|  | (dnop epc	"exception prog counter"  (all-mep-core-isas) h-csr  19) | 
|  | (dnop exc       "exception cause"         (all-mep-core-isas) h-csr  20) | 
|  | (dnop npc       "nmi program counter"     (all-mep-core-isas) h-csr  23) | 
|  | (dnop dbg       "debug register"          (all-mep-core-isas) h-csr  24) | 
|  | (dnop depc      "debug exception pc"      (all-mep-core-isas) h-csr  25) | 
|  | (dnop opt       "option register"         (all-mep-core-isas) h-csr  26) | 
|  | (dnop r1        "register 1"              (all-mep-core-isas) h-gpr   1) | 
|  | (dnop tp        "tiny data area pointer"  (all-mep-core-isas) h-gpr  13) | 
|  | (dnop sp        "stack pointer"           (all-mep-core-isas) h-gpr  15) | 
|  | (dprp tpr       "TP register"             (all-mep-core-isas) h-gpr  13       "tpreg" "tpreg") | 
|  | (dprp spr       "SP register"             (all-mep-core-isas) h-gpr  15       "spreg" "spreg") | 
|  |  | 
|  | (define-full-operand | 
|  | csrn "control/special register" (all-mep-core-isas (CDATA REGNUM)) h-csr | 
|  | DFLT f-csrn ((parse "csrn")) () () | 
|  | ) | 
|  |  | 
|  | (dnop csrn-idx  "control/special reg idx" (all-mep-core-isas) h-uint  f-csrn) | 
|  | (dnop crn64     "copro Rn (64-bit)"       (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr64  f-crn) | 
|  | (dnop crn       "copro Rn (32-bit)"       (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr    f-crn) | 
|  | (dnop crnx64    "copro Rn (0-31, 64-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr64  f-crnx) | 
|  | (dnop crnx      "copro Rn (0-31, 32-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr    f-crnx) | 
|  | (dnop ccrn      "copro control reg CCRn"  (all-mep-core-isas (CDATA REGNUM)) h-ccr   f-ccrn) | 
|  | (dnop cccc      "copro flags"             (all-mep-core-isas) h-uint  f-rm) | 
|  |  | 
|  | (dprp pcrel8a2  "pc-rel addr (8 bits)"    (all-mep-core-isas (CDATA LABEL) RELAX) h-sint  f-8s8a2   "mep_align" "address") | 
|  | (dprp pcrel12a2 "pc-rel addr (12 bits)"   (all-mep-core-isas (CDATA LABEL) RELAX) h-sint  f-12s4a2  "mep_align" "address") | 
|  | (dprp pcrel17a2 "pc-rel addr (17 bits)"   (all-mep-core-isas (CDATA LABEL) RELAX) h-sint  f-17s16a2 "mep_align" "address") | 
|  | (dprp pcrel24a2 "pc-rel addr (24 bits)"   (all-mep-core-isas (CDATA LABEL))       h-sint  f-24s5a2n "mep_align" "address") | 
|  | (dprp pcabs24a2 "pc-abs addr (24 bits)"   (all-mep-core-isas (CDATA LABEL))       h-uint  f-24u5a2n "mep_alignu" "address") | 
|  |  | 
|  | (dpop sdisp16   "displacement (16 bits)"  (all-mep-core-isas) h-sint  f-16s16    "signed16") | 
|  | (dpop simm16    "signed imm (16 bits)"    (all-mep-core-isas) h-sint  f-16s16    "signed16") | 
|  | (dpop uimm16    "unsigned imm (16 bits)"  (all-mep-core-isas) h-uint  f-16u16    "unsigned16") | 
|  | (dnop code16    "uci/dsp code (16 bits)"  (all-mep-core-isas) h-uint  f-16u16) | 
|  |  | 
|  | (dnop udisp2    "SSARB addend (2 bits)"   (all-mep-core-isas) h-sint  f-2u6) | 
|  | (dnop uimm2     "interrupt (2 bits)"      (all-mep-core-isas) h-uint  f-2u10) | 
|  |  | 
|  | (dnop simm6     "add const (6 bits)"      (all-mep-core-isas) h-sint  f-6s8) | 
|  | (dnop simm8     "mov const (8 bits)"      (all-mep-core-isas RELOC_IMPLIES_OVERFLOW) | 
|  | h-sint  f-8s8) | 
|  |  | 
|  | (dpop addr24a4  "sw/lw addr (24 bits)"    (all-mep-core-isas (ALIGN 4)) h-uint  f-24u8a4n  "mep_alignu") | 
|  | (dnop code24    "coprocessor code"        (all-mep-core-isas) h-uint  f-24u4n) | 
|  |  | 
|  | (dnop callnum   "system call number"      (all-mep-core-isas) h-uint  f-callnum) | 
|  | (dnop uimm3     "bit immediate (3 bits)"  (all-mep-core-isas) h-uint  f-3u5) | 
|  | (dnop uimm4     "bCC const (4 bits)"      (all-mep-core-isas) h-uint  f-4u8) | 
|  | (dnop uimm5     "bit/shift val (5 bits)"  (all-mep-core-isas) h-uint  f-5u8) | 
|  |  | 
|  | (dpop udisp7    "tp-rel b (7 bits)"       (all-mep-core-isas)           h-uint  f-7u9      "unsigned7") | 
|  | (dpop udisp7a2  "tp-rel h (7 bits)"       (all-mep-core-isas (ALIGN 2)) h-uint  f-7u9a2    "unsigned7") | 
|  | (dpop udisp7a4  "tp/sp-rel w (7 bits)"    (all-mep-core-isas (ALIGN 4)) h-uint  f-7u9a4    "unsigned7") | 
|  | (dpop uimm7a4   "sp w-addend (7 bits)"    (all-mep-core-isas (ALIGN 4)) h-uint  f-7u9a4    "mep_alignu") | 
|  |  | 
|  | (dnop uimm24    "immediate (24 bits)"     (all-mep-core-isas) h-uint  f-24u8n) | 
|  |  | 
|  | (dnop cimm4     "cache immed'te (4 bits)" (all-mep-core-isas) h-uint  f-rn) | 
|  | (dnop cimm5     "clip immediate (5 bits)" (all-mep-core-isas) h-uint  f-5u24) | 
|  |  | 
|  | (dpop cdisp10   "copro addend (8/10 bits)" (all-mep-core-isas) h-sint  f-cdisp10  "cdisp10") | 
|  | (dpop cdisp10a2 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint  f-cdisp10  "cdisp10") | 
|  | (dpop cdisp10a4 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint  f-cdisp10  "cdisp10") | 
|  | (dpop cdisp10a8 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint  f-cdisp10  "cdisp10") | 
|  |  | 
|  | ; Special operand representing the various ways that the literal zero can be | 
|  | ; specified. | 
|  | (define-full-operand | 
|  | zero "Zero operand" (all-mep-core-isas) h-sint DFLT f-nil | 
|  | ((parse "zero")) () () | 
|  | ) | 
|  |  | 
|  | ; Attributes. | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_BIT_INSN) | 
|  | (comment "optional bit manipulation instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_MUL_INSN) | 
|  | (comment "optional 32-bit multiply instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_DIV_INSN) | 
|  | (comment "optional 32-bit divide instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_DEBUG_INSN) | 
|  | (comment "optional debug instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_LDZ_INSN) | 
|  | (comment "optional leading zeroes instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_ABS_INSN) | 
|  | (comment "optional absolute difference instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_AVE_INSN) | 
|  | (comment "optional average instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_MINMAX_INSN) | 
|  | (comment "optional min/max instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_CLIP_INSN) | 
|  | (comment "optional clipping instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_SAT_INSN) | 
|  | (comment "optional saturation instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_UCI_INSN) | 
|  | (comment "optional UCI instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_DSP_INSN) | 
|  | (comment "optional DSP instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_CP_INSN) | 
|  | (comment "optional coprocessor-related instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_CP64_INSN) | 
|  | (comment "optional coprocessor-related 64 data bit instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name OPTIONAL_VLIW64) | 
|  | (comment "optional vliw64 mode (vliw32 is default)")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type enum) | 
|  | (name STALL) | 
|  | (attrs META) | 
|  | (values NONE SHIFTI INT2 LOAD STORE LDC STC LDCB STCB SSARB FSFT RET | 
|  | ADVCK MUL MULR DIV) | 
|  | (default NONE) | 
|  | (comment "gcc stall attribute")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type string) | 
|  | (name INTRINSIC) | 
|  | (attrs META) | 
|  | (comment "gcc intrinsic name")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type enum) | 
|  | (name SLOT) | 
|  | (attrs META) | 
|  | (values NONE C3 V1 V3 P0S P0 P1) | 
|  | (default NONE) | 
|  | (comment "coprocessor slot type")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name MAY_TRAP) | 
|  | (comment "instruction may generate an exception")) | 
|  |  | 
|  | ; Attributes for scheduling restrictions in vliw mode | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VLIW_ALONE) | 
|  | (comment "instruction can be scheduled alone in vliw mode")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VLIW_NO_CORE_NOP) | 
|  | (comment "there is no corresponding nop core instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VLIW_NO_COP_NOP) | 
|  | (comment "there is no corresponding nop coprocessor instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VLIW64_NO_MATCHING_NOP) | 
|  | (comment "there is no corresponding nop coprocessor instruction")) | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VLIW32_NO_MATCHING_NOP) | 
|  | (comment "there is no corresponding nop coprocessor instruction")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type boolean) | 
|  | (name VOLATILE) | 
|  | (comment "Insn is volatile.")) | 
|  |  | 
|  | (define-attr | 
|  | (for insn) | 
|  | (type integer) | 
|  | (name LATENCY) | 
|  | (comment "The latency of this insn, used for scheduling as an intrinsic in gcc") | 
|  | (default 0)) | 
|  |  | 
|  | ; The MeP config tool will edit this. | 
|  | (define-attr | 
|  | (type enum) | 
|  | (for insn) | 
|  | (name CONFIG) | 
|  | (values NONE ; config-attr-start | 
|  | default | 
|  | ) ; config-attr-end | 
|  | ) | 
|  |  | 
|  |  | 
|  | ; Enumerations. | 
|  |  | 
|  | (define-normal-insn-enum major "major opcodes" (all-mep-core-isas) MAJ_ | 
|  | f-major | 
|  | (.map .str (.iota 16)) | 
|  | ) | 
|  |  | 
|  |  | 
|  | (define-pmacro (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming isa) | 
|  | (define-insn | 
|  | (name xname) | 
|  | (comment xcomment) | 
|  | (.splice attrs (.unsplice xattrs) (ISA isa)) | 
|  | (syntax xsyntax) | 
|  | (format xformat) | 
|  | (semantics xsemantics) | 
|  | (.splice timing (.unsplice xtiming)) | 
|  | ) | 
|  | ) | 
|  |  | 
|  | (define-pmacro (dnmi-isa xname xcomment xattrs xsyntax xemit isa) | 
|  | (dnmi xname xcomment (.splice (.unsplice xattrs) (ISA isa)) xsyntax xemit) | 
|  | ) | 
|  |  | 
|  | ; For making profiling calls and dynamic configuration | 
|  | (define-pmacro (cg-profile caller callee) | 
|  | (c-call "cg_profile" caller callee) | 
|  | ) | 
|  | ; For dynamic configuration only | 
|  | (define-pmacro (cg-profile-jump caller callee) | 
|  | (c-call "cg_profile_jump" caller callee) | 
|  | ) | 
|  |  | 
|  | ; For defining Core Instructions | 
|  | (define-pmacro (dnci xname xcomment xattrs xsyntax xformat xsemantics xtiming) | 
|  | (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming all-core-isa-list) | 
|  | ) | 
|  | (define-pmacro (dncmi xname xcomment xattrs xsyntax xemit) | 
|  | (dnmi-isa xname xcomment xattrs xsyntax xemit all-core-isa-list) | 
|  | ) | 
|  |  | 
|  | ; For defining Coprocessor Instructions | 
|  | ;(define-pmacro (dncpi xname xcomment xattrs xsyntax xformat xsemantics xtiming)  (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming cop) | 
|  | ;) | 
|  |  | 
|  | ;; flag setting macro | 
|  | (define-pmacro (set-bit xop xbitnum xval) | 
|  | (set xop (or | 
|  | (and xop (inv (sll 1 xbitnum))) | 
|  | (and (sll 1 xbitnum) (sll xval xbitnum))))) | 
|  |  | 
|  | ;; some flags we commonly use in vliw reasoning / mode-switching etc. | 
|  | (define-pmacro (get-opt.vliw64) (and (srl opt 6) 1)) | 
|  | (define-pmacro (get-opt.vliw32) (and (srl opt 5) 1)) | 
|  | (define-pmacro (get-rm.lsb) (and rm 1)) | 
|  | (define-pmacro (get-psw.om) (and (srl psw 12) 1)) | 
|  | (define-pmacro (get-psw.nmi) (and (srl psw 9) 1)) | 
|  | (define-pmacro (get-psw.iep) (and (srl psw 1) 1)) | 
|  | (define-pmacro (get-psw.ump) (and (srl psw 3) 1)) | 
|  | (define-pmacro (get-epc.etom) (and epc 1)) | 
|  | (define-pmacro (get-npc.ntom) (and npc 1)) | 
|  | (define-pmacro (get-lp.ltom) (and lp 1)) | 
|  |  | 
|  | (define-pmacro (set-psw.om zval) (set-bit (raw-reg h-csr 16) 12 zval)) | 
|  | (define-pmacro (set-psw.nmi zval) (set-bit (raw-reg h-csr 16) 9 zval)) | 
|  | (define-pmacro (set-psw.umc zval) (set-bit (raw-reg h-csr 16) 2 zval)) | 
|  | (define-pmacro (set-psw.iec zval) (set-bit (raw-reg h-csr 16) 0 zval)) | 
|  | (define-pmacro (set-rpe.elr zval) (set-bit (raw-reg h-csr 5) 0 zval)) | 
|  |  | 
|  |  | 
|  | ;; the "3 way switch" depending on our current operating mode and vliw status flags | 
|  | (define-pmacro (core-vliw-switch core-rtl vliw32-rtl vliw64-rtl) | 
|  | (cond | 
|  | ((andif (get-psw.om) (get-opt.vliw64)) vliw64-rtl) | 
|  | ((andif (get-psw.om) (get-opt.vliw32)) vliw32-rtl) | 
|  | (else core-rtl))) | 
|  |  | 
|  | ;; the varying-pcrel idiom | 
|  | (define-pmacro (set-vliw-modified-pcrel-offset xtarg xa xb xc) | 
|  | (core-vliw-switch (set xtarg (add pc xa)) | 
|  | (set xtarg (add pc xb)) | 
|  | (set xtarg (add pc xc)))) | 
|  |  | 
|  | ;; the increasing-alignment idiom in branch displacements | 
|  | (define-pmacro (set-vliw-alignment-modified xtarg zaddr) | 
|  | (core-vliw-switch (set xtarg (and zaddr (inv 1))) | 
|  | (set xtarg (and zaddr (inv 3))) | 
|  | (set xtarg (and zaddr (inv 7))))) | 
|  |  | 
|  | ;; the increasing-alignment idiom in option-only form | 
|  | (define-pmacro (set-vliw-aliignment-modified-by-option xtarg zaddr) | 
|  | (if (get-opt.vliw32) | 
|  | (set xtarg (and zaddr (inv 3))) | 
|  | (set xtarg (and zaddr (inv 7))))) | 
|  |  | 
|  |  | 
|  |  | 
|  | ; pmacros needed for coprocessor modulo addressing. | 
|  |  | 
|  | ; Taken from supplement ``The operation of the modulo addressing'' in | 
|  | ; Toshiba documentation rev 2.2, p. 34. | 
|  |  | 
|  | (define-pmacro (compute-mask0) | 
|  | (sequence SI ((SI temp)) | 
|  | (set temp (or mb0 me0)) | 
|  | (srl (const SI -1) (c-call SI "do_ldz" temp)))) | 
|  |  | 
|  | (define-pmacro (mod0 immed) | 
|  | (sequence SI ((SI modulo-mask)) | 
|  | (set modulo-mask (compute-mask0)) | 
|  | (if SI (eq (and rma modulo-mask) me0) | 
|  | (or (and rma (inv modulo-mask)) mb0) | 
|  | (add rma (ext SI immed))))) | 
|  |  | 
|  | (define-pmacro (compute-mask1) | 
|  | (sequence SI ((SI temp)) | 
|  | (set temp (or mb1 me1)) | 
|  | (srl (const SI -1) (c-call SI "do_ldz" temp)))) | 
|  |  | 
|  | (define-pmacro (mod1 immed) | 
|  | (sequence SI ((SI modulo-mask)) | 
|  | (set modulo-mask (compute-mask1)) | 
|  | (if SI (eq (and rma modulo-mask) me1) | 
|  | (or (and rma (inv modulo-mask)) mb1) | 
|  | (add rma (ext SI immed))))) | 
|  |  | 
|  |  | 
|  | ; Instructions. | 
|  |  | 
|  | ; A pmacro for use in semantic bodies of unimplemented insns. | 
|  | (define-pmacro (unimp mnemonic) (nop)) | 
|  |  | 
|  | ; Core specific instructions | 
|  | ; (include "mep-h1.cpu") ; -- exposed by MeP-Integrator | 
|  | (include "mep-c5.cpu") ; -- exposed by MeP-Integrator | 
|  |  | 
|  | ; Load/store instructions. | 
|  |  | 
|  | (dnci sb "store byte (register indirect)" ((STALL STORE)) | 
|  | "sb $rnc,($rma)" | 
|  | (+ MAJ_0 rnc rma (f-sub4 8)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (set (mem UQI rma) (and rnc #xff))) | 
|  | ((mep (unit u-use-gpr (in usereg rnc)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sh "store half-word (register indirect)" ((STALL STORE)) | 
|  | "sh $rns,($rma)" | 
|  | (+ MAJ_0 rns rma (f-sub4 9)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and rma (inv 1))) | 
|  | (set (mem UHI (and rma (inv 1))) (and rns #xffff))) | 
|  | ((mep (unit u-use-gpr (in usereg rns)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sw "store word (register indirect)" ((STALL STORE)) | 
|  | "sw $rnl,($rma)" | 
|  | (+ MAJ_0 rnl rma (f-sub4 10)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and rma (inv 3))) | 
|  | (set (mem USI (and rma (inv 3))) rnl)) | 
|  | ((mep (unit u-use-gpr (in usereg rnl)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lb "load byte (register indirect)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lb $rnc,($rma)" | 
|  | (+ MAJ_0 rnc rma (f-sub4 12)) | 
|  | (set rnc (ext SI (mem QI rma))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnc))))) | 
|  |  | 
|  | (dnci lh "load half-word (register indirect)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lh $rns,($rma)" | 
|  | (+ MAJ_0 rns rma (f-sub4 13)) | 
|  | (set rns (ext SI (mem HI (and rma (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rns))))) | 
|  |  | 
|  | (dnci lw "load word (register indirect)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lw $rnl,($rma)" | 
|  | (+ MAJ_0 rnl rma (f-sub4 14)) | 
|  | (set rnl (mem SI (and rma (inv 3)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnl))))) | 
|  |  | 
|  | (dnci lbu "load unsigned byte (register indirect)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lbu $rnuc,($rma)" | 
|  | (+ MAJ_0 rnuc rma (f-sub4 11)) | 
|  | (set rnuc (zext SI (mem UQI rma))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnuc))))) | 
|  |  | 
|  | (dnci lhu "load unsigned half-word (register indirect)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lhu $rnus,($rma)" | 
|  | (+ MAJ_0 rnus rma (f-sub4 15)) | 
|  | (set rnus (zext SI (mem UHI (and rma (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnus))))) | 
|  |  | 
|  | (dnci sw-sp "store word (sp relative)" ((STALL STORE)) | 
|  | "sw $rnl,$udisp7a4($spr)" | 
|  | (+ MAJ_4 rnl (f-8 0) udisp7a4 (f-sub2 2)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and (add udisp7a4 sp) (inv 3))) | 
|  | (set (mem SI (and (add udisp7a4 sp) (inv 3))) rnl)) | 
|  | ((mep (unit u-use-gpr (in usereg rnl)) | 
|  | (unit u-use-gpr (in usereg sp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | (dnci lw-sp "load word (sp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lw $rnl,$udisp7a4($spr)" | 
|  | (+ MAJ_4 rnl (f-8 0) udisp7a4 (f-sub2 3)) | 
|  | (set rnl (mem SI (and (add udisp7a4 sp) (inv 3)))) | 
|  | ((mep (unit u-use-gpr (in usereg sp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnl))))) | 
|  |  | 
|  | (dnci sb-tp "store byte (tp relative)" ((STALL STORE)) | 
|  | "sb $rn3c,$udisp7($tpr)" | 
|  | (+ MAJ_8 (f-4 0) rn3c (f-8 0) udisp7) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (add (zext SI udisp7) tp)) | 
|  | (set (mem QI (add (zext SI udisp7) tp)) (and rn3c #xff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn3c)) | 
|  | (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sh-tp "store half-word (tp relative)" ((STALL STORE)) | 
|  | "sh $rn3s,$udisp7a2($tpr)" | 
|  | (+ MAJ_8 (f-4 0) rn3s (f-8 1) udisp7a2 (f-15 0)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and (add (zext SI udisp7a2) tp) (inv 1))) | 
|  | (set (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))) (and rn3s #xffff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn3s)) | 
|  | (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sw-tp "store word (tp relative)" ((STALL STORE)) | 
|  | "sw $rn3l,$udisp7a4($tpr)" | 
|  | (+ MAJ_4 (f-4 0) rn3l (f-8 1) udisp7a4 (f-sub2 2)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and (add (zext SI udisp7a4) tp) (inv 3))) | 
|  | (set (mem SI (and (add (zext SI udisp7a4) tp) (inv 3))) rn3l)) | 
|  | ((mep (unit u-use-gpr (in usereg rn3l)) | 
|  | (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lb-tp "load byte (tp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lb $rn3c,$udisp7($tpr)" | 
|  | (+ MAJ_8 (f-4 1) rn3c (f-8 0) udisp7) | 
|  | (set rn3c (ext SI (mem QI (add (zext SI udisp7) tp)))) | 
|  | ((mep (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn3c))))) | 
|  |  | 
|  | (dnci lh-tp "load half-word (tp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lh $rn3s,$udisp7a2($tpr)" | 
|  | (+ MAJ_8 (f-4 1) rn3s (f-8 1) udisp7a2 (f-15 0)) | 
|  | (set rn3s (ext SI (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn3s))))) | 
|  |  | 
|  | (dnci lw-tp "load word (tp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lw $rn3l,$udisp7a4($tpr)" | 
|  | (+ MAJ_4 (f-4 0) rn3l (f-8 1) udisp7a4 (f-sub2 3)) | 
|  | (set rn3l (mem SI (and (add (zext SI udisp7a4) tp) (inv 3)))) | 
|  | ((mep (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn3l))))) | 
|  |  | 
|  | (dnci lbu-tp "load unsigned byte (tp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lbu $rn3uc,$udisp7($tpr)" | 
|  | (+ MAJ_4 (f-4 1) rn3uc (f-8 1) udisp7) | 
|  | (set rn3uc (zext SI (mem QI (add (zext SI udisp7) tp)))) | 
|  | ((mep (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn3uc))))) | 
|  |  | 
|  | (dnci lhu-tp "load unsigned half-word (tp relative)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lhu $rn3us,$udisp7a2($tpr)" | 
|  | (+ MAJ_8 (f-4 1) rn3us (f-8 1) udisp7a2 (f-15 1)) | 
|  | (set rn3us (zext SI (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg tp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn3us))))) | 
|  |  | 
|  | (dnci sb16 "store byte (16 bit displacement)" ((STALL STORE)) | 
|  | "sb $rnc,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnc rma (f-sub4 8) sdisp16) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (add rma (ext SI sdisp16))) | 
|  | (set (mem QI (add rma (ext SI sdisp16))) (and rnc #xff))) | 
|  | ((mep (unit u-use-gpr (in usereg rnc)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sh16 "store half-word (16 bit displacement)" ((STALL STORE)) | 
|  | "sh $rns,$sdisp16($rma)" | 
|  | (+ MAJ_12 rns rma (f-sub4 9) sdisp16) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (and (add rma (ext SI sdisp16)) (inv 1))) | 
|  | (set (mem HI (and (add rma (ext SI sdisp16)) (inv 1))) (and rns #xffff))) | 
|  | ((mep (unit u-use-gpr (in usereg rns)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sw16 "store word (16 bit displacement)" ((STALL STORE)) | 
|  | "sw $rnl,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnl rma (f-sub4 10) sdisp16) | 
|  | (sequence () | 
|  | (c-call "check_write_to_text" (and (add rma (ext SI sdisp16)) (inv 3))) | 
|  | (set (mem SI (and (add rma (ext SI sdisp16)) (inv 3))) rnl)) | 
|  | ((mep (unit u-use-gpr (in usereg rnl)) | 
|  | (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lb16 "load byte (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lb $rnc,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnc rma (f-sub4 12) sdisp16) | 
|  | (set rnc (ext SI (mem QI (add rma (ext SI sdisp16))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnc))))) | 
|  |  | 
|  | (dnci lh16 "load half-word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lh $rns,$sdisp16($rma)" | 
|  | (+ MAJ_12 rns rma (f-sub4 13) sdisp16) | 
|  | (set rns (ext SI (mem HI (and (add rma (ext SI sdisp16)) (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rns))))) | 
|  |  | 
|  | (dnci lw16 "load word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lw $rnl,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnl rma (f-sub4 14) sdisp16) | 
|  | (set rnl (mem SI (and (add rma (ext SI sdisp16)) (inv 3)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnl))))) | 
|  |  | 
|  | (dnci lbu16 "load unsigned byte (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lbu $rnuc,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnuc rma (f-sub4 11) sdisp16) | 
|  | (set rnuc (zext SI (mem QI (add rma (ext SI sdisp16))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnuc))))) | 
|  |  | 
|  | (dnci lhu16 "load unsigned half-word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lhu $rnus,$sdisp16($rma)" | 
|  | (+ MAJ_12 rnus rma (f-sub4 15) sdisp16) | 
|  | (set rnus (zext SI (mem HI (and (add rma (ext SI sdisp16)) (inv 1))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnus))))) | 
|  |  | 
|  | (dnci sw24 "store word (24 bit absolute addressing)" ((STALL STORE)) | 
|  | "sw $rnl,($addr24a4)" | 
|  | (+ MAJ_14 rnl addr24a4 (f-sub2 2)) | 
|  | (sequence () | 
|  | (c-call VOID "check_write_to_text" (zext SI addr24a4)) | 
|  | (set (mem SI (zext SI addr24a4)) rnl)) | 
|  | ((mep (unit u-use-gpr (in usereg rnl)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lw24 "load word (24 bit absolute addressing)" ((STALL LOAD) (LATENCY 2)) | 
|  | "lw $rnl,($addr24a4)" | 
|  | (+ MAJ_14 rnl addr24a4 (f-sub2 3)) | 
|  | (set rnl (mem SI (zext SI addr24a4))) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rnl))))) | 
|  |  | 
|  |  | 
|  | ; Extension instructions. | 
|  |  | 
|  | (dnci extb "sign extend byte" () | 
|  | "extb $rn" | 
|  | (+ MAJ_1 rn (f-rm 0) (f-sub4 13)) | 
|  | (set rn (ext SI (and QI rn #xff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci exth "sign extend half-word" () | 
|  | "exth $rn" | 
|  | (+ MAJ_1 rn (f-rm 2) (f-sub4 13)) | 
|  | (set rn (ext SI (and HI rn #xffff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci extub "zero extend byte" () | 
|  | "extub $rn" | 
|  | (+ MAJ_1 rn (f-rm 8) (f-sub4 13)) | 
|  | (set rn (zext SI (and rn #xff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci extuh "zero extend half-word" () | 
|  | "extuh $rn" | 
|  | (+ MAJ_1 rn (f-rm 10) (f-sub4 13)) | 
|  | (set rn (zext SI (and rn #xffff))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Shift amount manipulation instructions. | 
|  |  | 
|  | (dnci ssarb "set sar to bytes" ((STALL SSARB) VOLATILE) | 
|  | "ssarb $udisp2($rm)" | 
|  | (+ MAJ_1 (f-4 0) (f-5 0) udisp2 rm (f-sub4 12)) | 
|  | (if (c-call BI "big_endian_p") | 
|  | (set sar (zext SI (mul (and (add udisp2 rm) 3) 8))) | 
|  | (set sar (sub 32 (zext SI (mul (and (add udisp2 rm) 3) 8))))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Move instructions. | 
|  |  | 
|  | (dnci mov "move" () | 
|  | "mov $rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 0)) | 
|  | (set rn rm) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci movi8 "move 8-bit immediate" () | 
|  | "mov $rn,$simm8" | 
|  | (+ MAJ_5 rn simm8) | 
|  | (set rn (ext SI simm8)) | 
|  | ()) | 
|  |  | 
|  | (dnci movi16 "move 16-bit immediate" () | 
|  | "mov $rn,$simm16" | 
|  | (+ MAJ_12 rn (f-rm 0) (f-sub4 1) simm16) | 
|  | (set rn (ext SI simm16)) | 
|  | ()) | 
|  |  | 
|  | (dnci movu24 "move 24-bit unsigned immediate" () | 
|  | "movu $rn3,$uimm24" | 
|  | (+ MAJ_13 (f-4 0) rn3 uimm24) | 
|  | (set rn3 (zext SI uimm24)) | 
|  | ()) | 
|  |  | 
|  | (dnci movu16 "move 16-bit unsigned immediate" () | 
|  | "movu $rn,$uimm16" | 
|  | (+ MAJ_12 rn (f-rm 1) (f-sub4 1) uimm16) | 
|  | (set rn (zext SI uimm16)) | 
|  | ()) | 
|  |  | 
|  | (dnci movh "move high 16-bit immediate" () | 
|  | "movh $rn,$uimm16" | 
|  | (+ MAJ_12 rn (f-rm 2) (f-sub4 1) uimm16) | 
|  | (set rn (sll uimm16 16)) | 
|  | ()) | 
|  |  | 
|  |  | 
|  | ; Arithmetic instructions. | 
|  |  | 
|  | (dnci add3 "add three registers" () | 
|  | "add3 $rl,$rn,$rm" | 
|  | (+ MAJ_9 rn rm rl) | 
|  | (set rl (add rn rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci add "add" () | 
|  | "add $rn,$simm6" | 
|  | (+ MAJ_6 rn simm6 (f-sub2 0)) | 
|  | (set rn (add rn (ext SI simm6))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci add3i "add two registers and immediate" () | 
|  | "add3 $rn,$spr,$uimm7a4" | 
|  | (+ MAJ_4 rn (f-8 0) uimm7a4 (f-sub2 0)) | 
|  | (set rn (add sp (zext SI uimm7a4))) | 
|  | ((mep (unit u-use-gpr (in usereg sp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci advck3 "add overflow check" ((STALL ADVCK)) | 
|  | "advck3 \\$0,$rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 7)) | 
|  | (if (add-oflag rn rm 0) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sub "subtract" () | 
|  | "sub $rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 4)) | 
|  | (set rn (sub rn rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm))))) | 
|  |  | 
|  | (dnci sbvck3 "subtraction overflow check" ((STALL ADVCK)) | 
|  | "sbvck3 \\$0,$rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 5)) | 
|  | (if (sub-oflag rn rm 0) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci neg "negate" () | 
|  | "neg $rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 1)) | 
|  | (set rn (neg rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci slt3 "set if less than" () | 
|  | "slt3 \\$0,$rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 2)) | 
|  | (if (lt rn rm) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sltu3 "set less than unsigned" () | 
|  | "sltu3 \\$0,$rn,$rm" | 
|  | (+ MAJ_0 rn rm (f-sub4 3)) | 
|  | (if (ltu rn rm) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci slt3i "set if less than immediate" () | 
|  | "slt3 \\$0,$rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 1)) | 
|  | (if (lt rn (zext SI uimm5)) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sltu3i "set if less than unsigned immediate" () | 
|  | "sltu3 \\$0,$rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 5)) | 
|  | (if (ltu rn (zext SI uimm5)) | 
|  | (set r0 1) | 
|  | (set r0 0)) | 
|  | ()) | 
|  |  | 
|  | (dnci sl1ad3 "shift left one and add" ((STALL INT2)) | 
|  | "sl1ad3 \\$0,$rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 6)) | 
|  | (set r0 (add (sll rn 1) rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sl2ad3 "shift left two and add" ((STALL INT2)) | 
|  | "sl2ad3 \\$0,$rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 7)) | 
|  | (set r0 (add (sll rn 2) rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci add3x "three operand add (extended)" () | 
|  | "add3 $rn,$rm,$simm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 0) simm16) | 
|  | (set rn (add rm (ext SI simm16))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci slt3x "set if less than (extended)" () | 
|  | "slt3 $rn,$rm,$simm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 2) simm16) | 
|  | (if (lt rm (ext SI simm16)) | 
|  | (set rn 1) | 
|  | (set rn 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sltu3x "set if less than unsigned (extended)" () | 
|  | "sltu3 $rn,$rm,$uimm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 3) uimm16) | 
|  | (if (ltu rm (zext SI uimm16)) | 
|  | (set rn 1) | 
|  | (set rn 0)) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Logical instructions. | 
|  |  | 
|  | (dnci or "bitwise or" () | 
|  | "or $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 0)) | 
|  | (set rn (or rn rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci and "bitwise and" () | 
|  | "and $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 1)) | 
|  | (set rn (and rn rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci xor "bitwise exclusive or" () | 
|  | "xor $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 2)) | 
|  | (set rn (xor rn rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci nor "bitwise negated or" () | 
|  | "nor $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 3)) | 
|  | (set rn (inv (or rn rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci or3 "or three operand" () | 
|  | "or3 $rn,$rm,$uimm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 4) uimm16) | 
|  | (set rn (or rm (zext SI uimm16))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci and3 "and three operand" () | 
|  | "and3 $rn,$rm,$uimm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 5) uimm16) | 
|  | (set rn (and rm (zext SI uimm16))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci xor3 "exclusive or three operand" () | 
|  | "xor3 $rn,$rm,$uimm16" | 
|  | (+ MAJ_12 rn rm (f-sub4 6) uimm16) | 
|  | (set rn (xor rm (zext SI uimm16))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Shift instructions. | 
|  |  | 
|  | (dnci sra "shift right arithmetic" ((STALL INT2)) | 
|  | "sra $rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 13)) | 
|  | (set rn (sra rn (and rm #x1f))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci srl "shift right logical" ((STALL INT2)) | 
|  | "srl $rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 12)) | 
|  | (set rn (srl rn (and rm #x1f))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sll "shift left logical" ((STALL INT2)) | 
|  | "sll $rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 14)) | 
|  | (set rn (sll rn (and rm #x1f))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci srai "shift right arithmetic (immediate)" ((STALL SHIFTI)) | 
|  | "sra $rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 3)) | 
|  | (set rn (sra rn uimm5)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci srli "shift right logical (immediate)" ((STALL SHIFTI)) | 
|  | "srl $rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 2)) | 
|  | (set rn (srl rn uimm5)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci slli "shift left logical (immediate)" ((STALL SHIFTI)) | 
|  | "sll $rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 6)) | 
|  | (set rn (sll rn uimm5)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sll3 "three-register shift left logical" ((STALL INT2)) | 
|  | "sll3 \\$0,$rn,$uimm5" | 
|  | (+ MAJ_6 rn uimm5 (f-sub3 7)) | 
|  | (set r0 (sll rn uimm5)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci fsft "field shift" ((STALL FSFT) VOLATILE) | 
|  | "fsft $rn,$rm" | 
|  | (+ MAJ_2 rn rm (f-sub4 15)) | 
|  | (sequence ((DI temp) (QI shamt)) | 
|  | (set shamt (and sar #x3f)) | 
|  | (set temp (sll (or (sll (zext DI rn) 32) (zext DI rm)) shamt)) | 
|  | (set rn (subword SI (srl temp 32) 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Branch/jump instructions. | 
|  |  | 
|  | (dnci bra "branch" (RELAXABLE) | 
|  | "bra $pcrel12a2" | 
|  | (+ MAJ_11 pcrel12a2 (f-15 0)) | 
|  | (set-vliw-alignment-modified pc pcrel12a2) | 
|  | ((mep (unit u-branch) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci beqz "branch if equal zero" (RELAXABLE) | 
|  | "beqz $rn,$pcrel8a2" | 
|  | (+ MAJ_10 rn pcrel8a2 (f-15 0)) | 
|  | (if (eq rn 0) | 
|  | (set-vliw-alignment-modified pc pcrel8a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bnez "branch if not equal zero" (RELAXABLE) | 
|  | "bnez $rn,$pcrel8a2" | 
|  | (+ MAJ_10 rn pcrel8a2 (f-15 1)) | 
|  | (if (ne rn 0) | 
|  | (set-vliw-alignment-modified pc pcrel8a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci beqi "branch equal immediate" (RELAXABLE) | 
|  | "beqi $rn,$uimm4,$pcrel17a2" | 
|  | (+ MAJ_14 rn uimm4 (f-sub4 0) pcrel17a2) | 
|  | (if (eq rn (zext SI uimm4)) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bnei "branch not equal immediate" (RELAXABLE) | 
|  | "bnei $rn,$uimm4,$pcrel17a2" | 
|  | (+ MAJ_14 rn uimm4 (f-sub4 4) pcrel17a2) | 
|  | (if (ne rn (zext SI uimm4)) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci blti "branch less than immediate" (RELAXABLE) | 
|  | "blti $rn,$uimm4,$pcrel17a2" | 
|  | (+ MAJ_14 rn uimm4 (f-sub4 12) pcrel17a2) | 
|  | (if (lt rn (zext SI uimm4)) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bgei "branch greater than immediate" (RELAXABLE) | 
|  | "bgei $rn,$uimm4,$pcrel17a2" | 
|  | (+ MAJ_14 rn uimm4 (f-sub4 8) pcrel17a2) | 
|  | (if (ge rn (zext SI uimm4)) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci beq "branch equal" () | 
|  | "beq $rn,$rm,$pcrel17a2" | 
|  | (+ MAJ_14 rn rm (f-sub4 1) pcrel17a2) | 
|  | (if (eq rn rm) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bne "branch not equal" () | 
|  | "bne $rn,$rm,$pcrel17a2" | 
|  | (+ MAJ_14 rn rm (f-sub4 5) pcrel17a2) | 
|  | (if (ne rn rm) | 
|  | (set-vliw-alignment-modified pc pcrel17a2)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bsr12 "branch to subroutine (12 bit displacement)" (RELAXABLE) | 
|  | "bsr $pcrel12a2" | 
|  | (+ MAJ_11 pcrel12a2 (f-15 1)) | 
|  | (sequence () | 
|  | (cg-profile pc pcrel12a2) | 
|  | (set-vliw-modified-pcrel-offset lp 2 4 8) | 
|  | (set-vliw-alignment-modified pc pcrel12a2)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bsr24 "branch to subroutine (24 bit displacement)" () | 
|  | "bsr $pcrel24a2" | 
|  | (+ MAJ_13 (f-4 1) (f-sub4 9) pcrel24a2) | 
|  | (sequence () | 
|  | (cg-profile pc pcrel24a2) | 
|  | (set-vliw-modified-pcrel-offset lp 4 4 8) | 
|  | (set-vliw-alignment-modified pc pcrel24a2)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci jmp "jump" () | 
|  | "jmp $rm" | 
|  | (+ MAJ_1 (f-rn 0) rm (f-sub4 14)) | 
|  | (sequence () | 
|  | (if (eq (get-psw.om) 0) | 
|  | ;; core mode | 
|  | (if (get-rm.lsb) | 
|  | (sequence () | 
|  | (set-psw.om 1) ;; enter VLIW mode | 
|  | (set-vliw-aliignment-modified-by-option pc rm)) | 
|  | (set pc (and rm (inv 1)))) | 
|  | ;; VLIW mode | 
|  | (if (get-rm.lsb) | 
|  | (sequence () | 
|  | (set-psw.om 0) ;; enter core mode | 
|  | (set pc (and rm (inv 1)))) | 
|  | (set-vliw-aliignment-modified-by-option pc rm))) | 
|  | (cg-profile-jump pc rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci jmp24 "jump (24 bit target)" () | 
|  | "jmp $pcabs24a2" | 
|  | (+ MAJ_13 (f-4 1) (f-sub4 8) pcabs24a2) | 
|  | (sequence () | 
|  | (set-vliw-alignment-modified pc (or (and pc #xf0000000) pcabs24a2)) | 
|  | (cg-profile-jump pc pcabs24a2)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci jsr "jump to subroutine" () | 
|  | "jsr $rm" | 
|  | (+ MAJ_1 (f-rn 0) rm (f-sub4 15)) | 
|  | (sequence () | 
|  | (cg-profile pc rm) | 
|  | (set-vliw-modified-pcrel-offset lp 2 4 8) | 
|  | (set-vliw-alignment-modified pc rm)) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci ret "return from subroutine" ((STALL RET)) | 
|  | "ret" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 0) (f-sub4 2)) | 
|  | (sequence () | 
|  | (if (eq (get-psw.om) 0) | 
|  | ;; core mode | 
|  | (if (get-lp.ltom) ;; link-pointer "toggle mode" bit | 
|  | (sequence () | 
|  | (set-psw.om 1) ;; enter VLIW mode | 
|  | (set-vliw-aliignment-modified-by-option pc lp)) | 
|  | (set pc (and lp (inv 1)))) | 
|  | ;; VLIW mode | 
|  | (if (get-lp.ltom) ;; link-pointer "toggle mode" bit | 
|  | (sequence () | 
|  | (set-psw.om 0) ;; enter VLIW mode | 
|  | (set pc (and lp (inv 1)))) | 
|  | (set-vliw-aliignment-modified-by-option pc lp))) | 
|  | (c-call VOID "notify_ret" pc)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  |  | 
|  | ; Repeat instructions. | 
|  |  | 
|  | (dnci repeat "repeat specified repeat block" () | 
|  | "repeat $rn,$pcrel17a2" | 
|  | (+ MAJ_14 rn (f-rm 0) (f-sub4 9) pcrel17a2) | 
|  | (sequence () | 
|  | (set-vliw-modified-pcrel-offset (reg h-csr 4) 4 4 8) | 
|  | (set-vliw-alignment-modified (reg h-csr 5) pcrel17a2) | 
|  | (set (reg h-csr 6) rn)) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci erepeat "endless repeat" () | 
|  | "erepeat $pcrel17a2" | 
|  | (+ MAJ_14 (f-rn 0) (f-rm 1) (f-sub4 9) pcrel17a2) | 
|  | (sequence () | 
|  | (set-vliw-modified-pcrel-offset (reg h-csr 4) 4 4 8) | 
|  | (set-vliw-alignment-modified (reg h-csr 5) pcrel17a2) | 
|  | (set-rpe.elr 1) | 
|  | ; rpc may be undefined for erepeat | 
|  | ; use 1 to trigger repeat logic in the sim's main loop | 
|  | (set (reg h-csr 6) 1)) | 
|  | ()) | 
|  |  | 
|  |  | 
|  | ; Control instructions. | 
|  |  | 
|  | ;; special store variants | 
|  |  | 
|  | (dnci stc_lp "store to control register lp" ((STALL STC)) | 
|  | "stc $rn,\\$lp" | 
|  | (+ MAJ_7 rn (f-csrn-lo 1) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) | 
|  | (set lp rn) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-store-ctrl-reg (out storereg lp)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci stc_hi "store to control register hi" ((STALL STC)) | 
|  | "stc $rn,\\$hi" | 
|  | (+ MAJ_7 rn (f-csrn-lo 7) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) | 
|  | (set hi rn) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-store-ctrl-reg (out storereg hi)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci stc_lo "store to control register lo" ((STALL STC)) | 
|  | "stc $rn,\\$lo" | 
|  | (+ MAJ_7 rn (f-csrn-lo 8) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) | 
|  | (set lo rn) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-store-ctrl-reg (out storereg lo)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | ;; general store | 
|  |  | 
|  | (dnci stc "store to control register" (VOLATILE (STALL STC)) | 
|  | "stc $rn,$csrn" | 
|  | (+ MAJ_7 rn csrn (f-12 1) (f-13 0) (f-14 0)) | 
|  | (set csrn rn) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-store-ctrl-reg (out storereg csrn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | ;; special load variants | 
|  |  | 
|  | (dnci ldc_lp "load from control register lp" ((STALL LDC)) | 
|  | "ldc $rn,\\$lp" | 
|  | (+ MAJ_7 rn (f-csrn-lo 1) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) | 
|  | (set rn lp) | 
|  | ((mep (unit u-use-ctrl-reg (in usereg lp)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn))))) | 
|  |  | 
|  |  | 
|  | (dnci ldc_hi "load from control register hi" ((STALL LDC)) | 
|  | "ldc $rn,\\$hi" | 
|  | (+ MAJ_7 rn (f-csrn-lo 7) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) | 
|  | (set rn hi) | 
|  | ((mep (unit u-use-ctrl-reg (in usereg hi)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn))))) | 
|  |  | 
|  | (dnci ldc_lo "load from control register lo" ((STALL LDC)) | 
|  | "ldc $rn,\\$lo" | 
|  | (+ MAJ_7 rn (f-csrn-lo 8) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) | 
|  | (set rn lo) | 
|  | ((mep (unit u-use-ctrl-reg (in usereg lo)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn))))) | 
|  |  | 
|  | ;; general load | 
|  |  | 
|  | (dnci ldc "load from control register" (VOLATILE (STALL LDC) (LATENCY 2)) | 
|  | "ldc $rn,$csrn" | 
|  | (+ MAJ_7 rn csrn (f-12 1) (f-13 0) (f-14 1)) | 
|  | (if (eq (ifield f-csrn) 0) | 
|  | ;; loading from the pc | 
|  | (set-vliw-modified-pcrel-offset rn 2 4 8) | 
|  | ;; loading from something else | 
|  | (set rn csrn)) | 
|  | ((mep (unit u-use-ctrl-reg (in usereg csrn)) | 
|  | (unit u-exec) | 
|  | (unit u-load-gpr (out loadreg rn))))) | 
|  |  | 
|  | (dnci di "disable interrupt" (VOLATILE) | 
|  | "di" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 0) (f-sub4 0)) | 
|  | ; clear psw.iec | 
|  | (set psw (sll (srl psw 1) 1)) | 
|  | ()) | 
|  |  | 
|  | (dnci ei "enable interrupt" (VOLATILE) | 
|  | "ei" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 0)) | 
|  | ; set psw.iec | 
|  | (set psw (or psw 1)) | 
|  | ()) | 
|  |  | 
|  | (dnci reti "return from interrupt" ((STALL RET)) | 
|  | "reti" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 2)) | 
|  | (if (eq (get-psw.om) 0) | 
|  | ;; core operation mode | 
|  | (if (get-psw.nmi) | 
|  | ;; return from NMI | 
|  | (if (get-npc.ntom) | 
|  | ;; return in VLIW operation mode | 
|  | (sequence () | 
|  | (set-psw.om 1) | 
|  | (set-vliw-aliignment-modified-by-option pc npc) | 
|  | (set-psw.nmi 0)) | 
|  | ;; return in core mode | 
|  | (sequence () | 
|  | (set pc (and npc (inv 1))) | 
|  | (set-psw.nmi 0))) | 
|  | ;; return from non-NMI | 
|  | (if (get-epc.etom) | 
|  | ;; return in VLIW mode | 
|  | (sequence () | 
|  | (set-psw.om 1) | 
|  | (set-vliw-aliignment-modified-by-option pc epc) | 
|  | (set-psw.umc (get-psw.ump)) | 
|  | (set-psw.iec (get-psw.iep))) | 
|  | ;; return in core mode | 
|  | (sequence () | 
|  | (set pc (and epc (inv 1))) | 
|  | (set-psw.umc (get-psw.ump)) | 
|  | (set-psw.iec (get-psw.iep))))) | 
|  | ;; VLIW operation mode | 
|  | ;; xxx undefined | 
|  | (nop)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci halt "halt pipeline" (VOLATILE) | 
|  | "halt" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 2) (f-sub4 2)) | 
|  | ; set psw.halt | 
|  | (set (raw-reg h-csr 16) (or psw (sll 1 11))) | 
|  | ()) | 
|  |  | 
|  | (dnci sleep "sleep pipeline" (VOLATILE) | 
|  | "sleep" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 6) (f-sub4 2)) | 
|  | (c-call VOID "do_sleep") | 
|  | ()) | 
|  |  | 
|  | (dnci swi "software interrupt" (MAY_TRAP VOLATILE) | 
|  | "swi $uimm2" | 
|  | (+ MAJ_7 (f-rn 0) (f-8 0) (f-9 0) uimm2 (f-sub4 6)) | 
|  | (cond | 
|  | ((eq uimm2 0) (set exc (or exc (sll 1 4)))) | 
|  | ((eq uimm2 1) (set exc (or exc (sll 1 5)))) | 
|  | ((eq uimm2 2) (set exc (or exc (sll 1 6)))) | 
|  | ((eq uimm2 3) (set exc (or exc (sll 1 7))))) | 
|  | ()) | 
|  |  | 
|  | (dnci break "break exception" (MAY_TRAP VOLATILE) | 
|  | "break" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 3) (f-sub4 2)) | 
|  | (set pc (c-call USI "break_exception" pc)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci syncm "synchronise with memory" (VOLATILE) | 
|  | "syncm" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 1)) | 
|  | (unimp "syncm") | 
|  | ()) | 
|  |  | 
|  | (dnci stcb "store in control bus space" (VOLATILE (STALL STCB)) | 
|  | "stcb $rn,$uimm16" | 
|  | (+ MAJ_15 rn (f-rm 0) (f-sub4 4) uimm16) | 
|  | (c-call VOID "do_stcb" rn uimm16) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec) | 
|  | (unit u-stcb)))) | 
|  |  | 
|  | (dnci ldcb "load from control bus space" (VOLATILE (STALL LDCB) (LATENCY 3)) | 
|  | "ldcb $rn,$uimm16" | 
|  | (+ MAJ_15 rn (f-rm 1) (f-sub4 4) uimm16) | 
|  | (set rn (c-call SI "do_ldcb" uimm16)) | 
|  | ((mep (unit u-ldcb) | 
|  | (unit u-exec) | 
|  | (unit u-ldcb-gpr (out loadreg rn))))) | 
|  |  | 
|  |  | 
|  | ; Bit manipulation instructions. | 
|  | ; The following instructions become the reserved instruction when the | 
|  | ; bit manipulation option is off. | 
|  |  | 
|  | (dnci bsetm "set bit in memory" (OPTIONAL_BIT_INSN) | 
|  | "bsetm ($rma),$uimm3" | 
|  | (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 0)) | 
|  | (sequence () | 
|  | (c-call "check_option_bit" pc) | 
|  | (set (mem UQI rma) (or (mem UQI rma) (sll 1 uimm3)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci bclrm "clear bit in memory" (OPTIONAL_BIT_INSN) | 
|  | "bclrm ($rma),$uimm3" | 
|  | (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 1)) | 
|  | (sequence () | 
|  | (c-call "check_option_bit" pc) | 
|  | (set (mem UQI rma) (and (mem UQI rma) (inv (sll 1 uimm3))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci bnotm "toggle bit in memory" (OPTIONAL_BIT_INSN) | 
|  | "bnotm ($rma),$uimm3" | 
|  | (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 2)) | 
|  | (sequence () | 
|  | (c-call "check_option_bit" pc) | 
|  | (set (mem UQI rma) (xor (mem UQI rma) (sll 1 uimm3)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci btstm "test bit in memory" (OPTIONAL_BIT_INSN) | 
|  | "btstm \\$0,($rma),$uimm3" | 
|  | (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 3)) | 
|  | (sequence () | 
|  | (c-call "check_option_bit" pc) | 
|  | (set r0 (zext SI (and UQI (mem UQI rma) (sll 1 uimm3))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci tas "test and set" (OPTIONAL_BIT_INSN) | 
|  | "tas $rn,($rma)" | 
|  | (+ MAJ_2 rn rma (f-sub4 4)) | 
|  | (sequence ((SI result)) | 
|  | (c-call "check_option_bit" pc) | 
|  | (set result (zext SI (mem UQI rma))) | 
|  | (set (mem UQI rma) 1) | 
|  | (set rn result)) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Data cache instruction. | 
|  |  | 
|  | (dnci cache "cache operations" (VOLATILE) | 
|  | "cache $cimm4,($rma)" | 
|  | (+ MAJ_7 cimm4 rma (f-sub4 4)) | 
|  | (c-call VOID "do_cache" cimm4 rma pc) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Multiply instructions. | 
|  | ; These instructions become the RI when the 32-bit multiply | 
|  | ; instruction option is off. | 
|  |  | 
|  | (dnci mul "multiply" (OPTIONAL_MUL_INSN (STALL MUL)) | 
|  | "mul $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 4)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (mul (ext DI rn) (ext DI rm))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply)))) | 
|  |  | 
|  | (dnci mulu "multiply unsigned" (OPTIONAL_MUL_INSN (STALL MUL)) | 
|  | "mulu $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 5)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (mul (zext UDI rn) (zext UDI rm))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply)))) | 
|  |  | 
|  | (dnci mulr "multiply, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) | 
|  | "mulr $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 6)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (mul (ext DI rn) (ext DI rm))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1)) | 
|  | (set rn (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply) | 
|  | (unit u-mul-gpr (out resultreg rn))))) | 
|  |  | 
|  | (dnci mulru "multiply unsigned, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) | 
|  | "mulru $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 7)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (mul (zext UDI rn) (zext UDI rm))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1)) | 
|  | (set rn (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply) | 
|  | (unit u-mul-gpr (out resultreg rn))))) | 
|  |  | 
|  | (dnci madd "multiply accumulate" (OPTIONAL_MUL_INSN (STALL MUL)) | 
|  | "madd $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3004)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (or (sll (zext DI hi) 32) (zext DI lo))) | 
|  | (set result (add result (mul (ext DI rn) (ext DI rm)))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply)))) | 
|  |  | 
|  | (dnci maddu "multiply accumulate unsigned" (OPTIONAL_MUL_INSN (STALL MUL)) | 
|  | "maddu $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3005)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (or (sll (zext DI hi) 32) (zext DI lo))) | 
|  | (set result (add result (mul (zext UDI rn) (zext UDI rm)))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply)))) | 
|  |  | 
|  |  | 
|  | (dnci maddr "multiply accumulate, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) | 
|  | "maddr $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3006)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (or (sll (zext DI hi) 32) (zext DI lo))) | 
|  | (set result (add result (mul (ext DI rn) (ext DI rm)))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1)) | 
|  | (set rn (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply) | 
|  | (unit u-mul-gpr (out resultreg rn))))) | 
|  |  | 
|  | (dnci maddru "multiple accumulate unsigned, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) | 
|  | "maddru $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3007)) | 
|  | (sequence ((DI result)) | 
|  | (c-call "check_option_mul" pc) | 
|  | (set result (or (sll (zext DI hi) 32) (zext DI lo))) | 
|  | (set result (add result (mul (zext UDI rn) (zext UDI rm)))) | 
|  | (set hi (subword SI result 0)) | 
|  | (set lo (subword SI result 1)) | 
|  | (set rn (subword SI result 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-multiply) | 
|  | (unit u-mul-gpr (out resultreg rn))))) | 
|  |  | 
|  |  | 
|  | ; Divide instructions. | 
|  | ; These instructions become the RI when the 32-bit divide instruction | 
|  | ; option is off. | 
|  |  | 
|  | (dnci div "divide" (OPTIONAL_DIV_INSN (STALL DIV) (LATENCY 34) MAY_TRAP) | 
|  | "div $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 8)) | 
|  | (sequence () | 
|  | (c-call "check_option_div" pc) | 
|  | (if (eq rm 0) | 
|  | (set pc (c-call USI "zdiv_exception" pc)) | 
|  | ; Special case described on p. 76. | 
|  | (if (and (eq rn #x80000000) | 
|  | (eq rm #xffffffff)) | 
|  | (sequence () | 
|  | (set lo #x80000000) | 
|  | (set hi 0)) | 
|  | (sequence () | 
|  | (set lo (div rn rm)) | 
|  | (set hi (mod rn rm)))))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-divide) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci divu "divide unsigned" (OPTIONAL_DIV_INSN (STALL DIV) (LATENCY 34) MAY_TRAP) | 
|  | "divu $rn,$rm" | 
|  | (+ MAJ_1 rn rm (f-sub4 9)) | 
|  | (sequence () | 
|  | (c-call "check_option_div" pc) | 
|  | (if (eq rm 0) | 
|  | (set pc (c-call USI "zdiv_exception" pc)) | 
|  | (sequence () | 
|  | (set lo (udiv rn rm)) | 
|  | (set hi (umod rn rm))))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-divide) | 
|  | (unit u-branch)))) | 
|  |  | 
|  |  | 
|  | ; Debug functions. | 
|  | ; These instructions become the RI when the debug function option is | 
|  | ; off. | 
|  |  | 
|  | (dnci dret "return from debug exception" (OPTIONAL_DEBUG_INSN) | 
|  | "dret" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 3)) | 
|  | (sequence () | 
|  | (c-call "check_option_debug" pc) | 
|  | ; set DBG.DM. | 
|  | (set dbg (and dbg (inv (sll SI 1 15)))) | 
|  | (set pc depc)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci dbreak "generate debug exception" (OPTIONAL_DEBUG_INSN MAY_TRAP VOLATILE) | 
|  | "dbreak" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 3) (f-sub4 3)) | 
|  | (sequence () | 
|  | (c-call "check_option_debug" pc) | 
|  | ; set DBG.DPB. | 
|  | (set dbg (or dbg 1))) | 
|  | ()) | 
|  |  | 
|  |  | 
|  | ; Leading zero instruction. | 
|  |  | 
|  | (dnci ldz "leading zeroes" (OPTIONAL_LDZ_INSN (STALL INT2)) | 
|  | "ldz $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 0)) | 
|  | (sequence () | 
|  | (c-call "check_option_ldz" pc) | 
|  | (set rn (c-call SI "do_ldz" rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Absolute difference instruction. | 
|  |  | 
|  | (dnci abs "absolute difference" (OPTIONAL_ABS_INSN (STALL INT2)) | 
|  | "abs $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 3)) | 
|  | (sequence () | 
|  | (c-call "check_option_abs" pc) | 
|  | (set rn (abs (sub rn rm)))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Average instruction. | 
|  |  | 
|  | (dnci ave "average" (OPTIONAL_AVE_INSN (STALL INT2)) | 
|  | "ave $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 2)) | 
|  | (sequence () | 
|  | (c-call "check_option_ave" pc) | 
|  | (set rn (sra (add (add rn rm) 1) 1))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; MIN/MAX instructions. | 
|  |  | 
|  | (dnci min "minimum" (OPTIONAL_MINMAX_INSN (STALL INT2)) | 
|  | "min $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 4)) | 
|  | (sequence () | 
|  | (c-call "check_option_minmax" pc) | 
|  | (if (gt rn rm) | 
|  | (set rn rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci max "maximum" (OPTIONAL_MINMAX_INSN (STALL INT2)) | 
|  | "max $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 5)) | 
|  | (sequence () | 
|  | (c-call "check_option_minmax" pc) | 
|  | (if (lt rn rm) | 
|  | (set rn rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci minu "minimum unsigned" (OPTIONAL_MINMAX_INSN (STALL INT2)) | 
|  | "minu $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 6)) | 
|  | (sequence () | 
|  | (c-call "check_option_minmax" pc) | 
|  | (if (gtu rn rm) | 
|  | (set rn rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci maxu "maximum unsigned" (OPTIONAL_MINMAX_INSN (STALL INT2)) | 
|  | "maxu $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 7)) | 
|  | (sequence () | 
|  | (c-call "check_option_minmax" pc) | 
|  | (if (ltu rn rm) | 
|  | (set rn rm))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Clipping instruction. | 
|  |  | 
|  | (dnci clip "clip" (OPTIONAL_CLIP_INSN (STALL INT2)) | 
|  | "clip $rn,$cimm5" | 
|  | (+ MAJ_15 rn (f-rm 0) (f-sub4 1) (f-ext #x10) cimm5 (f-29 0) (f-30 0) (f-31 0)) | 
|  | (sequence ((SI min) (SI max)) | 
|  | (c-call "check_option_clip" pc) | 
|  | (set max (sub (sll 1 (sub cimm5 1)) 1)) | 
|  | (set min (neg (sll 1 (sub cimm5 1)))) | 
|  | (cond | 
|  | ((eq cimm5 0) (set rn 0)) | 
|  | ((gt rn max) (set rn max)) | 
|  | ((lt rn min) (set rn min)))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci clipu "clip unsigned" (OPTIONAL_CLIP_INSN (STALL INT2)) | 
|  | "clipu $rn,$cimm5" | 
|  | (+ MAJ_15 rn (f-rm 0) (f-sub4 1) (f-ext #x10) cimm5 (f-29 0) (f-30 0) (f-31 1)) | 
|  | (sequence ((SI max)) | 
|  | (c-call "check_option_clip" pc) | 
|  | (set max (sub (sll 1 cimm5) 1)) | 
|  | (cond | 
|  | ((eq cimm5 0) (set rn 0)) | 
|  | ((gt rn max) (set rn max)) | 
|  | ((lt rn 0) (set rn 0)))) | 
|  | ((mep (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; Saturation instructions. | 
|  |  | 
|  | (dnci sadd "saturating addition" (OPTIONAL_SAT_INSN (STALL INT2)) | 
|  | "sadd $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 8)) | 
|  | (sequence () | 
|  | (c-call "check_option_sat" pc) | 
|  | (if (add-oflag rn rm 0) | 
|  | (if (nflag rn) | 
|  | ; underflow | 
|  | (set rn (neg (sll 1 31))) | 
|  | ; overflow | 
|  | (set rn (sub (sll 1 31) 1))) | 
|  | (set rn (add rn rm)))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci ssub "saturating subtraction" (OPTIONAL_SAT_INSN (STALL INT2)) | 
|  | "ssub $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 10)) | 
|  | (sequence () | 
|  | (c-call "check_option_sat" pc) | 
|  | (if (sub-oflag rn rm 0) | 
|  | (if (nflag rn) | 
|  | ; underflow | 
|  | (set rn (neg (sll 1 31))) | 
|  | ; overflow | 
|  | (set rn (sub (sll 1 31) 1))) | 
|  | (set rn (sub rn rm)))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci saddu "saturating unsigned addition" (OPTIONAL_SAT_INSN (STALL INT2)) | 
|  | "saddu $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 9)) | 
|  | (sequence () | 
|  | (c-call "check_option_sat" pc) | 
|  | (if (add-cflag rn rm 0) | 
|  | (set rn (inv 0)) | 
|  | (set rn (add rn rm)))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci ssubu "saturating unsigned subtraction" (OPTIONAL_SAT_INSN (STALL INT2)) | 
|  | "ssubu $rn,$rm" | 
|  | (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 11)) | 
|  | (sequence () | 
|  | (c-call "check_option_sat" pc) | 
|  | (if (sub-cflag rn rm 0) | 
|  | (set rn 0) | 
|  | (set rn (sub rn rm)))) | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-use-gpr (in usereg rn)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | ; UCI and DSP options are defined in an external file. | 
|  | ; See `mep-sample-ucidsp.cpu' for a sample. | 
|  |  | 
|  |  | 
|  | ; Coprocessor instructions. | 
|  |  | 
|  | (dnci swcp "store word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "swcp $crn,($rma)" | 
|  | (+ MAJ_3 crn rma (f-sub4 8)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 3))) | 
|  | (set (mem SI (and rma (inv SI 3))) crn)) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcp "load word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lwcp $crn,($rma)" | 
|  | (+ MAJ_3 crn rma (f-sub4 9)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (mem SI (and rma (inv SI 3))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcp "smcp" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) | 
|  | "smcp $crn64,($rma)" | 
|  | (+ MAJ_3 crn64 rma (f-sub4 10)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (c-call "do_smcp" rma crn64 pc)) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcp "lmcp" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) | 
|  | "lmcp $crn64,($rma)" | 
|  | (+ MAJ_3 crn64 rma (f-sub4 11)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcp" rma pc))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci swcpi "swcp (post-increment)" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "swcpi $crn,($rma+)" | 
|  | (+ MAJ_3 crn rma (f-sub4 0)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 3))) | 
|  | (set (mem SI (and rma (inv SI 3))) crn) | 
|  | (set rma (add rma 4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcpi "lwcp (post-increment)" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lwcpi $crn,($rma+)" | 
|  | (+ MAJ_3 crn rma (f-sub4 1)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (mem SI (and rma (inv SI 3)))) | 
|  | (set rma (add rma 4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcpi "smcp (post-increment)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) | 
|  | "smcpi $crn64,($rma+)" | 
|  | (+ MAJ_3 crn64 rma (f-sub4 2)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (c-call "do_smcpi" (index-of rma) crn64 pc) | 
|  | (set rma rma)) ; reference as output for intrinsic generation | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcpi "lmcp (post-increment)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) | 
|  | "lmcpi $crn64,($rma+)" | 
|  | (+ MAJ_3 crn64 rma (f-sub4 3)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcpi" (index-of rma) pc)) | 
|  | (set rma rma)) ; reference as output for intrinsic generation | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci swcp16 "swcp (16-bit displacement)" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "swcp $crn,$sdisp16($rma)" | 
|  | (+ MAJ_15 crn rma (f-sub4 12) sdisp16) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set (mem SI (and (add rma sdisp16) (inv SI 3))) crn)) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcp16 "lwcp (16-bit displacement)" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lwcp $crn,$sdisp16($rma)" | 
|  | (+ MAJ_15 crn rma (f-sub4 13) sdisp16) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (mem SI (and (add rma sdisp16) (inv SI 3))))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcp16 "smcp (16-bit displacement)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) | 
|  | "smcp $crn64,$sdisp16($rma)" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 14) sdisp16) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call "do_smcp16" rma sdisp16 crn64 pc)) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcp16 "lmcp (16-bit displacement)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) | 
|  | "lmcp $crn64,$sdisp16($rma)" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 15) sdisp16) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcp16" rma sdisp16 pc))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sbcpa "store byte coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "sbcpa $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 0) (f-ext62 0) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (set (mem QI rma) (and crn #xff)) | 
|  | (set rma (add rma (ext SI cdisp10)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lbcpa "load byte coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lbcpa $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x0) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem QI rma))) | 
|  | (set rma (add rma (ext SI cdisp10)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci shcpa "store half-word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "shcpa $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x0) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 1))) | 
|  | (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) | 
|  | (set rma (add rma (ext SI cdisp10a2)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lhcpa "load half-word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lhcpa $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x0) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem HI (and rma (inv SI 1))))) | 
|  | (set rma (add rma (ext SI cdisp10a2)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci swcpa "store word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) | 
|  | "swcpa $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x0) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 3))) | 
|  | (set (mem SI (and rma (inv SI 3))) crn) | 
|  | (set rma (add rma (ext SI cdisp10a4)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcpa "load word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) | 
|  | "lwcpa $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x0) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (mem SI (and rma (inv SI 3)))) | 
|  | (set rma (add rma (ext SI cdisp10a4)))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcpa "smcpa" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) | 
|  | "smcpa $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x0) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (c-call "do_smcpa" (index-of rma) cdisp10a8 crn64 pc) | 
|  | (set rma rma)) ; reference as output for intrinsic generation | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcpa "lmcpa" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) | 
|  | "lmcpa $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x0) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcpa" (index-of rma) cdisp10a8 pc)) | 
|  | (set rma rma)) ; reference as output for intrinsic generation | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  |  | 
|  | (dnci sbcpm0 "sbcpm0" (OPTIONAL_CP_INSN) | 
|  | "sbcpm0 $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x0) (f-ext62 #x2) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (set (mem QI rma) (and crn #xff)) | 
|  | (set rma (mod0 cdisp10))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lbcpm0 "lbcpm0" (OPTIONAL_CP_INSN) | 
|  | "lbcpm0 $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x2) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem QI rma))) | 
|  | (set rma (mod0 cdisp10))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci shcpm0 "shcpm0" (OPTIONAL_CP_INSN) | 
|  | "shcpm0 $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x2) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 1))) | 
|  | (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) | 
|  | (set rma (mod0 cdisp10a2))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lhcpm0 "lhcpm0" (OPTIONAL_CP_INSN) | 
|  | "lhcpm0 $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x2) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem HI (and rma (inv SI 1))))) | 
|  | (set rma (mod0 cdisp10a2))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci swcpm0 "swcpm0" (OPTIONAL_CP_INSN) | 
|  | "swcpm0 $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x2) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 3))) | 
|  | (set (mem SI (and rma (inv SI 3))) crn) | 
|  | (set rma (mod0 cdisp10a4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcpm0 "lwcpm0" (OPTIONAL_CP_INSN) | 
|  | "lwcpm0 $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x2) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (mem SI (and rma (inv SI 3)))) | 
|  | (set rma (mod0 cdisp10a4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcpm0 "smcpm0" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) | 
|  | "smcpm0 $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x2) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (c-call "do_smcp" rma crn64 pc) | 
|  | (set rma (mod0 cdisp10a8))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcpm0 "lmcpm0" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) | 
|  | "lmcpm0 $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x2) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcp" rma pc)) | 
|  | (set rma (mod0 cdisp10a8))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci sbcpm1 "sbcpm1" (OPTIONAL_CP_INSN) | 
|  | "sbcpm1 $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x0) (f-ext62 #x3) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (set (mem QI rma) (and crn #xff)) | 
|  | (set rma (mod1 cdisp10))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lbcpm1 "lbcpm1" (OPTIONAL_CP_INSN) | 
|  | "lbcpm1 $crn,($rma+),$cdisp10" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x3) cdisp10) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem QI rma))) | 
|  | (set rma (mod1 cdisp10))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci shcpm1 "shcpm1" (OPTIONAL_CP_INSN) | 
|  | "shcpm1 $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x3) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 1))) | 
|  | (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) | 
|  | (set rma (mod1 cdisp10a2))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lhcpm1 "lhcpm1" (OPTIONAL_CP_INSN) | 
|  | "lhcpm1 $crn,($rma+),$cdisp10a2" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x3) cdisp10a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem HI (and rma (inv SI 1))))) | 
|  | (set rma (mod1 cdisp10a2))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci swcpm1 "swcpm1" (OPTIONAL_CP_INSN) | 
|  | "swcpm1 $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x3) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call VOID "check_write_to_text" (and rma (inv SI 3))) | 
|  | (set (mem SI (and rma (inv SI 3))) crn) | 
|  | (set rma (mod1 cdisp10a4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lwcpm1 "lwcpm1" (OPTIONAL_CP_INSN) | 
|  | "lwcpm1 $crn,($rma+),$cdisp10a4" | 
|  | (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x3) cdisp10a4) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (set crn (ext SI (mem SI (and rma (inv SI 3))))) | 
|  | (set rma (mod1 cdisp10a4))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci smcpm1 "smcpm1" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) | 
|  | "smcpm1 $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x3) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (c-call "do_smcp" rma crn64 pc) | 
|  | (c-call VOID "check_write_to_text" rma) | 
|  | (set rma (mod1 cdisp10a8))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnci lmcpm1 "lmcpm1" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) | 
|  | "lmcpm1 $crn64,($rma+),$cdisp10a8" | 
|  | (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x3) cdisp10a8) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (c-call "check_option_cp64" pc) | 
|  | (set crn64 (c-call DI "do_lmcp" rma pc)) | 
|  | (set rma (mod1 cdisp10a8))) | 
|  | ((mep (unit u-use-gpr (in usereg rma)) | 
|  | (unit u-exec)))) | 
|  |  | 
|  | (dnop cp_flag       "branch condition register"  (all-mep-isas) h-ccr   1) | 
|  |  | 
|  | (dnci bcpeq "branch coprocessor equal" (OPTIONAL_CP_INSN RELAXABLE) | 
|  | "bcpeq $cccc,$pcrel17a2" | 
|  | (+ MAJ_13 (f-rn 8) cccc (f-sub4 4) pcrel17a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (if (eq (xor cccc cp_flag) 0) | 
|  | (set-vliw-alignment-modified pc pcrel17a2))) | 
|  | ()) | 
|  |  | 
|  | (dnci bcpne "branch coprocessor not equal" (OPTIONAL_CP_INSN RELAXABLE) | 
|  | "bcpne $cccc,$pcrel17a2" | 
|  | (+ MAJ_13 (f-rn 8) cccc (f-sub4 5) pcrel17a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (if (ne (xor cccc cp_flag) 0) | 
|  | (set-vliw-alignment-modified pc pcrel17a2))) | 
|  | ()) | 
|  |  | 
|  | (dnci bcpat "branch coprocessor and true" (OPTIONAL_CP_INSN RELAXABLE) | 
|  | "bcpat $cccc,$pcrel17a2" | 
|  | (+ MAJ_13 (f-rn 8) cccc (f-sub4 6) pcrel17a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (if (ne (and cccc cp_flag) 0) | 
|  | (set-vliw-alignment-modified pc pcrel17a2))) | 
|  | ()) | 
|  |  | 
|  | (dnci bcpaf "branch coprocessor and false" (OPTIONAL_CP_INSN RELAXABLE) | 
|  | "bcpaf $cccc,$pcrel17a2" | 
|  | (+ MAJ_13 (f-rn 8) cccc (f-sub4 7) pcrel17a2) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (if (eq (and cccc cp_flag) 0) | 
|  | (set-vliw-alignment-modified pc pcrel17a2))) | 
|  | ()) | 
|  |  | 
|  | (dnci synccp "synchronise with coprocessor" (OPTIONAL_CP_INSN) | 
|  | "synccp" | 
|  | (+ MAJ_7 (f-rn 0) (f-rm 2) (f-sub4 1)) | 
|  | (sequence () | 
|  | (c-call "check_option_cp" pc) | 
|  | (unimp "synccp")) | 
|  | ()) | 
|  |  | 
|  | (dnci jsrv "jump to vliw subroutine " (OPTIONAL_CP_INSN) | 
|  | "jsrv $rm" | 
|  | (+ MAJ_1 (f-rn 8) rm (f-sub4 15)) | 
|  | (sequence () | 
|  | (cg-profile pc rm) | 
|  | (c-call "check_option_cp" pc) | 
|  | (core-vliw-switch | 
|  |  | 
|  | ;; in core operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 2) 1)) | 
|  | (set-vliw-aliignment-modified-by-option pc rm) | 
|  | (set-psw.om 1)) ;; to VLIW operation mode | 
|  |  | 
|  | ;; in VLIW32 operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 4) 1)) | 
|  | (set pc (and rm (inv 1))) | 
|  | (set-psw.om 0)) ;; to core operation mode | 
|  |  | 
|  | ;; in VLIW64 operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 8) 1)) | 
|  | (set pc (and rm (inv 1))) | 
|  | (set-psw.om 0)))) ;; to core operation mode | 
|  | ((mep (unit u-use-gpr (in usereg rm)) | 
|  | (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  | (dnci bsrv "branch to vliw subroutine" (OPTIONAL_CP_INSN) | 
|  | "bsrv $pcrel24a2" | 
|  | (+ MAJ_13 (f-4 1) (f-sub4 11) pcrel24a2) | 
|  | (sequence () | 
|  | (cg-profile pc pcrel24a2) | 
|  | (c-call "check_option_cp" pc) | 
|  | (core-vliw-switch | 
|  |  | 
|  | ;; in core operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 4) 1)) | 
|  | (set-vliw-aliignment-modified-by-option pc pcrel24a2) | 
|  | (set-psw.om 1)) ;; to VLIW operation mode | 
|  |  | 
|  | ;; in VLIW32 operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 4) 1)) | 
|  | (set pc (and pcrel24a2 (inv 1))) | 
|  | (set-psw.om 0)) ;; to core operation mode | 
|  |  | 
|  | ;; in VLIW64 operating mode | 
|  | (sequence () | 
|  | (set lp (or (add pc 8) 1)) | 
|  | (set pc (and pcrel24a2 (inv 1))) | 
|  | (set-psw.om 0)))) ;; to core operation mode | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch)))) | 
|  |  | 
|  |  | 
|  | ; An instruction for test instrumentation. | 
|  | ; Using a reserved opcode. | 
|  |  | 
|  | (dnci sim-syscall "simulator system call" () | 
|  | "--syscall--" | 
|  | (+ MAJ_7 (f-4 1) callnum (f-8 0) (f-9 0) (f-10 0) (f-sub4 0)) | 
|  | (c-call "do_syscall" pc callnum) | 
|  | ()) | 
|  |  | 
|  | (define-pmacro (dnri n major minor) | 
|  | (dnci (.sym ri- n) "reserved instruction" () | 
|  | "--reserved--" | 
|  | (+ major rn rm (f-sub4 minor)) | 
|  | (set pc (c-call USI "ri_exception" pc)) | 
|  | ((mep (unit u-exec) | 
|  | (unit u-branch))))) | 
|  |  | 
|  | (dnri 0  MAJ_0   6) | 
|  | (dnri 1  MAJ_1  10) | 
|  | (dnri 2  MAJ_1  11) | 
|  | (dnri 3  MAJ_2   5) | 
|  | (dnri 4  MAJ_2   8) | 
|  | (dnri 5  MAJ_2   9) | 
|  | (dnri 6  MAJ_2  10) | 
|  | (dnri 7  MAJ_2  11) | 
|  | (dnri 8  MAJ_3   4) | 
|  | (dnri 9  MAJ_3   5) | 
|  | (dnri 10 MAJ_3   6) | 
|  | (dnri 11 MAJ_3   7) | 
|  | (dnri 12 MAJ_3  12) | 
|  | (dnri 13 MAJ_3  13) | 
|  | (dnri 14 MAJ_3  14) | 
|  | (dnri 15 MAJ_3  15) | 
|  | (dnri 17 MAJ_7   7) | 
|  | (dnri 20 MAJ_7  14) | 
|  | (dnri 21 MAJ_7  15) | 
|  | (dnri 22 MAJ_12  7) | 
|  | (dnri 23 MAJ_14 13) | 
|  | ;(dnri 24 MAJ_15  3) | 
|  | (dnri 26 MAJ_15  8) | 
|  | ; begin core-specific reserved insns | 
|  | ; end core-specific reserved insns | 
|  |  | 
|  |  | 
|  | ; Macro instructions. | 
|  |  | 
|  | (dnmi nop "nop" | 
|  | () | 
|  | "nop" | 
|  | (emit mov (rn 0) (rm 0))) | 
|  |  | 
|  | ; Emit the 16 bit form of these 32 bit insns when the displacement is zero. | 
|  | ; | 
|  | (dncmi sb16-0 "store byte (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "sb $rnc,$zero($rma)" | 
|  | (emit sb rnc rma)) | 
|  |  | 
|  | (dncmi sh16-0 "store half (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "sh $rns,$zero($rma)" | 
|  | (emit sh rns rma)) | 
|  |  | 
|  | (dncmi sw16-0 "store word (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "sw $rnl,$zero($rma)" | 
|  | (emit sw rnl rma)) | 
|  |  | 
|  | (dncmi lb16-0 "load byte (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "lb $rnc,$zero($rma)" | 
|  | (emit lb rnc rma)) | 
|  |  | 
|  | (dncmi lh16-0 "load half (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "lh $rns,$zero($rma)" | 
|  | (emit lh rns rma)) | 
|  |  | 
|  | (dncmi lw16-0 "load word (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "lw $rnl,$zero($rma)" | 
|  | (emit lw rnl rma)) | 
|  |  | 
|  | (dncmi lbu16-0 "load unsigned byte (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "lbu $rnuc,$zero($rma)" | 
|  | (emit lbu rnuc rma)) | 
|  |  | 
|  | (dncmi lhu16-0 "load unsigned half (explicit 16 bit displacement of zero)" (NO-DIS) | 
|  | "lhu $rnus,$zero($rma)" | 
|  | (emit lhu rnus rma)) | 
|  |  | 
|  | (dncmi swcp16-0 "swcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN NO-DIS) | 
|  | "swcp $crn,$zero($rma)" | 
|  | (emit swcp crn rma)) | 
|  |  | 
|  | (dncmi lwcp16-0 "lwcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN NO-DIS) | 
|  | "lwcp $crn,$zero($rma)" | 
|  | (emit lwcp crn rma)) | 
|  |  | 
|  | (dncmi smcp16-0 "smcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN NO-DIS) | 
|  | "smcp $crn64,$zero($rma)" | 
|  | (emit smcp crn64 rma)) | 
|  |  | 
|  | (dncmi lmcp16-0 "lmcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN NO-DIS) | 
|  | "lmcp $crn64,$zero($rma)" | 
|  | (emit lmcp crn64 rma)) |