xref: /netbsd-src/external/gpl3/gdb/dist/cpu/m32r.cpu (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
14e98e3e1Schristos; Renesas M32R CPU description.  -*- Scheme -*-
24e98e3e1Schristos;
34e98e3e1Schristos; Copyright 1998, 1999, 2000, 2001, 2003, 2007, 2009
44e98e3e1Schristos; Free Software Foundation, Inc.
54e98e3e1Schristos;
64e98e3e1Schristos; Contributed by Red Hat Inc; developed under contract from Mitsubishi
74e98e3e1Schristos; Electric Corporation.
84e98e3e1Schristos;
94e98e3e1Schristos; This file is part of the GNU Binutils.
104e98e3e1Schristos;
114e98e3e1Schristos; This program is free software; you can redistribute it and/or modify
124e98e3e1Schristos; it under the terms of the GNU General Public License as published by
134e98e3e1Schristos; the Free Software Foundation; either version 3 of the License, or
144e98e3e1Schristos; (at your option) any later version.
154e98e3e1Schristos;
164e98e3e1Schristos; This program is distributed in the hope that it will be useful,
174e98e3e1Schristos; but WITHOUT ANY WARRANTY; without even the implied warranty of
184e98e3e1Schristos; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
194e98e3e1Schristos; GNU General Public License for more details.
204e98e3e1Schristos;
214e98e3e1Schristos; You should have received a copy of the GNU General Public License
224e98e3e1Schristos; along with this program; if not, write to the Free Software
234e98e3e1Schristos; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
244e98e3e1Schristos; MA 02110-1301, USA.
254e98e3e1Schristos
264e98e3e1Schristos(include "simplify.inc")
274e98e3e1Schristos
284e98e3e1Schristos; FIXME: Delete sign extension of accumulator results.
294e98e3e1Schristos; Sign extension is done when accumulator is read.
304e98e3e1Schristos
314e98e3e1Schristos; define-arch must appear first
324e98e3e1Schristos
334e98e3e1Schristos(define-arch
344e98e3e1Schristos  (name m32r) ; name of cpu family
354e98e3e1Schristos  (comment "Renesas M32R")
364e98e3e1Schristos  (default-alignment aligned)
374e98e3e1Schristos  (insn-lsb0? #f)
384e98e3e1Schristos  (machs m32r m32rx m32r2)
394e98e3e1Schristos  (isas m32r)
404e98e3e1Schristos)
414e98e3e1Schristos
424e98e3e1Schristos; Attributes.
434e98e3e1Schristos
444e98e3e1Schristos; An attribute to describe which pipeline an insn runs in.
454e98e3e1Schristos; O_OS is a special attribute for sll, sra, sla, slli, srai, slai.
464e98e3e1Schristos; These instructions have O attribute for m32rx and OS attribute for m32r2.
474e98e3e1Schristos
484e98e3e1Schristos(define-attr
494e98e3e1Schristos  (for insn)
504e98e3e1Schristos  (type enum)
514e98e3e1Schristos  (name PIPE)
524e98e3e1Schristos  (comment "parallel execution pipeline selection")
534e98e3e1Schristos  (values NONE O S OS O_OS)
544e98e3e1Schristos)
554e98e3e1Schristos
564e98e3e1Schristos; A derived attribute that says which insns can be executed in parallel
574e98e3e1Schristos; with others.  This is a required attribute for architectures with
584e98e3e1Schristos; parallel execution.
594e98e3e1Schristos
604e98e3e1Schristos(define-attr
614e98e3e1Schristos  (for insn)
624e98e3e1Schristos  (type enum)
634e98e3e1Schristos  (name PARALLEL)
644e98e3e1Schristos  (attrs META) ; do not define in any generated file for now
654e98e3e1Schristos  (values NO YES)
664e98e3e1Schristos  (default (if (eq-attr (current-insn) PIPE NONE) (symbol NO) (symbol YES)))
674e98e3e1Schristos)
684e98e3e1Schristos
694e98e3e1Schristos; Instruction set parameters.
704e98e3e1Schristos
714e98e3e1Schristos(define-isa
724e98e3e1Schristos  (name m32r)
734e98e3e1Schristos
744e98e3e1Schristos  ; This is 32 because 16 bit insns always appear as pairs.
754e98e3e1Schristos  ; ??? See if this can go away.  It's only used by the disassembler (right?)
764e98e3e1Schristos  ; to decide how long an unknown insn is.  One value isn't sufficient (e.g. if
774e98e3e1Schristos  ; on a 16 bit (and not 32 bit) boundary, will only want to advance pc by 16.)
784e98e3e1Schristos  (default-insn-bitsize 32)
794e98e3e1Schristos
804e98e3e1Schristos  ; Number of bytes of insn we can initially fetch.
814e98e3e1Schristos  ; The M32R is tricky in that insns are either two 16-bit insns
824e98e3e1Schristos  ; (executed sequentially or in parallel) or one 32-bit insn.
834e98e3e1Schristos  ; So on one hand the base insn size is 16 bits, but on another it's 32.
844e98e3e1Schristos  ; 32 is chosen because:
854e98e3e1Schristos  ; - if the chip were ever bi-endian it is believed that the byte order would
864e98e3e1Schristos  ;   be based on 32 bit quantities
874e98e3e1Schristos  ; - 32 bit insns are always aligned on 32 bit boundaries
884e98e3e1Schristos  ; - the pc will never stop on a 16 bit (and not 32 bit) boundary
894e98e3e1Schristos  ;   [well actually it can, but there are no branches to such places]
904e98e3e1Schristos  (base-insn-bitsize 32)
914e98e3e1Schristos
924e98e3e1Schristos  ; Used in computing bit numbers.
934e98e3e1Schristos  (default-insn-word-bitsize 32)
944e98e3e1Schristos
954e98e3e1Schristos  ; The m32r fetches 2 insns at a time.
964e98e3e1Schristos  (liw-insns 2)
974e98e3e1Schristos
984e98e3e1Schristos  ; While the m32r can execute insns in parallel, the base mach can't
994e98e3e1Schristos  ; (other than nop).  The base mach is greatly handicapped by this, but
1004e98e3e1Schristos  ; we still need to cleanly handle it.
1014e98e3e1Schristos  (parallel-insns 2)
1024e98e3e1Schristos
1034e98e3e1Schristos  ; Initial bitnumbers to decode insns by.
1044e98e3e1Schristos  (decode-assist (0 1 2 3 8 9 10 11))
1054e98e3e1Schristos
1064e98e3e1Schristos  ; Classification of instructions that fit in the various frames.
1074e98e3e1Schristos  ; wip, not currently used
1084e98e3e1Schristos  (insn-types (long ; name
1094e98e3e1Schristos	       31 ; length
1104e98e3e1Schristos	       (eq-attr (current-insn) LENGTH 31) ; matching insns
1114e98e3e1Schristos	       (0 1 2 7 8 9 10) ; decode-assist
1124e98e3e1Schristos	       )
1134e98e3e1Schristos	      (short
1144e98e3e1Schristos	       15
1154e98e3e1Schristos	       (eq-attr (current-insn) LENGTH 15) ; matching insns
1164e98e3e1Schristos	       (0 1 2 7 8 9 10)
1174e98e3e1Schristos	       )
1184e98e3e1Schristos	      )
1194e98e3e1Schristos
1204e98e3e1Schristos  ; Instruction framing.
1214e98e3e1Schristos  ; Each m32r insn is either one 32 bit insn, two 16 bit insns executed
1224e98e3e1Schristos  ; serially (left->right), or two 16 bit insns executed parallelly.
1234e98e3e1Schristos  ; wip, not currently used
1244e98e3e1Schristos  (frame long32 ; name
1254e98e3e1Schristos	 ((long)) ; list of insns in frame, plus constraint
1264e98e3e1Schristos	 "$0"   ; assembler
1274e98e3e1Schristos	 (+ (1 1) (31 $0)) ; value
1284e98e3e1Schristos	 (sequence () (execute $0)) ; action
1294e98e3e1Schristos	 )
1304e98e3e1Schristos  (frame serial2x16
1314e98e3e1Schristos	 ((short)
1324e98e3e1Schristos	  (short))
1334e98e3e1Schristos	 "$0 -> $1"
1344e98e3e1Schristos	 (+ (1 0) (15 $0) (1 0) (15 $1))
1354e98e3e1Schristos	 (sequence ()
1364e98e3e1Schristos		   (execute $0)
1374e98e3e1Schristos		   (execute $1))
1384e98e3e1Schristos	 )
1394e98e3e1Schristos  (frame parallel2x16
1404e98e3e1Schristos	 ((short (eq-attr (current-insn) PIPE "O,BOTH"))
1414e98e3e1Schristos	  (short (eq-attr (current-insn) PIPE "S,BOTH")))
1424e98e3e1Schristos	 "$0 || $1"
1434e98e3e1Schristos	 (+ (1 0) (15 $0) (1 1) (15 $1))
1444e98e3e1Schristos	 (parallel ()
1454e98e3e1Schristos		   (execute $0)
1464e98e3e1Schristos		   (execute $1))
1474e98e3e1Schristos	 )
1484e98e3e1Schristos)
1494e98e3e1Schristos
1504e98e3e1Schristos; Cpu family definitions.
1514e98e3e1Schristos
1524e98e3e1Schristos; ??? define-cpu-family [and in general "cpu-family"] might be clearer than
1534e98e3e1Schristos; define-cpu.
1544e98e3e1Schristos; ??? Have define-arch provide defaults for architecture that define-cpu can
1554e98e3e1Schristos; then override [reduces duplication in define-cpu].
1564e98e3e1Schristos; ??? Another way to go is to delete cpu-families entirely and have one mach
1574e98e3e1Schristos; able to inherit things from another mach (would also need the ability to
1584e98e3e1Schristos; not only override specific inherited things but also disable some,
1594e98e3e1Schristos; e.g. if an insn wasn't supported).
1604e98e3e1Schristos
1614e98e3e1Schristos(define-cpu
1624e98e3e1Schristos  ; cpu names must be distinct from the architecture name and machine names.
1634e98e3e1Schristos  ; The "b" suffix stands for "base" and is the convention.
1644e98e3e1Schristos  ; The "f" suffix stands for "family" and is the convention.
1654e98e3e1Schristos  (name m32rbf)
1664e98e3e1Schristos  (comment "Renesas M32R base family")
1674e98e3e1Schristos  (endian either)
1684e98e3e1Schristos  (word-bitsize 32)
1694e98e3e1Schristos  ; Override isa spec (??? keeps things simpler, though it was more true
1704e98e3e1Schristos  ; in the early days and not so much now).
1714e98e3e1Schristos  (parallel-insns 1)
1724e98e3e1Schristos)
1734e98e3e1Schristos
1744e98e3e1Schristos(define-cpu
1754e98e3e1Schristos  (name m32rxf)
1764e98e3e1Schristos  (comment "Renesas M32Rx family")
1774e98e3e1Schristos  (endian either)
1784e98e3e1Schristos  (word-bitsize 32)
1794e98e3e1Schristos  ; Generated files have an "x" suffix.
1804e98e3e1Schristos  (file-transform "x")
1814e98e3e1Schristos)
1824e98e3e1Schristos
1834e98e3e1Schristos(define-cpu
1844e98e3e1Schristos  (name m32r2f)
1854e98e3e1Schristos  (comment "Renesas M32R2 family")
1864e98e3e1Schristos  (endian either)
1874e98e3e1Schristos  (word-bitsize 32)
1884e98e3e1Schristos  ; Generated files have an "2" suffix.
1894e98e3e1Schristos  (file-transform "2")
1904e98e3e1Schristos)
1914e98e3e1Schristos
1924e98e3e1Schristos(define-mach
1934e98e3e1Schristos  (name m32r)
1944e98e3e1Schristos  (comment "Generic M32R cpu")
1954e98e3e1Schristos  (cpu m32rbf)
1964e98e3e1Schristos)
1974e98e3e1Schristos
1984e98e3e1Schristos(define-mach
1994e98e3e1Schristos  (name m32rx)
2004e98e3e1Schristos  (comment "M32RX cpu")
2014e98e3e1Schristos  (cpu m32rxf)
2024e98e3e1Schristos)
2034e98e3e1Schristos
2044e98e3e1Schristos(define-mach
2054e98e3e1Schristos  (name m32r2)
2064e98e3e1Schristos  (comment "M32R2 cpu")
2074e98e3e1Schristos  (cpu m32r2f)
2084e98e3e1Schristos)
2094e98e3e1Schristos
2104e98e3e1Schristos; Model descriptions.
2114e98e3e1Schristos
2124e98e3e1Schristos; The meaning of this value is wip but at the moment it's intended to describe
2134e98e3e1Schristos; the implementation (i.e. what -mtune=foo does in sparc gcc).
2144e98e3e1Schristos;
2154e98e3e1Schristos; Notes while wip:
2164e98e3e1Schristos; - format of pipeline entry:
2174e98e3e1Schristos;   (pipeline name (stage1-name ...) (stage2-name ...) ...)
2184e98e3e1Schristos;   The contents of a stage description is wip.
2194e98e3e1Schristos; - each mach must have at least one model
2204e98e3e1Schristos; - the default model must be the first one
2214e98e3e1Schristos;- maybe have `retire' support update total cycle count to handle current
2224e98e3e1Schristos;  parallel insn cycle counting problems
2234e98e3e1Schristos
2244e98e3e1Schristos(define-model
2254e98e3e1Schristos  (name m32r/d) (comment "m32r/d") (attrs)
2264e98e3e1Schristos  (mach m32r)
2274e98e3e1Schristos
2284e98e3e1Schristos  ;(prefetch)
2294e98e3e1Schristos  ;(retire)
2304e98e3e1Schristos
2314e98e3e1Schristos  (pipeline p-non-mem "" () ((fetch) (decode) (execute) (writeback)))
2324e98e3e1Schristos  (pipeline p-mem "" () ((fetch) (decode) (execute) (memory) (writeback)))
2334e98e3e1Schristos
2344e98e3e1Schristos  ; `state' is a list of variables for recording model state
2354e98e3e1Schristos  (state
2364e98e3e1Schristos   ; bit mask of h-gr registers, =1 means value being loaded from memory
2374e98e3e1Schristos   (h-gr UINT)
2384e98e3e1Schristos   )
2394e98e3e1Schristos
2404e98e3e1Schristos  (unit u-exec "Execution Unit" ()
2414e98e3e1Schristos	1 1 ; issue done
2424e98e3e1Schristos	() ; state
2434e98e3e1Schristos	((sr INT -1) (dr INT -1)) ; inputs
2444e98e3e1Schristos	((dr INT -1)) ; outputs
2454e98e3e1Schristos	() ; profile action (default)
2464e98e3e1Schristos	)
2474e98e3e1Schristos  (unit u-cmp "Compare Unit" ()
2484e98e3e1Schristos	1 1 ; issue done
2494e98e3e1Schristos	() ; state
2504e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
2514e98e3e1Schristos	() ; outputs
2524e98e3e1Schristos	() ; profile action (default)
2534e98e3e1Schristos	)
2544e98e3e1Schristos  (unit u-mac "Multiply/Accumulate Unit" ()
2554e98e3e1Schristos	1 1 ; issue done
2564e98e3e1Schristos	() ; state
2574e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
2584e98e3e1Schristos	() ; outputs
2594e98e3e1Schristos	() ; profile action (default)
2604e98e3e1Schristos	)
2614e98e3e1Schristos  (unit u-cti "Branch Unit" ()
2624e98e3e1Schristos	1 1 ; issue done
2634e98e3e1Schristos	() ; state
2644e98e3e1Schristos	((sr INT -1)) ; inputs
2654e98e3e1Schristos	((pc)) ; outputs
2664e98e3e1Schristos	() ; profile action (default)
2674e98e3e1Schristos	)
2684e98e3e1Schristos  (unit u-load "Memory Load Unit" ()
2694e98e3e1Schristos	1 1 ; issue done
2704e98e3e1Schristos	() ; state
2714e98e3e1Schristos	((sr INT)
2724e98e3e1Schristos	 ;(ld-mem AI)
2734e98e3e1Schristos	 ) ; inputs
2744e98e3e1Schristos	((dr INT)) ; outputs
2754e98e3e1Schristos	() ; profile action (default)
2764e98e3e1Schristos	)
2774e98e3e1Schristos  (unit u-store "Memory Store Unit" ()
2784e98e3e1Schristos	1 1 ; issue done
2794e98e3e1Schristos	() ; state
2804e98e3e1Schristos	((src1 INT) (src2 INT)) ; inputs
2814e98e3e1Schristos	() ; ((st-mem AI)) ; outputs
2824e98e3e1Schristos	() ; profile action (default)
2834e98e3e1Schristos	)
2844e98e3e1Schristos)
2854e98e3e1Schristos
2864e98e3e1Schristos(define-model
2874e98e3e1Schristos  (name test) (comment "test") (attrs)
2884e98e3e1Schristos  (mach m32r)
2894e98e3e1Schristos  (pipeline all "" () ((fetch) (decode) (execute) (writeback)))
2904e98e3e1Schristos  (unit u-exec "Execution Unit" ()
2914e98e3e1Schristos	1 1 ; issue done
2924e98e3e1Schristos	() () () ())
2934e98e3e1Schristos)
2944e98e3e1Schristos
2954e98e3e1Schristos; Each mach must have at least one model.
2964e98e3e1Schristos
2974e98e3e1Schristos(define-model
2984e98e3e1Schristos  (name m32rx) (comment "m32rx") (attrs)
2994e98e3e1Schristos  (mach m32rx)
3004e98e3e1Schristos
3014e98e3e1Schristos  ; ??? It's 6 stages but I forget the details right now.
3024e98e3e1Schristos  (pipeline p-o "" () ((fetch) (decode) (execute) (writeback)))
3034e98e3e1Schristos  (pipeline p-s "" () ((fetch) (decode) (execute) (writeback)))
3044e98e3e1Schristos  (pipeline p-o-mem "" () ((fetch) (decode) (execute) (memory) (writeback)))
3054e98e3e1Schristos
3064e98e3e1Schristos  (unit u-exec "Execution Unit" ()
3074e98e3e1Schristos	1 1 ; issue done
3084e98e3e1Schristos	() ; state
3094e98e3e1Schristos	((sr INT -1) (dr INT -1)) ; inputs
3104e98e3e1Schristos	((dr INT -1)) ; outputs
3114e98e3e1Schristos	() ; profile action (default)
3124e98e3e1Schristos	)
3134e98e3e1Schristos  (unit u-cmp "Compare Unit" ()
3144e98e3e1Schristos	1 1 ; issue done
3154e98e3e1Schristos	() ; state
3164e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
3174e98e3e1Schristos	() ; outputs
3184e98e3e1Schristos	() ; profile action (default)
3194e98e3e1Schristos	)
3204e98e3e1Schristos  (unit u-mac "Multiply/Accumulate Unit" ()
3214e98e3e1Schristos	1 1 ; issue done
3224e98e3e1Schristos	() ; state
3234e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
3244e98e3e1Schristos	() ; outputs
3254e98e3e1Schristos	() ; profile action (default)
3264e98e3e1Schristos	)
3274e98e3e1Schristos  (unit u-cti "Branch Unit" ()
3284e98e3e1Schristos	1 1 ; issue done
3294e98e3e1Schristos	() ; state
3304e98e3e1Schristos	((sr INT -1)) ; inputs
3314e98e3e1Schristos	((pc)) ; outputs
3324e98e3e1Schristos	() ; profile action (default)
3334e98e3e1Schristos	)
3344e98e3e1Schristos  (unit u-load "Memory Load Unit" ()
3354e98e3e1Schristos	1 1 ; issue done
3364e98e3e1Schristos	() ; state
3374e98e3e1Schristos	((sr INT)) ; inputs
3384e98e3e1Schristos	((dr INT)) ; outputs
3394e98e3e1Schristos	() ; profile action (default)
3404e98e3e1Schristos	)
3414e98e3e1Schristos  (unit u-store "Memory Store Unit" ()
3424e98e3e1Schristos	1 1 ; issue done
3434e98e3e1Schristos	() ; state
3444e98e3e1Schristos	((src1 INT) (src2 INT)) ; inputs
3454e98e3e1Schristos	() ; outputs
3464e98e3e1Schristos	() ; profile action (default)
3474e98e3e1Schristos	)
3484e98e3e1Schristos)
3494e98e3e1Schristos
3504e98e3e1Schristos(define-model
3514e98e3e1Schristos  (name m32r2) (comment "m32r2") (attrs)
3524e98e3e1Schristos  (mach m32r2)
3534e98e3e1Schristos
3544e98e3e1Schristos  ; ??? It's 6 stages but I forget the details right now.
3554e98e3e1Schristos  (pipeline p-o "" () ((fetch) (decode) (execute) (writeback)))
3564e98e3e1Schristos  (pipeline p-s "" () ((fetch) (decode) (execute) (writeback)))
3574e98e3e1Schristos  (pipeline p-o-mem "" () ((fetch) (decode) (execute) (memory) (writeback)))
3584e98e3e1Schristos
3594e98e3e1Schristos  (unit u-exec "Execution Unit" ()
3604e98e3e1Schristos	1 1 ; issue done
3614e98e3e1Schristos	() ; state
3624e98e3e1Schristos	((sr INT -1) (dr INT -1)) ; inputs
3634e98e3e1Schristos	((dr INT -1)) ; outputs
3644e98e3e1Schristos	() ; profile action (default)
3654e98e3e1Schristos	)
3664e98e3e1Schristos  (unit u-cmp "Compare Unit" ()
3674e98e3e1Schristos	1 1 ; issue done
3684e98e3e1Schristos	() ; state
3694e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
3704e98e3e1Schristos	() ; outputs
3714e98e3e1Schristos	() ; profile action (default)
3724e98e3e1Schristos	)
3734e98e3e1Schristos  (unit u-mac "Multiply/Accumulate Unit" ()
3744e98e3e1Schristos	1 1 ; issue done
3754e98e3e1Schristos	() ; state
3764e98e3e1Schristos	((src1 INT -1) (src2 INT -1)) ; inputs
3774e98e3e1Schristos	() ; outputs
3784e98e3e1Schristos	() ; profile action (default)
3794e98e3e1Schristos	)
3804e98e3e1Schristos  (unit u-cti "Branch Unit" ()
3814e98e3e1Schristos	1 1 ; issue done
3824e98e3e1Schristos	() ; state
3834e98e3e1Schristos	((sr INT -1)) ; inputs
3844e98e3e1Schristos	((pc)) ; outputs
3854e98e3e1Schristos	() ; profile action (default)
3864e98e3e1Schristos	)
3874e98e3e1Schristos  (unit u-load "Memory Load Unit" ()
3884e98e3e1Schristos	1 1 ; issue done
3894e98e3e1Schristos	() ; state
3904e98e3e1Schristos	((sr INT)) ; inputs
3914e98e3e1Schristos	((dr INT)) ; outputs
3924e98e3e1Schristos	() ; profile action (default)
3934e98e3e1Schristos	)
3944e98e3e1Schristos  (unit u-store "Memory Store Unit" ()
3954e98e3e1Schristos	1 1 ; issue done
3964e98e3e1Schristos	() ; state
3974e98e3e1Schristos	((src1 INT) (src2 INT)) ; inputs
3984e98e3e1Schristos	() ; outputs
3994e98e3e1Schristos	() ; profile action (default)
4004e98e3e1Schristos	)
4014e98e3e1Schristos)
4024e98e3e1Schristos
4034e98e3e1Schristos; The instruction fetch/execute cycle.
4044e98e3e1Schristos; This is split into two parts as sometimes more than one instruction is
4054e98e3e1Schristos; decoded at once.
4064e98e3e1Schristos; The `const SI' argument to decode/execute is used to distinguish
4074e98e3e1Schristos; multiple instructions processed at the same time (e.g. m32r).
4084e98e3e1Schristos;
4094e98e3e1Schristos; ??? This is wip, and not currently used.
4104e98e3e1Schristos; ??? Needs to be moved to define-isa.
4114e98e3e1Schristos
4124e98e3e1Schristos; This is how to fetch and decode an instruction.
4134e98e3e1Schristos
4144e98e3e1Schristos;(define-extract
4154e98e3e1Schristos;  (sequence VOID
4164e98e3e1Schristos;	    (if VOID (ne AI (and AI pc (const AI 3)) (const AI 0))
4174e98e3e1Schristos;		(sequence VOID
4184e98e3e1Schristos;			  (set-quiet USI (scratch UHI insn1) (ifetch UHI pc))
4194e98e3e1Schristos;			  (decode VOID pc (and UHI insn1 (const UHI #x7fff))
4204e98e3e1Schristos;				  (const SI 0)))
4214e98e3e1Schristos;		(sequence VOID
4224e98e3e1Schristos;			  (set-quiet USI (scratch USI insn) (ifetch USI pc))
4234e98e3e1Schristos;			  (if VOID (ne USI (and USI insn (const USI #x80000000))
4244e98e3e1Schristos;				     (const USI 0))
4254e98e3e1Schristos;			      (decode VOID pc (srl USI insn (const WI 16)) (const SI 0))
4264e98e3e1Schristos;			      (sequence VOID
4274e98e3e1Schristos;					; ??? parallel support
4284e98e3e1Schristos;					(decode VOID pc (srl USI insn (const WI 16))
4294e98e3e1Schristos;						(const SI 0))
4304e98e3e1Schristos;					(decode VOID (add AI pc (const AI 2))
4314e98e3e1Schristos;						(and USI insn (const WI #x7fff))
4324e98e3e1Schristos;						(const SI 1))))))
4334e98e3e1Schristos;	    )
4344e98e3e1Schristos;)
4354e98e3e1Schristos
4364e98e3e1Schristos; This is how to execute a decoded instruction.
4374e98e3e1Schristos
4384e98e3e1Schristos;(define-execute
4394e98e3e1Schristos;  (sequence VOID () ; () is empty option list
4404e98e3e1Schristos;	     ((AI new_pc))
4414e98e3e1Schristos;	     (set AI new_pc (execute: AI (const 0)) #:quiet)
4424e98e3e1Schristos;	     (set AI pc new_pc #:direct)
4434e98e3e1Schristos;	     )
4444e98e3e1Schristos;)
4454e98e3e1Schristos
4464e98e3e1Schristos; FIXME: It might simplify things to separate the execute process from the
4474e98e3e1Schristos; one that updates the PC.
4484e98e3e1Schristos
4494e98e3e1Schristos; Instruction fields.
4504e98e3e1Schristos;
4514e98e3e1Schristos; Attributes:
4524e98e3e1Schristos; PCREL-ADDR: pc relative value (for reloc and disassembly purposes)
4534e98e3e1Schristos; ABS-ADDR: absolute address (for reloc and disassembly purposes?)
4544e98e3e1Schristos; RESERVED: bits are not used to decode insn, must be all 0
4554e98e3e1Schristos; RELOC: there is a relocation associated with this field (experiment)
4564e98e3e1Schristos
4574e98e3e1Schristos(define-attr
4584e98e3e1Schristos  (for ifield operand)
4594e98e3e1Schristos  (type boolean)
4604e98e3e1Schristos  (name RELOC)
4614e98e3e1Schristos  (comment "there is a reloc associated with this field (experiment)")
4624e98e3e1Schristos)
4634e98e3e1Schristos
4644e98e3e1Schristos(dnf f-op1       "op1"                 () 0 4)
4654e98e3e1Schristos(dnf f-op2       "op2"                 () 8 4)
4664e98e3e1Schristos(dnf f-cond      "cond"                () 4 4)
4674e98e3e1Schristos(dnf f-r1        "r1"                  () 4 4)
4684e98e3e1Schristos(dnf f-r2        "r2"                  () 12 4)
4694e98e3e1Schristos(df f-simm8      "simm8"               () 8 8 INT #f #f)
4704e98e3e1Schristos(df f-simm16     "simm16"              () 16 16 INT #f #f)
4714e98e3e1Schristos(dnf f-shift-op2 "shift op2"           () 8 3)
4724e98e3e1Schristos(dnf f-uimm3     "uimm3"               () 5 3)
4734e98e3e1Schristos(dnf f-uimm4     "uimm4"               () 12 4)
4744e98e3e1Schristos(dnf f-uimm5     "uimm5"               () 11 5)
4754e98e3e1Schristos(dnf f-uimm8     "uimm8"               () 8 8)
4764e98e3e1Schristos(dnf f-uimm16    "uimm16"              () 16 16)
4774e98e3e1Schristos(dnf f-uimm24    "uimm24"              (ABS-ADDR RELOC) 8 24)
4784e98e3e1Schristos(dnf f-hi16      "high 16 bits"        (SIGN-OPT) 16 16)
4794e98e3e1Schristos(df f-disp8      "disp8, slot unknown" (PCREL-ADDR RELOC) 8 8 INT
4804e98e3e1Schristos    ((value pc) (sra WI (sub WI value (and WI pc (const -4))) (const 2)))
4818dffb485Schristos    ((value pc) (add WI (mul WI value (const 4)) (and WI pc (const -4)))))
4824e98e3e1Schristos(df f-disp16     "disp16"              (PCREL-ADDR RELOC) 16 16 INT
4834e98e3e1Schristos    ((value pc) (sra WI (sub WI value pc) (const 2)))
4848dffb485Schristos    ((value pc) (add WI (mul WI value (const 4)) pc)))
4854e98e3e1Schristos(df f-disp24     "disp24"              (PCREL-ADDR RELOC) 8 24 INT
4864e98e3e1Schristos    ((value pc) (sra WI (sub WI value pc) (const 2)))
4878dffb485Schristos    ((value pc) (add WI (mul WI value (const 4)) pc)))
4884e98e3e1Schristos
4894e98e3e1Schristos(dnf f-op23      "op2.3"               ()  9 3)
4904e98e3e1Schristos(dnf f-op3       "op3"                 () 14 2)
4914e98e3e1Schristos(dnf f-acc       "acc"                 ()  8 1)
4924e98e3e1Schristos(dnf f-accs      "accs"                () 12 2)
4934e98e3e1Schristos(dnf f-accd      "accd"                ()  4 2)
4944e98e3e1Schristos(dnf f-bits67    "bits67"              ()  6 2)
4954e98e3e1Schristos(dnf f-bit4      "bit4"                ()  4 1)
4964e98e3e1Schristos(dnf f-bit14     "bit14"               () 14 1)
4974e98e3e1Schristos
4984e98e3e1Schristos(define-ifield (name f-imm1) (comment "1 bit immediate, 0->1 1->2")
4994e98e3e1Schristos  (attrs)
5004e98e3e1Schristos  (start 15) (length 1)
5014e98e3e1Schristos  (encode (value pc) (sub WI value (const WI 1)))
5024e98e3e1Schristos  (decode (value pc) (add WI value (const WI 1)))
5034e98e3e1Schristos)
5044e98e3e1Schristos
5054e98e3e1Schristos; Enums.
5064e98e3e1Schristos
5074e98e3e1Schristos; insn-op1: bits 0-3
5084e98e3e1Schristos; FIXME: should use die macro or some such
5094e98e3e1Schristos(define-normal-insn-enum insn-op1 "insn format enums" () OP1_ f-op1
5104e98e3e1Schristos  ("0" "1" "2" "3" "4" "5" "6" "7"
5114e98e3e1Schristos   "8" "9" "10" "11" "12" "13" "14" "15")
5124e98e3e1Schristos)
5134e98e3e1Schristos
5144e98e3e1Schristos; insn-op2: bits 8-11
5154e98e3e1Schristos; FIXME: should use die macro or some such
5164e98e3e1Schristos(define-normal-insn-enum insn-op2 "op2 enums" () OP2_ f-op2
5174e98e3e1Schristos  ("0" "1" "2" "3" "4" "5" "6" "7"
5184e98e3e1Schristos   "8" "9" "10" "11" "12" "13" "14" "15")
5194e98e3e1Schristos)
5204e98e3e1Schristos
5214e98e3e1Schristos; Hardware pieces.
5224e98e3e1Schristos; These entries list the elements of the raw hardware.
5234e98e3e1Schristos; They're also used to provide tables and other elements of the assembly
5244e98e3e1Schristos; language.
5254e98e3e1Schristos
5264e98e3e1Schristos(dnh h-pc "program counter" (PC PROFILE) (pc) () () ())
5274e98e3e1Schristos
5284e98e3e1Schristos(dnh h-hi16 "high 16 bits" ()
5294e98e3e1Schristos     (immediate (UINT 16))
5304e98e3e1Schristos     () () ()
5314e98e3e1Schristos)
5324e98e3e1Schristos
5334e98e3e1Schristos; These two aren't technically needed.
5344e98e3e1Schristos; They're here for illustration sake mostly.
5354e98e3e1Schristos; Plus they cause the value to be stored in the extraction buffers to only
5364e98e3e1Schristos; be 16 bits wide (vs 32 or 64).  Whoopie ding.  But it's fun.
5374e98e3e1Schristos(dnh h-slo16 "signed low 16 bits" ()
5384e98e3e1Schristos     (immediate (INT 16))
5394e98e3e1Schristos     () () ()
5404e98e3e1Schristos)
5414e98e3e1Schristos(dnh h-ulo16 "unsigned low 16 bits" ()
5424e98e3e1Schristos     (immediate (UINT 16))
5434e98e3e1Schristos     () () ()
5444e98e3e1Schristos)
5454e98e3e1Schristos
5464e98e3e1Schristos(define-keyword
5474e98e3e1Schristos  (name gr-names)
5484e98e3e1Schristos  (print-name h-gr)
5494e98e3e1Schristos  (prefix "")
5504e98e3e1Schristos  (values (fp 13) (lr 14) (sp 15)
5514e98e3e1Schristos	  (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7)
5524e98e3e1Schristos	  (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15))
5534e98e3e1Schristos)
5544e98e3e1Schristos
5554e98e3e1Schristos(define-hardware
5564e98e3e1Schristos  (name h-gr)
5574e98e3e1Schristos  (comment "general registers")
5584e98e3e1Schristos  (attrs PROFILE CACHE-ADDR)
5594e98e3e1Schristos  (type register WI (16))
5604e98e3e1Schristos  (indices extern-keyword gr-names)
5614e98e3e1Schristos)
5624e98e3e1Schristos
5634e98e3e1Schristos(define-keyword
5644e98e3e1Schristos  (name cr-names)
5654e98e3e1Schristos  (print-name h-cr)
5664e98e3e1Schristos  (prefix "")
5674e98e3e1Schristos  (values (psw 0)   (cbr 1)   (spi 2)   (spu 3)
5684e98e3e1Schristos	  (bpc 6)   (bbpsw 8) (bbpc 14) (evb 5)
5694e98e3e1Schristos	  (cr0 0)   (cr1 1)   (cr2 2)   (cr3 3)
5704e98e3e1Schristos	  (cr4 4)   (cr5 5)   (cr6 6)   (cr7 7)
5714e98e3e1Schristos	  (cr8 8)   (cr9 9)   (cr10 10) (cr11 11)
5724e98e3e1Schristos	  (cr12 12) (cr13 13) (cr14 14) (cr15 15))
5734e98e3e1Schristos)
5744e98e3e1Schristos
5754e98e3e1Schristos(define-hardware
5764e98e3e1Schristos  (name h-cr)
5774e98e3e1Schristos  (comment "control registers")
5784e98e3e1Schristos  (type register UWI (16))
5794e98e3e1Schristos  (indices extern-keyword cr-names)
5804e98e3e1Schristos  (get (index) (c-call UWI "@cpu@_h_cr_get_handler" index))
5814e98e3e1Schristos  (set (index newval) (c-call VOID "@cpu@_h_cr_set_handler" index newval))
5824e98e3e1Schristos)
5834e98e3e1Schristos
5844e98e3e1Schristos; The actual accumulator is only 56 bits.
5854e98e3e1Schristos; The top 8 bits are sign extended from bit 8 (when counting msb = bit 0).
5864e98e3e1Schristos; To simplify the accumulator instructions, no attempt is made to keep the
5874e98e3e1Schristos; top 8 bits properly sign extended (currently there's no point since they
5884e98e3e1Schristos; all ignore them).  When the value is read it is properly sign extended
5894e98e3e1Schristos; [in the `get' handler].
5904e98e3e1Schristos(define-hardware
5914e98e3e1Schristos  (name h-accum)
5924e98e3e1Schristos  (comment "accumulator")
5934e98e3e1Schristos  (type register DI)
5944e98e3e1Schristos  (get () (c-call DI "@cpu@_h_accum_get_handler"))
5954e98e3e1Schristos  (set (newval) (c-call VOID "@cpu@_h_accum_set_handler" newval))
5964e98e3e1Schristos)
5974e98e3e1Schristos
5984e98e3e1Schristos; FIXME: Revisit after sanitization can be removed.  Remove h-accum.
5994e98e3e1Schristos(define-hardware
6004e98e3e1Schristos  (name h-accums)
6014e98e3e1Schristos  (comment "accumulators")
6024e98e3e1Schristos  (attrs (MACH m32rx,m32r2))
6034e98e3e1Schristos  (type register DI (2))
6044e98e3e1Schristos  (indices keyword "" ((a0 0) (a1 1)))
6054e98e3e1Schristos  ; get/set so a0 accesses are redirected to h-accum.
6064e98e3e1Schristos  ; They're also so reads can properly sign extend the value.
6074e98e3e1Schristos  ; FIXME: Needn't be a function call.
6084e98e3e1Schristos  (get (index) (c-call DI "@cpu@_h_accums_get_handler" index))
6094e98e3e1Schristos  (set (index newval) (c-call VOID "@cpu@_h_accums_set_handler" index newval))
6104e98e3e1Schristos)
6114e98e3e1Schristos
6124e98e3e1Schristos; For condbit operand.  FIXME: Need to allow spec of get/set of operands.
6134e98e3e1Schristos; Having this separate from h-psw keeps the parts that use it simpler
6144e98e3e1Schristos; [since they greatly outnumber those that use h-psw].
6154e98e3e1Schristos(dsh h-cond "condition bit" () (register BI))
6164e98e3e1Schristos
6174e98e3e1Schristos; The actual values of psw,bpsw,bbpsw are recorded here to allow access
6184e98e3e1Schristos; to them as a unit.
6194e98e3e1Schristos(define-hardware
6204e98e3e1Schristos  (name h-psw)
6214e98e3e1Schristos  (comment "psw part of psw")
6224e98e3e1Schristos  (type register UQI)
6234e98e3e1Schristos  ; get/set to handle cond bit.
6244e98e3e1Schristos  ; FIXME: missing: use's and clobber's
6254e98e3e1Schristos  ; FIXME: remove c-call?
6264e98e3e1Schristos  (get () (c-call UQI "@cpu@_h_psw_get_handler"))
6274e98e3e1Schristos  (set (newval) (c-call VOID "@cpu@_h_psw_set_handler" newval))
6284e98e3e1Schristos)
6294e98e3e1Schristos(dsh h-bpsw  "backup psw"      () (register UQI))
6304e98e3e1Schristos(dsh h-bbpsw "backup bpsw"     () (register UQI))
6314e98e3e1Schristos
6324e98e3e1Schristos; FIXME: Later make add get/set specs and support SMP.
6334e98e3e1Schristos(dsh h-lock  "lock"  () (register BI))
6344e98e3e1Schristos
6354e98e3e1Schristos; Instruction Operands.
6364e98e3e1Schristos; These entries provide a layer between the assembler and the raw hardware
6374e98e3e1Schristos; description, and are used to refer to hardware elements in the semantic
6384e98e3e1Schristos; code.  Usually there's a bit of over-specification, but in more complicated
6394e98e3e1Schristos; instruction sets there isn't.
6404e98e3e1Schristos
6414e98e3e1Schristos;; Print some operands take a hash prefix.
6424e98e3e1Schristos;; ??? Why don't we also handle one when parsing?
6434e98e3e1Schristos
6444e98e3e1Schristos(define-pmacro (duhpo x-name x-comment x-attrs x-type x-index)
6454e98e3e1Schristos  (define-operand (name x-name) (comment x-comment)
6464e98e3e1Schristos    (.splice attrs (.unsplice x-attrs))
6474e98e3e1Schristos    (type x-type) (index x-index)
6484e98e3e1Schristos    (handlers (print "unsigned_with_hash_prefix")))
6494e98e3e1Schristos)
6504e98e3e1Schristos
6514e98e3e1Schristos(define-pmacro (dshpo x-name x-comment x-attrs x-type x-index)
6524e98e3e1Schristos  (define-operand (name x-name) (comment x-comment)
6534e98e3e1Schristos    (.splice attrs (.unsplice x-attrs))
6544e98e3e1Schristos    (type x-type) (index x-index)
6554e98e3e1Schristos    (handlers (print "signed_with_hash_prefix")))
6564e98e3e1Schristos)
6574e98e3e1Schristos
6584e98e3e1Schristos; ??? Convention says this should be o-sr, but then the insn definitions
6594e98e3e1Schristos; should refer to o-sr which is clumsy.  The "o-" could be implicit, but
6604e98e3e1Schristos; then it should be implicit for all the symbols here, but then there would
6614e98e3e1Schristos; be confusion between (f-)simm8 and (h-)simm8.
6624e98e3e1Schristos; So for now the rule is exactly as it appears here.
6634e98e3e1Schristos
6644e98e3e1Schristos(dnop sr     "source register"              () h-gr   f-r2)
6654e98e3e1Schristos(dnop dr     "destination register"         () h-gr   f-r1)
6664e98e3e1Schristos;; The assembler relies upon the fact that dr and src1 are the same field.
6674e98e3e1Schristos;; FIXME: Revisit.
6684e98e3e1Schristos(dnop src1   "source register 1"            () h-gr   f-r1)
6694e98e3e1Schristos(dnop src2   "source register 2"            () h-gr   f-r2)
6704e98e3e1Schristos(dnop scr    "source control register"      () h-cr   f-r2)
6714e98e3e1Schristos(dnop dcr    "destination control register" () h-cr   f-r1)
6724e98e3e1Schristos
6734e98e3e1Schristos(dshpo simm8  "8 bit signed immediate"       () h-sint f-simm8)
6744e98e3e1Schristos(dshpo simm16 "16 bit signed immediate"      () h-sint f-simm16)
6754e98e3e1Schristos(duhpo uimm3  "3 bit unsigned number"        () h-uint f-uimm3)
6764e98e3e1Schristos(duhpo uimm4  "4 bit trap number"            () h-uint f-uimm4)
6774e98e3e1Schristos(duhpo uimm5  "5 bit shift count"            () h-uint f-uimm5)
6784e98e3e1Schristos(duhpo uimm8  "8 bit unsigned immediate"     () h-uint f-uimm8)
6794e98e3e1Schristos(duhpo uimm16 "16 bit unsigned immediate"    () h-uint f-uimm16)
6804e98e3e1Schristos
6814e98e3e1Schristos(duhpo imm1 "1 bit immediate" ((MACH m32rx,m32r2)) h-uint f-imm1)
6824e98e3e1Schristos
6834e98e3e1Schristos(dnop accd   "accumulator destination register" ((MACH m32rx,m32r2)) h-accums f-accd)
6844e98e3e1Schristos(dnop accs   "accumulator source register"  ((MACH m32rx,m32r2))     h-accums f-accs)
6854e98e3e1Schristos(dnop acc    "accumulator reg (d)"          ((MACH m32rx,m32r2))     h-accums f-acc)
6864e98e3e1Schristos
6874e98e3e1Schristos; slo16,ulo16 are used in both with-hash-prefix/no-hash-prefix cases.
6884e98e3e1Schristos; e.g. add3 r3,r3,#1 and ld r3,@(4,r4).  We could use special handlers on
6894e98e3e1Schristos; the operands themselves.
6904e98e3e1Schristos; Instead we create a fake operand `hash'.  The m32r is an illustration port,
6914e98e3e1Schristos; so we often try out various ways of doing things.
6924e98e3e1Schristos
6934e98e3e1Schristos(define-operand (name hash) (comment "# prefix") (attrs)
6944e98e3e1Schristos  (type h-sint) ; doesn't really matter
6954e98e3e1Schristos  (index f-nil)
6964e98e3e1Schristos  (handlers (parse "hash") (print "hash"))
6974e98e3e1Schristos)
6984e98e3e1Schristos
6994e98e3e1Schristos; For high(foo),shigh(foo).
7004e98e3e1Schristos(define-operand
7014e98e3e1Schristos  (name hi16)
7024e98e3e1Schristos  (comment "high 16 bit immediate, sign optional")
7034e98e3e1Schristos  (attrs)
7044e98e3e1Schristos  (type h-hi16)
7054e98e3e1Schristos  (index f-hi16)
7064e98e3e1Schristos  (handlers (parse "hi16"))
7074e98e3e1Schristos)
7084e98e3e1Schristos
7094e98e3e1Schristos; For low(foo),sda(foo).
7104e98e3e1Schristos(define-operand
7114e98e3e1Schristos  (name slo16)
7124e98e3e1Schristos  (comment "16 bit signed immediate, for low()")
7134e98e3e1Schristos  (attrs)
7144e98e3e1Schristos  (type h-slo16)
7154e98e3e1Schristos  (index f-simm16)
7164e98e3e1Schristos  (handlers (parse "slo16"))
7174e98e3e1Schristos)
7184e98e3e1Schristos
7194e98e3e1Schristos; For low(foo).
7204e98e3e1Schristos(define-operand
7214e98e3e1Schristos  (name ulo16)
7224e98e3e1Schristos  (comment "16 bit unsigned immediate, for low()")
7234e98e3e1Schristos  (attrs)
7244e98e3e1Schristos  (type h-ulo16)
7254e98e3e1Schristos  (index f-uimm16)
7264e98e3e1Schristos  (handlers (parse "ulo16"))
7274e98e3e1Schristos)
7284e98e3e1Schristos
7294e98e3e1Schristos(dnop uimm24 "24 bit address" () h-addr f-uimm24)
7304e98e3e1Schristos
7314e98e3e1Schristos(define-operand
7324e98e3e1Schristos  (name disp8)
7334e98e3e1Schristos  (comment "8 bit displacement")
7344e98e3e1Schristos  (attrs RELAX)
7354e98e3e1Schristos  (type h-iaddr)
7364e98e3e1Schristos  (index f-disp8)
7374e98e3e1Schristos  ; ??? Early experiments had insert/extract fields here.
7384e98e3e1Schristos  ; Moving these to f-disp8 made things cleaner, but may wish to re-introduce
7394e98e3e1Schristos  ; fields here to handle more complicated cases.
7404e98e3e1Schristos)
7414e98e3e1Schristos
7424e98e3e1Schristos(dnop disp16 "16 bit displacement" () h-iaddr f-disp16)
7434e98e3e1Schristos(dnop disp24 "24 bit displacement" (RELAX) h-iaddr f-disp24)
7444e98e3e1Schristos
745*4b169a6bSchristos; These hardware elements are referred to frequently.
7464e98e3e1Schristos
7474e98e3e1Schristos(dnop condbit "condition bit" (SEM-ONLY) h-cond f-nil)
7484e98e3e1Schristos(dnop accum "accumulator" (SEM-ONLY) h-accum f-nil)
7494e98e3e1Schristos
7504e98e3e1Schristos; Instruction definitions.
7514e98e3e1Schristos;
7524e98e3e1Schristos; Notes while wip:
7534e98e3e1Schristos; - dni is a cover macro to the real "this is an instruction" keyword.
7544e98e3e1Schristos;   The syntax of the real one is yet to be determined.
7554e98e3e1Schristos;   At the lowest level (i.e. the "real" one) it will probably take a variable
7564e98e3e1Schristos;   list of arguments where each argument [perhaps after the standard three of
7574e98e3e1Schristos;   name, comment, attrs] is "(keyword arg-to-keyword)".  This syntax is simple
7584e98e3e1Schristos;   and yet completely upward extensible.  And given the macro facility, one
7594e98e3e1Schristos;   needn't code at that low a level so even though it'll be more verbose than
7604e98e3e1Schristos;   necessary it won't matter.  This same reasoning can be applied to most
7614e98e3e1Schristos;   types of entries in this file.
7624e98e3e1Schristos
7634e98e3e1Schristos; M32R specific instruction attributes:
7644e98e3e1Schristos
7654e98e3e1Schristos; FILL-SLOT: Need next insn to begin on 32 bit boundary.
7664e98e3e1Schristos; (A "slot" as used here is a 32 bit quantity that can either be filled with
7674e98e3e1Schristos; one 32 bit insn or two 16 bit insns which go in the "left bin" and "right
7684e98e3e1Schristos; bin" where the left bin is the one with a lower address).
7694e98e3e1Schristos
7704e98e3e1Schristos(define-attr
7714e98e3e1Schristos  (for insn)
7724e98e3e1Schristos  (type boolean)
7734e98e3e1Schristos  (name FILL-SLOT)
7744e98e3e1Schristos  (comment "fill right bin with `nop' if insn is in left bin")
7754e98e3e1Schristos)
7764e98e3e1Schristos
7774e98e3e1Schristos(define-attr
7784e98e3e1Schristos  (for insn)
7794e98e3e1Schristos  (type boolean)
7804e98e3e1Schristos  (name SPECIAL)
7814e98e3e1Schristos  (comment "non-public m32rx insn")
7824e98e3e1Schristos)
7834e98e3e1Schristos
7844e98e3e1Schristos(define-attr
7854e98e3e1Schristos  (for insn)
7864e98e3e1Schristos  (type boolean)
7874e98e3e1Schristos  (name SPECIAL_M32R)
7884e98e3e1Schristos  (comment "non-public m32r insn")
7894e98e3e1Schristos)
7904e98e3e1Schristos
7914e98e3e1Schristos(define-attr
7924e98e3e1Schristos  (for insn)
7934e98e3e1Schristos  (type boolean)
7944e98e3e1Schristos  (name SPECIAL_FLOAT)
7954e98e3e1Schristos  (comment "floating point insn")
7964e98e3e1Schristos)
7974e98e3e1Schristos
7984e98e3e1Schristos; IDOC attribute for instruction documentation.
7994e98e3e1Schristos
8004e98e3e1Schristos(define-attr
8014e98e3e1Schristos  (for insn)
8024e98e3e1Schristos  (type enum)
8034e98e3e1Schristos  (name IDOC)
8044e98e3e1Schristos  (comment "insn kind for documentation")
8054e98e3e1Schristos  (attrs META)
8064e98e3e1Schristos  (values
8074e98e3e1Schristos   (MEM - () "Memory")
8084e98e3e1Schristos   (ALU - () "ALU")
8094e98e3e1Schristos   (BR - () "Branch")
8104e98e3e1Schristos   (ACCUM - () "Accumulator")
8114e98e3e1Schristos   (MAC - () "Multiply/Accumulate")
8124e98e3e1Schristos   (MISC - () "Miscellaneous")
8134e98e3e1Schristos  )
8144e98e3e1Schristos)
8154e98e3e1Schristos
8164e98e3e1Schristos(define-pmacro (bin-op mnemonic op2-op sem-op imm-prefix imm)
8174e98e3e1Schristos  (begin
8184e98e3e1Schristos     (dni mnemonic
8194e98e3e1Schristos	  (.str mnemonic " reg/reg")
8204e98e3e1Schristos	  ((PIPE OS) (IDOC ALU))
8214e98e3e1Schristos	  (.str mnemonic " $dr,$sr")
8224e98e3e1Schristos	  (+ OP1_0 op2-op dr sr)
8234e98e3e1Schristos	  (set dr (sem-op dr sr))
8244e98e3e1Schristos	  ()
8254e98e3e1Schristos     )
8264e98e3e1Schristos     (dni (.sym mnemonic "3")
8274e98e3e1Schristos	  (.str mnemonic " reg/" imm)
8284e98e3e1Schristos	  ((IDOC ALU))
8294e98e3e1Schristos	  (.str mnemonic "3 $dr,$sr," imm-prefix "$" imm)
8304e98e3e1Schristos	  (+ OP1_8 op2-op dr sr imm)
8314e98e3e1Schristos	  (set dr (sem-op sr imm))
8324e98e3e1Schristos	  ()
8334e98e3e1Schristos     )
8344e98e3e1Schristos   )
8354e98e3e1Schristos)
8364e98e3e1Schristos(bin-op add OP2_10 add "$hash" slo16)
8374e98e3e1Schristos; sub isn't present because sub3 doesn't exist.
8384e98e3e1Schristos(bin-op and OP2_12 and "" uimm16)
8394e98e3e1Schristos(bin-op or OP2_14 or "$hash" ulo16)
8404e98e3e1Schristos(bin-op xor OP2_13 xor "" uimm16)
8414e98e3e1Schristos
8424e98e3e1Schristos(dni addi "addi"
8434e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
8444e98e3e1Schristos     ;#.(string-append "addi " "$dr,$simm8") ; #. experiment
8454e98e3e1Schristos     "addi $dr,$simm8"
8464e98e3e1Schristos     (+ OP1_4 dr simm8)
8474e98e3e1Schristos     (set dr (add dr simm8))
8484e98e3e1Schristos     ((m32r/d (unit u-exec))
8494e98e3e1Schristos      (m32rx (unit u-exec))
8504e98e3e1Schristos      (m32r2 (unit u-exec)))
8514e98e3e1Schristos)
8524e98e3e1Schristos
8534e98e3e1Schristos(dni addv "addv"
8544e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
8554e98e3e1Schristos     "addv $dr,$sr"
8564e98e3e1Schristos     (+ OP1_0 OP2_8 dr sr)
8574e98e3e1Schristos     (parallel ()
8584e98e3e1Schristos	       (set dr (add dr sr))
8594e98e3e1Schristos	       (set condbit (add-oflag dr sr (const 0))))
8604e98e3e1Schristos     ()
8614e98e3e1Schristos)
8624e98e3e1Schristos
8634e98e3e1Schristos(dni addv3 "addv3"
8644e98e3e1Schristos     ((IDOC ALU))
8654e98e3e1Schristos     "addv3 $dr,$sr,$simm16"
8664e98e3e1Schristos     (+ OP1_8 OP2_8 dr sr simm16)
8674e98e3e1Schristos     (parallel ()
8684e98e3e1Schristos	       (set dr (add sr simm16))
8694e98e3e1Schristos	       (set condbit (add-oflag sr simm16 (const 0))))
8704e98e3e1Schristos     ()
8714e98e3e1Schristos)
8724e98e3e1Schristos
8734e98e3e1Schristos(dni addx "addx"
8744e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
8754e98e3e1Schristos     "addx $dr,$sr"
8764e98e3e1Schristos     (+ OP1_0 OP2_9 dr sr)
8774e98e3e1Schristos     (parallel ()
8784e98e3e1Schristos	       (set dr (addc dr sr condbit))
8794e98e3e1Schristos	       (set condbit (add-cflag dr sr condbit)))
8804e98e3e1Schristos     ()
8814e98e3e1Schristos)
8824e98e3e1Schristos
8834e98e3e1Schristos(dni bc8 "bc with 8 bit displacement"
8844e98e3e1Schristos     (COND-CTI (PIPE O) (IDOC BR))
8854e98e3e1Schristos     "bc.s $disp8"
8864e98e3e1Schristos     (+ OP1_7 (f-r1 12) disp8)
8874e98e3e1Schristos     (if condbit (set pc disp8))
8884e98e3e1Schristos     ((m32r/d (unit u-cti))
8894e98e3e1Schristos      (m32rx (unit u-cti))
8904e98e3e1Schristos      (m32r2 (unit u-cti)))
8914e98e3e1Schristos)
8924e98e3e1Schristos
8934e98e3e1Schristos(dnmi bc8r "relaxable bc8"
8944e98e3e1Schristos     (COND-CTI RELAXABLE (PIPE O) (IDOC BR))
8954e98e3e1Schristos     "bc $disp8"
8964e98e3e1Schristos     (emit bc8 disp8)
8974e98e3e1Schristos)
8984e98e3e1Schristos
8994e98e3e1Schristos(dni bc24 "bc with 24 bit displacement"
9004e98e3e1Schristos     (COND-CTI (IDOC BR))
9014e98e3e1Schristos     "bc.l $disp24"
9024e98e3e1Schristos     (+ OP1_15 (f-r1 12) disp24)
9034e98e3e1Schristos     (if condbit (set pc disp24))
9044e98e3e1Schristos     ((m32r/d (unit u-cti))
9054e98e3e1Schristos      (m32rx (unit u-cti))
9064e98e3e1Schristos      (m32r2 (unit u-cti)))
9074e98e3e1Schristos)
9084e98e3e1Schristos
9094e98e3e1Schristos(dnmi bc24r "relaxable bc24"
9104e98e3e1Schristos     (COND-CTI RELAXED (IDOC BR))
9114e98e3e1Schristos     "bc $disp24"
9124e98e3e1Schristos     (emit bc24 disp24)
9134e98e3e1Schristos)
9144e98e3e1Schristos
9154e98e3e1Schristos(dni beq "beq"
9164e98e3e1Schristos     (COND-CTI (IDOC BR))
9174e98e3e1Schristos     "beq $src1,$src2,$disp16"
9184e98e3e1Schristos     (+ OP1_11 OP2_0 src1 src2 disp16)
9194e98e3e1Schristos     (if (eq src1 src2) (set pc disp16))
9204e98e3e1Schristos     ((m32r/d (unit u-cti) (unit u-cmp (cycles 0)))
9214e98e3e1Schristos      (m32rx (unit u-cti) (unit u-cmp (cycles 0)))
9224e98e3e1Schristos      (m32r2 (unit u-cti) (unit u-cmp (cycles 0))))
9234e98e3e1Schristos)
9244e98e3e1Schristos
9254e98e3e1Schristos(define-pmacro (cbranch sym comment op2-op comp-op)
9264e98e3e1Schristos  (dni sym comment (COND-CTI (IDOC BR))
9274e98e3e1Schristos	(.str sym " $src2,$disp16")
9284e98e3e1Schristos	(+ OP1_11 op2-op (f-r1 0) src2 disp16)
9294e98e3e1Schristos	(if (comp-op src2 (const WI 0)) (set pc disp16))
9304e98e3e1Schristos	((m32r/d (unit u-cti) (unit u-cmp (cycles 0)))
9314e98e3e1Schristos	 (m32rx (unit u-cti) (unit u-cmp (cycles 0)))
9324e98e3e1Schristos	 (m32r2 (unit u-cti) (unit u-cmp (cycles 0))))
9334e98e3e1Schristos	)
9344e98e3e1Schristos)
9354e98e3e1Schristos(cbranch beqz "beqz" OP2_8 eq)
9364e98e3e1Schristos(cbranch bgez "bgez" OP2_11 ge)
9374e98e3e1Schristos(cbranch bgtz "bgtz" OP2_13 gt)
9384e98e3e1Schristos(cbranch blez "blez" OP2_12 le)
9394e98e3e1Schristos(cbranch bltz "bltz" OP2_10 lt)
9404e98e3e1Schristos(cbranch bnez "bnez" OP2_9 ne)
9414e98e3e1Schristos
9424e98e3e1Schristos(dni bl8 "bl with 8 bit displacement"
9434e98e3e1Schristos     (UNCOND-CTI FILL-SLOT (PIPE O) (IDOC BR))
9444e98e3e1Schristos     "bl.s $disp8"
9454e98e3e1Schristos     (+ OP1_7 (f-r1 14) disp8)
9464e98e3e1Schristos     (sequence ()
9474e98e3e1Schristos	       (set (reg h-gr 14)
9484e98e3e1Schristos		    (add (and pc (const -4)) (const 4)))
9494e98e3e1Schristos	       (set pc disp8))
9504e98e3e1Schristos     ((m32r/d (unit u-cti))
9514e98e3e1Schristos      (m32rx (unit u-cti))
9524e98e3e1Schristos      (m32r2 (unit u-cti)))
9534e98e3e1Schristos)
9544e98e3e1Schristos
9554e98e3e1Schristos(dnmi bl8r "relaxable bl8"
9564e98e3e1Schristos     (UNCOND-CTI FILL-SLOT RELAXABLE (PIPE O) (IDOC BR))
9574e98e3e1Schristos     "bl $disp8"
9584e98e3e1Schristos     (emit bl8 disp8)
9594e98e3e1Schristos)
9604e98e3e1Schristos
9614e98e3e1Schristos(dni bl24 "bl with 24 bit displacement"
9624e98e3e1Schristos     (UNCOND-CTI (IDOC BR))
9634e98e3e1Schristos     "bl.l $disp24"
9644e98e3e1Schristos     (+ OP1_15 (f-r1 14) disp24)
9654e98e3e1Schristos     (sequence ()
9664e98e3e1Schristos	       (set (reg h-gr 14) (add pc (const 4)))
9674e98e3e1Schristos	       (set pc disp24))
9684e98e3e1Schristos     ((m32r/d (unit u-cti))
9694e98e3e1Schristos      (m32rx (unit u-cti))
9704e98e3e1Schristos      (m32r2 (unit u-cti)))
9714e98e3e1Schristos)
9724e98e3e1Schristos
9734e98e3e1Schristos(dnmi bl24r "relaxable bl24"
9744e98e3e1Schristos     (UNCOND-CTI RELAXED (IDOC BR))
9754e98e3e1Schristos     "bl $disp24"
9764e98e3e1Schristos     (emit bl24 disp24)
9774e98e3e1Schristos)
9784e98e3e1Schristos
9794e98e3e1Schristos(dni bcl8 "bcl with 8 bit displacement"
9804e98e3e1Schristos     (COND-CTI FILL-SLOT (MACH m32rx,m32r2) (PIPE O) (IDOC BR))
9814e98e3e1Schristos     "bcl.s $disp8"
9824e98e3e1Schristos     (+ OP1_7 (f-r1 8) disp8)
9834e98e3e1Schristos     (if condbit
9844e98e3e1Schristos         (sequence ()
9854e98e3e1Schristos		   (set (reg h-gr 14)
9864e98e3e1Schristos			(add (and pc (const -4))
9874e98e3e1Schristos			     (const 4)))
9884e98e3e1Schristos		   (set pc disp8)))
9894e98e3e1Schristos     ((m32rx (unit u-cti))
9904e98e3e1Schristos      (m32r2 (unit u-cti)))
9914e98e3e1Schristos)
9924e98e3e1Schristos
9934e98e3e1Schristos(dnmi bcl8r "relaxable bcl8"
9944e98e3e1Schristos     (COND-CTI FILL-SLOT (MACH m32rx,m32r2) (PIPE O) RELAXABLE (IDOC BR))
9954e98e3e1Schristos     "bcl $disp8"
9964e98e3e1Schristos     (emit bcl8 disp8)
9974e98e3e1Schristos)
9984e98e3e1Schristos
9994e98e3e1Schristos(dni bcl24 "bcl with 24 bit displacement"
10004e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) (IDOC BR))
10014e98e3e1Schristos     "bcl.l $disp24"
10024e98e3e1Schristos     (+ OP1_15 (f-r1 8) disp24)
10034e98e3e1Schristos     (if condbit
10044e98e3e1Schristos         (sequence ()
10054e98e3e1Schristos		   (set (reg h-gr 14) (add pc (const 4)))
10064e98e3e1Schristos		   (set pc disp24)))
10074e98e3e1Schristos     ((m32rx (unit u-cti))
10084e98e3e1Schristos      (m32r2 (unit u-cti)))
10094e98e3e1Schristos)
10104e98e3e1Schristos
10114e98e3e1Schristos(dnmi bcl24r "relaxable bcl24"
10124e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) RELAXED (IDOC BR))
10134e98e3e1Schristos     "bcl $disp24"
10144e98e3e1Schristos     (emit bcl24 disp24)
10154e98e3e1Schristos)
10164e98e3e1Schristos
10174e98e3e1Schristos(dni bnc8 "bnc with 8 bit displacement"
10184e98e3e1Schristos     (COND-CTI (PIPE O) (IDOC BR))
10194e98e3e1Schristos     "bnc.s $disp8"
10204e98e3e1Schristos     (+ OP1_7 (f-r1 13) disp8)
10214e98e3e1Schristos     (if (not condbit) (set pc disp8))
10224e98e3e1Schristos     ((m32r/d (unit u-cti))
10234e98e3e1Schristos      (m32rx (unit u-cti))
10244e98e3e1Schristos      (m32r2 (unit u-cti)))
10254e98e3e1Schristos)
10264e98e3e1Schristos
10274e98e3e1Schristos(dnmi bnc8r "relaxable bnc8"
10284e98e3e1Schristos     (COND-CTI RELAXABLE (PIPE O) (IDOC BR))
10294e98e3e1Schristos     "bnc $disp8"
10304e98e3e1Schristos     (emit bnc8 disp8)
10314e98e3e1Schristos)
10324e98e3e1Schristos
10334e98e3e1Schristos(dni bnc24 "bnc with 24 bit displacement"
10344e98e3e1Schristos     (COND-CTI (IDOC BR))
10354e98e3e1Schristos     "bnc.l $disp24"
10364e98e3e1Schristos     (+ OP1_15 (f-r1 13) disp24)
10374e98e3e1Schristos     (if (not condbit) (set pc disp24))
10384e98e3e1Schristos     ((m32r/d (unit u-cti))
10394e98e3e1Schristos      (m32rx (unit u-cti))
10404e98e3e1Schristos      (m32r2 (unit u-cti)))
10414e98e3e1Schristos)
10424e98e3e1Schristos
10434e98e3e1Schristos(dnmi bnc24r "relaxable bnc24"
10444e98e3e1Schristos     (COND-CTI RELAXED (IDOC BR))
10454e98e3e1Schristos     "bnc $disp24"
10464e98e3e1Schristos     (emit bnc24 disp24)
10474e98e3e1Schristos)
10484e98e3e1Schristos
10494e98e3e1Schristos(dni bne "bne"
10504e98e3e1Schristos     (COND-CTI (IDOC BR))
10514e98e3e1Schristos     "bne $src1,$src2,$disp16"
10524e98e3e1Schristos     (+ OP1_11 OP2_1 src1 src2 disp16)
10534e98e3e1Schristos     (if (ne src1 src2) (set pc disp16))
10544e98e3e1Schristos     ((m32r/d (unit u-cti) (unit u-cmp (cycles 0)))
10554e98e3e1Schristos      (m32rx (unit u-cti) (unit u-cmp (cycles 0)))
10564e98e3e1Schristos      (m32r2 (unit u-cti) (unit u-cmp (cycles 0))))
10574e98e3e1Schristos)
10584e98e3e1Schristos
10594e98e3e1Schristos(dni bra8 "bra with 8 bit displacement"
10604e98e3e1Schristos     (UNCOND-CTI FILL-SLOT (PIPE O) (IDOC BR))
10614e98e3e1Schristos     "bra.s $disp8"
10624e98e3e1Schristos     (+ OP1_7 (f-r1 15) disp8)
10634e98e3e1Schristos     (set pc disp8)
10644e98e3e1Schristos     ((m32r/d (unit u-cti))
10654e98e3e1Schristos      (m32rx (unit u-cti))
10664e98e3e1Schristos      (m32r2 (unit u-cti)))
10674e98e3e1Schristos)
10684e98e3e1Schristos
10694e98e3e1Schristos(dnmi bra8r "relaxable bra8"
10704e98e3e1Schristos     (UNCOND-CTI FILL-SLOT RELAXABLE (PIPE O) (IDOC BR))
10714e98e3e1Schristos     "bra $disp8"
10724e98e3e1Schristos     (emit bra8 disp8)
10734e98e3e1Schristos)
10744e98e3e1Schristos
10754e98e3e1Schristos(dni bra24 "bra with 24 displacement"
10764e98e3e1Schristos     (UNCOND-CTI (IDOC BR))
10774e98e3e1Schristos     "bra.l $disp24"
10784e98e3e1Schristos     (+ OP1_15 (f-r1 15) disp24)
10794e98e3e1Schristos     (set pc disp24)
10804e98e3e1Schristos     ((m32r/d (unit u-cti))
10814e98e3e1Schristos      (m32rx (unit u-cti))
10824e98e3e1Schristos      (m32r2 (unit u-cti)))
10834e98e3e1Schristos)
10844e98e3e1Schristos
10854e98e3e1Schristos(dnmi bra24r "relaxable bra24"
10864e98e3e1Schristos     (UNCOND-CTI RELAXED (IDOC BR))
10874e98e3e1Schristos     "bra $disp24"
10884e98e3e1Schristos     (emit bra24 disp24)
10894e98e3e1Schristos)
10904e98e3e1Schristos
10914e98e3e1Schristos(dni bncl8 "bncl with 8 bit displacement"
10924e98e3e1Schristos     (COND-CTI FILL-SLOT (MACH m32rx,m32r2) (PIPE O) (IDOC BR))
10934e98e3e1Schristos     "bncl.s $disp8"
10944e98e3e1Schristos     (+ OP1_7 (f-r1 9) disp8)
10954e98e3e1Schristos     (if (not condbit)
10964e98e3e1Schristos         (sequence ()
10974e98e3e1Schristos		   (set (reg h-gr 14)
10984e98e3e1Schristos			(add (and pc (const -4))
10994e98e3e1Schristos			     (const 4)))
11004e98e3e1Schristos		   (set pc disp8)))
11014e98e3e1Schristos     ((m32rx (unit u-cti))
11024e98e3e1Schristos      (m32r2 (unit u-cti)))
11034e98e3e1Schristos)
11044e98e3e1Schristos
11054e98e3e1Schristos(dnmi bncl8r "relaxable bncl8"
11064e98e3e1Schristos     (COND-CTI FILL-SLOT (MACH m32rx,m32r2) (PIPE O) RELAXABLE (IDOC BR))
11074e98e3e1Schristos     "bncl $disp8"
11084e98e3e1Schristos     (emit bncl8 disp8)
11094e98e3e1Schristos)
11104e98e3e1Schristos
11114e98e3e1Schristos(dni bncl24 "bncl with 24 bit displacement"
11124e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) (IDOC BR))
11134e98e3e1Schristos     "bncl.l $disp24"
11144e98e3e1Schristos     (+ OP1_15 (f-r1 9) disp24)
11154e98e3e1Schristos     (if (not condbit)
11164e98e3e1Schristos         (sequence ()
11174e98e3e1Schristos		   (set (reg h-gr 14) (add pc (const 4)))
11184e98e3e1Schristos		   (set pc disp24)))
11194e98e3e1Schristos     ((m32rx (unit u-cti))
11204e98e3e1Schristos      (m32r2 (unit u-cti)))
11214e98e3e1Schristos)
11224e98e3e1Schristos
11234e98e3e1Schristos(dnmi bncl24r "relaxable bncl24"
11244e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) RELAXED (IDOC BR))
11254e98e3e1Schristos     "bncl $disp24"
11264e98e3e1Schristos     (emit bncl24 disp24)
11274e98e3e1Schristos)
11284e98e3e1Schristos
11294e98e3e1Schristos(dni cmp "cmp"
11304e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
11314e98e3e1Schristos     "cmp $src1,$src2"
11324e98e3e1Schristos     (+ OP1_0 OP2_4 src1 src2)
11334e98e3e1Schristos     (set condbit (lt src1 src2))
11344e98e3e1Schristos     ((m32r/d (unit u-cmp))
11354e98e3e1Schristos      (m32rx (unit u-cmp))
11364e98e3e1Schristos      (m32r2 (unit u-cmp)))
11374e98e3e1Schristos)
11384e98e3e1Schristos
11394e98e3e1Schristos(dni cmpi "cmpi"
11404e98e3e1Schristos     ((IDOC ALU))
11414e98e3e1Schristos     "cmpi $src2,$simm16"
11424e98e3e1Schristos     (+ OP1_8 (f-r1 0) OP2_4 src2 simm16)
11434e98e3e1Schristos     (set condbit (lt src2 simm16))
11444e98e3e1Schristos     ((m32r/d (unit u-cmp))
11454e98e3e1Schristos      (m32rx (unit u-cmp))
11464e98e3e1Schristos      (m32r2 (unit u-cmp)))
11474e98e3e1Schristos)
11484e98e3e1Schristos
11494e98e3e1Schristos(dni cmpu "cmpu"
11504e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
11514e98e3e1Schristos     "cmpu $src1,$src2"
11524e98e3e1Schristos     (+ OP1_0 OP2_5 src1 src2)
11534e98e3e1Schristos     (set condbit (ltu src1 src2))
11544e98e3e1Schristos     ((m32r/d (unit u-cmp))
11554e98e3e1Schristos      (m32rx (unit u-cmp))
11564e98e3e1Schristos      (m32r2 (unit u-cmp)))
11574e98e3e1Schristos)
11584e98e3e1Schristos
11594e98e3e1Schristos(dni cmpui "cmpui"
11604e98e3e1Schristos     ((IDOC ALU))
11614e98e3e1Schristos     "cmpui $src2,$simm16"
11624e98e3e1Schristos     (+ OP1_8 (f-r1 0) OP2_5 src2 simm16)
11634e98e3e1Schristos     (set condbit (ltu src2 simm16))
11644e98e3e1Schristos     ((m32r/d (unit u-cmp))
11654e98e3e1Schristos      (m32rx (unit u-cmp))
11664e98e3e1Schristos      (m32r2 (unit u-cmp)))
11674e98e3e1Schristos)
11684e98e3e1Schristos
11694e98e3e1Schristos(dni cmpeq "cmpeq"
11704e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE OS) (IDOC ALU))
11714e98e3e1Schristos     "cmpeq $src1,$src2"
11724e98e3e1Schristos     (+ OP1_0 OP2_6 src1 src2)
11734e98e3e1Schristos     (set condbit (eq src1 src2))
11744e98e3e1Schristos     ((m32rx (unit u-cmp))
11754e98e3e1Schristos      (m32r2 (unit u-cmp)))
11764e98e3e1Schristos)
11774e98e3e1Schristos
11784e98e3e1Schristos(dni cmpz "cmpz"
11794e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE OS) (IDOC ALU))
11804e98e3e1Schristos     "cmpz $src2"
11814e98e3e1Schristos     (+ OP1_0 OP2_7 (f-r1 0) src2)
11824e98e3e1Schristos     (set condbit (eq src2 (const 0)))
11834e98e3e1Schristos     ((m32rx (unit u-cmp))
11844e98e3e1Schristos      (m32r2 (unit u-cmp)))
11854e98e3e1Schristos)
11864e98e3e1Schristos
11874e98e3e1Schristos(dni div "div"
11884e98e3e1Schristos     ((IDOC ALU))
11894e98e3e1Schristos     "div $dr,$sr"
11904e98e3e1Schristos     (+ OP1_9 OP2_0 dr sr (f-simm16 0))
11914e98e3e1Schristos     (if (ne sr (const 0)) (set dr (div dr sr)))
11924e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 37)))
11934e98e3e1Schristos      (m32rx (unit u-exec (cycles 37)))
11944e98e3e1Schristos      (m32r2 (unit u-exec (cycles 37))))
11954e98e3e1Schristos)
11964e98e3e1Schristos
11974e98e3e1Schristos(dni divu "divu"
11984e98e3e1Schristos     ((IDOC ALU))
11994e98e3e1Schristos     "divu $dr,$sr"
12004e98e3e1Schristos     (+ OP1_9 OP2_1 dr sr (f-simm16 0))
12014e98e3e1Schristos     (if (ne sr (const 0)) (set dr (udiv dr sr)))
12024e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 37)))
12034e98e3e1Schristos      (m32rx (unit u-exec (cycles 37)))
12044e98e3e1Schristos      (m32r2 (unit u-exec (cycles 37))))
12054e98e3e1Schristos)
12064e98e3e1Schristos
12074e98e3e1Schristos(dni rem "rem"
12084e98e3e1Schristos     ((IDOC ALU))
12094e98e3e1Schristos     "rem $dr,$sr"
12104e98e3e1Schristos     (+ OP1_9 OP2_2 dr sr (f-simm16 0))
12114e98e3e1Schristos     ; FIXME: Check rounding direction.
12124e98e3e1Schristos     (if (ne sr (const 0)) (set dr (mod dr sr)))
12134e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 37)))
12144e98e3e1Schristos      (m32rx (unit u-exec (cycles 37)))
12154e98e3e1Schristos      (m32r2 (unit u-exec (cycles 37))))
12164e98e3e1Schristos)
12174e98e3e1Schristos
12184e98e3e1Schristos(dni remu "remu"
12194e98e3e1Schristos     ((IDOC ALU))
12204e98e3e1Schristos     "remu $dr,$sr"
12214e98e3e1Schristos     (+ OP1_9 OP2_3 dr sr (f-simm16 0))
12224e98e3e1Schristos     ; FIXME: Check rounding direction.
12234e98e3e1Schristos     (if (ne sr (const 0)) (set dr (umod dr sr)))
12244e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 37)))
12254e98e3e1Schristos      (m32rx (unit u-exec (cycles 37)))
12264e98e3e1Schristos      (m32r2 (unit u-exec (cycles 37))))
12274e98e3e1Schristos)
12284e98e3e1Schristos
12294e98e3e1Schristos(dni remh "remh"
12304e98e3e1Schristos     ((MACH m32r2))
12314e98e3e1Schristos     "remh $dr,$sr"
12324e98e3e1Schristos     (+ OP1_9 OP2_2 dr sr (f-simm16 #x10))
12334e98e3e1Schristos     ; FIXME: Check rounding direction.
12344e98e3e1Schristos     (if (ne sr (const 0)) (set dr (mod (ext WI (trunc HI dr)) sr)))
12354e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12364e98e3e1Schristos)
12374e98e3e1Schristos
12384e98e3e1Schristos(dni remuh "remuh"
12394e98e3e1Schristos     ((MACH m32r2))
12404e98e3e1Schristos     "remuh $dr,$sr"
12414e98e3e1Schristos     (+ OP1_9 OP2_3 dr sr (f-simm16 #x10))
12424e98e3e1Schristos     ; FIXME: Check rounding direction.
12434e98e3e1Schristos     (if (ne sr (const 0)) (set dr (umod dr sr)))
12444e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12454e98e3e1Schristos)
12464e98e3e1Schristos
12474e98e3e1Schristos(dni remb "remb"
12484e98e3e1Schristos     ((MACH m32r2))
12494e98e3e1Schristos     "remb $dr,$sr"
12504e98e3e1Schristos     (+ OP1_9 OP2_2 dr sr (f-simm16 #x18))
12514e98e3e1Schristos     ; FIXME: Check rounding direction.
12524e98e3e1Schristos     (if (ne sr (const 0)) (set dr (mod (ext WI (trunc BI dr)) sr)))
12534e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12544e98e3e1Schristos)
12554e98e3e1Schristos
12564e98e3e1Schristos(dni remub "remub"
12574e98e3e1Schristos     ((MACH m32r2))
12584e98e3e1Schristos     "remub $dr,$sr"
12594e98e3e1Schristos     (+ OP1_9 OP2_3 dr sr (f-simm16 #x18))
12604e98e3e1Schristos     ; FIXME: Check rounding direction.
12614e98e3e1Schristos     (if (ne sr (const 0)) (set dr (umod dr sr)))
12624e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12634e98e3e1Schristos)
12644e98e3e1Schristos
12654e98e3e1Schristos(dni divuh "divuh"
12664e98e3e1Schristos     ((MACH m32r2))
12674e98e3e1Schristos     "divuh $dr,$sr"
12684e98e3e1Schristos     (+ OP1_9 OP2_1 dr sr (f-simm16 #x10))
12694e98e3e1Schristos     (if (ne sr (const 0)) (set dr (udiv dr sr)))
12704e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12714e98e3e1Schristos)
12724e98e3e1Schristos
12734e98e3e1Schristos(dni divb "divb"
12744e98e3e1Schristos     ((MACH m32r2))
12754e98e3e1Schristos     "divb $dr,$sr"
12764e98e3e1Schristos     (+ OP1_9 OP2_0 dr sr (f-simm16 #x18))
12774e98e3e1Schristos     (if (ne sr (const 0)) (set dr (div (ext WI (trunc BI dr)) sr)))
12784e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12794e98e3e1Schristos)
12804e98e3e1Schristos
12814e98e3e1Schristos(dni divub "divub"
12824e98e3e1Schristos     ((MACH m32r2))
12834e98e3e1Schristos     "divub $dr,$sr"
12844e98e3e1Schristos     (+ OP1_9 OP2_1 dr sr (f-simm16 #x18))
12854e98e3e1Schristos     (if (ne sr (const 0)) (set dr (udiv dr sr)))
12864e98e3e1Schristos     ((m32r2 (unit u-exec (cycles 21))))
12874e98e3e1Schristos)
12884e98e3e1Schristos
12894e98e3e1Schristos(dni divh "divh"
12904e98e3e1Schristos     ((MACH m32rx,m32r2) (IDOC ALU))
12914e98e3e1Schristos     "divh $dr,$sr"
12924e98e3e1Schristos     (+ OP1_9 OP2_0 dr sr (f-simm16 #x10))
12934e98e3e1Schristos     (if (ne sr (const 0)) (set dr (div (ext WI (trunc HI dr)) sr)))
12944e98e3e1Schristos     ((m32rx (unit u-exec (cycles 21)))
12954e98e3e1Schristos      (m32r2 (unit u-exec (cycles 21))))
12964e98e3e1Schristos)
12974e98e3e1Schristos
12984e98e3e1Schristos(dni jc "jc"
12994e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) (PIPE O) SPECIAL (IDOC BR))
13004e98e3e1Schristos     "jc $sr"
13014e98e3e1Schristos     (+ OP1_1 (f-r1 12) OP2_12 sr)
13024e98e3e1Schristos     (if condbit (set pc (and sr (const -4))))
13034e98e3e1Schristos     ((m32rx (unit u-cti))
13044e98e3e1Schristos      (m32r2 (unit u-cti)))
13054e98e3e1Schristos)
13064e98e3e1Schristos
13074e98e3e1Schristos(dni jnc "jnc"
13084e98e3e1Schristos     (COND-CTI (MACH m32rx,m32r2) (PIPE O) SPECIAL (IDOC BR))
13094e98e3e1Schristos     "jnc $sr"
13104e98e3e1Schristos     (+ OP1_1 (f-r1 13) OP2_12 sr)
13114e98e3e1Schristos     (if (not condbit) (set pc (and sr (const -4))))
13124e98e3e1Schristos     ((m32rx (unit u-cti))
13134e98e3e1Schristos      (m32r2 (unit u-cti)))
13144e98e3e1Schristos)
13154e98e3e1Schristos
13164e98e3e1Schristos(dni jl "jl"
13174e98e3e1Schristos     (UNCOND-CTI FILL-SLOT (PIPE O) (IDOC BR))
13184e98e3e1Schristos     "jl $sr"
13194e98e3e1Schristos     (+ OP1_1 (f-r1 14) OP2_12 sr)
13204e98e3e1Schristos     (parallel ()
13214e98e3e1Schristos	       (set (reg h-gr 14)
13224e98e3e1Schristos		    (add (and pc (const -4)) (const 4)))
13234e98e3e1Schristos	       (set pc (and sr (const -4))))
13244e98e3e1Schristos     ((m32r/d (unit u-cti))
13254e98e3e1Schristos      (m32rx (unit u-cti))
13264e98e3e1Schristos      (m32r2 (unit u-cti)))
13274e98e3e1Schristos)
13284e98e3e1Schristos
13294e98e3e1Schristos(dni jmp "jmp"
13304e98e3e1Schristos     (UNCOND-CTI (PIPE O) (IDOC BR))
13314e98e3e1Schristos     "jmp $sr"
13324e98e3e1Schristos     (+ OP1_1 (f-r1 15) OP2_12 sr)
13334e98e3e1Schristos     (set pc (and sr (const -4)))
13344e98e3e1Schristos     ; The above works now so this kludge has been commented out.
13354e98e3e1Schristos     ; It's kept around because the f-r1 reference in the semantic part
13364e98e3e1Schristos     ; should work.
13374e98e3e1Schristos     ; FIXME: kludge, instruction decoding not finished.
13384e98e3e1Schristos     ; But this should work, so that's another FIXME.
13394e98e3e1Schristos     ;(sequence VOID (if VOID (eq SI f-r1 (const SI 14))
13404e98e3e1Schristos     ; FIXME: abuf->insn should be a macro of some sort.
13414e98e3e1Schristos     ;(sequence VOID
13424e98e3e1Schristos     ;	       (if VOID (eq SI (c-code SI "((abuf->insn >> 8) & 15)")
13434e98e3e1Schristos     ;			  (const SI 14))
13444e98e3e1Schristos     ;		   (set WI (reg WI h-gr 14)
13454e98e3e1Schristos     ;			(add WI (and WI pc (const WI -4)) (const WI 4))))
13464e98e3e1Schristos     ;	       (set WI pc sr))
13474e98e3e1Schristos     ((m32r/d (unit u-cti))
13484e98e3e1Schristos      (m32rx (unit u-cti))
13494e98e3e1Schristos      (m32r2 (unit u-cti)))
13504e98e3e1Schristos)
13514e98e3e1Schristos
13524e98e3e1Schristos(define-pmacro (no-ext-expr mode expr) expr)
13534e98e3e1Schristos(define-pmacro (ext-expr mode expr) (ext mode expr))
13544e98e3e1Schristos(define-pmacro (zext-expr mode expr) (zext mode expr))
13554e98e3e1Schristos
13564e98e3e1Schristos(define-pmacro (load-op suffix op2-op mode ext-op)
13574e98e3e1Schristos  (begin
13584e98e3e1Schristos    (dni (.sym ld suffix) (.str "ld" suffix)
13594e98e3e1Schristos	 ((PIPE O) (IDOC MEM))
13604e98e3e1Schristos	 (.str "ld" suffix " $dr,@$sr")
13614e98e3e1Schristos	 (+ OP1_2 op2-op dr sr)
13624e98e3e1Schristos	 (set dr (ext-op WI (mem mode sr)))
13634e98e3e1Schristos	 ((m32r/d (unit u-load))
13644e98e3e1Schristos	  (m32rx (unit u-load))
13654e98e3e1Schristos	  (m32r2 (unit u-load)))
13664e98e3e1Schristos	 )
13674e98e3e1Schristos    (dnmi (.sym ld suffix "-2") (.str "ld" suffix "-2")
13684e98e3e1Schristos	  (NO-DIS (PIPE O) (IDOC MEM))
13694e98e3e1Schristos	  (.str "ld" suffix " $dr,@($sr)")
13704e98e3e1Schristos	  (emit (.sym ld suffix) dr sr))
13714e98e3e1Schristos    (dni (.sym ld suffix -d) (.str "ld" suffix "-d")
13724e98e3e1Schristos	 ((IDOC MEM))
13734e98e3e1Schristos	 (.str "ld" suffix " $dr,@($slo16,$sr)")
13744e98e3e1Schristos	 (+ OP1_10 op2-op dr sr slo16)
13754e98e3e1Schristos	 (set dr (ext-op WI (mem mode (add sr slo16))))
13764e98e3e1Schristos	 ((m32r/d (unit u-load (cycles 2)))
13774e98e3e1Schristos	  (m32rx (unit u-load (cycles 2)))
13784e98e3e1Schristos	  (m32r2 (unit u-load (cycles 2))))
13794e98e3e1Schristos	 )
13804e98e3e1Schristos    (dnmi (.sym ld suffix -d2) (.str "ld" suffix "-d2")
13814e98e3e1Schristos	  (NO-DIS (IDOC MEM))
13824e98e3e1Schristos	  (.str "ld" suffix " $dr,@($sr,$slo16)")
13834e98e3e1Schristos	  (emit (.sym ld suffix -d) dr sr slo16))
13844e98e3e1Schristos    )
13854e98e3e1Schristos)
13864e98e3e1Schristos(load-op "" OP2_12 WI no-ext-expr)
13874e98e3e1Schristos(load-op b OP2_8 QI ext-expr)
13884e98e3e1Schristos(load-op h OP2_10 HI ext-expr)
13894e98e3e1Schristos(load-op ub OP2_9 QI zext-expr)
13904e98e3e1Schristos(load-op uh OP2_11 HI zext-expr)
13914e98e3e1Schristos
13924e98e3e1Schristos(dni ld-plus "ld+"
13934e98e3e1Schristos     ((PIPE O) (IDOC MEM))
13944e98e3e1Schristos     "ld $dr,@$sr+"
13954e98e3e1Schristos     (+ OP1_2 dr OP2_14 sr)
13964e98e3e1Schristos     (parallel ()
13974e98e3e1Schristos	       ; wip: memory addresses in profiling support
13984e98e3e1Schristos	       ;(set dr (name ld-mem (mem WI sr)))
13994e98e3e1Schristos	       (set dr (mem WI sr))
14004e98e3e1Schristos	       (set sr (add sr (const 4))))
14014e98e3e1Schristos     ; Note: `pred' is the constraint.  Also useful here is (ref name)
14024e98e3e1Schristos     ; and returns true if operand <name> was referenced
14034e98e3e1Schristos     ; (where "referenced" means _read_ if input operand and _written_ if
14044e98e3e1Schristos     ; output operand).
14054e98e3e1Schristos     ; args to unit are "unit-name (name1 value1) ..."
14064e98e3e1Schristos     ; - cycles(done),issue,pred are also specified this way
14074e98e3e1Schristos     ; - if unspecified, default is used
14084e98e3e1Schristos     ; - for ins/outs, extra arg is passed that says what was specified
14094e98e3e1Schristos     ;   - this is AND'd with `written' for outs
14104e98e3e1Schristos     ((m32r/d (unit u-load (pred (const 1)))
14114e98e3e1Schristos	      (unit u-exec (in sr #f) (in dr sr) (out dr sr) (cycles 0) (pred (const 1))))
14124e98e3e1Schristos      (m32rx (unit u-load)
14134e98e3e1Schristos	     (unit u-exec (in sr #f) (in dr sr) (out dr sr) (cycles 0) (pred (const 1))))
14144e98e3e1Schristos      (m32r2 (unit u-load)
14154e98e3e1Schristos	     (unit u-exec (in sr #f) (in dr sr) (out dr sr) (cycles 0) (pred (const 1))))
14164e98e3e1Schristos      )
14174e98e3e1Schristos)
14184e98e3e1Schristos
14194e98e3e1Schristos(dnmi pop "pop"
14204e98e3e1Schristos      ((PIPE O) (IDOC MEM))
14214e98e3e1Schristos      "pop $dr"
14224e98e3e1Schristos      (emit ld-plus dr (sr 15)) ; "ld %0,@sp+"
14234e98e3e1Schristos)
14244e98e3e1Schristos
14254e98e3e1Schristos(dni ld24 "ld24"
14264e98e3e1Schristos     ((IDOC MEM))
14274e98e3e1Schristos     "ld24 $dr,$uimm24"
14284e98e3e1Schristos     (+ OP1_14 dr uimm24)
14294e98e3e1Schristos     (set dr uimm24)
14304e98e3e1Schristos     ()
14314e98e3e1Schristos)
14324e98e3e1Schristos
14334e98e3e1Schristos; ldi8 appears before ldi16 so we try the shorter version first
14344e98e3e1Schristos
14354e98e3e1Schristos(dni ldi8 "ldi8"
14364e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
14374e98e3e1Schristos     "ldi8 $dr,$simm8"
14384e98e3e1Schristos     (+ OP1_6 dr simm8)
14394e98e3e1Schristos     (set dr simm8)
14404e98e3e1Schristos     ()
14414e98e3e1Schristos)
14424e98e3e1Schristos
14434e98e3e1Schristos(dnmi ldi8a "ldi8 alias"
14444e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
14454e98e3e1Schristos     "ldi $dr,$simm8"
14464e98e3e1Schristos     (emit ldi8 dr simm8)
14474e98e3e1Schristos)
14484e98e3e1Schristos
14494e98e3e1Schristos(dni ldi16 "ldi16"
14504e98e3e1Schristos     ((IDOC ALU))
14514e98e3e1Schristos     "ldi16 $dr,$hash$slo16"
14524e98e3e1Schristos     (+ OP1_9 OP2_15 (f-r2 0) dr slo16)
14534e98e3e1Schristos     (set dr slo16)
14544e98e3e1Schristos     ()
14554e98e3e1Schristos)
14564e98e3e1Schristos
14574e98e3e1Schristos(dnmi ldi16a "ldi16 alias"
14584e98e3e1Schristos     ((IDOC ALU))
14594e98e3e1Schristos     "ldi $dr,$hash$slo16"
14604e98e3e1Schristos     (emit ldi16 dr slo16)
14614e98e3e1Schristos)
14624e98e3e1Schristos
14634e98e3e1Schristos(dni lock "lock"
14644e98e3e1Schristos     ((PIPE O) (IDOC MISC))
14654e98e3e1Schristos     "lock $dr,@$sr"
14664e98e3e1Schristos     (+ OP1_2 OP2_13 dr sr)
14674e98e3e1Schristos     (sequence ()
14684e98e3e1Schristos	       (set (reg h-lock) (const BI 1))
14694e98e3e1Schristos	       (set dr (mem WI sr)))
14704e98e3e1Schristos     ((m32r/d (unit u-load))
14714e98e3e1Schristos      (m32rx (unit u-load))
14724e98e3e1Schristos      (m32r2 (unit u-load)))
14734e98e3e1Schristos)
14744e98e3e1Schristos
14754e98e3e1Schristos(dni machi "machi"
14764e98e3e1Schristos     (
14774e98e3e1Schristos      ; (MACH m32r) is a temporary hack.  This insn collides with machi-a
14784e98e3e1Schristos      ; in the simulator so disable it for m32rx.
14794e98e3e1Schristos      (MACH m32r) (PIPE S) (IDOC MAC)
14804e98e3e1Schristos     )
14814e98e3e1Schristos     "machi $src1,$src2"
14824e98e3e1Schristos     (+ OP1_3 OP2_4 src1 src2)
14834e98e3e1Schristos     ; FIXME: TRACE_RESULT will print the wrong thing since we
14844e98e3e1Schristos     ; alter one of the arguments.
14854e98e3e1Schristos     (set accum
14864e98e3e1Schristos	  (sra DI
14874e98e3e1Schristos	       (sll DI
14884e98e3e1Schristos		    (add DI
14894e98e3e1Schristos			 accum
14904e98e3e1Schristos			 (mul DI
14914e98e3e1Schristos			      (ext DI (and WI src1 (const #xffff0000)))
14924e98e3e1Schristos			      (ext DI (trunc HI (sra WI src2 (const 16))))))
14934e98e3e1Schristos		    (const 8))
14944e98e3e1Schristos	       (const 8)))
14954e98e3e1Schristos     ((m32r/d (unit u-mac)))
14964e98e3e1Schristos)
14974e98e3e1Schristos
14984e98e3e1Schristos(dni machi-a "machi-a"
14994e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
15004e98e3e1Schristos     "machi $src1,$src2,$acc"
15014e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 4) src2)
15024e98e3e1Schristos     (set acc
15034e98e3e1Schristos	  (sra DI
15044e98e3e1Schristos	       (sll DI
15054e98e3e1Schristos		    (add DI
15064e98e3e1Schristos			 acc
15074e98e3e1Schristos			 (mul DI
15084e98e3e1Schristos			      (ext DI (and WI src1 (const #xffff0000)))
15094e98e3e1Schristos			      (ext DI (trunc HI (sra WI src2 (const 16))))))
15104e98e3e1Schristos		    (const 8))
15114e98e3e1Schristos	       (const 8)))
15124e98e3e1Schristos     ((m32rx (unit u-mac))
15134e98e3e1Schristos      (m32r2 (unit u-mac)))
15144e98e3e1Schristos)
15154e98e3e1Schristos
15164e98e3e1Schristos(dni maclo "maclo"
15174e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC MAC))
15184e98e3e1Schristos     "maclo $src1,$src2"
15194e98e3e1Schristos     (+ OP1_3 OP2_5 src1 src2)
15204e98e3e1Schristos     (set accum
15214e98e3e1Schristos	  (sra DI
15224e98e3e1Schristos	       (sll DI
15234e98e3e1Schristos		    (add DI
15244e98e3e1Schristos			 accum
15254e98e3e1Schristos			 (mul DI
15264e98e3e1Schristos			      (ext DI (sll WI src1 (const 16)))
15274e98e3e1Schristos			      (ext DI (trunc HI src2))))
15284e98e3e1Schristos		    (const 8))
15294e98e3e1Schristos	       (const 8)))
15304e98e3e1Schristos     ((m32r/d (unit u-mac)))
15314e98e3e1Schristos)
15324e98e3e1Schristos
15334e98e3e1Schristos(dni maclo-a "maclo-a"
15344e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
15354e98e3e1Schristos     "maclo $src1,$src2,$acc"
15364e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 5) src2)
15374e98e3e1Schristos     (set acc
15384e98e3e1Schristos	  (sra DI
15394e98e3e1Schristos	       (sll DI
15404e98e3e1Schristos		    (add DI
15414e98e3e1Schristos			 acc
15424e98e3e1Schristos			 (mul DI
15434e98e3e1Schristos			      (ext DI (sll WI src1 (const 16)))
15444e98e3e1Schristos			      (ext DI (trunc HI src2))))
15454e98e3e1Schristos		    (const 8))
15464e98e3e1Schristos	       (const 8)))
15474e98e3e1Schristos     ((m32rx (unit u-mac))
15484e98e3e1Schristos      (m32r2 (unit u-mac)))
15494e98e3e1Schristos)
15504e98e3e1Schristos
15514e98e3e1Schristos(dni macwhi "macwhi"
15524e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC MAC))
15534e98e3e1Schristos     "macwhi $src1,$src2"
15544e98e3e1Schristos     (+ OP1_3 OP2_6 src1 src2)
15554e98e3e1Schristos     (set accum
15564e98e3e1Schristos	  (sra DI
15574e98e3e1Schristos	       (sll DI
15584e98e3e1Schristos		    (add DI
15594e98e3e1Schristos			 accum
15604e98e3e1Schristos			 (mul DI
15614e98e3e1Schristos			      (ext DI src1)
15624e98e3e1Schristos			      (ext DI (trunc HI (sra WI src2 (const 16))))))
15634e98e3e1Schristos		    (const 8))
15644e98e3e1Schristos	       (const 8)))
15654e98e3e1Schristos     ((m32r/d (unit u-mac)))
15664e98e3e1Schristos)
15674e98e3e1Schristos
15684e98e3e1Schristos(dni macwhi-a "macwhi-a"
15694e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) SPECIAL (IDOC MAC))
15704e98e3e1Schristos     "macwhi $src1,$src2,$acc"
15714e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 6) src2)
15724e98e3e1Schristos     ; Note that this doesn't do the sign extension, which is correct.
15734e98e3e1Schristos     (set acc
15744e98e3e1Schristos	  (add acc
15754e98e3e1Schristos	       (mul (ext DI src1)
15764e98e3e1Schristos		    (ext DI (trunc HI (sra src2 (const 16)))))))
15774e98e3e1Schristos     ((m32rx (unit u-mac))
15784e98e3e1Schristos      (m32r2 (unit u-mac)))
15794e98e3e1Schristos)
15804e98e3e1Schristos
15814e98e3e1Schristos(dni macwlo "macwlo"
15824e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC MAC))
15834e98e3e1Schristos     "macwlo $src1,$src2"
15844e98e3e1Schristos     (+ OP1_3 OP2_7 src1 src2)
15854e98e3e1Schristos     (set accum
15864e98e3e1Schristos	  (sra DI
15874e98e3e1Schristos	       (sll DI
15884e98e3e1Schristos		    (add DI
15894e98e3e1Schristos			 accum
15904e98e3e1Schristos			 (mul DI
15914e98e3e1Schristos			      (ext DI src1)
15924e98e3e1Schristos			      (ext DI (trunc HI src2))))
15934e98e3e1Schristos		    (const 8))
15944e98e3e1Schristos	       (const 8)))
15954e98e3e1Schristos     ((m32r/d (unit u-mac)))
15964e98e3e1Schristos)
15974e98e3e1Schristos
15984e98e3e1Schristos(dni macwlo-a "macwlo-a"
15994e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) SPECIAL (IDOC MAC))
16004e98e3e1Schristos     "macwlo $src1,$src2,$acc"
16014e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 7) src2)
16024e98e3e1Schristos     ; Note that this doesn't do the sign extension, which is correct.
16034e98e3e1Schristos     (set acc
16044e98e3e1Schristos	  (add acc
16054e98e3e1Schristos	       (mul (ext DI src1)
16064e98e3e1Schristos		    (ext DI (trunc HI src2)))))
16074e98e3e1Schristos     ((m32rx (unit u-mac))
16084e98e3e1Schristos      (m32r2 (unit u-mac)))
16094e98e3e1Schristos)
16104e98e3e1Schristos
16114e98e3e1Schristos(dni mul "mul"
16124e98e3e1Schristos     ((PIPE S) (IDOC ALU))
16134e98e3e1Schristos     "mul $dr,$sr"
16144e98e3e1Schristos     (+ OP1_1 OP2_6 dr sr)
16154e98e3e1Schristos     (set dr (mul dr sr))
16164e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 4)))
16174e98e3e1Schristos      (m32rx (unit u-exec (cycles 4)))
16184e98e3e1Schristos      (m32r2 (unit u-exec (cycles 4))))
16194e98e3e1Schristos)
16204e98e3e1Schristos
16214e98e3e1Schristos(dni mulhi "mulhi"
16224e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
16234e98e3e1Schristos     "mulhi $src1,$src2"
16244e98e3e1Schristos     (+ OP1_3 OP2_0 src1 src2)
16254e98e3e1Schristos     (set accum
16264e98e3e1Schristos	  (sra DI
16274e98e3e1Schristos	       (sll DI
16284e98e3e1Schristos		    (mul DI
16294e98e3e1Schristos			 (ext DI (and WI src1 (const #xffff0000)))
16304e98e3e1Schristos			 (ext DI (trunc HI (sra WI src2 (const 16)))))
16314e98e3e1Schristos		    (const 16))
16324e98e3e1Schristos	       (const 16)))
16334e98e3e1Schristos     ((m32r/d (unit u-mac)))
16344e98e3e1Schristos)
16354e98e3e1Schristos
16364e98e3e1Schristos(dni mulhi-a "mulhi-a"
16374e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
16384e98e3e1Schristos     "mulhi $src1,$src2,$acc"
16394e98e3e1Schristos     (+ OP1_3 (f-op23 0) src1 acc src2)
16404e98e3e1Schristos     (set acc
16414e98e3e1Schristos	  (sra DI
16424e98e3e1Schristos	       (sll DI
16434e98e3e1Schristos		    (mul DI
16444e98e3e1Schristos			 (ext DI (and WI src1 (const #xffff0000)))
16454e98e3e1Schristos			 (ext DI (trunc HI (sra WI src2 (const 16)))))
16464e98e3e1Schristos		    (const 16))
16474e98e3e1Schristos	       (const 16)))
16484e98e3e1Schristos     ((m32rx (unit u-mac))
16494e98e3e1Schristos      (m32r2 (unit u-mac)))
16504e98e3e1Schristos)
16514e98e3e1Schristos
16524e98e3e1Schristos(dni mullo "mullo"
16534e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
16544e98e3e1Schristos     "mullo $src1,$src2"
16554e98e3e1Schristos     (+ OP1_3 OP2_1 src1 src2)
16564e98e3e1Schristos     (set accum
16574e98e3e1Schristos	  (sra DI
16584e98e3e1Schristos	       (sll DI
16594e98e3e1Schristos		    (mul DI
16604e98e3e1Schristos			 (ext DI (sll WI src1 (const 16)))
16614e98e3e1Schristos			 (ext DI (trunc HI src2)))
16624e98e3e1Schristos		    (const 16))
16634e98e3e1Schristos	       (const 16)))
16644e98e3e1Schristos     ((m32r/d (unit u-mac)))
16654e98e3e1Schristos)
16664e98e3e1Schristos
16674e98e3e1Schristos(dni mullo-a "mullo-a"
16684e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
16694e98e3e1Schristos     "mullo $src1,$src2,$acc"
16704e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 1) src2)
16714e98e3e1Schristos     (set acc
16724e98e3e1Schristos	  (sra DI
16734e98e3e1Schristos	       (sll DI
16744e98e3e1Schristos		    (mul DI
16754e98e3e1Schristos			 (ext DI (sll WI src1 (const 16)))
16764e98e3e1Schristos			 (ext DI (trunc HI src2)))
16774e98e3e1Schristos		    (const 16))
16784e98e3e1Schristos	       (const 16)))
16794e98e3e1Schristos     ((m32rx (unit u-mac))
16804e98e3e1Schristos      (m32r2 (unit u-mac)))
16814e98e3e1Schristos)
16824e98e3e1Schristos
16834e98e3e1Schristos(dni mulwhi "mulwhi"
16844e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
16854e98e3e1Schristos     "mulwhi $src1,$src2"
16864e98e3e1Schristos     (+ OP1_3 OP2_2 src1 src2)
16874e98e3e1Schristos     (set accum
16884e98e3e1Schristos	  (sra DI
16894e98e3e1Schristos	       (sll DI
16904e98e3e1Schristos		    (mul DI
16914e98e3e1Schristos			 (ext DI src1)
16924e98e3e1Schristos			 (ext DI (trunc HI (sra WI src2 (const 16)))))
16934e98e3e1Schristos		    (const 8))
16944e98e3e1Schristos	       (const 8)))
16954e98e3e1Schristos     ((m32r/d (unit u-mac)))
16964e98e3e1Schristos)
16974e98e3e1Schristos
16984e98e3e1Schristos(dni mulwhi-a "mulwhi-a"
16994e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) SPECIAL (IDOC ACCUM))
17004e98e3e1Schristos     "mulwhi $src1,$src2,$acc"
17014e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 2) src2)
17024e98e3e1Schristos     ; Note that this doesn't do the sign extension, which is correct.
17034e98e3e1Schristos     (set acc
17044e98e3e1Schristos	  (mul (ext DI src1)
17054e98e3e1Schristos	       (ext DI (trunc HI (sra src2 (const 16))))))
17064e98e3e1Schristos     ((m32rx (unit u-mac))
17074e98e3e1Schristos      (m32r2 (unit u-mac)))
17084e98e3e1Schristos)
17094e98e3e1Schristos
17104e98e3e1Schristos(dni mulwlo "mulwlo"
17114e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
17124e98e3e1Schristos     "mulwlo $src1,$src2"
17134e98e3e1Schristos     (+ OP1_3 OP2_3 src1 src2)
17144e98e3e1Schristos     (set accum
17154e98e3e1Schristos	  (sra DI
17164e98e3e1Schristos	       (sll DI
17174e98e3e1Schristos		    (mul DI
17184e98e3e1Schristos			 (ext DI src1)
17194e98e3e1Schristos			 (ext DI (trunc HI src2)))
17204e98e3e1Schristos		    (const 8))
17214e98e3e1Schristos	       (const 8)))
17224e98e3e1Schristos     ((m32r/d (unit u-mac)))
17234e98e3e1Schristos)
17244e98e3e1Schristos
17254e98e3e1Schristos(dni mulwlo-a "mulwlo-a"
17264e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) SPECIAL (IDOC ACCUM))
17274e98e3e1Schristos     "mulwlo $src1,$src2,$acc"
17284e98e3e1Schristos     (+ OP1_3 src1 acc (f-op23 3) src2)
17294e98e3e1Schristos     ; Note that this doesn't do the sign extension, which is correct.
17304e98e3e1Schristos     (set acc
17314e98e3e1Schristos	  (mul (ext DI src1)
17324e98e3e1Schristos	       (ext DI (trunc HI src2))))
17334e98e3e1Schristos     ((m32rx (unit u-mac))
17344e98e3e1Schristos      (m32r2 (unit u-mac)))
17354e98e3e1Schristos)
17364e98e3e1Schristos
17374e98e3e1Schristos(dni mv "mv"
17384e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
17394e98e3e1Schristos     "mv $dr,$sr"
17404e98e3e1Schristos     (+ OP1_1 OP2_8 dr sr)
17414e98e3e1Schristos     (set dr sr)
17424e98e3e1Schristos     ()
17434e98e3e1Schristos)
17444e98e3e1Schristos
17454e98e3e1Schristos(dni mvfachi "mvfachi"
17464e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
17474e98e3e1Schristos     "mvfachi $dr"
17484e98e3e1Schristos     (+ OP1_5 OP2_15 (f-r2 0) dr)
17494e98e3e1Schristos     (set dr (trunc WI (sra DI accum (const 32))))
17504e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 2))))
17514e98e3e1Schristos)
17524e98e3e1Schristos
17534e98e3e1Schristos(dni mvfachi-a "mvfachi-a"
17544e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
17554e98e3e1Schristos     "mvfachi $dr,$accs"
17564e98e3e1Schristos     (+ OP1_5 dr OP2_15 accs (f-op3 0))
17574e98e3e1Schristos     (set dr (trunc WI (sra DI accs (const 32))))
17584e98e3e1Schristos     ((m32rx (unit u-exec (cycles 2)))
17594e98e3e1Schristos      (m32r2 (unit u-exec (cycles 2))))
17604e98e3e1Schristos)
17614e98e3e1Schristos
17624e98e3e1Schristos(dni mvfaclo "mvfaclo"
17634e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
17644e98e3e1Schristos     "mvfaclo $dr"
17654e98e3e1Schristos     (+ OP1_5 OP2_15 (f-r2 1) dr)
17664e98e3e1Schristos     (set dr (trunc WI accum))
17674e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 2))))
17684e98e3e1Schristos)
17694e98e3e1Schristos
17704e98e3e1Schristos(dni mvfaclo-a "mvfaclo-a"
17714e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
17724e98e3e1Schristos     "mvfaclo $dr,$accs"
17734e98e3e1Schristos     (+ OP1_5 dr OP2_15 accs (f-op3 1))
17744e98e3e1Schristos     (set dr (trunc WI accs))
17754e98e3e1Schristos     ((m32rx (unit u-exec (cycles 2)))
17764e98e3e1Schristos      (m32r2 (unit u-exec (cycles 2))))
17774e98e3e1Schristos)
17784e98e3e1Schristos
17794e98e3e1Schristos(dni mvfacmi "mvfacmi"
17804e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
17814e98e3e1Schristos     "mvfacmi $dr"
17824e98e3e1Schristos     (+ OP1_5 OP2_15 (f-r2 2) dr)
17834e98e3e1Schristos     (set dr (trunc WI (sra DI accum (const 16))))
17844e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 2))))
17854e98e3e1Schristos)
17864e98e3e1Schristos
17874e98e3e1Schristos(dni mvfacmi-a "mvfacmi-a"
17884e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
17894e98e3e1Schristos     "mvfacmi $dr,$accs"
17904e98e3e1Schristos     (+ OP1_5 dr OP2_15 accs (f-op3 2))
17914e98e3e1Schristos     (set dr (trunc WI (sra DI accs (const 16))))
17924e98e3e1Schristos     ((m32rx (unit u-exec (cycles 2)))
17934e98e3e1Schristos      (m32r2 (unit u-exec (cycles 2))))
17944e98e3e1Schristos)
17954e98e3e1Schristos
17964e98e3e1Schristos(dni mvfc "mvfc"
17974e98e3e1Schristos     ((PIPE O) (IDOC MISC))
17984e98e3e1Schristos     "mvfc $dr,$scr"
17994e98e3e1Schristos     (+ OP1_1 OP2_9 dr scr)
18004e98e3e1Schristos     (set dr scr)
18014e98e3e1Schristos     ()
18024e98e3e1Schristos)
18034e98e3e1Schristos
18044e98e3e1Schristos(dni mvtachi "mvtachi"
18054e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
18064e98e3e1Schristos     "mvtachi $src1"
18074e98e3e1Schristos     (+ OP1_5 OP2_7 (f-r2 0) src1)
18084e98e3e1Schristos     (set accum
18094e98e3e1Schristos	  (or DI
18104e98e3e1Schristos	      (and DI accum (const DI #xffffffff))
18114e98e3e1Schristos	      (sll DI (ext DI src1) (const 32))))
18124e98e3e1Schristos     ((m32r/d (unit u-exec (in sr src1))))
18134e98e3e1Schristos)
18144e98e3e1Schristos
18154e98e3e1Schristos(dni mvtachi-a "mvtachi-a"
18164e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
18174e98e3e1Schristos     "mvtachi $src1,$accs"
18184e98e3e1Schristos     (+ OP1_5 src1 OP2_7 accs (f-op3 0))
18194e98e3e1Schristos     (set accs
18204e98e3e1Schristos	  (or DI
18214e98e3e1Schristos	      (and DI accs (const DI #xffffffff))
18224e98e3e1Schristos	      (sll DI (ext DI src1) (const 32))))
18234e98e3e1Schristos     ((m32rx (unit u-exec (in sr src1)))
18244e98e3e1Schristos      (m32r2 (unit u-exec (in sr src1))))
18254e98e3e1Schristos)
18264e98e3e1Schristos
18274e98e3e1Schristos(dni mvtaclo "mvtaclo"
18284e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC ACCUM))
18294e98e3e1Schristos     "mvtaclo $src1"
18304e98e3e1Schristos     (+ OP1_5 OP2_7 (f-r2 1) src1)
18314e98e3e1Schristos     (set accum
18324e98e3e1Schristos	  (or DI
18334e98e3e1Schristos	      (and DI accum (const DI #xffffffff00000000))
18344e98e3e1Schristos	      (zext DI src1)))
18354e98e3e1Schristos     ((m32r/d (unit u-exec (in sr src1))))
18364e98e3e1Schristos)
18374e98e3e1Schristos
18384e98e3e1Schristos(dni mvtaclo-a "mvtaclo-a"
18394e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
18404e98e3e1Schristos     "mvtaclo $src1,$accs"
18414e98e3e1Schristos     (+ OP1_5 src1 OP2_7 accs (f-op3 1))
18424e98e3e1Schristos     (set accs
18434e98e3e1Schristos	  (or DI
18444e98e3e1Schristos	      (and DI accs (const DI #xffffffff00000000))
18454e98e3e1Schristos	      (zext DI src1)))
18464e98e3e1Schristos     ((m32rx (unit u-exec (in sr src1)))
18474e98e3e1Schristos      (m32r2 (unit u-exec (in sr src1))))
18484e98e3e1Schristos)
18494e98e3e1Schristos
18504e98e3e1Schristos(dni mvtc "mvtc"
18514e98e3e1Schristos     ((PIPE O) (IDOC MISC))
18524e98e3e1Schristos     "mvtc $sr,$dcr"
18534e98e3e1Schristos     (+ OP1_1 OP2_10 dcr sr)
18544e98e3e1Schristos     (set dcr sr)
18554e98e3e1Schristos     ()
18564e98e3e1Schristos)
18574e98e3e1Schristos
18584e98e3e1Schristos(dni neg "neg"
18594e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
18604e98e3e1Schristos     "neg $dr,$sr"
18614e98e3e1Schristos     (+ OP1_0 OP2_3 dr sr)
18624e98e3e1Schristos     (set dr (neg sr))
18634e98e3e1Schristos     ()
18644e98e3e1Schristos)
18654e98e3e1Schristos
18664e98e3e1Schristos(dni nop "nop"
18674e98e3e1Schristos     ((PIPE OS) (IDOC MISC))
18684e98e3e1Schristos     "nop"
18694e98e3e1Schristos     (+ OP1_7 OP2_0 (f-r1 0) (f-r2 0))
18704e98e3e1Schristos     (c-code VOID "PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);\n")
18714e98e3e1Schristos     ; FIXME: quick hack: parallel nops don't contribute to cycle count.
18724e98e3e1Schristos     ; Other kinds of nops do however (which we currently ignore).
18734e98e3e1Schristos     ((m32r/d (unit u-exec (cycles 0)))
18744e98e3e1Schristos      (m32rx (unit u-exec (cycles 0)))
18754e98e3e1Schristos      (m32r2 (unit u-exec (cycles 0))))
18764e98e3e1Schristos)
18774e98e3e1Schristos
18784e98e3e1Schristos(dni not "not"
18794e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
18804e98e3e1Schristos     "not $dr,$sr"
18814e98e3e1Schristos     (+ OP1_0 OP2_11 dr sr)
18824e98e3e1Schristos     (set dr (inv sr))
18834e98e3e1Schristos     ()
18844e98e3e1Schristos)
18854e98e3e1Schristos
18864e98e3e1Schristos(dni rac "rac"
18874e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC MAC))
18884e98e3e1Schristos     "rac"
18894e98e3e1Schristos     (+ OP1_5 OP2_9 (f-r1 0) (f-r2 0))
18904e98e3e1Schristos     (sequence ((DI tmp1))
18914e98e3e1Schristos	       (set tmp1 (sll DI accum (const 1)))
18924e98e3e1Schristos	       (set tmp1 (add DI tmp1 (const DI #x8000)))
18934e98e3e1Schristos	       (set accum
18944e98e3e1Schristos		    (cond DI
18954e98e3e1Schristos			  ((gt tmp1 (const DI #x00007fffffff0000))
18964e98e3e1Schristos			   (const DI #x00007fffffff0000))
18974e98e3e1Schristos			  ((lt tmp1 (const DI #xffff800000000000))
18984e98e3e1Schristos			   (const DI #xffff800000000000))
18994e98e3e1Schristos			  (else (and tmp1 (const DI #xffffffffffff0000)))))
19004e98e3e1Schristos	       )
19014e98e3e1Schristos     ((m32r/d (unit u-mac)))
19024e98e3e1Schristos)
19034e98e3e1Schristos
19044e98e3e1Schristos(dni rac-dsi "rac-dsi"
19054e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19064e98e3e1Schristos     "rac $accd,$accs,$imm1"
19074e98e3e1Schristos     (+ OP1_5 accd (f-bits67 0) OP2_9 accs (f-bit14 0) imm1)
19084e98e3e1Schristos     (sequence ((DI tmp1))
19094e98e3e1Schristos	       (set tmp1 (sll accs imm1))
19104e98e3e1Schristos	       (set tmp1 (add tmp1 (const DI #x8000)))
19114e98e3e1Schristos	       (set accd
19124e98e3e1Schristos		    (cond DI
19134e98e3e1Schristos			  ((gt tmp1 (const DI #x00007fffffff0000))
19144e98e3e1Schristos			   (const DI #x00007fffffff0000))
19154e98e3e1Schristos			  ((lt tmp1 (const DI #xffff800000000000))
19164e98e3e1Schristos			   (const DI #xffff800000000000))
19174e98e3e1Schristos			  (else (and tmp1 (const DI #xffffffffffff0000)))))
19184e98e3e1Schristos	       )
19194e98e3e1Schristos     ((m32rx (unit u-mac))
19204e98e3e1Schristos      (m32r2 (unit u-mac)))
19214e98e3e1Schristos)
19224e98e3e1Schristos
19234e98e3e1Schristos(dnmi rac-d "rac-d"
19244e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19254e98e3e1Schristos     "rac $accd"
19264e98e3e1Schristos     (emit rac-dsi accd (f-accs 0) (f-imm1 0))
19274e98e3e1Schristos)
19284e98e3e1Schristos
19294e98e3e1Schristos(dnmi rac-ds "rac-ds"
19304e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19314e98e3e1Schristos     "rac $accd,$accs"
19324e98e3e1Schristos     (emit rac-dsi accd accs (f-imm1 0))
19334e98e3e1Schristos)
19344e98e3e1Schristos
19354e98e3e1Schristos
19364e98e3e1Schristos(dni rach "rach"
19374e98e3e1Schristos     ((MACH m32r) (PIPE S) (IDOC MAC))
19384e98e3e1Schristos     "rach"
19394e98e3e1Schristos     (+ OP1_5 OP2_8 (f-r1 0) (f-r2 0))
19404e98e3e1Schristos     (sequence ((DI tmp1))
19414e98e3e1Schristos	       ; Lop off top 8 bits.
19424e98e3e1Schristos	       ; The sign bit we want to use is bit 55 so the 64 bit value
19434e98e3e1Schristos	       ; isn't properly signed which we deal with in the if's below.
19444e98e3e1Schristos	       (set tmp1 (and accum (const DI #xffffffffffffff)))
19454e98e3e1Schristos	       (if (andif (ge tmp1 (const DI #x003fff80000000))
19464e98e3e1Schristos			  (le tmp1 (const DI #x7fffffffffffff)))
19474e98e3e1Schristos		   (set tmp1 (const DI #x003fff80000000))
19484e98e3e1Schristos		   ; else part
19494e98e3e1Schristos		   (if (andif (ge tmp1 (const DI #x80000000000000))
19504e98e3e1Schristos			      (le tmp1 (const DI #xffc00000000000)))
19514e98e3e1Schristos		       (set tmp1 (const DI #xffc00000000000))
19524e98e3e1Schristos		       (set tmp1 (and (add accum (const DI #x40000000))
19534e98e3e1Schristos				      (const DI #xffffffff80000000)))))
19544e98e3e1Schristos	       (set tmp1 (sll tmp1 (const 1)))
19554e98e3e1Schristos	       ; Sign extend top 8 bits.
19564e98e3e1Schristos	       (set accum
19574e98e3e1Schristos		    ; FIXME: 7?
19584e98e3e1Schristos		    (sra DI (sll DI tmp1 (const 7)) (const 7)))
19594e98e3e1Schristos	       )
19604e98e3e1Schristos     ((m32r/d (unit u-mac)))
19614e98e3e1Schristos)
19624e98e3e1Schristos
19634e98e3e1Schristos(dni rach-dsi "rach-dsi"
19644e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19654e98e3e1Schristos     "rach $accd,$accs,$imm1"
19664e98e3e1Schristos     (+ OP1_5 accd (f-bits67 0) OP2_8 accs (f-bit14 0) imm1)
19674e98e3e1Schristos     (sequence ((DI tmp1))
19684e98e3e1Schristos	       (set tmp1 (sll accs imm1))
19694e98e3e1Schristos	       (set tmp1 (add tmp1 (const DI #x80000000)))
19704e98e3e1Schristos	       (set accd
19714e98e3e1Schristos		    (cond DI
19724e98e3e1Schristos			  ((gt tmp1 (const DI #x00007fff00000000))
19734e98e3e1Schristos			   (const DI #x00007fff00000000))
19744e98e3e1Schristos			  ((lt tmp1 (const DI #xffff800000000000))
19754e98e3e1Schristos			   (const DI #xffff800000000000))
19764e98e3e1Schristos			  (else (and tmp1 (const DI #xffffffff00000000)))))
19774e98e3e1Schristos	       )
19784e98e3e1Schristos     ((m32rx (unit u-mac))
19794e98e3e1Schristos      (m32r2 (unit u-mac)))
19804e98e3e1Schristos)
19814e98e3e1Schristos
19824e98e3e1Schristos(dnmi rach-d "rach-d"
19834e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19844e98e3e1Schristos     "rach $accd"
19854e98e3e1Schristos     (emit rach-dsi accd (f-accs 0) (f-imm1 0))
19864e98e3e1Schristos)
19874e98e3e1Schristos
19884e98e3e1Schristos(dnmi rach-ds "rach-ds"
19894e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
19904e98e3e1Schristos     "rach $accd,$accs"
19914e98e3e1Schristos     (emit rach-dsi accd accs (f-imm1 0))
19924e98e3e1Schristos)
19934e98e3e1Schristos
19944e98e3e1Schristos(dni rte "rte"
19954e98e3e1Schristos     (UNCOND-CTI (PIPE O) (IDOC BR))
19964e98e3e1Schristos     "rte"
19974e98e3e1Schristos     (+ OP1_1 OP2_13 (f-r1 0) (f-r2 6))
19984e98e3e1Schristos     (sequence ()
19994e98e3e1Schristos	       ; pc = bpc & -4
20004e98e3e1Schristos	       (set pc (and (reg h-cr 6) (const -4)))
20014e98e3e1Schristos	       ; bpc = bbpc
20024e98e3e1Schristos	       (set (reg h-cr 6) (reg h-cr 14))
20034e98e3e1Schristos	       ; psw = bpsw
20044e98e3e1Schristos	       (set (reg h-psw) (reg h-bpsw))
20054e98e3e1Schristos	       ; bpsw = bbpsw
20064e98e3e1Schristos	       (set (reg h-bpsw) (reg h-bbpsw))
20074e98e3e1Schristos     )
20084e98e3e1Schristos     ()
20094e98e3e1Schristos)
20104e98e3e1Schristos
20114e98e3e1Schristos(dni seth "seth"
20124e98e3e1Schristos     ((IDOC ALU))
20134e98e3e1Schristos     "seth $dr,$hash$hi16"
20144e98e3e1Schristos     (+ OP1_13 OP2_12 dr (f-r2 0) hi16)
20154e98e3e1Schristos     (set dr (sll WI hi16 (const 16)))
20164e98e3e1Schristos     ()
20174e98e3e1Schristos)
20184e98e3e1Schristos
20194e98e3e1Schristos(define-pmacro (shift-op sym op2-r-op op2-3-op op2-i-op sem-op)
20204e98e3e1Schristos  (begin
20214e98e3e1Schristos     (dni sym sym ((PIPE O_OS) (IDOC ALU))
20224e98e3e1Schristos	  (.str sym " $dr,$sr")
20234e98e3e1Schristos	  (+ OP1_1 op2-r-op dr sr)
20244e98e3e1Schristos	  (set dr (sem-op dr (and sr (const 31))))
20254e98e3e1Schristos	  ()
20264e98e3e1Schristos     )
20274e98e3e1Schristos     (dni (.sym sym "3") sym ((IDOC ALU))
20284e98e3e1Schristos	  (.str sym "3 $dr,$sr,$simm16")
20294e98e3e1Schristos	  (+ OP1_9 op2-3-op dr sr simm16)
20304e98e3e1Schristos	  (set dr (sem-op sr (and WI simm16 (const 31))))
20314e98e3e1Schristos	  ()
20324e98e3e1Schristos     )
20334e98e3e1Schristos     (dni (.sym sym "i") sym ((PIPE O_OS) (IDOC ALU))
20344e98e3e1Schristos	  (.str sym "i $dr,$uimm5")
20354e98e3e1Schristos	  (+ OP1_5 (f-shift-op2 op2-i-op) dr uimm5)
20364e98e3e1Schristos	  (set dr (sem-op dr uimm5))
20374e98e3e1Schristos	  ()
20384e98e3e1Schristos     )
20394e98e3e1Schristos   )
20404e98e3e1Schristos)
20414e98e3e1Schristos(shift-op sll OP2_4 OP2_12 2 sll)
20424e98e3e1Schristos(shift-op sra OP2_2 OP2_10 1 sra)
20434e98e3e1Schristos(shift-op srl OP2_0 OP2_8 0 srl)
20444e98e3e1Schristos
20454e98e3e1Schristos(define-pmacro (store-op suffix op2-op mode)
20464e98e3e1Schristos  (begin
20474e98e3e1Schristos    (dni (.sym st suffix) (.str "st" suffix)
20484e98e3e1Schristos	 ((PIPE O) (IDOC MEM))
20494e98e3e1Schristos	 (.str "st" suffix " $src1,@$src2")
20504e98e3e1Schristos	 (+ OP1_2 op2-op src1 src2)
20514e98e3e1Schristos	 (set mode (mem mode src2) src1)
20524e98e3e1Schristos	 ((m32r/d (unit u-store (cycles 1)))
20534e98e3e1Schristos	  (m32rx (unit u-store (cycles 1)))
20544e98e3e1Schristos	  (m32r2 (unit u-store (cycles 1))))
20554e98e3e1Schristos	 )
20564e98e3e1Schristos    (dnmi (.sym st suffix "-2") (.str "st" suffix "-2")
20574e98e3e1Schristos	  (NO-DIS (PIPE O) (IDOC MEM))
20584e98e3e1Schristos	  (.str "st" suffix " $src1,@($src2)")
20594e98e3e1Schristos	  (emit (.sym st suffix) src1 src2))
20604e98e3e1Schristos    (dni (.sym st suffix -d) (.str "st" suffix "-d")
20614e98e3e1Schristos	 ((IDOC MEM))
20624e98e3e1Schristos	 (.str "st" suffix " $src1,@($slo16,$src2)")
20634e98e3e1Schristos	 (+ OP1_10 op2-op src1 src2 slo16)
20644e98e3e1Schristos	 (set mode (mem mode (add src2 slo16)) src1)
20654e98e3e1Schristos	 ((m32r/d (unit u-store (cycles 2)))
20664e98e3e1Schristos	  (m32rx (unit u-store (cycles 2)))
20674e98e3e1Schristos	  (m32r2 (unit u-store (cycles 2))))
20684e98e3e1Schristos	 )
20694e98e3e1Schristos    (dnmi (.sym st suffix -d2) (.str "st" suffix "-d2")
20704e98e3e1Schristos	  (NO-DIS (IDOC MEM))
20714e98e3e1Schristos	  (.str "st" suffix " $src1,@($src2,$slo16)")
20724e98e3e1Schristos	  (emit (.sym st suffix -d) src1 src2 slo16))
20734e98e3e1Schristos    )
20744e98e3e1Schristos)
20754e98e3e1Schristos(store-op "" OP2_4 WI)
20764e98e3e1Schristos(store-op b OP2_0 QI)
20774e98e3e1Schristos(store-op h OP2_2 HI)
20784e98e3e1Schristos
20794e98e3e1Schristos(dni st-plus "st+"
20804e98e3e1Schristos     ((PIPE O) (IDOC MEM))
20814e98e3e1Schristos     "st $src1,@+$src2"
20824e98e3e1Schristos     (+ OP1_2 OP2_6 src1 src2)
20834e98e3e1Schristos     ; This has to be coded carefully to avoid an "earlyclobber" of src2.
20844e98e3e1Schristos     (sequence ((WI new-src2))
20854e98e3e1Schristos	       (set new-src2 (add WI src2 (const WI 4)))
20864e98e3e1Schristos	       (set (mem WI new-src2) src1)
20874e98e3e1Schristos	       (set src2 new-src2))
20884e98e3e1Schristos     ((m32r/d (unit u-store)
20894e98e3e1Schristos	      (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
20904e98e3e1Schristos      (m32rx (unit u-store)
20914e98e3e1Schristos	     (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
20924e98e3e1Schristos      (m32r2 (unit u-store)
20934e98e3e1Schristos	     (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
20944e98e3e1Schristos      )
20954e98e3e1Schristos)
20964e98e3e1Schristos
20974e98e3e1Schristos(dni sth-plus "sth+"
20984e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE O) SPECIAL)
20994e98e3e1Schristos     "sth $src1,@$src2+"
21004e98e3e1Schristos     (+ OP1_2 OP2_3 src1 src2)
21014e98e3e1Schristos     ; This has to be coded carefully to avoid an "earlyclobber" of src2.
21024e98e3e1Schristos     (sequence ((WI new-src2))
21034e98e3e1Schristos	       (set new-src2 src2)
21044e98e3e1Schristos	       (set (mem HI new-src2) src1)
21054e98e3e1Schristos	       (set src2 (add new-src2 (const 2))))
21064e98e3e1Schristos     ((m32rx (unit u-store)
21074e98e3e1Schristos           (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21084e98e3e1Schristos      (m32r2 (unit u-store)
21094e98e3e1Schristos           (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21104e98e3e1Schristos      )
21114e98e3e1Schristos)
21124e98e3e1Schristos
21134e98e3e1Schristos(dni stb-plus "stb+"
21144e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE O) SPECIAL)
21154e98e3e1Schristos     "stb $src1,@$src2+"
21164e98e3e1Schristos     (+ OP1_2 OP2_1 src1 src2)
21174e98e3e1Schristos     ; This has to be coded carefully to avoid an "earlyclobber" of src2.
21184e98e3e1Schristos     (sequence ((WI new-src2))
21194e98e3e1Schristos	       (set new-src2 src2)
21204e98e3e1Schristos	       (set (mem QI new-src2) src1)
21214e98e3e1Schristos	       (set src2 (add new-src2 (const 1))))
21224e98e3e1Schristos     ((m32rx (unit u-store)
21234e98e3e1Schristos           (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21244e98e3e1Schristos      (m32r2 (unit u-store)
21254e98e3e1Schristos           (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21264e98e3e1Schristos      )
21274e98e3e1Schristos)
21284e98e3e1Schristos
21294e98e3e1Schristos(dni st-minus "st-"
21304e98e3e1Schristos     ((PIPE O) (IDOC MEM))
21314e98e3e1Schristos     "st $src1,@-$src2"
21324e98e3e1Schristos     (+ OP1_2 OP2_7 src1 src2)
21334e98e3e1Schristos     ; This is the original way.  It doesn't work for parallel execution
21344e98e3e1Schristos     ; because of the earlyclobber of src2.
21354e98e3e1Schristos     ;(sequence ()
21364e98e3e1Schristos     ;	       (set src2 (sub src2 (const 4)))
21374e98e3e1Schristos     ;	       (set (mem WI src2) src1))
21384e98e3e1Schristos     (sequence ((WI new-src2))
21394e98e3e1Schristos	       (set new-src2 (sub src2 (const 4)))
21404e98e3e1Schristos	       (set (mem WI new-src2) src1)
21414e98e3e1Schristos	       (set src2 new-src2))
21424e98e3e1Schristos     ((m32r/d (unit u-store)
21434e98e3e1Schristos	      (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21444e98e3e1Schristos      (m32rx (unit u-store)
21454e98e3e1Schristos	     (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21464e98e3e1Schristos      (m32r2 (unit u-store)
21474e98e3e1Schristos	     (unit u-exec (in dr src2) (out dr src2) (cycles 0)))
21484e98e3e1Schristos      )
21494e98e3e1Schristos)
21504e98e3e1Schristos
21514e98e3e1Schristos(dnmi push "push" ((PIPE O) (IDOC MEM))
21524e98e3e1Schristos  "push $src1"
21534e98e3e1Schristos  (emit st-minus src1 (src2 15)) ; "st %0,@-sp"
21544e98e3e1Schristos)
21554e98e3e1Schristos
21564e98e3e1Schristos(dni sub "sub"
21574e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
21584e98e3e1Schristos     "sub $dr,$sr"
21594e98e3e1Schristos     (+ OP1_0 OP2_2 dr sr)
21604e98e3e1Schristos     (set dr (sub dr sr))
21614e98e3e1Schristos     ()
21624e98e3e1Schristos)
21634e98e3e1Schristos
21644e98e3e1Schristos(dni subv "sub:rv"
21654e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
21664e98e3e1Schristos     "subv $dr,$sr"
21674e98e3e1Schristos     (+ OP1_0 OP2_0 dr sr)
21684e98e3e1Schristos     (parallel ()
21694e98e3e1Schristos	       (set dr (sub dr sr))
21704e98e3e1Schristos	       (set condbit (sub-oflag dr sr (const 0))))
21714e98e3e1Schristos     ()
21724e98e3e1Schristos)
21734e98e3e1Schristos
21744e98e3e1Schristos(dni subx "sub:rx"
21754e98e3e1Schristos     ((PIPE OS) (IDOC ALU))
21764e98e3e1Schristos     "subx $dr,$sr"
21774e98e3e1Schristos     (+ OP1_0 OP2_1 dr sr)
21784e98e3e1Schristos     (parallel ()
21794e98e3e1Schristos	       (set dr (subc dr sr condbit))
21804e98e3e1Schristos	       (set condbit (sub-cflag dr sr condbit)))
21814e98e3e1Schristos     ()
21824e98e3e1Schristos)
21834e98e3e1Schristos
21844e98e3e1Schristos(dni trap "trap"
21854e98e3e1Schristos     (UNCOND-CTI FILL-SLOT (PIPE O) (IDOC MISC))
21864e98e3e1Schristos     "trap $uimm4"
21874e98e3e1Schristos     (+ OP1_1 OP2_15 (f-r1 0) uimm4)
21884e98e3e1Schristos     (sequence ()
21894e98e3e1Schristos	       ; bbpc = bpc
21904e98e3e1Schristos	       (set (reg h-cr 14) (reg h-cr 6))
21914e98e3e1Schristos	       ; Set bpc to the return address.  Actually it's not quite the
21924e98e3e1Schristos	       ; return address as RTE rounds the address down to a word
21934e98e3e1Schristos	       ; boundary.
21944e98e3e1Schristos	       (set (reg h-cr 6) (add pc (const 4)))
21954e98e3e1Schristos	       ; bbpsw = bpsw
21964e98e3e1Schristos	       (set (reg h-bbpsw) (reg h-bpsw))
21974e98e3e1Schristos	       ; bpsw = psw
21984e98e3e1Schristos	       (set (reg h-bpsw) (reg h-psw))
21994e98e3e1Schristos	       ; sm is unchanged, ie,c are set to zero.
22004e98e3e1Schristos	       (set (reg h-psw) (and (reg h-psw) (const #x80)))
22014e98e3e1Schristos	       ; m32r_trap handles operating vs user mode
22024e98e3e1Schristos	       (set WI pc (c-call WI "m32r_trap" pc uimm4))
22034e98e3e1Schristos     )
22044e98e3e1Schristos     ()
22054e98e3e1Schristos)
22064e98e3e1Schristos
22074e98e3e1Schristos(dni unlock "unlock"
22084e98e3e1Schristos     ((PIPE O) (IDOC MISC))
22094e98e3e1Schristos     "unlock $src1,@$src2"
22104e98e3e1Schristos     (+ OP1_2 OP2_5 src1 src2)
22114e98e3e1Schristos     (sequence ()
22124e98e3e1Schristos	       (if (reg h-lock)
22134e98e3e1Schristos		   (set (mem WI src2) src1))
22144e98e3e1Schristos	       (set (reg h-lock) (const BI 0)))
22154e98e3e1Schristos     ((m32r/d (unit u-load))
22164e98e3e1Schristos      (m32rx (unit u-load))
22174e98e3e1Schristos      (m32r2 (unit u-load)))
22184e98e3e1Schristos)
22194e98e3e1Schristos
22204e98e3e1Schristos; Saturate into byte.
22214e98e3e1Schristos(dni satb "satb"
22224e98e3e1Schristos     ((MACH m32rx,m32r2) (IDOC ALU))
22234e98e3e1Schristos     "satb $dr,$sr"
22244e98e3e1Schristos     (+ OP1_8 dr OP2_6 sr (f-uimm16 #x0300))
22254e98e3e1Schristos     (set dr
22264e98e3e1Schristos	  ; FIXME: min/max would simplify this nicely of course.
22274e98e3e1Schristos	  (cond WI
22284e98e3e1Schristos		((ge sr (const 127)) (const 127))
22294e98e3e1Schristos		((le sr (const -128)) (const -128))
22304e98e3e1Schristos		(else sr)))
22314e98e3e1Schristos     ()
22324e98e3e1Schristos)
22334e98e3e1Schristos
22344e98e3e1Schristos; Saturate into half word.
22354e98e3e1Schristos(dni sath "sath"
22364e98e3e1Schristos     ((MACH m32rx,m32r2) (IDOC ALU))
22374e98e3e1Schristos     "sath $dr,$sr"
22384e98e3e1Schristos     (+ OP1_8 dr OP2_6 sr (f-uimm16 #x0200))
22394e98e3e1Schristos     (set dr
22404e98e3e1Schristos	  (cond WI
22414e98e3e1Schristos		((ge sr (const 32767)) (const 32767))
22424e98e3e1Schristos		((le sr (const -32768)) (const -32768))
22434e98e3e1Schristos		(else sr)))
22444e98e3e1Schristos     ()
22454e98e3e1Schristos)
22464e98e3e1Schristos
22474e98e3e1Schristos; Saturate word.
22484e98e3e1Schristos(dni sat "sat"
22494e98e3e1Schristos     ((MACH m32rx,m32r2) SPECIAL (IDOC ALU))
22504e98e3e1Schristos     "sat $dr,$sr"
22514e98e3e1Schristos     (+ OP1_8 dr OP2_6 sr (f-uimm16 0))
22524e98e3e1Schristos     (set dr
22534e98e3e1Schristos	  (if WI condbit
22544e98e3e1Schristos	       (if WI (lt sr (const 0))
22554e98e3e1Schristos		    (const #x7fffffff)
22564e98e3e1Schristos		    (const #x80000000))
22574e98e3e1Schristos	       sr))
22584e98e3e1Schristos     ()
22594e98e3e1Schristos)
22604e98e3e1Schristos
22614e98e3e1Schristos; Parallel compare byte zeros.
22624e98e3e1Schristos; Set C bit in condition register if any byte in source register is zero.
22634e98e3e1Schristos(dni pcmpbz "pcmpbz"
22644e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE OS) SPECIAL (IDOC ALU))
22654e98e3e1Schristos     "pcmpbz $src2"
22664e98e3e1Schristos     (+ OP1_0 (f-r1 3) OP2_7 src2)
22674e98e3e1Schristos     (set condbit
22684e98e3e1Schristos	  (cond BI
22694e98e3e1Schristos		 ((eq (and src2 (const #xff)) (const 0)) (const BI 1))
22704e98e3e1Schristos		 ((eq (and src2 (const #xff00)) (const 0)) (const BI 1))
22714e98e3e1Schristos		 ((eq (and src2 (const #xff0000)) (const 0)) (const BI 1))
22724e98e3e1Schristos		 ((eq (and src2 (const #xff000000)) (const 0)) (const BI 1))
22734e98e3e1Schristos		 (else (const BI 0))))
22744e98e3e1Schristos     ((m32rx (unit u-cmp))
22754e98e3e1Schristos      (m32r2 (unit u-cmp)))
22764e98e3e1Schristos)
22774e98e3e1Schristos
22784e98e3e1Schristos; Add accumulators
22794e98e3e1Schristos(dni sadd "sadd"
22804e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC ACCUM))
22814e98e3e1Schristos     "sadd"
22824e98e3e1Schristos     (+ OP1_5 (f-r1 0) OP2_14 (f-r2 4))
22834e98e3e1Schristos     (set (reg h-accums 0)
22844e98e3e1Schristos	  (add (sra (reg h-accums 1) (const 16))
22854e98e3e1Schristos	       (reg h-accums 0)))
22864e98e3e1Schristos     ((m32rx (unit u-mac))
22874e98e3e1Schristos      (m32r2 (unit u-mac)))
22884e98e3e1Schristos)
22894e98e3e1Schristos
22904e98e3e1Schristos; Multiply and add into accumulator 1
22914e98e3e1Schristos(dni macwu1 "macwu1"
22924e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
22934e98e3e1Schristos     "macwu1 $src1,$src2"
22944e98e3e1Schristos     (+ OP1_5 src1 OP2_11 src2)
22954e98e3e1Schristos     (set (reg h-accums 1)
22964e98e3e1Schristos	  (sra DI
22974e98e3e1Schristos		(sll DI
22984e98e3e1Schristos		      (add DI
22994e98e3e1Schristos			    (reg h-accums 1)
23004e98e3e1Schristos			    (mul DI
23014e98e3e1Schristos				  (ext DI src1)
23024e98e3e1Schristos				  (ext DI (and src2 (const #xffff)))))
23034e98e3e1Schristos		      (const 8))
23044e98e3e1Schristos		(const 8)))
23054e98e3e1Schristos     ((m32rx (unit u-mac))
23064e98e3e1Schristos      (m32r2 (unit u-mac)))
23074e98e3e1Schristos)
23084e98e3e1Schristos
23094e98e3e1Schristos; Multiply and subtract from accumulator 0
23104e98e3e1Schristos(dni msblo "msblo"
23114e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
23124e98e3e1Schristos     "msblo $src1,$src2"
23134e98e3e1Schristos     (+ OP1_5 src1 OP2_13 src2)
23144e98e3e1Schristos     (set accum
23154e98e3e1Schristos	  (sra DI
23164e98e3e1Schristos		(sll DI
23174e98e3e1Schristos		      (sub accum
23184e98e3e1Schristos			   (sra DI
23194e98e3e1Schristos				 (sll DI
23204e98e3e1Schristos				       (mul DI
23214e98e3e1Schristos					     (ext DI (trunc HI src1))
23224e98e3e1Schristos					     (ext DI (trunc HI src2)))
23234e98e3e1Schristos				       (const 32))
23244e98e3e1Schristos				 (const 16)))
23254e98e3e1Schristos		      (const 8))
23264e98e3e1Schristos		(const 8)))
23274e98e3e1Schristos     ((m32rx (unit u-mac))
23284e98e3e1Schristos      (m32r2 (unit u-mac)))
23294e98e3e1Schristos)
23304e98e3e1Schristos
23314e98e3e1Schristos; Multiply into accumulator 1
23324e98e3e1Schristos(dni mulwu1 "mulwu1"
23334e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
23344e98e3e1Schristos     "mulwu1 $src1,$src2"
23354e98e3e1Schristos     (+ OP1_5 src1 OP2_10 src2)
23364e98e3e1Schristos     (set (reg h-accums 1)
23374e98e3e1Schristos	  (sra DI
23384e98e3e1Schristos		(sll DI
23394e98e3e1Schristos		      (mul DI
23404e98e3e1Schristos			    (ext DI src1)
23414e98e3e1Schristos			    (ext DI (and src2 (const #xffff))))
23424e98e3e1Schristos		      (const 16))
23434e98e3e1Schristos		(const 16)))
23444e98e3e1Schristos     ((m32rx (unit u-mac))
23454e98e3e1Schristos      (m32r2 (unit u-mac)))
23464e98e3e1Schristos)
23474e98e3e1Schristos
23484e98e3e1Schristos; Multiply and add into accumulator 1
23494e98e3e1Schristos(dni maclh1 "maclh1"
23504e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE S) (IDOC MAC))
23514e98e3e1Schristos     "maclh1 $src1,$src2"
23524e98e3e1Schristos     (+ OP1_5 src1 OP2_12 src2)
23534e98e3e1Schristos     (set (reg h-accums 1)
23544e98e3e1Schristos	  (sra DI
23554e98e3e1Schristos		(sll DI
23564e98e3e1Schristos		    (add DI
23574e98e3e1Schristos			  (reg h-accums 1)
23584e98e3e1Schristos			  (sll DI
23594e98e3e1Schristos				(ext DI
23604e98e3e1Schristos				      (mul SI
23614e98e3e1Schristos					    (ext SI (trunc HI src1))
23624e98e3e1Schristos					    (sra SI src2 (const SI 16))))
23634e98e3e1Schristos			      (const 16)))
23644e98e3e1Schristos		    (const 8))
23654e98e3e1Schristos	       (const 8)))
23664e98e3e1Schristos     ((m32rx (unit u-mac))
23674e98e3e1Schristos      (m32r2 (unit u-mac)))
23684e98e3e1Schristos)
23694e98e3e1Schristos
23704e98e3e1Schristos; skip instruction if C
23714e98e3e1Schristos(dni sc "sc"
23724e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE O) SPECIAL (IDOC BR))
23734e98e3e1Schristos     "sc"
23744e98e3e1Schristos     (+ OP1_7 (f-r1 4) OP2_0 (f-r2 1))
23754e98e3e1Schristos     (skip (zext INT condbit))
23764e98e3e1Schristos     ()
23774e98e3e1Schristos)
23784e98e3e1Schristos
23794e98e3e1Schristos; skip instruction if not C
23804e98e3e1Schristos(dni snc "snc"
23814e98e3e1Schristos     ((MACH m32rx,m32r2) (PIPE O) SPECIAL (IDOC BR))
23824e98e3e1Schristos     "snc"
23834e98e3e1Schristos     (+ OP1_7 (f-r1 5) OP2_0 (f-r2 1))
23844e98e3e1Schristos     (skip (zext INT (not condbit)))
23854e98e3e1Schristos     ()
23864e98e3e1Schristos)
23874e98e3e1Schristos
23884e98e3e1Schristos; PSW &= ((~ uimm8) | 0xff00)
23894e98e3e1Schristos(dni clrpsw "clrpsw"
23904e98e3e1Schristos     ((PIPE O) SPECIAL_M32R)
23914e98e3e1Schristos     "clrpsw $uimm8"
23924e98e3e1Schristos     (+ OP1_7 (f-r1 2) uimm8)
23934e98e3e1Schristos     (set USI (reg h-cr 0)
23944e98e3e1Schristos              (and USI (reg h-cr 0)
23954e98e3e1Schristos		   (or USI (zext SI (inv QI uimm8)) (const #xff00))))
23964e98e3e1Schristos     ()
23974e98e3e1Schristos)
23984e98e3e1Schristos
23994e98e3e1Schristos; PSW |= (unsigned char) uimm8
24004e98e3e1Schristos(dni setpsw "setpsw"
24014e98e3e1Schristos     ((PIPE O) SPECIAL_M32R)
24024e98e3e1Schristos     "setpsw $uimm8"
24034e98e3e1Schristos     (+ OP1_7 (f-r1 1) uimm8)
24044e98e3e1Schristos     (set USI (reg h-cr 0) uimm8)
24054e98e3e1Schristos     ()
24064e98e3e1Schristos)
24074e98e3e1Schristos
24084e98e3e1Schristos; bset
24094e98e3e1Schristos(dni bset "bset"
24104e98e3e1Schristos     (SPECIAL_M32R)
24114e98e3e1Schristos     "bset $uimm3,@($slo16,$sr)"
24124e98e3e1Schristos     (+ OP1_10 (f-bit4 0) uimm3 OP2_6 sr slo16)
24134e98e3e1Schristos     (set QI (mem QI (add sr slo16))
24144e98e3e1Schristos             (or QI (mem QI (add sr slo16))
24154e98e3e1Schristos		 (sll QI (const 1) (sub (const 7) uimm3))))
24164e98e3e1Schristos     ()
24174e98e3e1Schristos)
24184e98e3e1Schristos
24194e98e3e1Schristos; bclr
24204e98e3e1Schristos(dni bclr "bclr"
24214e98e3e1Schristos     (SPECIAL_M32R)
24224e98e3e1Schristos     "bclr $uimm3,@($slo16,$sr)"
24234e98e3e1Schristos     (+ OP1_10 (f-bit4 0) uimm3  OP2_7 sr slo16)
24244e98e3e1Schristos     (set QI (mem QI (add sr slo16))
24254e98e3e1Schristos             (and QI (mem QI (add sr slo16))
24264e98e3e1Schristos                   (inv QI (sll QI (const 1) (sub (const 7) uimm3)))))
24274e98e3e1Schristos     ()
24284e98e3e1Schristos)
24294e98e3e1Schristos
24304e98e3e1Schristos; btst
24314e98e3e1Schristos(dni btst "btst"
24324e98e3e1Schristos     (SPECIAL_M32R (PIPE O))
24334e98e3e1Schristos     "btst $uimm3,$sr"
24344e98e3e1Schristos     (+ OP1_0 (f-bit4 0) uimm3 OP2_15 sr)
24354e98e3e1Schristos     (set condbit (and QI (srl QI sr (sub (const 7) uimm3)) (const 1)))
24364e98e3e1Schristos     ()
24374e98e3e1Schristos)
2438