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