| ; 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)) |