xref: /netbsd-src/external/gpl3/binutils.old/dist/cpu/epiphany.cpu (revision 012573eb9c67269c00ce646144eea16daceeb465)
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