116dce513Schristos; Toshiba MeP Media Engine architecture description. -*- Scheme -*- 216dce513Schristos; Copyright 2011 Free Software Foundation, Inc. 316dce513Schristos; 416dce513Schristos; Contributed by Red Hat Inc; 516dce513Schristos; 616dce513Schristos; This file is part of the GNU Binutils. 716dce513Schristos; 816dce513Schristos; This program is free software; you can redistribute it and/or modify 916dce513Schristos; it under the terms of the GNU General Public License as published by 1016dce513Schristos; the Free Software Foundation; either version 3 of the License, or 1116dce513Schristos; (at your option) any later version. 1216dce513Schristos; 1316dce513Schristos; This program is distributed in the hope that it will be useful, 1416dce513Schristos; but WITHOUT ANY WARRANTY; without even the implied warranty of 1516dce513Schristos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1616dce513Schristos; GNU General Public License for more details. 1716dce513Schristos; 1816dce513Schristos; You should have received a copy of the GNU General Public License 1916dce513Schristos; along with this program; if not, write to the Free Software 2016dce513Schristos; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 2116dce513Schristos; MA 02110-1301, USA. 2216dce513Schristos 2316dce513Schristos(include "simplify.inc") 2416dce513Schristos 2516dce513Schristos(define-pmacro isa-enum () 2616dce513Schristos (isas mep 2716dce513Schristos; begin-isa-enum 2816dce513Schristos ext_core1 ext_cop1_16 ext_cop1_32 ext_cop1_48 ext_cop1_64 2916dce513Schristos; end-isa-enum 3016dce513Schristos ) 3116dce513Schristos) 3216dce513Schristos 3316dce513Schristos(define-arch 3416dce513Schristos (name mep) 3516dce513Schristos (comment "Toshiba MeP Media Engine") 3616dce513Schristos (insn-lsb0? #f) ;; work around cgen limitation 3716dce513Schristos (machs mep h1 c5) 3816dce513Schristos isa-enum 3916dce513Schristos) 4016dce513Schristos 4116dce513Schristos(define-isa 4216dce513Schristos (name mep) 4316dce513Schristos (comment "MeP core instruction set") 4416dce513Schristos (default-insn-word-bitsize 32) 4516dce513Schristos (default-insn-bitsize 32) 4616dce513Schristos (base-insn-bitsize 32) 4716dce513Schristos) 4816dce513Schristos 4916dce513Schristos; begin-isas 5016dce513Schristos(define-isa 5116dce513Schristos (name ext_core1) 5216dce513Schristos (comment "MeP core extension instruction set") 5316dce513Schristos (default-insn-word-bitsize 32) 5416dce513Schristos (default-insn-bitsize 32) 5516dce513Schristos (base-insn-bitsize 32) 5616dce513Schristos) 5716dce513Schristos 5816dce513Schristos(define-isa 5916dce513Schristos (name ext_cop1_16) 6016dce513Schristos (comment "MeP coprocessor instruction set") 6116dce513Schristos (default-insn-word-bitsize 32) 6216dce513Schristos (default-insn-bitsize 32) 6316dce513Schristos (base-insn-bitsize 32) 6416dce513Schristos) 6516dce513Schristos 6616dce513Schristos(define-isa 6716dce513Schristos (name ext_cop1_32) 6816dce513Schristos (comment "MeP coprocessor instruction set") 6916dce513Schristos (default-insn-word-bitsize 32) 7016dce513Schristos (default-insn-bitsize 32) 7116dce513Schristos (base-insn-bitsize 32) 7216dce513Schristos) 7316dce513Schristos 7416dce513Schristos(define-isa 7516dce513Schristos (name ext_cop1_48) 7616dce513Schristos (comment "MeP coprocessor instruction set") 7716dce513Schristos (default-insn-word-bitsize 32) 7816dce513Schristos (default-insn-bitsize 32) 7916dce513Schristos (base-insn-bitsize 32) 8016dce513Schristos) 8116dce513Schristos 8216dce513Schristos(define-isa 8316dce513Schristos (name ext_cop1_64) 8416dce513Schristos (comment "MeP coprocessor instruction set") 8516dce513Schristos (default-insn-word-bitsize 32) 8616dce513Schristos (default-insn-bitsize 32) 8716dce513Schristos (base-insn-bitsize 32) 8816dce513Schristos) 8916dce513Schristos 9016dce513Schristos(define-pmacro all-mep-isas () (ISA mep,ext_core1,ext_cop1_16,ext_cop1_32,ext_cop1_48,ext_cop1_64)) 9116dce513Schristos 9216dce513Schristos(define-pmacro all-mep-core-isas () (ISA mep,ext_core1,ext_cop1_32)) 9316dce513Schristos 9416dce513Schristos(define-pmacro all-core-isa-list () mep,ext_core1) 9516dce513Schristos; end-isas 9616dce513Schristos 9716dce513Schristos(define-cpu 9816dce513Schristos (name mepf) 9916dce513Schristos (comment "MeP family") 10016dce513Schristos (endian either) 10116dce513Schristos (insn-chunk-bitsize 16) 10216dce513Schristos (word-bitsize 32) 10316dce513Schristos) 10416dce513Schristos 10516dce513Schristos(define-mach 10616dce513Schristos (name mep) 10716dce513Schristos (comment "MeP media engine") 10816dce513Schristos (cpu mepf) 10916dce513Schristos isa-enum 11016dce513Schristos) 11116dce513Schristos 11216dce513Schristos(define-mach 11316dce513Schristos (name h1) 11416dce513Schristos (comment "H1 media engine") 11516dce513Schristos (cpu mepf) 11616dce513Schristos isa-enum 11716dce513Schristos) 11816dce513Schristos 11916dce513Schristos(define-mach 12016dce513Schristos (name c5) 12116dce513Schristos (comment "C5 media engine") 12216dce513Schristos (cpu mepf) 12316dce513Schristos isa-enum 12416dce513Schristos) 12516dce513Schristos 12616dce513Schristos(define-model 12716dce513Schristos (name mep) 12816dce513Schristos (comment "MeP media engine processor") 12916dce513Schristos (mach c5) ; mach gets changed by MeP-Integrator 13016dce513Schristos 13116dce513Schristos (unit u-exec "execution unit" () 13216dce513Schristos 1 1 ; issue done 13316dce513Schristos () () () ()) 13416dce513Schristos 13516dce513Schristos ; Branch unit 13616dce513Schristos (unit u-branch "Branch Unit" () 13716dce513Schristos 0 0 ; issue done 13816dce513Schristos () ; state 13916dce513Schristos () ; inputs 14016dce513Schristos ((pc)) ; outputs 14116dce513Schristos () ; profile action (default) 14216dce513Schristos ) 14316dce513Schristos 14416dce513Schristos ; Multiply unit 14516dce513Schristos (unit u-multiply "Multiply Unit" () 14616dce513Schristos 0 0 ; issue done 14716dce513Schristos () ; state 14816dce513Schristos () ; inputs 14916dce513Schristos () ; outputs 15016dce513Schristos () ; profile action (default) 15116dce513Schristos ) 15216dce513Schristos 15316dce513Schristos ; Divide unit 15416dce513Schristos (unit u-divide "Divide Unit" () 15516dce513Schristos 0 0 ; issue done 15616dce513Schristos () ; state 15716dce513Schristos () ; inputs 15816dce513Schristos () ; outputs 15916dce513Schristos () ; profile action (default) 16016dce513Schristos ) 16116dce513Schristos 16216dce513Schristos ; Stcb unit 16316dce513Schristos (unit u-stcb "stcb Unit" () 16416dce513Schristos 0 0 ; issue done 16516dce513Schristos () ; state 16616dce513Schristos () ; inputs 16716dce513Schristos () ; outputs 16816dce513Schristos () ; profile action (default) 16916dce513Schristos ) 17016dce513Schristos 17116dce513Schristos ; Ldcb unit 17216dce513Schristos (unit u-ldcb "ldcb Unit" () 17316dce513Schristos 0 0 ; issue done 17416dce513Schristos () ; state 17516dce513Schristos () ; inputs 17616dce513Schristos () ; outputs 17716dce513Schristos () ; profile action (default) 17816dce513Schristos ) 17916dce513Schristos 18016dce513Schristos ; Load gpr unit 18116dce513Schristos (unit u-load-gpr "Load into GPR Unit" () 18216dce513Schristos 0 0 ; issue done 18316dce513Schristos () ; state 18416dce513Schristos () ; inputs 18516dce513Schristos ((loadreg INT -1)) ; outputs 18616dce513Schristos () ; profile action (default) 18716dce513Schristos ) 18816dce513Schristos 18916dce513Schristos (unit u-ldcb-gpr "Ldcb into GPR Unit" () 19016dce513Schristos 0 0 ; issue done 19116dce513Schristos () ; state 19216dce513Schristos () ; inputs 19316dce513Schristos ((loadreg INT -1)) ; outputs 19416dce513Schristos () ; profile action (default) 19516dce513Schristos ) 19616dce513Schristos 19716dce513Schristos ; Multiply into GPR unit 19816dce513Schristos (unit u-mul-gpr "Multiply into GPR Unit" () 19916dce513Schristos 0 0 ; issue done 20016dce513Schristos () ; state 20116dce513Schristos () ; inputs 20216dce513Schristos ((resultreg INT -1)) ; outputs 20316dce513Schristos () ; profile action (default) 20416dce513Schristos ) 20516dce513Schristos 20616dce513Schristos ; Use gpr unit -- stalls if GPR not ready 20716dce513Schristos (unit u-use-gpr "Use GPR Unit" () 20816dce513Schristos 0 0 ; issue done 20916dce513Schristos () ; state 21016dce513Schristos ((usereg INT -1)) ; inputs 21116dce513Schristos () ; outputs 21216dce513Schristos () ; profile action (default) 21316dce513Schristos ) 21416dce513Schristos 21516dce513Schristos ; Use ctrl-reg unit -- stalls if CTRL-REG not ready 21616dce513Schristos (unit u-use-ctrl-reg "Use CTRL-REG Unit" () 21716dce513Schristos 0 0 ; issue done 21816dce513Schristos () ; state 21916dce513Schristos ((usereg INT -1)) ; inputs 22016dce513Schristos () ; outputs 22116dce513Schristos () ; profile action (default) 22216dce513Schristos ) 22316dce513Schristos 22416dce513Schristos ; Store ctrl-reg unit -- stalls if CTRL-REG not ready 22516dce513Schristos (unit u-store-ctrl-reg "Store CTRL-REG Unit" () 22616dce513Schristos 0 0 ; issue done 22716dce513Schristos () ; state 22816dce513Schristos () ; inputs 22916dce513Schristos ((storereg INT -1)) ; outputs 23016dce513Schristos () ; profile action (default) 23116dce513Schristos ) 23216dce513Schristos) 23316dce513Schristos 23416dce513Schristos; Hardware elements. 23516dce513Schristos 23616dce513Schristos(dnh h-pc "program counter" (PC PROFILE all-mep-isas) (pc) () () ()) 23716dce513Schristos 23816dce513Schristos(define-hardware 23916dce513Schristos (name h-gpr) 24016dce513Schristos (comment "General purpose registers") 24116dce513Schristos (attrs all-mep-isas CACHE-ADDR PROFILE) 24216dce513Schristos (type register SI (16)) 24316dce513Schristos (indices keyword "$" 24416dce513Schristos (("0" 0) ("1" 1) ("2" 2) ("3" 3) ("4" 4) ("5" 5) 24516dce513Schristos ("6" 6) ("7" 7) ("8" 8) ("9" 9) ("10" 10) ("11" 11) 24616dce513Schristos ; "$8" is the preferred name for register 8, but "$tp", "$gp" 24716dce513Schristos ; and "$sp" are preferred for their respective registers. 24816dce513Schristos (fp 8) (tp 13) (gp 14) (sp 15) 24916dce513Schristos ("12" 12) ("13" 13) ("14" 14) ("15" 15))) 25016dce513Schristos) 25116dce513Schristos 25216dce513Schristos(define-hardware 25316dce513Schristos (name h-csr) 25416dce513Schristos (comment "Control/special registers") 25516dce513Schristos (attrs all-mep-isas PROFILE) 25616dce513Schristos (type register SI (32)) 25716dce513Schristos (indices keyword "$" 25816dce513Schristos ((pc 0) (lp 1) (sar 2) (rpb 4) (rpe 5) (rpc 6) 25916dce513Schristos (hi 7) (lo 8) (mb0 12) (me0 13) (mb1 14) (me1 15) 26016dce513Schristos (psw 16) (id 17) (tmp 18) (epc 19) (exc 20) (cfg 21) 26116dce513Schristos (npc 23) (dbg 24) (depc 25) (opt 26) (rcfg 27) (ccfg 28) 26216dce513Schristos; begin-extra-csr-registers 26316dce513Schristos (vid 22) 26416dce513Schristos; end-extra-csr-registers 26516dce513Schristos )) 26616dce513Schristos (get (index) (c-call SI "cgen_get_csr_value" index)) 26716dce513Schristos (set (index newval) (c-call VOID "cgen_set_csr_value" index newval)) 26816dce513Schristos) 26916dce513Schristos 27016dce513Schristos(define-pmacro (-reg-pair n) ((.sym n) n)) 27116dce513Schristos(define-hardware 27216dce513Schristos (name h-cr64) 27316dce513Schristos (comment "64-bit coprocessor registers") 27416dce513Schristos (attrs all-mep-isas) 27516dce513Schristos ; This assumes that the data path of the co-pro is 64 bits. 27616dce513Schristos (type register DI (32)) 27716dce513Schristos (indices keyword "$c" (.map -reg-pair (.iota 32))) 27816dce513Schristos (set (index newval) (c-call VOID "h_cr64_queue_set" index newval)) 27916dce513Schristos) 28016dce513Schristos(define-hardware 28116dce513Schristos (name h-cr64-w) 28216dce513Schristos (comment "64-bit coprocessor registers, pending writes") 28316dce513Schristos (attrs all-mep-isas) 28416dce513Schristos ; This assumes that the data path of the co-pro is 64 bits. 28516dce513Schristos (type register DI (32)) 28616dce513Schristos) 28716dce513Schristos 28816dce513Schristos(define-hardware 28916dce513Schristos (name h-cr) 29016dce513Schristos (comment "32-bit coprocessor registers") 29116dce513Schristos (attrs all-mep-isas VIRTUAL) 29216dce513Schristos (type register SI (32)) 29316dce513Schristos (indices keyword "$c" (.map -reg-pair (.iota 32))) 29416dce513Schristos (set (index newval) (c-call VOID "h_cr64_set" index (ext DI newval))) 29516dce513Schristos (get (index) (trunc SI (c-call DI "h_cr64_get" index))) 29616dce513Schristos) 29716dce513Schristos 29816dce513Schristos;; Given a coprocessor control register number N, expand to a 29916dce513Schristos;; name/index pair: ($ccrN N) 30016dce513Schristos(define-pmacro (-ccr-reg-pair n) ((.sym "$ccr" n) n)) 30116dce513Schristos 30216dce513Schristos(define-hardware 30316dce513Schristos (name h-ccr) 30416dce513Schristos (comment "Coprocessor control registers") 30516dce513Schristos (attrs all-mep-isas) 30616dce513Schristos (type register SI (64)) 30716dce513Schristos (indices keyword "" (.map -ccr-reg-pair (.iota 64))) 30816dce513Schristos (set (index newval) (c-call VOID "h_ccr_queue_set" index newval)) 30916dce513Schristos) 31016dce513Schristos(define-hardware 31116dce513Schristos (name h-ccr-w) 31216dce513Schristos (comment "Coprocessor control registers, pending writes") 31316dce513Schristos (attrs all-mep-isas) 31416dce513Schristos (type register SI (64)) 31516dce513Schristos) 31616dce513Schristos 31716dce513Schristos 31816dce513Schristos; Instruction fields. Bit numbering reversed. 31916dce513Schristos 32016dce513Schristos; Conventions: 32116dce513Schristos; 32216dce513Schristos; N = number of bits in value 32316dce513Schristos; A = alignment (2 or 4, omit for 1) 32416dce513Schristos; B = leftmost (i.e. closest to zero) bit position 32516dce513Schristos; 32616dce513Schristos; -- Generic Fields (f-*) -- 32716dce513Schristos; N number of bits in *value* (1-24) 32816dce513Schristos; [us] signed vs unsigned 32916dce513Schristos; B position of left-most bit (4-16) 33016dce513Schristos; aA opt. alignment (2=drop 1 lsb, 4=drop 2 lsbs, etc) 33116dce513Schristos; n opt. for noncontiguous fields 33216dce513Schristos; f-foo-{hi,lo} msb/lsb parts of field f-foo 33316dce513Schristos; 33416dce513Schristos; -- Operands -- 33516dce513Schristos; pcrelNaA PC-relative branch target (signed) 33616dce513Schristos; pcabsNaA Absolute branch target (unsigned) 33716dce513Schristos; 33816dce513Schristos; [us]dispNaA [un]signed displacement 33916dce513Schristos; [us]immN [un]signed immediate value 34016dce513Schristos; addrNaA absolute address (unsigned) 34116dce513Schristos; 34216dce513Schristos; Additional prefixes may be used for special cases. 34316dce513Schristos 34416dce513Schristos(dnf f-major "major opcode" (all-mep-core-isas) 0 4) 34516dce513Schristos 34616dce513Schristos(dnf f-rn "register n" (all-mep-core-isas) 4 4) 34716dce513Schristos(dnf f-rn3 "register 0-7" (all-mep-core-isas) 5 3) 34816dce513Schristos(dnf f-rm "register m" (all-mep-core-isas) 8 4) 34916dce513Schristos(dnf f-rl "register l" (all-mep-core-isas) 12 4) 35016dce513Schristos(dnf f-sub2 "sub opcode (2 bits)" (all-mep-core-isas) 14 2) 35116dce513Schristos(dnf f-sub3 "sub opcode (3 bits)" (all-mep-core-isas) 13 3) 35216dce513Schristos(dnf f-sub4 "sub opcode (4 bits)" (all-mep-core-isas) 12 4) 35316dce513Schristos(dnf f-ext "extended field" (all-mep-core-isas) 16 8) 35416dce513Schristos(dnf f-ext4 "extended field 16:4" (all-mep-core-isas) 16 4) 35516dce513Schristos(dnf f-ext62 "extended field 20:2" (all-mep-core-isas) 20 2) 35616dce513Schristos(dnf f-crn "copro register n" (all-mep-core-isas) 4 4) 35716dce513Schristos 35816dce513Schristos(df f-csrn-hi "cr hi 1u15" (all-mep-core-isas) 15 1 UINT #f #f) 35916dce513Schristos(df f-csrn-lo "cr lo 4u8" (all-mep-core-isas) 8 4 UINT #f #f) 36016dce513Schristos(define-multi-ifield 36116dce513Schristos (name f-csrn) 36216dce513Schristos (comment "control reg") 36316dce513Schristos (attrs all-mep-core-isas) 36416dce513Schristos (mode UINT) 36516dce513Schristos (subfields f-csrn-hi f-csrn-lo) 36616dce513Schristos (insert (sequence () 36716dce513Schristos (set (ifield f-csrn-lo) (and (ifield f-csrn) #xf)) 36816dce513Schristos (set (ifield f-csrn-hi) (srl (ifield f-csrn) 4)))) 36916dce513Schristos (extract (set (ifield f-csrn) 37016dce513Schristos (or (sll (ifield f-csrn-hi) 4) (ifield f-csrn-lo)))) 37116dce513Schristos ) 37216dce513Schristos 37316dce513Schristos(df f-crnx-hi "crx hi 1u28" (all-mep-core-isas) 28 1 UINT #f #f) 37416dce513Schristos(df f-crnx-lo "crx lo 4u4" (all-mep-core-isas) 4 4 UINT #f #f) 37516dce513Schristos(define-multi-ifield 37616dce513Schristos (name f-crnx) 37716dce513Schristos (comment "copro register n (0-31)") 37816dce513Schristos (attrs all-mep-core-isas) 37916dce513Schristos (mode UINT) 38016dce513Schristos (subfields f-crnx-hi f-crnx-lo) 38116dce513Schristos (insert (sequence () 38216dce513Schristos (set (ifield f-crnx-lo) (and (ifield f-crnx) #xf)) 38316dce513Schristos (set (ifield f-crnx-hi) (srl (ifield f-crnx) 4)))) 38416dce513Schristos (extract (set (ifield f-crnx) 38516dce513Schristos (or (sll (ifield f-crnx-hi) 4) (ifield f-crnx-lo)))) 38616dce513Schristos ) 38716dce513Schristos 38816dce513Schristos; Miscellaneous fields. 38916dce513Schristos 39016dce513Schristos(define-pmacro (dnfb n) 39116dce513Schristos (dnf (.sym f- n) (.str "bit " n) (all-mep-isas) n 1)) 39216dce513Schristos 39316dce513Schristos; Define small fields used throughout the instruction set description. 39416dce513Schristos; Each field (eg. `f-N') is at single bit field at position N. 39516dce513Schristos 39616dce513Schristos(dnfb 0) 39716dce513Schristos(dnfb 1) 39816dce513Schristos(dnfb 2) 39916dce513Schristos(dnfb 3) 40016dce513Schristos(dnfb 4) 40116dce513Schristos(dnfb 5) 40216dce513Schristos(dnfb 6) 40316dce513Schristos(dnfb 7) 40416dce513Schristos(dnfb 8) 40516dce513Schristos(dnfb 9) 40616dce513Schristos(dnfb 10) 40716dce513Schristos(dnfb 11) 40816dce513Schristos(dnfb 12) 40916dce513Schristos(dnfb 13) 41016dce513Schristos(dnfb 14) 41116dce513Schristos(dnfb 15) 41216dce513Schristos(dnfb 16) 41316dce513Schristos(dnfb 17) 41416dce513Schristos(dnfb 18) 41516dce513Schristos(dnfb 19) 41616dce513Schristos(dnfb 20) 41716dce513Schristos(dnfb 21) 41816dce513Schristos(dnfb 22) 41916dce513Schristos(dnfb 23) 42016dce513Schristos(dnfb 24) 42116dce513Schristos(dnfb 25) 42216dce513Schristos(dnfb 26) 42316dce513Schristos(dnfb 27) 42416dce513Schristos(dnfb 28) 42516dce513Schristos(dnfb 29) 42616dce513Schristos(dnfb 30) 42716dce513Schristos(dnfb 31) 42816dce513Schristos 42916dce513Schristos; Branch/Jump target addresses 43016dce513Schristos 43116dce513Schristos(df f-8s8a2 "pc-rel addr (8 bits)" (all-mep-core-isas PCREL-ADDR) 8 7 INT 43216dce513Schristos ((value pc) (sra SI (sub SI value pc) 1)) 433*e992f068Schristos ((value pc) (add SI (mul SI value 2) pc))) 43416dce513Schristos 43516dce513Schristos(df f-12s4a2 "pc-rel addr (12 bits)" (all-mep-core-isas PCREL-ADDR) 4 11 INT 43616dce513Schristos ((value pc) (sra SI (sub SI value pc) 1)) 437*e992f068Schristos ((value pc) (add SI (mul SI value 2) pc))) 43816dce513Schristos 43916dce513Schristos(df f-17s16a2 "pc-rel addr (17 bits)" (all-mep-core-isas PCREL-ADDR) 16 16 INT 44016dce513Schristos ((value pc) (sra SI (sub SI value pc) 1)) 441*e992f068Schristos ((value pc) (add SI (mul SI value 2) pc))) 44216dce513Schristos 44316dce513Schristos(df f-24s5a2n-hi "24s5a2n hi 16s16" (all-mep-core-isas PCREL-ADDR) 16 16 INT #f #f) 44416dce513Schristos(df f-24s5a2n-lo "24s5a2n lo 7s5a2" (all-mep-core-isas PCREL-ADDR) 5 7 UINT #f #f) 44516dce513Schristos(define-multi-ifield 44616dce513Schristos (name f-24s5a2n) 44716dce513Schristos (comment "pc-rel addr (24 bits align 2)") 44816dce513Schristos (attrs all-mep-core-isas PCREL-ADDR) 44916dce513Schristos (mode INT) 45016dce513Schristos (subfields f-24s5a2n-hi f-24s5a2n-lo) 45116dce513Schristos (insert (sequence () 45216dce513Schristos (set (ifield f-24s5a2n) 45316dce513Schristos (sub (ifield f-24s5a2n) pc)) 45416dce513Schristos (set (ifield f-24s5a2n-lo) 45516dce513Schristos (srl (and (ifield f-24s5a2n) #xfe) 1)) 45616dce513Schristos (set (ifield f-24s5a2n-hi) 45716dce513Schristos (sra INT (ifield f-24s5a2n) 8)))) 45816dce513Schristos (extract (set (ifield f-24s5a2n) 459*e992f068Schristos (add SI (or (mul (ifield f-24s5a2n-hi) 256) 46016dce513Schristos (sll (ifield f-24s5a2n-lo) 1)) 46116dce513Schristos pc))) 46216dce513Schristos ) 46316dce513Schristos 46416dce513Schristos(df f-24u5a2n-hi "24u5a2n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) 46516dce513Schristos(df f-24u5a2n-lo "24u5a2n lo 7u5a2" (all-mep-core-isas) 5 7 UINT #f #f) 46616dce513Schristos(define-multi-ifield 46716dce513Schristos (name f-24u5a2n) 46816dce513Schristos (comment "abs jump target (24 bits, alignment 2)") 46916dce513Schristos (attrs all-mep-core-isas ABS-ADDR) 47016dce513Schristos (mode UINT) 47116dce513Schristos (subfields f-24u5a2n-hi f-24u5a2n-lo) 47216dce513Schristos (insert (sequence () 47316dce513Schristos (set (ifield f-24u5a2n-lo) 47416dce513Schristos (srl (and (ifield f-24u5a2n) #xff) 1)) 47516dce513Schristos (set (ifield f-24u5a2n-hi) 47616dce513Schristos (srl (ifield f-24u5a2n) 8)) 47716dce513Schristos )) 47816dce513Schristos (extract (set (ifield f-24u5a2n) 47916dce513Schristos (or (sll (ifield f-24u5a2n-hi) 8) 48016dce513Schristos (sll (ifield f-24u5a2n-lo) 1)))) 48116dce513Schristos ) 48216dce513Schristos 48316dce513Schristos; Displacement fields. 48416dce513Schristos 48516dce513Schristos(df f-2u6 "SAR offset (2 bits)" (all-mep-core-isas) 6 2 UINT #f #f) 48616dce513Schristos(df f-7u9 "tp-rel b (7 bits)" (all-mep-core-isas) 9 7 UINT #f #f) 48716dce513Schristos(df f-7u9a2 "tp-rel h (7 bits)" (all-mep-core-isas) 9 6 UINT 48816dce513Schristos ((value pc) (srl SI value 1)) 489*e992f068Schristos ((value pc) (mul SI value 2))) 49016dce513Schristos(df f-7u9a4 "tp/sp-rel w (7 bits)" (all-mep-core-isas) 9 5 UINT 49116dce513Schristos ((value pc) (srl SI value 2)) 49216dce513Schristos ((value pc) (sll SI value 2))) 49316dce513Schristos(df f-16s16 "general 16-bit s-val" (all-mep-core-isas) 16 16 INT #f #f) 49416dce513Schristos 49516dce513Schristos; Immediate fields. 49616dce513Schristos 49716dce513Schristos(df f-2u10 "swi level (2 bits)" (all-mep-core-isas) 10 2 UINT #f #f) 49816dce513Schristos(df f-3u5 "bit offset (3 bits)" (all-mep-core-isas) 5 3 UINT #f #f) 49916dce513Schristos(df f-4u8 "bCC const (4 bits)" (all-mep-core-isas) 8 4 UINT #f #f) 50016dce513Schristos(df f-5u8 "slt & shifts (5 bits)" (all-mep-core-isas) 8 5 UINT #f #f) 50116dce513Schristos(df f-5u24 "clip immediate (5 bits)" (all-mep-core-isas) 24 5 UINT #f #f) 50216dce513Schristos(df f-6s8 "add immediate (6 bits)" (all-mep-core-isas) 8 6 INT #f #f) 50316dce513Schristos(df f-8s8 "add imm (8 bits)" (all-mep-core-isas) 8 8 INT #f #f) 50416dce513Schristos(df f-16u16 "general 16-bit u-val" (all-mep-core-isas) 16 16 UINT #f #f) 50516dce513Schristos(df f-12u16 "cmov fixed 1" (all-mep-core-isas) 16 12 UINT #f #f) 50616dce513Schristos(df f-3u29 "cmov fixed 2" (all-mep-core-isas) 29 3 UINT #f #f) 50716dce513Schristos 50816dce513Schristos 50916dce513Schristos; These are all for the coprocessor opcodes 51016dce513Schristos 51116dce513Schristos; The field is like IJKiiiiiii where I and J are toggled if K is set, 51216dce513Schristos; for compatibility with older cores. 51316dce513Schristos(define-pmacro (compute-cdisp10 val) 51416dce513Schristos (cond SI 51516dce513Schristos ((and SI (cond SI ((and SI val #x80) (xor SI val #x300)) (else val)) #x200) 51616dce513Schristos (sub (cond SI ((and SI val #x80) (xor SI val #x300)) (else val)) #x400)) 51716dce513Schristos (else 51816dce513Schristos (cond SI ((and SI val #x80) (xor SI val #x300)) (else val))) 51916dce513Schristos ) 52016dce513Schristos ) 52116dce513Schristos(define-pmacro (extend-cdisp10 val) 52216dce513Schristos (cond SI 52316dce513Schristos ((and SI (compute-cdisp10 val) #x200) 52416dce513Schristos (sub (and SI (compute-cdisp10 val) #x3ff) #x400)) 52516dce513Schristos (else 52616dce513Schristos (and SI (compute-cdisp10 val) #x3ff)) 52716dce513Schristos ) 52816dce513Schristos ) 52916dce513Schristos 53016dce513Schristos(df f-cdisp10 "cop imm10" (all-mep-core-isas) 22 10 INT 53116dce513Schristos ((value pc) (extend-cdisp10 value)) 53216dce513Schristos ((value pc) (extend-cdisp10 value)) 53316dce513Schristos ) 53416dce513Schristos 53516dce513Schristos; Non-contiguous fields. 53616dce513Schristos 53716dce513Schristos(df f-24u8a4n-hi "24u8a4n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) 53816dce513Schristos(df f-24u8a4n-lo "24u8a4n lo 8u8a4" (all-mep-core-isas) 8 6 UINT #f #f) 53916dce513Schristos(define-multi-ifield 54016dce513Schristos (name f-24u8a4n) 54116dce513Schristos (comment "absolute 24-bit address") 54216dce513Schristos (attrs all-mep-core-isas) 54316dce513Schristos (mode UINT) 54416dce513Schristos (subfields f-24u8a4n-hi f-24u8a4n-lo) 54516dce513Schristos (insert (sequence () 54616dce513Schristos (set (ifield f-24u8a4n-hi) (srl (ifield f-24u8a4n) 8)) 54716dce513Schristos (set (ifield f-24u8a4n-lo) (srl (and (ifield f-24u8a4n) #xfc) 2)))) 54816dce513Schristos (extract (set (ifield f-24u8a4n) 54916dce513Schristos (or (sll (ifield f-24u8a4n-hi) 8) 55016dce513Schristos (sll (ifield f-24u8a4n-lo) 2)))) 55116dce513Schristos ) 55216dce513Schristos 55316dce513Schristos(df f-24u8n-hi "24u8n hi 16u16" (all-mep-core-isas) 16 16 UINT #f #f) 55416dce513Schristos(df f-24u8n-lo "24u8n lo 8u8" (all-mep-core-isas) 8 8 UINT #f #f) 55516dce513Schristos(define-multi-ifield 55616dce513Schristos (name f-24u8n) 55716dce513Schristos (comment "24-bit constant") 55816dce513Schristos (attrs all-mep-core-isas) 55916dce513Schristos (mode UINT) 56016dce513Schristos (subfields f-24u8n-hi f-24u8n-lo) 56116dce513Schristos (insert (sequence () 56216dce513Schristos (set (ifield f-24u8n-hi) (srl (ifield f-24u8n) 8)) 56316dce513Schristos (set (ifield f-24u8n-lo) (and (ifield f-24u8n) #xff)))) 56416dce513Schristos (extract (set (ifield f-24u8n) 56516dce513Schristos (or (sll (ifield f-24u8n-hi) 8) 56616dce513Schristos (ifield f-24u8n-lo)))) 56716dce513Schristos ) 56816dce513Schristos 56916dce513Schristos(df f-24u4n-hi "24u4n hi 8u4" (all-mep-core-isas) 4 8 UINT #f #f) 57016dce513Schristos(df f-24u4n-lo "24u4n lo 16u16" (all-mep-core-isas) 16 16 UINT #f #f) 57116dce513Schristos(define-multi-ifield 57216dce513Schristos (name f-24u4n) 57316dce513Schristos (comment "coprocessor code") 57416dce513Schristos (attrs all-mep-core-isas) 57516dce513Schristos (mode UINT) 57616dce513Schristos (subfields f-24u4n-hi f-24u4n-lo) 57716dce513Schristos (insert (sequence () 57816dce513Schristos (set (ifield f-24u4n-hi) (srl (ifield f-24u4n) 16)) 57916dce513Schristos (set (ifield f-24u4n-lo) (and (ifield f-24u4n) #xffff)))) 58016dce513Schristos (extract (set (ifield f-24u4n) 58116dce513Schristos (or (sll (ifield f-24u4n-hi) 16) 58216dce513Schristos (ifield f-24u4n-lo)))) 58316dce513Schristos ) 58416dce513Schristos 58516dce513Schristos(define-multi-ifield 58616dce513Schristos (name f-callnum) 58716dce513Schristos (comment "system call number field") 58816dce513Schristos (attrs all-mep-core-isas) 58916dce513Schristos (mode UINT) 59016dce513Schristos (subfields f-5 f-6 f-7 f-11) 59116dce513Schristos (insert (sequence () 59216dce513Schristos (set (ifield f-5) (and (srl (ifield f-callnum) 3) 1)) 59316dce513Schristos (set (ifield f-6) (and (srl (ifield f-callnum) 2) 1)) 59416dce513Schristos (set (ifield f-7) (and (srl (ifield f-callnum) 1) 1)) 59516dce513Schristos (set (ifield f-11) (and (ifield f-callnum) 1)))) 59616dce513Schristos (extract (set (ifield f-callnum) 59716dce513Schristos (or (sll (ifield f-5) 3) 59816dce513Schristos (or (sll (ifield f-6) 2) 59916dce513Schristos (or (sll (ifield f-7) 1) 60016dce513Schristos (ifield f-11)))))) 60116dce513Schristos ) 60216dce513Schristos 60316dce513Schristos(df f-ccrn-hi "ccrn hi 2u28" (all-mep-core-isas) 28 2 UINT #f #f) 60416dce513Schristos(df f-ccrn-lo "ccrn lo 4u4" (all-mep-core-isas) 4 4 UINT #f #f) 60516dce513Schristos(define-multi-ifield 60616dce513Schristos (name f-ccrn) 60716dce513Schristos (comment "Coprocessor register number field") 60816dce513Schristos (attrs all-mep-core-isas) 60916dce513Schristos (mode UINT) 61016dce513Schristos (subfields f-ccrn-hi f-ccrn-lo) 61116dce513Schristos (insert (sequence () 61216dce513Schristos (set (ifield f-ccrn-hi) (and (srl (ifield f-ccrn) 4) #x3)) 61316dce513Schristos (set (ifield f-ccrn-lo) (and (ifield f-ccrn) #xf)))) 61416dce513Schristos (extract (set (ifield f-ccrn) 61516dce513Schristos (or (sll (ifield f-ccrn-hi) 4) 61616dce513Schristos (ifield f-ccrn-lo)))) 61716dce513Schristos ) 61816dce513Schristos 61916dce513Schristos; Operands. 62016dce513Schristos 62116dce513Schristos;; Only LABEL, REGNUM, FMAX_FLOAT and FMAX_INT are now relevant for correct 62216dce513Schristos;; operation. The others are mostly kept for backwards compatibility, 62316dce513Schristos;; although they do affect the dummy prototypes in 62416dce513Schristos;; gcc/config/mep/intrinsics.h. 62516dce513Schristos(define-attr 62616dce513Schristos (type enum) 62716dce513Schristos (for operand) 62816dce513Schristos (name CDATA) 62916dce513Schristos (comment "datatype to use for C intrinsics mapping") 63016dce513Schristos (values LABEL REGNUM FMAX_FLOAT FMAX_INT 63116dce513Schristos POINTER LONG ULONG SHORT USHORT CHAR UCHAR CP_DATA_BUS_INT) 63216dce513Schristos (default LONG)) 63316dce513Schristos 63416dce513Schristos(define-attr 63516dce513Schristos (type enum) 63616dce513Schristos (for insn) 63716dce513Schristos (name CPTYPE) 63816dce513Schristos (comment "datatype to use for coprocessor values") 63916dce513Schristos (values CP_DATA_BUS_INT VECT V2SI V4HI V8QI V2USI V4UHI V8UQI) 64016dce513Schristos (default CP_DATA_BUS_INT)) 64116dce513Schristos 64216dce513Schristos(define-attr 64316dce513Schristos (type enum) 64416dce513Schristos (for insn) 64516dce513Schristos (name CRET) 64616dce513Schristos ;; VOID - all arguments are passed as parameters; if any are written, pointers to them are passed. 64716dce513Schristos ;; FIRST - the first argument is the return value. 64816dce513Schristos ;; FIRSTCOPY - the first argument is the return value, but a copy is also the first parameter. 64916dce513Schristos (values VOID FIRST FIRSTCOPY) 65016dce513Schristos (default VOID) 65116dce513Schristos (comment "Insn's intrinsic returns void, or the first argument rather than (or in addition to) passing it.")) 65216dce513Schristos 65316dce513Schristos(define-attr 65416dce513Schristos (type integer) 65516dce513Schristos (for operand) 65616dce513Schristos (name ALIGN) 65716dce513Schristos (comment "alignment of immediate operands") 65816dce513Schristos (default 1)) 65916dce513Schristos 66016dce513Schristos(define-attr 66116dce513Schristos (for operand) 66216dce513Schristos (type boolean) 66316dce513Schristos (name RELOC_IMPLIES_OVERFLOW) 66416dce513Schristos (comment "Operand should not be considered as a candidate for relocs")) 66516dce513Schristos 66616dce513Schristos(define-attr 66716dce513Schristos (for hardware) 66816dce513Schristos (type boolean) 66916dce513Schristos (name IS_FLOAT) 67016dce513Schristos (comment "Register contains a floating point value")) 67116dce513Schristos 67216dce513Schristos(define-pmacro (dpop name commment attrib hwr field func) 67316dce513Schristos (define-full-operand name comment attrib 67416dce513Schristos hwr DFLT field ((parse func)) () ())) 67516dce513Schristos(define-pmacro (dprp name commment attrib hwr field pafunc prfunc) 67616dce513Schristos (define-full-operand name comment attrib 67716dce513Schristos hwr DFLT field ((parse pafunc) (print prfunc)) () ())) 67816dce513Schristos 67916dce513Schristos(dnop r0 "register 0" (all-mep-core-isas) h-gpr 0) 68016dce513Schristos(dnop rn "register Rn" (all-mep-core-isas) h-gpr f-rn) 68116dce513Schristos(dnop rm "register Rm" (all-mep-core-isas) h-gpr f-rm) 68216dce513Schristos(dnop rl "register Rl" (all-mep-core-isas) h-gpr f-rl) 68316dce513Schristos(dnop rn3 "register 0-7" (all-mep-core-isas) h-gpr f-rn3) 68416dce513Schristos 68516dce513Schristos;; Variants of RM/RN with different CDATA attributes. See comment above 68616dce513Schristos;; CDATA for more details. 68716dce513Schristos 68816dce513Schristos(dnop rma "register Rm holding pointer" (all-mep-core-isas (CDATA POINTER)) h-gpr f-rm) 68916dce513Schristos 69016dce513Schristos(dnop rnc "register Rn holding char" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn) 69116dce513Schristos(dnop rnuc "register Rn holding unsigned char" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn) 69216dce513Schristos(dnop rns "register Rn holding short" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn) 69316dce513Schristos(dnop rnus "register Rn holding unsigned short" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn) 69416dce513Schristos(dnop rnl "register Rn holding long" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn) 69516dce513Schristos(dnop rnul "register Rn holding unsigned long" (all-mep-core-isas (CDATA ULONG)) h-gpr f-rn) 69616dce513Schristos 69716dce513Schristos(dnop rn3c "register 0-7 holding unsigned char" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn3) 69816dce513Schristos(dnop rn3uc "register 0-7 holding byte" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn3) 69916dce513Schristos(dnop rn3s "register 0-7 holding unsigned short" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn3) 70016dce513Schristos(dnop rn3us "register 0-7 holding short" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn3) 70116dce513Schristos(dnop rn3l "register 0-7 holding unsigned long" (all-mep-core-isas (CDATA LONG)) h-gpr f-rn3) 70216dce513Schristos(dnop rn3ul "register 0-7 holding long" (all-mep-core-isas (CDATA ULONG)) h-gpr f-rn3) 70316dce513Schristos 70416dce513Schristos 70516dce513Schristos(dnop lp "link pointer" (all-mep-core-isas) h-csr 1) 70616dce513Schristos(dnop sar "shift amount register" (all-mep-core-isas) h-csr 2) 70716dce513Schristos(dnop hi "high result" (all-mep-core-isas) h-csr 7) 70816dce513Schristos(dnop lo "low result" (all-mep-core-isas) h-csr 8) 70916dce513Schristos(dnop mb0 "modulo begin register 0" (all-mep-core-isas) h-csr 12) 71016dce513Schristos(dnop me0 "modulo end register 0" (all-mep-core-isas) h-csr 13) 71116dce513Schristos(dnop mb1 "modulo begin register 1" (all-mep-core-isas) h-csr 14) 71216dce513Schristos(dnop me1 "modulo end register 1" (all-mep-core-isas) h-csr 15) 71316dce513Schristos(dnop psw "program status word" (all-mep-core-isas) h-csr 16) 71416dce513Schristos(dnop epc "exception prog counter" (all-mep-core-isas) h-csr 19) 71516dce513Schristos(dnop exc "exception cause" (all-mep-core-isas) h-csr 20) 71616dce513Schristos(dnop npc "nmi program counter" (all-mep-core-isas) h-csr 23) 71716dce513Schristos(dnop dbg "debug register" (all-mep-core-isas) h-csr 24) 71816dce513Schristos(dnop depc "debug exception pc" (all-mep-core-isas) h-csr 25) 71916dce513Schristos(dnop opt "option register" (all-mep-core-isas) h-csr 26) 72016dce513Schristos(dnop r1 "register 1" (all-mep-core-isas) h-gpr 1) 72116dce513Schristos(dnop tp "tiny data area pointer" (all-mep-core-isas) h-gpr 13) 72216dce513Schristos(dnop sp "stack pointer" (all-mep-core-isas) h-gpr 15) 72316dce513Schristos(dprp tpr "TP register" (all-mep-core-isas) h-gpr 13 "tpreg" "tpreg") 72416dce513Schristos(dprp spr "SP register" (all-mep-core-isas) h-gpr 15 "spreg" "spreg") 72516dce513Schristos 72616dce513Schristos(define-full-operand 72716dce513Schristos csrn "control/special register" (all-mep-core-isas (CDATA REGNUM)) h-csr 72816dce513Schristos DFLT f-csrn ((parse "csrn")) () () 72916dce513Schristos) 73016dce513Schristos 73116dce513Schristos(dnop csrn-idx "control/special reg idx" (all-mep-core-isas) h-uint f-csrn) 73216dce513Schristos(dnop crn64 "copro Rn (64-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr64 f-crn) 73316dce513Schristos(dnop crn "copro Rn (32-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr f-crn) 73416dce513Schristos(dnop crnx64 "copro Rn (0-31, 64-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr64 f-crnx) 73516dce513Schristos(dnop crnx "copro Rn (0-31, 32-bit)" (all-mep-core-isas (CDATA CP_DATA_BUS_INT)) h-cr f-crnx) 73616dce513Schristos(dnop ccrn "copro control reg CCRn" (all-mep-core-isas (CDATA REGNUM)) h-ccr f-ccrn) 73716dce513Schristos(dnop cccc "copro flags" (all-mep-core-isas) h-uint f-rm) 73816dce513Schristos 73916dce513Schristos(dprp pcrel8a2 "pc-rel addr (8 bits)" (all-mep-core-isas (CDATA LABEL) RELAX) h-sint f-8s8a2 "mep_align" "address") 74016dce513Schristos(dprp pcrel12a2 "pc-rel addr (12 bits)" (all-mep-core-isas (CDATA LABEL) RELAX) h-sint f-12s4a2 "mep_align" "address") 74116dce513Schristos(dprp pcrel17a2 "pc-rel addr (17 bits)" (all-mep-core-isas (CDATA LABEL) RELAX) h-sint f-17s16a2 "mep_align" "address") 74216dce513Schristos(dprp pcrel24a2 "pc-rel addr (24 bits)" (all-mep-core-isas (CDATA LABEL)) h-sint f-24s5a2n "mep_align" "address") 74316dce513Schristos(dprp pcabs24a2 "pc-abs addr (24 bits)" (all-mep-core-isas (CDATA LABEL)) h-uint f-24u5a2n "mep_alignu" "address") 74416dce513Schristos 74516dce513Schristos(dpop sdisp16 "displacement (16 bits)" (all-mep-core-isas) h-sint f-16s16 "signed16") 74616dce513Schristos(dpop simm16 "signed imm (16 bits)" (all-mep-core-isas) h-sint f-16s16 "signed16") 74716dce513Schristos(dpop uimm16 "unsigned imm (16 bits)" (all-mep-core-isas) h-uint f-16u16 "unsigned16") 74816dce513Schristos(dnop code16 "uci/dsp code (16 bits)" (all-mep-core-isas) h-uint f-16u16) 74916dce513Schristos 75016dce513Schristos(dnop udisp2 "SSARB addend (2 bits)" (all-mep-core-isas) h-sint f-2u6) 75116dce513Schristos(dnop uimm2 "interrupt (2 bits)" (all-mep-core-isas) h-uint f-2u10) 75216dce513Schristos 75316dce513Schristos(dnop simm6 "add const (6 bits)" (all-mep-core-isas) h-sint f-6s8) 75416dce513Schristos(dnop simm8 "mov const (8 bits)" (all-mep-core-isas RELOC_IMPLIES_OVERFLOW) 75516dce513Schristos h-sint f-8s8) 75616dce513Schristos 75716dce513Schristos(dpop addr24a4 "sw/lw addr (24 bits)" (all-mep-core-isas (ALIGN 4)) h-uint f-24u8a4n "mep_alignu") 75816dce513Schristos(dnop code24 "coprocessor code" (all-mep-core-isas) h-uint f-24u4n) 75916dce513Schristos 76016dce513Schristos(dnop callnum "system call number" (all-mep-core-isas) h-uint f-callnum) 76116dce513Schristos(dnop uimm3 "bit immediate (3 bits)" (all-mep-core-isas) h-uint f-3u5) 76216dce513Schristos(dnop uimm4 "bCC const (4 bits)" (all-mep-core-isas) h-uint f-4u8) 76316dce513Schristos(dnop uimm5 "bit/shift val (5 bits)" (all-mep-core-isas) h-uint f-5u8) 76416dce513Schristos 76516dce513Schristos(dpop udisp7 "tp-rel b (7 bits)" (all-mep-core-isas) h-uint f-7u9 "unsigned7") 76616dce513Schristos(dpop udisp7a2 "tp-rel h (7 bits)" (all-mep-core-isas (ALIGN 2)) h-uint f-7u9a2 "unsigned7") 76716dce513Schristos(dpop udisp7a4 "tp/sp-rel w (7 bits)" (all-mep-core-isas (ALIGN 4)) h-uint f-7u9a4 "unsigned7") 76816dce513Schristos(dpop uimm7a4 "sp w-addend (7 bits)" (all-mep-core-isas (ALIGN 4)) h-uint f-7u9a4 "mep_alignu") 76916dce513Schristos 77016dce513Schristos(dnop uimm24 "immediate (24 bits)" (all-mep-core-isas) h-uint f-24u8n) 77116dce513Schristos 77216dce513Schristos(dnop cimm4 "cache immed'te (4 bits)" (all-mep-core-isas) h-uint f-rn) 77316dce513Schristos(dnop cimm5 "clip immediate (5 bits)" (all-mep-core-isas) h-uint f-5u24) 77416dce513Schristos 77516dce513Schristos(dpop cdisp10 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint f-cdisp10 "cdisp10") 77616dce513Schristos(dpop cdisp10a2 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint f-cdisp10 "cdisp10") 77716dce513Schristos(dpop cdisp10a4 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint f-cdisp10 "cdisp10") 77816dce513Schristos(dpop cdisp10a8 "copro addend (8/10 bits)" (all-mep-core-isas) h-sint f-cdisp10 "cdisp10") 77916dce513Schristos 78016dce513Schristos; Special operand representing the various ways that the literal zero can be 78116dce513Schristos; specified. 78216dce513Schristos(define-full-operand 78316dce513Schristos zero "Zero operand" (all-mep-core-isas) h-sint DFLT f-nil 78416dce513Schristos ((parse "zero")) () () 78516dce513Schristos) 78616dce513Schristos 78716dce513Schristos; Attributes. 78816dce513Schristos 78916dce513Schristos(define-attr 79016dce513Schristos (for insn) 79116dce513Schristos (type boolean) 79216dce513Schristos (name OPTIONAL_BIT_INSN) 79316dce513Schristos (comment "optional bit manipulation instruction")) 79416dce513Schristos 79516dce513Schristos(define-attr 79616dce513Schristos (for insn) 79716dce513Schristos (type boolean) 79816dce513Schristos (name OPTIONAL_MUL_INSN) 79916dce513Schristos (comment "optional 32-bit multiply instruction")) 80016dce513Schristos 80116dce513Schristos(define-attr 80216dce513Schristos (for insn) 80316dce513Schristos (type boolean) 80416dce513Schristos (name OPTIONAL_DIV_INSN) 80516dce513Schristos (comment "optional 32-bit divide instruction")) 80616dce513Schristos 80716dce513Schristos(define-attr 80816dce513Schristos (for insn) 80916dce513Schristos (type boolean) 81016dce513Schristos (name OPTIONAL_DEBUG_INSN) 81116dce513Schristos (comment "optional debug instruction")) 81216dce513Schristos 81316dce513Schristos(define-attr 81416dce513Schristos (for insn) 81516dce513Schristos (type boolean) 81616dce513Schristos (name OPTIONAL_LDZ_INSN) 81716dce513Schristos (comment "optional leading zeroes instruction")) 81816dce513Schristos 81916dce513Schristos(define-attr 82016dce513Schristos (for insn) 82116dce513Schristos (type boolean) 82216dce513Schristos (name OPTIONAL_ABS_INSN) 82316dce513Schristos (comment "optional absolute difference instruction")) 82416dce513Schristos 82516dce513Schristos(define-attr 82616dce513Schristos (for insn) 82716dce513Schristos (type boolean) 82816dce513Schristos (name OPTIONAL_AVE_INSN) 82916dce513Schristos (comment "optional average instruction")) 83016dce513Schristos 83116dce513Schristos(define-attr 83216dce513Schristos (for insn) 83316dce513Schristos (type boolean) 83416dce513Schristos (name OPTIONAL_MINMAX_INSN) 83516dce513Schristos (comment "optional min/max instruction")) 83616dce513Schristos 83716dce513Schristos(define-attr 83816dce513Schristos (for insn) 83916dce513Schristos (type boolean) 84016dce513Schristos (name OPTIONAL_CLIP_INSN) 84116dce513Schristos (comment "optional clipping instruction")) 84216dce513Schristos 84316dce513Schristos(define-attr 84416dce513Schristos (for insn) 84516dce513Schristos (type boolean) 84616dce513Schristos (name OPTIONAL_SAT_INSN) 84716dce513Schristos (comment "optional saturation instruction")) 84816dce513Schristos 84916dce513Schristos(define-attr 85016dce513Schristos (for insn) 85116dce513Schristos (type boolean) 85216dce513Schristos (name OPTIONAL_UCI_INSN) 85316dce513Schristos (comment "optional UCI instruction")) 85416dce513Schristos 85516dce513Schristos(define-attr 85616dce513Schristos (for insn) 85716dce513Schristos (type boolean) 85816dce513Schristos (name OPTIONAL_DSP_INSN) 85916dce513Schristos (comment "optional DSP instruction")) 86016dce513Schristos 86116dce513Schristos(define-attr 86216dce513Schristos (for insn) 86316dce513Schristos (type boolean) 86416dce513Schristos (name OPTIONAL_CP_INSN) 86516dce513Schristos (comment "optional coprocessor-related instruction")) 86616dce513Schristos 86716dce513Schristos(define-attr 86816dce513Schristos (for insn) 86916dce513Schristos (type boolean) 87016dce513Schristos (name OPTIONAL_CP64_INSN) 87116dce513Schristos (comment "optional coprocessor-related 64 data bit instruction")) 87216dce513Schristos 87316dce513Schristos(define-attr 87416dce513Schristos (for insn) 87516dce513Schristos (type boolean) 87616dce513Schristos (name OPTIONAL_VLIW64) 87716dce513Schristos (comment "optional vliw64 mode (vliw32 is default)")) 87816dce513Schristos 87916dce513Schristos(define-attr 88016dce513Schristos (for insn) 88116dce513Schristos (type enum) 88216dce513Schristos (name STALL) 88316dce513Schristos (attrs META) 88416dce513Schristos (values NONE SHIFTI INT2 LOAD STORE LDC STC LDCB STCB SSARB FSFT RET 88516dce513Schristos ADVCK MUL MULR DIV) 88616dce513Schristos (default NONE) 88716dce513Schristos (comment "gcc stall attribute")) 88816dce513Schristos 88916dce513Schristos(define-attr 89016dce513Schristos (for insn) 89116dce513Schristos (type string) 89216dce513Schristos (name INTRINSIC) 89316dce513Schristos (attrs META) 89416dce513Schristos (comment "gcc intrinsic name")) 89516dce513Schristos 89616dce513Schristos(define-attr 89716dce513Schristos (for insn) 89816dce513Schristos (type enum) 89916dce513Schristos (name SLOT) 90016dce513Schristos (attrs META) 90116dce513Schristos (values NONE C3 V1 V3 P0S P0 P1) 90216dce513Schristos (default NONE) 90316dce513Schristos (comment "coprocessor slot type")) 90416dce513Schristos 90516dce513Schristos(define-attr 90616dce513Schristos (for insn) 90716dce513Schristos (type boolean) 90816dce513Schristos (name MAY_TRAP) 90916dce513Schristos (comment "instruction may generate an exception")) 91016dce513Schristos 91116dce513Schristos; Attributes for scheduling restrictions in vliw mode 91216dce513Schristos 91316dce513Schristos(define-attr 91416dce513Schristos (for insn) 91516dce513Schristos (type boolean) 91616dce513Schristos (name VLIW_ALONE) 91716dce513Schristos (comment "instruction can be scheduled alone in vliw mode")) 91816dce513Schristos 91916dce513Schristos(define-attr 92016dce513Schristos (for insn) 92116dce513Schristos (type boolean) 92216dce513Schristos (name VLIW_NO_CORE_NOP) 92316dce513Schristos (comment "there is no corresponding nop core instruction")) 92416dce513Schristos 92516dce513Schristos(define-attr 92616dce513Schristos (for insn) 92716dce513Schristos (type boolean) 92816dce513Schristos (name VLIW_NO_COP_NOP) 92916dce513Schristos (comment "there is no corresponding nop coprocessor instruction")) 93016dce513Schristos 93116dce513Schristos(define-attr 93216dce513Schristos (for insn) 93316dce513Schristos (type boolean) 93416dce513Schristos (name VLIW64_NO_MATCHING_NOP) 93516dce513Schristos (comment "there is no corresponding nop coprocessor instruction")) 93616dce513Schristos(define-attr 93716dce513Schristos (for insn) 93816dce513Schristos (type boolean) 93916dce513Schristos (name VLIW32_NO_MATCHING_NOP) 94016dce513Schristos (comment "there is no corresponding nop coprocessor instruction")) 94116dce513Schristos 94216dce513Schristos(define-attr 94316dce513Schristos (for insn) 94416dce513Schristos (type boolean) 94516dce513Schristos (name VOLATILE) 94616dce513Schristos (comment "Insn is volatile.")) 94716dce513Schristos 94816dce513Schristos(define-attr 94916dce513Schristos (for insn) 95016dce513Schristos (type integer) 95116dce513Schristos (name LATENCY) 95216dce513Schristos (comment "The latency of this insn, used for scheduling as an intrinsic in gcc") 95316dce513Schristos (default 0)) 95416dce513Schristos 95516dce513Schristos; The MeP config tool will edit this. 95616dce513Schristos(define-attr 95716dce513Schristos (type enum) 95816dce513Schristos (for insn) 95916dce513Schristos (name CONFIG) 96016dce513Schristos (values NONE ; config-attr-start 96116dce513Schristos default 96216dce513Schristos ) ; config-attr-end 96316dce513Schristos) 96416dce513Schristos 96516dce513Schristos 96616dce513Schristos; Enumerations. 96716dce513Schristos 96816dce513Schristos(define-normal-insn-enum major "major opcodes" (all-mep-core-isas) MAJ_ 96916dce513Schristos f-major 97016dce513Schristos (.map .str (.iota 16)) 97116dce513Schristos) 97216dce513Schristos 97316dce513Schristos 97416dce513Schristos(define-pmacro (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming isa) 97516dce513Schristos (define-insn 97616dce513Schristos (name xname) 97716dce513Schristos (comment xcomment) 97816dce513Schristos (.splice attrs (.unsplice xattrs) (ISA isa)) 97916dce513Schristos (syntax xsyntax) 98016dce513Schristos (format xformat) 98116dce513Schristos (semantics xsemantics) 98216dce513Schristos (.splice timing (.unsplice xtiming)) 98316dce513Schristos ) 98416dce513Schristos) 98516dce513Schristos 98616dce513Schristos(define-pmacro (dnmi-isa xname xcomment xattrs xsyntax xemit isa) 98716dce513Schristos (dnmi xname xcomment (.splice (.unsplice xattrs) (ISA isa)) xsyntax xemit) 98816dce513Schristos) 98916dce513Schristos 99016dce513Schristos; For making profiling calls and dynamic configuration 99116dce513Schristos(define-pmacro (cg-profile caller callee) 99216dce513Schristos (c-call "cg_profile" caller callee) 99316dce513Schristos) 99416dce513Schristos; For dynamic configuration only 99516dce513Schristos(define-pmacro (cg-profile-jump caller callee) 99616dce513Schristos (c-call "cg_profile_jump" caller callee) 99716dce513Schristos) 99816dce513Schristos 99916dce513Schristos; For defining Core Instructions 100016dce513Schristos(define-pmacro (dnci xname xcomment xattrs xsyntax xformat xsemantics xtiming) 100116dce513Schristos (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming all-core-isa-list) 100216dce513Schristos) 100316dce513Schristos(define-pmacro (dncmi xname xcomment xattrs xsyntax xemit) 100416dce513Schristos (dnmi-isa xname xcomment xattrs xsyntax xemit all-core-isa-list) 100516dce513Schristos) 100616dce513Schristos 100716dce513Schristos; For defining Coprocessor Instructions 100816dce513Schristos;(define-pmacro (dncpi xname xcomment xattrs xsyntax xformat xsemantics xtiming) (dni-isa xname xcomment xattrs xsyntax xformat xsemantics xtiming cop) 100916dce513Schristos;) 101016dce513Schristos 101116dce513Schristos;; flag setting macro 101216dce513Schristos(define-pmacro (set-bit xop xbitnum xval) 101316dce513Schristos (set xop (or 101416dce513Schristos (and xop (inv (sll 1 xbitnum))) 101516dce513Schristos (and (sll 1 xbitnum) (sll xval xbitnum))))) 101616dce513Schristos 101716dce513Schristos;; some flags we commonly use in vliw reasoning / mode-switching etc. 101816dce513Schristos(define-pmacro (get-opt.vliw64) (and (srl opt 6) 1)) 101916dce513Schristos(define-pmacro (get-opt.vliw32) (and (srl opt 5) 1)) 102016dce513Schristos(define-pmacro (get-rm.lsb) (and rm 1)) 102116dce513Schristos(define-pmacro (get-psw.om) (and (srl psw 12) 1)) 102216dce513Schristos(define-pmacro (get-psw.nmi) (and (srl psw 9) 1)) 102316dce513Schristos(define-pmacro (get-psw.iep) (and (srl psw 1) 1)) 102416dce513Schristos(define-pmacro (get-psw.ump) (and (srl psw 3) 1)) 102516dce513Schristos(define-pmacro (get-epc.etom) (and epc 1)) 102616dce513Schristos(define-pmacro (get-npc.ntom) (and npc 1)) 102716dce513Schristos(define-pmacro (get-lp.ltom) (and lp 1)) 102816dce513Schristos 102916dce513Schristos(define-pmacro (set-psw.om zval) (set-bit (raw-reg h-csr 16) 12 zval)) 103016dce513Schristos(define-pmacro (set-psw.nmi zval) (set-bit (raw-reg h-csr 16) 9 zval)) 103116dce513Schristos(define-pmacro (set-psw.umc zval) (set-bit (raw-reg h-csr 16) 2 zval)) 103216dce513Schristos(define-pmacro (set-psw.iec zval) (set-bit (raw-reg h-csr 16) 0 zval)) 103316dce513Schristos(define-pmacro (set-rpe.elr zval) (set-bit (raw-reg h-csr 5) 0 zval)) 103416dce513Schristos 103516dce513Schristos 103616dce513Schristos;; the "3 way switch" depending on our current operating mode and vliw status flags 103716dce513Schristos(define-pmacro (core-vliw-switch core-rtl vliw32-rtl vliw64-rtl) 103816dce513Schristos (cond 103916dce513Schristos ((andif (get-psw.om) (get-opt.vliw64)) vliw64-rtl) 104016dce513Schristos ((andif (get-psw.om) (get-opt.vliw32)) vliw32-rtl) 104116dce513Schristos (else core-rtl))) 104216dce513Schristos 104316dce513Schristos;; the varying-pcrel idiom 104416dce513Schristos(define-pmacro (set-vliw-modified-pcrel-offset xtarg xa xb xc) 104516dce513Schristos (core-vliw-switch (set xtarg (add pc xa)) 104616dce513Schristos (set xtarg (add pc xb)) 104716dce513Schristos (set xtarg (add pc xc)))) 104816dce513Schristos 104916dce513Schristos;; the increasing-alignment idiom in branch displacements 105016dce513Schristos(define-pmacro (set-vliw-alignment-modified xtarg zaddr) 105116dce513Schristos (core-vliw-switch (set xtarg (and zaddr (inv 1))) 105216dce513Schristos (set xtarg (and zaddr (inv 3))) 105316dce513Schristos (set xtarg (and zaddr (inv 7))))) 105416dce513Schristos 105516dce513Schristos;; the increasing-alignment idiom in option-only form 105616dce513Schristos(define-pmacro (set-vliw-aliignment-modified-by-option xtarg zaddr) 105716dce513Schristos (if (get-opt.vliw32) 105816dce513Schristos (set xtarg (and zaddr (inv 3))) 105916dce513Schristos (set xtarg (and zaddr (inv 7))))) 106016dce513Schristos 106116dce513Schristos 106216dce513Schristos 106316dce513Schristos; pmacros needed for coprocessor modulo addressing. 106416dce513Schristos 106516dce513Schristos; Taken from supplement ``The operation of the modulo addressing'' in 106616dce513Schristos; Toshiba documentation rev 2.2, p. 34. 106716dce513Schristos 106816dce513Schristos(define-pmacro (compute-mask0) 106916dce513Schristos (sequence SI ((SI temp)) 107016dce513Schristos (set temp (or mb0 me0)) 107116dce513Schristos (srl (const SI -1) (c-call SI "do_ldz" temp)))) 107216dce513Schristos 107316dce513Schristos(define-pmacro (mod0 immed) 107416dce513Schristos (sequence SI ((SI modulo-mask)) 107516dce513Schristos (set modulo-mask (compute-mask0)) 107616dce513Schristos (if SI (eq (and rma modulo-mask) me0) 107716dce513Schristos (or (and rma (inv modulo-mask)) mb0) 107816dce513Schristos (add rma (ext SI immed))))) 107916dce513Schristos 108016dce513Schristos(define-pmacro (compute-mask1) 108116dce513Schristos (sequence SI ((SI temp)) 108216dce513Schristos (set temp (or mb1 me1)) 108316dce513Schristos (srl (const SI -1) (c-call SI "do_ldz" temp)))) 108416dce513Schristos 108516dce513Schristos(define-pmacro (mod1 immed) 108616dce513Schristos (sequence SI ((SI modulo-mask)) 108716dce513Schristos (set modulo-mask (compute-mask1)) 108816dce513Schristos (if SI (eq (and rma modulo-mask) me1) 108916dce513Schristos (or (and rma (inv modulo-mask)) mb1) 109016dce513Schristos (add rma (ext SI immed))))) 109116dce513Schristos 109216dce513Schristos 109316dce513Schristos; Instructions. 109416dce513Schristos 109516dce513Schristos; A pmacro for use in semantic bodies of unimplemented insns. 109616dce513Schristos(define-pmacro (unimp mnemonic) (nop)) 109716dce513Schristos 109816dce513Schristos; Core specific instructions 109916dce513Schristos; (include "mep-h1.cpu") ; -- exposed by MeP-Integrator 110016dce513Schristos(include "mep-c5.cpu") ; -- exposed by MeP-Integrator 110116dce513Schristos 110216dce513Schristos; Load/store instructions. 110316dce513Schristos 110416dce513Schristos(dnci sb "store byte (register indirect)" ((STALL STORE)) 110516dce513Schristos "sb $rnc,($rma)" 110616dce513Schristos (+ MAJ_0 rnc rma (f-sub4 8)) 110716dce513Schristos (sequence () 110816dce513Schristos (c-call VOID "check_write_to_text" rma) 110916dce513Schristos (set (mem UQI rma) (and rnc #xff))) 111016dce513Schristos ((mep (unit u-use-gpr (in usereg rnc)) 111116dce513Schristos (unit u-use-gpr (in usereg rma)) 111216dce513Schristos (unit u-exec)))) 111316dce513Schristos 111416dce513Schristos(dnci sh "store half-word (register indirect)" ((STALL STORE)) 111516dce513Schristos "sh $rns,($rma)" 111616dce513Schristos (+ MAJ_0 rns rma (f-sub4 9)) 111716dce513Schristos (sequence () 111816dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv 1))) 111916dce513Schristos (set (mem UHI (and rma (inv 1))) (and rns #xffff))) 112016dce513Schristos ((mep (unit u-use-gpr (in usereg rns)) 112116dce513Schristos (unit u-use-gpr (in usereg rma)) 112216dce513Schristos (unit u-exec)))) 112316dce513Schristos 112416dce513Schristos(dnci sw "store word (register indirect)" ((STALL STORE)) 112516dce513Schristos "sw $rnl,($rma)" 112616dce513Schristos (+ MAJ_0 rnl rma (f-sub4 10)) 112716dce513Schristos (sequence () 112816dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv 3))) 112916dce513Schristos (set (mem USI (and rma (inv 3))) rnl)) 113016dce513Schristos ((mep (unit u-use-gpr (in usereg rnl)) 113116dce513Schristos (unit u-use-gpr (in usereg rma)) 113216dce513Schristos (unit u-exec)))) 113316dce513Schristos 113416dce513Schristos(dnci lb "load byte (register indirect)" ((STALL LOAD) (LATENCY 2)) 113516dce513Schristos "lb $rnc,($rma)" 113616dce513Schristos (+ MAJ_0 rnc rma (f-sub4 12)) 113716dce513Schristos (set rnc (ext SI (mem QI rma))) 113816dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 113916dce513Schristos (unit u-exec) 114016dce513Schristos (unit u-load-gpr (out loadreg rnc))))) 114116dce513Schristos 114216dce513Schristos(dnci lh "load half-word (register indirect)" ((STALL LOAD) (LATENCY 2)) 114316dce513Schristos "lh $rns,($rma)" 114416dce513Schristos (+ MAJ_0 rns rma (f-sub4 13)) 114516dce513Schristos (set rns (ext SI (mem HI (and rma (inv 1))))) 114616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 114716dce513Schristos (unit u-exec) 114816dce513Schristos (unit u-load-gpr (out loadreg rns))))) 114916dce513Schristos 115016dce513Schristos(dnci lw "load word (register indirect)" ((STALL LOAD) (LATENCY 2)) 115116dce513Schristos "lw $rnl,($rma)" 115216dce513Schristos (+ MAJ_0 rnl rma (f-sub4 14)) 115316dce513Schristos (set rnl (mem SI (and rma (inv 3)))) 115416dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 115516dce513Schristos (unit u-exec) 115616dce513Schristos (unit u-load-gpr (out loadreg rnl))))) 115716dce513Schristos 115816dce513Schristos(dnci lbu "load unsigned byte (register indirect)" ((STALL LOAD) (LATENCY 2)) 115916dce513Schristos "lbu $rnuc,($rma)" 116016dce513Schristos (+ MAJ_0 rnuc rma (f-sub4 11)) 116116dce513Schristos (set rnuc (zext SI (mem UQI rma))) 116216dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 116316dce513Schristos (unit u-exec) 116416dce513Schristos (unit u-load-gpr (out loadreg rnuc))))) 116516dce513Schristos 116616dce513Schristos(dnci lhu "load unsigned half-word (register indirect)" ((STALL LOAD) (LATENCY 2)) 116716dce513Schristos "lhu $rnus,($rma)" 116816dce513Schristos (+ MAJ_0 rnus rma (f-sub4 15)) 116916dce513Schristos (set rnus (zext SI (mem UHI (and rma (inv 1))))) 117016dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 117116dce513Schristos (unit u-exec) 117216dce513Schristos (unit u-load-gpr (out loadreg rnus))))) 117316dce513Schristos 117416dce513Schristos(dnci sw-sp "store word (sp relative)" ((STALL STORE)) 117516dce513Schristos "sw $rnl,$udisp7a4($spr)" 117616dce513Schristos (+ MAJ_4 rnl (f-8 0) udisp7a4 (f-sub2 2)) 117716dce513Schristos (sequence () 117816dce513Schristos (c-call VOID "check_write_to_text" (and (add udisp7a4 sp) (inv 3))) 117916dce513Schristos (set (mem SI (and (add udisp7a4 sp) (inv 3))) rnl)) 118016dce513Schristos ((mep (unit u-use-gpr (in usereg rnl)) 118116dce513Schristos (unit u-use-gpr (in usereg sp)) 118216dce513Schristos (unit u-exec)))) 118316dce513Schristos 118416dce513Schristos 118516dce513Schristos(dnci lw-sp "load word (sp relative)" ((STALL LOAD) (LATENCY 2)) 118616dce513Schristos "lw $rnl,$udisp7a4($spr)" 118716dce513Schristos (+ MAJ_4 rnl (f-8 0) udisp7a4 (f-sub2 3)) 118816dce513Schristos (set rnl (mem SI (and (add udisp7a4 sp) (inv 3)))) 118916dce513Schristos ((mep (unit u-use-gpr (in usereg sp)) 119016dce513Schristos (unit u-exec) 119116dce513Schristos (unit u-load-gpr (out loadreg rnl))))) 119216dce513Schristos 119316dce513Schristos(dnci sb-tp "store byte (tp relative)" ((STALL STORE)) 119416dce513Schristos "sb $rn3c,$udisp7($tpr)" 119516dce513Schristos (+ MAJ_8 (f-4 0) rn3c (f-8 0) udisp7) 119616dce513Schristos (sequence () 119716dce513Schristos (c-call VOID "check_write_to_text" (add (zext SI udisp7) tp)) 119816dce513Schristos (set (mem QI (add (zext SI udisp7) tp)) (and rn3c #xff))) 119916dce513Schristos ((mep (unit u-use-gpr (in usereg rn3c)) 120016dce513Schristos (unit u-use-gpr (in usereg tp)) 120116dce513Schristos (unit u-exec)))) 120216dce513Schristos 120316dce513Schristos(dnci sh-tp "store half-word (tp relative)" ((STALL STORE)) 120416dce513Schristos "sh $rn3s,$udisp7a2($tpr)" 120516dce513Schristos (+ MAJ_8 (f-4 0) rn3s (f-8 1) udisp7a2 (f-15 0)) 120616dce513Schristos (sequence () 120716dce513Schristos (c-call VOID "check_write_to_text" (and (add (zext SI udisp7a2) tp) (inv 1))) 120816dce513Schristos (set (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))) (and rn3s #xffff))) 120916dce513Schristos ((mep (unit u-use-gpr (in usereg rn3s)) 121016dce513Schristos (unit u-use-gpr (in usereg tp)) 121116dce513Schristos (unit u-exec)))) 121216dce513Schristos 121316dce513Schristos(dnci sw-tp "store word (tp relative)" ((STALL STORE)) 121416dce513Schristos "sw $rn3l,$udisp7a4($tpr)" 121516dce513Schristos (+ MAJ_4 (f-4 0) rn3l (f-8 1) udisp7a4 (f-sub2 2)) 121616dce513Schristos (sequence () 121716dce513Schristos (c-call VOID "check_write_to_text" (and (add (zext SI udisp7a4) tp) (inv 3))) 121816dce513Schristos (set (mem SI (and (add (zext SI udisp7a4) tp) (inv 3))) rn3l)) 121916dce513Schristos ((mep (unit u-use-gpr (in usereg rn3l)) 122016dce513Schristos (unit u-use-gpr (in usereg tp)) 122116dce513Schristos (unit u-exec)))) 122216dce513Schristos 122316dce513Schristos(dnci lb-tp "load byte (tp relative)" ((STALL LOAD) (LATENCY 2)) 122416dce513Schristos "lb $rn3c,$udisp7($tpr)" 122516dce513Schristos (+ MAJ_8 (f-4 1) rn3c (f-8 0) udisp7) 122616dce513Schristos (set rn3c (ext SI (mem QI (add (zext SI udisp7) tp)))) 122716dce513Schristos ((mep (unit u-use-gpr (in usereg tp)) 122816dce513Schristos (unit u-exec) 122916dce513Schristos (unit u-load-gpr (out loadreg rn3c))))) 123016dce513Schristos 123116dce513Schristos(dnci lh-tp "load half-word (tp relative)" ((STALL LOAD) (LATENCY 2)) 123216dce513Schristos "lh $rn3s,$udisp7a2($tpr)" 123316dce513Schristos (+ MAJ_8 (f-4 1) rn3s (f-8 1) udisp7a2 (f-15 0)) 123416dce513Schristos (set rn3s (ext SI (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))))) 123516dce513Schristos ((mep (unit u-use-gpr (in usereg tp)) 123616dce513Schristos (unit u-exec) 123716dce513Schristos (unit u-load-gpr (out loadreg rn3s))))) 123816dce513Schristos 123916dce513Schristos(dnci lw-tp "load word (tp relative)" ((STALL LOAD) (LATENCY 2)) 124016dce513Schristos "lw $rn3l,$udisp7a4($tpr)" 124116dce513Schristos (+ MAJ_4 (f-4 0) rn3l (f-8 1) udisp7a4 (f-sub2 3)) 124216dce513Schristos (set rn3l (mem SI (and (add (zext SI udisp7a4) tp) (inv 3)))) 124316dce513Schristos ((mep (unit u-use-gpr (in usereg tp)) 124416dce513Schristos (unit u-exec) 124516dce513Schristos (unit u-load-gpr (out loadreg rn3l))))) 124616dce513Schristos 124716dce513Schristos(dnci lbu-tp "load unsigned byte (tp relative)" ((STALL LOAD) (LATENCY 2)) 124816dce513Schristos "lbu $rn3uc,$udisp7($tpr)" 124916dce513Schristos (+ MAJ_4 (f-4 1) rn3uc (f-8 1) udisp7) 125016dce513Schristos (set rn3uc (zext SI (mem QI (add (zext SI udisp7) tp)))) 125116dce513Schristos ((mep (unit u-use-gpr (in usereg tp)) 125216dce513Schristos (unit u-exec) 125316dce513Schristos (unit u-load-gpr (out loadreg rn3uc))))) 125416dce513Schristos 125516dce513Schristos(dnci lhu-tp "load unsigned half-word (tp relative)" ((STALL LOAD) (LATENCY 2)) 125616dce513Schristos "lhu $rn3us,$udisp7a2($tpr)" 125716dce513Schristos (+ MAJ_8 (f-4 1) rn3us (f-8 1) udisp7a2 (f-15 1)) 125816dce513Schristos (set rn3us (zext SI (mem HI (and (add (zext SI udisp7a2) tp) (inv 1))))) 125916dce513Schristos ((mep (unit u-use-gpr (in usereg tp)) 126016dce513Schristos (unit u-exec) 126116dce513Schristos (unit u-load-gpr (out loadreg rn3us))))) 126216dce513Schristos 126316dce513Schristos(dnci sb16 "store byte (16 bit displacement)" ((STALL STORE)) 126416dce513Schristos "sb $rnc,$sdisp16($rma)" 126516dce513Schristos (+ MAJ_12 rnc rma (f-sub4 8) sdisp16) 126616dce513Schristos (sequence () 126716dce513Schristos (c-call VOID "check_write_to_text" (add rma (ext SI sdisp16))) 126816dce513Schristos (set (mem QI (add rma (ext SI sdisp16))) (and rnc #xff))) 126916dce513Schristos ((mep (unit u-use-gpr (in usereg rnc)) 127016dce513Schristos (unit u-use-gpr (in usereg rma)) 127116dce513Schristos (unit u-exec)))) 127216dce513Schristos 127316dce513Schristos(dnci sh16 "store half-word (16 bit displacement)" ((STALL STORE)) 127416dce513Schristos "sh $rns,$sdisp16($rma)" 127516dce513Schristos (+ MAJ_12 rns rma (f-sub4 9) sdisp16) 127616dce513Schristos (sequence () 127716dce513Schristos (c-call VOID "check_write_to_text" (and (add rma (ext SI sdisp16)) (inv 1))) 127816dce513Schristos (set (mem HI (and (add rma (ext SI sdisp16)) (inv 1))) (and rns #xffff))) 127916dce513Schristos ((mep (unit u-use-gpr (in usereg rns)) 128016dce513Schristos (unit u-use-gpr (in usereg rma)) 128116dce513Schristos (unit u-exec)))) 128216dce513Schristos 128316dce513Schristos(dnci sw16 "store word (16 bit displacement)" ((STALL STORE)) 128416dce513Schristos "sw $rnl,$sdisp16($rma)" 128516dce513Schristos (+ MAJ_12 rnl rma (f-sub4 10) sdisp16) 128616dce513Schristos (sequence () 128716dce513Schristos (c-call "check_write_to_text" (and (add rma (ext SI sdisp16)) (inv 3))) 128816dce513Schristos (set (mem SI (and (add rma (ext SI sdisp16)) (inv 3))) rnl)) 128916dce513Schristos ((mep (unit u-use-gpr (in usereg rnl)) 129016dce513Schristos (unit u-use-gpr (in usereg rma)) 129116dce513Schristos (unit u-exec)))) 129216dce513Schristos 129316dce513Schristos(dnci lb16 "load byte (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) 129416dce513Schristos "lb $rnc,$sdisp16($rma)" 129516dce513Schristos (+ MAJ_12 rnc rma (f-sub4 12) sdisp16) 129616dce513Schristos (set rnc (ext SI (mem QI (add rma (ext SI sdisp16))))) 129716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 129816dce513Schristos (unit u-exec) 129916dce513Schristos (unit u-load-gpr (out loadreg rnc))))) 130016dce513Schristos 130116dce513Schristos(dnci lh16 "load half-word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) 130216dce513Schristos "lh $rns,$sdisp16($rma)" 130316dce513Schristos (+ MAJ_12 rns rma (f-sub4 13) sdisp16) 130416dce513Schristos (set rns (ext SI (mem HI (and (add rma (ext SI sdisp16)) (inv 1))))) 130516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 130616dce513Schristos (unit u-exec) 130716dce513Schristos (unit u-load-gpr (out loadreg rns))))) 130816dce513Schristos 130916dce513Schristos(dnci lw16 "load word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) 131016dce513Schristos "lw $rnl,$sdisp16($rma)" 131116dce513Schristos (+ MAJ_12 rnl rma (f-sub4 14) sdisp16) 131216dce513Schristos (set rnl (mem SI (and (add rma (ext SI sdisp16)) (inv 3)))) 131316dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 131416dce513Schristos (unit u-exec) 131516dce513Schristos (unit u-load-gpr (out loadreg rnl))))) 131616dce513Schristos 131716dce513Schristos(dnci lbu16 "load unsigned byte (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) 131816dce513Schristos "lbu $rnuc,$sdisp16($rma)" 131916dce513Schristos (+ MAJ_12 rnuc rma (f-sub4 11) sdisp16) 132016dce513Schristos (set rnuc (zext SI (mem QI (add rma (ext SI sdisp16))))) 132116dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 132216dce513Schristos (unit u-exec) 132316dce513Schristos (unit u-load-gpr (out loadreg rnuc))))) 132416dce513Schristos 132516dce513Schristos(dnci lhu16 "load unsigned half-word (16 bit displacement)" ((STALL LOAD) (LATENCY 2)) 132616dce513Schristos "lhu $rnus,$sdisp16($rma)" 132716dce513Schristos (+ MAJ_12 rnus rma (f-sub4 15) sdisp16) 132816dce513Schristos (set rnus (zext SI (mem HI (and (add rma (ext SI sdisp16)) (inv 1))))) 132916dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 133016dce513Schristos (unit u-exec) 133116dce513Schristos (unit u-load-gpr (out loadreg rnus))))) 133216dce513Schristos 133316dce513Schristos(dnci sw24 "store word (24 bit absolute addressing)" ((STALL STORE)) 133416dce513Schristos "sw $rnl,($addr24a4)" 133516dce513Schristos (+ MAJ_14 rnl addr24a4 (f-sub2 2)) 133616dce513Schristos (sequence () 133716dce513Schristos (c-call VOID "check_write_to_text" (zext SI addr24a4)) 133816dce513Schristos (set (mem SI (zext SI addr24a4)) rnl)) 133916dce513Schristos ((mep (unit u-use-gpr (in usereg rnl)) 134016dce513Schristos (unit u-exec)))) 134116dce513Schristos 134216dce513Schristos(dnci lw24 "load word (24 bit absolute addressing)" ((STALL LOAD) (LATENCY 2)) 134316dce513Schristos "lw $rnl,($addr24a4)" 134416dce513Schristos (+ MAJ_14 rnl addr24a4 (f-sub2 3)) 134516dce513Schristos (set rnl (mem SI (zext SI addr24a4))) 134616dce513Schristos ((mep (unit u-exec) 134716dce513Schristos (unit u-load-gpr (out loadreg rnl))))) 134816dce513Schristos 134916dce513Schristos 135016dce513Schristos; Extension instructions. 135116dce513Schristos 135216dce513Schristos(dnci extb "sign extend byte" () 135316dce513Schristos "extb $rn" 135416dce513Schristos (+ MAJ_1 rn (f-rm 0) (f-sub4 13)) 135516dce513Schristos (set rn (ext SI (and QI rn #xff))) 135616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 135716dce513Schristos (unit u-exec)))) 135816dce513Schristos 135916dce513Schristos(dnci exth "sign extend half-word" () 136016dce513Schristos "exth $rn" 136116dce513Schristos (+ MAJ_1 rn (f-rm 2) (f-sub4 13)) 136216dce513Schristos (set rn (ext SI (and HI rn #xffff))) 136316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 136416dce513Schristos (unit u-exec)))) 136516dce513Schristos 136616dce513Schristos(dnci extub "zero extend byte" () 136716dce513Schristos "extub $rn" 136816dce513Schristos (+ MAJ_1 rn (f-rm 8) (f-sub4 13)) 136916dce513Schristos (set rn (zext SI (and rn #xff))) 137016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 137116dce513Schristos (unit u-exec)))) 137216dce513Schristos 137316dce513Schristos(dnci extuh "zero extend half-word" () 137416dce513Schristos "extuh $rn" 137516dce513Schristos (+ MAJ_1 rn (f-rm 10) (f-sub4 13)) 137616dce513Schristos (set rn (zext SI (and rn #xffff))) 137716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 137816dce513Schristos (unit u-exec)))) 137916dce513Schristos 138016dce513Schristos 138116dce513Schristos; Shift amount manipulation instructions. 138216dce513Schristos 138316dce513Schristos(dnci ssarb "set sar to bytes" ((STALL SSARB) VOLATILE) 138416dce513Schristos "ssarb $udisp2($rm)" 138516dce513Schristos (+ MAJ_1 (f-4 0) (f-5 0) udisp2 rm (f-sub4 12)) 138616dce513Schristos (if (c-call BI "big_endian_p") 138716dce513Schristos (set sar (zext SI (mul (and (add udisp2 rm) 3) 8))) 138816dce513Schristos (set sar (sub 32 (zext SI (mul (and (add udisp2 rm) 3) 8))))) 138916dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 139016dce513Schristos (unit u-exec)))) 139116dce513Schristos 139216dce513Schristos 139316dce513Schristos; Move instructions. 139416dce513Schristos 139516dce513Schristos(dnci mov "move" () 139616dce513Schristos "mov $rn,$rm" 139716dce513Schristos (+ MAJ_0 rn rm (f-sub4 0)) 139816dce513Schristos (set rn rm) 139916dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 140016dce513Schristos (unit u-exec)))) 140116dce513Schristos 140216dce513Schristos(dnci movi8 "move 8-bit immediate" () 140316dce513Schristos "mov $rn,$simm8" 140416dce513Schristos (+ MAJ_5 rn simm8) 140516dce513Schristos (set rn (ext SI simm8)) 140616dce513Schristos ()) 140716dce513Schristos 140816dce513Schristos(dnci movi16 "move 16-bit immediate" () 140916dce513Schristos "mov $rn,$simm16" 141016dce513Schristos (+ MAJ_12 rn (f-rm 0) (f-sub4 1) simm16) 141116dce513Schristos (set rn (ext SI simm16)) 141216dce513Schristos ()) 141316dce513Schristos 141416dce513Schristos(dnci movu24 "move 24-bit unsigned immediate" () 141516dce513Schristos "movu $rn3,$uimm24" 141616dce513Schristos (+ MAJ_13 (f-4 0) rn3 uimm24) 141716dce513Schristos (set rn3 (zext SI uimm24)) 141816dce513Schristos ()) 141916dce513Schristos 142016dce513Schristos(dnci movu16 "move 16-bit unsigned immediate" () 142116dce513Schristos "movu $rn,$uimm16" 142216dce513Schristos (+ MAJ_12 rn (f-rm 1) (f-sub4 1) uimm16) 142316dce513Schristos (set rn (zext SI uimm16)) 142416dce513Schristos ()) 142516dce513Schristos 142616dce513Schristos(dnci movh "move high 16-bit immediate" () 142716dce513Schristos "movh $rn,$uimm16" 142816dce513Schristos (+ MAJ_12 rn (f-rm 2) (f-sub4 1) uimm16) 142916dce513Schristos (set rn (sll uimm16 16)) 143016dce513Schristos ()) 143116dce513Schristos 143216dce513Schristos 143316dce513Schristos; Arithmetic instructions. 143416dce513Schristos 143516dce513Schristos(dnci add3 "add three registers" () 143616dce513Schristos "add3 $rl,$rn,$rm" 143716dce513Schristos (+ MAJ_9 rn rm rl) 143816dce513Schristos (set rl (add rn rm)) 143916dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 144016dce513Schristos (unit u-use-gpr (in usereg rm)) 144116dce513Schristos (unit u-exec)))) 144216dce513Schristos 144316dce513Schristos(dnci add "add" () 144416dce513Schristos "add $rn,$simm6" 144516dce513Schristos (+ MAJ_6 rn simm6 (f-sub2 0)) 144616dce513Schristos (set rn (add rn (ext SI simm6))) 144716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 144816dce513Schristos (unit u-exec)))) 144916dce513Schristos 145016dce513Schristos(dnci add3i "add two registers and immediate" () 145116dce513Schristos "add3 $rn,$spr,$uimm7a4" 145216dce513Schristos (+ MAJ_4 rn (f-8 0) uimm7a4 (f-sub2 0)) 145316dce513Schristos (set rn (add sp (zext SI uimm7a4))) 145416dce513Schristos ((mep (unit u-use-gpr (in usereg sp)) 145516dce513Schristos (unit u-exec)))) 145616dce513Schristos 145716dce513Schristos(dnci advck3 "add overflow check" ((STALL ADVCK)) 145816dce513Schristos "advck3 \\$0,$rn,$rm" 145916dce513Schristos (+ MAJ_0 rn rm (f-sub4 7)) 146016dce513Schristos (if (add-oflag rn rm 0) 146116dce513Schristos (set r0 1) 146216dce513Schristos (set r0 0)) 146316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 146416dce513Schristos (unit u-use-gpr (in usereg rm)) 146516dce513Schristos (unit u-exec)))) 146616dce513Schristos 146716dce513Schristos(dnci sub "subtract" () 146816dce513Schristos "sub $rn,$rm" 146916dce513Schristos (+ MAJ_0 rn rm (f-sub4 4)) 147016dce513Schristos (set rn (sub rn rm)) 147116dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 147216dce513Schristos (unit u-use-gpr (in usereg rm))))) 147316dce513Schristos 147416dce513Schristos(dnci sbvck3 "subtraction overflow check" ((STALL ADVCK)) 147516dce513Schristos "sbvck3 \\$0,$rn,$rm" 147616dce513Schristos (+ MAJ_0 rn rm (f-sub4 5)) 147716dce513Schristos (if (sub-oflag rn rm 0) 147816dce513Schristos (set r0 1) 147916dce513Schristos (set r0 0)) 148016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 148116dce513Schristos (unit u-use-gpr (in usereg rm)) 148216dce513Schristos (unit u-exec)))) 148316dce513Schristos 148416dce513Schristos(dnci neg "negate" () 148516dce513Schristos "neg $rn,$rm" 148616dce513Schristos (+ MAJ_0 rn rm (f-sub4 1)) 148716dce513Schristos (set rn (neg rm)) 148816dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 148916dce513Schristos (unit u-exec)))) 149016dce513Schristos 149116dce513Schristos(dnci slt3 "set if less than" () 149216dce513Schristos "slt3 \\$0,$rn,$rm" 149316dce513Schristos (+ MAJ_0 rn rm (f-sub4 2)) 149416dce513Schristos (if (lt rn rm) 149516dce513Schristos (set r0 1) 149616dce513Schristos (set r0 0)) 149716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 149816dce513Schristos (unit u-use-gpr (in usereg rm)) 149916dce513Schristos (unit u-exec)))) 150016dce513Schristos 150116dce513Schristos(dnci sltu3 "set less than unsigned" () 150216dce513Schristos "sltu3 \\$0,$rn,$rm" 150316dce513Schristos (+ MAJ_0 rn rm (f-sub4 3)) 150416dce513Schristos (if (ltu rn rm) 150516dce513Schristos (set r0 1) 150616dce513Schristos (set r0 0)) 150716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 150816dce513Schristos (unit u-use-gpr (in usereg rm)) 150916dce513Schristos (unit u-exec)))) 151016dce513Schristos 151116dce513Schristos(dnci slt3i "set if less than immediate" () 151216dce513Schristos "slt3 \\$0,$rn,$uimm5" 151316dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 1)) 151416dce513Schristos (if (lt rn (zext SI uimm5)) 151516dce513Schristos (set r0 1) 151616dce513Schristos (set r0 0)) 151716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 151816dce513Schristos (unit u-exec)))) 151916dce513Schristos 152016dce513Schristos(dnci sltu3i "set if less than unsigned immediate" () 152116dce513Schristos "sltu3 \\$0,$rn,$uimm5" 152216dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 5)) 152316dce513Schristos (if (ltu rn (zext SI uimm5)) 152416dce513Schristos (set r0 1) 152516dce513Schristos (set r0 0)) 152616dce513Schristos ()) 152716dce513Schristos 152816dce513Schristos(dnci sl1ad3 "shift left one and add" ((STALL INT2)) 152916dce513Schristos "sl1ad3 \\$0,$rn,$rm" 153016dce513Schristos (+ MAJ_2 rn rm (f-sub4 6)) 153116dce513Schristos (set r0 (add (sll rn 1) rm)) 153216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 153316dce513Schristos (unit u-use-gpr (in usereg rm)) 153416dce513Schristos (unit u-exec)))) 153516dce513Schristos 153616dce513Schristos(dnci sl2ad3 "shift left two and add" ((STALL INT2)) 153716dce513Schristos "sl2ad3 \\$0,$rn,$rm" 153816dce513Schristos (+ MAJ_2 rn rm (f-sub4 7)) 153916dce513Schristos (set r0 (add (sll rn 2) rm)) 154016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 154116dce513Schristos (unit u-use-gpr (in usereg rm)) 154216dce513Schristos (unit u-exec)))) 154316dce513Schristos 154416dce513Schristos(dnci add3x "three operand add (extended)" () 154516dce513Schristos "add3 $rn,$rm,$simm16" 154616dce513Schristos (+ MAJ_12 rn rm (f-sub4 0) simm16) 154716dce513Schristos (set rn (add rm (ext SI simm16))) 154816dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 154916dce513Schristos (unit u-exec)))) 155016dce513Schristos 155116dce513Schristos(dnci slt3x "set if less than (extended)" () 155216dce513Schristos "slt3 $rn,$rm,$simm16" 155316dce513Schristos (+ MAJ_12 rn rm (f-sub4 2) simm16) 155416dce513Schristos (if (lt rm (ext SI simm16)) 155516dce513Schristos (set rn 1) 155616dce513Schristos (set rn 0)) 155716dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 155816dce513Schristos (unit u-exec)))) 155916dce513Schristos 156016dce513Schristos(dnci sltu3x "set if less than unsigned (extended)" () 156116dce513Schristos "sltu3 $rn,$rm,$uimm16" 156216dce513Schristos (+ MAJ_12 rn rm (f-sub4 3) uimm16) 156316dce513Schristos (if (ltu rm (zext SI uimm16)) 156416dce513Schristos (set rn 1) 156516dce513Schristos (set rn 0)) 156616dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 156716dce513Schristos (unit u-exec)))) 156816dce513Schristos 156916dce513Schristos 157016dce513Schristos; Logical instructions. 157116dce513Schristos 157216dce513Schristos(dnci or "bitwise or" () 157316dce513Schristos "or $rn,$rm" 157416dce513Schristos (+ MAJ_1 rn rm (f-sub4 0)) 157516dce513Schristos (set rn (or rn rm)) 157616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 157716dce513Schristos (unit u-use-gpr (in usereg rm)) 157816dce513Schristos (unit u-exec)))) 157916dce513Schristos 158016dce513Schristos(dnci and "bitwise and" () 158116dce513Schristos "and $rn,$rm" 158216dce513Schristos (+ MAJ_1 rn rm (f-sub4 1)) 158316dce513Schristos (set rn (and rn rm)) 158416dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 158516dce513Schristos (unit u-use-gpr (in usereg rm)) 158616dce513Schristos (unit u-exec)))) 158716dce513Schristos 158816dce513Schristos(dnci xor "bitwise exclusive or" () 158916dce513Schristos "xor $rn,$rm" 159016dce513Schristos (+ MAJ_1 rn rm (f-sub4 2)) 159116dce513Schristos (set rn (xor rn rm)) 159216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 159316dce513Schristos (unit u-use-gpr (in usereg rm)) 159416dce513Schristos (unit u-exec)))) 159516dce513Schristos 159616dce513Schristos(dnci nor "bitwise negated or" () 159716dce513Schristos "nor $rn,$rm" 159816dce513Schristos (+ MAJ_1 rn rm (f-sub4 3)) 159916dce513Schristos (set rn (inv (or rn rm))) 160016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 160116dce513Schristos (unit u-use-gpr (in usereg rm)) 160216dce513Schristos (unit u-exec)))) 160316dce513Schristos 160416dce513Schristos(dnci or3 "or three operand" () 160516dce513Schristos "or3 $rn,$rm,$uimm16" 160616dce513Schristos (+ MAJ_12 rn rm (f-sub4 4) uimm16) 160716dce513Schristos (set rn (or rm (zext SI uimm16))) 160816dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 160916dce513Schristos (unit u-exec)))) 161016dce513Schristos 161116dce513Schristos(dnci and3 "and three operand" () 161216dce513Schristos "and3 $rn,$rm,$uimm16" 161316dce513Schristos (+ MAJ_12 rn rm (f-sub4 5) uimm16) 161416dce513Schristos (set rn (and rm (zext SI uimm16))) 161516dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 161616dce513Schristos (unit u-exec)))) 161716dce513Schristos 161816dce513Schristos(dnci xor3 "exclusive or three operand" () 161916dce513Schristos "xor3 $rn,$rm,$uimm16" 162016dce513Schristos (+ MAJ_12 rn rm (f-sub4 6) uimm16) 162116dce513Schristos (set rn (xor rm (zext SI uimm16))) 162216dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 162316dce513Schristos (unit u-exec)))) 162416dce513Schristos 162516dce513Schristos 162616dce513Schristos; Shift instructions. 162716dce513Schristos 162816dce513Schristos(dnci sra "shift right arithmetic" ((STALL INT2)) 162916dce513Schristos "sra $rn,$rm" 163016dce513Schristos (+ MAJ_2 rn rm (f-sub4 13)) 163116dce513Schristos (set rn (sra rn (and rm #x1f))) 163216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 163316dce513Schristos (unit u-use-gpr (in usereg rm)) 163416dce513Schristos (unit u-exec)))) 163516dce513Schristos 163616dce513Schristos(dnci srl "shift right logical" ((STALL INT2)) 163716dce513Schristos "srl $rn,$rm" 163816dce513Schristos (+ MAJ_2 rn rm (f-sub4 12)) 163916dce513Schristos (set rn (srl rn (and rm #x1f))) 164016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 164116dce513Schristos (unit u-use-gpr (in usereg rm)) 164216dce513Schristos (unit u-exec)))) 164316dce513Schristos 164416dce513Schristos(dnci sll "shift left logical" ((STALL INT2)) 164516dce513Schristos "sll $rn,$rm" 164616dce513Schristos (+ MAJ_2 rn rm (f-sub4 14)) 164716dce513Schristos (set rn (sll rn (and rm #x1f))) 164816dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 164916dce513Schristos (unit u-use-gpr (in usereg rm)) 165016dce513Schristos (unit u-exec)))) 165116dce513Schristos 165216dce513Schristos(dnci srai "shift right arithmetic (immediate)" ((STALL SHIFTI)) 165316dce513Schristos "sra $rn,$uimm5" 165416dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 3)) 165516dce513Schristos (set rn (sra rn uimm5)) 165616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 165716dce513Schristos (unit u-exec)))) 165816dce513Schristos 165916dce513Schristos(dnci srli "shift right logical (immediate)" ((STALL SHIFTI)) 166016dce513Schristos "srl $rn,$uimm5" 166116dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 2)) 166216dce513Schristos (set rn (srl rn uimm5)) 166316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 166416dce513Schristos (unit u-exec)))) 166516dce513Schristos 166616dce513Schristos(dnci slli "shift left logical (immediate)" ((STALL SHIFTI)) 166716dce513Schristos "sll $rn,$uimm5" 166816dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 6)) 166916dce513Schristos (set rn (sll rn uimm5)) 167016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 167116dce513Schristos (unit u-exec)))) 167216dce513Schristos 167316dce513Schristos(dnci sll3 "three-register shift left logical" ((STALL INT2)) 167416dce513Schristos "sll3 \\$0,$rn,$uimm5" 167516dce513Schristos (+ MAJ_6 rn uimm5 (f-sub3 7)) 167616dce513Schristos (set r0 (sll rn uimm5)) 167716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 167816dce513Schristos (unit u-exec)))) 167916dce513Schristos 168016dce513Schristos(dnci fsft "field shift" ((STALL FSFT) VOLATILE) 168116dce513Schristos "fsft $rn,$rm" 168216dce513Schristos (+ MAJ_2 rn rm (f-sub4 15)) 168316dce513Schristos (sequence ((DI temp) (QI shamt)) 168416dce513Schristos (set shamt (and sar #x3f)) 168516dce513Schristos (set temp (sll (or (sll (zext DI rn) 32) (zext DI rm)) shamt)) 168616dce513Schristos (set rn (subword SI (srl temp 32) 1))) 168716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 168816dce513Schristos (unit u-use-gpr (in usereg rm)) 168916dce513Schristos (unit u-exec)))) 169016dce513Schristos 169116dce513Schristos 169216dce513Schristos; Branch/jump instructions. 169316dce513Schristos 169416dce513Schristos(dnci bra "branch" (RELAXABLE) 169516dce513Schristos "bra $pcrel12a2" 169616dce513Schristos (+ MAJ_11 pcrel12a2 (f-15 0)) 169716dce513Schristos (set-vliw-alignment-modified pc pcrel12a2) 169816dce513Schristos ((mep (unit u-branch) 169916dce513Schristos (unit u-exec)))) 170016dce513Schristos 170116dce513Schristos(dnci beqz "branch if equal zero" (RELAXABLE) 170216dce513Schristos "beqz $rn,$pcrel8a2" 170316dce513Schristos (+ MAJ_10 rn pcrel8a2 (f-15 0)) 170416dce513Schristos (if (eq rn 0) 170516dce513Schristos (set-vliw-alignment-modified pc pcrel8a2)) 170616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 170716dce513Schristos (unit u-exec) 170816dce513Schristos (unit u-branch)))) 170916dce513Schristos 171016dce513Schristos(dnci bnez "branch if not equal zero" (RELAXABLE) 171116dce513Schristos "bnez $rn,$pcrel8a2" 171216dce513Schristos (+ MAJ_10 rn pcrel8a2 (f-15 1)) 171316dce513Schristos (if (ne rn 0) 171416dce513Schristos (set-vliw-alignment-modified pc pcrel8a2)) 171516dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 171616dce513Schristos (unit u-exec) 171716dce513Schristos (unit u-branch)))) 171816dce513Schristos 171916dce513Schristos(dnci beqi "branch equal immediate" (RELAXABLE) 172016dce513Schristos "beqi $rn,$uimm4,$pcrel17a2" 172116dce513Schristos (+ MAJ_14 rn uimm4 (f-sub4 0) pcrel17a2) 172216dce513Schristos (if (eq rn (zext SI uimm4)) 172316dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 172416dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 172516dce513Schristos (unit u-exec) 172616dce513Schristos (unit u-branch)))) 172716dce513Schristos 172816dce513Schristos(dnci bnei "branch not equal immediate" (RELAXABLE) 172916dce513Schristos "bnei $rn,$uimm4,$pcrel17a2" 173016dce513Schristos (+ MAJ_14 rn uimm4 (f-sub4 4) pcrel17a2) 173116dce513Schristos (if (ne rn (zext SI uimm4)) 173216dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 173316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 173416dce513Schristos (unit u-exec) 173516dce513Schristos (unit u-branch)))) 173616dce513Schristos 173716dce513Schristos(dnci blti "branch less than immediate" (RELAXABLE) 173816dce513Schristos "blti $rn,$uimm4,$pcrel17a2" 173916dce513Schristos (+ MAJ_14 rn uimm4 (f-sub4 12) pcrel17a2) 174016dce513Schristos (if (lt rn (zext SI uimm4)) 174116dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 174216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 174316dce513Schristos (unit u-exec) 174416dce513Schristos (unit u-branch)))) 174516dce513Schristos 174616dce513Schristos(dnci bgei "branch greater than immediate" (RELAXABLE) 174716dce513Schristos "bgei $rn,$uimm4,$pcrel17a2" 174816dce513Schristos (+ MAJ_14 rn uimm4 (f-sub4 8) pcrel17a2) 174916dce513Schristos (if (ge rn (zext SI uimm4)) 175016dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 175116dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 175216dce513Schristos (unit u-exec) 175316dce513Schristos (unit u-branch)))) 175416dce513Schristos 175516dce513Schristos(dnci beq "branch equal" () 175616dce513Schristos "beq $rn,$rm,$pcrel17a2" 175716dce513Schristos (+ MAJ_14 rn rm (f-sub4 1) pcrel17a2) 175816dce513Schristos (if (eq rn rm) 175916dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 176016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 176116dce513Schristos (unit u-use-gpr (in usereg rm)) 176216dce513Schristos (unit u-exec) 176316dce513Schristos (unit u-branch)))) 176416dce513Schristos 176516dce513Schristos(dnci bne "branch not equal" () 176616dce513Schristos "bne $rn,$rm,$pcrel17a2" 176716dce513Schristos (+ MAJ_14 rn rm (f-sub4 5) pcrel17a2) 176816dce513Schristos (if (ne rn rm) 176916dce513Schristos (set-vliw-alignment-modified pc pcrel17a2)) 177016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 177116dce513Schristos (unit u-use-gpr (in usereg rm)) 177216dce513Schristos (unit u-exec) 177316dce513Schristos (unit u-branch)))) 177416dce513Schristos 177516dce513Schristos(dnci bsr12 "branch to subroutine (12 bit displacement)" (RELAXABLE) 177616dce513Schristos "bsr $pcrel12a2" 177716dce513Schristos (+ MAJ_11 pcrel12a2 (f-15 1)) 177816dce513Schristos (sequence () 177916dce513Schristos (cg-profile pc pcrel12a2) 178016dce513Schristos (set-vliw-modified-pcrel-offset lp 2 4 8) 178116dce513Schristos (set-vliw-alignment-modified pc pcrel12a2)) 178216dce513Schristos ((mep (unit u-exec) 178316dce513Schristos (unit u-branch)))) 178416dce513Schristos 178516dce513Schristos(dnci bsr24 "branch to subroutine (24 bit displacement)" () 178616dce513Schristos "bsr $pcrel24a2" 178716dce513Schristos (+ MAJ_13 (f-4 1) (f-sub4 9) pcrel24a2) 178816dce513Schristos (sequence () 178916dce513Schristos (cg-profile pc pcrel24a2) 179016dce513Schristos (set-vliw-modified-pcrel-offset lp 4 4 8) 179116dce513Schristos (set-vliw-alignment-modified pc pcrel24a2)) 179216dce513Schristos ((mep (unit u-exec) 179316dce513Schristos (unit u-branch)))) 179416dce513Schristos 179516dce513Schristos(dnci jmp "jump" () 179616dce513Schristos "jmp $rm" 179716dce513Schristos (+ MAJ_1 (f-rn 0) rm (f-sub4 14)) 179816dce513Schristos (sequence () 179916dce513Schristos (if (eq (get-psw.om) 0) 180016dce513Schristos ;; core mode 180116dce513Schristos (if (get-rm.lsb) 180216dce513Schristos (sequence () 180316dce513Schristos (set-psw.om 1) ;; enter VLIW mode 180416dce513Schristos (set-vliw-aliignment-modified-by-option pc rm)) 180516dce513Schristos (set pc (and rm (inv 1)))) 180616dce513Schristos ;; VLIW mode 180716dce513Schristos (if (get-rm.lsb) 180816dce513Schristos (sequence () 180916dce513Schristos (set-psw.om 0) ;; enter core mode 181016dce513Schristos (set pc (and rm (inv 1)))) 181116dce513Schristos (set-vliw-aliignment-modified-by-option pc rm))) 181216dce513Schristos (cg-profile-jump pc rm)) 181316dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 181416dce513Schristos (unit u-exec) 181516dce513Schristos (unit u-branch)))) 181616dce513Schristos 181716dce513Schristos(dnci jmp24 "jump (24 bit target)" () 181816dce513Schristos "jmp $pcabs24a2" 181916dce513Schristos (+ MAJ_13 (f-4 1) (f-sub4 8) pcabs24a2) 182016dce513Schristos (sequence () 182116dce513Schristos (set-vliw-alignment-modified pc (or (and pc #xf0000000) pcabs24a2)) 182216dce513Schristos (cg-profile-jump pc pcabs24a2)) 182316dce513Schristos ((mep (unit u-exec) 182416dce513Schristos (unit u-branch)))) 182516dce513Schristos 182616dce513Schristos(dnci jsr "jump to subroutine" () 182716dce513Schristos "jsr $rm" 182816dce513Schristos (+ MAJ_1 (f-rn 0) rm (f-sub4 15)) 182916dce513Schristos (sequence () 183016dce513Schristos (cg-profile pc rm) 183116dce513Schristos (set-vliw-modified-pcrel-offset lp 2 4 8) 183216dce513Schristos (set-vliw-alignment-modified pc rm)) 183316dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 183416dce513Schristos (unit u-exec) 183516dce513Schristos (unit u-branch)))) 183616dce513Schristos 183716dce513Schristos(dnci ret "return from subroutine" ((STALL RET)) 183816dce513Schristos "ret" 183916dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 0) (f-sub4 2)) 184016dce513Schristos (sequence () 184116dce513Schristos (if (eq (get-psw.om) 0) 184216dce513Schristos ;; core mode 184316dce513Schristos (if (get-lp.ltom) ;; link-pointer "toggle mode" bit 184416dce513Schristos (sequence () 184516dce513Schristos (set-psw.om 1) ;; enter VLIW mode 184616dce513Schristos (set-vliw-aliignment-modified-by-option pc lp)) 184716dce513Schristos (set pc (and lp (inv 1)))) 184816dce513Schristos ;; VLIW mode 184916dce513Schristos (if (get-lp.ltom) ;; link-pointer "toggle mode" bit 185016dce513Schristos (sequence () 185116dce513Schristos (set-psw.om 0) ;; enter VLIW mode 185216dce513Schristos (set pc (and lp (inv 1)))) 185316dce513Schristos (set-vliw-aliignment-modified-by-option pc lp))) 185416dce513Schristos (c-call VOID "notify_ret" pc)) 185516dce513Schristos ((mep (unit u-exec) 185616dce513Schristos (unit u-branch)))) 185716dce513Schristos 185816dce513Schristos 185916dce513Schristos; Repeat instructions. 186016dce513Schristos 186116dce513Schristos(dnci repeat "repeat specified repeat block" () 186216dce513Schristos "repeat $rn,$pcrel17a2" 186316dce513Schristos (+ MAJ_14 rn (f-rm 0) (f-sub4 9) pcrel17a2) 186416dce513Schristos (sequence () 186516dce513Schristos (set-vliw-modified-pcrel-offset (reg h-csr 4) 4 4 8) 186616dce513Schristos (set-vliw-alignment-modified (reg h-csr 5) pcrel17a2) 186716dce513Schristos (set (reg h-csr 6) rn)) 186816dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 186916dce513Schristos (unit u-exec)))) 187016dce513Schristos 187116dce513Schristos(dnci erepeat "endless repeat" () 187216dce513Schristos "erepeat $pcrel17a2" 187316dce513Schristos (+ MAJ_14 (f-rn 0) (f-rm 1) (f-sub4 9) pcrel17a2) 187416dce513Schristos (sequence () 187516dce513Schristos (set-vliw-modified-pcrel-offset (reg h-csr 4) 4 4 8) 187616dce513Schristos (set-vliw-alignment-modified (reg h-csr 5) pcrel17a2) 187716dce513Schristos (set-rpe.elr 1) 187816dce513Schristos ; rpc may be undefined for erepeat 187916dce513Schristos ; use 1 to trigger repeat logic in the sim's main loop 188016dce513Schristos (set (reg h-csr 6) 1)) 188116dce513Schristos ()) 188216dce513Schristos 188316dce513Schristos 188416dce513Schristos; Control instructions. 188516dce513Schristos 188616dce513Schristos;; special store variants 188716dce513Schristos 188816dce513Schristos(dnci stc_lp "store to control register lp" ((STALL STC)) 188916dce513Schristos "stc $rn,\\$lp" 189016dce513Schristos (+ MAJ_7 rn (f-csrn-lo 1) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) 189116dce513Schristos (set lp rn) 189216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 189316dce513Schristos (unit u-store-ctrl-reg (out storereg lp)) 189416dce513Schristos (unit u-exec)))) 189516dce513Schristos 189616dce513Schristos(dnci stc_hi "store to control register hi" ((STALL STC)) 189716dce513Schristos "stc $rn,\\$hi" 189816dce513Schristos (+ MAJ_7 rn (f-csrn-lo 7) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) 189916dce513Schristos (set hi rn) 190016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 190116dce513Schristos (unit u-store-ctrl-reg (out storereg hi)) 190216dce513Schristos (unit u-exec)))) 190316dce513Schristos 190416dce513Schristos(dnci stc_lo "store to control register lo" ((STALL STC)) 190516dce513Schristos "stc $rn,\\$lo" 190616dce513Schristos (+ MAJ_7 rn (f-csrn-lo 8) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 0)) 190716dce513Schristos (set lo rn) 190816dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 190916dce513Schristos (unit u-store-ctrl-reg (out storereg lo)) 191016dce513Schristos (unit u-exec)))) 191116dce513Schristos 191216dce513Schristos;; general store 191316dce513Schristos 191416dce513Schristos(dnci stc "store to control register" (VOLATILE (STALL STC)) 191516dce513Schristos "stc $rn,$csrn" 191616dce513Schristos (+ MAJ_7 rn csrn (f-12 1) (f-13 0) (f-14 0)) 191716dce513Schristos (set csrn rn) 191816dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 191916dce513Schristos (unit u-store-ctrl-reg (out storereg csrn)) 192016dce513Schristos (unit u-exec)))) 192116dce513Schristos 192216dce513Schristos;; special load variants 192316dce513Schristos 192416dce513Schristos(dnci ldc_lp "load from control register lp" ((STALL LDC)) 192516dce513Schristos "ldc $rn,\\$lp" 192616dce513Schristos (+ MAJ_7 rn (f-csrn-lo 1) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) 192716dce513Schristos (set rn lp) 192816dce513Schristos ((mep (unit u-use-ctrl-reg (in usereg lp)) 192916dce513Schristos (unit u-exec) 193016dce513Schristos (unit u-load-gpr (out loadreg rn))))) 193116dce513Schristos 193216dce513Schristos 193316dce513Schristos(dnci ldc_hi "load from control register hi" ((STALL LDC)) 193416dce513Schristos "ldc $rn,\\$hi" 193516dce513Schristos (+ MAJ_7 rn (f-csrn-lo 7) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) 193616dce513Schristos (set rn hi) 193716dce513Schristos ((mep (unit u-use-ctrl-reg (in usereg hi)) 193816dce513Schristos (unit u-exec) 193916dce513Schristos (unit u-load-gpr (out loadreg rn))))) 194016dce513Schristos 194116dce513Schristos(dnci ldc_lo "load from control register lo" ((STALL LDC)) 194216dce513Schristos "ldc $rn,\\$lo" 194316dce513Schristos (+ MAJ_7 rn (f-csrn-lo 8) (f-csrn-hi 0) (f-12 1) (f-13 0) (f-14 1)) 194416dce513Schristos (set rn lo) 194516dce513Schristos ((mep (unit u-use-ctrl-reg (in usereg lo)) 194616dce513Schristos (unit u-exec) 194716dce513Schristos (unit u-load-gpr (out loadreg rn))))) 194816dce513Schristos 194916dce513Schristos;; general load 195016dce513Schristos 195116dce513Schristos(dnci ldc "load from control register" (VOLATILE (STALL LDC) (LATENCY 2)) 195216dce513Schristos "ldc $rn,$csrn" 195316dce513Schristos (+ MAJ_7 rn csrn (f-12 1) (f-13 0) (f-14 1)) 195416dce513Schristos (if (eq (ifield f-csrn) 0) 195516dce513Schristos ;; loading from the pc 195616dce513Schristos (set-vliw-modified-pcrel-offset rn 2 4 8) 195716dce513Schristos ;; loading from something else 195816dce513Schristos (set rn csrn)) 195916dce513Schristos ((mep (unit u-use-ctrl-reg (in usereg csrn)) 196016dce513Schristos (unit u-exec) 196116dce513Schristos (unit u-load-gpr (out loadreg rn))))) 196216dce513Schristos 196316dce513Schristos(dnci di "disable interrupt" (VOLATILE) 196416dce513Schristos "di" 196516dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 0) (f-sub4 0)) 196616dce513Schristos ; clear psw.iec 196716dce513Schristos (set psw (sll (srl psw 1) 1)) 196816dce513Schristos ()) 196916dce513Schristos 197016dce513Schristos(dnci ei "enable interrupt" (VOLATILE) 197116dce513Schristos "ei" 197216dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 0)) 197316dce513Schristos ; set psw.iec 197416dce513Schristos (set psw (or psw 1)) 197516dce513Schristos ()) 197616dce513Schristos 197716dce513Schristos(dnci reti "return from interrupt" ((STALL RET)) 197816dce513Schristos "reti" 197916dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 2)) 198016dce513Schristos (if (eq (get-psw.om) 0) 198116dce513Schristos ;; core operation mode 198216dce513Schristos (if (get-psw.nmi) 198316dce513Schristos ;; return from NMI 198416dce513Schristos (if (get-npc.ntom) 198516dce513Schristos ;; return in VLIW operation mode 198616dce513Schristos (sequence () 198716dce513Schristos (set-psw.om 1) 198816dce513Schristos (set-vliw-aliignment-modified-by-option pc npc) 198916dce513Schristos (set-psw.nmi 0)) 199016dce513Schristos ;; return in core mode 199116dce513Schristos (sequence () 199216dce513Schristos (set pc (and npc (inv 1))) 199316dce513Schristos (set-psw.nmi 0))) 199416dce513Schristos ;; return from non-NMI 199516dce513Schristos (if (get-epc.etom) 199616dce513Schristos ;; return in VLIW mode 199716dce513Schristos (sequence () 199816dce513Schristos (set-psw.om 1) 199916dce513Schristos (set-vliw-aliignment-modified-by-option pc epc) 200016dce513Schristos (set-psw.umc (get-psw.ump)) 200116dce513Schristos (set-psw.iec (get-psw.iep))) 200216dce513Schristos ;; return in core mode 200316dce513Schristos (sequence () 200416dce513Schristos (set pc (and epc (inv 1))) 200516dce513Schristos (set-psw.umc (get-psw.ump)) 200616dce513Schristos (set-psw.iec (get-psw.iep))))) 200716dce513Schristos ;; VLIW operation mode 200816dce513Schristos ;; xxx undefined 200916dce513Schristos (nop)) 201016dce513Schristos ((mep (unit u-exec) 201116dce513Schristos (unit u-branch)))) 201216dce513Schristos 201316dce513Schristos(dnci halt "halt pipeline" (VOLATILE) 201416dce513Schristos "halt" 201516dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 2) (f-sub4 2)) 201616dce513Schristos ; set psw.halt 201716dce513Schristos (set (raw-reg h-csr 16) (or psw (sll 1 11))) 201816dce513Schristos ()) 201916dce513Schristos 202016dce513Schristos(dnci sleep "sleep pipeline" (VOLATILE) 202116dce513Schristos "sleep" 202216dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 6) (f-sub4 2)) 202316dce513Schristos (c-call VOID "do_sleep") 202416dce513Schristos ()) 202516dce513Schristos 202616dce513Schristos(dnci swi "software interrupt" (MAY_TRAP VOLATILE) 202716dce513Schristos "swi $uimm2" 202816dce513Schristos (+ MAJ_7 (f-rn 0) (f-8 0) (f-9 0) uimm2 (f-sub4 6)) 202916dce513Schristos (cond 203016dce513Schristos ((eq uimm2 0) (set exc (or exc (sll 1 4)))) 203116dce513Schristos ((eq uimm2 1) (set exc (or exc (sll 1 5)))) 203216dce513Schristos ((eq uimm2 2) (set exc (or exc (sll 1 6)))) 203316dce513Schristos ((eq uimm2 3) (set exc (or exc (sll 1 7))))) 203416dce513Schristos ()) 203516dce513Schristos 203616dce513Schristos(dnci break "break exception" (MAY_TRAP VOLATILE) 203716dce513Schristos "break" 203816dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 3) (f-sub4 2)) 203916dce513Schristos (set pc (c-call USI "break_exception" pc)) 204016dce513Schristos ((mep (unit u-exec) 204116dce513Schristos (unit u-branch)))) 204216dce513Schristos 204316dce513Schristos(dnci syncm "synchronise with memory" (VOLATILE) 204416dce513Schristos "syncm" 204516dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 1)) 204616dce513Schristos (unimp "syncm") 204716dce513Schristos ()) 204816dce513Schristos 204916dce513Schristos(dnci stcb "store in control bus space" (VOLATILE (STALL STCB)) 205016dce513Schristos "stcb $rn,$uimm16" 205116dce513Schristos (+ MAJ_15 rn (f-rm 0) (f-sub4 4) uimm16) 205216dce513Schristos (c-call VOID "do_stcb" rn uimm16) 205316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 205416dce513Schristos (unit u-exec) 205516dce513Schristos (unit u-stcb)))) 205616dce513Schristos 205716dce513Schristos(dnci ldcb "load from control bus space" (VOLATILE (STALL LDCB) (LATENCY 3)) 205816dce513Schristos "ldcb $rn,$uimm16" 205916dce513Schristos (+ MAJ_15 rn (f-rm 1) (f-sub4 4) uimm16) 206016dce513Schristos (set rn (c-call SI "do_ldcb" uimm16)) 206116dce513Schristos ((mep (unit u-ldcb) 206216dce513Schristos (unit u-exec) 206316dce513Schristos (unit u-ldcb-gpr (out loadreg rn))))) 206416dce513Schristos 206516dce513Schristos 206616dce513Schristos; Bit manipulation instructions. 206716dce513Schristos; The following instructions become the reserved instruction when the 206816dce513Schristos; bit manipulation option is off. 206916dce513Schristos 207016dce513Schristos(dnci bsetm "set bit in memory" (OPTIONAL_BIT_INSN) 207116dce513Schristos "bsetm ($rma),$uimm3" 207216dce513Schristos (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 0)) 207316dce513Schristos (sequence () 207416dce513Schristos (c-call "check_option_bit" pc) 207516dce513Schristos (set (mem UQI rma) (or (mem UQI rma) (sll 1 uimm3)))) 207616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 207716dce513Schristos (unit u-exec)))) 207816dce513Schristos 207916dce513Schristos(dnci bclrm "clear bit in memory" (OPTIONAL_BIT_INSN) 208016dce513Schristos "bclrm ($rma),$uimm3" 208116dce513Schristos (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 1)) 208216dce513Schristos (sequence () 208316dce513Schristos (c-call "check_option_bit" pc) 208416dce513Schristos (set (mem UQI rma) (and (mem UQI rma) (inv (sll 1 uimm3))))) 208516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 208616dce513Schristos (unit u-exec)))) 208716dce513Schristos 208816dce513Schristos(dnci bnotm "toggle bit in memory" (OPTIONAL_BIT_INSN) 208916dce513Schristos "bnotm ($rma),$uimm3" 209016dce513Schristos (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 2)) 209116dce513Schristos (sequence () 209216dce513Schristos (c-call "check_option_bit" pc) 209316dce513Schristos (set (mem UQI rma) (xor (mem UQI rma) (sll 1 uimm3)))) 209416dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 209516dce513Schristos (unit u-exec)))) 209616dce513Schristos 209716dce513Schristos(dnci btstm "test bit in memory" (OPTIONAL_BIT_INSN) 209816dce513Schristos "btstm \\$0,($rma),$uimm3" 209916dce513Schristos (+ MAJ_2 (f-4 0) uimm3 rma (f-sub4 3)) 210016dce513Schristos (sequence () 210116dce513Schristos (c-call "check_option_bit" pc) 210216dce513Schristos (set r0 (zext SI (and UQI (mem UQI rma) (sll 1 uimm3))))) 210316dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 210416dce513Schristos (unit u-exec)))) 210516dce513Schristos 210616dce513Schristos(dnci tas "test and set" (OPTIONAL_BIT_INSN) 210716dce513Schristos "tas $rn,($rma)" 210816dce513Schristos (+ MAJ_2 rn rma (f-sub4 4)) 210916dce513Schristos (sequence ((SI result)) 211016dce513Schristos (c-call "check_option_bit" pc) 211116dce513Schristos (set result (zext SI (mem UQI rma))) 211216dce513Schristos (set (mem UQI rma) 1) 211316dce513Schristos (set rn result)) 211416dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 211516dce513Schristos (unit u-exec)))) 211616dce513Schristos 211716dce513Schristos 211816dce513Schristos; Data cache instruction. 211916dce513Schristos 212016dce513Schristos(dnci cache "cache operations" (VOLATILE) 212116dce513Schristos "cache $cimm4,($rma)" 212216dce513Schristos (+ MAJ_7 cimm4 rma (f-sub4 4)) 212316dce513Schristos (c-call VOID "do_cache" cimm4 rma pc) 212416dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 212516dce513Schristos (unit u-exec)))) 212616dce513Schristos 212716dce513Schristos 212816dce513Schristos; Multiply instructions. 212916dce513Schristos; These instructions become the RI when the 32-bit multiply 213016dce513Schristos; instruction option is off. 213116dce513Schristos 213216dce513Schristos(dnci mul "multiply" (OPTIONAL_MUL_INSN (STALL MUL)) 213316dce513Schristos "mul $rn,$rm" 213416dce513Schristos (+ MAJ_1 rn rm (f-sub4 4)) 213516dce513Schristos (sequence ((DI result)) 213616dce513Schristos (c-call "check_option_mul" pc) 213716dce513Schristos (set result (mul (ext DI rn) (ext DI rm))) 213816dce513Schristos (set hi (subword SI result 0)) 213916dce513Schristos (set lo (subword SI result 1))) 214016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 214116dce513Schristos (unit u-use-gpr (in usereg rm)) 214216dce513Schristos (unit u-exec) 214316dce513Schristos (unit u-multiply)))) 214416dce513Schristos 214516dce513Schristos(dnci mulu "multiply unsigned" (OPTIONAL_MUL_INSN (STALL MUL)) 214616dce513Schristos "mulu $rn,$rm" 214716dce513Schristos (+ MAJ_1 rn rm (f-sub4 5)) 214816dce513Schristos (sequence ((DI result)) 214916dce513Schristos (c-call "check_option_mul" pc) 215016dce513Schristos (set result (mul (zext UDI rn) (zext UDI rm))) 215116dce513Schristos (set hi (subword SI result 0)) 215216dce513Schristos (set lo (subword SI result 1))) 215316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 215416dce513Schristos (unit u-use-gpr (in usereg rm)) 215516dce513Schristos (unit u-exec) 215616dce513Schristos (unit u-multiply)))) 215716dce513Schristos 215816dce513Schristos(dnci mulr "multiply, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) 215916dce513Schristos "mulr $rn,$rm" 216016dce513Schristos (+ MAJ_1 rn rm (f-sub4 6)) 216116dce513Schristos (sequence ((DI result)) 216216dce513Schristos (c-call "check_option_mul" pc) 216316dce513Schristos (set result (mul (ext DI rn) (ext DI rm))) 216416dce513Schristos (set hi (subword SI result 0)) 216516dce513Schristos (set lo (subword SI result 1)) 216616dce513Schristos (set rn (subword SI result 1))) 216716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 216816dce513Schristos (unit u-use-gpr (in usereg rm)) 216916dce513Schristos (unit u-exec) 217016dce513Schristos (unit u-multiply) 217116dce513Schristos (unit u-mul-gpr (out resultreg rn))))) 217216dce513Schristos 217316dce513Schristos(dnci mulru "multiply unsigned, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) 217416dce513Schristos "mulru $rn,$rm" 217516dce513Schristos (+ MAJ_1 rn rm (f-sub4 7)) 217616dce513Schristos (sequence ((DI result)) 217716dce513Schristos (c-call "check_option_mul" pc) 217816dce513Schristos (set result (mul (zext UDI rn) (zext UDI rm))) 217916dce513Schristos (set hi (subword SI result 0)) 218016dce513Schristos (set lo (subword SI result 1)) 218116dce513Schristos (set rn (subword SI result 1))) 218216dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 218316dce513Schristos (unit u-use-gpr (in usereg rm)) 218416dce513Schristos (unit u-exec) 218516dce513Schristos (unit u-multiply) 218616dce513Schristos (unit u-mul-gpr (out resultreg rn))))) 218716dce513Schristos 218816dce513Schristos(dnci madd "multiply accumulate" (OPTIONAL_MUL_INSN (STALL MUL)) 218916dce513Schristos "madd $rn,$rm" 219016dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3004)) 219116dce513Schristos (sequence ((DI result)) 219216dce513Schristos (c-call "check_option_mul" pc) 219316dce513Schristos (set result (or (sll (zext DI hi) 32) (zext DI lo))) 219416dce513Schristos (set result (add result (mul (ext DI rn) (ext DI rm)))) 219516dce513Schristos (set hi (subword SI result 0)) 219616dce513Schristos (set lo (subword SI result 1))) 219716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 219816dce513Schristos (unit u-use-gpr (in usereg rm)) 219916dce513Schristos (unit u-exec) 220016dce513Schristos (unit u-multiply)))) 220116dce513Schristos 220216dce513Schristos(dnci maddu "multiply accumulate unsigned" (OPTIONAL_MUL_INSN (STALL MUL)) 220316dce513Schristos "maddu $rn,$rm" 220416dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3005)) 220516dce513Schristos (sequence ((DI result)) 220616dce513Schristos (c-call "check_option_mul" pc) 220716dce513Schristos (set result (or (sll (zext DI hi) 32) (zext DI lo))) 220816dce513Schristos (set result (add result (mul (zext UDI rn) (zext UDI rm)))) 220916dce513Schristos (set hi (subword SI result 0)) 221016dce513Schristos (set lo (subword SI result 1))) 221116dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 221216dce513Schristos (unit u-use-gpr (in usereg rm)) 221316dce513Schristos (unit u-exec) 221416dce513Schristos (unit u-multiply)))) 221516dce513Schristos 221616dce513Schristos 221716dce513Schristos(dnci maddr "multiply accumulate, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) 221816dce513Schristos "maddr $rn,$rm" 221916dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3006)) 222016dce513Schristos (sequence ((DI result)) 222116dce513Schristos (c-call "check_option_mul" pc) 222216dce513Schristos (set result (or (sll (zext DI hi) 32) (zext DI lo))) 222316dce513Schristos (set result (add result (mul (ext DI rn) (ext DI rm)))) 222416dce513Schristos (set hi (subword SI result 0)) 222516dce513Schristos (set lo (subword SI result 1)) 222616dce513Schristos (set rn (subword SI result 1))) 222716dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 222816dce513Schristos (unit u-use-gpr (in usereg rm)) 222916dce513Schristos (unit u-exec) 223016dce513Schristos (unit u-multiply) 223116dce513Schristos (unit u-mul-gpr (out resultreg rn))))) 223216dce513Schristos 223316dce513Schristos(dnci maddru "multiple accumulate unsigned, lo -> reg" (OPTIONAL_MUL_INSN (STALL MULR) (LATENCY 3)) 223416dce513Schristos "maddru $rn,$rm" 223516dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 #x3007)) 223616dce513Schristos (sequence ((DI result)) 223716dce513Schristos (c-call "check_option_mul" pc) 223816dce513Schristos (set result (or (sll (zext DI hi) 32) (zext DI lo))) 223916dce513Schristos (set result (add result (mul (zext UDI rn) (zext UDI rm)))) 224016dce513Schristos (set hi (subword SI result 0)) 224116dce513Schristos (set lo (subword SI result 1)) 224216dce513Schristos (set rn (subword SI result 1))) 224316dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 224416dce513Schristos (unit u-use-gpr (in usereg rm)) 224516dce513Schristos (unit u-exec) 224616dce513Schristos (unit u-multiply) 224716dce513Schristos (unit u-mul-gpr (out resultreg rn))))) 224816dce513Schristos 224916dce513Schristos 225016dce513Schristos; Divide instructions. 225116dce513Schristos; These instructions become the RI when the 32-bit divide instruction 225216dce513Schristos; option is off. 225316dce513Schristos 225416dce513Schristos(dnci div "divide" (OPTIONAL_DIV_INSN (STALL DIV) (LATENCY 34) MAY_TRAP) 225516dce513Schristos "div $rn,$rm" 225616dce513Schristos (+ MAJ_1 rn rm (f-sub4 8)) 225716dce513Schristos (sequence () 225816dce513Schristos (c-call "check_option_div" pc) 225916dce513Schristos (if (eq rm 0) 226016dce513Schristos (set pc (c-call USI "zdiv_exception" pc)) 226116dce513Schristos ; Special case described on p. 76. 226216dce513Schristos (if (and (eq rn #x80000000) 226316dce513Schristos (eq rm #xffffffff)) 226416dce513Schristos (sequence () 226516dce513Schristos (set lo #x80000000) 226616dce513Schristos (set hi 0)) 226716dce513Schristos (sequence () 226816dce513Schristos (set lo (div rn rm)) 226916dce513Schristos (set hi (mod rn rm)))))) 227016dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 227116dce513Schristos (unit u-use-gpr (in usereg rm)) 227216dce513Schristos (unit u-exec) 227316dce513Schristos (unit u-divide) 227416dce513Schristos (unit u-branch)))) 227516dce513Schristos 227616dce513Schristos(dnci divu "divide unsigned" (OPTIONAL_DIV_INSN (STALL DIV) (LATENCY 34) MAY_TRAP) 227716dce513Schristos "divu $rn,$rm" 227816dce513Schristos (+ MAJ_1 rn rm (f-sub4 9)) 227916dce513Schristos (sequence () 228016dce513Schristos (c-call "check_option_div" pc) 228116dce513Schristos (if (eq rm 0) 228216dce513Schristos (set pc (c-call USI "zdiv_exception" pc)) 228316dce513Schristos (sequence () 228416dce513Schristos (set lo (udiv rn rm)) 228516dce513Schristos (set hi (umod rn rm))))) 228616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 228716dce513Schristos (unit u-use-gpr (in usereg rm)) 228816dce513Schristos (unit u-exec) 228916dce513Schristos (unit u-divide) 229016dce513Schristos (unit u-branch)))) 229116dce513Schristos 229216dce513Schristos 229316dce513Schristos; Debug functions. 229416dce513Schristos; These instructions become the RI when the debug function option is 229516dce513Schristos; off. 229616dce513Schristos 229716dce513Schristos(dnci dret "return from debug exception" (OPTIONAL_DEBUG_INSN) 229816dce513Schristos "dret" 229916dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 1) (f-sub4 3)) 230016dce513Schristos (sequence () 230116dce513Schristos (c-call "check_option_debug" pc) 230216dce513Schristos ; set DBG.DM. 230316dce513Schristos (set dbg (and dbg (inv (sll SI 1 15)))) 230416dce513Schristos (set pc depc)) 230516dce513Schristos ((mep (unit u-exec) 230616dce513Schristos (unit u-branch)))) 230716dce513Schristos 230816dce513Schristos(dnci dbreak "generate debug exception" (OPTIONAL_DEBUG_INSN MAY_TRAP VOLATILE) 230916dce513Schristos "dbreak" 231016dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 3) (f-sub4 3)) 231116dce513Schristos (sequence () 231216dce513Schristos (c-call "check_option_debug" pc) 231316dce513Schristos ; set DBG.DPB. 231416dce513Schristos (set dbg (or dbg 1))) 231516dce513Schristos ()) 231616dce513Schristos 231716dce513Schristos 231816dce513Schristos; Leading zero instruction. 231916dce513Schristos 232016dce513Schristos(dnci ldz "leading zeroes" (OPTIONAL_LDZ_INSN (STALL INT2)) 232116dce513Schristos "ldz $rn,$rm" 232216dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 0)) 232316dce513Schristos (sequence () 232416dce513Schristos (c-call "check_option_ldz" pc) 232516dce513Schristos (set rn (c-call SI "do_ldz" rm))) 232616dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 232716dce513Schristos (unit u-exec)))) 232816dce513Schristos 232916dce513Schristos 233016dce513Schristos; Absolute difference instruction. 233116dce513Schristos 233216dce513Schristos(dnci abs "absolute difference" (OPTIONAL_ABS_INSN (STALL INT2)) 233316dce513Schristos "abs $rn,$rm" 233416dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 3)) 233516dce513Schristos (sequence () 233616dce513Schristos (c-call "check_option_abs" pc) 233716dce513Schristos (set rn (abs (sub rn rm)))) 233816dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 233916dce513Schristos (unit u-use-gpr (in usereg rn)) 234016dce513Schristos (unit u-exec)))) 234116dce513Schristos 234216dce513Schristos 234316dce513Schristos; Average instruction. 234416dce513Schristos 234516dce513Schristos(dnci ave "average" (OPTIONAL_AVE_INSN (STALL INT2)) 234616dce513Schristos "ave $rn,$rm" 234716dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 2)) 234816dce513Schristos (sequence () 234916dce513Schristos (c-call "check_option_ave" pc) 235016dce513Schristos (set rn (sra (add (add rn rm) 1) 1))) 235116dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 235216dce513Schristos (unit u-use-gpr (in usereg rn)) 235316dce513Schristos (unit u-exec)))) 235416dce513Schristos 235516dce513Schristos 235616dce513Schristos; MIN/MAX instructions. 235716dce513Schristos 235816dce513Schristos(dnci min "minimum" (OPTIONAL_MINMAX_INSN (STALL INT2)) 235916dce513Schristos "min $rn,$rm" 236016dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 4)) 236116dce513Schristos (sequence () 236216dce513Schristos (c-call "check_option_minmax" pc) 236316dce513Schristos (if (gt rn rm) 236416dce513Schristos (set rn rm))) 236516dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 236616dce513Schristos (unit u-use-gpr (in usereg rn)) 236716dce513Schristos (unit u-exec)))) 236816dce513Schristos 236916dce513Schristos(dnci max "maximum" (OPTIONAL_MINMAX_INSN (STALL INT2)) 237016dce513Schristos "max $rn,$rm" 237116dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 5)) 237216dce513Schristos (sequence () 237316dce513Schristos (c-call "check_option_minmax" pc) 237416dce513Schristos (if (lt rn rm) 237516dce513Schristos (set rn rm))) 237616dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 237716dce513Schristos (unit u-use-gpr (in usereg rn)) 237816dce513Schristos (unit u-exec)))) 237916dce513Schristos 238016dce513Schristos(dnci minu "minimum unsigned" (OPTIONAL_MINMAX_INSN (STALL INT2)) 238116dce513Schristos "minu $rn,$rm" 238216dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 6)) 238316dce513Schristos (sequence () 238416dce513Schristos (c-call "check_option_minmax" pc) 238516dce513Schristos (if (gtu rn rm) 238616dce513Schristos (set rn rm))) 238716dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 238816dce513Schristos (unit u-use-gpr (in usereg rn)) 238916dce513Schristos (unit u-exec)))) 239016dce513Schristos 239116dce513Schristos(dnci maxu "maximum unsigned" (OPTIONAL_MINMAX_INSN (STALL INT2)) 239216dce513Schristos "maxu $rn,$rm" 239316dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 7)) 239416dce513Schristos (sequence () 239516dce513Schristos (c-call "check_option_minmax" pc) 239616dce513Schristos (if (ltu rn rm) 239716dce513Schristos (set rn rm))) 239816dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 239916dce513Schristos (unit u-use-gpr (in usereg rn)) 240016dce513Schristos (unit u-exec)))) 240116dce513Schristos 240216dce513Schristos 240316dce513Schristos; Clipping instruction. 240416dce513Schristos 240516dce513Schristos(dnci clip "clip" (OPTIONAL_CLIP_INSN (STALL INT2)) 240616dce513Schristos "clip $rn,$cimm5" 240716dce513Schristos (+ MAJ_15 rn (f-rm 0) (f-sub4 1) (f-ext #x10) cimm5 (f-29 0) (f-30 0) (f-31 0)) 240816dce513Schristos (sequence ((SI min) (SI max)) 240916dce513Schristos (c-call "check_option_clip" pc) 241016dce513Schristos (set max (sub (sll 1 (sub cimm5 1)) 1)) 241116dce513Schristos (set min (neg (sll 1 (sub cimm5 1)))) 241216dce513Schristos (cond 241316dce513Schristos ((eq cimm5 0) (set rn 0)) 241416dce513Schristos ((gt rn max) (set rn max)) 241516dce513Schristos ((lt rn min) (set rn min)))) 241616dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 241716dce513Schristos (unit u-exec)))) 241816dce513Schristos 241916dce513Schristos(dnci clipu "clip unsigned" (OPTIONAL_CLIP_INSN (STALL INT2)) 242016dce513Schristos "clipu $rn,$cimm5" 242116dce513Schristos (+ MAJ_15 rn (f-rm 0) (f-sub4 1) (f-ext #x10) cimm5 (f-29 0) (f-30 0) (f-31 1)) 242216dce513Schristos (sequence ((SI max)) 242316dce513Schristos (c-call "check_option_clip" pc) 242416dce513Schristos (set max (sub (sll 1 cimm5) 1)) 242516dce513Schristos (cond 242616dce513Schristos ((eq cimm5 0) (set rn 0)) 242716dce513Schristos ((gt rn max) (set rn max)) 242816dce513Schristos ((lt rn 0) (set rn 0)))) 242916dce513Schristos ((mep (unit u-use-gpr (in usereg rn)) 243016dce513Schristos (unit u-exec)))) 243116dce513Schristos 243216dce513Schristos 243316dce513Schristos; Saturation instructions. 243416dce513Schristos 243516dce513Schristos(dnci sadd "saturating addition" (OPTIONAL_SAT_INSN (STALL INT2)) 243616dce513Schristos "sadd $rn,$rm" 243716dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 8)) 243816dce513Schristos (sequence () 243916dce513Schristos (c-call "check_option_sat" pc) 244016dce513Schristos (if (add-oflag rn rm 0) 244116dce513Schristos (if (nflag rn) 244216dce513Schristos ; underflow 244316dce513Schristos (set rn (neg (sll 1 31))) 244416dce513Schristos ; overflow 244516dce513Schristos (set rn (sub (sll 1 31) 1))) 244616dce513Schristos (set rn (add rn rm)))) 244716dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 244816dce513Schristos (unit u-use-gpr (in usereg rn)) 244916dce513Schristos (unit u-exec)))) 245016dce513Schristos 245116dce513Schristos(dnci ssub "saturating subtraction" (OPTIONAL_SAT_INSN (STALL INT2)) 245216dce513Schristos "ssub $rn,$rm" 245316dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 10)) 245416dce513Schristos (sequence () 245516dce513Schristos (c-call "check_option_sat" pc) 245616dce513Schristos (if (sub-oflag rn rm 0) 245716dce513Schristos (if (nflag rn) 245816dce513Schristos ; underflow 245916dce513Schristos (set rn (neg (sll 1 31))) 246016dce513Schristos ; overflow 246116dce513Schristos (set rn (sub (sll 1 31) 1))) 246216dce513Schristos (set rn (sub rn rm)))) 246316dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 246416dce513Schristos (unit u-use-gpr (in usereg rn)) 246516dce513Schristos (unit u-exec)))) 246616dce513Schristos 246716dce513Schristos(dnci saddu "saturating unsigned addition" (OPTIONAL_SAT_INSN (STALL INT2)) 246816dce513Schristos "saddu $rn,$rm" 246916dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 9)) 247016dce513Schristos (sequence () 247116dce513Schristos (c-call "check_option_sat" pc) 247216dce513Schristos (if (add-cflag rn rm 0) 247316dce513Schristos (set rn (inv 0)) 247416dce513Schristos (set rn (add rn rm)))) 247516dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 247616dce513Schristos (unit u-use-gpr (in usereg rn)) 247716dce513Schristos (unit u-exec)))) 247816dce513Schristos 247916dce513Schristos(dnci ssubu "saturating unsigned subtraction" (OPTIONAL_SAT_INSN (STALL INT2)) 248016dce513Schristos "ssubu $rn,$rm" 248116dce513Schristos (+ MAJ_15 rn rm (f-sub4 1) (f-16u16 11)) 248216dce513Schristos (sequence () 248316dce513Schristos (c-call "check_option_sat" pc) 248416dce513Schristos (if (sub-cflag rn rm 0) 248516dce513Schristos (set rn 0) 248616dce513Schristos (set rn (sub rn rm)))) 248716dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 248816dce513Schristos (unit u-use-gpr (in usereg rn)) 248916dce513Schristos (unit u-exec)))) 249016dce513Schristos 249116dce513Schristos 249216dce513Schristos; UCI and DSP options are defined in an external file. 249316dce513Schristos; See `mep-sample-ucidsp.cpu' for a sample. 249416dce513Schristos 249516dce513Schristos 249616dce513Schristos; Coprocessor instructions. 249716dce513Schristos 249816dce513Schristos(dnci swcp "store word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) 249916dce513Schristos "swcp $crn,($rma)" 250016dce513Schristos (+ MAJ_3 crn rma (f-sub4 8)) 250116dce513Schristos (sequence () 250216dce513Schristos (c-call "check_option_cp" pc) 250316dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 3))) 250416dce513Schristos (set (mem SI (and rma (inv SI 3))) crn)) 250516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 250616dce513Schristos (unit u-exec)))) 250716dce513Schristos 250816dce513Schristos(dnci lwcp "load word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) 250916dce513Schristos "lwcp $crn,($rma)" 251016dce513Schristos (+ MAJ_3 crn rma (f-sub4 9)) 251116dce513Schristos (sequence () 251216dce513Schristos (c-call "check_option_cp" pc) 251316dce513Schristos (set crn (mem SI (and rma (inv SI 3))))) 251416dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 251516dce513Schristos (unit u-exec)))) 251616dce513Schristos 251716dce513Schristos(dnci smcp "smcp" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) 251816dce513Schristos "smcp $crn64,($rma)" 251916dce513Schristos (+ MAJ_3 crn64 rma (f-sub4 10)) 252016dce513Schristos (sequence () 252116dce513Schristos (c-call "check_option_cp" pc) 252216dce513Schristos (c-call "check_option_cp64" pc) 252316dce513Schristos (c-call VOID "check_write_to_text" rma) 252416dce513Schristos (c-call "do_smcp" rma crn64 pc)) 252516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 252616dce513Schristos (unit u-exec)))) 252716dce513Schristos 252816dce513Schristos(dnci lmcp "lmcp" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) 252916dce513Schristos "lmcp $crn64,($rma)" 253016dce513Schristos (+ MAJ_3 crn64 rma (f-sub4 11)) 253116dce513Schristos (sequence () 253216dce513Schristos (c-call "check_option_cp" pc) 253316dce513Schristos (c-call "check_option_cp64" pc) 253416dce513Schristos (set crn64 (c-call DI "do_lmcp" rma pc))) 253516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 253616dce513Schristos (unit u-exec)))) 253716dce513Schristos 253816dce513Schristos(dnci swcpi "swcp (post-increment)" (OPTIONAL_CP_INSN (STALL STORE)) 253916dce513Schristos "swcpi $crn,($rma+)" 254016dce513Schristos (+ MAJ_3 crn rma (f-sub4 0)) 254116dce513Schristos (sequence () 254216dce513Schristos (c-call "check_option_cp" pc) 254316dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 3))) 254416dce513Schristos (set (mem SI (and rma (inv SI 3))) crn) 254516dce513Schristos (set rma (add rma 4))) 254616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 254716dce513Schristos (unit u-exec)))) 254816dce513Schristos 254916dce513Schristos(dnci lwcpi "lwcp (post-increment)" (OPTIONAL_CP_INSN (STALL LOAD)) 255016dce513Schristos "lwcpi $crn,($rma+)" 255116dce513Schristos (+ MAJ_3 crn rma (f-sub4 1)) 255216dce513Schristos (sequence () 255316dce513Schristos (c-call "check_option_cp" pc) 255416dce513Schristos (set crn (mem SI (and rma (inv SI 3)))) 255516dce513Schristos (set rma (add rma 4))) 255616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 255716dce513Schristos (unit u-exec)))) 255816dce513Schristos 255916dce513Schristos(dnci smcpi "smcp (post-increment)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) 256016dce513Schristos "smcpi $crn64,($rma+)" 256116dce513Schristos (+ MAJ_3 crn64 rma (f-sub4 2)) 256216dce513Schristos (sequence () 256316dce513Schristos (c-call "check_option_cp" pc) 256416dce513Schristos (c-call "check_option_cp64" pc) 256516dce513Schristos (c-call VOID "check_write_to_text" rma) 256616dce513Schristos (c-call "do_smcpi" (index-of rma) crn64 pc) 256716dce513Schristos (set rma rma)) ; reference as output for intrinsic generation 256816dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 256916dce513Schristos (unit u-exec)))) 257016dce513Schristos 257116dce513Schristos(dnci lmcpi "lmcp (post-increment)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) 257216dce513Schristos "lmcpi $crn64,($rma+)" 257316dce513Schristos (+ MAJ_3 crn64 rma (f-sub4 3)) 257416dce513Schristos (sequence () 257516dce513Schristos (c-call "check_option_cp" pc) 257616dce513Schristos (c-call "check_option_cp64" pc) 257716dce513Schristos (set crn64 (c-call DI "do_lmcpi" (index-of rma) pc)) 257816dce513Schristos (set rma rma)) ; reference as output for intrinsic generation 257916dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 258016dce513Schristos (unit u-exec)))) 258116dce513Schristos 258216dce513Schristos(dnci swcp16 "swcp (16-bit displacement)" (OPTIONAL_CP_INSN (STALL STORE)) 258316dce513Schristos "swcp $crn,$sdisp16($rma)" 258416dce513Schristos (+ MAJ_15 crn rma (f-sub4 12) sdisp16) 258516dce513Schristos (sequence () 258616dce513Schristos (c-call "check_option_cp" pc) 258716dce513Schristos (set (mem SI (and (add rma sdisp16) (inv SI 3))) crn)) 258816dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 258916dce513Schristos (unit u-exec)))) 259016dce513Schristos 259116dce513Schristos(dnci lwcp16 "lwcp (16-bit displacement)" (OPTIONAL_CP_INSN (STALL LOAD)) 259216dce513Schristos "lwcp $crn,$sdisp16($rma)" 259316dce513Schristos (+ MAJ_15 crn rma (f-sub4 13) sdisp16) 259416dce513Schristos (sequence () 259516dce513Schristos (c-call "check_option_cp" pc) 259616dce513Schristos (set crn (mem SI (and (add rma sdisp16) (inv SI 3))))) 259716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 259816dce513Schristos (unit u-exec)))) 259916dce513Schristos 260016dce513Schristos(dnci smcp16 "smcp (16-bit displacement)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) 260116dce513Schristos "smcp $crn64,$sdisp16($rma)" 260216dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 14) sdisp16) 260316dce513Schristos (sequence () 260416dce513Schristos (c-call "check_option_cp" pc) 260516dce513Schristos (c-call "check_option_cp64" pc) 260616dce513Schristos (c-call "do_smcp16" rma sdisp16 crn64 pc)) 260716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 260816dce513Schristos (unit u-exec)))) 260916dce513Schristos 261016dce513Schristos(dnci lmcp16 "lmcp (16-bit displacement)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) 261116dce513Schristos "lmcp $crn64,$sdisp16($rma)" 261216dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 15) sdisp16) 261316dce513Schristos (sequence () 261416dce513Schristos (c-call "check_option_cp" pc) 261516dce513Schristos (c-call "check_option_cp64" pc) 261616dce513Schristos (set crn64 (c-call DI "do_lmcp16" rma sdisp16 pc))) 261716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 261816dce513Schristos (unit u-exec)))) 261916dce513Schristos 262016dce513Schristos(dnci sbcpa "store byte coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) 262116dce513Schristos "sbcpa $crn,($rma+),$cdisp10" 262216dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 0) (f-ext62 0) cdisp10) 262316dce513Schristos (sequence () 262416dce513Schristos (c-call "check_option_cp" pc) 262516dce513Schristos (c-call VOID "check_write_to_text" rma) 262616dce513Schristos (set (mem QI rma) (and crn #xff)) 262716dce513Schristos (set rma (add rma (ext SI cdisp10)))) 262816dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 262916dce513Schristos (unit u-exec)))) 263016dce513Schristos 263116dce513Schristos(dnci lbcpa "load byte coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) 263216dce513Schristos "lbcpa $crn,($rma+),$cdisp10" 263316dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x0) cdisp10) 263416dce513Schristos (sequence () 263516dce513Schristos (c-call "check_option_cp" pc) 263616dce513Schristos (set crn (ext SI (mem QI rma))) 263716dce513Schristos (set rma (add rma (ext SI cdisp10)))) 263816dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 263916dce513Schristos (unit u-exec)))) 264016dce513Schristos 264116dce513Schristos(dnci shcpa "store half-word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) 264216dce513Schristos "shcpa $crn,($rma+),$cdisp10a2" 264316dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x0) cdisp10a2) 264416dce513Schristos (sequence () 264516dce513Schristos (c-call "check_option_cp" pc) 264616dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 1))) 264716dce513Schristos (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) 264816dce513Schristos (set rma (add rma (ext SI cdisp10a2)))) 264916dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 265016dce513Schristos (unit u-exec)))) 265116dce513Schristos 265216dce513Schristos(dnci lhcpa "load half-word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) 265316dce513Schristos "lhcpa $crn,($rma+),$cdisp10a2" 265416dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x0) cdisp10a2) 265516dce513Schristos (sequence () 265616dce513Schristos (c-call "check_option_cp" pc) 265716dce513Schristos (set crn (ext SI (mem HI (and rma (inv SI 1))))) 265816dce513Schristos (set rma (add rma (ext SI cdisp10a2)))) 265916dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 266016dce513Schristos (unit u-exec)))) 266116dce513Schristos 266216dce513Schristos(dnci swcpa "store word coprocessor" (OPTIONAL_CP_INSN (STALL STORE)) 266316dce513Schristos "swcpa $crn,($rma+),$cdisp10a4" 266416dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x0) cdisp10a4) 266516dce513Schristos (sequence () 266616dce513Schristos (c-call "check_option_cp" pc) 266716dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 3))) 266816dce513Schristos (set (mem SI (and rma (inv SI 3))) crn) 266916dce513Schristos (set rma (add rma (ext SI cdisp10a4)))) 267016dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 267116dce513Schristos (unit u-exec)))) 267216dce513Schristos 267316dce513Schristos(dnci lwcpa "load word coprocessor" (OPTIONAL_CP_INSN (STALL LOAD)) 267416dce513Schristos "lwcpa $crn,($rma+),$cdisp10a4" 267516dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x0) cdisp10a4) 267616dce513Schristos (sequence () 267716dce513Schristos (c-call "check_option_cp" pc) 267816dce513Schristos (set crn (mem SI (and rma (inv SI 3)))) 267916dce513Schristos (set rma (add rma (ext SI cdisp10a4)))) 268016dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 268116dce513Schristos (unit u-exec)))) 268216dce513Schristos 268316dce513Schristos(dnci smcpa "smcpa" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL STORE)) 268416dce513Schristos "smcpa $crn64,($rma+),$cdisp10a8" 268516dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x0) cdisp10a8) 268616dce513Schristos (sequence () 268716dce513Schristos (c-call "check_option_cp" pc) 268816dce513Schristos (c-call "check_option_cp64" pc) 268916dce513Schristos (c-call VOID "check_write_to_text" rma) 269016dce513Schristos (c-call "do_smcpa" (index-of rma) cdisp10a8 crn64 pc) 269116dce513Schristos (set rma rma)) ; reference as output for intrinsic generation 269216dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 269316dce513Schristos (unit u-exec)))) 269416dce513Schristos 269516dce513Schristos(dnci lmcpa "lmcpa" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN (STALL LOAD)) 269616dce513Schristos "lmcpa $crn64,($rma+),$cdisp10a8" 269716dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x0) cdisp10a8) 269816dce513Schristos (sequence () 269916dce513Schristos (c-call "check_option_cp" pc) 270016dce513Schristos (c-call "check_option_cp64" pc) 270116dce513Schristos (set crn64 (c-call DI "do_lmcpa" (index-of rma) cdisp10a8 pc)) 270216dce513Schristos (set rma rma)) ; reference as output for intrinsic generation 270316dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 270416dce513Schristos (unit u-exec)))) 270516dce513Schristos 270616dce513Schristos 270716dce513Schristos(dnci sbcpm0 "sbcpm0" (OPTIONAL_CP_INSN) 270816dce513Schristos "sbcpm0 $crn,($rma+),$cdisp10" 270916dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x0) (f-ext62 #x2) cdisp10) 271016dce513Schristos (sequence () 271116dce513Schristos (c-call "check_option_cp" pc) 271216dce513Schristos (c-call VOID "check_write_to_text" rma) 271316dce513Schristos (set (mem QI rma) (and crn #xff)) 271416dce513Schristos (set rma (mod0 cdisp10))) 271516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 271616dce513Schristos (unit u-exec)))) 271716dce513Schristos 271816dce513Schristos(dnci lbcpm0 "lbcpm0" (OPTIONAL_CP_INSN) 271916dce513Schristos "lbcpm0 $crn,($rma+),$cdisp10" 272016dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x2) cdisp10) 272116dce513Schristos (sequence () 272216dce513Schristos (c-call "check_option_cp" pc) 272316dce513Schristos (set crn (ext SI (mem QI rma))) 272416dce513Schristos (set rma (mod0 cdisp10))) 272516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 272616dce513Schristos (unit u-exec)))) 272716dce513Schristos 272816dce513Schristos(dnci shcpm0 "shcpm0" (OPTIONAL_CP_INSN) 272916dce513Schristos "shcpm0 $crn,($rma+),$cdisp10a2" 273016dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x2) cdisp10a2) 273116dce513Schristos (sequence () 273216dce513Schristos (c-call "check_option_cp" pc) 273316dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 1))) 273416dce513Schristos (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) 273516dce513Schristos (set rma (mod0 cdisp10a2))) 273616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 273716dce513Schristos (unit u-exec)))) 273816dce513Schristos 273916dce513Schristos(dnci lhcpm0 "lhcpm0" (OPTIONAL_CP_INSN) 274016dce513Schristos "lhcpm0 $crn,($rma+),$cdisp10a2" 274116dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x2) cdisp10a2) 274216dce513Schristos (sequence () 274316dce513Schristos (c-call "check_option_cp" pc) 274416dce513Schristos (set crn (ext SI (mem HI (and rma (inv SI 1))))) 274516dce513Schristos (set rma (mod0 cdisp10a2))) 274616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 274716dce513Schristos (unit u-exec)))) 274816dce513Schristos 274916dce513Schristos(dnci swcpm0 "swcpm0" (OPTIONAL_CP_INSN) 275016dce513Schristos "swcpm0 $crn,($rma+),$cdisp10a4" 275116dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x2) cdisp10a4) 275216dce513Schristos (sequence () 275316dce513Schristos (c-call "check_option_cp" pc) 275416dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 3))) 275516dce513Schristos (set (mem SI (and rma (inv SI 3))) crn) 275616dce513Schristos (set rma (mod0 cdisp10a4))) 275716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 275816dce513Schristos (unit u-exec)))) 275916dce513Schristos 276016dce513Schristos(dnci lwcpm0 "lwcpm0" (OPTIONAL_CP_INSN) 276116dce513Schristos "lwcpm0 $crn,($rma+),$cdisp10a4" 276216dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x2) cdisp10a4) 276316dce513Schristos (sequence () 276416dce513Schristos (c-call "check_option_cp" pc) 276516dce513Schristos (set crn (mem SI (and rma (inv SI 3)))) 276616dce513Schristos (set rma (mod0 cdisp10a4))) 276716dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 276816dce513Schristos (unit u-exec)))) 276916dce513Schristos 277016dce513Schristos(dnci smcpm0 "smcpm0" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) 277116dce513Schristos "smcpm0 $crn64,($rma+),$cdisp10a8" 277216dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x2) cdisp10a8) 277316dce513Schristos (sequence () 277416dce513Schristos (c-call "check_option_cp" pc) 277516dce513Schristos (c-call "check_option_cp64" pc) 277616dce513Schristos (c-call VOID "check_write_to_text" rma) 277716dce513Schristos (c-call "do_smcp" rma crn64 pc) 277816dce513Schristos (set rma (mod0 cdisp10a8))) 277916dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 278016dce513Schristos (unit u-exec)))) 278116dce513Schristos 278216dce513Schristos(dnci lmcpm0 "lmcpm0" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) 278316dce513Schristos "lmcpm0 $crn64,($rma+),$cdisp10a8" 278416dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x2) cdisp10a8) 278516dce513Schristos (sequence () 278616dce513Schristos (c-call "check_option_cp" pc) 278716dce513Schristos (c-call "check_option_cp64" pc) 278816dce513Schristos (set crn64 (c-call DI "do_lmcp" rma pc)) 278916dce513Schristos (set rma (mod0 cdisp10a8))) 279016dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 279116dce513Schristos (unit u-exec)))) 279216dce513Schristos 279316dce513Schristos(dnci sbcpm1 "sbcpm1" (OPTIONAL_CP_INSN) 279416dce513Schristos "sbcpm1 $crn,($rma+),$cdisp10" 279516dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x0) (f-ext62 #x3) cdisp10) 279616dce513Schristos (sequence () 279716dce513Schristos (c-call "check_option_cp" pc) 279816dce513Schristos (c-call VOID "check_write_to_text" rma) 279916dce513Schristos (set (mem QI rma) (and crn #xff)) 280016dce513Schristos (set rma (mod1 cdisp10))) 280116dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 280216dce513Schristos (unit u-exec)))) 280316dce513Schristos 280416dce513Schristos(dnci lbcpm1 "lbcpm1" (OPTIONAL_CP_INSN) 280516dce513Schristos "lbcpm1 $crn,($rma+),$cdisp10" 280616dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x4) (f-ext62 #x3) cdisp10) 280716dce513Schristos (sequence () 280816dce513Schristos (c-call "check_option_cp" pc) 280916dce513Schristos (set crn (ext SI (mem QI rma))) 281016dce513Schristos (set rma (mod1 cdisp10))) 281116dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 281216dce513Schristos (unit u-exec)))) 281316dce513Schristos 281416dce513Schristos(dnci shcpm1 "shcpm1" (OPTIONAL_CP_INSN) 281516dce513Schristos "shcpm1 $crn,($rma+),$cdisp10a2" 281616dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x1) (f-ext62 #x3) cdisp10a2) 281716dce513Schristos (sequence () 281816dce513Schristos (c-call "check_option_cp" pc) 281916dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 1))) 282016dce513Schristos (set (mem HI (and rma (inv SI 1))) (and crn #xffff)) 282116dce513Schristos (set rma (mod1 cdisp10a2))) 282216dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 282316dce513Schristos (unit u-exec)))) 282416dce513Schristos 282516dce513Schristos(dnci lhcpm1 "lhcpm1" (OPTIONAL_CP_INSN) 282616dce513Schristos "lhcpm1 $crn,($rma+),$cdisp10a2" 282716dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x5) (f-ext62 #x3) cdisp10a2) 282816dce513Schristos (sequence () 282916dce513Schristos (c-call "check_option_cp" pc) 283016dce513Schristos (set crn (ext SI (mem HI (and rma (inv SI 1))))) 283116dce513Schristos (set rma (mod1 cdisp10a2))) 283216dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 283316dce513Schristos (unit u-exec)))) 283416dce513Schristos 283516dce513Schristos(dnci swcpm1 "swcpm1" (OPTIONAL_CP_INSN) 283616dce513Schristos "swcpm1 $crn,($rma+),$cdisp10a4" 283716dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x2) (f-ext62 #x3) cdisp10a4) 283816dce513Schristos (sequence () 283916dce513Schristos (c-call "check_option_cp" pc) 284016dce513Schristos (c-call VOID "check_write_to_text" (and rma (inv SI 3))) 284116dce513Schristos (set (mem SI (and rma (inv SI 3))) crn) 284216dce513Schristos (set rma (mod1 cdisp10a4))) 284316dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 284416dce513Schristos (unit u-exec)))) 284516dce513Schristos 284616dce513Schristos(dnci lwcpm1 "lwcpm1" (OPTIONAL_CP_INSN) 284716dce513Schristos "lwcpm1 $crn,($rma+),$cdisp10a4" 284816dce513Schristos (+ MAJ_15 crn rma (f-sub4 5) (f-ext4 #x6) (f-ext62 #x3) cdisp10a4) 284916dce513Schristos (sequence () 285016dce513Schristos (c-call "check_option_cp" pc) 285116dce513Schristos (set crn (ext SI (mem SI (and rma (inv SI 3))))) 285216dce513Schristos (set rma (mod1 cdisp10a4))) 285316dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 285416dce513Schristos (unit u-exec)))) 285516dce513Schristos 285616dce513Schristos(dnci smcpm1 "smcpm1" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) 285716dce513Schristos "smcpm1 $crn64,($rma+),$cdisp10a8" 285816dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x3) (f-ext62 #x3) cdisp10a8) 285916dce513Schristos (sequence () 286016dce513Schristos (c-call "check_option_cp" pc) 286116dce513Schristos (c-call "check_option_cp64" pc) 286216dce513Schristos (c-call "do_smcp" rma crn64 pc) 286316dce513Schristos (c-call VOID "check_write_to_text" rma) 286416dce513Schristos (set rma (mod1 cdisp10a8))) 286516dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 286616dce513Schristos (unit u-exec)))) 286716dce513Schristos 286816dce513Schristos(dnci lmcpm1 "lmcpm1" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN) 286916dce513Schristos "lmcpm1 $crn64,($rma+),$cdisp10a8" 287016dce513Schristos (+ MAJ_15 crn64 rma (f-sub4 5) (f-ext4 #x7) (f-ext62 #x3) cdisp10a8) 287116dce513Schristos (sequence () 287216dce513Schristos (c-call "check_option_cp" pc) 287316dce513Schristos (c-call "check_option_cp64" pc) 287416dce513Schristos (set crn64 (c-call DI "do_lmcp" rma pc)) 287516dce513Schristos (set rma (mod1 cdisp10a8))) 287616dce513Schristos ((mep (unit u-use-gpr (in usereg rma)) 287716dce513Schristos (unit u-exec)))) 287816dce513Schristos 287916dce513Schristos(dnop cp_flag "branch condition register" (all-mep-isas) h-ccr 1) 288016dce513Schristos 288116dce513Schristos(dnci bcpeq "branch coprocessor equal" (OPTIONAL_CP_INSN RELAXABLE) 288216dce513Schristos "bcpeq $cccc,$pcrel17a2" 288316dce513Schristos (+ MAJ_13 (f-rn 8) cccc (f-sub4 4) pcrel17a2) 288416dce513Schristos (sequence () 288516dce513Schristos (c-call "check_option_cp" pc) 288616dce513Schristos (if (eq (xor cccc cp_flag) 0) 288716dce513Schristos (set-vliw-alignment-modified pc pcrel17a2))) 288816dce513Schristos ()) 288916dce513Schristos 289016dce513Schristos(dnci bcpne "branch coprocessor not equal" (OPTIONAL_CP_INSN RELAXABLE) 289116dce513Schristos "bcpne $cccc,$pcrel17a2" 289216dce513Schristos (+ MAJ_13 (f-rn 8) cccc (f-sub4 5) pcrel17a2) 289316dce513Schristos (sequence () 289416dce513Schristos (c-call "check_option_cp" pc) 289516dce513Schristos (if (ne (xor cccc cp_flag) 0) 289616dce513Schristos (set-vliw-alignment-modified pc pcrel17a2))) 289716dce513Schristos ()) 289816dce513Schristos 289916dce513Schristos(dnci bcpat "branch coprocessor and true" (OPTIONAL_CP_INSN RELAXABLE) 290016dce513Schristos "bcpat $cccc,$pcrel17a2" 290116dce513Schristos (+ MAJ_13 (f-rn 8) cccc (f-sub4 6) pcrel17a2) 290216dce513Schristos (sequence () 290316dce513Schristos (c-call "check_option_cp" pc) 290416dce513Schristos (if (ne (and cccc cp_flag) 0) 290516dce513Schristos (set-vliw-alignment-modified pc pcrel17a2))) 290616dce513Schristos ()) 290716dce513Schristos 290816dce513Schristos(dnci bcpaf "branch coprocessor and false" (OPTIONAL_CP_INSN RELAXABLE) 290916dce513Schristos "bcpaf $cccc,$pcrel17a2" 291016dce513Schristos (+ MAJ_13 (f-rn 8) cccc (f-sub4 7) pcrel17a2) 291116dce513Schristos (sequence () 291216dce513Schristos (c-call "check_option_cp" pc) 291316dce513Schristos (if (eq (and cccc cp_flag) 0) 291416dce513Schristos (set-vliw-alignment-modified pc pcrel17a2))) 291516dce513Schristos ()) 291616dce513Schristos 291716dce513Schristos(dnci synccp "synchronise with coprocessor" (OPTIONAL_CP_INSN) 291816dce513Schristos "synccp" 291916dce513Schristos (+ MAJ_7 (f-rn 0) (f-rm 2) (f-sub4 1)) 292016dce513Schristos (sequence () 292116dce513Schristos (c-call "check_option_cp" pc) 292216dce513Schristos (unimp "synccp")) 292316dce513Schristos ()) 292416dce513Schristos 292516dce513Schristos(dnci jsrv "jump to vliw subroutine " (OPTIONAL_CP_INSN) 292616dce513Schristos "jsrv $rm" 292716dce513Schristos (+ MAJ_1 (f-rn 8) rm (f-sub4 15)) 292816dce513Schristos (sequence () 292916dce513Schristos (cg-profile pc rm) 293016dce513Schristos (c-call "check_option_cp" pc) 293116dce513Schristos (core-vliw-switch 293216dce513Schristos 293316dce513Schristos ;; in core operating mode 293416dce513Schristos (sequence () 293516dce513Schristos (set lp (or (add pc 2) 1)) 293616dce513Schristos (set-vliw-aliignment-modified-by-option pc rm) 293716dce513Schristos (set-psw.om 1)) ;; to VLIW operation mode 293816dce513Schristos 293916dce513Schristos ;; in VLIW32 operating mode 294016dce513Schristos (sequence () 294116dce513Schristos (set lp (or (add pc 4) 1)) 294216dce513Schristos (set pc (and rm (inv 1))) 294316dce513Schristos (set-psw.om 0)) ;; to core operation mode 294416dce513Schristos 294516dce513Schristos ;; in VLIW64 operating mode 294616dce513Schristos (sequence () 294716dce513Schristos (set lp (or (add pc 8) 1)) 294816dce513Schristos (set pc (and rm (inv 1))) 294916dce513Schristos (set-psw.om 0)))) ;; to core operation mode 295016dce513Schristos ((mep (unit u-use-gpr (in usereg rm)) 295116dce513Schristos (unit u-exec) 295216dce513Schristos (unit u-branch)))) 295316dce513Schristos 295416dce513Schristos(dnci bsrv "branch to vliw subroutine" (OPTIONAL_CP_INSN) 295516dce513Schristos "bsrv $pcrel24a2" 295616dce513Schristos (+ MAJ_13 (f-4 1) (f-sub4 11) pcrel24a2) 295716dce513Schristos (sequence () 295816dce513Schristos (cg-profile pc pcrel24a2) 295916dce513Schristos (c-call "check_option_cp" pc) 296016dce513Schristos (core-vliw-switch 296116dce513Schristos 296216dce513Schristos ;; in core operating mode 296316dce513Schristos (sequence () 296416dce513Schristos (set lp (or (add pc 4) 1)) 296516dce513Schristos (set-vliw-aliignment-modified-by-option pc pcrel24a2) 296616dce513Schristos (set-psw.om 1)) ;; to VLIW operation mode 296716dce513Schristos 296816dce513Schristos ;; in VLIW32 operating mode 296916dce513Schristos (sequence () 297016dce513Schristos (set lp (or (add pc 4) 1)) 297116dce513Schristos (set pc (and pcrel24a2 (inv 1))) 297216dce513Schristos (set-psw.om 0)) ;; to core operation mode 297316dce513Schristos 297416dce513Schristos ;; in VLIW64 operating mode 297516dce513Schristos (sequence () 297616dce513Schristos (set lp (or (add pc 8) 1)) 297716dce513Schristos (set pc (and pcrel24a2 (inv 1))) 297816dce513Schristos (set-psw.om 0)))) ;; to core operation mode 297916dce513Schristos ((mep (unit u-exec) 298016dce513Schristos (unit u-branch)))) 298116dce513Schristos 298216dce513Schristos 298316dce513Schristos; An instruction for test instrumentation. 298416dce513Schristos; Using a reserved opcode. 298516dce513Schristos 298616dce513Schristos(dnci sim-syscall "simulator system call" () 298716dce513Schristos "--syscall--" 298816dce513Schristos (+ MAJ_7 (f-4 1) callnum (f-8 0) (f-9 0) (f-10 0) (f-sub4 0)) 298916dce513Schristos (c-call "do_syscall" pc callnum) 299016dce513Schristos ()) 299116dce513Schristos 299216dce513Schristos(define-pmacro (dnri n major minor) 299316dce513Schristos (dnci (.sym ri- n) "reserved instruction" () 299416dce513Schristos "--reserved--" 299516dce513Schristos (+ major rn rm (f-sub4 minor)) 299616dce513Schristos (set pc (c-call USI "ri_exception" pc)) 299716dce513Schristos ((mep (unit u-exec) 299816dce513Schristos (unit u-branch))))) 299916dce513Schristos 300016dce513Schristos(dnri 0 MAJ_0 6) 300116dce513Schristos(dnri 1 MAJ_1 10) 300216dce513Schristos(dnri 2 MAJ_1 11) 300316dce513Schristos(dnri 3 MAJ_2 5) 300416dce513Schristos(dnri 4 MAJ_2 8) 300516dce513Schristos(dnri 5 MAJ_2 9) 300616dce513Schristos(dnri 6 MAJ_2 10) 300716dce513Schristos(dnri 7 MAJ_2 11) 300816dce513Schristos(dnri 8 MAJ_3 4) 300916dce513Schristos(dnri 9 MAJ_3 5) 301016dce513Schristos(dnri 10 MAJ_3 6) 301116dce513Schristos(dnri 11 MAJ_3 7) 301216dce513Schristos(dnri 12 MAJ_3 12) 301316dce513Schristos(dnri 13 MAJ_3 13) 301416dce513Schristos(dnri 14 MAJ_3 14) 301516dce513Schristos(dnri 15 MAJ_3 15) 301616dce513Schristos(dnri 17 MAJ_7 7) 301716dce513Schristos(dnri 20 MAJ_7 14) 301816dce513Schristos(dnri 21 MAJ_7 15) 301916dce513Schristos(dnri 22 MAJ_12 7) 302016dce513Schristos(dnri 23 MAJ_14 13) 302116dce513Schristos;(dnri 24 MAJ_15 3) 302216dce513Schristos(dnri 26 MAJ_15 8) 302316dce513Schristos; begin core-specific reserved insns 302416dce513Schristos; end core-specific reserved insns 302516dce513Schristos 302616dce513Schristos 302716dce513Schristos; Macro instructions. 302816dce513Schristos 302916dce513Schristos(dnmi nop "nop" 303016dce513Schristos () 303116dce513Schristos "nop" 303216dce513Schristos (emit mov (rn 0) (rm 0))) 303316dce513Schristos 303416dce513Schristos; Emit the 16 bit form of these 32 bit insns when the displacement is zero. 303516dce513Schristos; 303616dce513Schristos(dncmi sb16-0 "store byte (explicit 16 bit displacement of zero)" (NO-DIS) 303716dce513Schristos "sb $rnc,$zero($rma)" 303816dce513Schristos (emit sb rnc rma)) 303916dce513Schristos 304016dce513Schristos(dncmi sh16-0 "store half (explicit 16 bit displacement of zero)" (NO-DIS) 304116dce513Schristos "sh $rns,$zero($rma)" 304216dce513Schristos (emit sh rns rma)) 304316dce513Schristos 304416dce513Schristos(dncmi sw16-0 "store word (explicit 16 bit displacement of zero)" (NO-DIS) 304516dce513Schristos "sw $rnl,$zero($rma)" 304616dce513Schristos (emit sw rnl rma)) 304716dce513Schristos 304816dce513Schristos(dncmi lb16-0 "load byte (explicit 16 bit displacement of zero)" (NO-DIS) 304916dce513Schristos "lb $rnc,$zero($rma)" 305016dce513Schristos (emit lb rnc rma)) 305116dce513Schristos 305216dce513Schristos(dncmi lh16-0 "load half (explicit 16 bit displacement of zero)" (NO-DIS) 305316dce513Schristos "lh $rns,$zero($rma)" 305416dce513Schristos (emit lh rns rma)) 305516dce513Schristos 305616dce513Schristos(dncmi lw16-0 "load word (explicit 16 bit displacement of zero)" (NO-DIS) 305716dce513Schristos "lw $rnl,$zero($rma)" 305816dce513Schristos (emit lw rnl rma)) 305916dce513Schristos 306016dce513Schristos(dncmi lbu16-0 "load unsigned byte (explicit 16 bit displacement of zero)" (NO-DIS) 306116dce513Schristos "lbu $rnuc,$zero($rma)" 306216dce513Schristos (emit lbu rnuc rma)) 306316dce513Schristos 306416dce513Schristos(dncmi lhu16-0 "load unsigned half (explicit 16 bit displacement of zero)" (NO-DIS) 306516dce513Schristos "lhu $rnus,$zero($rma)" 306616dce513Schristos (emit lhu rnus rma)) 306716dce513Schristos 306816dce513Schristos(dncmi swcp16-0 "swcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN NO-DIS) 306916dce513Schristos "swcp $crn,$zero($rma)" 307016dce513Schristos (emit swcp crn rma)) 307116dce513Schristos 307216dce513Schristos(dncmi lwcp16-0 "lwcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN NO-DIS) 307316dce513Schristos "lwcp $crn,$zero($rma)" 307416dce513Schristos (emit lwcp crn rma)) 307516dce513Schristos 307616dce513Schristos(dncmi smcp16-0 "smcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN NO-DIS) 307716dce513Schristos "smcp $crn64,$zero($rma)" 307816dce513Schristos (emit smcp crn64 rma)) 307916dce513Schristos 308016dce513Schristos(dncmi lmcp16-0 "lmcp (explicit 16-bit displacement of zero)" (OPTIONAL_CP_INSN OPTIONAL_CP64_INSN NO-DIS) 308116dce513Schristos "lmcp $crn64,$zero($rma)" 308216dce513Schristos (emit lmcp crn64 rma)) 3083