116dce513Schristos; Adapteva EPIPHANY CPU description. -*- Scheme -*- 216dce513Schristos; Copyright 1998, 1999, 2000, 2001, 2003, 2006, 2007, 2008, 2009, 2010, 2011 316dce513Schristos; Free Software Foundation, Inc. 416dce513Schristos; 516dce513Schristos; Contributed by Embecosm on behalf of Adapteva, Inc. 616dce513Schristos; This file is part of the GNU Binutils and of GDB. 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 ; define-arch must appear first 2516dce513Schristos 2616dce513Schristos(define-arch 2716dce513Schristos (name epiphany) ; name of cpu family 2816dce513Schristos (comment "Adapteva, Inc. EPIPHANY family") 2916dce513Schristos (default-alignment aligned) 3016dce513Schristos (insn-lsb0? #t) 3116dce513Schristos 3216dce513Schristos ; - a 16/32 bit instruction machine (the default) 3316dce513Schristos 3416dce513Schristos (machs epiphany32) 3516dce513Schristos (isas epiphany) 3616dce513Schristos ) 3716dce513Schristos 3816dce513Schristos ; Attributes. 3916dce513Schristos 4016dce513Schristos(define-attr 4116dce513Schristos (for insn) 4216dce513Schristos (type boolean) 4316dce513Schristos (name SHORT-INSN) 4416dce513Schristos (comment "instruction is a 16 bit form") 4516dce513Schristos ) 4616dce513Schristos 4716dce513Schristos;; 3 bit add/sub immediate forms - useful for relaxing into 11 bit form 4816dce513Schristos(define-attr 4916dce513Schristos (for insn) 5016dce513Schristos (type boolean) 5116dce513Schristos (name IMM3) 5216dce513Schristos (comment "instruction has a 3 bit immediate form") 5316dce513Schristos ) 5416dce513Schristos 5516dce513Schristos;; 8 bit mov immediate forms - useful for relaxing into 16 bit form 5616dce513Schristos(define-attr 5716dce513Schristos (for insn) 5816dce513Schristos (type boolean) 5916dce513Schristos (name IMM8) 6016dce513Schristos (comment "instruction has a 8 bit immediate form") 6116dce513Schristos ) 6216dce513Schristos 6316dce513Schristos ; Instruction set parameters. 6416dce513Schristos 6516dce513Schristos(define-isa 6616dce513Schristos (name epiphany) 6716dce513Schristos (comment "Adapteva, Inc. EPIPHANY32 ISA") 6816dce513Schristos 6916dce513Schristos (default-insn-word-bitsize 32) 7016dce513Schristos (default-insn-bitsize 32) 7116dce513Schristos (base-insn-bitsize 32) 7216dce513Schristos (decode-assist (3 2 1 0)) ; CGEN can figure this out 7316dce513Schristos (liw-insns 1) ; # instructions fetched at once 7416dce513Schristos ) 7516dce513Schristos 7616dce513Schristos ; Cpu family definitions. 7716dce513Schristos 7816dce513Schristos 7916dce513Schristos(define-cpu 8016dce513Schristos ; cpu names must be distinct from the architecture name and machine names. 8116dce513Schristos (name epiphanybf) 8216dce513Schristos (comment "Adapteva, Inc. EPIPHANY Family") 8316dce513Schristos (endian little) 8416dce513Schristos (word-bitsize 32) 8516dce513Schristos ) 8616dce513Schristos 8716dce513Schristos(define-cpu 8816dce513Schristos (name epiphanymf) 8916dce513Schristos (comment "Adapteva, Inc. EPIPHANY Family") 9016dce513Schristos (endian little) 9116dce513Schristos (word-bitsize 32) 9216dce513Schristos ) 9316dce513Schristos 9416dce513Schristos 9516dce513Schristos(define-mach 9616dce513Schristos (name epiphany32) 9716dce513Schristos (comment "Adapteva EPIPHANY") 9816dce513Schristos (cpu epiphanybf) 9916dce513Schristos ) 10016dce513Schristos 10116dce513Schristos 10216dce513Schristos ; Model descriptions. 10316dce513Schristos 10416dce513Schristos(define-model 10516dce513Schristos (name epiphany32) (comment "Adapteva EPIPHANY 32/16") (attrs) 10616dce513Schristos (mach epiphany32) 10716dce513Schristos 10816dce513Schristos (unit u-exec "Execution Unit" () 10916dce513Schristos 1 1 ; issue done 11016dce513Schristos () ; state 11116dce513Schristos () ; inputs 11216dce513Schristos () ; outputs 11316dce513Schristos () ; profile action (default) 11416dce513Schristos ) 11516dce513Schristos ) 11616dce513Schristos 11716dce513Schristos 11816dce513Schristos 11916dce513Schristos ; Instruction fields. 12016dce513Schristos ; 12116dce513Schristos ; Attributes: 12216dce513Schristos ; XXX: what EPIPHANY attrs 12316dce513Schristos ; PCREL-ADDR: pc relative value (for reloc and disassembly purposes) 12416dce513Schristos ; ABS-ADDR: absolute address (for reloc and disassembly purposes?) 12516dce513Schristos ; RESERVED: bits are not used to decode insn, must be all 0 12616dce513Schristos ; RELOC: there is a relocation associated with this field 12716dce513Schristos 12816dce513Schristos(define-attr 12916dce513Schristos (for ifield operand) 13016dce513Schristos (type boolean) 13116dce513Schristos (name RELOC) 13216dce513Schristos (comment "there is a reloc associated with this field (experiment)") 13316dce513Schristos ) 13416dce513Schristos 13516dce513Schristos;; define the fields of the instruction. 13616dce513Schristos;; name description ATTR MSB LEN 13716dce513Schristos(dnf f-opc "primary opcode" () 3 4) 13816dce513Schristos(dnf f-opc-4-1 "secondary opcode" () 4 1) 13916dce513Schristos(dnf f-opc-6-3 "secondary opcode" () 6 3) ;; 14016dce513Schristos(dnf f-opc-8-5 "tertiary opcode" () 8 5) ;; 14116dce513Schristos(dnf f-opc-19-4 "additional opcode bits" () 19 4) 14216dce513Schristos(dnf f-condcode "condition codes" () 7 4) 14316dce513Schristos(dnf f-secondary-ccs "flag for secondary ccs" () 7 1) 14416dce513Schristos(dnf f-shift "shift amount" () 9 5) 14516dce513Schristos(dnf f-wordsize "load/store size" () 6 2) 14616dce513Schristos(dnf f-store "load/store flag" () 4 1) ;; 0==load,1==store 14716dce513Schristos(dnf f-opc-8-1 "opcode bits" () 8 1) 14816dce513Schristos(dnf f-opc-31-32 "all opcode set" () 31 32) 14916dce513Schristos 15016dce513Schristos(df f-simm8 "branch displacement" (PCREL-ADDR RELOC) 15 8 INT 15116dce513Schristos ((value pc) (sra SI (sub SI value pc) 1)) 152*012573ebSchristos ((value pc) (add SI (mul SI value 2) pc))) 15316dce513Schristos 15416dce513Schristos(df f-simm24 "branch displacement" (PCREL-ADDR RELOC) 31 24 INT 15516dce513Schristos ((value pc) (sra SI (sub SI value pc) 1)) 156*012573ebSchristos ((value pc) (add SI (mul SI value 2) pc))) 15716dce513Schristos 15816dce513Schristos(df f-sdisp3 "signed immediate 3 bit" () 9 3 INT #f #f) 15916dce513Schristos 16016dce513Schristos(dnf f-disp3 "address offset" () 9 3) 16116dce513Schristos(dnf f-disp8 "address offset" () 23 8) 16216dce513Schristos 16316dce513Schristos(dnf f-imm8 "move/add/sub imm8" () 12 8) 16416dce513Schristos(dnf f-imm-27-8 "move/add/sub imm16" () 27 8) 16516dce513Schristos(dnf f-addsubx "+/- index address" () 20 1) 16616dce513Schristos(dnf f-subd "+/- displ address" () 24 1) 16716dce513Schristos(dnf f-pm "post-modify immediate" () 25 1) 16816dce513Schristos 16916dce513Schristos(dnf f-rm "short rm" () 9 3) ;; RM 17016dce513Schristos(dnf f-rn "short rn" () 12 3) ;; RN 17116dce513Schristos(dnf f-rd "short rd" () 15 3) ;; RD 17216dce513Schristos 17316dce513Schristos(dnf f-rm-x "extension rm" () 25 3) ;; RM 17416dce513Schristos(dnf f-rn-x "extension rn" () 28 3) ;; RN 17516dce513Schristos(dnf f-rd-x "extension rd" () 31 3) ;; RD 17616dce513Schristos 17716dce513Schristos(dnf f-dc-9-1 "DC" (RESERVED) 9 1) 17816dce513Schristos 17916dce513Schristos(dnf f-sn "short sn" () 12 3) ;; SN 18016dce513Schristos(dnf f-sd "short sd" () 15 3) ;; SD 18116dce513Schristos 18216dce513Schristos(dnf f-sn-x "extension sn" () 28 3) ;; SN 18316dce513Schristos(dnf f-sd-x "extension sd" () 31 3) ;; SD 18416dce513Schristos 18516dce513Schristos 18616dce513Schristos 18716dce513Schristos(dnf f-dc-7-4 "movts zeros" () 7 4) 18816dce513Schristos(dnf f-trap-swi-9-1 "trap or swi" () 9 1) 18916dce513Schristos(dnf f-gien-gidis-9-1 "gien or gidis" () 9 1) 19016dce513Schristos 19116dce513Schristos 19216dce513Schristos(dnf f-dc-15-3 "DC" (RESERVED) 15 3) 19316dce513Schristos(dnf f-dc-15-7 "DC" (RESERVED) 15 7) 19416dce513Schristos(dnf f-dc-15-6 "DC" () 15 6) 19516dce513Schristos(dnf f-trap-num "trap number" () 15 6) 19616dce513Schristos 19716dce513Schristos(dnf f-dc-20-1 "DC" (RESERVED) 20 1) 19816dce513Schristos 19916dce513Schristos(dnf f-dc-21-1 "DC" (RESERVED) 21 1) 20016dce513Schristos(dnf f-dc-21-2 "DC" (RESERVED) 21 2) 20116dce513Schristos 20216dce513Schristos(dnf f-dc-22-3 "DC" (RESERVED) 22 3) 20316dce513Schristos(dnf f-dc-22-2 "DC" (RESERVED) 22 2) 20416dce513Schristos(dnf f-dc-22-1 "DC" (RESERVED) 22 1) 20516dce513Schristos 20616dce513Schristos(dnf f-dc-25-6 "DC" (RESERVED) 25 6) 20716dce513Schristos(dnf f-dc-25-4 "DC" (RESERVED) 25 4) 20816dce513Schristos(dnf f-dc-25-2 "DC" (RESERVED) 25 2) 20916dce513Schristos(dnf f-dc-25-1 "DC" (RESERVED) 25 1) 21016dce513Schristos 21116dce513Schristos(dnf f-dc-28-1 "DC" (RESERVED) 28 1) 21216dce513Schristos(dnf f-dc-31-3 "DC" (RESERVED) 31 3) 21316dce513Schristos 21416dce513Schristos(dnmf f-disp11 "Unsigned offset for load/store" () UINT (f-disp3 f-disp8) 21516dce513Schristos (sequence () 21616dce513Schristos (set (ifield f-disp8) (and (srl (ifield f-disp11) 3) (const 255))) 21716dce513Schristos (set (ifield f-disp3) (and (ifield f-disp11) 7))) 21816dce513Schristos (sequence () 21916dce513Schristos (set (ifield f-disp11) (or (sll (ifield f-disp8) 3) 22016dce513Schristos (ifield f-disp3))) 22116dce513Schristos ) 22216dce513Schristos ) 22316dce513Schristos 22416dce513Schristos 22516dce513Schristos(dnmf f-sdisp11 "Signed offset for load/store" () INT (f-disp3 f-disp8) 22616dce513Schristos (sequence () ;encode 22716dce513Schristos (set (ifield f-disp8) (and #xff (srl SI (ifield f-sdisp11) 3))) 22816dce513Schristos (set (ifield f-disp3) (and SI (ifield f-sdisp11) 7))) 22916dce513Schristos (sequence () ;decode 23016dce513Schristos (set (ifield f-sdisp11) 231*012573ebSchristos (sub SI (xor (and (or (sll (ifield f-disp8) 3) 23216dce513Schristos (ifield f-disp3)) 233*012573ebSchristos #x7ff) 234*012573ebSchristos #x400) 235*012573ebSchristos #x400))) 23616dce513Schristos ) 23716dce513Schristos 23816dce513Schristos(dnmf f-imm16 "Short immediate for move/add/sub" () UINT (f-imm8 f-imm-27-8) 23916dce513Schristos (sequence () 24016dce513Schristos (set (ifield f-imm8) (and (ifield f-imm16) #xff)) 24116dce513Schristos (set (ifield f-imm-27-8) (srl (ifield f-imm16) 8))) 24216dce513Schristos (sequence () 24316dce513Schristos (set (ifield f-imm16) (or (sll (ifield f-imm-27-8) 8) 24416dce513Schristos (ifield f-imm8)))) 24516dce513Schristos ) 24616dce513Schristos 24716dce513Schristos 24816dce513Schristos;; 32 bit instructions have the register number broken into two non-contiguous fields 24916dce513Schristos 25016dce513Schristos(define-pmacro (x-reg-field reg) 25116dce513Schristos (define-multi-ifield 25216dce513Schristos (name (.sym "f-" reg "6")) 25316dce513Schristos (mode UINT) 25416dce513Schristos (subfields (.sym "f-" reg "-x") (.sym "f-" reg)) 25516dce513Schristos (insert (sequence () 25616dce513Schristos (set (ifield (.sym "f-" reg)) (and (ifield (.sym "f-" reg "6")) 25716dce513Schristos (const 7))) 25816dce513Schristos (set (ifield (.sym "f-" reg "-x")) (srl (ifield (.sym "f-" reg "6")) 25916dce513Schristos (const 3))) 26016dce513Schristos )) 26116dce513Schristos (extract (sequence () 26216dce513Schristos (set (ifield (.sym "f-" reg "6")) (or (sll (ifield (.sym "f-" reg "-x")) 26316dce513Schristos (const 3)) 26416dce513Schristos (ifield (.sym "f-" reg)))) 26516dce513Schristos )) 26616dce513Schristos ) 26716dce513Schristos ) 26816dce513Schristos 26916dce513Schristos(x-reg-field rd) ; f-rd6 27016dce513Schristos(x-reg-field rn) ; f-rn6 27116dce513Schristos(x-reg-field rm) ; f-rm6 27216dce513Schristos(x-reg-field sd) ; f-sd6 27316dce513Schristos(x-reg-field sn) ; f-sn6 27416dce513Schristos 27516dce513Schristos 27616dce513Schristos;;;;;;;;;; 27716dce513Schristos ; Enums. ; 27816dce513Schristos;;;;;;;;;; 27916dce513Schristos 28016dce513Schristos ; insn-opc: bits 3..0 - major family selector 28116dce513Schristos(define-normal-insn-enum insn-opc "opc enums" () OP4_ f-opc 28216dce513Schristos ( 28316dce513Schristos BRANCH16 ;; 0000 28416dce513Schristos LDSTR16X ;; 0001 28516dce513Schristos FLOW16 ;; 0010 28616dce513Schristos IMM16 ;; 0011 28716dce513Schristos LDSTR16D ;; 0100 28816dce513Schristos LDSTR16P ;; 0101 28916dce513Schristos LSHIFT16 ;; 0110 - logical shift 29016dce513Schristos DSP16 ;; 0111 - 3 reg DSP 16 bit insns 29116dce513Schristos BRANCH ;; 1000 29216dce513Schristos LDSTRX ;; 1001 29316dce513Schristos ALU16 ;; 1010 - 3 reg 16 bit 29416dce513Schristos IMM32 ;; 1011 29516dce513Schristos LDSTRD ;; 1100 29616dce513Schristos LDSTRP ;; 1101 29716dce513Schristos ASHIFT16 ;; 1110 ASR, BITR 29816dce513Schristos MISC ;; 1111 - 32 bit shifts, 3 reg ALU, 3 reg DSP, FLOW, BITR 29916dce513Schristos ) 30016dce513Schristos ) 30116dce513Schristos 30216dce513Schristos(define-normal-insn-enum insn-wordsize "memory access width" () OPW_ f-wordsize 30316dce513Schristos ; specifies the size of a memory load/store operation 30416dce513Schristos (BYTE SHORT WORD DOUBLE) 30516dce513Schristos ) 30616dce513Schristos 30716dce513Schristos(define-normal-insn-enum insn-memory-access "memory access direction" () OP_ f-store 30816dce513Schristos ; load=0, store=1 30916dce513Schristos (LOAD STORE) 31016dce513Schristos ) 31116dce513Schristos 31216dce513Schristos ; enum for trap codes used by simulator 31316dce513Schristos(define-normal-insn-enum trap-codes "trap instruction dispatch code" () TRAP_ f-trap-num 31416dce513Schristos (write read open exit pass fail close other) 31516dce513Schristos ) 31616dce513Schristos 31716dce513Schristos ; cond branch: bits 7..4 31816dce513Schristos ; 31916dce513Schristos(define-normal-insn-enum insn-cond "branch conditions" () OPC_ f-condcode 32016dce513Schristos (EQ NE GTU GTEU LTEU LTU GT GTE LT LTE BEQ BNE BLT BLTE B BL)) 32116dce513Schristos 32216dce513Schristos ; dsp 3 operand opcodes 32316dce513Schristos(define-normal-insn-enum insn-bop "binary operator subcodes" () OPB_ f-opc-6-3 32416dce513Schristos (EOR ADD LSL SUB LSR AND ASR ORR)) 32516dce513Schristos 32616dce513Schristos ; dsp 3 operand opcodes 32716dce513Schristos(define-normal-insn-enum insn-bopext "binary operator subcodes" () OPBE_ f-opc-6-3 32816dce513Schristos (FEXT FDEP LFSR - - - - -)) 32916dce513Schristos 33016dce513Schristos 33116dce513Schristos(define-normal-insn-enum insn-fop "floating operators" () OPF_ f-opc-6-3 33216dce513Schristos (ADD SUB MUL MADD MSUB FLOAT FIX FABS)) 33316dce513Schristos 33416dce513Schristos(define-normal-insn-enum insn-fopexn "extended floating operators" () OPF_ f-opc-6-3 33516dce513Schristos (FRECIP FSQRT - - - - - -)) 33616dce513Schristos 33716dce513Schristos 33816dce513Schristos 33916dce513Schristos 34016dce513Schristos; Immediate operation secondary opcodes 34116dce513Schristos(define-normal-insn-enum insn-immop "immediate operators" () OPI_ f-opc-6-3 34216dce513Schristos (- ADD - SUB - - - TRAP) ; TRAP is special extension for simulator 34316dce513Schristos ) 34416dce513Schristos 34516dce513Schristos ; don't care fields 34616dce513Schristos(define-normal-insn-enum insn-dc-25-2 "don't cares" () OPI_25_2_ f-dc-25-2 34716dce513Schristos (MBZ)) 34816dce513Schristos 34916dce513Schristos; General Register keyword names. 35016dce513Schristos(define-keyword 35116dce513Schristos (name gr-names) 35216dce513Schristos (print-name h-registers) 35316dce513Schristos (prefix "") 35416dce513Schristos (values 35516dce513Schristos; some preferred aliases 35616dce513Schristos (fp 11) (sp 13) (lr 14) 35716dce513Schristos; the default register names 35816dce513Schristos (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7) 35916dce513Schristos (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15) 36016dce513Schristos (r16 16) (r17 17) (r18 18) (r19 19) (r20 20) (r21 21) (r22 22) (r23 23) 36116dce513Schristos (r24 24) (r25 25) (r26 26) (r27 27) (r28 28) (r29 29) (r30 30) (r31 31) 36216dce513Schristos (r32 32) (r33 33) (r34 34) (r35 35) (r36 36) (r37 37) (r38 38) (r39 39) 36316dce513Schristos (r40 40) (r41 41) (r42 42) (r43 43) (r44 44) (r45 45) (r46 46) (r47 47) 36416dce513Schristos (r48 48) (r49 49) (r50 50) (r51 51) (r52 52) (r53 53) (r54 54) (r55 55) 36516dce513Schristos (r56 56) (r57 57) (r58 58) (r59 59) (r60 60) (r61 61) (r62 62) (r63 63) 36616dce513Schristos; some less popular aliases 36716dce513Schristos (a1 0) (a2 1) (a3 2) (a4 3) (v1 4) (v2 5) (v3 6) (v4 7) 36816dce513Schristos (v5 8) (v6 9) (v7 10) (v8 11) 36916dce513Schristos (sb 9) (sl 10) (ip 12) 37016dce513Schristos ) 37116dce513Schristos ) 37216dce513Schristos 37316dce513Schristos(define-normal-insn-enum post-index "+/- index register" () DIR_ f-addsubx (POSTINC POSTDEC)) 37416dce513Schristos 37516dce513Schristos(define-normal-insn-enum disp-post-modify "postmodify displacement" () PMOD_ f-pm (DISP POST)) 37616dce513Schristos 37716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 37816dce513Schristos ; Hardware pieces. 37916dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 38016dce513Schristos 38116dce513Schristos;; 64 general-purpose registers 38216dce513Schristos(define-hardware 38316dce513Schristos (name h-registers) 38416dce513Schristos (comment "all addressable registers") 38516dce513Schristos (type register SI (64)) 38616dce513Schristos (attrs PROFILE CACHE-ADDR) 38716dce513Schristos (indices extern-keyword gr-names) 38816dce513Schristos ) 38916dce513Schristos 39016dce513Schristos 39116dce513Schristos 39216dce513Schristos;; Same 64 registers as floating point registers 39316dce513Schristos(define-hardware 39416dce513Schristos (name h-fpregisters) 39516dce513Schristos (comment "all GPRs as float values") 39616dce513Schristos (type register SF (64)) 39716dce513Schristos (attrs PROFILE VIRTUAL) 39816dce513Schristos (indices extern-keyword gr-names) 39916dce513Schristos (get (index) (subword SF (reg h-registers index) 0)) 40016dce513Schristos (set (index newval) (set (reg h-registers index) (subword SI newval 0))) 40116dce513Schristos ) 40216dce513Schristos 40316dce513Schristos;; define processor status bits as physical hardware 40416dce513Schristos 40516dce513Schristos(define-pmacro (psw-h-bit name cmt) 40616dce513Schristos (dsh name cmt () (register BI))) 40716dce513Schristos 40816dce513Schristos(psw-h-bit h-zbit "integer zero bit") 40916dce513Schristos(psw-h-bit h-nbit "integer neg bit") 41016dce513Schristos(psw-h-bit h-cbit "integer carry bit") 41116dce513Schristos(psw-h-bit h-vbit "integer overflow bit") 41216dce513Schristos(psw-h-bit h-vsbit "integer overflow sticky") 41316dce513Schristos 41416dce513Schristos 41516dce513Schristos(psw-h-bit h-bzbit "floating point zero bit") 41616dce513Schristos(psw-h-bit h-bnbit "floating point neg bit") 41716dce513Schristos(psw-h-bit h-bvbit "floating point ovfl bit") 41816dce513Schristos(psw-h-bit h-bubit "floating point underfl bit") 41916dce513Schristos(psw-h-bit h-bibit "floating point invalid bit") 42016dce513Schristos(psw-h-bit h-bcbit "floating point carry bit") 42116dce513Schristos 42216dce513Schristos(psw-h-bit h-bvsbit "floating point overflow sticky") 42316dce513Schristos(psw-h-bit h-bisbit "floating point invalid sticky") 42416dce513Schristos(psw-h-bit h-busbit "floating point underflow sticky") 42516dce513Schristos 42616dce513Schristos(psw-h-bit h-expcause0bit "exceprion cause bit0") 42716dce513Schristos(psw-h-bit h-expcause1bit "exceprion cause bit1") 42816dce513Schristos(psw-h-bit h-expcause2bit "external load stalled bit") 42916dce513Schristos(psw-h-bit h-extFstallbit "external fetch stalled bit") 43016dce513Schristos 43116dce513Schristos(psw-h-bit h-trmbit "0=round to nearest, 1=trunacte select bit") 43216dce513Schristos(psw-h-bit h-invExcEnbit "invalid exception enable bit") 43316dce513Schristos(psw-h-bit h-ovfExcEnbit "overflow exception enable bit") 43416dce513Schristos(psw-h-bit h-unExcEnbit "underflow exception enablebit ") 43516dce513Schristos 43616dce513Schristos(psw-h-bit h-timer0bit0 "timer 0 mode selection 0") 43716dce513Schristos(psw-h-bit h-timer0bit1 "timer 0 mode selection 1") 43816dce513Schristos(psw-h-bit h-timer0bit2 "timer 0 mode selection 2") 43916dce513Schristos(psw-h-bit h-timer0bit3 "timer 0 mode selection 3") 44016dce513Schristos(psw-h-bit h-timer1bit0 "timer 1 mode selection 0") 44116dce513Schristos(psw-h-bit h-timer1bit1 "timer 1 mode selection 1") 44216dce513Schristos(psw-h-bit h-timer1bit2 "timer 1 mode selection 2") 44316dce513Schristos(psw-h-bit h-timer1bit3 "timer 1 mode selection 3") 44416dce513Schristos 44516dce513Schristos(psw-h-bit h-mbkptEnbit "multicore bkpt enable") 44616dce513Schristos(psw-h-bit h-clockGateEnbit "clock gating enable bkpt enable") 44716dce513Schristos 44816dce513Schristos 44916dce513Schristos(psw-h-bit h-coreCfgResBit12 "core config bit 12") 45016dce513Schristos(psw-h-bit h-coreCfgResBit13 "core config bit 13") 45116dce513Schristos(psw-h-bit h-coreCfgResBit14 "core config bit 14") 45216dce513Schristos(psw-h-bit h-coreCfgResBit15 "core config bit 15") 45316dce513Schristos(psw-h-bit h-coreCfgResBit16 "core config bit 16") 45416dce513Schristos 45516dce513Schristos 45616dce513Schristos(psw-h-bit h-coreCfgResBit20 "core config bit 20") 45716dce513Schristos(psw-h-bit h-coreCfgResBit21 "core config bit 21") 45816dce513Schristos 45916dce513Schristos(psw-h-bit h-coreCfgResBit24 "core config bit 24") 46016dce513Schristos(psw-h-bit h-coreCfgResBit25 "core config bit 25") 46116dce513Schristos(psw-h-bit h-coreCfgResBit26 "core config bit 26") 46216dce513Schristos(psw-h-bit h-coreCfgResBit27 "core config bit 27") 46316dce513Schristos(psw-h-bit h-coreCfgResBit28 "core config bit 28") 46416dce513Schristos(psw-h-bit h-coreCfgResBit29 "core config bit 29") 46516dce513Schristos(psw-h-bit h-coreCfgResBit30 "core config bit 30") 46616dce513Schristos(psw-h-bit h-coreCfgResBit31 "core config bit 31") 46716dce513Schristos 46816dce513Schristos 46916dce513Schristos(psw-h-bit h-arithmetic-modebit0 "arithmetic mode bit0") 47016dce513Schristos(psw-h-bit h-arithmetic-modebit1 "arithmetic mode bit1") 47116dce513Schristos(psw-h-bit h-arithmetic-modebit2 "arithmetic mode bit2") 47216dce513Schristos 47316dce513Schristos 47416dce513Schristos(psw-h-bit h-gidisablebit "global interrupt disable bit") 47516dce513Schristos(psw-h-bit h-kmbit "kernel mode bit") 47616dce513Schristos(psw-h-bit h-caibit "core active indicator mode bit") 47716dce513Schristos(psw-h-bit h-sflagbit "sflag bit") 47816dce513Schristos 47916dce513Schristos 48016dce513Schristos ; Define operands for each of the physical bits 48116dce513Schristos(define-pmacro (psw-bit name hname cmt) 48216dce513Schristos (dnop name cmt (SEM-ONLY) hname f-nil) 48316dce513Schristos ) 48416dce513Schristos 48516dce513Schristos(psw-bit zbit h-zbit "integer zero bit") 48616dce513Schristos(psw-bit nbit h-nbit "integer neg bit") 48716dce513Schristos(psw-bit cbit h-cbit "integer carry bit") 48816dce513Schristos(psw-bit vbit h-vbit "integer overflow bit") 48916dce513Schristos 49016dce513Schristos(psw-bit bzbit h-bzbit "floating point zero bit") 49116dce513Schristos(psw-bit bnbit h-bnbit "floating point neg bit") 49216dce513Schristos(psw-bit bvbit h-bvbit "floating point ovfl bit") 49316dce513Schristos(psw-bit bcbit h-bcbit "floating point carry bit") 49416dce513Schristos 49516dce513Schristos(psw-bit bubit h-bubit "floating point underfl bit") 49616dce513Schristos(psw-bit bibit h-bibit "floating point invalid bit") 49716dce513Schristos 49816dce513Schristos 49916dce513Schristos(psw-bit vsbit h-vsbit "integer overflow sticky") 50016dce513Schristos(psw-bit bvsbit h-bvsbit "floating point overflow sticky") 50116dce513Schristos(psw-bit bisbit h-bisbit "floating point invalid sticky") 50216dce513Schristos(psw-bit busbit h-busbit "floating point underflow sticky") 50316dce513Schristos(psw-bit expcause0bit h-expcause0bit "exceprion cause bit0") 50416dce513Schristos(psw-bit expcause1bit h-expcause1bit "exceprion cause bit1") 50516dce513Schristos 50616dce513Schristos 50716dce513Schristos(psw-bit expcause2bit h-expcause2bit "external load stalled bit") 50816dce513Schristos(psw-bit extFstallbit h-extFstallbit "external fetch stalled bit") 50916dce513Schristos 51016dce513Schristos(psw-bit trmbit h-trmbit "0=round to nearest, 1=trunacte selct bit") 51116dce513Schristos(psw-bit invExcEnbit h-invExcEnbit "invalid exception enable bit") 51216dce513Schristos(psw-bit ovfExcEnbit h-ovfExcEnbit "overflow exception enable bit") 51316dce513Schristos(psw-bit unExcEnbit h-unExcEnbit "underflow exception enable bit") 51416dce513Schristos 51516dce513Schristos(psw-bit timer0bit0 h-timer0bit0 "timer 0 mode selection 0") 51616dce513Schristos(psw-bit timer0bit1 h-timer0bit1 "timer 0 mode selection 1") 51716dce513Schristos(psw-bit timer0bit2 h-timer0bit2 "timer 0 mode selection 2") 51816dce513Schristos(psw-bit timer0bit3 h-timer0bit3 "timer 0 mode selection 3") 51916dce513Schristos 52016dce513Schristos(psw-bit timer1bit0 h-timer1bit0 "timer 1 mode selection 0") 52116dce513Schristos(psw-bit timer1bit1 h-timer1bit1 "timer 1 mode selection 1") 52216dce513Schristos(psw-bit timer1bit2 h-timer1bit2 "timer 1 mode selection 2") 52316dce513Schristos(psw-bit timer1bit3 h-timer1bit3 "timer 1 mode selection 3") 52416dce513Schristos 52516dce513Schristos(psw-bit mbkptEnbit h-mbkptEnbit "multicore bkpt enable") 52616dce513Schristos(psw-bit clockGateEnbit h-clockGateEnbit "clock gate enable enable") 52716dce513Schristos 52816dce513Schristos(psw-bit arithmetic-modebit0 h-arithmetic-modebit0 "arithmetic mode bit0") 52916dce513Schristos(psw-bit arithmetic-modebit1 h-arithmetic-modebit1 "arithmetic mode bit1") 53016dce513Schristos(psw-bit arithmetic-modebit2 h-arithmetic-modebit2 "arithmetic mode bit2") 53116dce513Schristos 53216dce513Schristos(psw-bit coreCfgResBit12 h-coreCfgResBit12 "core config bit 12") 53316dce513Schristos(psw-bit coreCfgResBit13 h-coreCfgResBit13 "core config bit 13") 53416dce513Schristos(psw-bit coreCfgResBit14 h-coreCfgResBit14 "core config bit 14") 53516dce513Schristos(psw-bit coreCfgResBit15 h-coreCfgResBit15 "core config bit 15") 53616dce513Schristos(psw-bit coreCfgResBit16 h-coreCfgResBit16 "core config bit 16") 53716dce513Schristos 53816dce513Schristos(psw-bit coreCfgResBit20 h-coreCfgResBit20 "core config bit 20") 53916dce513Schristos(psw-bit coreCfgResBit21 h-coreCfgResBit21 "core config bit 21") 54016dce513Schristos 54116dce513Schristos(psw-bit coreCfgResBit24 h-coreCfgResBit24 "core config bit 24") 54216dce513Schristos(psw-bit coreCfgResBit25 h-coreCfgResBit25 "core config bit 25") 54316dce513Schristos(psw-bit coreCfgResBit26 h-coreCfgResBit26 "core config bit 26") 54416dce513Schristos(psw-bit coreCfgResBit27 h-coreCfgResBit27 "core config bit 27") 54516dce513Schristos(psw-bit coreCfgResBit28 h-coreCfgResBit28 "core config bit 28") 54616dce513Schristos(psw-bit coreCfgResBit29 h-coreCfgResBit29 "core config bit 29") 54716dce513Schristos(psw-bit coreCfgResBit30 h-coreCfgResBit30 "core config bit 30") 54816dce513Schristos(psw-bit coreCfgResBit31 h-coreCfgResBit31 "core config bit 31") 54916dce513Schristos 55016dce513Schristos 55116dce513Schristos(psw-bit gidisablebit h-gidisablebit "global interrupt disable bit") 55216dce513Schristos(psw-bit kmbit h-kmbit "kernel mode bit") 55316dce513Schristos(psw-bit caibit h-caibit "core actibe indicator bit") 55416dce513Schristos(psw-bit sflagbit h-sflagbit "sflag bit") 55516dce513Schristos 55616dce513Schristos 55716dce513Schristos 55816dce513Schristos 55916dce513Schristos;; Special registers - accessed via MOVTS and MOVFS. 56016dce513Schristos;; 56116dce513Schristos;; "Core control and status" in group MR0=0, MR1=0 56216dce513Schristos 56316dce513Schristos(define-keyword 56416dce513Schristos (name cr-names) 56516dce513Schristos (print-name h-core-registers) 56616dce513Schristos (prefix "") 56716dce513Schristos (values (config 0) 56816dce513Schristos (status 1) ; unified condition codes 56916dce513Schristos (pc 2) ; virtualized PC 57016dce513Schristos (debug 3); 57116dce513Schristos (iab 4) 57216dce513Schristos (lc 5);loop counter Not impemented 57316dce513Schristos (ls 6);loop start address Not impemented 57416dce513Schristos (le 7);loop end address Not impemented 57516dce513Schristos (iret 8) 57616dce513Schristos (imask 9) 57716dce513Schristos (ilat 10) 57816dce513Schristos (ilatst 11) 57916dce513Schristos (ilatcl 12) 58016dce513Schristos (ipend 13) 58116dce513Schristos (ctimer0 14) 58216dce513Schristos (ctimer1 15) 58316dce513Schristos (hstatus 16) 58416dce513Schristos ) 58516dce513Schristos ) 58616dce513Schristos;; DMA registers in group MR0=1, MR1=0 58716dce513Schristos 58816dce513Schristos(define-keyword 58916dce513Schristos (name crdma-names) 59016dce513Schristos (print-name h-coredma-registers) 59116dce513Schristos (prefix "") 59216dce513Schristos (values 59316dce513Schristos 59416dce513Schristos 59516dce513Schristos (dma0config 0) 59616dce513Schristos (dma0stride 1) 59716dce513Schristos (dma0count 2) 59816dce513Schristos 59916dce513Schristos (dma0srcaddr 3) 60016dce513Schristos (dma0dstaddr 4) 60116dce513Schristos 60216dce513Schristos (dma0auto0 5) 60316dce513Schristos (dma0auto1 6) 60416dce513Schristos 60516dce513Schristos (dma0status 7) 60616dce513Schristos 60716dce513Schristos (dma1config 8) 60816dce513Schristos (dma1stride 9) 60916dce513Schristos (dma1count 10) 61016dce513Schristos 61116dce513Schristos (dma1srcaddr 11) 61216dce513Schristos (dma1dstaddr 12) 61316dce513Schristos 61416dce513Schristos (dma1auto0 13) 61516dce513Schristos (dma1auto1 14) 61616dce513Schristos 61716dce513Schristos (dma1status 15) 61816dce513Schristos 61916dce513Schristos ) 62016dce513Schristos ) 62116dce513Schristos;; mem configuration registers in group MR0=0, MR1=1 62216dce513Schristos 62316dce513Schristos(define-keyword 62416dce513Schristos (name crmem-names) 62516dce513Schristos (print-name h-coremem-registers) 62616dce513Schristos (prefix "") 62716dce513Schristos (values 62816dce513Schristos (memconfig 0) 62916dce513Schristos (memstatus 1) 63016dce513Schristos (memprotect 2) 63116dce513Schristos (memreserve 3) 63216dce513Schristos ) 63316dce513Schristos ) 63416dce513Schristos 63516dce513Schristos;; mesh configuration registers in group MR0=1, MR1=1 63616dce513Schristos 63716dce513Schristos(define-keyword 63816dce513Schristos (name crmesh-names) 63916dce513Schristos (print-name h-coremesh-registers) 64016dce513Schristos (prefix "") 64116dce513Schristos 64216dce513Schristos (values 64316dce513Schristos 64416dce513Schristos 64516dce513Schristos (meshconfig 0) 64616dce513Schristos (coreid 1) 64716dce513Schristos (meshmulticast 2) 64816dce513Schristos (swreset 3) 64916dce513Schristos ) 65016dce513Schristos ) 65116dce513Schristos 65216dce513Schristos 65316dce513Schristos 65416dce513Schristos 65516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 65616dce513Schristos ; PC is a byte-addressed register 65716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 65816dce513Schristos 65916dce513Schristos(dnh h-pc "program counter" (PC PROFILE) (pc) () () ()) 66016dce513Schristos 66116dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 66216dce513Schristos ; Memory Effective Address wants to be visible 66316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 66416dce513Schristos 66516dce513Schristos(dnh h-memaddr "memory effective address" (PROFILE) (register SI) () () ()) 66616dce513Schristos(dnop memaddr "memory effective address" (SEM-ONLY) h-memaddr f-nil) 66716dce513Schristos 66816dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 66916dce513Schristos ; Special Core Registers 67016dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 67116dce513Schristos;; STATUS 67216dce513Schristos;; [0]=core active indicator 67316dce513Schristos;; [1]=global interrupt disable 67416dce513Schristos;; [2]=processor mode(1=user mode, 0=kernel mode) 67516dce513Schristos;; [3]=wired AND global flag 67616dce513Schristos 67716dce513Schristos;; [4]=integer zero zbit 67816dce513Schristos;; [5]=integer negative nbit 67916dce513Schristos;; [6]=integer carry cbit 68016dce513Schristos;; [7]=integer overflow vbit 68116dce513Schristos 68216dce513Schristos;; [8]=fpu zero flag bzbit 68316dce513Schristos;; [9]=fpu negative flag bnbit 68416dce513Schristos;; [10]=fpu overflow flag bvbit 68516dce513Schristos;; [11]=fpu carry flag(not used) bcbit 68616dce513Schristos 68716dce513Schristos;; [12]=ialu overflow flag(sticky) vsbit 68816dce513Schristos;; [13]=fpu invalid flag(sticky) bisbit 68916dce513Schristos;; [14]=fpu overflow flag(sticky) bvsbit 69016dce513Schristos;; [15]=fpu underflow flag(sticky) busbit 69116dce513Schristos 69216dce513Schristos;; [17:16]=exception cause 00=no exception 01=load-store exception 10=fpu exception 11=unimplemented instruction 69316dce513Schristos;; expcause1bit 69416dce513Schristos;; expcause0bit 69516dce513Schristos 69616dce513Schristos;; [18]=external load stalled expcause2bit 69716dce513Schristos;; [19]=external fetch stalled extFstallbit 69816dce513Schristos 69916dce513Schristos;; [31:20]=RESERVED 70016dce513Schristos 70116dce513Schristos 70216dce513Schristos 70316dce513Schristos 70416dce513Schristos 70516dce513Schristos(define-hardware 70616dce513Schristos (name h-core-registers) 70716dce513Schristos (comment "Special Core Registers") 70816dce513Schristos (type register USI (17)) 70916dce513Schristos (attrs) 71016dce513Schristos (indices extern-keyword cr-names) 71116dce513Schristos (get (index) 71216dce513Schristos (cond USI 71316dce513Schristos ((eq index (const 1)) ; STATUS reg ? 71416dce513Schristos (or (or (or (or (sll USI kmbit (const 2)) 71516dce513Schristos (sll USI gidisablebit (const 1))) 71616dce513Schristos (or (or (sll USI expcause1bit (const 17)) 71716dce513Schristos (sll USI expcause0bit (const 16))) 71816dce513Schristos (or (sll USI expcause2bit (const 18)) 71916dce513Schristos (sll USI extFstallbit (const 19))))) 72016dce513Schristos (or (or (or (sll USI busbit (const 15)) 72116dce513Schristos (sll USI bisbit (const 13))) 72216dce513Schristos (or (sll USI bvsbit (const 14)) 72316dce513Schristos (sll USI vsbit (const 12)))) 72416dce513Schristos (or (or (sll USI bvbit (const 10)) 72516dce513Schristos (sll USI bcbit (const 11))) 72616dce513Schristos (or (sll USI bnbit (const 9)) 72716dce513Schristos (sll USI bzbit (const 8)))))) 72816dce513Schristos (or (or (or (sll USI vbit (const 7)) 72916dce513Schristos (sll USI cbit (const 6))) 73016dce513Schristos (or (sll USI nbit (const 5)) 73116dce513Schristos (sll USI zbit (const 4)))) 73216dce513Schristos (or (sll USI sflagbit (const 3)) 73316dce513Schristos (sll USI (const 1) (const 0)))))) ;caibit 73416dce513Schristos ((eq index (const 0)) ; Config reg ? 73516dce513Schristos (or (or (or (or (or (or (sll USI timer0bit2 (const 6)) 73616dce513Schristos (sll USI timer0bit3 (const 7))) 73716dce513Schristos (or (or (sll USI coreCfgResBit28 (const 28)) 73816dce513Schristos (sll USI coreCfgResBit29 (const 29))) 73916dce513Schristos (or (sll USI coreCfgResBit30 (const 30)) 74016dce513Schristos (sll USI coreCfgResBit31 (const 31))))) 74116dce513Schristos (or (or (sll USI coreCfgResBit24 (const 24)) 74216dce513Schristos (sll USI coreCfgResBit25 (const 25))) 74316dce513Schristos (or (sll USI coreCfgResBit26 (const 26)) 74416dce513Schristos (sll USI coreCfgResBit27 (const 27))))) 74516dce513Schristos (or (or (sll USI timer0bit0 (const 4)) 74616dce513Schristos (sll USI timer0bit1 (const 5))) 74716dce513Schristos (or (sll USI coreCfgResBit14 (const 14)) 74816dce513Schristos (sll USI coreCfgResBit15 (const 15))))) 74916dce513Schristos (or (or (or (or (sll USI timer1bit2 (const 10)) 75016dce513Schristos (sll USI timer1bit3 (const 11))) 75116dce513Schristos (or (sll USI coreCfgResBit12 (const 12)) 75216dce513Schristos (sll USI coreCfgResBit13 (const 13)))) 75316dce513Schristos (or (sll USI clockGateEnbit (const 22)) 75416dce513Schristos (sll USI mbkptEnbit (const 23)))) 75516dce513Schristos (or (or (sll USI timer1bit0 (const 8)) 75616dce513Schristos (sll USI timer1bit1 (const 9))) 75716dce513Schristos (or (sll USI coreCfgResBit20 (const 20)) 75816dce513Schristos (sll USI coreCfgResBit21 (const 21)))))) 75916dce513Schristos (or (or (sll USI invExcEnbit (const 1)) 76016dce513Schristos (sll USI ovfExcEnbit (const 2))) 76116dce513Schristos (or (or (sll USI trmbit (const 0)) 76216dce513Schristos (sll USI unExcEnbit (const 3))) 76316dce513Schristos (or (or (sll USI arithmetic-modebit0 (const 17)) 76416dce513Schristos (sll USI arithmetic-modebit1 (const 18))) 76516dce513Schristos (or (sll USI arithmetic-modebit2 (const 19)) 76616dce513Schristos (sll USI coreCfgResBit16 (const 16)))))))) ;config reg 76716dce513Schristos 76816dce513Schristos ((eq index (const 2)) (raw-reg USI h-pc)) ;PC reg 76916dce513Schristos 77016dce513Schristos (else (raw-reg USI h-core-registers index)))) 77116dce513Schristos 77216dce513Schristos (set (index val) 77316dce513Schristos (cond VOID 77416dce513Schristos ((eq index (const 0)) ; CONFIG reg 77516dce513Schristos (sequence () 77616dce513Schristos (set trmbit (and (const 1) (srl val (const 0)))) 77716dce513Schristos (set invExcEnbit (and (const 1) (srl val (const 1)))) 77816dce513Schristos (set ovfExcEnbit (and (const 1) (srl val (const 2)))) 77916dce513Schristos (set unExcEnbit (and (const 1) (srl val (const 3)))) 78016dce513Schristos (set timer0bit0 (and (const 1) (srl val (const 4)))) 78116dce513Schristos (set timer0bit1 (and (const 1) (srl val (const 5)))) 78216dce513Schristos (set timer0bit2 (and (const 1) (srl val (const 6)))) 78316dce513Schristos (set timer0bit3 (and (const 1) (srl val (const 7)))) 78416dce513Schristos (set timer1bit0 (and (const 1) (srl val (const 8)))) 78516dce513Schristos (set timer1bit1 (and (const 1) (srl val (const 9)))) 78616dce513Schristos (set timer1bit2 (and (const 1) (srl val (const 10)))) 78716dce513Schristos (set timer1bit3 (and (const 1) (srl val (const 11)))) 78816dce513Schristos 78916dce513Schristos (set coreCfgResBit12 (and (const 1) (srl val (const 12)))) 79016dce513Schristos (set coreCfgResBit13 (and (const 1) (srl val (const 13)))) 79116dce513Schristos (set coreCfgResBit14 (and (const 1) (srl val (const 14)))) 79216dce513Schristos (set coreCfgResBit15 (and (const 1) (srl val (const 15)))) 79316dce513Schristos (set coreCfgResBit16 (and (const 1) (srl val (const 16)))) 79416dce513Schristos 79516dce513Schristos (set arithmetic-modebit0 (and (const 1) (srl val (const 17)))) 79616dce513Schristos (set arithmetic-modebit1 (and (const 1) (srl val (const 18)))) 79716dce513Schristos (set arithmetic-modebit2 (and (const 1) (srl val (const 19)))) 79816dce513Schristos 79916dce513Schristos (set coreCfgResBit20 (and (const 1) (srl val (const 20)))) 80016dce513Schristos (set coreCfgResBit21 (and (const 1) (srl val (const 21)))) 80116dce513Schristos 80216dce513Schristos (set clockGateEnbit (and (const 1) (srl val (const 22)))) 80316dce513Schristos (set mbkptEnbit (and (const 1) (srl val (const 23)))) 80416dce513Schristos 80516dce513Schristos (set coreCfgResBit24 (and (const 1) (srl val (const 24)))) 80616dce513Schristos (set coreCfgResBit25 (and (const 1) (srl val (const 25)))) 80716dce513Schristos (set coreCfgResBit26 (and (const 1) (srl val (const 26)))) 80816dce513Schristos (set coreCfgResBit27 (and (const 1) (srl val (const 27)))) 80916dce513Schristos (set coreCfgResBit28 (and (const 1) (srl val (const 28)))) 81016dce513Schristos (set coreCfgResBit29 (and (const 1) (srl val (const 29)))) 81116dce513Schristos (set coreCfgResBit30 (and (const 1) (srl val (const 30)))) 81216dce513Schristos (set coreCfgResBit31 (and (const 1) (srl val (const 31)))) 81316dce513Schristos 81416dce513Schristos (set (raw-reg USI h-core-registers index) val) 81516dce513Schristos ;; check LSB of CONFIG for rounding mode 81616dce513Schristos (c-call "epiphany_set_rounding_mode" val) 81716dce513Schristos ) 81816dce513Schristos ) 81916dce513Schristos ((eq index (const 1)) ;STATUS reg ; TODO check which bits can be set or clear 82016dce513Schristos (sequence ((USI newval)) 82116dce513Schristos (set newval (and val (const #xfff2))) 82216dce513Schristos (set extFstallbit (and (const 1) (srl newval (const 19)))) 82316dce513Schristos (set expcause2bit (and (const 1) (srl newval (const 18)))) 82416dce513Schristos (set expcause1bit (and (const 1) (srl newval (const 17)))) 82516dce513Schristos (set expcause0bit (and (const 1) (srl newval (const 16)))) 82616dce513Schristos (set busbit (and (const 1) (srl newval (const 15)))) 82716dce513Schristos (set bisbit (and (const 1) (srl newval (const 13)))) 82816dce513Schristos (set bvsbit (and (const 1) (srl newval (const 14)))) 82916dce513Schristos (set vsbit (and (const 1) (srl newval (const 12)))) 83016dce513Schristos (set bvbit (and (const 1) (srl newval (const 10)))) 83116dce513Schristos (set bcbit (and (const 1) (srl newval (const 11)))) 83216dce513Schristos (set bnbit (and (const 1) (srl newval (const 9)))) 83316dce513Schristos (set bzbit (and (const 1) (srl newval (const 8)))) 83416dce513Schristos (set vbit (and (const 1) (srl newval (const 7)))) 83516dce513Schristos (set cbit (and (const 1) (srl newval (const 6)))) 83616dce513Schristos (set nbit (and (const 1) (srl newval (const 5)))) 83716dce513Schristos (set zbit (and (const 1) (srl newval (const 4)))) 83816dce513Schristos (set sflagbit (and (const 1) (srl newval (const 3)))) 83916dce513Schristos (set kmbit (and (const 1) (srl newval (const 2)))) 84016dce513Schristos ;;(set gie (and (const 1) (srl newval (const 1)))) 84116dce513Schristos (set (raw-reg SI h-core-registers (const 1)) newval) 84216dce513Schristos )) 84316dce513Schristos ;; causes simulator errors 84416dce513Schristos ;; ((eq index (const 2)) ;PC reg 84516dce513Schristos ;; (set pc val)) 84616dce513Schristos 84716dce513Schristos (else (set (raw-reg USI h-core-registers index) val)) 84816dce513Schristos )) 84916dce513Schristos) 85016dce513Schristos ; (define-pmacro (hcr-config) (reg h-core-registers 0)) etc. 85116dce513Schristos(.splice begin (.unsplice (.map 85216dce513Schristos (.pmacro (xname xnum) 85316dce513Schristos (define-pmacro ((.sym hcr- xname)) (reg h-core-registers xnum))) 85416dce513Schristos 85516dce513Schristos ( 85616dce513Schristos config 85716dce513Schristos status 85816dce513Schristos pc 85916dce513Schristos debug 86016dce513Schristos iab 86116dce513Schristos lc 86216dce513Schristos ls 86316dce513Schristos le 86416dce513Schristos iret 86516dce513Schristos imask 86616dce513Schristos ilat 86716dce513Schristos ilatst 86816dce513Schristos ilatcl 86916dce513Schristos ipend 87016dce513Schristos ctimer0 87116dce513Schristos ctimer1 87216dce513Schristos hstatus 87316dce513Schristos 87416dce513Schristos 87516dce513Schristos 87616dce513Schristos ) 87716dce513Schristos 87816dce513Schristos (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 87916dce513Schristos ) 88016dce513Schristos ))) 88116dce513Schristos 88216dce513Schristos 88316dce513Schristos 88416dce513Schristos;; DMA registers in MMR space 88516dce513Schristos(define-hardware 88616dce513Schristos (name h-coredma-registers) 88716dce513Schristos (comment "DMA registers in MMR space") 88816dce513Schristos (type register USI (16)) 88916dce513Schristos (attrs) 89016dce513Schristos (indices extern-keyword crdma-names) 89116dce513Schristos ) 89216dce513Schristos 89316dce513Schristos;; MEM registers in MMR space 89416dce513Schristos(define-hardware 89516dce513Schristos (name h-coremem-registers) 89616dce513Schristos (comment "MEM registers in MMR space") 89716dce513Schristos (type register USI (4)) 89816dce513Schristos (attrs) 89916dce513Schristos (indices extern-keyword crmem-names) 90016dce513Schristos ) 90116dce513Schristos 90216dce513Schristos;; MEM registers in MMR space 90316dce513Schristos(define-hardware 90416dce513Schristos (name h-coremesh-registers) 90516dce513Schristos (comment "MESH registers in MMR space") 90616dce513Schristos (type register USI (4)) 90716dce513Schristos (attrs) 90816dce513Schristos (indices extern-keyword crmesh-names) 90916dce513Schristos ) 91016dce513Schristos 91116dce513Schristos 91216dce513Schristos 91316dce513Schristos ; Operands 91416dce513Schristos 91516dce513Schristos ; Branch displacements 91616dce513Schristos(define-operand 91716dce513Schristos (name simm24) 91816dce513Schristos (comment "branch address pc-relative") 91916dce513Schristos (attrs RELAX) 92016dce513Schristos (type h-iaddr) 92116dce513Schristos (index f-simm24) 92216dce513Schristos (handlers (parse "branch_addr"))) 92316dce513Schristos 92416dce513Schristos(define-operand 92516dce513Schristos (name simm8) 92616dce513Schristos (comment "branch address pc-relative") 92716dce513Schristos (attrs RELAX) 92816dce513Schristos (type h-iaddr) 92916dce513Schristos (index f-simm8) 93016dce513Schristos (handlers (parse "branch_addr"))) 93116dce513Schristos 93216dce513Schristos 93316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 93416dce513Schristos ; Register operands 93516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 93616dce513Schristos 93716dce513Schristos(define-pmacro (short-regs nm group hw cmt) 93816dce513Schristos (define-operand 93916dce513Schristos (name nm) 94016dce513Schristos (comment cmt) 94116dce513Schristos (attrs) 94216dce513Schristos (type hw) 94316dce513Schristos (index (.sym "f-r" group)) 94416dce513Schristos (handlers (parse "shortregs") (print "keyword")) 94516dce513Schristos ) 94616dce513Schristos ) 94716dce513Schristos 94816dce513Schristos(define-pmacro (short-regs-core nm group hw cmt) 94916dce513Schristos (define-operand 95016dce513Schristos (name nm) 95116dce513Schristos (comment cmt) 95216dce513Schristos (attrs) 95316dce513Schristos (type hw) 95416dce513Schristos (index (.sym "f-s" group)) 95516dce513Schristos (handlers (parse "shortregs") (print "keyword")) 95616dce513Schristos ) 95716dce513Schristos ) 95816dce513Schristos 95916dce513Schristos 96016dce513Schristos ; short regs (0-7) 96116dce513Schristos(short-regs rd d h-registers "destination register") 96216dce513Schristos(short-regs rn n h-registers "source register") 96316dce513Schristos(short-regs rm m h-registers "source register") 96416dce513Schristos 96516dce513Schristos(short-regs frd d h-fpregisters "fp destination register") 96616dce513Schristos(short-regs frn n h-fpregisters "fp source register") 96716dce513Schristos(short-regs frm m h-fpregisters "fp source register") 96816dce513Schristos 96916dce513Schristos ; long regs (0-63) 97016dce513Schristos(dnop rd6 "destination register" () h-registers f-rd6) 97116dce513Schristos(dnop rn6 "source register" () h-registers f-rn6) 97216dce513Schristos(dnop rm6 "source register" () h-registers f-rm6) 97316dce513Schristos 97416dce513Schristos(dnop frd6 "fp destination register" () h-fpregisters f-rd6) 97516dce513Schristos(dnop frn6 "fp source register" () h-fpregisters f-rn6) 97616dce513Schristos(dnop frm6 "fp source register" () h-fpregisters f-rm6) 97716dce513Schristos 97816dce513Schristos ; special regs (0-7) 97916dce513Schristos(short-regs-core sd d h-core-registers "special destination") 98016dce513Schristos(short-regs-core sn n h-core-registers "special source") 98116dce513Schristos 98216dce513Schristos ; special regs (long form) 98316dce513Schristos(dnop sd6 "special destination register" () h-core-registers f-sd6) 98416dce513Schristos(dnop sn6 "special source register" () h-core-registers f-sn6) 98516dce513Schristos 98616dce513Schristos(dnop sddma "dma register" () h-coredma-registers f-sd6) 98716dce513Schristos(dnop sndma "dma register" () h-coredma-registers f-sn6) 98816dce513Schristos(dnop sdmem "mem register" () h-coremem-registers f-sd6) 98916dce513Schristos(dnop snmem "mem register" () h-coremem-registers f-sn6) 99016dce513Schristos(dnop sdmesh "mesh register" () h-coremesh-registers f-sd6) 99116dce513Schristos(dnop snmesh "mesh register" () h-coremesh-registers f-sn6) 99216dce513Schristos 99316dce513Schristos ; Immediate literals - but don't allow register names! 99416dce513Schristos(define-pmacro (dimmop nm cmt hwtype idx) 99516dce513Schristos (define-operand (name nm) (comment cmt) (type hwtype) (index idx) 99616dce513Schristos (attrs RELAX) 99716dce513Schristos (handlers (parse "simm_not_reg") 99816dce513Schristos (print "simm_not_reg"))) 99916dce513Schristos ) 100016dce513Schristos 100116dce513Schristos(dimmop simm3 "signed 3-bit literal" h-sint f-sdisp3) 100216dce513Schristos(dimmop simm11 "signed 11-bit literal" h-sint f-sdisp11) 100316dce513Schristos(dnop disp3 "short data displacement" () h-uint f-disp3) 100416dce513Schristos(dnop trapnum6 "parameter for swi or trap" () h-uint f-trap-num) 100516dce513Schristos 100616dce513Schristos(define-pmacro (duimmop nm cmt hwtype idx) 100716dce513Schristos (define-operand (name nm) (comment cmt) (type hwtype) (index idx) 100816dce513Schristos (attrs) 100916dce513Schristos (handlers (parse "uimm_not_reg") 101016dce513Schristos (print "uimm_not_reg"))) 101116dce513Schristos ) 101216dce513Schristos 101316dce513Schristos(duimmop swi_num "unsigned 6-bit swi#" h-uint f-trap-num) 101416dce513Schristos(duimmop disp11 "sign-magnitude data displacement" h-uint f-disp11) 101516dce513Schristos 101616dce513Schristos(dnop shift "immediate shift amount" () h-uint f-shift) 101716dce513Schristos 101816dce513Schristos(define-operand (name imm16) (comment "16-bit unsigned literal") (attrs RELAX) 101916dce513Schristos (type h-addr) (index f-imm16) (handlers (parse "imm16"))) 102016dce513Schristos(define-operand (name imm8) (comment "8-bit unsigned literal") (attrs RELAX) 102116dce513Schristos (type h-addr) (index f-imm8) (handlers (parse "imm8"))) 102216dce513Schristos 102316dce513Schristos(define-operand 102416dce513Schristos (name direction) 102516dce513Schristos (comment "+/- indexing") 102616dce513Schristos (attrs) 102716dce513Schristos (type h-uint) 102816dce513Schristos (index f-addsubx) 102916dce513Schristos (handlers (parse "postindex") 103016dce513Schristos (print "postindex"))) 103116dce513Schristos 103216dce513Schristos(define-operand 103316dce513Schristos (name dpmi) 103416dce513Schristos (comment "+/- magnitude immediate displacement") 103516dce513Schristos (attrs) 103616dce513Schristos (type h-uint) 103716dce513Schristos (index f-subd) 103816dce513Schristos (handlers (parse "postindex") 103916dce513Schristos (print "postindex"))) 104016dce513Schristos 104116dce513Schristos 104216dce513Schristos 104316dce513Schristos;; call exception macro - no check for imask 104416dce513Schristos(define-pmacro (call-exception vaddr bit-in-ilat) 104516dce513Schristos (if (eq gidisablebit 0) 104616dce513Schristos (if (eq (and (hcr-imask) bit-in-ilat) 0) 104716dce513Schristos (sequence () 104816dce513Schristos (set kmbit 1) 104916dce513Schristos (set gidisablebit 1) 105016dce513Schristos (set (hcr-iret) (add pc (const 2))) 105116dce513Schristos (set (hcr-ipend) (or (hcr-ipend) (const bit-in-ilat))) 105216dce513Schristos (set pc (const vaddr)) 105316dce513Schristos 105416dce513Schristos ) 105516dce513Schristos ;; schedule interrupt 105616dce513Schristos (set (hcr-ilat) (or (hcr-ilat) (const bit-in-ilat))) 105716dce513Schristos ) 105816dce513Schristos ) 105916dce513Schristos ) 106016dce513Schristos 106116dce513Schristos 106216dce513Schristos;; (lc 5);loop counter Not impemented 106316dce513Schristos;; (ls 6);loop start address Not impemented 106416dce513Schristos;; (le 7);loop end address Not impemented 106516dce513Schristos 106616dce513Schristos;;have callback to adjust pc in case od events ( HW loops ... ) 106716dce513Schristos(define-pmacro (dni_wrapper isnid stdrdesc attr_ strassembl iopcode proceed null_b) 106816dce513Schristos (begin 106916dce513Schristos (dni isnid stdrdesc attr_ strassembl iopcode 107016dce513Schristos (sequence () proceed 107116dce513Schristos (sequence ((USI tmpPC)) 107216dce513Schristos ;;(set tmpPC (c-call USI "epiphany_post_isn_callback" pc)) 107316dce513Schristos 107416dce513Schristos (if (eq pc (hcr-le)) 107516dce513Schristos (set (hcr-lc) (sub (hcr-lc) #x1))) 107616dce513Schristos (if (and 107716dce513Schristos (eq pc (hcr-le)) 107816dce513Schristos (not (eq (hcr-lc) #x0))) 107916dce513Schristos (set pc (hcr-ls))) 108016dce513Schristos ) 108116dce513Schristos ) 108216dce513Schristos null_b) 108316dce513Schristos ) 108416dce513Schristos ) 108516dce513Schristos 108616dce513Schristos 108716dce513Schristos 108816dce513Schristos 108916dce513Schristos 109016dce513Schristos;; Some handy macros 109116dce513Schristos;; 109216dce513Schristos 109316dce513Schristos;; define instructions 109416dce513Schristos;; Short (16 bit forms) must appear first so that instruction 109516dce513Schristos;; selection can reject them and match long forms when registers 109616dce513Schristos;; or immediates exceed the values in the 16 bit instructions 109716dce513Schristos 109816dce513Schristos 109916dce513Schristos;; B<COND> SIMM8 110016dce513Schristos;; B<COND> SIMM24 110116dce513Schristos 110216dce513Schristos(define-pmacro (br-insn name cond g-op) 110316dce513Schristos (begin 110416dce513Schristos ; the 16-bit versions of branch 110516dce513Schristos (dni (.sym "b" name "16") 110616dce513Schristos (.str "Conditional Branch - 16 bit" name) 110716dce513Schristos (COND-CTI SHORT-INSN) 110816dce513Schristos (.str "b" name ".s $simm8") 110916dce513Schristos (+ OP4_BRANCH16 (.sym "OPC_" cond) simm8) 111016dce513Schristos (if (g-op) 111116dce513Schristos (set pc simm8) 111216dce513Schristos ) 111316dce513Schristos () 111416dce513Schristos ) 111516dce513Schristos 111616dce513Schristos (dnmi (.sym "b" name "16r") "relaxable conditional branch" 111716dce513Schristos (COND-CTI RELAXABLE) 111816dce513Schristos (.str "b" name " $simm8") 111916dce513Schristos (emit (.sym "b" name "16") simm8) 112016dce513Schristos ) 112116dce513Schristos 112216dce513Schristos (dni (.sym "b" name) 112316dce513Schristos (.str "Conditional Branch " name) 112416dce513Schristos (COND-CTI) 112516dce513Schristos (.str "b" name ".l $simm24") 112616dce513Schristos (+ OP4_BRANCH (.sym "OPC_" cond) simm24) 112716dce513Schristos (if (g-op) 112816dce513Schristos (set pc simm24) 112916dce513Schristos ) 113016dce513Schristos () 113116dce513Schristos ) 113216dce513Schristos 113316dce513Schristos (dnmi (.sym "b" name "32r") "relaxable conditional branch" 113416dce513Schristos (COND-CTI RELAXED) 113516dce513Schristos (.str "b" name " $simm24") 113616dce513Schristos (emit (.sym "b" name) simm24) 113716dce513Schristos ) 113816dce513Schristos ) 113916dce513Schristos ) 114016dce513Schristos 114116dce513Schristos 114216dce513Schristos ; basic conditional branches for integer arithmetic 114316dce513Schristos(br-insn "eq" EQ (.pmacro () (eq zbit #x1))) 114416dce513Schristos(br-insn "ne" NE (.pmacro () (eq zbit #x0))) 114516dce513Schristos(br-insn "gtu" GTU (.pmacro () (and BI cbit (not BI zbit)))) 114616dce513Schristos(br-insn "gteu" GTEU (.pmacro () (eq cbit #x1))) 114716dce513Schristos(br-insn "lteu" LTEU (.pmacro () (or BI (not BI cbit) zbit))) 114816dce513Schristos(br-insn "ltu" LTU (.pmacro () (eq cbit #x0))) 114916dce513Schristos(br-insn "gt" GT (.pmacro () (and BI (not BI zbit) (eq vbit nbit)))) 115016dce513Schristos(br-insn "gte" GTE (.pmacro () (eq vbit nbit))) 115116dce513Schristos(br-insn "lt" LT (.pmacro () (xor BI vbit nbit))) 115216dce513Schristos(br-insn "lte" LTE (.pmacro () (or BI zbit (xor vbit nbit)))) 115316dce513Schristos 115416dce513Schristos 115516dce513Schristos ; floating point condition codes (floating point instructions) 115616dce513Schristos(br-insn "beq" BEQ (.pmacro () (or BI bzbit bzbit))) 115716dce513Schristos(br-insn "bne" BNE (.pmacro () (not BI bzbit))) 115816dce513Schristos(br-insn "blt" BLT (.pmacro () (and BI bnbit (not bzbit)))) 115916dce513Schristos(br-insn "blte" BLTE (.pmacro () (or BI bnbit bzbit))) 116016dce513Schristos 116116dce513Schristos ; unconditional branches 116216dce513Schristos(dni b16 "short unconditional branch" (UNCOND-CTI SHORT-INSN) 116316dce513Schristos "b.s $simm8" 116416dce513Schristos (+ OP4_BRANCH16 OPC_B simm8) 116516dce513Schristos (set pc simm8) 116616dce513Schristos () 116716dce513Schristos ) 116816dce513Schristos 116916dce513Schristos(dnmi b16r "relaxable b16" 117016dce513Schristos (UNCOND-CTI RELAXABLE) 117116dce513Schristos "b $simm8" 117216dce513Schristos (emit b16 simm8) 117316dce513Schristos ) 117416dce513Schristos 117516dce513Schristos(dni b "long unconditional branch" (UNCOND-CTI) 117616dce513Schristos "b.l $simm24" 117716dce513Schristos (+ OP4_BRANCH OPC_B simm24) 117816dce513Schristos (set pc simm24) 117916dce513Schristos () 118016dce513Schristos ) 118116dce513Schristos 118216dce513Schristos(dnmi b32r "relaxable b" 118316dce513Schristos (UNCOND-CTI RELAXED) 118416dce513Schristos "b $simm24" 118516dce513Schristos (emit b simm24)) 118616dce513Schristos 118716dce513Schristos;; BL R,ADDR 118816dce513Schristos 118916dce513Schristos(dni bl16 "branch and link" 119016dce513Schristos (UNCOND-CTI SHORT-INSN) 119116dce513Schristos ("bl.s $simm8") 119216dce513Schristos (+ OP4_BRANCH16 OPC_BL simm8) 119316dce513Schristos (sequence () 119416dce513Schristos (set (reg h-registers 14) (add pc (const 2))) 119516dce513Schristos (set pc simm8)) 119616dce513Schristos () 119716dce513Schristos ) 119816dce513Schristos 119916dce513Schristos(dnmi bl16r "bl16 relaxable" 120016dce513Schristos (UNCOND-CTI RELAXABLE) 120116dce513Schristos "bl $simm8" 120216dce513Schristos (emit bl16 simm8)) 120316dce513Schristos 120416dce513Schristos(dni bl "branch and link" 120516dce513Schristos (UNCOND-CTI) 120616dce513Schristos ("bl.l $simm24") 120716dce513Schristos (+ OP4_BRANCH OPC_BL simm24) 120816dce513Schristos (sequence () 120916dce513Schristos (set (reg h-registers 14) (add pc (const 4))) 121016dce513Schristos (set pc simm24)) 121116dce513Schristos () 121216dce513Schristos ) 121316dce513Schristos 121416dce513Schristos(dnmi blr "bl relaxable" 121516dce513Schristos (UNCOND-CTI RELAXED) 121616dce513Schristos "bl $simm24" 121716dce513Schristos (emit bl simm24)) 121816dce513Schristos 121916dce513Schristos;; JUMP <RN> 122016dce513Schristos(dni jr16 "unconditional jump 16" 122116dce513Schristos (UNCOND-CTI SHORT-INSN) 122216dce513Schristos ("jr $rn") 122316dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x14) (f-dc-15-3 #x0) (f-dc-9-1 #x0) rn) 122416dce513Schristos (set pc rn) 122516dce513Schristos () 122616dce513Schristos ) 122716dce513Schristos 122816dce513Schristos;; RTS / JR 122916dce513Schristos;; ??? Putting a constant into a multi-ifield does not work - 123016dce513Schristos;; the constant gets inserted in full into each part. 123116dce513Schristos ;(dnmi rts "return from subroutine" 123216dce513Schristos ; (UNCOND-CTI) 123316dce513Schristos ; ("rts") 123416dce513Schristos ; (emit jr (rn6 14)) ; jr lr / jr r14 123516dce513Schristos ;) 123616dce513Schristos;; RTS / JR 123716dce513Schristos(dni rts "return from subroutine" 123816dce513Schristos (ALIAS UNCOND-CTI) 123916dce513Schristos ("rts") 124016dce513Schristos (+ OP4_MISC (f-opc-8-5 #x14) (f-opc-19-4 #x2) (f-rn 6) (f-rn-x 1) 124116dce513Schristos (f-dc-9-1 #x0) 124216dce513Schristos (f-dc-15-3 #x0) 124316dce513Schristos (f-dc-25-6 #x0) 124416dce513Schristos (f-dc-31-3 #x0) 124516dce513Schristos ) 124616dce513Schristos (set pc (reg h-registers 14)) 124716dce513Schristos () 124816dce513Schristos ) 124916dce513Schristos 125016dce513Schristos(dni jr "unconditional jump" 125116dce513Schristos (UNCOND-CTI) 125216dce513Schristos ("jr $rn6") 125316dce513Schristos (+ OP4_MISC (f-opc-8-5 #x14) (f-opc-19-4 #x2) rn6 125416dce513Schristos (f-dc-9-1 #x0) 125516dce513Schristos (f-dc-15-3 #x0) 125616dce513Schristos (f-dc-25-6 #x0) 125716dce513Schristos (f-dc-31-3 #x0) 125816dce513Schristos ) 125916dce513Schristos (set pc rn6) 126016dce513Schristos () 126116dce513Schristos ) 126216dce513Schristos 126316dce513Schristos 126416dce513Schristos;; JALR <RN> 126516dce513Schristos(dni jalr16 "jump and link register" 126616dce513Schristos (UNCOND-CTI SHORT-INSN) 126716dce513Schristos ("jalr $rn") 126816dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x15) (f-dc-15-3 #x0) (f-dc-9-1 #x0) rn) 126916dce513Schristos (sequence () 127016dce513Schristos (set (reg h-registers 14) (add pc (const 2))) 127116dce513Schristos (set pc rn) 127216dce513Schristos ) 127316dce513Schristos () 127416dce513Schristos ) 127516dce513Schristos 127616dce513Schristos(dni jalr "jump and link register" 127716dce513Schristos (UNCOND-CTI) 127816dce513Schristos ("jalr $rn6") 127916dce513Schristos (+ OP4_MISC 128016dce513Schristos (f-opc-8-5 #x15) 128116dce513Schristos (f-opc-19-4 #x2) 128216dce513Schristos rn6 128316dce513Schristos (f-dc-9-1 #x0) 128416dce513Schristos (f-dc-15-3 #x0) 128516dce513Schristos (f-dc-25-6 #x0) 128616dce513Schristos (f-dc-31-3 #x0) 128716dce513Schristos 128816dce513Schristos ) 128916dce513Schristos (sequence () 129016dce513Schristos (set (reg h-registers 14) (add pc (const 4))) 129116dce513Schristos (set pc rn6)) 129216dce513Schristos () 129316dce513Schristos ) 129416dce513Schristos 129516dce513Schristos 129616dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 129716dce513Schristos ; Load/Store Memory Instructions 129816dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 129916dce513Schristos 130016dce513Schristos 130116dce513Schristos(define-pmacro (callMisaligmentExceptionIfNeeded sel addr isAligmentAccess) 130216dce513Schristos (sequence ((BI scale)) 130316dce513Schristos (set isAligmentAccess 130416dce513Schristos (case BI sel 130516dce513Schristos ((OPW_BYTE) (eq (and addr #x0) #x0)) 130616dce513Schristos ((OPW_SHORT) (eq (and addr #x1) #x0)) 130716dce513Schristos ((OPW_WORD) (eq (and addr #x3) #x0)) 130816dce513Schristos (else (eq (and addr #x7) #x0)))) 130916dce513Schristos (if (not BI isAligmentAccess) 131016dce513Schristos (call-exception #x4 #x2)) 131116dce513Schristos ) 131216dce513Schristos) 131316dce513Schristos 131416dce513Schristos 131516dce513Schristos 131616dce513Schristos;; helper to convert size selector OPW_<mode> into a literal scale factor 131716dce513Schristos(define-pmacro (ConvertSelectorToShift sel scale) 131816dce513Schristos (set scale 131916dce513Schristos (case SI sel 132016dce513Schristos ((OPW_BYTE) (const 0)) 132116dce513Schristos ((OPW_SHORT) (const 1)) 132216dce513Schristos ((OPW_WORD) (const 2)) 132316dce513Schristos (else (const 3)))) 132416dce513Schristos) 132516dce513Schristos 132616dce513Schristos;; common load macros from effective address, handling 8/16/32/64 bits 132716dce513Schristos(define-pmacro (load-double-from-ea regnum eff-addr mode sel) 132816dce513Schristos (sequence ((SI loadaddr) (BI isAligmentAccess)) 132916dce513Schristos (set loadaddr eff-addr) 133016dce513Schristos (callMisaligmentExceptionIfNeeded sel loadaddr isAligmentAccess) 133116dce513Schristos 133216dce513Schristos (if (not (not BI isAligmentAccess)) 133316dce513Schristos (sequence () 133416dce513Schristos (set memaddr loadaddr) 133516dce513Schristos (set regnum (mem SI loadaddr)) 133616dce513Schristos (set loadaddr (add loadaddr (const 4))) 133716dce513Schristos (set memaddr loadaddr) 133816dce513Schristos (set (reg h-registers 133916dce513Schristos (add (index-of regnum) 134016dce513Schristos (const 1))) 134116dce513Schristos (mem SI loadaddr)) 134216dce513Schristos 134316dce513Schristos ) 134416dce513Schristos ) 134516dce513Schristos ) 134616dce513Schristos ) 134716dce513Schristos 134816dce513Schristos(define-pmacro (load-from-ea regnum eff-addr mode sel) 134916dce513Schristos (sequence ((BI isAligmentAccess)) 135016dce513Schristos 135116dce513Schristos (callMisaligmentExceptionIfNeeded sel eff-addr isAligmentAccess) 135216dce513Schristos (if (not (not BI isAligmentAccess)) 135316dce513Schristos (sequence () 135416dce513Schristos (set memaddr eff-addr) 135516dce513Schristos (set regnum (zext SI (mem mode eff-addr))) 135616dce513Schristos ) 135716dce513Schristos ) 135816dce513Schristos ) 135916dce513Schristos ) ;; 8/16/32 bit cases 136016dce513Schristos 136116dce513Schristos 136216dce513Schristos;; common store to effective address, handling 8/16/32/64 bit data 136316dce513Schristos(define-pmacro (store-double-to-ea eff-addr regnum mode sel) 136416dce513Schristos (sequence ((SI storeaddr) (BI isAligmentAccess)) 136516dce513Schristos (set storeaddr eff-addr) 136616dce513Schristos (callMisaligmentExceptionIfNeeded sel storeaddr isAligmentAccess) 136716dce513Schristos (if (not (not BI isAligmentAccess)) 136816dce513Schristos (sequence () 136916dce513Schristos (set memaddr storeaddr) 137016dce513Schristos (set (mem SI storeaddr) regnum) 137116dce513Schristos (set storeaddr (add storeaddr (const 4))) 137216dce513Schristos (set memaddr storeaddr) 137316dce513Schristos (set (mem SI storeaddr) 137416dce513Schristos (reg h-registers (add (index-of regnum) (const 1)))) 137516dce513Schristos ) 137616dce513Schristos ) 137716dce513Schristos ) 137816dce513Schristos ) 137916dce513Schristos 138016dce513Schristos(define-pmacro (store-to-ea eff-addr regnum mode sel) 138116dce513Schristos (sequence ((BI isAligmentAccess)) 138216dce513Schristos (callMisaligmentExceptionIfNeeded sel eff-addr isAligmentAccess) 138316dce513Schristos (if (not (not BI isAligmentAccess)) 138416dce513Schristos (sequence () 138516dce513Schristos (set memaddr eff-addr) 138616dce513Schristos (set (mem mode eff-addr) regnum) 138716dce513Schristos ) 138816dce513Schristos ) 138916dce513Schristos ) 139016dce513Schristos ) ;8/16/32 bit cases 139116dce513Schristos 139216dce513Schristos 139316dce513Schristos(define-pmacro (load-insn name mode sel sem-op) 139416dce513Schristos (begin 139516dce513Schristos (dni_wrapper (.sym name "x16.s") 139616dce513Schristos (.str "load " mode " indexed") 139716dce513Schristos (SHORT-INSN) 139816dce513Schristos (.str name " $rd,[$rn,$rm]") 139916dce513Schristos (+ OP4_LDSTR16X sel OP_LOAD rd rn rm) 140016dce513Schristos (sequence () 140116dce513Schristos (sem-op rd (add rn rm) mode sel)) 140216dce513Schristos () 140316dce513Schristos ) 140416dce513Schristos 140516dce513Schristos 140616dce513Schristos (dni_wrapper (.sym name "p16.s") 140716dce513Schristos (.str "load " mode " postmodify") 140816dce513Schristos (SHORT-INSN) 140916dce513Schristos (.str name " $rd,[$rn],$rm") 141016dce513Schristos (+ OP4_LDSTR16P sel OP_LOAD rd rn rm) 141116dce513Schristos (sequence ((SI tmprm)) 141216dce513Schristos (set tmprm rm) 141316dce513Schristos (sem-op rd rn mode sel) 141416dce513Schristos (set rn (add rn tmprm))) 141516dce513Schristos () 141616dce513Schristos ) 141716dce513Schristos 141816dce513Schristos 141916dce513Schristos (dni_wrapper (.sym name "x.l") 142016dce513Schristos (.str "load " mode " indexed") 142116dce513Schristos () 142216dce513Schristos (.str name " $rd6,[$rn6,$direction$rm6]") 142316dce513Schristos (+ OP4_LDSTRX sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x0) rd6 rn6 direction rm6) 142416dce513Schristos (sequence () 142516dce513Schristos (if (ifield f-addsubx) 142616dce513Schristos (sem-op rd6 (sub rn6 rm6) mode sel) 142716dce513Schristos (sem-op rd6 (add rn6 rm6) mode sel))) 142816dce513Schristos () 142916dce513Schristos ) 143016dce513Schristos 143116dce513Schristos (dnmi (.sym name "x") 143216dce513Schristos (.str "load " mode " indexed") 143316dce513Schristos (NO-DIS) 143416dce513Schristos (.str name ".l $rd6,[$rn6,$direction$rm6]") 143516dce513Schristos (emit (.sym name "x.l") rd6 rn6 direction rm6) 143616dce513Schristos ) 143716dce513Schristos 143816dce513Schristos 143916dce513Schristos 144016dce513Schristos (dni_wrapper (.sym name "p.l") 144116dce513Schristos (.str "load " mode " postmodify") 144216dce513Schristos () 144316dce513Schristos (.str name " $rd6,[$rn6],$direction$rm6") 144416dce513Schristos (+ OP4_LDSTRP sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-2 #x0) rd6 rn6 direction rm6) 144516dce513Schristos (sequence ((SI tmprm)) 144616dce513Schristos (set tmprm rm6) 144716dce513Schristos (sem-op rd6 rn6 mode sel) 144816dce513Schristos (if (ifield f-addsubx) 144916dce513Schristos (set rn6 (sub rn6 tmprm)) 145016dce513Schristos (set rn6 (add rn6 tmprm))) 145116dce513Schristos ) 145216dce513Schristos () 145316dce513Schristos ) 145416dce513Schristos 145516dce513Schristos 145616dce513Schristos (dnmi (.sym name "p") 145716dce513Schristos (.str "load " mode " postmodify") 145816dce513Schristos (NO-DIS) 145916dce513Schristos (.str name ".l $rd6,[$rn6],$direction$rm6") 146016dce513Schristos (emit (.sym name "p.l") rd6 rn6 direction rm6) 146116dce513Schristos ) 146216dce513Schristos 146316dce513Schristos 146416dce513Schristos ;;immediate modes last so reg forms found first. 146516dce513Schristos (dni_wrapper (.sym name "d16.s") 146616dce513Schristos (.str "load " mode " displacement") 146716dce513Schristos (SHORT-INSN IMM3) 146816dce513Schristos (.str name " $rd,[$rn,$disp3]") 146916dce513Schristos (+ OP4_LDSTR16D sel OP_LOAD rd rn disp3) ;; convert size to 'B' 147016dce513Schristos (sequence ((SI effa) 147116dce513Schristos (SI scale)) 147216dce513Schristos (ConvertSelectorToShift sel scale) 147316dce513Schristos (set effa (add rn (sll disp3 scale))) 147416dce513Schristos (sem-op rd effa mode sel) 147516dce513Schristos ) 147616dce513Schristos () 147716dce513Schristos ) 147816dce513Schristos 147916dce513Schristos 148016dce513Schristos (dni_wrapper (.sym name "d.l") 148116dce513Schristos (.str "load " mode " displacement") 148216dce513Schristos () 148316dce513Schristos (.str name " $rd6,[$rn6,$dpmi$disp11]") 148416dce513Schristos (+ OP4_LDSTRD sel OP_LOAD PMOD_DISP rd6 rn6 dpmi disp11) 148516dce513Schristos (sequence ((SI effa) 148616dce513Schristos (SI scale)) 148716dce513Schristos (ConvertSelectorToShift sel scale) 148816dce513Schristos (if dpmi 148916dce513Schristos (set effa (sub rn6 (sll disp11 scale))) 149016dce513Schristos (set effa (add rn6 (sll disp11 scale))) 149116dce513Schristos ) 149216dce513Schristos (sem-op rd6 effa mode sel) 149316dce513Schristos ) 149416dce513Schristos () 149516dce513Schristos ) 149616dce513Schristos 149716dce513Schristos (dnmi (.sym name "d") 149816dce513Schristos (.str "load " mode " displacement") 149916dce513Schristos (NO-DIS) 150016dce513Schristos (.str name ".l $rd6,[$rn6,$dpmi$disp11]") 150116dce513Schristos (emit (.sym name "d.l") rd6 rn6 dpmi disp11) 150216dce513Schristos ) 150316dce513Schristos 150416dce513Schristos 150516dce513Schristos 150616dce513Schristos (dni_wrapper (.sym name "dpm.l") 150716dce513Schristos (.str "load " mode " displacement post-modify") 150816dce513Schristos () 150916dce513Schristos (.str name " $rd6,[$rn6],$dpmi$disp11") 151016dce513Schristos (+ OP4_LDSTRD sel OP_LOAD PMOD_POST rd6 rn6 dpmi disp11) 151116dce513Schristos (sequence ((SI scale)) 151216dce513Schristos (ConvertSelectorToShift sel scale) 151316dce513Schristos (sem-op rd6 rn6 mode sel) 151416dce513Schristos (if dpmi 151516dce513Schristos (set rn6 (sub rn6 (sll disp11 scale))) 151616dce513Schristos (set rn6 (add rn6 (sll disp11 scale))) 151716dce513Schristos ) 151816dce513Schristos ) 151916dce513Schristos () 152016dce513Schristos ) 152116dce513Schristos 152216dce513Schristos (dnmi (.sym name "dpm") 152316dce513Schristos (.str "load " mode " displacement post-modify") 152416dce513Schristos (NO-DIS) 152516dce513Schristos (.str name ".l $rd6,[$rn6],$dpmi$disp11") 152616dce513Schristos (emit (.sym name "dpm.l") rd6 rn6 dpmi disp11) 152716dce513Schristos ) 152816dce513Schristos 152916dce513Schristos 153016dce513Schristos ;; ;; macro form with a zero displacement 153116dce513Schristos (dnmi (.sym name "ds0") "load with 0 disp" 153216dce513Schristos (SHORT-INSN IMM3) 153316dce513Schristos (.str name " $rd,[$rn]") 153416dce513Schristos (emit (.sym name "d16.s") rd rn (disp3 0)) 153516dce513Schristos ) 153616dce513Schristos (dnmi (.sym name "dl0") "load with 0 disp" 153716dce513Schristos (NO-DIS) 153816dce513Schristos (.str name " $rd6,[$rn6]") 153916dce513Schristos (emit (.sym name "d.l") rd6 rn6 (dpmi 0) (disp11 0)) 154016dce513Schristos ) 154116dce513Schristos (dnmi (.sym name "dl0.l") "load with 0 disp" 154216dce513Schristos (NO-DIS) 154316dce513Schristos (.str name ".l $rd6,[$rn6]") 154416dce513Schristos (emit (.sym name "d.l") rd6 rn6 (dpmi 0) (disp11 0)) 154516dce513Schristos ) 154616dce513Schristos 154716dce513Schristos 154816dce513Schristos ) 154916dce513Schristos ) 155016dce513Schristos 155116dce513Schristos(load-insn ldrb QI OPW_BYTE load-from-ea) 155216dce513Schristos(load-insn ldrh HI OPW_SHORT load-from-ea) 155316dce513Schristos(load-insn ldr SI OPW_WORD load-from-ea) 155416dce513Schristos(load-insn ldrd DI OPW_DOUBLE load-double-from-ea) 155516dce513Schristos 155616dce513Schristos 155716dce513Schristos 155816dce513Schristos 155916dce513Schristos;; TMP = MEM[RD+RM]; /* Copy content of memory to tmp. */ 156016dce513Schristos;; if (~TMP) /* Check if memory location is zero. */ 156116dce513Schristos;; MEM[RD+RM] = RD; /* If zero, write RD to memory. */ 156216dce513Schristos;; RD = TMP; /* Always write tmp into RD (NOTE it's destructive). */ 156316dce513Schristos 156416dce513Schristos 156516dce513Schristos(define-pmacro (testset-insn name mode sel) 156616dce513Schristos (begin 156716dce513Schristos 156816dce513Schristos 156916dce513Schristos (dni_wrapper (.sym name "t") 157016dce513Schristos (.str "testset " mode " indexed") 157116dce513Schristos () 157216dce513Schristos (.str name " $rd6,[$rn6,$direction$rm6]") 157316dce513Schristos (+ OP4_LDSTRX sel OP_LOAD (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x1) 157416dce513Schristos rd6 rn6 direction rm6) 157516dce513Schristos (sequence ((SI tmemaddr) (SI tmpValReg)) 157616dce513Schristos 157716dce513Schristos ;;back up register 157816dce513Schristos (set tmpValReg rd6) 157916dce513Schristos 158016dce513Schristos (if (ifield f-addsubx) 158116dce513Schristos (set tmemaddr (sub rn6 rm6)) 158216dce513Schristos (set tmemaddr (add rn6 rm6)) 158316dce513Schristos ) 158416dce513Schristos ;;always update rd 158516dce513Schristos (load-from-ea rd6 tmemaddr mode sel) 158616dce513Schristos ;;if zero 158716dce513Schristos (if rd6 158816dce513Schristos (nop) 158916dce513Schristos (set (mem mode tmemaddr) tmpValReg) 159016dce513Schristos ) 159116dce513Schristos 159216dce513Schristos ) 159316dce513Schristos () 159416dce513Schristos ) 159516dce513Schristos 159616dce513Schristos 159716dce513Schristos (dnmi (.sym name "t.l") 159816dce513Schristos (.str "testset " mode ".l indexed") 159916dce513Schristos (NO-DIS) 160016dce513Schristos (.str name ".l $rd6,[$rn6,$direction$rm6]") 160116dce513Schristos (emit (.sym name "t") rd6 rn6 direction rm6) 160216dce513Schristos ) 160316dce513Schristos 160416dce513Schristos 160516dce513Schristos ) 160616dce513Schristos ) 160716dce513Schristos 160816dce513Schristos(testset-insn testsetb QI OPW_BYTE) 160916dce513Schristos(testset-insn testseth HI OPW_SHORT) 161016dce513Schristos(testset-insn testset SI OPW_WORD) 161116dce513Schristos;;no double mode support, since we have to send the src address, data 161216dce513Schristos;;(testset-insn testsetd DI OPW_DOUBLE load-double-from-ea) 161316dce513Schristos 161416dce513Schristos 161516dce513Schristos 161616dce513Schristos;; need 16 bit forms too 161716dce513Schristos(define-pmacro (store-insn name mode sel sem-op) 161816dce513Schristos (begin 161916dce513Schristos (dni_wrapper (.sym name "x16") 162016dce513Schristos (.str "store" mode " indexed") 162116dce513Schristos (SHORT-INSN) 162216dce513Schristos (.str name " $rd,[$rn,$rm]") 162316dce513Schristos (+ OP4_LDSTR16X sel OP_STORE rd rn rm) 162416dce513Schristos (sequence () 162516dce513Schristos (sem-op (add rn rm) rd mode sel) 162616dce513Schristos ) 162716dce513Schristos () 162816dce513Schristos ) 162916dce513Schristos 163016dce513Schristos (dni_wrapper (.sym name "x") 163116dce513Schristos (.str "store" mode " indexed") 163216dce513Schristos () 163316dce513Schristos (.str name " $rd6,[$rn6,$direction$rm6]") 163416dce513Schristos (+ OP4_LDSTRX sel OP_STORE (f-opc-19-4 #x0) (f-dc-22-1 #x0) (f-dc-21-1 #x0) rd6 rn6 direction rm6) 163516dce513Schristos (sequence () 163616dce513Schristos (if (ifield f-addsubx) 163716dce513Schristos (sem-op (sub rn6 rm6) rd6 mode sel) 163816dce513Schristos (sem-op (add rn6 rm6) rd6 mode sel) 163916dce513Schristos )) 164016dce513Schristos () 164116dce513Schristos ) 164216dce513Schristos 164316dce513Schristos (dnmi (.sym name "x.l") 164416dce513Schristos (.str "store" mode " indexed") 164516dce513Schristos (NO-DIS) 164616dce513Schristos (.str name ".l $rd6,[$rn6,$direction$rm6]") 164716dce513Schristos (emit (.sym name "x") rd6 rn6 direction rm6) 164816dce513Schristos ) 164916dce513Schristos 165016dce513Schristos 165116dce513Schristos 165216dce513Schristos 165316dce513Schristos 165416dce513Schristos (dni_wrapper (.sym name "p16") 165516dce513Schristos (.str "store " mode " postmodify") 165616dce513Schristos (SHORT-INSN) 165716dce513Schristos (.str name " $rd,[$rn],$rm") 165816dce513Schristos (+ OP4_LDSTR16P sel OP_STORE rd rn rm) 165916dce513Schristos (sequence () 166016dce513Schristos (sem-op rn rd mode sel) 166116dce513Schristos (set rn (add rn rm)) 166216dce513Schristos ) 166316dce513Schristos () 166416dce513Schristos ) 166516dce513Schristos 166616dce513Schristos (dni_wrapper (.sym name "p") 166716dce513Schristos (.str "store " mode " postmodify") 166816dce513Schristos () 166916dce513Schristos (.str name " $rd6,[$rn6],$direction$rm6") 167016dce513Schristos (+ OP4_LDSTRP sel OP_STORE (f-opc-19-4 #x0) (f-dc-22-2 #x0) rd6 rn6 direction rm6) 167116dce513Schristos (sequence () 167216dce513Schristos (sem-op rn6 rd6 mode sel) 167316dce513Schristos (if (ifield f-addsubx) 167416dce513Schristos (set rn6 (sub rn6 rm6)) 167516dce513Schristos (set rn6 (add rn6 rm6))) 167616dce513Schristos ) 167716dce513Schristos () 167816dce513Schristos ) 167916dce513Schristos (dnmi (.sym name "p.l") 168016dce513Schristos (.str "store " mode " postmodify") 168116dce513Schristos (NO-DIS) 168216dce513Schristos (.str name ".l $rd6,[$rn6],$direction$rm6") 168316dce513Schristos (emit (.sym name "p") rd6 rn6 direction rm6) 168416dce513Schristos ) 168516dce513Schristos 168616dce513Schristos (dni_wrapper (.sym name "d16") 168716dce513Schristos (.str "store " mode " displacement") 168816dce513Schristos (SHORT-INSN IMM3) 168916dce513Schristos (.str name " $rd,[$rn,$disp3]") 169016dce513Schristos (+ OP4_LDSTR16D sel OP_STORE rd rn disp3) ;; convert size to 'B' 169116dce513Schristos (sequence ((SI effa) 169216dce513Schristos (SI scale)) 169316dce513Schristos (ConvertSelectorToShift sel scale) 169416dce513Schristos (set effa (add rn (sll disp3 scale))) 169516dce513Schristos (sem-op effa rd mode sel) 169616dce513Schristos ) 169716dce513Schristos () 169816dce513Schristos ) 169916dce513Schristos 170016dce513Schristos (dni_wrapper (.sym name "d") 170116dce513Schristos (.str "store " mode " displacement") 170216dce513Schristos () 170316dce513Schristos (.str name " $rd6,[$rn6,$dpmi$disp11]") 170416dce513Schristos (+ OP4_LDSTRD sel OP_STORE PMOD_DISP rd6 rn6 dpmi disp11) 170516dce513Schristos (sequence ((SI effa) 170616dce513Schristos (SI scale)) 170716dce513Schristos (ConvertSelectorToShift sel scale) 170816dce513Schristos (if dpmi 170916dce513Schristos (set effa (sub rn6 (sll disp11 scale))) 171016dce513Schristos (set effa (add rn6 (sll disp11 scale))) 171116dce513Schristos ) 171216dce513Schristos (sem-op effa rd6 mode sel) 171316dce513Schristos ) 171416dce513Schristos () 171516dce513Schristos ) 171616dce513Schristos 171716dce513Schristos (dnmi (.sym name "d.l") 171816dce513Schristos (.str "store " mode " displacement") 171916dce513Schristos (NO-DIS) 172016dce513Schristos (.str name ".l $rd6,[$rn6,$dpmi$disp11]") 172116dce513Schristos (emit (.sym name "d") rd6 rn6 dpmi disp11) 172216dce513Schristos ) 172316dce513Schristos 172416dce513Schristos 172516dce513Schristos (dni_wrapper (.sym name "dpm") 172616dce513Schristos (.str "store " mode " displacement post-modify") 172716dce513Schristos () 172816dce513Schristos (.str name " $rd6,[$rn6],$dpmi$disp11") 172916dce513Schristos (+ OP4_LDSTRD sel OP_STORE PMOD_POST rd6 rn6 dpmi disp11) ;; convert size to 'B' 173016dce513Schristos (sequence ((SI scale)) 173116dce513Schristos (ConvertSelectorToShift sel scale) 173216dce513Schristos (sem-op rn6 rd6 mode sel) 173316dce513Schristos (if dpmi 173416dce513Schristos (set rn6 (sub rn6 (sll disp11 scale))) 173516dce513Schristos (set rn6 (add rn6 (sll disp11 scale))) 173616dce513Schristos ) 173716dce513Schristos ) 173816dce513Schristos () 173916dce513Schristos ) 174016dce513Schristos (dnmi (.sym name "dpm.l") 174116dce513Schristos (.str "store " mode " displacement post-modify") 174216dce513Schristos (NO-DIS) 174316dce513Schristos (.str name ".l $rd6,[$rn6],$dpmi$disp11") 174416dce513Schristos (emit (.sym name "dpm") rd6 rn6 dpmi disp11) 174516dce513Schristos ) 174616dce513Schristos 174716dce513Schristos ;; macro form with a zero displacement 174816dce513Schristos (dnmi (.sym name "ds0") "store w 0 disp" 174916dce513Schristos (SHORT-INSN IMM3) 175016dce513Schristos (.str name " $rd,[$rn]") 175116dce513Schristos (emit (.sym name "d16") rd rn (disp3 0)) 175216dce513Schristos ) 175316dce513Schristos 175416dce513Schristos (dnmi (.sym name "dl0") "store w 0 disp" 175516dce513Schristos () 175616dce513Schristos (.str name " $rd6,[$rn6]") 175716dce513Schristos (emit (.sym name "d") rd6 rn6 (dpmi 0) (disp11 0)) 175816dce513Schristos ) 175916dce513Schristos 176016dce513Schristos (dnmi (.sym name "dl0.l") "store w 0 disp" 176116dce513Schristos (NO-DIS) 176216dce513Schristos (.str name ".l $rd6,[$rn6]") 176316dce513Schristos (emit (.sym name "d") rd6 rn6 (dpmi 0) (disp11 0)) 176416dce513Schristos ) 176516dce513Schristos 176616dce513Schristos 176716dce513Schristos 176816dce513Schristos ) 176916dce513Schristos ) 177016dce513Schristos 177116dce513Schristos(store-insn strb QI OPW_BYTE store-to-ea) 177216dce513Schristos(store-insn strh HI OPW_SHORT store-to-ea) 177316dce513Schristos(store-insn str SI OPW_WORD store-to-ea) 177416dce513Schristos(store-insn strd DI OPW_DOUBLE store-double-to-ea) 177516dce513Schristos 177616dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 177716dce513Schristos;; MOV<COND> RD,RN 177816dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 177916dce513Schristos 178016dce513Schristos(define-pmacro (move-insns name cond g-op) 178116dce513Schristos (begin 178216dce513Schristos (dni_wrapper (.sym "cmov16" cond) 178316dce513Schristos (.str "move register " cond) 178416dce513Schristos (SHORT-INSN) 178516dce513Schristos (.str "mov" name " $rd,$rn") 178616dce513Schristos (+ OP4_FLOW16 (.sym "OPC_" cond) (f-opc-8-1 #x0) (f-dc-9-1 #x0) rd rn) 178716dce513Schristos (if (g-op) 178816dce513Schristos (set rd rn)) 178916dce513Schristos () 179016dce513Schristos ) 179116dce513Schristos 179216dce513Schristos (dni_wrapper (.sym "cmov" cond) 179316dce513Schristos (.str "move register " cond) 179416dce513Schristos () 179516dce513Schristos (.str "mov" name " $rd6,$rn6") 179616dce513Schristos (+ OP4_MISC (.sym "OPC_" cond) (f-opc-8-1 #x0) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-6 #x0) rd6 rn6) 179716dce513Schristos (if (g-op) 179816dce513Schristos (set rd6 rn6)) 179916dce513Schristos () 180016dce513Schristos ) 180116dce513Schristos (dnmi (.sym "cmov.l" cond) 180216dce513Schristos (.str "move register " cond) 180316dce513Schristos (NO-DIS) 180416dce513Schristos (.str "mov" name ".l $rd6,$rn6") 180516dce513Schristos (emit (.sym "cmov" cond) rd6 rn6) 180616dce513Schristos ) 180716dce513Schristos 180816dce513Schristos 180916dce513Schristos 181016dce513Schristos ) 181116dce513Schristos ) 181216dce513Schristos 181316dce513Schristos ; basic conditional moves 181416dce513Schristos(move-insns "eq" EQ (.pmacro () (eq zbit #x1))) 181516dce513Schristos(move-insns "ne" NE (.pmacro () (eq zbit #x0))) 181616dce513Schristos(move-insns "gtu" GTU (.pmacro () (and BI cbit (not BI zbit)))) 181716dce513Schristos(move-insns "gteu" GTEU (.pmacro () (eq cbit #x1))) 181816dce513Schristos(move-insns "lteu" LTEU (.pmacro () (or BI (not BI cbit) zbit))) 181916dce513Schristos(move-insns "ltu" LTU (.pmacro () (eq cbit #x0))) 182016dce513Schristos(move-insns "gt" GT (.pmacro () (and BI (not BI zbit) (eq vbit nbit)))) 182116dce513Schristos(move-insns "gte" GTE (.pmacro () (eq vbit nbit))) 182216dce513Schristos(move-insns "lt" LT (.pmacro () (xor BI vbit nbit))) 182316dce513Schristos(move-insns "lte" LTE (.pmacro () (or BI zbit (xor vbit nbit)))) 182416dce513Schristos 182516dce513Schristos ; unconditional move 182616dce513Schristos(move-insns "" B (.pmacro () #x1)) 182716dce513Schristos 182816dce513Schristos 182916dce513Schristos ; floating point condition codes (floating point instructions) 183016dce513Schristos(move-insns "beq" BEQ (.pmacro () (or BI bzbit bzbit))) 183116dce513Schristos(move-insns "bne" BNE (.pmacro () (not BI bzbit))) 183216dce513Schristos(move-insns "blt" BLT (.pmacro () (and BI bnbit (not bzbit)))) 183316dce513Schristos(move-insns "blte" BLTE (.pmacro () (or BI bnbit bzbit))) 183416dce513Schristos 183516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 183616dce513Schristos;; MOVTS RD,RN 183716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 183816dce513Schristos 183916dce513Schristos;; 16 bits form exists for group zero ( M1 and M0 equals to zero ) only 184016dce513Schristos 184116dce513Schristos(dni_wrapper movts16 184216dce513Schristos "move to special reg" 184316dce513Schristos (SHORT-INSN) 184416dce513Schristos "movts $sn,$rd" 184516dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x10) (f-dc-9-1 #x0) rd sn) ;; rd is source for movts 184616dce513Schristos (set sn rd) 184716dce513Schristos () 184816dce513Schristos ) 184916dce513Schristos 185016dce513Schristos(define-pmacro (op-mmr-movts name sdreg code) 185116dce513Schristos (begin 185216dce513Schristos 185316dce513Schristos (dni_wrapper (.sym "movts" name) 185416dce513Schristos (.str "move to " name) 185516dce513Schristos () 185616dce513Schristos (.str "movts $" sdreg ",$rd6") 185716dce513Schristos (+ OP4_MISC (f-dc-7-4 #x0) (f-opc-8-1 #x1) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-4 #x0) (f-dc-21-2 code) sdreg rd6);; rd is source for movts 185816dce513Schristos (set sdreg rd6) 185916dce513Schristos () 186016dce513Schristos ) 186116dce513Schristos 186216dce513Schristos (dnmi (.sym "movts.l" name) 186316dce513Schristos (.str "move to " name) 186416dce513Schristos (NO-DIS) 186516dce513Schristos (.str "movts.l $" sdreg ",$rd6") 186616dce513Schristos (emit (.sym "movts" name) sdreg rd6) 186716dce513Schristos ) 186816dce513Schristos 186916dce513Schristos 187016dce513Schristos 187116dce513Schristos 187216dce513Schristos ) 187316dce513Schristos ) 187416dce513Schristos 187516dce513Schristos(op-mmr-movts 6 sn6 #x0) 187616dce513Schristos(op-mmr-movts dma sndma #x1) 187716dce513Schristos(op-mmr-movts mem snmem #x2) 187816dce513Schristos(op-mmr-movts mesh snmesh #x3) 187916dce513Schristos 188016dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 188116dce513Schristos;; MOVFS 188216dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 188316dce513Schristos(dni_wrapper movfs16 188416dce513Schristos "move from special register" 188516dce513Schristos (SHORT-INSN) 188616dce513Schristos "movfs $rd,$sn" 188716dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x11) (f-dc-9-1 #x0) rd sn) 188816dce513Schristos (set rd sn) 188916dce513Schristos () 189016dce513Schristos ) 189116dce513Schristos 189216dce513Schristos 189316dce513Schristos 189416dce513Schristos(define-pmacro (op-mmr-movfs name snreg code) 189516dce513Schristos (begin 189616dce513Schristos 189716dce513Schristos (dni_wrapper (.sym "movfs" name) 189816dce513Schristos (.str "move from " name) 189916dce513Schristos () 190016dce513Schristos (.str "movfs $rd6,$" snreg) 190116dce513Schristos (+ OP4_MISC (f-dc-7-4 #x1) (f-opc-8-1 #x1) (f-dc-9-1 #x0) (f-opc-19-4 #x2) (f-dc-25-4 #x0) (f-dc-21-2 code) rd6 snreg) 190216dce513Schristos (set rd6 snreg) 190316dce513Schristos () 190416dce513Schristos ) 190516dce513Schristos 190616dce513Schristos (dnmi (.sym "movfs.l" name) 190716dce513Schristos (.str "move from " name) 190816dce513Schristos (NO-DIS) 190916dce513Schristos (.str "movfs.l $rd6,$" snreg) 191016dce513Schristos (emit (.sym "movfs" name) rd6 snreg) 191116dce513Schristos ) 191216dce513Schristos 191316dce513Schristos 191416dce513Schristos 191516dce513Schristos ) 191616dce513Schristos ) 191716dce513Schristos 191816dce513Schristos(op-mmr-movfs 6 sn6 #x0) 191916dce513Schristos(op-mmr-movfs dma sndma #x1) 192016dce513Schristos(op-mmr-movfs mem snmem #x2) 192116dce513Schristos(op-mmr-movfs mesh snmesh #x3) 192216dce513Schristos 192316dce513Schristos 192416dce513Schristos 192516dce513Schristos 192616dce513Schristos 192716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 192816dce513Schristos;; NOP 0x1a2 192916dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 193016dce513Schristos(dni_wrapper nop 193116dce513Schristos "no-operation" 193216dce513Schristos (SHORT-INSN) 193316dce513Schristos "nop" 193416dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1a) (f-dc-15-7 #x0)) 193516dce513Schristos (nop) 193616dce513Schristos () 193716dce513Schristos ) 193816dce513Schristos 193916dce513Schristos 194016dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 194116dce513Schristos;; SNOP 0x3a2 194216dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 194316dce513Schristos(dni_wrapper snop 194416dce513Schristos "no-operation" 194516dce513Schristos (SHORT-INSN) 194616dce513Schristos "snop" 194716dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x3a) (f-dc-15-7 #x0)) 194816dce513Schristos (nop) 194916dce513Schristos () 195016dce513Schristos ) 195116dce513Schristos 195216dce513Schristos 195316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 195416dce513Schristos;; UNIMPL 195516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 195616dce513Schristos(dni_wrapper unimpl 195716dce513Schristos "not-implemented" 195816dce513Schristos () 195916dce513Schristos "unimpl" 196016dce513Schristos (+ (f-opc-31-32 #x000F000F)) 196116dce513Schristos (nop) 196216dce513Schristos () 196316dce513Schristos ) 196416dce513Schristos 196516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 196616dce513Schristos;; IDLE 196716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 196816dce513Schristos 196916dce513Schristos(dni idle "idle until interrupt" () "idle" 197016dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1b) (f-dc-15-7 #x0)) 197116dce513Schristos ;; (set pc pc) ;; should branch to self until interrupt, but not modeling interrupts 197216dce513Schristos (sequence () 197316dce513Schristos (set caibit 0) 197416dce513Schristos (c-code "sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, \ 197516dce513Schristos pc, sim_exited, 0);")) 197616dce513Schristos () 197716dce513Schristos ) 197816dce513Schristos 197916dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 198016dce513Schristos;; BKPT 198116dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 198216dce513Schristos 198316dce513Schristos(dni bkpt 198416dce513Schristos "breakpoint" 198516dce513Schristos (SHORT-INSN) 198616dce513Schristos "bkpt" 198716dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1c) (f-dc-15-7 #x0)) 198816dce513Schristos (sequence () 198916dce513Schristos (c-call "epiphany_break" pc) 199016dce513Schristos (set pc pc) 199116dce513Schristos ) 199216dce513Schristos () 199316dce513Schristos ) 199416dce513Schristos 199516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 199616dce513Schristos;; MBKPT 199716dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 199816dce513Schristos 199916dce513Schristos(dni mbkpt 200016dce513Schristos "multicorebreakpoint" 200116dce513Schristos (SHORT-INSN) 200216dce513Schristos "mbkpt" 200316dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1c) (f-dc-15-7 #x1)) 200416dce513Schristos ;;;(c-call "epiphany_break" pc) 200516dce513Schristos (nop) ;; ignore the multi core break point in the simulator 200616dce513Schristos () 200716dce513Schristos ) 200816dce513Schristos 200916dce513Schristos;;;;;;;;;;;;;;;; 201016dce513Schristos;; RTI 201116dce513Schristos;;;;;;;;;;;;;;;; 201216dce513Schristos 201316dce513Schristos(dni rti "return from interrupt" (SHORT-INSN UNCOND-CTI) 201416dce513Schristos "rti" 201516dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1d) (f-dc-15-7 #x0)) 201616dce513Schristos (sequence () 201716dce513Schristos ;; (set (hcr-ipend) 201816dce513Schristos ;; (xor (hcr-ipend) 201916dce513Schristos ;; (sll (const 1) 202016dce513Schristos ;; (sub (c-raw-call SI "ffs" (and (hcr-ipend) (not (hcr-imask)))) 202116dce513Schristos ;; (const 1))))) 202216dce513Schristos 202316dce513Schristos (set (hcr-ipend) 202416dce513Schristos (c-call SI "epiphany_rti" (hcr-ipend) (hcr-imask))) 202516dce513Schristos (set gidisablebit 0) 202616dce513Schristos (set kmbit 0) 202716dce513Schristos ;(set caibit 1) 202816dce513Schristos (set pc (hcr-iret))) 202916dce513Schristos () 203016dce513Schristos ) 203116dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 203216dce513Schristos;; WAND is a wired flag that runs around the chip 203316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 203416dce513Schristos(dni_wrapper wand "wand" 203516dce513Schristos (SHORT-INSN) 203616dce513Schristos "wand" 203716dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x18) (f-dc-15-7 #x0)) 203816dce513Schristos (set sflagbit 1) 203916dce513Schristos () 204016dce513Schristos ) 204116dce513Schristos 204216dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 204316dce513Schristos;; Sync likes wand, but wired OR 204416dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 204516dce513Schristos(dni_wrapper sync "sync" 204616dce513Schristos (SHORT-INSN) 204716dce513Schristos "sync" 204816dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1f) (f-dc-15-7 #x0)) 204916dce513Schristos (nop);;TODO 205016dce513Schristos () 205116dce513Schristos ) 205216dce513Schristos 205316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 205416dce513Schristos;; GIE 205516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 205616dce513Schristos(dni_wrapper gien "global interrupt enable" 205716dce513Schristos (SHORT-INSN) 205816dce513Schristos "gie" 205916dce513Schristos (+ OP4_FLOW16 (f-gien-gidis-9-1 #x0) (f-opc-8-5 #x19) (f-dc-15-6 #x0)) 206016dce513Schristos (set gidisablebit 0) 206116dce513Schristos () 206216dce513Schristos ) 206316dce513Schristos 206416dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 206516dce513Schristos;; GIDIS 206616dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 206716dce513Schristos(dni_wrapper gidis "global interrupt disable" 206816dce513Schristos (SHORT-INSN) 206916dce513Schristos "gid" 207016dce513Schristos (+ OP4_FLOW16 (f-gien-gidis-9-1 #x1) (f-opc-8-5 #x19) (f-dc-15-6 #x0)) 207116dce513Schristos (set gidisablebit 1) 207216dce513Schristos () 207316dce513Schristos ) 207416dce513Schristos 207516dce513Schristos 207616dce513Schristos 207716dce513Schristos;;;;;;;;;;;;;;;; 207816dce513Schristos;; SWI 207916dce513Schristos;;;;;;;;;;;;;;;; 208016dce513Schristos 208116dce513Schristos;; Model only immediate 'fire' exception, if gien cleared or masked don't fire and don't check later - no ilat like behavior 208216dce513Schristos(dni swi_num "software interrupt" (SHORT-INSN UNCOND-CTI) 208316dce513Schristos "swi $swi_num" 208416dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x0) swi_num) 208516dce513Schristos (sequence () (call-exception #x24 #x80)) 208616dce513Schristos ;; (if (eq gie 1) 208716dce513Schristos ;; (sequence () 208816dce513Schristos ;; (set kmbit 1) 208916dce513Schristos ;; (set gie 0) 209016dce513Schristos ;; (set (hcr-iret) (add pc (const 2))) 209116dce513Schristos ;; (set (hcr-ipend) (or (hcr-ipend) (const #x80))) 209216dce513Schristos ;; (set pc (const #x1c)) 209316dce513Schristos 209416dce513Schristos ;; ) 209516dce513Schristos ;; ;; schedule interrupt 209616dce513Schristos ;; (set (hcr-ilat) (or (hcr-ilat) (const #x80))) 209716dce513Schristos ;; ) 209816dce513Schristos () 209916dce513Schristos ) 210016dce513Schristos(dni swi "software interrupt" (ALIAS SHORT-INSN UNCOND-CTI) 210116dce513Schristos "swi" 210216dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x0) (f-dc-15-6 #x0)) 210316dce513Schristos (sequence () (call-exception #x24 #x80)) 210416dce513Schristos () 210516dce513Schristos ) 210616dce513Schristos 210716dce513Schristos 210816dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 210916dce513Schristos;; TRAP #disp3 - simulator only and chip as well - make the same grouop as swi 211016dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 211116dce513Schristos 211216dce513Schristos;; Only defining 16-bit form of this instruction. It exists to support the 211316dce513Schristos;; simulator, by giving us a simple input/output mechanism beyond returning values 211416dce513Schristos;; in registers or memory. 211516dce513Schristos;; TRAP #N - special sw trap for simulator support; allows simple i/o using fixed arguments 211616dce513Schristos;; TRAP #0 - write (r0=i/o channel, r1=addr, r2=len) returns status in r0 211716dce513Schristos;; TRAP #1 - read (r0=i/o channel, r1=addr, r2=len) returns length or -<code> on error 211816dce513Schristos;; TRAP #2 - open (r0=string path, r1=mode) returns channel# or -<code> on error 211916dce513Schristos;; TRAP #3 - exit (r0=status code) never returns. 212016dce513Schristos;; TRAP #4 - print "pass\n" and exit 212116dce513Schristos;; TRAP #5 - print "fail\n" and exit 212216dce513Schristos;; TRAP #6 - close (r0=i/o channel) 212316dce513Schristos 212416dce513Schristos(dni trap16 "trap to simulator" 212516dce513Schristos (SHORT-INSN UNCOND-CTI) 212616dce513Schristos "trap $trapnum6" 212716dce513Schristos (+ OP4_FLOW16 (f-opc-8-5 #x1e) (f-trap-swi-9-1 #x1) trapnum6) ;; (+ OP4_IMM16 OPI_TRAP (f-rd 0) (f-rn 0) disp3) 212816dce513Schristos (set (reg SI h-registers 0) (c-call SI "epiphany_trap" pc trapnum6)) 212916dce513Schristos () 213016dce513Schristos ) 213116dce513Schristos 213216dce513Schristos 213316dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 213416dce513Schristos;; Integer arithmetic instructions 3 address forms 213516dce513Schristos;; both 16 and 32 bit forms 213616dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 213716dce513Schristos 213816dce513Schristos(define-pmacro (op-rrr name sem-op cond-op) 213916dce513Schristos (begin 214016dce513Schristos (dni_wrapper (.sym name "16") 214116dce513Schristos (.str name) 214216dce513Schristos (SHORT-INSN) 214316dce513Schristos (.str name " $rd,$rn,$rm") 214416dce513Schristos (+ OP4_ALU16 (.sym "OPB_" (.upcase (.str name))) rd rn rm) 214516dce513Schristos (sequence () 214616dce513Schristos (cond-op rn rm) 214716dce513Schristos (set rd (sem-op SI rn rm)) 214816dce513Schristos (set zbit (zflag rd)) 214916dce513Schristos (set nbit (nflag rd)) 215016dce513Schristos ) 215116dce513Schristos () 215216dce513Schristos ) 215316dce513Schristos 215416dce513Schristos (dni_wrapper (.sym name) 215516dce513Schristos (.str name) 215616dce513Schristos () 215716dce513Schristos (.str name " $rd6,$rn6,$rm6") 215816dce513Schristos (+ OP4_MISC (.sym "OPB_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-3 #x0) rd6 rn6 rm6) 215916dce513Schristos (sequence () 216016dce513Schristos (cond-op rn6 rm6) 216116dce513Schristos (set rd6 (sem-op SI rn6 rm6)) 216216dce513Schristos (set zbit (zflag rd6)) 216316dce513Schristos (set nbit (nflag rd6)) 216416dce513Schristos ) 216516dce513Schristos () 216616dce513Schristos ) 216716dce513Schristos 216816dce513Schristos (dnmi (.sym name ".l") 216916dce513Schristos (.str name) 217016dce513Schristos (NO-DIS) 217116dce513Schristos (.str name ".l $rd6,$rn6,$rm6") 217216dce513Schristos (emit (.sym name) rd6 rn6 rm6) 217316dce513Schristos ) 217416dce513Schristos 217516dce513Schristos 217616dce513Schristos 217716dce513Schristos ) 217816dce513Schristos ) 217916dce513Schristos 218016dce513Schristos;; submacros to set condition codes 218116dce513Schristos;; NZ are always set to reflect the sign and value of the result 218216dce513Schristos;; CV are a function of the operator 218316dce513Schristos(define-pmacro (add-vc a b) (sequence () 218416dce513Schristos (set cbit (add-cflag SI a b 0)) 218516dce513Schristos (set vbit (add-oflag SI a b 0)) 218616dce513Schristos (set vsbit (or BI vsbit vbit)) 218716dce513Schristos )) 218816dce513Schristos 218916dce513Schristos(define-pmacro (sub-vc a b) (sequence () 219016dce513Schristos (set cbit (not (sub-cflag SI a b 0))) 219116dce513Schristos (set vbit (sub-oflag SI a b 0)) 219216dce513Schristos (set vsbit (or vsbit vbit)) 219316dce513Schristos )) 219416dce513Schristos 219516dce513Schristos(define-pmacro (logic-vc a b) (sequence () 219616dce513Schristos (set cbit 0) 219716dce513Schristos (set vbit 0) 219816dce513Schristos )) 219916dce513Schristos 220016dce513Schristos(op-rrr add add add-vc) 220116dce513Schristos(op-rrr sub sub sub-vc) 220216dce513Schristos(op-rrr and and logic-vc) 220316dce513Schristos(op-rrr orr or logic-vc) 220416dce513Schristos(op-rrr eor xor logic-vc) 220516dce513Schristos 220616dce513Schristos;; Integer arithmetic immediate forms 220716dce513Schristos 220816dce513Schristos(define-pmacro (op-rri name code cond-op) 220916dce513Schristos (begin 221016dce513Schristos (dni_wrapper (.sym name "i16") 221116dce513Schristos (.str name) 221216dce513Schristos (SHORT-INSN IMM3) 221316dce513Schristos (.str name ".s $rd,$rn,$simm3") 221416dce513Schristos (+ OP4_IMM16 code rd rn simm3) 221516dce513Schristos (sequence () 221616dce513Schristos (cond-op rn simm3) 221716dce513Schristos (set rd (name SI rn simm3)) 221816dce513Schristos (set zbit (zflag rd)) 221916dce513Schristos (set nbit (nflag rd)) 222016dce513Schristos ) 222116dce513Schristos () 222216dce513Schristos ) 222316dce513Schristos 222416dce513Schristos 222516dce513Schristos (dni_wrapper (.sym name "i") 222616dce513Schristos (.str name) 222716dce513Schristos () 222816dce513Schristos (.str name ".l $rd6,$rn6,$simm11") 222916dce513Schristos (+ OP4_IMM32 code OPI_25_2_MBZ rd6 rn6 simm11) 223016dce513Schristos (sequence () 223116dce513Schristos (cond-op rn6 simm11) 223216dce513Schristos (set rd6 (name SI rn6 simm11)) 223316dce513Schristos (set zbit (zflag rd6)) 223416dce513Schristos (set nbit (nflag rd6)) 223516dce513Schristos ) 223616dce513Schristos () 223716dce513Schristos ) 223816dce513Schristos 223916dce513Schristos ;; (dnmi (.sym name "ri") "relaxed arithmetic immediate" (RELAXED) 224016dce513Schristos ;; (.str name " $rd6,$rn6,$simm11") 224116dce513Schristos ;; (emit (.sym name "i") rd6 rn6 simm11)) 224216dce513Schristos ) 224316dce513Schristos ) 224416dce513Schristos 224516dce513Schristos(op-rri add OPI_ADD add-vc) 224616dce513Schristos(op-rri sub OPI_SUB sub-vc) 224716dce513Schristos 224816dce513Schristos(dnmi addir "relaxable short immediate add" (RELAXABLE IMM3) 224916dce513Schristos "add $rd,$rn,$simm3" 225016dce513Schristos (emit addi16 rd rn simm3)) 225116dce513Schristos 225216dce513Schristos(dnmi addi32r "relaxed long immediate add" (RELAXED) 225316dce513Schristos "add $rd6,$rn6,$simm11" 225416dce513Schristos (emit addi rd6 rn6 simm11)) 225516dce513Schristos 225616dce513Schristos;; Again, but not relaxable so that full sized registers are handled 225716dce513Schristos(dnmi addi32m "relaxed long immediate add" () 225816dce513Schristos "add $rd6,$rn6,$simm11" 225916dce513Schristos (emit addi rd6 rn6 simm11)) 226016dce513Schristos 226116dce513Schristos 226216dce513Schristos(dnmi subir "relaxable short immediate sub" (RELAXABLE IMM3) 226316dce513Schristos "sub $rd,$rn,$simm3" 226416dce513Schristos (emit subi16 rd rn simm3)) 226516dce513Schristos 226616dce513Schristos(dnmi subi32r "relaxed long immediate sub" (RELAXED) 226716dce513Schristos "sub $rd6,$rn6,$simm11" 226816dce513Schristos (emit subi rd6 rn6 simm11)) 226916dce513Schristos 227016dce513Schristos(dnmi subi32m "relaxed long immediate sub" () 227116dce513Schristos "sub $rd6,$rn6,$simm11" 227216dce513Schristos (emit subi rd6 rn6 simm11)) 227316dce513Schristos 227416dce513Schristos 227516dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 227616dce513Schristos;; Shift instructions 3 address forms 227716dce513Schristos;; both 16 and 32 bit forms 227816dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 227916dce513Schristos 228016dce513Schristos(define-pmacro (shift-rrr name sem-op) 228116dce513Schristos (begin 228216dce513Schristos (dni_wrapper (.sym name "16") 228316dce513Schristos (.str name) 228416dce513Schristos (SHORT-INSN) 228516dce513Schristos (.str name " $rd,$rn,$rm") 228616dce513Schristos (+ OP4_ALU16 (.sym "OPB_" (.upcase (.str name))) rd rn rm) 228716dce513Schristos (sequence () 228816dce513Schristos (logic-vc rn rm) 228916dce513Schristos (set rd (sem-op SI rn (and rm (const 31)))) 229016dce513Schristos (set zbit (zflag rd)) 229116dce513Schristos (set nbit (nflag rd)) 229216dce513Schristos ) 229316dce513Schristos () 229416dce513Schristos ) 229516dce513Schristos 229616dce513Schristos (dni_wrapper (.sym name) 229716dce513Schristos (.str name) 229816dce513Schristos () 229916dce513Schristos (.str name " $rd6,$rn6,$rm6") 230016dce513Schristos (+ OP4_MISC (.sym "OPB_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-3 #x0) rd6 rn6 rm6) 230116dce513Schristos (sequence () 230216dce513Schristos (logic-vc rn6 rm6) 230316dce513Schristos (set rd6 (sem-op SI rn6 (and rm6 (const 31)))) 230416dce513Schristos (set zbit (zflag rd6)) 230516dce513Schristos (set nbit (nflag rd6)) 230616dce513Schristos ) 230716dce513Schristos () 230816dce513Schristos ) 230916dce513Schristos 231016dce513Schristos (dnmi (.sym name ".l") 231116dce513Schristos (.str name) 231216dce513Schristos (NO-DIS) 231316dce513Schristos (.str name ".l $rd6,$rn6,$rm6") 231416dce513Schristos (emit (.sym name) rd6 rn6 rm6) 231516dce513Schristos ) 231616dce513Schristos ) 231716dce513Schristos ) 231816dce513Schristos 231916dce513Schristos(shift-rrr asr sra) 232016dce513Schristos(shift-rrr lsr srl) 232116dce513Schristos(shift-rrr lsl sll) 232216dce513Schristos 232316dce513Schristos(define-pmacro (op-shift-rri name shortcode f5 longcode sem-op) 232416dce513Schristos (begin 232516dce513Schristos (dni_wrapper (.sym name "i16") 232616dce513Schristos (.str name) 232716dce513Schristos (SHORT-INSN) 232816dce513Schristos (.str name " $rd,$rn,$shift") 232916dce513Schristos (+ shortcode (f-opc-4-1 f5) rd rn shift) 233016dce513Schristos (sequence () 233116dce513Schristos (logic-vc rn shift) 233216dce513Schristos (set rd (sem-op SI rn shift)) 233316dce513Schristos (set zbit (zflag rd)) 233416dce513Schristos (set nbit (nflag rd)) 233516dce513Schristos ) 233616dce513Schristos () 233716dce513Schristos ) 233816dce513Schristos (dni_wrapper (.sym name "i32") 233916dce513Schristos (.str name) 234016dce513Schristos () 234116dce513Schristos (.str name " $rd6,$rn6,$shift") 234216dce513Schristos (+ OP4_MISC (f-opc-4-1 f5) (f-opc-19-4 longcode) (f-dc-25-6 0) rd6 rn6 shift) 234316dce513Schristos (sequence () 234416dce513Schristos (logic-vc rn6 shift) 234516dce513Schristos (set rd6 (sem-op SI rn6 shift)) 234616dce513Schristos (set zbit (zflag rd6)) 234716dce513Schristos (set nbit (nflag rd6)) 234816dce513Schristos ) 234916dce513Schristos () 235016dce513Schristos ) 235116dce513Schristos 235216dce513Schristos (dnmi (.sym name "i32.l") 235316dce513Schristos (.str name) 235416dce513Schristos (NO-DIS) 235516dce513Schristos (.str name ".l $rd6,$rn6,$shift") 235616dce513Schristos (emit (.sym name "i32") rd6 rn6 shift) 235716dce513Schristos ) 235816dce513Schristos 235916dce513Schristos 236016dce513Schristos ) 236116dce513Schristos ) 236216dce513Schristos 236316dce513Schristos(op-shift-rri lsr OP4_LSHIFT16 0 #x6 srl) 236416dce513Schristos(op-shift-rri lsl OP4_LSHIFT16 1 #x6 sll) 236516dce513Schristos(op-shift-rri asr OP4_ASHIFT16 0 #xe sra) 236616dce513Schristos 236716dce513Schristos;; BITR - bitreversal (FFT) 236816dce513Schristos;; 236916dce513Schristos;; From Dr Dobbs et al. 237016dce513Schristos;; 237116dce513Schristos;; unsigned int v; 237216dce513Schristos;; v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); ;; swap odd-even bits 237316dce513Schristos;; v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); ;; swap pairs 237416dce513Schristos;; v = ((v >> 4) & 0x0f0f0f0f) | ((v & 0x0f0f0f0f) << 4); ;; swap nibbles 237516dce513Schristos;; v = ((v >> 8) & 0x00ff00ff) | ((v & 0x00ff00ff) << 8); ;; swap bytes 237616dce513Schristos;; v = (v >> 16) | (v << 16); ;; swap halves 237716dce513Schristos(define-pmacro (bit-reversal dest src) 237816dce513Schristos (sequence ((SI v)) 237916dce513Schristos (set v src) 238016dce513Schristos (set v (or (and (srl v 1) #x55555555) (sll (and v #x55555555) 1))) 238116dce513Schristos (set v (or (and (srl v 2) #x33333333) (sll (and v #x33333333) 2))) 238216dce513Schristos (set v (or (and (srl v 4) #x0f0f0f0f) (sll (and v #x0f0f0f0f) 4))) 238316dce513Schristos (set v (or (and (srl v 8) #x00ff00ff) (sll (and v #x00ff00ff) 8))) 238416dce513Schristos (set v (or (srl v 16) (sll v 16))) 238516dce513Schristos (set dest v) 238616dce513Schristos )) 238716dce513Schristos 238816dce513Schristos(dni_wrapper bitr16 "bit reverse short" 238916dce513Schristos (SHORT-INSN) 239016dce513Schristos ("bitr $rd,$rn") 239116dce513Schristos (+ OP4_ASHIFT16 (f-opc-4-1 1) rd rn (f-shift 0)) 239216dce513Schristos (sequence () 239316dce513Schristos (bit-reversal rd rn) 239416dce513Schristos (set zbit (zflag rd)) 239516dce513Schristos (set nbit (nflag rd)) 239616dce513Schristos (set cbit 0) 239716dce513Schristos (set vbit 0) 239816dce513Schristos ) 239916dce513Schristos () 240016dce513Schristos ) 240116dce513Schristos 240216dce513Schristos(dni_wrapper bitr "bit reverse" 240316dce513Schristos () 240416dce513Schristos ("bitr $rd6,$rn6") 240516dce513Schristos (+ OP4_MISC (f-opc-4-1 1) (f-opc-19-4 #xe) (f-dc-25-6 0) rd6 rn6 (f-shift 0)) 240616dce513Schristos (sequence () 240716dce513Schristos (bit-reversal rd6 rn6) 240816dce513Schristos (set zbit (zflag rd6)) 240916dce513Schristos (set nbit (nflag rd6)) 241016dce513Schristos (set cbit 0) 241116dce513Schristos (set vbit 0) 241216dce513Schristos ) 241316dce513Schristos () 241416dce513Schristos ) 241516dce513Schristos(dnmi bitrl "bit reverse l" 241616dce513Schristos (NO-DIS) 241716dce513Schristos ("bitr.l $rd6,$rn6") 241816dce513Schristos (emit bitr rd6 rn6) 241916dce513Schristos ) 242016dce513Schristos 242116dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 242216dce513Schristos;; Integer arithmetic instructions 242316dce513Schristos;; Extended operation 242416dce513Schristos;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 242516dce513Schristos 242616dce513Schristos(define-pmacro (op-iextrrr name cond-op) 242716dce513Schristos (begin 242816dce513Schristos 242916dce513Schristos (dni_wrapper (.sym name) 243016dce513Schristos (.str name) 243116dce513Schristos () 243216dce513Schristos (.str name " $rd6,$rn6,$rm6") 243316dce513Schristos (+ OP4_MISC (.sym "OPBE_" (.upcase (.str name))) (f-opc-19-4 #xa) (f-dc-22-2 #x0) (f-dc-20-1 #x1) 243416dce513Schristos rd6 rn6 rm6) 243516dce513Schristos (sequence () 243616dce513Schristos ;; TODO cond operation (cond-op rn6 rm6) 243716dce513Schristos ;;(set rd6 (sem-op SI rn6 rm6)) 243816dce513Schristos (set zbit (zflag rd6)) 243916dce513Schristos (set nbit (nflag rd6)) 244016dce513Schristos ) 244116dce513Schristos () 244216dce513Schristos ) 244316dce513Schristos 244416dce513Schristos (dnmi (.sym name ".l") 244516dce513Schristos (.str name) 244616dce513Schristos (NO-DIS) 244716dce513Schristos (.str name ".l $rd6,$rn6,$rm6") 244816dce513Schristos (emit (.sym name) rd6 rn6 rm6) 244916dce513Schristos ) 245016dce513Schristos ) 245116dce513Schristos ) 245216dce513Schristos 245316dce513Schristos(op-iextrrr fext sub-vc) 245416dce513Schristos(op-iextrrr fdep sub-vc) 245516dce513Schristos(op-iextrrr lfsr sub-vc) 245616dce513Schristos 245716dce513Schristos 245816dce513Schristos 245916dce513Schristos;; Immediate moves. The 8 bit form is relaxed if it doesn't fit or is external 246016dce513Schristos;; Move RD,#IMM 246116dce513Schristos(dni_wrapper mov8 246216dce513Schristos "mov imm8" 246316dce513Schristos (SHORT-INSN) 246416dce513Schristos "mov.b $rd,$imm8" 246516dce513Schristos (+ OP4_IMM16 (f-opc-4-1 #x0) rd imm8) 246616dce513Schristos (set rd (zext SI imm8)) 246716dce513Schristos () 246816dce513Schristos ) 246916dce513Schristos 247016dce513Schristos(dnmi mov8r "mov imm8 relaxable" 247116dce513Schristos (RELAXABLE) 247216dce513Schristos "mov $rd,$imm8" 247316dce513Schristos (emit mov8 rd imm8)) 247416dce513Schristos 247516dce513Schristos(dni_wrapper mov16 247616dce513Schristos "mov imm16" 247716dce513Schristos () 247816dce513Schristos "mov.l $rd6,$imm16" 247916dce513Schristos (+ OP4_IMM32 (f-opc-4-1 #x0) (f-opc-19-4 #x2) (f-dc-28-1 #x0) rd6 imm16) 248016dce513Schristos (set rd6 (zext SI imm16)) 248116dce513Schristos () 248216dce513Schristos ) 248316dce513Schristos 248416dce513Schristos(dnmi mov16r "mov imm16 relaxable" 248516dce513Schristos () 248616dce513Schristos "mov $rd6,$imm16" 248716dce513Schristos (emit mov16 rd6 imm16)) 248816dce513Schristos 248916dce513Schristos;; MOVE TO HIGH WORD 249016dce513Schristos(dni_wrapper movt 249116dce513Schristos "movt imm16" 249216dce513Schristos () 249316dce513Schristos "movt $rd6,$imm16" 249416dce513Schristos (+ OP4_IMM32 (f-opc-4-1 #x0) (f-opc-19-4 #x2) (f-dc-28-1 #x1) rd6 imm16) 249516dce513Schristos (set rd6 (or (and SI rd6 (const #xffff)) ; keep low bits of rd 249616dce513Schristos (sll SI imm16 (const 16)))) ; replacing just high bits 249716dce513Schristos () 249816dce513Schristos ) 249916dce513Schristos(dnmi movtl 250016dce513Schristos "movt imm16" 250116dce513Schristos (NO-DIS) 250216dce513Schristos "movt.l $rd6,$imm16" 250316dce513Schristos (emit movt rd6 imm16) 250416dce513Schristos ) 250516dce513Schristos 250616dce513Schristos 250716dce513Schristos 250816dce513Schristos;; FLOATING POINT OPERATIONS 250916dce513Schristos;; TWO operands 251016dce513Schristos(define-pmacro (op-two_operands-float name code) 251116dce513Schristos (begin 251216dce513Schristos (dni_wrapper 251316dce513Schristos (.sym "f_" name "f16") 251416dce513Schristos (.str "f_" name) 251516dce513Schristos (SHORT-INSN) 251616dce513Schristos (.str "f" name " $rd,$rn,$rm") 251716dce513Schristos (+ OP4_DSP16 code rd rn rm) 251816dce513Schristos (sequence () 251916dce513Schristos (if 252016dce513Schristos (eq arithmetic-modebit2 0) 252116dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 252216dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rm)) 252316dce513Schristos 252416dce513Schristos ;;All bits are calculated in C 252516dce513Schristos (set bzbit (c-call BI "get_epiphany_fzeroflag" sdtmp)) 252616dce513Schristos (set bnbit (c-call BI "get_epiphany_fnegativeflag" sdtmp)) 252716dce513Schristos (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp)) 252816dce513Schristos (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp)) 252916dce513Schristos (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp)) 253016dce513Schristos (set bvsbit (or bvsbit bvbit)) 253116dce513Schristos (set busbit (or busbit bubit)) 253216dce513Schristos (set bisbit (or bisbit bibit)) 253316dce513Schristos (set rd sdtmp) 253416dce513Schristos (if (or (and invExcEnbit bisbit) 253516dce513Schristos (or (and ovfExcEnbit bvsbit) (and unExcEnbit busbit))) 253616dce513Schristos (sequence () 253716dce513Schristos (set expcause0bit (const 1)) 253816dce513Schristos (set expcause1bit (const 1)) 253916dce513Schristos (call-exception #x4 #x2))) 254016dce513Schristos )) 254116dce513Schristos (if (eq arithmetic-modebit2 1) 254216dce513Schristos (sequence ((SI sdtmp)) 254316dce513Schristos (set sdtmp (c-call SI (.str "epiphany_i" name) rd rn rm)) 254416dce513Schristos ;; carry is not connected inb the design (set bcbit bcbit) 254516dce513Schristos (set bzbit (zflag sdtmp)) 254616dce513Schristos (set bnbit (nflag sdtmp)) 254716dce513Schristos (set rd sdtmp))) 254816dce513Schristos ) 254916dce513Schristos 255016dce513Schristos () 255116dce513Schristos ) 255216dce513Schristos (dnmi (.sym "i_" name "f16") 255316dce513Schristos (.str "i_" name) 255416dce513Schristos (SHORT-INSN NO-DIS) 255516dce513Schristos (.str "i" name " $rd,$rn,$rm") 255616dce513Schristos (emit (.sym "f_" name "f16") rd rn rm) 255716dce513Schristos ) 255816dce513Schristos 255916dce513Schristos 256016dce513Schristos (dni_wrapper 256116dce513Schristos (.sym "f_" name "f32") 256216dce513Schristos (.str "f_" name) 256316dce513Schristos () 256416dce513Schristos (.str "f" name " $rd6,$rn6,$rm6") 256516dce513Schristos (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rm6) 256616dce513Schristos (sequence () 256716dce513Schristos (if 256816dce513Schristos (eq arithmetic-modebit2 0) 256916dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 257016dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rm6)) 257116dce513Schristos 257216dce513Schristos ;;All bits are calculated in C 257316dce513Schristos (set bzbit (c-call BI "get_epiphany_fzeroflag" sdtmp)) 257416dce513Schristos (set bnbit (c-call BI "get_epiphany_fnegativeflag" sdtmp)) 257516dce513Schristos (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp)) 257616dce513Schristos (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp)) 257716dce513Schristos (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp)) 257816dce513Schristos (set bvsbit (or bvsbit bvbit)) 257916dce513Schristos (set busbit (or busbit bubit)) 258016dce513Schristos (set bisbit (or bisbit bibit)) 258116dce513Schristos 258216dce513Schristos (set rd6 sdtmp) 258316dce513Schristos 258416dce513Schristos (if (or (and invExcEnbit bisbit) 258516dce513Schristos (or (and ovfExcEnbit bvsbit) (and unExcEnbit busbit))) 258616dce513Schristos (sequence () 258716dce513Schristos (set expcause0bit (const 1)) 258816dce513Schristos (set expcause1bit (const 1)) 258916dce513Schristos (call-exception #x4 #x2))) 259016dce513Schristos ) 259116dce513Schristos ) 259216dce513Schristos (if (eq arithmetic-modebit2 1) 259316dce513Schristos (sequence ((SI sdtmp)) 259416dce513Schristos (set sdtmp (c-call SI (.str "epiphany_i" name) rd6 rn6 rm6)) 259516dce513Schristos ;; carry is not connected inb the design (set bcbit bcbit) 259616dce513Schristos (set bzbit (zflag sdtmp)) 259716dce513Schristos (set bnbit (nflag sdtmp)) 259816dce513Schristos (set rd6 sdtmp) 259916dce513Schristos ) 260016dce513Schristos ) 260116dce513Schristos ) 260216dce513Schristos () 260316dce513Schristos ) 260416dce513Schristos 260516dce513Schristos (dnmi (.sym "f_" name "f32.l") 260616dce513Schristos (.str "f_" name) 260716dce513Schristos (NO-DIS) 260816dce513Schristos (.str "f" name ".l $rd6,$rn6,$rm6") 260916dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6 rm6) 261016dce513Schristos ) 261116dce513Schristos (dnmi (.sym "i_" name "f32") 261216dce513Schristos (.str "i_" name) 261316dce513Schristos (NO-DIS) 261416dce513Schristos (.str "i" name " $rd6,$rn6,$rm6") 261516dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6 rm6) 261616dce513Schristos ) 261716dce513Schristos (dnmi (.sym "i_" name "f32.l") 261816dce513Schristos (.str "i_" name) 261916dce513Schristos (NO-DIS) 262016dce513Schristos (.str "i" name ".l $rd6,$rn6,$rm6") 262116dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6 rm6) 262216dce513Schristos ) 262316dce513Schristos 262416dce513Schristos 262516dce513Schristos 262616dce513Schristos ) 262716dce513Schristos ) 262816dce513Schristos 262916dce513Schristos(op-two_operands-float add OPF_ADD) 263016dce513Schristos(op-two_operands-float sub OPF_SUB) 263116dce513Schristos(op-two_operands-float mul OPF_MUL) 263216dce513Schristos(op-two_operands-float madd OPF_MADD) 263316dce513Schristos(op-two_operands-float msub OPF_MSUB) 263416dce513Schristos 263516dce513Schristos;; ONE operands 263616dce513Schristos;; FABS 263716dce513Schristos(define-pmacro (op-fabs-float name code) 263816dce513Schristos (begin 263916dce513Schristos (dni_wrapper (.sym "f_" name "f16") 264016dce513Schristos (.str "f_" name) 264116dce513Schristos (SHORT-INSN) 264216dce513Schristos (.str "f" name " rd,rn") 264316dce513Schristos (+ OP4_DSP16 code rd rn rn) 264416dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 264516dce513Schristos 264616dce513Schristos ;(set sdtmp (and rn #x7fffffff)) 264716dce513Schristos (set sdtmp (c-call SI (.str "epiphany_fabs") rd rn rn)) 264816dce513Schristos 264916dce513Schristos 265016dce513Schristos (set bnbit (const SI 0)) 265116dce513Schristos (set bzbit (eq SI sdtmp (const SI 0))) 265216dce513Schristos 265316dce513Schristos ;;TODO subnormal ?? 265416dce513Schristos (set bvsbit (or bvsbit bvbit)) 265516dce513Schristos (set busbit (or busbit bubit)) 265616dce513Schristos (set bisbit (or bisbit bibit)) 265716dce513Schristos 265816dce513Schristos (set rd sdtmp) 265916dce513Schristos ) 266016dce513Schristos () 266116dce513Schristos ) 266216dce513Schristos 266316dce513Schristos (dni_wrapper (.sym "f_" name "f32") 266416dce513Schristos (.str "f_" name) 266516dce513Schristos () 266616dce513Schristos (.str "f" name " $rd6,$rn6") 266716dce513Schristos (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6) 266816dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 266916dce513Schristos 267016dce513Schristos 267116dce513Schristos ;(set sdtmp (and rn6 #x7fffffff)) 267216dce513Schristos 267316dce513Schristos (set sdtmp (c-call SI (.str "epiphany_fabs") rd6 rn6 rn6)) 267416dce513Schristos 267516dce513Schristos 267616dce513Schristos (set bnbit (const SI 0)) 267716dce513Schristos (set bzbit (eq SI sdtmp (const SI 0))) 267816dce513Schristos 267916dce513Schristos (set bvsbit (or bvsbit bvbit)) 268016dce513Schristos (set busbit (or busbit bubit)) 268116dce513Schristos (set bisbit (or bisbit bibit)) 268216dce513Schristos 268316dce513Schristos (set rd6 sdtmp) 268416dce513Schristos 268516dce513Schristos ) 268616dce513Schristos () 268716dce513Schristos ) 268816dce513Schristos 268916dce513Schristos (dnmi (.sym "f_" name "f32.l") 269016dce513Schristos (.str "f_" name) 269116dce513Schristos (NO-DIS) 269216dce513Schristos (.str "f" name ".l $rd6,$rn6") 269316dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6) 269416dce513Schristos ) 269516dce513Schristos 269616dce513Schristos 269716dce513Schristos ) 269816dce513Schristos ) 269916dce513Schristos 270016dce513Schristos(op-fabs-float abs OPF_FABS) 270116dce513Schristos 270216dce513Schristos 270316dce513Schristos(define-pmacro (op-fix2float-float name code) 270416dce513Schristos (begin 270516dce513Schristos (dni_wrapper (.sym "f_" name "f16") 270616dce513Schristos (.str "f_" name) 270716dce513Schristos (SHORT-INSN) 270816dce513Schristos (.str "f" name " $rd,$rn") 270916dce513Schristos (+ OP4_DSP16 code frd frn frn) 271016dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 271116dce513Schristos 271216dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rn)) 271316dce513Schristos 271416dce513Schristos (set bnbit (lt SI sdtmp (const SI 0))) 271516dce513Schristos (set bzbit (eq SI sdtmp (const SI 0))) 271616dce513Schristos 271716dce513Schristos (set bvsbit (or bvsbit bvbit)) 271816dce513Schristos (set busbit (or busbit bubit)) 271916dce513Schristos (set bisbit (or bisbit bibit)) 272016dce513Schristos 272116dce513Schristos (set rd sdtmp) 272216dce513Schristos ) 272316dce513Schristos () 272416dce513Schristos ) 272516dce513Schristos 272616dce513Schristos 272716dce513Schristos (dni_wrapper (.sym "f_" name "f32") 272816dce513Schristos (.str "f_" name) 272916dce513Schristos () 273016dce513Schristos (.str "f" name " $rd6,$rn6") 273116dce513Schristos (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6) 273216dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 273316dce513Schristos 273416dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rn6)) 273516dce513Schristos 273616dce513Schristos (set bnbit (lt SI sdtmp (const SI 0))) 273716dce513Schristos (set bzbit (eq SI sdtmp (const SI 0))) 273816dce513Schristos 273916dce513Schristos (set bvsbit (or bvsbit bvbit)) 274016dce513Schristos (set busbit (or busbit bubit)) 274116dce513Schristos (set bisbit (or bisbit bibit)) 274216dce513Schristos 274316dce513Schristos (set rd6 sdtmp) 274416dce513Schristos 274516dce513Schristos ) 274616dce513Schristos () 274716dce513Schristos ) 274816dce513Schristos 274916dce513Schristos (dnmi (.sym "f_" name "f32.l") 275016dce513Schristos (.str "f_" name) 275116dce513Schristos (NO-DIS) 275216dce513Schristos (.str "f" name ".l $rd6,$rn6") 275316dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6) 275416dce513Schristos ) 275516dce513Schristos ) 275616dce513Schristos ) 275716dce513Schristos 275816dce513Schristos(op-fix2float-float loat OPF_FLOAT) 275916dce513Schristos 276016dce513Schristos(define-pmacro (op-float2fix-float name code) 276116dce513Schristos (begin 276216dce513Schristos (dni_wrapper (.sym "f_" name "f16") 276316dce513Schristos (.str "f_" name) 276416dce513Schristos (SHORT-INSN) 276516dce513Schristos (.str "f" name " $rd,$rn") 276616dce513Schristos (+ OP4_DSP16 code rd rn rn) 276716dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 276816dce513Schristos 276916dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd rn rn)) 277016dce513Schristos 277116dce513Schristos (set bzbit (zflag sdtmp)) 277216dce513Schristos (set bnbit (nflag sdtmp)) 277316dce513Schristos 277416dce513Schristos (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp)) 277516dce513Schristos (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp)) 277616dce513Schristos (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp)) 277716dce513Schristos 277816dce513Schristos (set bvsbit (or bvsbit bvbit)) 277916dce513Schristos (set busbit (or busbit bubit)) 278016dce513Schristos (set bisbit (or bisbit bibit)) 278116dce513Schristos 278216dce513Schristos (set rd6 sdtmp) 278316dce513Schristos 278416dce513Schristos (if (or (and invExcEnbit bisbit) 278516dce513Schristos (or (and ovfExcEnbit busbit) 278616dce513Schristos (and unExcEnbit bvsbit))) 278716dce513Schristos (sequence () 278816dce513Schristos (set expcause0bit (const 1)) 278916dce513Schristos (set expcause1bit (const 1)) 279016dce513Schristos (call-exception #x4 #x2))) 279116dce513Schristos (set rd sdtmp) 279216dce513Schristos ) 279316dce513Schristos () 279416dce513Schristos ) 279516dce513Schristos 279616dce513Schristos 279716dce513Schristos 279816dce513Schristos (dni_wrapper (.sym "f_" name "f32") 279916dce513Schristos (.str "f_" name) 280016dce513Schristos () 280116dce513Schristos (.str "f" name " $rd6,$rn6") 280216dce513Schristos (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) rd6 rn6 rn6) 280316dce513Schristos (sequence ((SF fptemp) (SI sdtmp)) 280416dce513Schristos 280516dce513Schristos (set sdtmp (c-call SI (.str "epiphany_f" name) rd6 rn6 rm6)) 280616dce513Schristos 280716dce513Schristos (set bzbit (zflag sdtmp)) 280816dce513Schristos (set bnbit (nflag sdtmp)) 280916dce513Schristos 281016dce513Schristos (set bvbit (c-call BI "get_epiphany_foverflowflag" sdtmp)) 281116dce513Schristos (set bubit (c-call BI "get_epiphany_funderflowflag" sdtmp)) 281216dce513Schristos (set bibit (c-call BI "get_epiphany_finvalidflag" sdtmp)) 281316dce513Schristos 281416dce513Schristos (set bvsbit (or bvsbit bvbit)) 281516dce513Schristos (set busbit (or busbit bubit)) 281616dce513Schristos (set bisbit (or bisbit bibit)) 281716dce513Schristos 281816dce513Schristos (set rd6 sdtmp) 281916dce513Schristos 282016dce513Schristos (if (or (and invExcEnbit bisbit) 282116dce513Schristos (or (and ovfExcEnbit busbit) 282216dce513Schristos (and unExcEnbit bvsbit))) 282316dce513Schristos (sequence () 282416dce513Schristos (set expcause0bit (const 1)) 282516dce513Schristos (set expcause1bit (const 1)) 282616dce513Schristos (call-exception #x4 #x2)) 282716dce513Schristos ) 282816dce513Schristos 282916dce513Schristos ) 283016dce513Schristos () 283116dce513Schristos ) 283216dce513Schristos 283316dce513Schristos (dnmi (.sym "f_" name "f32.l") 283416dce513Schristos (.str "f_" name) 283516dce513Schristos (NO-DIS) 283616dce513Schristos (.str "f" name ".l $rd6,$rn6") 283716dce513Schristos (emit (.sym "f_" name "f32") rd6 rn6) 283816dce513Schristos ) 283916dce513Schristos 284016dce513Schristos 284116dce513Schristos ) 284216dce513Schristos ) 284316dce513Schristos 284416dce513Schristos 284516dce513Schristos 284616dce513Schristos 284716dce513Schristos 284816dce513Schristos(op-float2fix-float ix OPF_FIX) 284916dce513Schristos 285016dce513Schristos;; MAC (Multiply and Accumulate Instructions 285116dce513Schristos;; (define-pmacro (op-mac-float name code) 285216dce513Schristos;; (begin 285316dce513Schristos;; (dni_wrapper (.sym "fm" name "f16") 285416dce513Schristos;; (.str "fm" name) 285516dce513Schristos;; (SHORT-INSN) 285616dce513Schristos;; (.str "fm" name " $frd,$frn,$frm") 285716dce513Schristos;; (+ OP4_DSP16 code frd frn frm) 285816dce513Schristos;; (sequence ((SF fptemp)) 285916dce513Schristos;; (set bvbit 0) 286016dce513Schristos;; (set busbit 0) 286116dce513Schristos;; (set fptemp (c-call SF (.str "epiphany_fm" name) frd frm frn)) 286216dce513Schristos;; (set bnbit (lt SF fptemp (const SF 0))) 286316dce513Schristos;; (set bzbit (eq SF fptemp (const SF 0))) 286416dce513Schristos;; (set bvsbit (or bvsbit bvbit)) 286516dce513Schristos;; (set frd fptemp) 286616dce513Schristos;; ; (set rd (subword SI frd 0)) 286716dce513Schristos;; ) 286816dce513Schristos;; () 286916dce513Schristos;; ) 287016dce513Schristos 287116dce513Schristos;; (dni_wrapper (.sym "fm" name "f32") 287216dce513Schristos;; (.str "fm" name) 287316dce513Schristos;; () 287416dce513Schristos;; (.str "fm" name " $frd6,$frn6,$frm6") 287516dce513Schristos;; (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-3 #x0) frd6 frn6 frm6) 287616dce513Schristos;; (sequence ((SF fptemp)) 287716dce513Schristos;; (set bvbit 0) 287816dce513Schristos;; (set busbit 0) 287916dce513Schristos;; (set fptemp (c-call SF (.str "epiphany_fm" name) frd6 frm6 frn6)) 288016dce513Schristos;; (set bnbit (lt SF fptemp (const SF 0))) 288116dce513Schristos;; (set bzbit (eq SF fptemp (const SF 0))) 288216dce513Schristos;; (set bvsbit (or bvsbit bvbit)) 288316dce513Schristos;; (set frd6 fptemp) 288416dce513Schristos;; ; (set rd6 (subword SI frd6 0)) 288516dce513Schristos;; ) 288616dce513Schristos;; () 288716dce513Schristos;; ) 288816dce513Schristos;; ) 288916dce513Schristos;; ) 289016dce513Schristos 289116dce513Schristos 289216dce513Schristos 289316dce513Schristos 289416dce513Schristos 289516dce513Schristos 289616dce513Schristos 289716dce513Schristos ; extended floating point operation 289816dce513Schristos 289916dce513Schristos 290016dce513Schristos(define-pmacro (op-fextop-float name code) 290116dce513Schristos (begin 290216dce513Schristos 290316dce513Schristos (dni_wrapper (.sym "f_" name "f32") 290416dce513Schristos (.str "f_" name) 290516dce513Schristos () 290616dce513Schristos (.str "f" name " $frd6,$frn6") 290716dce513Schristos (+ OP4_MISC code (f-opc-19-4 #x7) (f-dc-22-2 #x0) (f-dc-20-1 #x1) frd6 frn6 frn6) 290816dce513Schristos (sequence ((SF fptemp)) 290916dce513Schristos (set bvbit 0) 291016dce513Schristos (set busbit 0) 291116dce513Schristos (set fptemp (c-call SF (.str "epiphany_f" name) frn6)) 291216dce513Schristos (set bnbit (lt SF fptemp (const SF 0))) 291316dce513Schristos (set bzbit (eq SF fptemp (const SF 0))) 291416dce513Schristos (set bvsbit (or bvsbit bvbit)) 291516dce513Schristos (set frd6 fptemp) 291616dce513Schristos 291716dce513Schristos ) 291816dce513Schristos () 291916dce513Schristos ) 292016dce513Schristos 292116dce513Schristos 292216dce513Schristos (dnmi (.sym "f_" name "f32.l") 292316dce513Schristos (.str "f_" name) 292416dce513Schristos (NO-DIS) 292516dce513Schristos (.str "f" name ".l $frd6,$frn6") 292616dce513Schristos (emit (.sym "f_" name "f32") frd6 frn6) 292716dce513Schristos ) 292816dce513Schristos ) 292916dce513Schristos ) 293016dce513Schristos 293116dce513Schristos(op-fextop-float recip OPF_FRECIP) 293216dce513Schristos(op-fextop-float sqrt OPF_FSQRT) 293316dce513Schristos 293416dce513Schristos 293516dce513Schristos 293616dce513Schristos 293716dce513Schristos 2938