| ; Fujitsu FRV opcode support, for GNU Binutils.  -*- Scheme -*- | 
 | ; | 
 | ; Copyright 2000, 2001, 2003, 2004, 2007, 2009 Free Software Foundation, Inc. | 
 | ; | 
 | ; Contributed by Red Hat Inc; developed under contract from Fujitsu. | 
 | ; | 
 | ; This file is part of the GNU Binutils. | 
 | ; | 
 | ; This program is free software; you can redistribute it and/or modify | 
 | ; it under the terms of the GNU General Public License as published by | 
 | ; the Free Software Foundation; either version 3 of the License, or | 
 | ; (at your option) any later version. | 
 | ; | 
 | ; This program is distributed in the hope that it will be useful, | 
 | ; but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | ; GNU General Public License for more details. | 
 | ; | 
 | ; You should have received a copy of the GNU General Public License | 
 | ; along with this program; if not, write to the Free Software | 
 | ; Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
 | ; MA 02110-1301, USA. | 
 |  | 
 | (include "simplify.inc") | 
 |  | 
 | ; define-arch must appear first | 
 |  | 
 | (define-arch | 
 |   (name frv) ; name of cpu architecture | 
 |   (comment "Fujitsu FRV") | 
 |   (insn-lsb0? #t) | 
 |   (machs frv fr550 fr500 fr450 fr400 tomcat simple) | 
 |   (isas frv) | 
 | ) | 
 |  | 
 | (define-isa | 
 |   (name frv) | 
 |   (base-insn-bitsize 32) | 
 |   ; Initial bitnumbers to decode insns by. | 
 |   (decode-assist (24 23 22 21 20 19 18)) | 
 |   (liw-insns 1)       ; The frv fetches  up to 1 insns at a time. | 
 |   (parallel-insns 8)  ; The frv executes up to 8 insns at a time. | 
 | ) | 
 |  | 
 | ; Cpu family definitions. | 
 | ; | 
 | (define-cpu | 
 |   ; cpu names must be distinct from the architecture name and machine names. | 
 |   ; The "b" suffix stands for "base" and is the convention. | 
 |   ; The "f" suffix stands for "family" and is the convention. | 
 |   (name frvbf) | 
 |   (comment "Fujitsu FRV base family") | 
 |   (endian big) | 
 |   (word-bitsize 32) | 
 | ) | 
 |  | 
 | ; Generic FR-V machine. Supports the entire architecture | 
 | (define-mach | 
 |   (name frv) | 
 |   (comment "Generic FRV cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name frv) (comment "Generic FRV model") (attrs) | 
 |   (mach frv) | 
 |  | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |  | 
 |   ; `state' is a list of variables for recording model state | 
 |   ; (state) | 
 |  | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; FR550 machine | 
 | (define-mach | 
 |   (name fr550) | 
 |   (comment "FR550 cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name fr550) (comment "FR550 model") (attrs) | 
 |   (mach fr550) | 
 |  | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |  | 
 |   ; `state' is a list of variables for recording model state | 
 |   (state | 
 |    ; State items | 
 |    ; These are all masks with each bit representing one register. | 
 |    (prev-fr-load      DI) ; Previous use of FR  register was target of a load | 
 |    (prev-fr-complex-1 DI) ; Previous use of FR  register has variable latency | 
 |    (prev-fr-complex-2 DI) ; Previous use of FR  register has variable latency | 
 |    (prev-ccr-complex  DI) ; Previous use of CCR register has variable latency | 
 |    (prev-acc-mmac     DI) ; Previous use of ACC register was a MMAC category | 
 |    (cur-fr-load       DI) ; Current  use of FR  register was target of a load | 
 |    (cur-fr-complex-1  DI) ; Current  use of FR  register has variable latency | 
 |    (cur-fr-complex-2  DI) ; Current  use of FR  register has variable latency | 
 |    (cur-ccr-complex   SI) ; Current  use of CCR register has variable latency | 
 |    (cur-acc-mmac      DI) ; Current  use of ACC register was a MMAC category | 
 |   ) | 
 |   ; Basic unit for instructions with no latency penalties | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Basic integer insn unit | 
 |   (unit u-integer "Integer Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer multiplication unit | 
 |   (unit u-imul "Integer Multiplication Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRdoublek INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer division unit | 
 |   (unit u-idiv "Integer Division Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Branch unit | 
 |   (unit u-branch "Branch Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	((pc)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Trap unit | 
 |   (unit u-trap "Trap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Condition code check unit | 
 |   (unit u-check "Check Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ICCi_3 INT -1) (FCCi_3 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Arithmetic unit | 
 |   (unit u-float-arith "Float Arithmetic unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) ; inputs | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Dual Arithmetic unit | 
 |   (unit u-float-dual-arith "Float Arithmetic unit" () | 
 | 	; This unit has a 2 cycle penalty -- see table 14-14 in the fr550 LSI | 
 | 	1 3 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) ; inputs | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Div unit | 
 |   (unit u-float-div "Float Div unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1)) ; inputs | 
 | 	((FRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Square Root unit | 
 |   (unit u-float-sqrt "Float Square Root unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Compare unit | 
 |   (unit u-float-compare "Float Compare unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FCCi_2 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Dual Float Compare unit | 
 |   (unit u-float-dual-compare "Float Dual Compare unit" () | 
 | 	; This unit has a 2 cycle penalty -- see table 14-14 in the fr550 LSI | 
 | 	1 3 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1)) ; inputs | 
 | 	((FCCi_2 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to GR unit | 
 |   (unit u-fr2gr "FR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintk INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to FR unit | 
 |   (unit u-gr2fr "GR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; SPR Move to GR unit | 
 |   (unit u-spr2gr "SPR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((spr INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to SPR unit | 
 |   (unit u-gr2spr "GR Move to SPR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((spr INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR set half unit | 
 |   (unit u-set-hilo "GR Set Half" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((GRkhi INT -1) (GRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR load unit | 
 |   (unit u-gr-load "GR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (GRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR store unit | 
 |   (unit u-gr-store "GR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (GRk INT -1) (GRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR load unit | 
 |   (unit u-fr-load "FR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR store unit | 
 |   (unit u-fr-store "FR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Swap unit | 
 |   (unit u-swap "Swap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to FR unit | 
 |   (unit u-fr2fr "FR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1)) ; inputs | 
 | 	((FRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Clrgr unit | 
 |   (unit u-clrgr "Clrgr Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Clrfr unit | 
 |   (unit u-clrfr "Clrfr Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache invalidate unit | 
 |   (unit u-ici "Insn cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache invalidate unit | 
 |   (unit u-dci "Data cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache flush unit | 
 |   (unit u-dcf "Data cache flush unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache preload unit | 
 |   (unit u-icpl "Insn cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache preload unit | 
 |   (unit u-dcpl "Data cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache unlock unit | 
 |   (unit u-icul "Insn cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache unlock unit | 
 |   (unit u-dcul "Data cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; commit unit | 
 |   (unit u-commit "Commit Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRk INT -1) (FRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Conversion unit | 
 |   (unit u-float-convert "Float Conversion unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1) (FRintj INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media units | 
 |   (unit u-media "Media unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-quad "Media-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintieven INT -1) (FRintjeven INT -1)) ; inputs | 
 | 	((FRintkeven INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-dual-expand "Media Dual Expand unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintkeven INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-dual "Media-3-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-acc "Media unit for M-3 using ACC" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1) (ACC40Si INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-acc-dual "Media-3-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((FRintkeven INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-wtacc "Media-3-wtacc unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (ACC40Sk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-mclracc "Media-3-mclracc unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-set "Media set" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4 "Media-4 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-acc "Media-4-acc unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-acc-dual "Media-4-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-add-sub "Media-4-add-sub unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-add-sub-dual "Media-4-add-sub-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-quad "Media-4-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintieven INT -1) (FRintjeven INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; FR500 machine. | 
 | (define-mach | 
 |   (name fr500) | 
 |   (comment "FR500 cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name fr500) (comment "FR500 model") (attrs) | 
 |   (mach fr500) | 
 |  | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |  | 
 |   ; `state' is a list of variables for recording model state | 
 |   (state | 
 |    ; State items | 
 |    ; These are all masks with each bit representing one register. | 
 |    (prev-fpop       DI) ; Previous use of FR register was floating point insn | 
 |    (prev-media      DI) ; Previous use of FR register was a media insn | 
 |    (prev-cc-complex DI) ; Previous use of ICC register was not simple | 
 |    (cur-fpop        DI) ; Current use of FR register was floating point insn | 
 |    (cur-media       DI) ; Current use of FR register was a media insn | 
 |    (cur-cc-complex  DI) ; Current use of ICC register was not simple | 
 |   ) | 
 |   ; Basic unit for instructions with no latency penalties | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Basic integer insn unit | 
 |   (unit u-integer "Integer Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer multiplication unit | 
 |   (unit u-imul "Integer Multiplication Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRdoublek INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer division unit | 
 |   (unit u-idiv "Integer Division Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Branch unit | 
 |   (unit u-branch "Branch Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	((pc)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Trap unit | 
 |   (unit u-trap "Trap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Condition code check unit | 
 |   (unit u-check "Check Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ICCi_3 INT -1) (FCCi_3 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Clrgr unit | 
 |   (unit u-clrgr "Clrgr Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Clrfr unit | 
 |   (unit u-clrfr "Clrfr Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR set half unit | 
 |   (unit u-set-hilo "GR Set Half" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((GRkhi INT -1) (GRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR load unit -- TODO doesn't handle quad | 
 |   (unit u-gr-load "GR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (GRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR store unit -- TODO doesn't handle quad | 
 |   (unit u-gr-store "GR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (GRk INT -1) (GRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR recovering store unit -- TODO doesn't handle quad | 
 |   (unit u-gr-r-store "GR Recovering Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (GRk INT -1) (GRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR load unit -- TODO doesn't handle quad | 
 |   (unit u-fr-load "FR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR store unit -- TODO doesn't handle quad | 
 |   (unit u-fr-store "FR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR recovering store unit -- TODO doesn't handle quad | 
 |   (unit u-fr-r-store "FR Recovering Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Swap unit | 
 |   (unit u-swap "Swap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to FR unit | 
 |   (unit u-fr2fr "FR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1)) ; inputs | 
 | 	((FRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to GR unit | 
 |   (unit u-fr2gr "FR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintk INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; SPR Move to GR unit | 
 |   (unit u-spr2gr "SPR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((spr INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to FR unit | 
 |   (unit u-gr2fr "GR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to SPR unit | 
 |   (unit u-gr2spr "GR Move to SPR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((spr INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Arithmetic unit | 
 |   (unit u-float-arith "Float Arithmetic unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) ; inputs | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Dual Arithmetic unit | 
 |   (unit u-float-dual-arith "Float Arithmetic unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) ; inputs | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Div unit | 
 |   (unit u-float-div "Float Div unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1)) ; inputs | 
 | 	((FRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Square Root unit | 
 |   (unit u-float-sqrt "Float Square Root unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Dual Square Root unit | 
 |   (unit u-float-dual-sqrt "Float Dual Square Root unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1)) ; inputs | 
 | 	((FRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Compare unit | 
 |   (unit u-float-compare "Float Compare unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1) | 
 | 	 (FRdoublei INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FCCi_2 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Dual Float Compare unit | 
 |   (unit u-float-dual-compare "Float Dual Compare unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRi INT -1) (FRj INT -1)) ; inputs | 
 | 	((FCCi_2 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Float Conversion unit | 
 |   (unit u-float-convert "Float Conversion unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1) (FRintj INT -1) (FRdoublej INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Dual Float Conversion unit | 
 |   (unit u-float-dual-convert "Float Dual Conversion unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRj INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRk INT -1) (FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit | 
 |   (unit u-media "Media unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1) (ACC40Si INT -1) (ACCGi INT -1)) ; inputs | 
 | 	((FRintk INT -1) (ACC40Sk INT -1) (ACC40Uk INT -1) (ACCGk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Quad Arithmetic unit | 
 |   (unit u-media-quad-arith "Media Quad Arithmetic unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual Multiplication unit | 
 |   (unit u-media-dual-mul "Media Dual Multiplication unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Quad Multiplication unit | 
 |   (unit u-media-quad-mul "Media Quad Multiplication unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Quad Complex unit | 
 |   (unit u-media-quad-complex "Media Quad Complex unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual Expand unit | 
 |   (unit u-media-dual-expand "Media Dual Expand unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual Unpack unit | 
 |   (unit u-media-dual-unpack "Media Dual Unpack unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual byte to half unit | 
 |   (unit u-media-dual-btoh "Media Byte to byte" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual half to byte unit | 
 |   (unit u-media-dual-htob "Media Half to byte" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual byte to half unit extended | 
 |   (unit u-media-dual-btohe "Media Byte to byte extended" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Barrier unit | 
 |   (unit u-barrier "Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Memory Barrier unit | 
 |   (unit u-membar "Memory Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache invalidate unit | 
 |   (unit u-ici "Insn cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache invalidate unit | 
 |   (unit u-dci "Data cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache flush unit | 
 |   (unit u-dcf "Data cache flush unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache preload unit | 
 |   (unit u-icpl "Insn cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache preload unit | 
 |   (unit u-dcpl "Data cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache unlock unit | 
 |   (unit u-icul "Insn cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache unlock unit | 
 |   (unit u-dcul "Data cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; commit unit | 
 |   (unit u-commit "Commit Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRk INT -1) (FRk INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; Tomcat machine. Early version of fr500 machine | 
 | (define-mach | 
 |   (name tomcat) | 
 |   (comment "Tomcat -- early version of fr500") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name tomcat) (comment "Tomcat model") (attrs) | 
 |   (mach tomcat) | 
 |  | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |  | 
 |   ; `state' is a list of variables for recording model state | 
 |   ; (state) | 
 |  | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; FR400 machine | 
 | (define-mach | 
 |   (name fr400) | 
 |   (comment "FR400 cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name fr400) (comment "FR400 model") (attrs) | 
 |   (mach fr400) | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |   ; `state' is a list of variables for recording model state | 
 |   (state | 
 |    ; State items | 
 |    ; These are all masks with each bit representing one register. | 
 |    (prev-fp-load    DI) ; Previous use of FR  register was floating point load | 
 |    (prev-fr-p4      DI) ; Previous use of FR  register was media unit 4 | 
 |    (prev-fr-p6      DI) ; Previous use of FR  register was media unit 6 | 
 |    (prev-acc-p2     DI) ; Previous use of ACC register was media unit 2 | 
 |    (prev-acc-p4     DI) ; Previous use of ACC register was media unit 4 | 
 |    (cur-fp-load     DI) ; Current  use of FR  register is  floating point load | 
 |    (cur-fr-p4       DI) ; Current  use of FR  register is  media unit 4 | 
 |    (cur-fr-p6       DI) ; Current  use of FR  register is  media unit 6 | 
 |    (cur-acc-p2      DI) ; Current  use of ACC register is  media unit 2 | 
 |    (cur-acc-p4      DI) ; Current  use of ACC register is  media unit 4 | 
 |   ) | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Basic integer insn unit | 
 |   (unit u-integer "Integer Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer multiplication unit | 
 |   (unit u-imul "Integer Multiplication Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRdoublek INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer division unit | 
 |   (unit u-idiv "Integer Division Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Branch unit | 
 |   (unit u-branch "Branch Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	((pc)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Trap unit | 
 |   (unit u-trap "Trap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Condition code check unit | 
 |   (unit u-check "Check Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ICCi_3 INT -1) (FCCi_3 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR set half unit | 
 |   (unit u-set-hilo "GR Set Half" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((GRkhi INT -1) (GRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR load unit -- TODO doesn't handle quad | 
 |   (unit u-gr-load "GR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (GRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR store unit -- TODO doesn't handle quad | 
 |   (unit u-gr-store "GR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (GRk INT -1) (GRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR load unit -- TODO doesn't handle quad | 
 |   (unit u-fr-load "FR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR store unit -- TODO doesn't handle quad | 
 |   (unit u-fr-store "FR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Swap unit | 
 |   (unit u-swap "Swap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to GR unit | 
 |   (unit u-fr2gr "FR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintk INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; SPR Move to GR unit | 
 |   (unit u-spr2gr "SPR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((spr INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to FR unit | 
 |   (unit u-gr2fr "GR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to SPR unit | 
 |   (unit u-gr2spr "GR Move to SPR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((spr INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M1 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-1 "Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-1-quad "Media-1-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-hilo "Media-hilo unit -- a variation of the Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((FRkhi INT -1) (FRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M2 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-2 "Media-2 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-quad "Media-2-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-acc "Media-2-acc unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-acc-dual "Media-2-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-add-sub "Media-2-add-sub unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-add-sub-dual "Media-2-add-sub-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M3 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-3 "Media-3 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-dual "Media-3-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-quad "Media-3-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M4 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-4 "Media-4 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-accg "Media-4-accg unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACCGi INT -1) (FRinti INT -1)) ; inputs | 
 | 	((ACCGk INT -1) (FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-acc-dual "Media-4-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M6 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-6 "Media-6 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M7 -- see table 13-8 in the fr400 LSI | 
 |   (unit u-media-7 "Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FCCk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual Expand unit | 
 |   (unit u-media-dual-expand "Media Dual Expand unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual half to byte unit | 
 |   (unit u-media-dual-htob "Media Half to byte" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Barrier unit | 
 |   (unit u-barrier "Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Memory Barrier unit | 
 |   (unit u-membar "Memory Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache invalidate unit | 
 |   (unit u-ici "Insn cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache invalidate unit | 
 |   (unit u-dci "Data cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache flush unit | 
 |   (unit u-dcf "Data cache flush unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache preload unit | 
 |   (unit u-icpl "Insn cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache preload unit | 
 |   (unit u-dcpl "Data cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache unlock unit | 
 |   (unit u-icul "Insn cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache unlock unit | 
 |   (unit u-dcul "Data cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; FR450 machine | 
 | (define-mach | 
 |   (name fr450) | 
 |   (comment "FR450 cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name fr450) (comment "FR450 model") (attrs) | 
 |   (mach fr450) | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |   ; `state' is a list of variables for recording model state | 
 |   (state | 
 |    ; State items | 
 |    ; These are all masks with each bit representing one register. | 
 |    (prev-fp-load    DI) ; Previous use of FR  register was floating point load | 
 |    (prev-fr-p4      DI) ; Previous use of FR  register was media unit 4 | 
 |    (prev-fr-p6      DI) ; Previous use of FR  register was media unit 6 | 
 |    (prev-acc-p2     DI) ; Previous use of ACC register was media unit 2 | 
 |    (prev-acc-p4     DI) ; Previous use of ACC register was media unit 4 | 
 |    (cur-fp-load     DI) ; Current  use of FR  register is  floating point load | 
 |    (cur-fr-p4       DI) ; Current  use of FR  register is  media unit 4 | 
 |    (cur-fr-p6       DI) ; Current  use of FR  register is  media unit 6 | 
 |    (cur-acc-p2      DI) ; Current  use of ACC register is  media unit 2 | 
 |    (cur-acc-p4      DI) ; Current  use of ACC register is  media unit 4 | 
 |   ) | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Basic integer insn unit | 
 |   (unit u-integer "Integer Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer multiplication unit | 
 |   (unit u-imul "Integer Multiplication Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRdoublek INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Integer division unit | 
 |   (unit u-idiv "Integer Division Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (ICCi_1 INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Branch unit | 
 |   (unit u-branch "Branch Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	((pc)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Trap unit | 
 |   (unit u-trap "Trap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) | 
 | 	 (ICCi_2 INT -1) (FCCi_2 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Condition code check unit | 
 |   (unit u-check "Check Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ICCi_3 INT -1) (FCCi_3 INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR set half unit | 
 |   (unit u-set-hilo "GR Set Half" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((GRkhi INT -1) (GRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR load unit -- TODO doesn't handle quad | 
 |   (unit u-gr-load "GR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1) (GRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR store unit -- TODO doesn't handle quad | 
 |   (unit u-gr-store "GR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (GRk INT -1) (GRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR load unit -- TODO doesn't handle quad | 
 |   (unit u-fr-load "FR Load Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1) (FRdoublek INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR store unit -- TODO doesn't handle quad | 
 |   (unit u-fr-store "FR Store Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1) (FRintk INT -1) (FRdoublek INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Swap unit | 
 |   (unit u-swap "Swap Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	((GRk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; FR Move to GR unit | 
 |   (unit u-fr2gr "FR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintk INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; SPR Move to GR unit | 
 |   (unit u-spr2gr "SPR Move to GR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((spr INT -1)) ; inputs | 
 | 	((GRj INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to FR unit | 
 |   (unit u-gr2fr "GR Move to FR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; GR Move to SPR unit | 
 |   (unit u-gr2spr "GR Move to SPR Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRj INT -1)) ; inputs | 
 | 	((spr INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M1 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-1 "Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-1-quad "Media-1-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-hilo "Media-hilo unit -- a variation of the Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	((FRkhi INT -1) (FRklo INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M2 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-2 "Media-2 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-quad "Media-2-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (ACC40Uk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-acc "Media-2-acc unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-acc-dual "Media-2-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-add-sub "Media-2-add-sub unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-2-add-sub-dual "Media-2-add-sub-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M3 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-3 "Media-3 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-dual "Media-3-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-3-quad "Media-3-quad unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M4 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-4 "Media-4 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1) (FRintj INT -1)) ; inputs | 
 | 	((ACC40Sk INT -1) (FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-accg "Media-4-accg unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACCGi INT -1) (FRinti INT -1)) ; inputs | 
 | 	((ACCGk INT -1) (FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-acc-dual "Media-4-acc-dual unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((ACC40Si INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   (unit u-media-4-mclracca "Media-4 unit for MCLRACC with #A=1" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M6 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-6 "Media-6 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media unit M7 -- see table 14-8 in the fr450 LSI | 
 |   (unit u-media-7 "Media-1 unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1) (FRintj INT -1)) ; inputs | 
 | 	((FCCk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual Expand unit | 
 |   (unit u-media-dual-expand "Media Dual Expand unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRinti INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Media Dual half to byte unit | 
 |   (unit u-media-dual-htob "Media Half to byte" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((FRintj INT -1)) ; inputs | 
 | 	((FRintk INT -1)) ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Barrier unit | 
 |   (unit u-barrier "Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Memory Barrier unit | 
 |   (unit u-membar "Memory Barrier unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache invalidate unit | 
 |   (unit u-ici "Insn cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache invalidate unit | 
 |   (unit u-dci "Data cache invalidate unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache flush unit | 
 |   (unit u-dcf "Data cache flush unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache preload unit | 
 |   (unit u-icpl "Insn cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache preload unit | 
 |   (unit u-dcpl "Data cache preload unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Insn cache unlock unit | 
 |   (unit u-icul "Insn cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 |   ; Data cache unlock unit | 
 |   (unit u-dcul "Data cache unlock unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	((GRi INT -1) (GRj INT -1)) ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; Simple machine - single issue integer machine | 
 | (define-mach | 
 |   (name simple) | 
 |   (comment "Simple single issue integer cpu") | 
 |   (cpu frvbf) | 
 | ) | 
 | (define-model | 
 |   (name simple) (comment "Simple model") (attrs) | 
 |   (mach simple) | 
 |   (pipeline all "" () ((fetch) (decode) (execute) (writeback))) | 
 |   ; `state' is a list of variables for recording model state | 
 |   (state) | 
 |   (unit u-exec "Execution Unit" () | 
 | 	1 1 ; issue done | 
 | 	() ; state | 
 | 	() ; inputs | 
 | 	() ; outputs | 
 | 	() ; profile action (default) | 
 | 	) | 
 | ) | 
 |  | 
 | ; The instruction fetch/execute cycle. | 
 | ; | 
 | ; This is how to fetch and decode an instruction. | 
 | ; Leave it out for now | 
 |  | 
 | ; (define-extract (const SI 0)) | 
 |  | 
 | ; This is how to execute a decoded instruction. | 
 | ; Leave it out for now | 
 |  | 
 | ; (define-execute (const SI 0)) | 
 |  | 
 | ; An attribute to describe which unit an insn runs in. | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name UNIT) | 
 |   (comment "parallel execution pipeline selection") | 
 |   ; The order of declaration is significant.  | 
 |   ; See the *_unit_mapping tables in frv.opc | 
 |   ; Keep variations on the same unit together. | 
 |   ; Keep the '01' variant immediately after the '1' variant in each unit. | 
 |   ; Keep the 'ALL' variations immediately after the last numbered variant in each unit. | 
 |   (values NIL | 
 | 	  I0 I1 I01 I2 I3 IALL | 
 | 	  FM0 FM1 FM01 FM2 FM3 FMALL FMLOW | 
 | 	  B0 B1 B01 | 
 | 	  C | 
 | 	  MULT-DIV ; multiply/division slotted differently on different machines | 
 | 	  IACC     ; iacc multiply     slotted differently on different machines | 
 | 	  LOAD     ; loads             slotted differently on different machines | 
 | 	  STORE    ; store             slotted differently on different machines | 
 | 	  SCAN     ; scan, scani       slotted differently on different machines | 
 | 	  DCPL     ; dcpl              slotted differently on different machines | 
 | 	  MDUALACC ; media dual acc    slotted differently on different machines | 
 | 	  MDCUTSSI ; mdcutssi insn     slotted differently on different machines | 
 | 	  MCLRACC-1; mclracc A==1      slotted differently on different machines | 
 | 	  NUM_UNITS | 
 |   ) | 
 | ) | 
 | ; Attributes to describe major categories of insns | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name FR400-MAJOR) | 
 |   (comment "fr400 major insn categories") | 
 |   ; The order of declaration is significant. Keep variations on the same major | 
 |   ; together. | 
 |   (values NONE | 
 | 	  I-1 I-2 I-3 I-4 I-5 | 
 | 	  B-1 B-2 B-3 B-4 B-5 B-6 | 
 | 	  C-1 C-2 | 
 | 	  M-1 M-2 | 
 |   ) | 
 | ) | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name FR450-MAJOR) | 
 |   (comment "fr450 major insn categories") | 
 |   ; The order of declaration is significant. Keep variations on the same major | 
 |   ; together. | 
 |   (values NONE | 
 | 	  I-1 I-2 I-3 I-4 I-5 | 
 | 	  B-1 B-2 B-3 B-4 B-5 B-6 | 
 | 	  C-1 C-2 | 
 | 	  M-1 M-2 M-3 M-4 M-5 M-6 | 
 |   ) | 
 | ) | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name FR500-MAJOR) | 
 |   (comment "fr500 major insn categories") | 
 |   ; The order of declaration is significant. Keep variations on the same major | 
 |   ; together. | 
 |   (values NONE | 
 | 	  I-1 I-2 I-3 I-4 I-5 I-6 | 
 | 	  B-1 B-2 B-3 B-4 B-5 B-6 | 
 | 	  C-1 C-2 | 
 | 	  F-1 F-2 F-3 F-4 F-5 F-6 F-7 F-8 | 
 | 	  M-1 M-2 M-3 M-4 M-5 M-6 M-7 M-8 | 
 |   ) | 
 | ) | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name FR550-MAJOR) | 
 |   (comment "fr550 major insn categories") | 
 |   ; The order of declaration is significant. Keep variations on the same major | 
 |   ; together. | 
 |   (values NONE | 
 | 	  I-1 I-2 I-3 I-4 I-5 I-6 I-7 I-8 | 
 | 	  B-1 B-2 B-3 B-4 B-5 B-6 | 
 | 	  C-1 C-2 | 
 | 	  F-1 F-2 F-3 F-4 | 
 | 	  M-1 M-2 M-3 M-4 M-5 | 
 |   ) | 
 | ) | 
 | ; Privileged insn | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name PRIVILEGED) | 
 |   (comment "insn only allowed in supervisor mode") | 
 | ) | 
 | ; Non-Excepting insn | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name NON-EXCEPTING) | 
 |   (comment "non-excepting insn") | 
 | ) | 
 | ; Conditional insn | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name CONDITIONAL) | 
 |   (comment "conditional insn") | 
 | ) | 
 | ; insn accesses FR registers | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name FR-ACCESS) | 
 |   (comment "insn accesses FR registers") | 
 | ) | 
 | ; insn preserves MSR.OVF | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name PRESERVE-OVF) | 
 |   (comment "Preserve value of MSR.OVF") | 
 | ) | 
 | ; "Audio" instruction provided by the fr405 but not the original fr400 core. | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name AUDIO) | 
 |   (comment "Audio instruction added with FR405") | 
 | ) | 
 | ; null attribute -- used as a place holder for where an attribue is required. | 
 | (define-attr | 
 |   (for insn) | 
 |   (type boolean) | 
 |   (name NA) | 
 |   (comment "placeholder attribute") | 
 |   (attrs META) ; do not define in any generated file for now | 
 | ) | 
 |  | 
 | ; IDOC attribute for instruction documentation. | 
 |  | 
 | (define-attr | 
 |   (for insn) | 
 |   (type enum) | 
 |   (name IDOC) | 
 |   (comment "insn kind for documentation") | 
 |   (attrs META) | 
 |   (values | 
 |    (MEM - () "Memory") | 
 |    (ALU - () "ALU") | 
 |    (FPU - () "FPU") | 
 |    (BR - () "Branch") | 
 |    (PRIV - () "Priviledged") | 
 |    (MISC - () "Miscellaneous") | 
 |   ) | 
 | ) | 
 |  | 
 | ; Instruction fields. | 
 | ; | 
 | ; Attributes: | 
 | ; PCREL-ADDR: pc relative value (for reloc and disassembly purposes) | 
 | ; ABS-ADDR: absolute address (for reloc and disassembly purposes?) | 
 | ; RESERVED: bits are not used to decode insn, must be all 0 | 
 | (dnf f-pack      "packing bit"                  () 31  1) | 
 | (dnf f-op        "primary opcode"               () 24  7) | 
 | (dnf f-ope1      "extended opcode"              () 11  6) | 
 | (dnf f-ope2      "extended opcode"              ()  9  4) | 
 | (dnf f-ope3      "extended opcode"              () 15  3) | 
 | (dnf f-ope4      "extended opcode"              ()  7  2) | 
 |  | 
 | (dnf f-GRi       "source register 1"            () 17  6) | 
 | (dnf f-GRj       "source register 2"            ()  5  6) | 
 | (dnf f-GRk       "destination register"         () 30  6) | 
 |  | 
 | (dnf f-FRi       "source register 1"            () 17  6) | 
 | (dnf f-FRj       "source register 2"            ()  5  6) | 
 | (dnf f-FRk       "destination register"         () 30  6) | 
 |  | 
 | (dnf f-CPRi      "source register 1"            () 17  6) | 
 | (dnf f-CPRj      "source register 2"            ()  5  6) | 
 | (dnf f-CPRk      "destination register"         () 30  6) | 
 |  | 
 | (dnf f-ACCGi     "source register"              () 17  6) | 
 | (dnf f-ACCGk     "destination register"         () 30  6) | 
 |  | 
 | (dnf f-ACC40Si   "40 bit signed accumulator"    () 17  6) | 
 | (dnf f-ACC40Ui   "40 bit unsigned accumulator"  () 17  6) | 
 | (dnf f-ACC40Sk   "40 bit accumulator"           () 30  6) | 
 | (dnf f-ACC40Uk   "40 bit accumulator"           () 30  6) | 
 |  | 
 | (dnf f-CRi       "source      register"         () 14  3) | 
 | (dnf f-CRj       "source      register"         ()  2  3) | 
 | (dnf f-CRk       "destination register"         () 27  3) | 
 | (dnf f-CCi       "condition   register"         () 11  3) | 
 |  | 
 | (df  f-CRj_int   "target cr for ck insns"       () 26  2 UINT | 
 |      ((value pc) (sub WI value 4)) | 
 |      ((value pc) (add WI value 4)) | 
 | ) | 
 | (dnf f-CRj_float "target cr for fck insns"      () 26  2) | 
 |  | 
 | (dnf f-ICCi_1    "condition register"           () 11  2) | 
 | (dnf f-ICCi_2    "condition register"           () 26  2) | 
 | (dnf f-ICCi_3    "condition register"           ()  1  2) | 
 | (dnf f-FCCi_1    "condition register"           () 11  2) | 
 | (dnf f-FCCi_2    "condition register"           () 26  2) | 
 | (dnf f-FCCi_3    "condition register"           ()  1  2) | 
 | (dnf f-FCCk      "condition register"           () 26  2) | 
 | (dnf f-eir       "exception insn register"      () 17  6) | 
 |  | 
 | (df  f-s10       "10 bit sign extended"         ()  9 10  INT #f #f) | 
 | (df  f-s12       "12 bit sign extended"         () 11 12  INT #f #f) | 
 | (df  f-d12       "12 bit sign extended"         () 11 12  INT #f #f) | 
 | (df  f-u16       "16 bit unsigned"              () 15 16 UINT #f #f) | 
 | (df  f-s16       "16 bit sign extended"         () 15 16  INT #f #f) | 
 | (df  f-s6        "6  bit   signed"              ()  5  6  INT #f #f) | 
 | (df  f-s6_1      "6  bit   signed"              () 11  6  INT #f #f) | 
 | (df  f-u6        "6  bit unsigned"              ()  5  6 UINT #f #f) | 
 | (df  f-s5        "5  bit   signed"              ()  4  5  INT #f #f) | 
 |  | 
 | (df  f-u12-h "upper 6 bits of u12"  () 17 6  INT #f #f) | 
 | (df  f-u12-l "lower 6 bits of u12"  ()  5 6 UINT #f #f) | 
 | (dnmf f-u12   "12 bit signed immediate" () INT | 
 |       (f-u12-h f-u12-l) | 
 |       (sequence () ; insert | 
 | 		(set (ifield f-u12-h) (sra SI (ifield f-u12) 6)) | 
 | 		(set (ifield f-u12-l) (and (ifield f-u12) #x3f)) | 
 | 		) | 
 |       (sequence () ; extract | 
 | 		(set (ifield f-u12) (or (mul (ifield f-u12-h) 64) | 
 | 					(ifield f-u12-l))) | 
 | 		) | 
 | ) | 
 |  | 
 | (dnf f-int-cc    "integer  branch conditions"   () 30  4) | 
 | (dnf f-flt-cc    "floating branch conditions"   () 30  4) | 
 | (df  f-cond      "conditional arithmetic"       ()  8  1 UINT #f #f) | 
 | (df  f-ccond     "lr branch condition"          () 12  1 UINT #f #f) | 
 | (df  f-hint      "2 bit branch prediction hint" () 17  2 UINT #f #f) | 
 | (df  f-LI        "link indicator"               () 25  1 UINT #f #f) | 
 | (df  f-lock      "cache lock indicator"         () 25  1 UINT #f #f) | 
 | (df  f-debug     "debug mode indicator"         () 25  1 UINT #f #f) | 
 | (df  f-A         "all accumulator bit"          () 17  1 UINT #f #f) | 
 | (df  f-ae        "cache all entries indicator"  () 25  1 UINT #f #f) | 
 |  | 
 | (dnf  f-spr-h "upper 6 bits of spr"  () 30  6) | 
 | (dnf  f-spr-l "lower 6 bits of spr"  () 17  6) | 
 | (dnmf f-spr   "special purpose register" () UINT | 
 |       (f-spr-h f-spr-l) | 
 |       (sequence () ; insert | 
 | 		(set (ifield f-spr-h) (srl (ifield f-spr) (const 6))) | 
 | 		(set (ifield f-spr-l) (and (ifield f-spr) (const #x3f))) | 
 | 		) | 
 |       (sequence () ; extract | 
 | 		(set (ifield f-spr) (or (sll (ifield f-spr-h) (const 6)) | 
 | 					(ifield f-spr-l))) | 
 | 		) | 
 | ) | 
 |  | 
 | (df  f-label16    "18 bit pc relative signed offset" (PCREL-ADDR) 15 16 INT | 
 |      ((value pc) (sra WI (sub WI value pc) (const 2))) | 
 |      ((value pc) (add WI (mul WI value (const 4)) pc)) | 
 | ) | 
 |  | 
 | (df   f-labelH6   "upper 6  bits of label24"  () 30  6 INT #f #f) | 
 | (dnf  f-labelL18  "lower 18 bits of label24"  () 17 18) | 
 | (dnmf f-label24   "26 bit signed offset"     (PCREL-ADDR) INT | 
 |       (f-labelH6 f-labelL18) | 
 |       ; insert | 
 |       (sequence () | 
 | 		(set (ifield f-labelH6) | 
 | 		     (sra WI (sub (ifield f-label24) pc) (const 20))) | 
 | 		(set (ifield f-labelL18) | 
 | 		     (and (srl (sub (ifield f-label24) pc) (const 2)) | 
 | 			  (const #x3ffff))) | 
 | 		) | 
 |       ; extract | 
 |       (sequence () | 
 | 		(set (ifield f-label24) | 
 | 		     (add (mul (or (mul (ifield f-labelH6) (sll 1 18)) | 
 | 				   (ifield f-labelL18)) | 
 | 			       (const 4)) | 
 | 			  pc))) | 
 | ) | 
 |  | 
 | (dnf f-LRAE "Load Real Address E flag" () 5 1) | 
 | (dnf f-LRAD "Load Real Address D flag" () 4 1) | 
 | (dnf f-LRAS "Load Real Address S flag" () 3 1) | 
 |  | 
 | (dnf f-TLBPRopx "TLB Probe operation number" () 28 3) | 
 | (dnf f-TLBPRL   "TLB Probe L flag" () 25 1) | 
 |  | 
 | (dnf f-ICCi_1-null  "null field" (RESERVED) 11  2) | 
 | (dnf f-ICCi_2-null  "null field" (RESERVED) 26  2) | 
 | (dnf f-ICCi_3-null  "null field" (RESERVED)  1  2) | 
 | (dnf f-FCCi_1-null  "null field" (RESERVED) 11  2) | 
 | (dnf f-FCCi_2-null  "null field" (RESERVED) 26  2) | 
 | (dnf f-FCCi_3-null  "null field" (RESERVED)  1  2) | 
 | (dnf f-rs-null      "null field" (RESERVED) 17  6) | 
 | (dnf f-GRi-null     "null field" (RESERVED) 17  6) | 
 | (dnf f-GRj-null     "null field" (RESERVED)  5  6) | 
 | (dnf f-GRk-null     "null field" (RESERVED) 30  6) | 
 | (dnf f-FRi-null     "null field" (RESERVED) 17  6) | 
 | (dnf f-FRj-null     "null field" (RESERVED)  5  6) | 
 | (dnf f-ACCj-null    "null field" (RESERVED)  5  6) | 
 | (dnf f-rd-null      "null field" (RESERVED) 30  6) | 
 | (dnf f-cond-null    "null field" (RESERVED) 30  4) | 
 | (dnf f-ccond-null   "null field" (RESERVED) 12  1) | 
 | (dnf f-s12-null     "null field" (RESERVED) 11 12) | 
 | (dnf f-label16-null "null field" (RESERVED) 15 16) | 
 | (dnf f-misc-null-1  "null field" (RESERVED) 30  5) | 
 | (dnf f-misc-null-2  "null field" (RESERVED) 11  6) | 
 | (dnf f-misc-null-3  "null field" (RESERVED) 11  4) | 
 | (dnf f-misc-null-4  "null field" (RESERVED) 17  2) | 
 | (dnf f-misc-null-5  "null field" (RESERVED) 17 16) | 
 | (dnf f-misc-null-6  "null field" (RESERVED) 30  3) | 
 | (dnf f-misc-null-7  "null field" (RESERVED) 17  3) | 
 | (dnf f-misc-null-8  "null field" (RESERVED)  5  3) | 
 | (dnf f-misc-null-9  "null field" (RESERVED)  5  4) | 
 | (dnf f-misc-null-10 "null field" (RESERVED) 16  5) | 
 | (dnf f-misc-null-11 "null field" (RESERVED)  5  1) | 
 |  | 
 | (dnf f-LRA-null     "null field" (RESERVED)  2  3) | 
 | (dnf f-TLBPR-null   "null field" (RESERVED) 30  2) | 
 |  | 
 | (dnf f-LI-off      "null field" (RESERVED) 25  1) | 
 | (dnf f-LI-on       "null field" (RESERVED) 25  1) | 
 |  | 
 | ; Relocation annotations. | 
 | (dsh h-reloc-ann   "relocation annotation" () (register BI)) | 
 | (dnf f-reloc-ann   "relocation annotation" () 0 0) | 
 |  | 
 | (define-pmacro (dann xname xcomment xmode xparse xprint) | 
 |   (define-operand | 
 |     (name xname) | 
 |     (comment xcomment) | 
 |     (type h-reloc-ann) | 
 |     (index f-reloc-ann) | 
 |     (mode xmode) | 
 |     (handlers (parse xparse) (print xprint)) | 
 |     ) | 
 |   ) | 
 |  | 
 |  | 
 | ; Enums. | 
 |  | 
 | ; insn-op: | 
 | ; FIXME: should use die macro or some such | 
 | (define-normal-insn-enum insn-op "insn op enums" () OP_ f-op | 
 |  ( | 
 |  "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "0A" "0B" "0C" "0D" "0E" "0F" | 
 |  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "1A" "1B" "1C" "1D" "1E" "1F" | 
 |  "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "2A" "2B" "2C" "2D" "2E" "2F" | 
 |  "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "3A" "3B" "3C" "3D" "3E" "3F" | 
 |  "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "4A" "4B" "4C" "4D" "4E" "4F" | 
 |  "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "5A" "5B" "5C" "5D" "5E" "5F" | 
 |  "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "6A" "6B" "6C" "6D" "6E" "6F" | 
 |  "70" "71" "72" "73" "74" "75" "76" "77" "78" "79" "7A" "7B" "7C" "7D" "7E" "7F" | 
 |  ) | 
 | ) | 
 |  | 
 | (define-normal-insn-enum insn-ope1 "insn ope enums" () OPE1_ f-ope1 | 
 |  ( | 
 |  "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "0A" "0B" "0C" "0D" "0E" "0F" | 
 |  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "1A" "1B" "1C" "1D" "1E" "1F" | 
 |  "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "2A" "2B" "2C" "2D" "2E" "2F" | 
 |  "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "3A" "3B" "3C" "3D" "3E" "3F" | 
 |  ) | 
 | ) | 
 |  | 
 | (define-normal-insn-enum insn-ope2 "insn ope enums" () OPE2_ f-ope2 | 
 |  ( | 
 |  "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "0A" "0B" "0C" "0D" "0E" "0F" | 
 |  ) | 
 | ) | 
 |  | 
 | (define-normal-insn-enum insn-ope3 "insn ope enums" () OPE3_ f-ope3 | 
 |  ( | 
 |  "00" "01" "02" "03" "04" "05" "06" "07" | 
 |  ) | 
 | ) | 
 |  | 
 | (define-normal-insn-enum insn-ope4 "insn ope enums" () OPE4_ f-ope4 | 
 |  ( | 
 |  "0" "1" "2" "3" | 
 |  ) | 
 | ) | 
 |  | 
 | ; int-cc: integer branch conditions | 
 | ; FIXME: should use die macro or some such | 
 | (define-normal-insn-enum int-cc "integer branch cond enums" () ICC_ f-int-cc | 
 |   ( | 
 |    "nev" "c"  "v"  "lt" "eq" "ls" "n" "le" | 
 |    "ra"  "nc" "nv" "ge" "ne" "hi" "p" "gt" | 
 |   ) | 
 | ) | 
 |  | 
 | ; flt-cc: floating-point/media branch conditions | 
 | ; FIXME: should use die macro or some such | 
 | (define-normal-insn-enum flt-cc "float branch cond enums" () FCC_ f-flt-cc | 
 |   ("nev" "u" "gt" "ug" "lt" "ul" "lg" "ne" | 
 |    "eq" "ue" "ge" "uge" "le" "ule" "o" "ra") | 
 | ) | 
 |  | 
 | ; Hardware pieces. | 
 | ; These entries list the elements of the raw hardware. | 
 | ; They're also used to provide tables and other elements of the assembly | 
 | ; language. | 
 | (dnh h-pc "program counter" (PC PROFILE) (pc) () () ()) | 
 |  | 
 | ; The PSR. The individual fields are referenced more than the entire | 
 | ; register, so reference them directly. We can assemble the | 
 | ; entire register contents when necessary. | 
 | ; | 
 | (dsh h-psr_imple "PSR.IMPLE"   () (register UQI)) | 
 | (dsh h-psr_ver   "PSR.VER"     () (register UQI)) | 
 | (dsh h-psr_ice   "PSR.ICE bit" () (register BI)) | 
 | (dsh h-psr_nem   "PSR.NEM bit" () (register BI)) | 
 | (dsh h-psr_cm    "PSR.CM  bit" () (register BI)) | 
 | (dsh h-psr_be    "PSR.BE  bit" () (register BI)) | 
 | (dsh h-psr_esr   "PSR.ESR bit" () (register BI)) | 
 | (dsh h-psr_ef    "PSR.EF  bit" () (register BI)) | 
 | (dsh h-psr_em    "PSR.EM  bit" () (register BI)) | 
 | (dsh h-psr_pil   "PSR.PIL    " () (register UQI)) | 
 | (dsh h-psr_ps    "PSR.PS  bit" () (register BI)) | 
 | (dsh h-psr_et    "PSR.ET  bit" () (register BI)) | 
 |  | 
 | ; PSR.S requires special handling because the shadow registers (SR0-SR4) must | 
 | ; be switched with GR4-GR7 when changing from user to supervisor mode or | 
 | ; vice-versa. | 
 | (define-hardware | 
 |   (name h-psr_s) | 
 |   (comment "PSR.S bit") | 
 |   (attrs) | 
 |   (type register BI) | 
 |   (get) | 
 |   (set (newval) (c-call VOID "@cpu@_h_psr_s_set_handler" newval)) | 
 | ) | 
 |  | 
 | ; The TBR. The individual bits are referenced more than the entire | 
 | ; register, so reference them directly. We can assemble the | 
 | ; entire register contents when necessary. | 
 | ; | 
 | (dsh h-tbr_tba "TBR.TBA" () (register UWI)) | 
 | (dsh h-tbr_tt  "TBR.TT"  () (register UQI)) | 
 |  | 
 | ; The BPSR. The individual bits are referenced more than the entire | 
 | ; register, so reference them directly. We can assemble the | 
 | ; entire register contents when necessary. | 
 | ; | 
 | (dsh h-bpsr_bs   "PSR.S   bit" () (register BI)) | 
 | (dsh h-bpsr_bet  "PSR.ET  bit" () (register BI)) | 
 |  | 
 | ; General registers | 
 | ; | 
 | (define-keyword | 
 |   (name gr-names) | 
 |   (print-name h-gr) | 
 |   (prefix "") | 
 |   (values | 
 |    (sp 1) (fp 2) | 
 |    (gr0   0)(gr1   1)(gr2   2)(gr3   3)(gr4   4)(gr5   5)(gr6   6)(gr7   7) | 
 |    (gr8   8)(gr9   9)(gr10 10)(gr11 11)(gr12 12)(gr13 13)(gr14 14)(gr15 15) | 
 |    (gr16 16)(gr17 17)(gr18 18)(gr19 19)(gr20 20)(gr21 21)(gr22 22)(gr23 23) | 
 |    (gr24 24)(gr25 25)(gr26 26)(gr27 27)(gr28 28)(gr29 29)(gr30 30)(gr31 31) | 
 |    (gr32 32)(gr33 33)(gr34 34)(gr35 35)(gr36 36)(gr37 37)(gr38 38)(gr39 39) | 
 |    (gr40 40)(gr41 41)(gr42 42)(gr43 43)(gr44 44)(gr45 45)(gr46 46)(gr47 47) | 
 |    (gr48 48)(gr49 49)(gr50 50)(gr51 51)(gr52 52)(gr53 53)(gr54 54)(gr55 55) | 
 |    (gr56 56)(gr57 57)(gr58 58)(gr59 59)(gr60 60)(gr61 61)(gr62 62)(gr63 63) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-gr) | 
 |   (comment "general registers") | 
 |   (attrs PROFILE) | 
 |   (type register USI (64)) | 
 |   (indices extern-keyword gr-names) | 
 |   (get (index) (c-call WI "@cpu@_h_gr_get_handler" index)) | 
 |   (set (index newval) (c-call VOID "@cpu@_h_gr_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; General Registers as double words | 
 | ; These registers are shadowed onto h-gr | 
 | (define-hardware | 
 |   (name h-gr_double) | 
 |   (comment "general registers as double words") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register DI (32)) | 
 |   ; FIXME: Need constraint to prohibit odd numbers. | 
 |   (indices extern-keyword gr-names) | 
 |   (get (index) | 
 |        (c-call DI "@cpu@_h_gr_double_get_handler" index)) | 
 |   (set (index newval) | 
 |        (c-call VOID "@cpu@_h_gr_double_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; General Registers as high and low half words | 
 | ; These registers are shadowed onto h-gr | 
 | (define-hardware | 
 |   (name h-gr_hi) | 
 |   (comment "general registers as high half word") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword gr-names) | 
 |   (get (index) (c-call UHI "@cpu@_h_gr_hi_get_handler" index)) | 
 |   (set (index newval) (c-call VOID "@cpu@_h_gr_hi_set_handler" index newval)) | 
 | ) | 
 | (define-hardware | 
 |   (name h-gr_lo) | 
 |   (comment "general registers as low half word") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword gr-names) | 
 |   (get (index) (c-call UHI "@cpu@_h_gr_lo_get_handler" index)) | 
 |   (set (index newval) (c-call VOID "@cpu@_h_gr_lo_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; Floating Point Registers | 
 | (define-keyword | 
 |   (name fr-names) | 
 |   (print-name h-fr) | 
 |   (prefix "") | 
 |   (values | 
 |    (fr0   0)(fr1   1)(fr2   2)(fr3   3)(fr4   4)(fr5   5)(fr6   6)(fr7   7) | 
 |    (fr8   8)(fr9   9)(fr10 10)(fr11 11)(fr12 12)(fr13 13)(fr14 14)(fr15 15) | 
 |    (fr16 16)(fr17 17)(fr18 18)(fr19 19)(fr20 20)(fr21 21)(fr22 22)(fr23 23) | 
 |    (fr24 24)(fr25 25)(fr26 26)(fr27 27)(fr28 28)(fr29 29)(fr30 30)(fr31 31) | 
 |    (fr32 32)(fr33 33)(fr34 34)(fr35 35)(fr36 36)(fr37 37)(fr38 38)(fr39 39) | 
 |    (fr40 40)(fr41 41)(fr42 42)(fr43 43)(fr44 44)(fr45 45)(fr46 46)(fr47 47) | 
 |    (fr48 48)(fr49 49)(fr50 50)(fr51 51)(fr52 52)(fr53 53)(fr54 54)(fr55 55) | 
 |    (fr56 56)(fr57 57)(fr58 58)(fr59 59)(fr60 60)(fr61 61)(fr62 62)(fr63 63) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-fr) | 
 |   (comment "floating point registers") | 
 |   (attrs PROFILE) | 
 |   (type register SF (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (index) (c-call SF "@cpu@_h_fr_get_handler" index)) | 
 |   (set (index newval) (c-call VOID "@cpu@_h_fr_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; Floating Point Registers as double precision | 
 | ; These registers are shadowed onto h-fr | 
 |  | 
 | (define-hardware | 
 |   (name h-fr_double) | 
 |   (comment "floating point registers as double precision") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register DF (32)) | 
 |   ; FIXME: Need constraint to prohibit odd numbers. | 
 |   (indices extern-keyword fr-names) | 
 |   (get (index) | 
 |        (c-call DF "@cpu@_h_fr_double_get_handler" index)) | 
 |   (set (index newval) | 
 |        (c-call VOID "@cpu@_h_fr_double_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; Floating Point Registers as integer words. | 
 | ; These registers are shadowed onto h-fr | 
 |  | 
 | (define-hardware | 
 |   (name h-fr_int) | 
 |   (comment "floating point registers as integers") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register USI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (index) | 
 |        (c-call USI "@cpu@_h_fr_int_get_handler" index)) | 
 |   (set (index newval) | 
 |        (c-call VOID "@cpu@_h_fr_int_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; Floating Point Registers as high and low half words | 
 | ; These registers are shadowed onto h-fr | 
 | (define-hardware | 
 |   (name h-fr_hi) | 
 |   (comment "floating point registers as unsigned high half word") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (srl (reg h-fr_int regno) 16)) | 
 |   (set (regno newval) (set (reg h-fr_int regno) | 
 | 			   (or (and (reg h-fr_int regno) #xffff) | 
 | 			       (sll newval 16)))) | 
 | ) | 
 | (define-hardware | 
 |   (name h-fr_lo) | 
 |   (comment "floating point registers as unsigned low half word") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (and (reg h-fr_int regno) #xffff)) | 
 |   (set (regno newval) (set (reg h-fr_int regno) | 
 | 			   (or (and (reg h-fr_int regno) #xffff0000) | 
 | 			       (and newval #xffff)))) | 
 | ) | 
 |  | 
 | ; Floating Point Registers as unsigned bytes | 
 | ; These registers are shadowed onto h-fr | 
 | (define-hardware | 
 |   (name h-fr_0) | 
 |   (comment "floating point registers as unsigned byte 0") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (and (reg h-fr_int regno) #xff)) | 
 |   (set (regno newval) | 
 |        (sequence () | 
 | 		 (if (gt USI newval #xff) | 
 | 		     (set newval #xff)) | 
 | 		 (set (reg h-fr_int regno) (or (and (reg h-fr_int regno) #xffffff00) | 
 | 					   newval)))) | 
 | ) | 
 | (define-hardware | 
 |   (name h-fr_1) | 
 |   (comment "floating point registers as unsigned byte 1") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (and (srl (reg h-fr_int regno) 8) #xff)) | 
 |   (set (regno newval) | 
 |        (sequence () | 
 | 		 (if (gt USI newval #xff) | 
 | 		     (set newval #xff)) | 
 | 		 (set (reg h-fr_int regno) (or (and (reg h-fr_int regno) #xffff00ff)  | 
 | 					   (sll newval 8))))) | 
 | ) | 
 | (define-hardware | 
 |   (name h-fr_2) | 
 |   (comment "floating point registers as unsigned byte 2") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (and (srl (reg h-fr_int regno) 16) #xff)) | 
 |   (set (regno newval) | 
 |        (sequence () | 
 | 		 (if (gt USI newval #xff) | 
 | 		     (set newval #xff)) | 
 | 		 (set (reg h-fr_int regno) (or (and (reg h-fr_int regno) #xff00ffff)  | 
 | 					   (sll newval 16))))) | 
 | ) | 
 | (define-hardware | 
 |   (name h-fr_3) | 
 |   (comment "floating point registers as unsigned byte 3") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UHI (64)) | 
 |   (indices extern-keyword fr-names) | 
 |   (get (regno) (and (srl (reg h-fr_int regno) 24) #xff)) | 
 |   (set (regno newval) | 
 |        (sequence () | 
 | 		 (if (gt USI newval #xff) | 
 | 		     (set newval #xff)) | 
 | 		 (set (reg h-fr_int regno) (or (and (reg h-fr_int regno) #x00ffffff)  | 
 | 					   (sll newval 24))))) | 
 | ) | 
 | ; Coprocessor Registers | 
 | ; | 
 | (define-keyword | 
 |   (name cpr-names) | 
 |   (print-name h-cpr) | 
 |   (prefix "") | 
 |   (values | 
 | (cpr0   0)(cpr1   1)(cpr2   2)(cpr3   3)(cpr4   4)(cpr5   5)(cpr6   6)(cpr7   7) | 
 | (cpr8   8)(cpr9   9)(cpr10 10)(cpr11 11)(cpr12 12)(cpr13 13)(cpr14 14)(cpr15 15) | 
 | (cpr16 16)(cpr17 17)(cpr18 18)(cpr19 19)(cpr20 20)(cpr21 21)(cpr22 22)(cpr23 23) | 
 | (cpr24 24)(cpr25 25)(cpr26 26)(cpr27 27)(cpr28 28)(cpr29 29)(cpr30 30)(cpr31 31) | 
 | (cpr32 32)(cpr33 33)(cpr34 34)(cpr35 35)(cpr36 36)(cpr37 37)(cpr38 38)(cpr39 39) | 
 | (cpr40 40)(cpr41 41)(cpr42 42)(cpr43 43)(cpr44 44)(cpr45 45)(cpr46 46)(cpr47 47) | 
 | (cpr48 48)(cpr49 49)(cpr50 50)(cpr51 51)(cpr52 52)(cpr53 53)(cpr54 54)(cpr55 55) | 
 | (cpr56 56)(cpr57 57)(cpr58 58)(cpr59 59)(cpr60 60)(cpr61 61)(cpr62 62)(cpr63 63) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-cpr) | 
 |   (comment "coprocessor registers") | 
 |   (attrs PROFILE (MACH frv)) | 
 |   (type register WI (64)) | 
 |   (indices extern-keyword cpr-names) | 
 | ) | 
 |  | 
 | ; Coprocessor Registers as double words | 
 | ; These registers are shadowed onto h-cpr | 
 | (define-hardware | 
 |   (name h-cpr_double) | 
 |   (comment "coprocessor registers as double words") | 
 |   (attrs PROFILE VIRTUAL (MACH frv)) | 
 |   (type register DI (32)) | 
 |   ; FIXME: Need constraint to prohibit odd numbers. | 
 |   (indices extern-keyword cpr-names) | 
 |   (get (index) | 
 |        (c-call DI "@cpu@_h_cpr_double_get_handler" index)) | 
 |   (set (index newval) | 
 |        (c-call VOID "@cpu@_h_cpr_double_set_handler" index newval)) | 
 | ) | 
 |  | 
 | ; Special Purpose Registers | 
 | ; | 
 | (define-keyword | 
 |   (name spr-names) | 
 |   (print-name h-spr) | 
 |   (prefix "") | 
 |   (values | 
 |    (psr        0) (pcsr       1) (bpcsr      2) (tbr        3) (bpsr       4) | 
 |  | 
 |    (hsr0      16) (hsr1      17) (hsr2      18) (hsr3      19) | 
 |    (hsr4      20) (hsr5      21) (hsr6      22) (hsr7      23) | 
 |    (hsr8      24) (hsr9      25) (hsr10     26) (hsr11     27) | 
 |    (hsr12     28) (hsr13     29) (hsr14     30) (hsr15     31) | 
 |    (hsr16     32) (hsr17     33) (hsr18     34) (hsr19     35) | 
 |    (hsr20     36) (hsr21     37) (hsr22     38) (hsr23     39) | 
 |    (hsr24     40) (hsr25     41) (hsr26     42) (hsr27     43) | 
 |    (hsr28     44) (hsr29     45) (hsr30     46) (hsr31     47) | 
 |    (hsr32     48) (hsr33     49) (hsr34     50) (hsr35     51) | 
 |    (hsr36     52) (hsr37     53) (hsr38     54) (hsr39     55) | 
 |    (hsr40     56) (hsr41     57) (hsr42     58) (hsr43     59) | 
 |    (hsr44     60) (hsr45     61) (hsr46     62) (hsr47     63) | 
 |    (hsr48     64) (hsr49     65) (hsr50     66) (hsr51     67) | 
 |    (hsr52     68) (hsr53     69) (hsr54     70) (hsr55     71) | 
 |    (hsr56     72) (hsr57     73) (hsr58     74) (hsr59     75) | 
 |    (hsr60     76) (hsr61     77) (hsr62     78) (hsr63     79) | 
 |  | 
 |    (ccr      256) (cccr     263) (lr       272) (lcr      273) (iacc0h   280) (iacc0l   281) (isr      288) | 
 |  | 
 |    (neear0   352) (neear1   353) (neear2   354) (neear3   355) | 
 |    (neear4   356) (neear5   357) (neear6   358) (neear7   359) | 
 |    (neear8   360) (neear9   361) (neear10  362) (neear11  363) | 
 |    (neear12  364) (neear13  365) (neear14  366) (neear15  367) | 
 |    (neear16  368) (neear17  369) (neear18  370) (neear19  371) | 
 |    (neear20  372) (neear21  373) (neear22  374) (neear23  375) | 
 |    (neear24  376) (neear25  377) (neear26  378) (neear27  379) | 
 |    (neear28  380) (neear29  381) (neear30  382) (neear31  383) | 
 |  | 
 |    (nesr0    384) (nesr1    385) (nesr2    386) (nesr3    387) | 
 |    (nesr4    388) (nesr5    389) (nesr6    390) (nesr7    391) | 
 |    (nesr8    392) (nesr9    393) (nesr10   394) (nesr11   395) | 
 |    (nesr12   396) (nesr13   397) (nesr14   398) (nesr15   399) | 
 |    (nesr16   400) (nesr17   401) (nesr18   402) (nesr19   403) | 
 |    (nesr20   404) (nesr21   405) (nesr22   406) (nesr23   407) | 
 |    (nesr24   408) (nesr25   409) (nesr26   410) (nesr27   411) | 
 |    (nesr28   412) (nesr29   413) (nesr30   414) (nesr31   415) | 
 |  | 
 |    (necr     416) | 
 |  | 
 |    (gner0    432) (gner1    433) | 
 |  | 
 |    (fner0    434) (fner1    435) | 
 |  | 
 |    (epcr0    512) (epcr1    513) (epcr2    514) (epcr3    515) | 
 |    (epcr4    516) (epcr5    517) (epcr6    518) (epcr7    519) | 
 |    (epcr8    520) (epcr9    521) (epcr10   522) (epcr11   523) | 
 |    (epcr12   524) (epcr13   525) (epcr14   526) (epcr15   527) | 
 |    (epcr16   528) (epcr17   529) (epcr18   530) (epcr19   531) | 
 |    (epcr20   532) (epcr21   533) (epcr22   534) (epcr23   535) | 
 |    (epcr24   536) (epcr25   537) (epcr26   538) (epcr27   539) | 
 |    (epcr28   540) (epcr29   541) (epcr30   542) (epcr31   543) | 
 |    (epcr32   544) (epcr33   545) (epcr34   546) (epcr35   547) | 
 |    (epcr36   548) (epcr37   549) (epcr38   550) (epcr39   551) | 
 |    (epcr40   552) (epcr41   553) (epcr42   554) (epcr43   555) | 
 |    (epcr44   556) (epcr45   557) (epcr46   558) (epcr47   559) | 
 |    (epcr48   560) (epcr49   561) (epcr50   562) (epcr51   563) | 
 |    (epcr52   564) (epcr53   565) (epcr54   566) (epcr55   567) | 
 |    (epcr56   568) (epcr57   569) (epcr58   570) (epcr59   571) | 
 |    (epcr60   572) (epcr61   573) (epcr62   574) (epcr63   575) | 
 |  | 
 |    (esr0     576) (esr1     577) (esr2     578) (esr3     579) | 
 |    (esr4     580) (esr5     581) (esr6     582) (esr7     583) | 
 |    (esr8     584) (esr9     585) (esr10    586) (esr11    587) | 
 |    (esr12    588) (esr13    589) (esr14    590) (esr15    591) | 
 |    (esr16    592) (esr17    593) (esr18    594) (esr19    595) | 
 |    (esr20    596) (esr21    597) (esr22    598) (esr23    599) | 
 |    (esr24    600) (esr25    601) (esr26    602) (esr27    603) | 
 |    (esr28    604) (esr29    605) (esr30    606) (esr31    607) | 
 |    (esr32    608) (esr33    609) (esr34    610) (esr35    611) | 
 |    (esr36    612) (esr37    613) (esr38    614) (esr39    615) | 
 |    (esr40    616) (esr41    617) (esr42    618) (esr43    619) | 
 |    (esr44    620) (esr45    621) (esr46    622) (esr47    623) | 
 |    (esr48    624) (esr49    625) (esr50    626) (esr51    627) | 
 |    (esr52    628) (esr53    629) (esr54    630) (esr55    631) | 
 |    (esr56    632) (esr57    633) (esr58    634) (esr59    635) | 
 |    (esr60    636) (esr61    637) (esr62    638) (esr63    639) | 
 |  | 
 |    (eir0     640) (eir1     641) (eir2     642) (eir3     643) | 
 |    (eir4     644) (eir5     645) (eir6     646) (eir7     647) | 
 |    (eir8     648) (eir9     649) (eir10    650) (eir11    651) | 
 |    (eir12    652) (eir13    653) (eir14    654) (eir15    655) | 
 |    (eir16    656) (eir17    657) (eir18    658) (eir19    659) | 
 |    (eir20    660) (eir21    661) (eir22    662) (eir23    663) | 
 |    (eir24    664) (eir25    665) (eir26    666) (eir27    667) | 
 |    (eir28    668) (eir29    669) (eir30    670) (eir31    671) | 
 |  | 
 |    (esfr0    672) (esfr1    673) | 
 |  | 
 |    (sr0      768) (sr1      769) (sr2      770) (sr3      771)  | 
 |  | 
 |    (scr0     832) (scr1     833) (scr2     834) (scr3     835) | 
 |  | 
 |    (fsr0    1024) (fsr1    1025) (fsr2    1026) (fsr3    1027) | 
 |    (fsr4    1028) (fsr5    1029) (fsr6    1030) (fsr7    1031) | 
 |    (fsr8    1032) (fsr9    1033) (fsr10   1034) (fsr11   1035) | 
 |    (fsr12   1036) (fsr13   1037) (fsr14   1038) (fsr15   1039) | 
 |    (fsr16   1040) (fsr17   1041) (fsr18   1042) (fsr19   1043) | 
 |    (fsr20   1044) (fsr21   1045) (fsr22   1046) (fsr23   1047) | 
 |    (fsr24   1048) (fsr25   1049) (fsr26   1050) (fsr27   1051) | 
 |    (fsr28   1052) (fsr29   1053) (fsr30   1054) (fsr31   1055) | 
 |    (fsr32   1056) (fsr33   1057) (fsr34   1058) (fsr35   1059) | 
 |    (fsr36   1060) (fsr37   1061) (fsr38   1062) (fsr39   1063) | 
 |    (fsr40   1064) (fsr41   1065) (fsr42   1066) (fsr43   1067) | 
 |    (fsr44   1068) (fsr45   1069) (fsr46   1070) (fsr47   1071) | 
 |    (fsr48   1072) (fsr49   1073) (fsr50   1074) (fsr51   1075) | 
 |    (fsr52   1076) (fsr53   1077) (fsr54   1078) (fsr55   1079) | 
 |    (fsr56   1080) (fsr57   1081) (fsr58   1082) (fsr59   1083) | 
 |    (fsr60   1084) (fsr61   1085) (fsr62   1086) (fsr63   1087) | 
 |  | 
 |    ; FQ0-FQ31 are 64 bit registers. | 
 |    ; These names allow access to the upper 32 bits of the FQ registers. | 
 |    (fqop0   1088) (fqop1   1090) (fqop2   1092) (fqop3   1094)  | 
 |    (fqop4   1096) (fqop5   1098) (fqop6   1100) (fqop7   1102)  | 
 |    (fqop8   1104) (fqop9   1106) (fqop10  1108) (fqop11  1110)  | 
 |    (fqop12  1112) (fqop13  1114) (fqop14  1116) (fqop15  1118)  | 
 |    (fqop16  1120) (fqop17  1122) (fqop18  1124) (fqop19  1126)  | 
 |    (fqop20  1128) (fqop21  1130) (fqop22  1132) (fqop23  1134)  | 
 |    (fqop24  1136) (fqop25  1138) (fqop26  1140) (fqop27  1142)  | 
 |    (fqop28  1144) (fqop29  1146) (fqop30  1148) (fqop31  1150)  | 
 |    ; These names allow access to the lower 32 bits of the FQ registers. | 
 |    (fqst0   1089) (fqst1   1091) (fqst2   1093) (fqst3   1095)  | 
 |    (fqst4   1097) (fqst5   1099) (fqst6   1101) (fqst7   1103)  | 
 |    (fqst8   1105) (fqst9   1107) (fqst10  1109) (fqst11  1111)  | 
 |    (fqst12  1113) (fqst13  1115) (fqst14  1117) (fqst15  1119)  | 
 |    (fqst16  1121) (fqst17  1123) (fqst18  1125) (fqst19  1127)  | 
 |    (fqst20  1129) (fqst21  1131) (fqst22  1133) (fqst23  1135)  | 
 |    (fqst24  1137) (fqst25  1139) (fqst26  1141) (fqst27  1143)  | 
 |    (fqst28  1145) (fqst29  1147) (fqst30  1149) (fqst31  1151)  | 
 |    ; These also access the lower 32 bits of the FQ registers. | 
 |    ; These are not accessible as spr registers (see LSI appendix - section 13.4) | 
 | ;  (fq0     1089) (fq1     1091) (fq2     1093) (fq3     1095)  | 
 | ;  (fq4     1097) (fq5     1099) (fq6     1101) (fq7     1103)  | 
 | ;  (fq8     1105) (fq9     1107) (fq10    1109) (fq11    1111)  | 
 | ;  (fq12    1113) (fq13    1115) (fq14    1117) (fq15    1119)  | 
 | ;  (fq16    1121) (fq17    1123) (fq18    1125) (fq19    1127)  | 
 | ;  (fq20    1129) (fq21    1131) (fq22    1133) (fq23    1135)  | 
 | ;  (fq24    1137) (fq25    1139) (fq26    1141) (fq27    1143)  | 
 | ;  (fq28    1145) (fq29    1147) (fq30    1149) (fq31    1151)  | 
 |  | 
 |    (mcilr0  1272) (mcilr1  1273) | 
 |  | 
 |    (msr0    1280) (msr1    1281) (msr2    1282) (msr3    1283) | 
 |    (msr4    1284) (msr5    1285) (msr6    1286) (msr7    1287) | 
 |    (msr8    1288) (msr9    1289) (msr10   1290) (msr11   1291) | 
 |    (msr12   1292) (msr13   1293) (msr14   1294) (msr15   1295) | 
 |    (msr16   1296) (msr17   1297) (msr18   1298) (msr19   1299) | 
 |    (msr20   1300) (msr21   1301) (msr22   1302) (msr23   1303) | 
 |    (msr24   1304) (msr25   1305) (msr26   1306) (msr27   1307) | 
 |    (msr28   1308) (msr29   1309) (msr30   1310) (msr31   1311) | 
 |    (msr32   1312) (msr33   1313) (msr34   1314) (msr35   1315) | 
 |    (msr36   1316) (msr37   1317) (msr38   1318) (msr39   1319) | 
 |    (msr40   1320) (msr41   1321) (msr42   1322) (msr43   1323) | 
 |    (msr44   1324) (msr45   1325) (msr46   1326) (msr47   1327) | 
 |    (msr48   1328) (msr49   1329) (msr50   1330) (msr51   1331) | 
 |    (msr52   1332) (msr53   1333) (msr54   1334) (msr55   1335) | 
 |    (msr56   1336) (msr57   1337) (msr58   1338) (msr59   1339) | 
 |    (msr60   1340) (msr61   1341) (msr62   1342) (msr63   1343) | 
 |  | 
 |    ; MQ0-MQ31 are 64 bit registers. | 
 |    ; These names allow access to the upper 32 bits of the MQ registers. | 
 |    (mqop0   1344) (mqop1   1346) (mqop2   1348) (mqop3   1350)  | 
 |    (mqop4   1352) (mqop5   1354) (mqop6   1356) (mqop7   1358)  | 
 |    (mqop8   1360) (mqop9   1362) (mqop10  1364) (mqop11  1366)  | 
 |    (mqop12  1368) (mqop13  1370) (mqop14  1372) (mqop15  1374)  | 
 |    (mqop16  1376) (mqop17  1378) (mqop18  1380) (mqop19  1382)  | 
 |    (mqop20  1384) (mqop21  1386) (mqop22  1388) (mqop23  1390)  | 
 |    (mqop24  1392) (mqop25  1394) (mqop26  1396) (mqop27  1398)  | 
 |    (mqop28  1400) (mqop29  1402) (mqop30  1404) (mqop31  1406)  | 
 |    ; These names allow access to the lower 32 bits of the MQ registers. | 
 |    (mqst0   1345) (mqst1   1347) (mqst2   1349) (mqst3   1351)  | 
 |    (mqst4   1353) (mqst5   1355) (mqst6   1357) (mqst7   1359)  | 
 |    (mqst8   1361) (mqst9   1363) (mqst10  1365) (mqst11  1367)  | 
 |    (mqst12  1369) (mqst13  1371) (mqst14  1373) (mqst15  1375)  | 
 |    (mqst16  1377) (mqst17  1379) (mqst18  1381) (mqst19  1383)  | 
 |    (mqst20  1385) (mqst21  1387) (mqst22  1389) (mqst23  1391)  | 
 |    (mqst24  1393) (mqst25  1395) (mqst26  1397) (mqst27  1399)  | 
 |    (mqst28  1401) (mqst29  1403) (mqst30  1405) (mqst31  1407)  | 
 |    ; These also access the lower 32 bits of the MQ registers. | 
 |    ; These are not accessible as spr registers (see LSI appendix - section 13.4) | 
 | ;  (mq0     1345) (mq1     1347) (mq2     1349) (mq3     1351)  | 
 | ;  (mq4     1353) (mq5     1355) (mq6     1357) (mq7     1359)  | 
 | ;  (mq8     1361) (mq9     1363) (mq10    1365) (mq11    1367)  | 
 | ;  (mq12    1369) (mq13    1371) (mq14    1373) (mq15    1375)  | 
 | ;  (mq16    1377) (mq17    1379) (mq18    1381) (mq19    1383)  | 
 | ;  (mq20    1385) (mq21    1387) (mq22    1389) (mq23    1391)  | 
 | ;  (mq24    1393) (mq25    1395) (mq26    1397) (mq27    1399)  | 
 | ;  (mq28    1401) (mq29    1403) (mq30    1405) (mq31    1407)  | 
 |  | 
 |    ; These are not accessible as spr registers (see LSI appendix - section 13.4) | 
 | ;  (acc0    1408) (acc1    1409) (acc2    1410) (acc3    1411) | 
 | ;  (acc4    1412) (acc5    1413) (acc6    1414) (acc7    1415) | 
 | ;  (acc8    1416) (acc9    1417) (acc10   1418) (acc11   1419) | 
 | ;  (acc12   1420) (acc13   1421) (acc14   1422) (acc15   1423) | 
 | ;  (acc16   1424) (acc17   1425) (acc18   1426) (acc19   1427) | 
 | ;  (acc20   1428) (acc21   1429) (acc22   1430) (acc23   1431) | 
 | ;  (acc24   1432) (acc25   1433) (acc26   1434) (acc27   1435) | 
 | ;  (acc28   1436) (acc29   1437) (acc30   1438) (acc31   1439) | 
 | ;  (acc32   1440) (acc33   1441) (acc34   1442) (acc35   1443) | 
 | ;  (acc36   1444) (acc37   1445) (acc38   1446) (acc39   1447) | 
 | ;  (acc40   1448) (acc41   1449) (acc42   1450) (acc43   1451) | 
 | ;  (acc44   1452) (acc45   1453) (acc46   1454) (acc47   1455) | 
 | ;  (acc48   1456) (acc49   1457) (acc50   1458) (acc51   1459) | 
 | ;  (acc52   1460) (acc53   1461) (acc54   1462) (acc55   1463) | 
 | ;  (acc56   1464) (acc57   1465) (acc58   1466) (acc59   1467) | 
 | ;  (acc60   1468) (acc61   1469) (acc62   1470) (acc63   1471) | 
 |  | 
 | ;  (accg0   1472) (accg1   1473) (accg2   1474) (accg3   1475) | 
 | ;  (accg4   1476) (accg5   1477) (accg6   1478) (accg7   1479) | 
 | ;  (accg8   1480) (accg9   1481) (accg10  1482) (accg11  1483) | 
 | ;  (accg12  1484) (accg13  1485) (accg14  1486) (accg15  1487) | 
 | ;  (accg16  1488) (accg17  1489) (accg18  1490) (accg19  1491) | 
 | ;  (accg20  1492) (accg21  1493) (accg22  1494) (accg23  1495) | 
 | ;  (accg24  1496) (accg25  1497) (accg26  1498) (accg27  1499) | 
 | ;  (accg28  1500) (accg29  1501) (accg30  1502) (accg31  1503) | 
 | ;  (accg32  1504) (accg33  1505) (accg34  1506) (accg35  1507) | 
 | ;  (accg36  1508) (accg37  1509) (accg38  1510) (accg39  1511) | 
 | ;  (accg40  1512) (accg41  1513) (accg42  1514) (accg43  1515) | 
 | ;  (accg44  1516) (accg45  1517) (accg46  1518) (accg47  1519) | 
 | ;  (accg48  1520) (accg49  1521) (accg50  1522) (accg51  1523) | 
 | ;  (accg52  1524) (accg53  1525) (accg54  1526) (accg55  1527) | 
 | ;  (accg56  1528) (accg57  1529) (accg58  1530) (accg59  1531) | 
 | ;  (accg60  1532) (accg61  1533) (accg62  1534) (accg63  1535) | 
 |  | 
 |    (ear0    1536) (ear1    1537) (ear2    1538) (ear3    1539) | 
 |    (ear4    1540) (ear5    1541) (ear6    1542) (ear7    1543) | 
 |    (ear8    1544) (ear9    1545) (ear10   1546) (ear11   1547) | 
 |    (ear12   1548) (ear13   1549) (ear14   1550) (ear15   1551) | 
 |    (ear16   1552) (ear17   1553) (ear18   1554) (ear19   1555) | 
 |    (ear20   1556) (ear21   1557) (ear22   1558) (ear23   1559) | 
 |    (ear24   1560) (ear25   1561) (ear26   1562) (ear27   1563) | 
 |    (ear28   1564) (ear29   1565) (ear30   1566) (ear31   1567) | 
 |    (ear32   1568) (ear33   1569) (ear34   1570) (ear35   1571) | 
 |    (ear36   1572) (ear37   1573) (ear38   1574) (ear39   1575) | 
 |    (ear40   1576) (ear41   1577) (ear42   1578) (ear43   1579) | 
 |    (ear44   1580) (ear45   1581) (ear46   1582) (ear47   1583) | 
 |    (ear48   1584) (ear49   1585) (ear50   1586) (ear51   1587) | 
 |    (ear52   1588) (ear53   1589) (ear54   1590) (ear55   1591) | 
 |    (ear56   1592) (ear57   1593) (ear58   1594) (ear59   1595) | 
 |    (ear60   1596) (ear61   1597) (ear62   1598) (ear63   1599) | 
 |  | 
 |    (edr0    1600) (edr1    1601) (edr2    1602) (edr3    1603) | 
 |    (edr4    1604) (edr5    1605) (edr6    1606) (edr7    1607) | 
 |    (edr8    1608) (edr9    1609) (edr10   1610) (edr11   1611) | 
 |    (edr12   1612) (edr13   1613) (edr14   1614) (edr15   1615) | 
 |    (edr16   1616) (edr17   1617) (edr18   1618) (edr19   1619) | 
 |    (edr20   1620) (edr21   1621) (edr22   1622) (edr23   1623) | 
 |    (edr24   1624) (edr25   1625) (edr26   1626) (edr27   1627) | 
 |    (edr28   1628) (edr29   1629) (edr30   1630) (edr31   1631) | 
 |    (edr32   1632) (edr33   1636) (edr34   1634) (edr35   1635) | 
 |    (edr36   1636) (edr37   1637) (edr38   1638) (edr39   1639) | 
 |    (edr40   1640) (edr41   1641) (edr42   1642) (edr43   1643) | 
 |    (edr44   1644) (edr45   1645) (edr46   1646) (edr47   1647) | 
 |    (edr48   1648) (edr49   1649) (edr50   1650) (edr51   1651) | 
 |    (edr52   1652) (edr53   1653) (edr54   1654) (edr55   1655) | 
 |    (edr56   1656) (edr57   1657) (edr58   1658) (edr59   1659) | 
 |    (edr60   1660) (edr61   1661) (edr62   1662) (edr63   1663) | 
 |  | 
 |    (iamlr0  1664) (iamlr1  1665) (iamlr2  1666) (iamlr3  1667) | 
 |    (iamlr4  1668) (iamlr5  1669) (iamlr6  1670) (iamlr7  1671) | 
 |    (iamlr8  1672) (iamlr9  1673) (iamlr10 1674) (iamlr11 1675) | 
 |    (iamlr12 1676) (iamlr13 1677) (iamlr14 1678) (iamlr15 1679) | 
 |    (iamlr16 1680) (iamlr17 1681) (iamlr18 1682) (iamlr19 1683) | 
 |    (iamlr20 1684) (iamlr21 1685) (iamlr22 1686) (iamlr23 1687) | 
 |    (iamlr24 1688) (iamlr25 1689) (iamlr26 1690) (iamlr27 1691) | 
 |    (iamlr28 1692) (iamlr29 1693) (iamlr30 1694) (iamlr31 1695) | 
 |    (iamlr32 1696) (iamlr33 1697) (iamlr34 1698) (iamlr35 1699) | 
 |    (iamlr36 1700) (iamlr37 1701) (iamlr38 1702) (iamlr39 1703) | 
 |    (iamlr40 1704) (iamlr41 1705) (iamlr42 1706) (iamlr43 1707) | 
 |    (iamlr44 1708) (iamlr45 1709) (iamlr46 1710) (iamlr47 1711) | 
 |    (iamlr48 1712) (iamlr49 1713) (iamlr50 1714) (iamlr51 1715) | 
 |    (iamlr52 1716) (iamlr53 1717) (iamlr54 1718) (iamlr55 1719) | 
 |    (iamlr56 1720) (iamlr57 1721) (iamlr58 1722) (iamlr59 1723) | 
 |    (iamlr60 1724) (iamlr61 1725) (iamlr62 1726) (iamlr63 1727) | 
 |  | 
 |    (iampr0  1728) (iampr1  1729) (iampr2  1730) (iampr3  1731) | 
 |    (iampr4  1732) (iampr5  1733) (iampr6  1734) (iampr7  1735) | 
 |    (iampr8  1736) (iampr9  1737) (iampr10 1738) (iampr11 1739) | 
 |    (iampr12 1740) (iampr13 1741) (iampr14 1742) (iampr15 1743) | 
 |    (iampr16 1744) (iampr17 1745) (iampr18 1746) (iampr19 1747) | 
 |    (iampr20 1748) (iampr21 1749) (iampr22 1750) (iampr23 1751) | 
 |    (iampr24 1752) (iampr25 1753) (iampr26 1754) (iampr27 1755) | 
 |    (iampr28 1756) (iampr29 1757) (iampr30 1758) (iampr31 1759) | 
 |    (iampr32 1760) (iampr33 1761) (iampr34 1762) (iampr35 1763) | 
 |    (iampr36 1764) (iampr37 1765) (iampr38 1766) (iampr39 1767) | 
 |    (iampr40 1768) (iampr41 1769) (iampr42 1770) (iampr43 1771) | 
 |    (iampr44 1772) (iampr45 1773) (iampr46 1774) (iampr47 1775) | 
 |    (iampr48 1776) (iampr49 1777) (iampr50 1778) (iampr51 1779) | 
 |    (iampr52 1780) (iampr53 1781) (iampr54 1782) (iampr55 1783) | 
 |    (iampr56 1784) (iampr57 1785) (iampr58 1786) (iampr59 1787) | 
 |    (iampr60 1788) (iampr61 1789) (iampr62 1790) (iampr63 1791) | 
 |  | 
 |    (damlr0  1792) (damlr1  1793) (damlr2  1794) (damlr3  1795) | 
 |    (damlr4  1796) (damlr5  1797) (damlr6  1798) (damlr7  1799) | 
 |    (damlr8  1800) (damlr9  1801) (damlr10 1802) (damlr11 1803) | 
 |    (damlr12 1804) (damlr13 1805) (damlr14 1806) (damlr15 1807) | 
 |    (damlr16 1808) (damlr17 1809) (damlr18 1810) (damlr19 1811) | 
 |    (damlr20 1812) (damlr21 1813) (damlr22 1814) (damlr23 1815) | 
 |    (damlr24 1816) (damlr25 1817) (damlr26 1818) (damlr27 1819) | 
 |    (damlr28 1820) (damlr29 1821) (damlr30 1822) (damlr31 1823) | 
 |    (damlr32 1824) (damlr33 1825) (damlr34 1826) (damlr35 1827) | 
 |    (damlr36 1828) (damlr37 1829) (damlr38 1830) (damlr39 1831) | 
 |    (damlr40 1832) (damlr41 1833) (damlr42 1834) (damlr43 1835) | 
 |    (damlr44 1836) (damlr45 1837) (damlr46 1838) (damlr47 1839) | 
 |    (damlr48 1840) (damlr49 1841) (damlr50 1842) (damlr51 1843) | 
 |    (damlr52 1844) (damlr53 1845) (damlr54 1846) (damlr55 1847) | 
 |    (damlr56 1848) (damlr57 1849) (damlr58 1850) (damlr59 1851) | 
 |    (damlr60 1852) (damlr61 1853) (damlr62 1854) (damlr63 1855) | 
 |  | 
 |    (dampr0  1856) (dampr1  1857) (dampr2  1858) (dampr3  1859) | 
 |    (dampr4  1860) (dampr5  1861) (dampr6  1862) (dampr7  1863) | 
 |    (dampr8  1864) (dampr9  1865) (dampr10 1866) (dampr11 1867) | 
 |    (dampr12 1868) (dampr13 1869) (dampr14 1870) (dampr15 1871) | 
 |    (dampr16 1872) (dampr17 1873) (dampr18 1874) (dampr19 1875) | 
 |    (dampr20 1876) (dampr21 1877) (dampr22 1878) (dampr23 1879) | 
 |    (dampr24 1880) (dampr25 1881) (dampr26 1882) (dampr27 1883) | 
 |    (dampr28 1884) (dampr29 1885) (dampr30 1886) (dampr31 1887) | 
 |    (dampr32 1888) (dampr33 1889) (dampr34 1890) (dampr35 1891) | 
 |    (dampr36 1892) (dampr37 1893) (dampr38 1894) (dampr39 1895) | 
 |    (dampr40 1896) (dampr41 1897) (dampr42 1898) (dampr43 1899) | 
 |    (dampr44 1900) (dampr45 1901) (dampr46 1902) (dampr47 1903) | 
 |    (dampr48 1904) (dampr49 1905) (dampr50 1906) (dampr51 1907) | 
 |    (dampr52 1908) (dampr53 1909) (dampr54 1910) (dampr55 1911) | 
 |    (dampr56 1912) (dampr57 1913) (dampr58 1914) (dampr59 1915) | 
 |    (dampr60 1916) (dampr61 1917) (dampr62 1918) (dampr63 1919) | 
 |  | 
 |    (amcr    1920) (stbar   1921) (mmcr    1922) | 
 |    (iamvr1  1925) (damvr1  1927) | 
 |    (cxnr    1936) (ttbr    1937) (tplr    1938) (tppr    1939) | 
 |    (tpxr    1940) | 
 |    (timerh  1952) (timerl  1953) (timerd  1954) | 
 |    (dcr     2048) (brr     2049) (nmar    2050) (btbr    2051) | 
 |  | 
 |    (ibar0   2052) (ibar1   2053) (ibar2   2054) (ibar3   2055) | 
 |    (dbar0   2056) (dbar1   2057) (dbar2   2058) (dbar3   2059) | 
 |  | 
 |    (dbdr00  2060) (dbdr01  2061) (dbdr02  2062) (dbdr03  2063) | 
 |    (dbdr10  2064) (dbdr11  2065) (dbdr12  2066) (dbdr13  2067) | 
 |    (dbdr20  2068) (dbdr21  2069) (dbdr22  2070) (dbdr23  2071) | 
 |    (dbdr30  2072) (dbdr31  2073) (dbdr32  2074) (dbdr33  2075) | 
 |  | 
 |    (dbmr00  2076) (dbmr01  2077) (dbmr02  2078) (dbmr03  2079) | 
 |    (dbmr10  2080) (dbmr11  2081) (dbmr12  2082) (dbmr13  2083) | 
 |    (dbmr20  2084) (dbmr21  2085) (dbmr22  2086) (dbmr23  2087) | 
 |    (dbmr30  2088) (dbmr31  2089) (dbmr32  2090) (dbmr33  2091) | 
 |  | 
 |    (cpcfr   2304) (cpcr    2305) (cpsr    2306) (cptr    2307) | 
 |    (cphsr0  2308) (cphsr1  2309) (cpesr0  2320) (cpesr1  2321) | 
 |    (cpemr0  2322) (cpemr1  2323)  | 
 |  | 
 |    (iperr0  2324) (iperr1  2325) (ipjsr   2326) (ipjrr   2327) | 
 |    (ipcsr0  2336) (ipcsr1  2337) (ipcwer0 2338) (ipcwer1 2339) | 
 |    (ipcwr   2340) | 
 |  | 
 |    (mbhsr   2352) (mbssr   2353) (mbrsr   2354) (mbsdr   2355) | 
 |    (mbrdr   2356) (mbsmr   2357) (mbstr0  2359) (mbstr1  2360) | 
 |  | 
 |    (slpr    2368) (sldr    2369) (slhsr   2370) (sltr    2371) | 
 |    (slwr    2372) | 
 |  | 
 |    (ihsr8   3848) (ihsr9   3849) (ihsr10  3850) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-spr) | 
 |   (comment "special purpose registers") | 
 |   (attrs PROFILE) | 
 |   (type register UWI (4096)) | 
 |   (indices extern-keyword spr-names) | 
 |   (get (index) (c-call UWI "@cpu@_h_spr_get_handler" index)) | 
 |   (set (index newval) (c-call VOID "@cpu@_h_spr_set_handler" index newval)) | 
 | ) | 
 |  | 
 | (define-pmacro (spr-pcsr)  (reg h-spr   1)) | 
 | (define-pmacro (spr-bpcsr) (reg h-spr   2)) | 
 | (define-pmacro (spr-lr)    (reg h-spr 272)) | 
 | (define-pmacro (spr-lcr)   (reg h-spr 273)) | 
 | (define-pmacro (spr-iacc0h) (reg h-spr 280)) | 
 | (define-pmacro (spr-iacc0l) (reg h-spr 281)) | 
 | (define-pmacro (spr-sr0)   (reg h-spr 768)) | 
 | (define-pmacro (spr-sr1)   (reg h-spr 769)) | 
 | (define-pmacro (spr-sr2)   (reg h-spr 770)) | 
 | (define-pmacro (spr-sr3)   (reg h-spr 771)) | 
 |  | 
 | ; Accumulator guard. Actually a subset of the SPR registers, but those SPRs | 
 | ; are read-only in most insns. This hardware element is used by those insns | 
 | ; which have direct access (mwtaccg, mrdaccg). | 
 | (define-keyword | 
 |   (name accg-names) | 
 |   (print-name h-accg) | 
 |   (prefix "") | 
 |   (values | 
 |    (accg0   0)(accg1   1)(accg2   2)(accg3   3) | 
 |    (accg4   4)(accg5   5)(accg6   6)(accg7   7) | 
 |    (accg8   8)(accg9   9)(accg10 10)(accg11 11) | 
 |    (accg12 12)(accg13 13)(accg14 14)(accg15 15) | 
 |    (accg16 16)(accg17 17)(accg18 18)(accg19 19) | 
 |    (accg20 20)(accg21 21)(accg22 22)(accg23 23) | 
 |    (accg24 24)(accg25 25)(accg26 26)(accg27 27) | 
 |    (accg28 28)(accg29 29)(accg30 30)(accg31 31) | 
 |    (accg32 32)(accg33 33)(accg34 34)(accg35 35) | 
 |    (accg36 36)(accg37 37)(accg38 38)(accg39 39) | 
 |    (accg40 40)(accg41 41)(accg42 42)(accg43 43) | 
 |    (accg44 44)(accg45 45)(accg46 46)(accg47 47) | 
 |    (accg48 48)(accg49 49)(accg50 50)(accg51 51) | 
 |    (accg52 52)(accg53 53)(accg54 54)(accg55 55) | 
 |    (accg56 56)(accg57 57)(accg58 58)(accg59 59) | 
 |    (accg60 60)(accg61 61)(accg62 62)(accg63 63) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-accg) | 
 |   (comment "accumulator guard") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UWI (64)) | 
 |   (indices extern-keyword accg-names) | 
 |   (get (index) | 
 |        (and (reg h-spr (add index 1472)) #xff)) | 
 |   (set (index newval) | 
 |        (set (raw-reg UWI h-spr (add index 1472)) (and newval #xff))) | 
 | ) | 
 |  | 
 | ; 40 bit accumulator. Composed of ACCG and ACC registers concatenated, but | 
 | ; referenced more often as the composed 40 bits. | 
 | (define-keyword | 
 |   (name acc-names) | 
 |   (print-name h-acc40) | 
 |   (prefix "") | 
 |   (values | 
 | (acc0   0)(acc1   1)(acc2   2)(acc3   3)(acc4   4)(acc5   5)(acc6   6)(acc7   7) | 
 | (acc8   8)(acc9   9)(acc10 10)(acc11 11)(acc12 12)(acc13 13)(acc14 14)(acc15 15) | 
 | (acc16 16)(acc17 17)(acc18 18)(acc19 19)(acc20 20)(acc21 21)(acc22 22)(acc23 23) | 
 | (acc24 24)(acc25 25)(acc26 26)(acc27 27)(acc28 28)(acc29 29)(acc30 30)(acc31 31) | 
 | (acc32 32)(acc33 33)(acc34 34)(acc35 35)(acc36 36)(acc37 37)(acc38 38)(acc39 39) | 
 | (acc40 40)(acc41 41)(acc42 42)(acc43 43)(acc44 44)(acc45 45)(acc46 46)(acc47 47) | 
 | (acc48 48)(acc49 49)(acc50 50)(acc51 51)(acc52 52)(acc53 53)(acc54 54)(acc55 55) | 
 | (acc56 56)(acc57 57)(acc58 58)(acc59 59)(acc60 60)(acc61 61)(acc62 62)(acc63 63) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-acc40S) | 
 |   (comment "40 bit signed accumulator") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register DI (64)) | 
 |   (indices extern-keyword acc-names) | 
 |   ; The accumlator is made up of two 32 bit registers, accgi/acci. | 
 |   ; We want to extract this as a combined 40 signed bits | 
 |   (get (index) | 
 |        (or DI | 
 | 	   (sll  DI (ext DI (trunc QI (reg h-spr (add index 1472)))) | 
 | 		 32) | 
 | 	   (zext DI (reg h-spr (add index 1408))))) | 
 |   ; Bits 40-63 are not written. raw-reg is used to bypass read-only restrictions | 
 |   ; on ACC and ACCG registers | 
 |   (set (index newval) | 
 |        (sequence () | 
 | 		 (c-call VOID "frv_check_spr_write_access" (add index 1408)) | 
 | 		 (set (raw-reg UWI h-spr | 
 | 			       (add index 1472)) (and (srl newval 32) #xff)) | 
 | 		 (set (raw-reg UWI h-spr | 
 | 			       (add index 1408)) (trunc USI newval)))) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-acc40U) | 
 |   (comment "40 bit unsigned accumulator") | 
 |   (attrs PROFILE VIRTUAL) | 
 |   (type register UDI (64)) | 
 |   (indices extern-keyword acc-names) | 
 |   ; The accumlator is made up of two 32 bit registers, accgi/acci. | 
 |   ; We want to extract this as a combined 40 unsigned bits | 
 |   (get (index) | 
 |        (or DI | 
 | 	   (sll  DI (zext DI (reg h-spr (add index 1472))) 32) | 
 | 	   (zext DI (reg h-spr (add index 1408))))) | 
 |   ; Bits 40-63 are not written. raw-reg is used to bypass read-only restrictions | 
 |   ; on ACC and ACCG registers | 
 |   (set (index newval) | 
 |        (sequence () | 
 | 		 (c-call VOID "frv_check_spr_write_access" (add index 1408)) | 
 | 		 (set (raw-reg UWI h-spr | 
 | 			       (add index 1472)) (and (srl newval 32) #xff)) | 
 | 		 (set (raw-reg UWI h-spr | 
 | 			       (add index 1408)) (trunc USI newval)))) | 
 | ) | 
 | ; 64-bit signed accumulator.  Composed of iacc0h and iacc0l registers | 
 | ; concatenated, but referenced more often as the composed 64 bits. | 
 | (define-keyword | 
 |   ; This is totally hokey -- I have to have an index! | 
 |   (name iacc0-names) | 
 |   (print-name h-iacc0) | 
 |   (prefix "") | 
 |   (values (iacc0 0)) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-iacc0) | 
 |   (comment "64 bit signed accumulator") | 
 |   (attrs PROFILE VIRTUAL (MACH fr400,fr450)) | 
 |   (type register DI (1)) | 
 |   (indices extern-keyword iacc0-names) | 
 |   ; The single 64-bit integer accumulator is made up of two 32 bit | 
 |   ; registers, iacc0h and iacc0l.  We want to extract this as a | 
 |   ; combined 64 signed bits. | 
 |   (get (idx) (or DI (sll DI (ext DI (spr-iacc0h)) 32) (zext DI (spr-iacc0l)))) | 
 |   (set (idx newval) | 
 |        (sequence () | 
 | 		 (set (spr-iacc0h) (trunc SI (srl newval 32))) | 
 | 		 (set (spr-iacc0l) (trunc SI newval)))) | 
 | ) | 
 |  | 
 | ; Integer condition code registers (CCR) | 
 | ; | 
 | ; The individual sub registers bits of the CCR are referenced more often than | 
 | ; the entire register so set them directly. We can assemble the | 
 | ; entire register when necessary. | 
 | ; | 
 | (define-keyword | 
 |   (name iccr-names) | 
 |   (print-name h-iccr) | 
 |   (prefix "") | 
 |   (values (icc0 0) (icc1 1) (icc2 2) (icc3 3)) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-iccr) | 
 |   (comment "Integer condition code registers") | 
 |   (attrs PROFILE) | 
 |   (type register UQI (4)) | 
 |   (indices extern-keyword iccr-names) | 
 | ) | 
 |  | 
 | ; Floating point condition code registers (CCR) | 
 | ; | 
 | ; The individual sub registers bits of the CCR are referenced more often than | 
 | ; the entire register so set them directly. We can assemble the | 
 | ; entire register when necessary. | 
 | ; | 
 | (define-keyword | 
 |   (name fccr-names) | 
 |   (print-name h-fccr) | 
 |   (prefix "") | 
 |   (values (fcc0 0) (fcc1 1) (fcc2 2) (fcc3 3)) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-fccr) | 
 |   (comment "Floating point condition code registers") | 
 |   (attrs PROFILE) | 
 |   (type register UQI (4)) | 
 |   (indices extern-keyword fccr-names) | 
 | ) | 
 |  | 
 | ; C condition code registers (CCCR) | 
 | ; | 
 | (define-keyword | 
 |   (name cccr-names) | 
 |   (print-name h-cccr) | 
 |   (prefix "") | 
 |   (values (cc0 0) (cc1 1) (cc2 2) (cc3 3) (cc4 4) (cc5 5) (cc6 6) (cc7 7)) | 
 | ) | 
 |  | 
 | (define-hardware | 
 |   (name h-cccr) | 
 |   (comment "Condition code registers") | 
 |   (attrs PROFILE) | 
 |   (type register UQI (8)) | 
 |   (indices extern-keyword cccr-names) | 
 | ) | 
 |  | 
 | ; Dummy hardware used to define packing bit on insns | 
 | ; | 
 | (define-hardware | 
 |   (name h-pack) | 
 |   (comment "Packing bit dummy hardware") | 
 |   (type immediate (UINT 1)) | 
 |   (values keyword "" (("" 1) (".p" 0) (".P" 0))) | 
 | ) | 
 | ; Dummy hardware used to define hint field for branches always taken | 
 | ; | 
 | (define-hardware | 
 |   (name h-hint-taken) | 
 |   (comment "Branch taken hint dummy hardware") | 
 |   (type immediate (UINT 1)) | 
 |   ; The order of these is important. We want '2' to get written by default, | 
 |   ; but we also want the docoder/disassembler to allow the values '0', '1' and | 
 |   ; '3'. | 
 |   (values keyword "" (("" 2) ("" 0) ("" 1) ("" 3))) | 
 | ) | 
 | ; Dummy hardware used to define hint field for branches never taken | 
 | ; | 
 | (define-hardware | 
 |   (name h-hint-not-taken) | 
 |   (comment "Branch not taken hint dummy hardware") | 
 |   (type immediate (UINT 1)) | 
 |   ; The order of these is important. We want '0' to get written by default, | 
 |   ; but we also want the docoder/disassembler to allow the values '1', '2' and | 
 |   ; '3'. | 
 |   (values keyword "" (("" 0) ("" 1) ("" 2) ("" 3))) | 
 | ) | 
 |  | 
 | ; Instruction Operands. | 
 | ; These entries provide a layer between the assembler and the raw hardware | 
 | ; description, and are used to refer to hardware elements in the semantic | 
 | ; code.  Usually there's a bit of over-specification, but in more complicated | 
 | ; instruction sets there isn't. | 
 |  | 
 | ; FRV specific operand attributes: | 
 |  | 
 | (define-attr | 
 |   (for operand) | 
 |   (type boolean) | 
 |   (name HASH-PREFIX) | 
 |   (comment "immediates have an optional '#' prefix") | 
 | ) | 
 |  | 
 | ; ??? Convention says this should be o-sr, but then the insn definitions | 
 | ; should refer to o-sr which is clumsy.  The "o-" could be implicit, but | 
 | ; then it should be implicit for all the symbols here, but then there would | 
 | ; be confusion between (f-)simm8 and (h-)simm8. | 
 | ; So for now the rule is exactly as it appears here. | 
 |  | 
 | ; dnmop: define-normal-mode-operand: temporary, pending potential removal | 
 | ; of modes from h/w. | 
 | (define-pmacro (dnmop xname xcomment xattrs xtype xindex xmode) | 
 |   (define-operand | 
 |     (name xname) | 
 |     (comment xcomment) | 
 |     (.splice attrs (.unsplice xattrs)) | 
 |     (type xtype) | 
 |     (index xindex) | 
 |     (mode xmode) | 
 |     ) | 
 | ) | 
 |  | 
 | ; dnpmop: define-normal-parsed-mode-operand: Normal mode operand with parse handler | 
 | (define-pmacro (dnpmop xname xcomment xattrs xtype xindex xmode xparse) | 
 |   (define-operand | 
 |     (name xname) | 
 |     (comment xcomment) | 
 |     (.splice attrs (.unsplice xattrs)) | 
 |     (type xtype) | 
 |     (index xindex) | 
 |     (mode xmode) | 
 |     (handlers (parse xparse)) | 
 |     ) | 
 | ) | 
 |  | 
 | (dnop  pack "packing bit" () h-pack f-pack) | 
 |  | 
 | (dnmop GRi        "source register 1"      () h-gr        f-GRi  SI) | 
 | (dnmop GRj        "source register 2"      () h-gr        f-GRj  SI) | 
 | (dnmop GRk        "destination register"   () h-gr        f-GRk  SI) | 
 | (dnmop GRkhi      "destination register"   () h-gr_hi     f-GRk  UHI) | 
 | (dnmop GRklo      "destination register"   () h-gr_lo     f-GRk  UHI) | 
 | (dnpmop GRdoublek "destination register"   () h-gr_double f-GRk  DI "even_register") | 
 | (dnmop ACC40Si    "signed accumulator"     () h-acc40S    f-ACC40Si DI) | 
 | (dnmop ACC40Ui    "unsigned accumulator"   () h-acc40U    f-ACC40Ui UDI) | 
 | (dnmop ACC40Sk    "target accumulator"     () h-acc40S    f-ACC40Sk DI) | 
 | (dnmop ACC40Uk    "target accumulator"     () h-acc40U    f-ACC40Uk UDI) | 
 | (dnmop ACCGi      "source register"        () h-accg      f-ACCGi   UWI) | 
 | (dnmop ACCGk      "target register"        () h-accg      f-ACCGk   UWI) | 
 |  | 
 | (dnmop CPRi       "source register"        ((MACH frv)) h-cpr        f-CPRi SI) | 
 | (dnmop CPRj       "source register"        ((MACH frv)) h-cpr        f-CPRj SI) | 
 | (dnmop CPRk       "destination register"   ((MACH frv)) h-cpr        f-CPRk SI) | 
 | (dnpmop CPRdoublek "destination register"  ((MACH frv)) h-cpr_double f-CPRk DI "even_register") | 
 |  | 
 | ; floating point operands | 
 | (dnmop FRinti    "source register 1"      () h-fr_int    f-FRi SI) | 
 | (dnmop FRintj    "source register 2"      () h-fr_int    f-FRj SI) | 
 | (dnmop FRintk    "target register"        () h-fr_int    f-FRk SI) | 
 | (dnmop FRi       "source register 1"      () h-fr        f-FRi SF) | 
 | (dnmop FRj       "source register 2"      () h-fr        f-FRj SF) | 
 | (dnmop FRk       "destination register"   () h-fr        f-FRk SF) | 
 | (dnmop FRkhi     "destination register"   () h-fr_hi     f-FRk UHI) | 
 | (dnmop FRklo     "destination register"   () h-fr_lo     f-FRk UHI) | 
 | (dnpmop FRdoublei "source register 1"     () h-fr_double f-FRi DF "even_register") | 
 | (dnpmop FRdoublej "source register 2"     () h-fr_double f-FRj DF "even_register") | 
 | (dnpmop FRdoublek "target register"       () h-fr_double f-FRk DF "even_register") | 
 |  | 
 | (dnop CRi       "source register 1"       () h-cccr f-CRi) | 
 | (dnop CRj       "source register 2"       () h-cccr f-CRj) | 
 | (dnop CRj_int   "destination register"    () h-cccr f-CRj_int) | 
 | (dnop CRj_float "destination register"    () h-cccr f-CRj_float) | 
 | (dnop CRk       "destination register"    () h-cccr f-CRk) | 
 | (dnop CCi       "condition   register"    () h-cccr f-CCi) | 
 |  | 
 | (dnop ICCi_1  "condition   register"      () h-iccr f-ICCi_1) | 
 | (dnop ICCi_2  "condition   register"      () h-iccr f-ICCi_2) | 
 | (dnop ICCi_3  "condition   register"      () h-iccr f-ICCi_3) | 
 | (dnop FCCi_1  "condition   register"      () h-fccr f-FCCi_1) | 
 | (dnop FCCi_2  "condition   register"      () h-fccr f-FCCi_2) | 
 | (dnop FCCi_3  "condition   register"      () h-fccr f-FCCi_3) | 
 | (dnop FCCk    "condition   register"      () h-fccr f-FCCk) | 
 |  | 
 | (dnop eir     "exception insn reg"        () h-uint f-eir) | 
 | (dnop s10     "10 bit signed immediate"   (HASH-PREFIX) h-sint f-s10) | 
 | (dnop u16     "16 bit unsigned immediate" (HASH-PREFIX) h-uint f-u16) | 
 | (dnop s16     "16 bit signed   immediate" (HASH-PREFIX) h-sint f-s16) | 
 | (dnop s6      "6  bit signed   immediate" (HASH-PREFIX) h-sint f-s6) | 
 | (dnop s6_1    "6  bit signed   immediate" (HASH-PREFIX) h-sint f-s6_1) | 
 | (dnop u6      "6  bit unsigned immediate" (HASH-PREFIX) h-uint f-u6) | 
 | (dnop s5      "5  bit signed   immediate" (HASH-PREFIX) h-sint f-s5) | 
 | (dnop cond    "conditional arithmetic"    (HASH-PREFIX) h-uint f-cond) | 
 | (dnop ccond   "lr branch condition"       (HASH-PREFIX) h-uint f-ccond) | 
 | (dnop hint    "2 bit branch predictor"    (HASH-PREFIX) h-uint f-hint) | 
 | (dnop hint_taken "2 bit branch predictor"     () h-hint-taken     f-hint) | 
 | (dnop hint_not_taken "2 bit branch predictor" () h-hint-not-taken f-hint) | 
 |  | 
 | (dnop LI      "link indicator"            () h-uint f-LI) | 
 | (dnop lock    "cache lock indicator"      (HASH-PREFIX) h-uint f-lock) | 
 | (dnop debug   "debug mode indicator"      (HASH-PREFIX) h-uint f-debug) | 
 | (dnop ae      "all entries indicator"     (HASH-PREFIX) h-uint f-ae) | 
 |  | 
 | (dnop label16  "18 bit pc relative address" () h-iaddr f-label16) | 
 |  | 
 | (dnop LRAE "Load Real Address E flag" () h-uint f-LRAE) | 
 | (dnop LRAD "Load Real Address D flag" () h-uint f-LRAD) | 
 | (dnop LRAS "Load Real Address S flag" () h-uint f-LRAS) | 
 |  | 
 | (dnop TLBPRopx "TLB Probe operation number" () h-uint f-TLBPRopx) | 
 | (dnop TLBPRL   "TLB Probe L flag"           () h-uint f-TLBPRL) | 
 |  | 
 | (define-operand | 
 |   (name A0) | 
 |   (comment "A==0 operand of mclracc") | 
 |   (attrs) | 
 |   (type h-uint) | 
 |   (index f-A) | 
 |   (mode USI) | 
 |   (handlers (parse "A0")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name A1) | 
 |   (comment "A==1 operand of mclracc") | 
 |   (attrs) | 
 |   (type h-uint) | 
 |   (index f-A) | 
 |   (mode USI) | 
 |   (handlers (parse "A1")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name FRintieven) | 
 |   (comment "(even) source register 1") | 
 |   (attrs) | 
 |   (type h-fr_int) | 
 |   (index f-FRi) | 
 |   (mode SI) | 
 |   (handlers (parse "even_register")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name FRintjeven) | 
 |   (comment "(even) source register 2") | 
 |   (attrs) | 
 |   (type h-fr_int) | 
 |   (index f-FRj) | 
 |   (mode SI) | 
 |   (handlers (parse "even_register")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name FRintkeven) | 
 |   (comment "(even) target register") | 
 |   (attrs) | 
 |   (type h-fr_int) | 
 |   (index f-FRk) | 
 |   (mode SI) | 
 |   (handlers (parse "even_register")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name d12) | 
 |   (comment "12 bit signed immediate") | 
 |   (attrs) | 
 |   (type h-sint) | 
 |   (index f-d12) | 
 |   (handlers (parse "d12")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name s12) | 
 |   (comment "12 bit signed immediate") | 
 |   (attrs HASH-PREFIX) | 
 |   (type h-sint) | 
 |   (index f-d12) | 
 |   (handlers (parse "s12")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name u12) | 
 |   (comment "12 bit signed immediate") | 
 |   (attrs HASH-PREFIX) | 
 |   (type h-sint) | 
 |   (index f-u12) | 
 |   (handlers (parse "u12")) | 
 | ) | 
 |  | 
 | (define-operand  | 
 |   (name spr) | 
 |   (comment "special purpose register") | 
 |   (attrs) | 
 |   (type  h-spr) | 
 |   (index f-spr) | 
 |   (handlers (parse "spr") (print "spr")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name ulo16) | 
 |   (comment "16 bit unsigned immediate, for #lo()") | 
 |   (attrs) | 
 |   (type h-uint) | 
 |   (index f-u16) | 
 |   (handlers (parse "ulo16") (print "lo")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name slo16) | 
 |   (comment "16 bit unsigned immediate, for #lo()") | 
 |   (attrs) | 
 |   (type h-sint) | 
 |   (index f-s16) | 
 |   (handlers (parse "uslo16") (print "lo")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name uhi16) | 
 |   (comment "16 bit unsigned immediate, for #hi()") | 
 |   (attrs) | 
 |   (type h-uint) | 
 |   (index f-u16) | 
 |   (handlers (parse "uhi16") (print "hi")) | 
 | ) | 
 |  | 
 | (define-operand | 
 |   (name label24) | 
 |   (comment "26 bit pc relative address") | 
 |   (attrs) | 
 |   (type h-iaddr) | 
 |   (index f-label24) | 
 |   (mode SI) | 
 |   (handlers (parse "call_label")) | 
 | ) | 
 |  | 
 | ; operands representing hardware | 
 | ; | 
 | (dnop psr_esr "PSR.ESR bit" (SEM-ONLY) h-psr_esr f-nil) | 
 | (dnop psr_s   "PSR.S   bit" (SEM-ONLY) h-psr_s   f-nil) | 
 | (dnop psr_ps  "PSR.PS  bit" (SEM-ONLY) h-psr_ps  f-nil) | 
 | (dnop psr_et  "PSR.ET  bit" (SEM-ONLY) h-psr_et  f-nil) | 
 |  | 
 | (dnop bpsr_bs  "BPSR.BS  bit" (SEM-ONLY) h-bpsr_bs  f-nil) | 
 | (dnop bpsr_bet "BPSR.BET bit" (SEM-ONLY) h-bpsr_bet f-nil) | 
 |  | 
 | (dnop tbr_tba "TBR.TBA" (SEM-ONLY) h-tbr_tba f-nil) | 
 | (dnop tbr_tt  "TBR.TT"  (SEM-ONLY) h-tbr_tt  f-nil) | 
 |  | 
 | ; Null operands | 
 | ; | 
 | (define-pmacro (ICCi_1-null)  (f-ICCi_1-null 0)) | 
 | (define-pmacro (ICCi_2-null)  (f-ICCi_2-null 0)) | 
 | (define-pmacro (ICCi_3-null)  (f-ICCi_3-null 0)) | 
 | (define-pmacro (FCCi_1-null)  (f-FCCi_1-null 0)) | 
 | (define-pmacro (FCCi_2-null)  (f-FCCi_2-null 0)) | 
 | (define-pmacro (FCCi_3-null)  (f-FCCi_3-null 0)) | 
 | (define-pmacro (rs-null)      (f-rs-null     0)) | 
 | (define-pmacro (GRi-null)     (f-GRi-null    0)) | 
 | (define-pmacro (GRj-null)     (f-GRj-null    0)) | 
 | (define-pmacro (GRk-null)     (f-GRk-null    0)) | 
 | (define-pmacro (FRi-null)     (f-FRi-null    0)) | 
 | (define-pmacro (FRj-null)     (f-FRj-null    0)) | 
 | (define-pmacro (ACCj-null)    (f-ACCj-null   0)) | 
 | (define-pmacro (rd-null)      (f-rd-null     0)) | 
 | (define-pmacro (cond-null)    (f-cond-null   0)) | 
 | (define-pmacro (ccond-null)   (f-ccond-null  0)) | 
 | (define-pmacro (s12-null)     (f-s12-null    0)) | 
 | (define-pmacro (label16-null) (f-label16-null 0)) | 
 | (define-pmacro (misc-null-1)  (f-misc-null-1 0)) | 
 | (define-pmacro (misc-null-2)  (f-misc-null-2 0)) | 
 | (define-pmacro (misc-null-3)  (f-misc-null-3 0)) | 
 | (define-pmacro (misc-null-4)  (f-misc-null-4 0)) | 
 | (define-pmacro (misc-null-5)  (f-misc-null-5 0)) | 
 | (define-pmacro (misc-null-6)  (f-misc-null-6 0)) | 
 | (define-pmacro (misc-null-7)  (f-misc-null-7 0)) | 
 | (define-pmacro (misc-null-8)  (f-misc-null-8 0)) | 
 | (define-pmacro (misc-null-9)  (f-misc-null-9 0)) | 
 | (define-pmacro (misc-null-10) (f-misc-null-10 0)) | 
 | (define-pmacro (misc-null-11) (f-misc-null-11 0)) | 
 |  | 
 | (define-pmacro (LRA-null)     (f-LRA-null 0)) | 
 | (define-pmacro (TLBPR-null)   (f-TLBPR-null 0)) | 
 |  | 
 | (define-pmacro (LI-on)       (f-LI-on  1)) | 
 | (define-pmacro (LI-off)      (f-LI-off 0)) | 
 |  | 
 | ; Instruction definitions. | 
 | ; | 
 | ; Notes: | 
 | ; - dni is short for "define-normal-instruction" | 
 | ; - Macros are used to represent each insn format. These should be used as much | 
 | ;   as possible unless an insn has exceptional behaviour | 
 | ; | 
 |  | 
 | ; Commonly used Macros | 
 | ; | 
 | ; Specific registers | 
 | ; | 
 |  | 
 | ; Integer condition code manipulation | 
 | ; | 
 | (define-pmacro (set-z-and-n icc x) | 
 |   (if (eq x 0) | 
 |       (set icc (or (and icc #x7) #x4)) | 
 |       (if (lt x 0) | 
 | 	  (set icc (or (and icc #xb) #x8)) | 
 | 	  (set icc (and icc #x3)))) | 
 | ) | 
 |  | 
 | (define-pmacro (set-n icc val) | 
 |   (if (eq val 0) | 
 |       (set icc (and icc #x7)) | 
 |       (set icc (or  icc #x8))) | 
 | ) | 
 |  | 
 | (define-pmacro (set-z icc val) | 
 |   (if (eq val 0) | 
 |       (set icc (and icc #xb)) | 
 |       (set icc (or  icc #x4))) | 
 | ) | 
 |  | 
 | (define-pmacro (set-v icc val) | 
 |   (if (eq val 0) | 
 |       (set icc (and icc #xd)) | 
 |       (set icc (or  icc #x2))) | 
 | ) | 
 |  | 
 | (define-pmacro (set-c icc val) | 
 |   (if (eq val 0) | 
 |       (set icc (and icc #xe)) | 
 |       (set icc (or  icc #x1))) | 
 | ) | 
 |  | 
 | (define-pmacro (nbit icc) | 
 |   (trunc BI (srl (and icc #x8) 3)) | 
 | ) | 
 |  | 
 | (define-pmacro (zbit icc) | 
 |   (trunc BI (srl (and icc #x4) 2)) | 
 | ) | 
 |  | 
 | (define-pmacro (vbit icc) | 
 |   (trunc BI (srl (and icc #x2) 1)) | 
 | ) | 
 |  | 
 | (define-pmacro (cbit icc) | 
 |   (trunc BI (and icc #x1)) | 
 | ) | 
 |  | 
 | (define-pmacro (ebit icc) | 
 |   (trunc BI (srl (and icc #x8) 3)) | 
 | ) | 
 |  | 
 | (define-pmacro (lbit icc) | 
 |   (trunc BI (srl (and icc #x4) 2)) | 
 | ) | 
 |  | 
 | (define-pmacro (gbit icc) | 
 |   (trunc BI (srl (and icc #x2) 1)) | 
 | ) | 
 |  | 
 | (define-pmacro (ubit icc) | 
 |   (trunc BI (and icc #x1)) | 
 | ) | 
 |  | 
 | ; FRV insns | 
 | ; | 
 | ; | 
 | ; Format: INT, Logic, Shift r-r | 
 | ; | 
 | (define-pmacro (int-logic-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRk") | 
 |        (+ pack GRk op GRi (ICCi_1-null) ope GRj) | 
 |        (set GRk (operation GRi GRj)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-logic-r-r add  add   OP_00 OPE2_00 "add reg/reg") | 
 | (int-logic-r-r sub  sub   OP_00 OPE2_04 "sub reg/reg") | 
 | (int-logic-r-r and  and   OP_01 OPE2_00 "and reg/reg") | 
 | (int-logic-r-r or   or    OP_01 OPE2_02 "or  reg/reg") | 
 | (int-logic-r-r xor  xor   OP_01 OPE2_04 "xor reg/reg") | 
 |  | 
 | (dni not | 
 |      ("not") | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      ("not$pack $GRj,$GRk") | 
 |      (+ pack GRk OP_01 (rs-null) (ICCi_1-null) OPE2_06 GRj) | 
 |      (set GRk (inv GRj)) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | (dni sdiv | 
 |      "signed division" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "sdiv$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_00 GRi (ICCi_1-null) OPE2_0E GRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_signed_integer_divide" | 
 | 		       GRi GRj (index-of GRk) 0) | 
 | 	       (clobber GRk)) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni nsdiv | 
 |      "non excepting signed division" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) NON-EXCEPTING | 
 |       (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nsdiv$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_01 GRi (ICCi_1-null) OPE2_0E GRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_signed_integer_divide" | 
 | 		       GRi GRj (index-of GRk) 1) | 
 | 	       (clobber GRk)) | 
 |      ((fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni udiv | 
 |      "unsigned division reg/reg" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "udiv$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_00 GRi (ICCi_1-null) OPE2_0F GRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_unsigned_integer_divide" | 
 | 		       GRi GRj (index-of GRk) 0) | 
 | 	       (clobber GRk)) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni nudiv | 
 |      "non excepting unsigned division" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) NON-EXCEPTING | 
 |       (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nudiv$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_01 GRi (ICCi_1-null) OPE2_0F GRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_unsigned_integer_divide" | 
 | 		       GRi GRj (index-of GRk) 1) | 
 | 	       (clobber GRk)) | 
 |      ((fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | ; Multiplication | 
 | ; | 
 | (define-pmacro (multiply-r-r name signop op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRdoublek") | 
 |        (+ pack GRdoublek op GRi (ICCi_1-null) ope GRj)  | 
 |        (set GRdoublek (mul DI (signop DI GRi) (signop DI GRj))) | 
 |        ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 | 	(fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 |   ) | 
 | ) | 
 |  | 
 | (multiply-r-r smul ext  OP_00 OPE2_08 "signed   multiply reg/reg") | 
 | (multiply-r-r umul zext OP_00 OPE2_0A "unsigned multiply reg/reg") | 
 |  | 
 | ; Multiplication with integer accumulator IACC | 
 | ; | 
 |  | 
 | (define-pmacro (iacc-set value)  | 
 |   (set (reg h-iacc0 0) value)) | 
 |  | 
 | (define-pmacro (iacc-add value)  | 
 |   (set (reg h-iacc0 0) | 
 |        (cond DI | 
 | 	     ((andif (andif (gt value 0) (gt (reg h-iacc0 0) 0)) | 
 | 		     (lt (sub DI #x7fffffffffffffff value) (reg h-iacc0 0))) | 
 | 	      ; Positive overflow | 
 | 	      (const DI #x7fffffffffffffff)) | 
 | 	     ((andif (andif (lt value 0) (lt (reg h-iacc0 0) 0)) | 
 | 		     (gt (sub DI #x8000000000000000 value) (reg h-iacc0 0))) | 
 | 	      ; Negative overflow | 
 | 	      (const DI #x8000000000000000)) | 
 | 	     (else | 
 | 	      (add DI (reg h-iacc0 0) value)))) | 
 | ) | 
 |  | 
 | (define-pmacro (iacc-sub value)  | 
 |   (set (reg h-iacc0 0) | 
 |        (cond DI | 
 | 	     ((andif (andif (lt value 0) (gt (reg h-iacc0 0) 0)) | 
 | 		     (lt (add DI #x7fffffffffffffff value) (reg h-iacc0 0))) | 
 | 	      ; Positive overflow | 
 | 	      (const DI #x7fffffffffffffff)) | 
 | 	     ((andif (andif (gt value 0) (lt (reg h-iacc0 0) 0)) | 
 | 		     (gt (add DI #x8000000000000000 value) (reg h-iacc0 0))) | 
 | 	      ; Negative overflow | 
 | 	      (const DI #x8000000000000000)) | 
 | 	     (else | 
 | 	      (sub DI (reg h-iacc0 0) value)))) | 
 | ) | 
 |  | 
 | (define-pmacro (iacc-multiply-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IACC) (MACH fr400,fr450) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) AUDIO) | 
 |        (.str name "$pack $GRi,$GRj") | 
 |        (+ pack (rd-null) op GRi ope GRj) | 
 |        ((.sym iacc- operation) (mul DI (ext DI GRi) (ext DI GRj))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (iacc-multiply-r-r smu   set OP_46 OPE1_05 "Signed multiply     reg/reg/iacc") | 
 | (iacc-multiply-r-r smass add OP_46 OPE1_06 "Signed multiply/add reg/reg/iacc") | 
 | (iacc-multiply-r-r smsss sub OP_46 OPE1_07 "Signed multiply/sub reg/reg/iacc") | 
 |  | 
 | (define-pmacro (int-shift-r-r name op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRk") | 
 |        (+ pack GRk op GRi (ICCi_1-null) ope GRj) | 
 |        (set GRk (name GRi (and GRj #x1f))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-shift-r-r sll OP_01 OPE2_08 "shift left  logical reg/reg") | 
 | (int-shift-r-r srl OP_01 OPE2_0A "shift right logical reg/reg") | 
 | (int-shift-r-r sra OP_01 OPE2_0C "shift right arith   reg/reg") | 
 |  | 
 | (dni slass | 
 |      "shift left arith reg/reg with saturation" | 
 |      ((UNIT IALL) (MACH fr400,fr450) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) AUDIO) | 
 |      "slass$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_46 GRi OPE1_02 GRj) | 
 |      (set GRk (c-call SI "@cpu@_shift_left_arith_saturate" GRi GRj)) | 
 |      () | 
 | ) | 
 |  | 
 | (dni scutss | 
 |      "Integer accumulator cut with saturation" | 
 |      ((UNIT I0) (MACH fr400,fr450) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) AUDIO) | 
 |      "scutss$pack $GRj,$GRk" | 
 |      (+ pack GRk OP_46 (rs-null) OPE1_04 GRj) | 
 |      (set GRk (c-call SI "@cpu@_iacc_cut" (reg h-iacc0 0) GRj)) | 
 |      () | 
 | ) | 
 |  | 
 | (define-pmacro (scan-semantics arg1 arg2 targ) | 
 |   (sequence ((WI tmp1) (WI tmp2)) | 
 | 	    (set tmp1 arg1) | 
 | 	    (set tmp2 (sra arg2 1)) | 
 | 	    (set targ (c-call WI "@cpu@_scan_result" (xor tmp1 tmp2)))) | 
 | ) | 
 |  | 
 | (dni scan | 
 |      "scan" | 
 |      ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "scan$pack $GRi,$GRj,$GRk" | 
 |      (+ pack GRk OP_0B GRi (ICCi_1-null) OPE2_00 GRj) | 
 |      (scan-semantics GRi GRj GRk) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | ; Format: conditional INT, Logic, Shift r-r | 
 | ; | 
 | (define-pmacro (conditional-int-logic name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set GRk (operation GRi GRj))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-int-logic cadd  add  OP_58 OPE4_0 "conditional add") | 
 | (conditional-int-logic csub  sub  OP_58 OPE4_1 "conditional sub") | 
 | (conditional-int-logic cand  and  OP_5A OPE4_0 "conditional and") | 
 | (conditional-int-logic cor   or   OP_5A OPE4_1 "conditional or") | 
 | (conditional-int-logic cxor  xor  OP_5A OPE4_2 "conditional xor") | 
 |  | 
 | (dni cnot | 
 |      "conditional not" | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "cnot$pack $GRj,$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_5A (rs-null) CCi cond OPE4_3 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set GRk (inv GRj))) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | (dni csmul | 
 |      "conditional signed multiply" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "csmul$pack $GRi,$GRj,$GRdoublek,$CCi,$cond" | 
 |      (+ pack GRdoublek OP_58 GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set GRdoublek (mul DI (ext DI GRi) (ext DI GRj)))) | 
 |      ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 |       (fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 | ) | 
 |  | 
 | (dni csdiv | 
 |      "conditional signed division" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "csdiv$pack $GRi,$GRj,$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_58 GRi CCi cond OPE4_3 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence () | 
 | 		   (c-call VOID "@cpu@_signed_integer_divide" | 
 | 			   GRi GRj (index-of GRk) 0) | 
 | 		   (clobber GRk))) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni cudiv | 
 |      "conditional unsigned division" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "cudiv$pack $GRi,$GRj,$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_59 GRi CCi cond OPE4_3 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence () | 
 | 		   (c-call VOID "@cpu@_unsigned_integer_divide" | 
 | 			   GRi GRj (index-of GRk) 0) | 
 | 		   (clobber GRk))) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-shift name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set GRk (operation GRi (and GRj #x1f)))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-shift csll sll OP_5C OPE4_0 "conditional shift left  logical") | 
 | (conditional-shift csrl srl OP_5C OPE4_1 "conditional shift right logical") | 
 | (conditional-shift csra sra OP_5C OPE4_2 "conditional shift right arith") | 
 |  | 
 | (dni cscan | 
 |      "conditional scan" | 
 |      ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "cscan$pack $GRi,$GRj,$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_65 GRi CCi cond OPE4_3 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (scan-semantics GRi GRj GRk)) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | ; Format: INT, Logic, Shift, cc r-r | 
 | ; | 
 | (define-pmacro (int-arith-cc-semantics operation icc) | 
 |   (sequence ((BI tmp) (QI cc) (SI result)) | 
 | 	    (set cc icc) | 
 | 	    (set tmp ((.sym operation -oflag) GRi GRj (const 0))) | 
 | 	    (set-v cc tmp) | 
 | 	    (set tmp ((.sym operation -cflag) GRi GRj (const 0))) | 
 | 	    (set-c cc tmp) | 
 | 	    (set result (operation GRi GRj)) | 
 | 	    (set-z-and-n cc result) | 
 | 	    (set GRk result) | 
 | 	    (set icc cc)) | 
 | ) | 
 |  | 
 | (define-pmacro (int-arith-cc-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 ope GRj) | 
 |        (int-arith-cc-semantics operation ICCi_1) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-cc-r-r addcc add OP_00 OPE2_01 "add reg/reg, set icc") | 
 | (int-arith-cc-r-r subcc sub OP_00 OPE2_05 "sub reg/reg, set icc") | 
 |  | 
 | (define-pmacro (int-logic-cc-semantics op icc) | 
 |   (sequence ((SI tmp)) | 
 | 	    (set tmp (op GRi GRj)) | 
 | 	    (set GRk tmp) | 
 | 	    (set-z-and-n icc tmp)) | 
 | ) | 
 |  | 
 | (define-pmacro (int-logic-cc-r-r name op ope comment) | 
 |   (dni (.sym name cc) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str (.sym name cc) "$pack $GRi,$GRj,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 ope GRj) | 
 |        (int-logic-cc-semantics name ICCi_1) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-logic-cc-r-r and OP_01 OPE2_01 "and reg/reg, set icc") | 
 | (int-logic-cc-r-r or  OP_01 OPE2_03 "or  reg/reg, set icc") | 
 | (int-logic-cc-r-r xor OP_01 OPE2_05 "xor reg/reg, set icc") | 
 |  | 
 | (define-pmacro (int-shift-cc-semantics op l-r icc) | 
 |   (sequence ((WI shift) (SI tmp) (QI cc)) | 
 | 	    (set shift (and GRj #x1f)) | 
 | 	    (set cc (c-call QI (.str "@cpu@_set_icc_for_shift_" l-r) | 
 | 			    GRi shift icc)) | 
 | 	    (set tmp (op GRi shift)) | 
 | 	    (set GRk tmp) | 
 | 	    (set-z-and-n cc tmp) | 
 | 	    (set icc cc)) | 
 | ) | 
 |  | 
 | (define-pmacro (int-shift-cc-r-r name l-r op ope comment) | 
 |   (dni (.sym name cc) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str (.sym name cc) "$pack $GRi,$GRj,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 ope GRj) | 
 |        (int-shift-cc-semantics name l-r ICCi_1) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-shift-cc-r-r sll left  OP_01 OPE2_09 "shift left  logical reg/reg,set icc") | 
 | (int-shift-cc-r-r srl right OP_01 OPE2_0B "shift right logical reg/reg,set icc") | 
 | (int-shift-cc-r-r sra right OP_01 OPE2_0D "shift right arith   reg/reg,set icc") | 
 |  | 
 | (define-pmacro (multiply-cc-semantics signop arg1 arg2 targ icc) | 
 |   (sequence ((DI tmp) (QI cc)) | 
 | 	    (set cc icc) | 
 | 	    (set tmp (mul DI (signop DI arg1) (signop DI arg2))) | 
 | 	    (set-n cc (srl DI tmp 63)) | 
 | 	    (set-z cc (eq tmp 0)) | 
 | 	    (set targ tmp) | 
 | 	    (set icc cc)) | 
 | ) | 
 |  | 
 | (define-pmacro (multiply-cc-r-r name signop op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRdoublek,$ICCi_1") | 
 |        (+ pack GRdoublek op GRi ICCi_1 ope GRj) | 
 |        (multiply-cc-semantics signop GRi GRj GRdoublek ICCi_1) | 
 |        ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 | 	(fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 |   ) | 
 | ) | 
 |  | 
 | (multiply-cc-r-r smulcc ext  OP_00 OPE2_09 "signed   multiply reg/reg") | 
 | (multiply-cc-r-r umulcc zext OP_00 OPE2_0B "unsigned multiply reg/reg") | 
 |  | 
 |  | 
 | ; Format: conditional INT, Logic, Shift, cc r-r | 
 | ; | 
 | (define-pmacro (conditional-int-arith-cc name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (int-arith-cc-semantics operation | 
 | 				   (reg h-iccr (and (index-of CCi) 3)))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-int-arith-cc caddcc add OP_59 OPE4_0 "add, set icc") | 
 | (conditional-int-arith-cc csubcc sub OP_59 OPE4_1 "sub, set icc") | 
 |  | 
 | (dni csmulcc | 
 |      "conditional signed multiply and set condition code" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |      "csmulcc$pack $GRi,$GRj,$GRdoublek,$CCi,$cond" | 
 |      (+ pack GRdoublek OP_59 GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (multiply-cc-semantics ext GRi GRj GRdoublek | 
 | 				(reg h-iccr (and (index-of CCi) 3)))) | 
 |      ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 |       (fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-int-logic-cc name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (int-logic-cc-semantics operation | 
 | 				   (reg h-iccr (and (index-of CCi) 3)))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-int-logic-cc candcc and OP_5B OPE4_0 "conditional and, set icc") | 
 | (conditional-int-logic-cc corcc  or  OP_5B OPE4_1 "conditional or , set icc") | 
 | (conditional-int-logic-cc cxorcc xor OP_5B OPE4_2 "conditional xor, set icc") | 
 |  | 
 | (define-pmacro (conditional-int-shift-cc name l-r op ope comment) | 
 |   (dni (.sym c name cc) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |        (.str (.sym c name cc) "$pack $GRi,$GRj,$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (int-shift-cc-semantics name l-r | 
 | 				   (reg h-iccr (and (index-of CCi) 3)))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-int-shift-cc sll left  OP_5D OPE4_0 "shift left  logical, set icc") | 
 | (conditional-int-shift-cc srl right OP_5D OPE4_1 "shift right logical, set icc") | 
 | (conditional-int-shift-cc sra right OP_5D OPE4_2 "shift right arith  , set icc") | 
 |  | 
 | ; Add and subtract with carry | 
 | ; | 
 | (define-pmacro (int-arith-x-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 ope GRj) | 
 |        (set GRk ((.sym operation c) GRi GRj (cbit ICCi_1))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-x-r-r addx add OP_00 OPE2_02 "Add reg/reg, with carry") | 
 | (int-arith-x-r-r subx sub OP_00 OPE2_06 "Sub reg/reg, with carry") | 
 |  | 
 | (define-pmacro (int-arith-x-cc-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$GRj,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 ope GRj) | 
 |        (sequence ((WI tmp) (QI cc)) | 
 | 		 (set cc ICCi_1) | 
 | 		 (set tmp ((.sym operation c) GRi GRj (cbit cc))) | 
 | 		 (set-v cc ((.sym operation -oflag) GRi GRj (cbit cc))) | 
 | 		 (set-c cc ((.sym operation -cflag) GRi GRj (cbit cc))) | 
 | 		 (set-z-and-n cc tmp) | 
 | 		 (set GRk tmp) | 
 | 		 (set ICCi_1 cc)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-x-cc-r-r addxcc add OP_00 OPE2_03 "Add reg/reg, use/set carry") | 
 | (int-arith-x-cc-r-r subxcc sub OP_00 OPE2_07 "Sub reg/reg, use/set carry") | 
 | ; Add and subtract with saturation | 
 | ; | 
 | (define-pmacro (int-arith-ss-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (MACH fr400,fr450) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1) AUDIO) | 
 |        (.str name "$pack $GRi,$GRj,$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (sequence () | 
 | 		 (set GRk (operation GRi GRj)) | 
 | 		 (if ((.sym operation -oflag) GRi GRj (const 0)) | 
 | 					; Overflow, saturate. | 
 | 					; Sign of result will be | 
 | 					; same as sign of first operand. | 
 | 		     (set GRk | 
 | 			  (cond SI | 
 | 				((gt GRi 0) (const #x7fffffff)) | 
 | 				((lt GRi 0) (const #x80000000)) | 
 | 				(else (const 0))))) | 
 |        ) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-ss-r-r addss add OP_46 OPE1_00 "add reg/reg, with saturation") | 
 | (int-arith-ss-r-r subss sub OP_46 OPE1_01 "sub reg/reg, with saturation") | 
 |  | 
 | ; Format: INT, Logic, Shift r-simm | 
 | ; | 
 | (define-pmacro (int-logic-r-simm name operation op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s12,$GRk") | 
 |        (+ pack GRk op GRi s12) | 
 |        (set GRk (operation GRi s12)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-logic-r-simm addi  add   OP_10 "add reg/immed") | 
 | (int-logic-r-simm subi  sub   OP_14 "sub reg/immed") | 
 | (int-logic-r-simm andi  and   OP_20 "and reg/immed") | 
 | (int-logic-r-simm ori   or    OP_22 "or  reg/immed") | 
 | (int-logic-r-simm xori  xor   OP_24 "xor reg/immed") | 
 |  | 
 | (dni sdivi | 
 |      "signed division reg/immed" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "sdivi$pack $GRi,$s12,$GRk" | 
 |      (+ pack GRk OP_1E GRi s12) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_signed_integer_divide" | 
 | 		       GRi s12 (index-of GRk) 0) | 
 | 	       (clobber GRk)) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni nsdivi | 
 |      "non excepting signed division reg/immed" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) NON-EXCEPTING | 
 |       (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nsdivi$pack $GRi,$s12,$GRk" | 
 |      (+ pack GRk OP_2E GRi s12) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_signed_integer_divide" | 
 | 		       GRi s12 (index-of GRk) 1) | 
 | 	       (clobber GRk)) | 
 |      ((fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni udivi | 
 |      "unsigned division reg/immed" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "udivi$pack $GRi,$s12,$GRk" | 
 |      (+ pack GRk OP_1F GRi s12) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_unsigned_integer_divide" | 
 | 		       GRi s12 (index-of GRk) 0) | 
 | 	       (clobber GRk)) | 
 |      ((fr400 (unit u-idiv)) (fr450 (unit u-idiv)) | 
 |       (fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (dni nudivi | 
 |      "non excepting unsigned division reg/immed" | 
 |      ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) NON-EXCEPTING | 
 |       (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nudivi$pack $GRi,$s12,$GRk" | 
 |      (+ pack GRk OP_2F GRi s12) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_unsigned_integer_divide" | 
 | 		       GRi s12 (index-of GRk) 1) | 
 | 	       (clobber GRk)) | 
 |      ((fr500 (unit u-idiv)) (fr550 (unit u-idiv))) | 
 | ) | 
 |  | 
 | (define-pmacro (multiply-r-simm name signop op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s12,$GRdoublek") | 
 |        (+ pack GRdoublek op GRi s12) | 
 |        (set GRdoublek (mul DI (signop DI GRi) (signop DI s12))) | 
 |        ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 | 	(fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 |   ) | 
 | ) | 
 |  | 
 | (multiply-r-simm smuli ext  OP_18 "signed   multiply reg/immed") | 
 | (multiply-r-simm umuli zext OP_1A "unsigned multiply reg/immed") | 
 |  | 
 | (define-pmacro (int-shift-r-simm name op comment) | 
 |   (dni (.sym name i) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str (.sym name i) "$pack $GRi,$s12,$GRk") | 
 |        (+ pack GRk op GRi s12) | 
 |        (set GRk (name GRi (and s12 #x1f))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-shift-r-simm sll OP_28 "shift left  logical reg/immed") | 
 | (int-shift-r-simm srl OP_2A "shift right logical reg/immed") | 
 | (int-shift-r-simm sra OP_2C "shift right arith   reg/immed") | 
 |  | 
 | (dni scani | 
 |      "scan immediate" | 
 |      ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "scani$pack $GRi,$s12,$GRk" | 
 |      (+ pack GRk OP_47 GRi s12) | 
 |      (scan-semantics GRi s12 GRk) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | ; Format: INT, Logic, Shift cc r-simm | 
 | ; | 
 | (define-pmacro (int-arith-cc-r-simm name operation op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s10,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 s10) | 
 |        (sequence ((BI tmp) (QI cc) (SI result)) | 
 | 		 (set cc ICCi_1) | 
 | 		 (set tmp ((.sym operation -oflag) GRi s10 (const 0))) | 
 | 		 (set-v cc tmp) | 
 | 		 (set tmp ((.sym operation -cflag) GRi s10 (const 0))) | 
 | 		 (set-c cc tmp) | 
 | 		 (set result (operation GRi s10)) | 
 | 		 (set-z-and-n cc result) | 
 | 		 (set GRk result) | 
 | 		 (set ICCi_1 cc)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-cc-r-simm addicc add OP_11 "add reg/immed, set icc") | 
 | (int-arith-cc-r-simm subicc sub OP_15 "sub reg/immed, set icc") | 
 |  | 
 | (define-pmacro (int-logic-cc-r-simm name op comment) | 
 |   (dni (.sym name icc) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str (.sym name icc) "$pack $GRi,$s10,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 s10) | 
 |        (sequence ((SI tmp)) | 
 | 		 (set tmp (name GRi s10)) | 
 | 		 (set GRk tmp) | 
 | 		 (set-z-and-n ICCi_1 tmp)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-logic-cc-r-simm and  OP_21 "and reg/immed, set icc") | 
 | (int-logic-cc-r-simm or   OP_23 "or  reg/immed, set icc") | 
 | (int-logic-cc-r-simm xor  OP_25 "xor reg/immed, set icc") | 
 |  | 
 | (define-pmacro (multiply-cc-r-simm name signop op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s10,$GRdoublek,$ICCi_1") | 
 |        (+ pack GRdoublek op GRi ICCi_1 s10) | 
 |        (multiply-cc-semantics signop GRi s10 GRdoublek ICCi_1) | 
 |        ((fr400 (unit u-imul)) (fr450 (unit u-imul)) | 
 | 	(fr500 (unit u-imul)) (fr550 (unit u-imul))) | 
 |   ) | 
 | ) | 
 |  | 
 | (multiply-cc-r-simm smulicc ext  OP_19 "signed   multiply reg/immed") | 
 | (multiply-cc-r-simm umulicc zext OP_1B "unsigned multiply reg/immed") | 
 |  | 
 | (define-pmacro (int-shift-cc-r-simm name l-r op comment) | 
 |   (dni (.sym name icc) | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str (.sym name icc) "$pack $GRi,$s10,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 s10) | 
 |        (sequence ((WI shift) (SI tmp) (QI cc)) | 
 | 		 (set shift (and s10 #x1f)) | 
 | 		 (set cc (c-call QI (.str "@cpu@_set_icc_for_shift_" l-r) | 
 | 				 GRi shift ICCi_1)) | 
 | 		 (set tmp (name GRi shift)) | 
 | 		 (set GRk tmp) | 
 | 		 (set-z-and-n cc tmp) | 
 | 		 (set ICCi_1 cc)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-shift-cc-r-simm sll left  OP_29 "shift left  logical reg/immed, set icc") | 
 | (int-shift-cc-r-simm srl right OP_2B "shift right logical reg/immed, set icc") | 
 | (int-shift-cc-r-simm sra right OP_2D "shift right arith   reg/immed, set icc") | 
 |  | 
 | (define-pmacro (int-arith-x-r-simm name operation op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s10,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 s10) | 
 |        (set GRk ((.sym operation c) GRi s10 (cbit ICCi_1))) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-x-r-simm addxi add OP_12 "Add reg/immed, with carry") | 
 | (int-arith-x-r-simm subxi sub OP_16 "Sub reg/immed, with carry") | 
 |  | 
 | (define-pmacro (int-arith-x-cc-r-simm name operation op comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 | 	(FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |        (.str name "$pack $GRi,$s10,$GRk,$ICCi_1") | 
 |        (+ pack GRk op GRi ICCi_1 s10) | 
 |        (sequence ((WI tmp) (QI cc)) | 
 | 		 (set cc ICCi_1) | 
 | 		 (set tmp ((.sym operation c) GRi s10 (cbit cc))) | 
 | 		 (set-v cc ((.sym operation -oflag) GRi s10 (cbit cc))) | 
 | 		 (set-c cc ((.sym operation -cflag) GRi s10 (cbit cc))) | 
 | 		 (set-z-and-n cc tmp) | 
 | 		 (set GRk tmp) | 
 | 		 (set ICCi_1 cc)) | 
 |        ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 | 	(fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 |   ) | 
 | ) | 
 |  | 
 | (int-arith-x-cc-r-simm addxicc add OP_13 "Add reg/immed, with carry") | 
 | (int-arith-x-cc-r-simm subxicc sub OP_17 "Sub reg/immed, with carry") | 
 |  | 
 | ; Byte compare insns | 
 |  | 
 | (dni cmpb | 
 |      "Compare bytes" | 
 |      ((UNIT IALL) (MACH fr400,fr450,fr550) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "cmpb$pack $GRi,$GRj,$ICCi_1" | 
 |      (+ pack (GRk-null) OP_00 GRi ICCi_1 OPE2_0C GRj) | 
 |      (sequence ((QI cc)) | 
 | 	       (set-n cc (eq (and GRi #xff000000) (and GRj #xff000000))) | 
 | 	       (set-z cc (eq (and GRi #x00ff0000) (and GRj #x00ff0000))) | 
 | 	       (set-v cc (eq (and GRi #x0000ff00) (and GRj #x0000ff00))) | 
 | 	       (set-c cc (eq (and GRi #x000000ff) (and GRj #x000000ff))) | 
 | 	       (set ICCi_1 cc)) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | (dni cmpba | 
 |      "OR of Compare bytes" | 
 |      ((UNIT IALL) (MACH fr400,fr450,fr550) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "cmpba$pack $GRi,$GRj,$ICCi_1" | 
 |      (+ pack (GRk-null) OP_00 GRi ICCi_1 OPE2_0D GRj) | 
 |      (sequence ((QI cc)) | 
 | 	       (set cc 0) | 
 | 	       (set-c cc | 
 | 		      (orif (eq (and GRi #xff000000) (and GRj #xff000000)) | 
 | 			    (orif (eq (and GRi #x00ff0000) (and GRj #x00ff0000)) | 
 | 				  (orif (eq (and GRi #x0000ff00) | 
 | 					    (and GRj #x0000ff00)) | 
 | 					 (eq (and GRi #x000000ff) | 
 | 					    (and GRj #x000000ff)))))) | 
 | 	       (set ICCi_1 cc)) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | ; Format: Load immediate | 
 | ; | 
 | (dni setlo | 
 |      "set low order bits" | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "setlo$pack $ulo16,$GRklo" | 
 |      (+ pack GRk OP_3D (misc-null-4) u16) | 
 |      (set GRklo u16) | 
 |      ((fr400 (unit u-set-hilo)) (fr450 (unit u-set-hilo)) | 
 |       (fr500 (unit u-set-hilo)) (fr550 (unit u-set-hilo))) | 
 | ) | 
 |  | 
 | (dni sethi | 
 |      "set high order bits" | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "sethi$pack $uhi16,$GRkhi" | 
 |      (+ pack GRkhi OP_3E (misc-null-4) u16) | 
 |      (set GRkhi u16) | 
 |      ((fr400 (unit u-set-hilo)) (fr450 (unit u-set-hilo)) | 
 |       (fr500 (unit u-set-hilo)) (fr550 (unit u-set-hilo))) | 
 | ) | 
 |  | 
 | (dni setlos | 
 |      "set low order bits and extend sign" | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) | 
 |       (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "setlos$pack $slo16,$GRk" | 
 |      (+ pack GRk OP_3F (misc-null-4) s16) | 
 |      (set GRk s16) | 
 |      ((fr400 (unit u-integer)) (fr450 (unit u-integer)) | 
 |       (fr500 (unit u-integer)) (fr550 (unit u-integer))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-gr-r name mode op ope comment ann) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2)) | 
 |        (.str name "$pack " ann "($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (set GRk (c-call mode (.str "@cpu@_read_mem_" mode) pc (add GRi GRj))) | 
 |        ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	(fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dann ldann "ld annotation" SI "ld_annotation" "at") | 
 |  | 
 | (load-gr-r ldsb   QI OP_02 OPE1_00 "Load   signed byte" "@") | 
 | (load-gr-r ldub  UQI OP_02 OPE1_01 "Load unsigned byte" "@") | 
 | (load-gr-r ldsh   HI OP_02 OPE1_02 "Load   signed half" "@") | 
 | (load-gr-r lduh  UHI OP_02 OPE1_03 "Load unsigned half" "@") | 
 | (load-gr-r ld     SI OP_02 OPE1_04 "Load          word" "$ldann") | 
 |  | 
 | (define-pmacro (load-fr-r name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) FR-ACCESS) | 
 |        (.str name "$pack @($GRi,$GRj),$FRintk") | 
 |        (+ pack FRintk op GRi ope GRj) | 
 |        (set FRintk (c-call mode (.str "@cpu@_read_mem_" mode) pc (add GRi GRj))) | 
 |        ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	(fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (load-fr-r ldbf UQI OP_02 OPE1_08 "Load byte   float") | 
 | (load-fr-r ldhf UHI OP_02 OPE1_09 "Load half   float") | 
 | (load-fr-r ldf   SI OP_02 OPE1_0A "Load word   float") | 
 |  | 
 | (define-pmacro (load-cpr-r name mode op ope reg attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" reg "k") | 
 |        (+ pack (.sym reg k) op GRi ope GRj) | 
 |        (set (.sym reg k) | 
 | 	    (c-call mode (.str "@cpu@_read_mem_" mode) pc (add GRi GRj))) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (load-cpr-r ldc SI OP_02 OPE1_0D CPR (MACH frv) "Load coprocessor word") | 
 |  | 
 | ; These correspond to enumerators in frv-sim.h | 
 | (define-pmacro (ne-UQI-size) 0) | 
 | (define-pmacro (ne-QI-size)  1) | 
 | (define-pmacro (ne-UHI-size) 2) | 
 | (define-pmacro (ne-HI-size)  3) | 
 | (define-pmacro (ne-SI-size)  4) | 
 | (define-pmacro (ne-DI-size)  5) | 
 | (define-pmacro (ne-XI-size)  6) | 
 |  | 
 | (define-pmacro (ne-load-semantics base dispix targ idisp size is_float action) | 
 |   (sequence ((BI do_op)) | 
 | 	    (set do_op | 
 | 		 (c-call BI "@cpu@_check_non_excepting_load" | 
 | 			  (index-of base) dispix (index-of targ) | 
 | 			  idisp size is_float)) | 
 | 	    (if do_op action)) | 
 | ) | 
 |  | 
 | (define-pmacro (ne-load-gr-r name mode op ope size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) GRk 0 size 0 | 
 | 			  (set GRk | 
 | 			       (c-call mode (.str "@cpu@_read_mem_" mode) | 
 | 				       pc (add GRi GRj)))) | 
 |        ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-gr-r nldsb  QI OP_02 OPE1_20 (ne-QI-size)  "Load   signed byte") | 
 | (ne-load-gr-r nldub UQI OP_02 OPE1_21 (ne-UQI-size) "Load unsigned byte") | 
 | (ne-load-gr-r nldsh  HI OP_02 OPE1_22 (ne-HI-size)  "Load   signed half") | 
 | (ne-load-gr-r nlduh UHI OP_02 OPE1_23 (ne-UHI-size) "Load unsigned half") | 
 | (ne-load-gr-r nld    SI OP_02 OPE1_24 (ne-SI-size)  "Load          word") | 
 |  | 
 | (define-pmacro (ne-load-fr-r name mode op ope size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$FRintk") | 
 |        (+ pack FRintk op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) FRintk 0 size 1 | 
 | 			  (set FRintk | 
 | 			       (c-call mode (.str "@cpu@_read_mem_" mode) | 
 | 				       pc (add GRi GRj)))) | 
 |        ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-fr-r nldbf UQI OP_02 OPE1_28 (ne-UQI-size) "Load byte float") | 
 | (ne-load-fr-r nldhf UHI OP_02 OPE1_29 (ne-UHI-size) "Load half float") | 
 | (ne-load-fr-r nldf   SI OP_02 OPE1_2A (ne-SI-size)  "Load word float") | 
 |  | 
 | ; Semantics for a load-double insn | 
 | ; | 
 | (define-pmacro (load-double-semantics not_gr mode regtype address arg) | 
 |   (if (orif not_gr (ne (index-of (.sym regtype doublek)) 0)) | 
 |       (sequence () | 
 | 		(set address (add GRi arg)) | 
 | 		(set (.sym regtype doublek) | 
 | 		     (c-call mode (.str "@cpu@_read_mem_" mode) pc address)))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-double-r-r | 
 | 		name not_gr mode op ope regtype attr profile comment ann) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) attr) | 
 |        (.str name "$pack " ann "($GRi,$GRj),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (load-double-semantics not_gr mode regtype address GRj)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (dann lddann "ldd annotation" SI "ldd_annotation" "at") | 
 |  | 
 | (load-double-r-r ldd  0 DI OP_02 OPE1_05 GR  NA | 
 | 		 ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load))  | 
 | 		  (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		 "Load double word" "$lddann") | 
 | (load-double-r-r lddf 1 DF OP_02 OPE1_0B FR  FR-ACCESS | 
 | 		 ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		  (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		 "Load double float" "@") | 
 | (load-double-r-r lddc 1 DI OP_02 OPE1_0E CPR (MACH frv) () | 
 | 		 "Load coprocessor double" "@") | 
 |  | 
 | (define-pmacro (ne-load-double-r-r | 
 | 		name not_gr mode op ope regtype size is_float attr profile | 
 | 		comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING attr | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (ne-load-semantics GRi (index-of GRj) (.sym regtype doublek) | 
 | 				    0 size is_float | 
 | 				    (load-double-semantics not_gr mode | 
 | 							   regtype | 
 | 							   address GRj))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-double-r-r nldd  0 DI OP_02 OPE1_25 GR (ne-DI-size) 0 NA | 
 | 		    ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load double   word") | 
 | (ne-load-double-r-r nlddf 1 DF OP_02 OPE1_2B FR (ne-DI-size) 1 FR-ACCESS | 
 | 		    ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load double float") | 
 |  | 
 | ; Semantics for a load-quad insn | 
 | ; | 
 | (define-pmacro (load-quad-semantics regtype address arg) | 
 |   (sequence () | 
 | 	    (set address (add GRi arg)) | 
 | 	    (c-call VOID (.str "@cpu@_load_quad_" regtype) | 
 | 		    pc address (index-of (.sym regtype k)))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-quad-r-r name op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (load-quad-semantics regtype address GRj)) | 
 |        ; TODO regtype-k not referenced for profiling | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-quad-r-r ldq  OP_02 OPE1_06 GR    NA        ((fr500 (unit u-gr-load))) | 
 | 	       "Load quad word") | 
 | (load-quad-r-r ldqf OP_02 OPE1_0C FRint FR-ACCESS ((fr500 (unit u-fr-load))) | 
 | 	       "Load quad float") | 
 | (load-quad-r-r ldqc OP_02 OPE1_0F CPR   NA        () "Load coprocessor quad") | 
 |  | 
 | (define-pmacro (ne-load-quad-r-r | 
 | 		name op ope regtype size is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) NON-EXCEPTING attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (ne-load-semantics GRi (index-of GRj) (.sym regtype k) | 
 | 				    0 size is_float | 
 | 				    (load-quad-semantics regtype address GRj))) | 
 |        ; TODO regtype-k not referenced for profiling | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-quad-r-r nldq  OP_02 OPE1_26 GR    (ne-XI-size) 0 NA | 
 | 		  ((fr500 (unit u-gr-load))) "Load quad word") | 
 | (ne-load-quad-r-r nldqf OP_02 OPE1_2C FRint (ne-XI-size) 1 FR-ACCESS | 
 | 		  ((fr500 (unit u-fr-load))) "Load quad float") | 
 |  | 
 | (define-pmacro (load-gr-u-semantics mode) | 
 |   (sequence ((UWI address)) | 
 | 	    (set address (add GRi GRj)) | 
 | 	    (set GRk (c-call mode (.str "@cpu@_read_mem_" mode) pc address)) | 
 | 	    (if (ne (index-of GRi) (index-of GRk)) | 
 | 		(sequence () | 
 | 			  (set GRi address) | 
 | 			  (c-call VOID "@cpu@_force_update")))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-gr-u name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (load-gr-u-semantics mode) | 
 |        ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	(fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (load-gr-u ldsbu   QI OP_02 OPE1_10 "Load   signed byte, update index") | 
 | (load-gr-u ldubu  UQI OP_02 OPE1_11 "Load unsigned byte, update index") | 
 | (load-gr-u ldshu   HI OP_02 OPE1_12 "Load   signed half, update index") | 
 | (load-gr-u lduhu  UHI OP_02 OPE1_13 "Load unsigned half, update index") | 
 | (load-gr-u ldu     SI OP_02 OPE1_14 "Load          word, update index") | 
 |  | 
 | (define-pmacro (ne-load-gr-u name mode op ope size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) GRk 0 size 0 (load-gr-u-semantics mode)) | 
 |        ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-gr-u nldsbu  QI OP_02 OPE1_30 (ne-QI-size)  "Load   signed byte, update index") | 
 | (ne-load-gr-u nldubu UQI OP_02 OPE1_31 (ne-UQI-size) "Load unsigned byte, update index") | 
 | (ne-load-gr-u nldshu  HI OP_02 OPE1_32 (ne-HI-size)  "Load   signed half, update index") | 
 | (ne-load-gr-u nlduhu UHI OP_02 OPE1_33 (ne-UHI-size) "Load unsigned half, update index") | 
 | (ne-load-gr-u nldu    SI OP_02 OPE1_34 (ne-SI-size)  "Load          word, update index") | 
 |  | 
 | (define-pmacro (load-non-gr-u-semantics mode regtype) | 
 |   (sequence ((UWI address)) | 
 | 	    (set address (add GRi GRj)) | 
 | 	    (set (.sym regtype k) | 
 | 		 (c-call mode (.str "@cpu@_read_mem_" mode) pc address)) | 
 | 	    (set GRi address) | 
 | 	    (c-call VOID "@cpu@_force_update")) | 
 | ) | 
 |  | 
 | (define-pmacro (load-fr-u name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) FR-ACCESS) | 
 |        (.str name "$pack @($GRi,$GRj),$FRintk") | 
 |        (+ pack FRintk op GRi ope GRj) | 
 |        (load-non-gr-u-semantics mode FRint) | 
 |        ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	(fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (load-fr-u ldbfu  UQI OP_02 OPE1_18 "Load byte float, update index") | 
 | (load-fr-u ldhfu  UHI OP_02 OPE1_19 "Load half float, update index") | 
 | (load-fr-u ldfu    SI OP_02 OPE1_1A "Load word float, update index") | 
 |  | 
 | (define-pmacro (load-cpr-u name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$CPRk") | 
 |        (+ pack CPRk op GRi ope GRj) | 
 |        (load-non-gr-u-semantics mode CPR) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (load-cpr-u ldcu SI OP_02 OPE1_1D "Load coprocessor word float,update index") | 
 |  | 
 | (define-pmacro (ne-load-non-gr-u name mode op ope regtype size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) (.sym regtype k) 0 size 1 | 
 | 			  (load-non-gr-u-semantics mode regtype)) | 
 |        ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-non-gr-u nldbfu UQI OP_02 OPE1_38 FRint (ne-UQI-size) "Load byte float, update index") | 
 | (ne-load-non-gr-u nldhfu UHI OP_02 OPE1_39 FRint (ne-UHI-size) "Load half float, update index") | 
 | (ne-load-non-gr-u nldfu   SI OP_02 OPE1_3A FRint (ne-SI-size)  "Load word float, update index") | 
 |  | 
 | (define-pmacro (load-double-gr-u-semantics) | 
 |   (sequence ((WI address)) | 
 | 	    (load-double-semantics 0 DI GR address GRj) | 
 | 	    (if (ne (index-of GRi) (index-of GRdoublek)) | 
 | 		(sequence () | 
 | 			  (set GRi address) | 
 | 			  (c-call VOID "@cpu@_force_update")))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-double-gr-u name op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRdoublek") | 
 |        (+ pack GRdoublek op GRi ope GRj) | 
 |        (load-double-gr-u-semantics) | 
 |        ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	(fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (load-double-gr-u lddu  OP_02 OPE1_15 "Load double word, update index") | 
 |  | 
 | (define-pmacro (ne-load-double-gr-u name op ope size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRdoublek") | 
 |        (+ pack GRdoublek op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) GRdoublek 0 size 0 | 
 | 			  (load-double-gr-u-semantics)) | 
 |        ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |  | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-double-gr-u nlddu OP_02 OPE1_35 (ne-DI-size) "Load double word, update index") | 
 |  | 
 | (define-pmacro (load-double-non-gr-u-semantics mode regtype) | 
 |   (sequence ((WI address)) | 
 | 	    (load-double-semantics 1 mode regtype address GRj) | 
 | 	    (set GRi address) | 
 | 	    (c-call VOID "@cpu@_force_update")) | 
 | ) | 
 |  | 
 | (define-pmacro (load-double-non-gr-u | 
 | 		name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (load-double-non-gr-u-semantics mode regtype) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-double-non-gr-u lddfu DF OP_02 OPE1_1B FR  FR-ACCESS | 
 | 		      ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		       (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		      "Load double float, update index") | 
 | (load-double-non-gr-u lddcu DI OP_02 OPE1_1E CPR (MACH frv) | 
 | 		      () "Load coprocessor double float, update index") | 
 |  | 
 | (define-pmacro (ne-load-double-non-gr-u name mode op ope regtype size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) (.sym regtype doublek) 0 size 1 | 
 | 			  (load-double-non-gr-u-semantics mode regtype)) | 
 |        ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-double-non-gr-u nlddfu DF OP_02 OPE1_3B FR (ne-DI-size) "Load double float, update index") | 
 |  | 
 | (define-pmacro (load-quad-gr-u-semantics) | 
 |   (sequence ((WI address)) | 
 | 	    (load-quad-semantics GR address GRj) | 
 | 	    (if (ne (index-of GRi) (index-of GRk)) | 
 | 		(sequence () | 
 | 			  (set GRi address) | 
 | 			  (c-call VOID "@cpu@_force_update")))) | 
 | ) | 
 |  | 
 | (define-pmacro (load-quad-gr-u name op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv)) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (load-quad-gr-u-semantics) | 
 |        ; TODO - GRk not referenced here for profiling | 
 |        ((fr500 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (load-quad-gr-u ldqu  OP_02 OPE1_16 "Load quad word, update index") | 
 |  | 
 | (define-pmacro (ne-load-quad-gr-u name op ope size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) NON-EXCEPTING) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) GRk 0 size 0 | 
 | 			  (load-quad-gr-u-semantics)) | 
 |        ; TODO - GRk not referenced here for profiling | 
 |        ((fr500 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-quad-gr-u nldqu OP_02 OPE1_36 (ne-XI-size) "Load quad word, update index") | 
 |  | 
 | (define-pmacro (load-quad-non-gr-u-semantics regtype) | 
 |   (sequence ((WI address)) | 
 | 	    (load-quad-semantics regtype address GRj) | 
 | 	    (set GRi address) | 
 | 	    (c-call VOID "@cpu@_force_update")) | 
 | ) | 
 |  | 
 | (define-pmacro (load-quad-non-gr-u name op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (load-quad-non-gr-u-semantics regtype) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-quad-non-gr-u ldqfu OP_02 OPE1_1C FRint FR-ACCESS | 
 | 		    ((fr500 (unit u-fr-load))) "Load quad float, update index") | 
 | (load-quad-non-gr-u ldqcu OP_02 OPE1_1F CPR   NA | 
 | 		    () "Load coprocessor quad word, update index") | 
 |  | 
 | (define-pmacro (ne-load-quad-non-gr-u name op ope regtype size comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) NON-EXCEPTING FR-ACCESS) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (ne-load-semantics GRi (index-of GRj) (.sym regtype k) 0 size 1 | 
 | 			  (load-quad-non-gr-u-semantics regtype)) | 
 |        ((fr500 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-quad-non-gr-u nldqfu OP_02 OPE1_3C FRint (ne-XI-size) "Load quad float,update index") | 
 |  | 
 | (define-pmacro (load-r-simm name mode op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) attr) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (set (.sym regtype k) | 
 | 	    (c-call mode (.str "@cpu@_read_mem_" mode) pc (add GRi d12))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-r-simm ldsbi  QI OP_30 GR NA | 
 | 	     ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 	     "Load   signed byte") | 
 | (load-r-simm ldshi  HI OP_31 GR NA | 
 | 	     ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 	     "Load   signed half") | 
 | (load-r-simm ldi    SI OP_32 GR NA | 
 | 	     ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 	     "Load          word") | 
 | (load-r-simm ldubi UQI OP_35 GR NA | 
 | 	     ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 	     "Load unsigned byte") | 
 | (load-r-simm lduhi UHI OP_36 GR NA | 
 | 	     ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 	     "Load unsigned half") | 
 |  | 
 | (load-r-simm ldbfi UQI OP_38 FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	      (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 	     "Load byte float") | 
 | (load-r-simm ldhfi UHI OP_39 FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	      (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 	     "Load half float") | 
 | (load-r-simm ldfi   SI OP_3A FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	      (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 	     "Load word float") | 
 |  | 
 | (define-pmacro (ne-load-r-simm | 
 | 		name mode op regtype size is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING attr | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (ne-load-semantics GRi -1 (.sym regtype k) d12 size is_float | 
 | 			  (set (.sym regtype k) | 
 | 			       (c-call mode (.str "@cpu@_read_mem_" mode) | 
 | 				       pc (add GRi d12)))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-r-simm nldsbi  QI OP_40 GR (ne-QI-size)  0 NA | 
 | 		((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load   signed byte") | 
 | (ne-load-r-simm nldubi UQI OP_41 GR (ne-UQI-size) 0 NA | 
 | 		((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load unsigned byte") | 
 | (ne-load-r-simm nldshi  HI OP_42 GR (ne-HI-size)  0 NA | 
 | 		((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load   signed half") | 
 | (ne-load-r-simm nlduhi UHI OP_43 GR (ne-UHI-size) 0 NA | 
 | 		((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load unsigned half") | 
 | (ne-load-r-simm nldi    SI OP_44 GR (ne-SI-size)  0 NA | 
 | 		((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load          word") | 
 |  | 
 | (ne-load-r-simm nldbfi UQI OP_48 FRint (ne-UQI-size) 1 FR-ACCESS | 
 | 		((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load byte float") | 
 | (ne-load-r-simm nldhfi UHI OP_49 FRint (ne-UHI-size) 1 FR-ACCESS | 
 | 		((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load half float") | 
 | (ne-load-r-simm nldfi   SI OP_4A FRint (ne-SI-size)  1 FR-ACCESS | 
 | 		((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load word float") | 
 |  | 
 | (define-pmacro (load-double-r-simm | 
 | 		name not_gr mode op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) attr) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (load-double-semantics not_gr mode regtype address d12)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-double-r-simm lddi  0 DI OP_33 GR NA | 
 | 		    ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		     (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		    "Load double word") | 
 | (load-double-r-simm lddfi 1 DF OP_3B FR FR-ACCESS | 
 | 		    ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		     (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		    "Load double float") | 
 |  | 
 | (define-pmacro (ne-load-double-r-simm | 
 | 		name not_gr mode op regtype size is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) NON-EXCEPTING attr | 
 | 	(MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "doublek") | 
 |        (+ pack (.sym regtype doublek) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (ne-load-semantics GRi -1 (.sym regtype doublek) | 
 | 				    d12 size is_float | 
 | 				    (load-double-semantics not_gr mode | 
 | 							   regtype | 
 | 							   address d12))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-double-r-simm nlddi  0 DI OP_45 GR (ne-DI-size) 0 NA | 
 | 		       ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) "Load double word") | 
 | (ne-load-double-r-simm nlddfi 1 DF OP_4B FR (ne-DI-size) 1 FR-ACCESS | 
 | 		       ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load double float") | 
 |  | 
 | (define-pmacro (load-quad-r-simm name op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) attr) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (load-quad-semantics regtype address d12)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (load-quad-r-simm ldqi  OP_34 GR    NA | 
 | 		  ((fr500 (unit u-gr-load))) "Load quad word") | 
 | (load-quad-r-simm ldqfi OP_3C FRint FR-ACCESS | 
 | 		  ((fr500 (unit u-fr-load))) "Load quad float") | 
 |  | 
 | (define-pmacro (ne-load-quad-r-simm | 
 | 		name op regtype size is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) NON-EXCEPTING attr) | 
 |        (.str name "$pack @($GRi,$d12),$" regtype "k") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (ne-load-semantics GRi -1 (.sym regtype k) d12 size is_float | 
 | 				    (load-quad-semantics regtype address d12))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-load-quad-r-simm nldqfi OP_4C FRint (ne-XI-size) 1 FR-ACCESS | 
 | 		     ((fr500 (unit u-fr-load))) "Load quad float") | 
 |  | 
 | (define-pmacro (store-r-r name mode op ope reg attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" reg "k,@($GRi,$GRj)") | 
 |        (+ pack (.sym reg k) op GRi ope GRj) | 
 |        (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 	       pc (add GRi GRj) (.sym reg k)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-r-r stb   QI OP_03 OPE1_00 GR NA | 
 | 	   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	   "Store unsigned byte") | 
 | (store-r-r sth   HI OP_03 OPE1_01 GR NA | 
 | 	   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	   "Store unsigned half") | 
 | (store-r-r st    SI OP_03 OPE1_02 GR NA | 
 | 	   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	   "Store          word") | 
 |  | 
 | (store-r-r stbf  QI OP_03 OPE1_08 FRint FR-ACCESS | 
 | 	   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	   "Store byte float") | 
 | (store-r-r sthf  HI OP_03 OPE1_09 FRint FR-ACCESS | 
 | 	   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	   "Store half float") | 
 | (store-r-r stf   SI OP_03 OPE1_0A FRint FR-ACCESS | 
 | 	   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	   "Store word float") | 
 |  | 
 | (store-r-r stc   SI OP_03 OPE1_25 CPR (MACH frv) () "Store coprocessor word") | 
 |  | 
 | ; Semantics for a store-double insn | 
 | ; | 
 | (define-pmacro (store-double-semantics mode regtype address arg) | 
 |   (sequence () | 
 | 	    (set address (add GRi arg)) | 
 | 	    (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 		    pc address (.sym regtype doublek))) | 
 | ) | 
 |  | 
 | (define-pmacro (store-double-r-r name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" regtype "doublek,@($GRi,$GRj)") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (store-double-semantics mode regtype address GRj)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-double-r-r std  DI OP_03 OPE1_03 GR  NA | 
 | 		  ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		   (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		  "Store double word") | 
 | (store-double-r-r stdf DF OP_03 OPE1_0B FR  FR-ACCESS | 
 | 		  ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		   (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		  "Store double float") | 
 |  | 
 | (store-double-r-r stdc DI OP_03 OPE1_26 CPR (MACH frv) | 
 | 		  () "Store coprocessor double word") | 
 |  | 
 | ; Semantics for a store-quad insn | 
 | ; | 
 | (define-pmacro (store-quad-semantics regtype address arg) | 
 |   (sequence () | 
 | 	    (set address (add GRi arg)) | 
 | 	    (c-call VOID (.str "@cpu@_store_quad_" regtype) | 
 | 		     pc address (index-of (.sym regtype k)))) | 
 | ) | 
 |  | 
 | (define-pmacro (store-quad-r-r name op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR500-MAJOR I-3) (MACH frv) attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$GRj)") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (store-quad-semantics regtype address GRj)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-quad-r-r stq   OP_03 OPE1_04 GR    NA | 
 | 		((fr500 (unit u-gr-store))) "Store quad word") | 
 | (store-quad-r-r stqf  OP_03 OPE1_0C FRint FR-ACCESS | 
 | 		((fr500 (unit u-fr-store))) | 
 | 		"Store quad float") | 
 | (store-quad-r-r stqc  OP_03 OPE1_27 CPR   NA | 
 | 		() "Store coprocessor quad word") | 
 |  | 
 | (define-pmacro (store-r-r-u name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$GRj)") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (sequence ((UWI address)) | 
 | 		 (set address (add GRi GRj)) | 
 | 		 (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 			 pc address (.sym regtype k)) | 
 | 		 (set GRi address)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-r-r-u stbu  QI OP_03 OPE1_10 GR NA | 
 | 	     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	     "Store unsigned byte, update index") | 
 | (store-r-r-u sthu  HI OP_03 OPE1_11 GR NA | 
 | 	     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	     "Store unsigned half, update index") | 
 | (store-r-r-u stu   WI OP_03 OPE1_12 GR NA | 
 | 	     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	     "Store          word, update index") | 
 |  | 
 | (store-r-r-u stbfu QI OP_03 OPE1_18 FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	     "Store byte float, update index") | 
 | (store-r-r-u sthfu HI OP_03 OPE1_19 FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	     "Store half float, update index") | 
 | (store-r-r-u stfu  SI OP_03 OPE1_1A FRint FR-ACCESS | 
 | 	     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	     "Store word float, update index") | 
 |  | 
 | (store-r-r-u stcu  SI OP_03 OPE1_2D CPR (MACH frv) () | 
 | 	     "Store coprocessor word, update index") | 
 |  | 
 | (define-pmacro (store-double-r-r-u | 
 | 		name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" regtype "doublek,@($GRi,$GRj)") | 
 |        (+ pack (.sym regtype doublek) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (store-double-semantics mode regtype address GRj) | 
 | 		 (set GRi address)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-double-r-r-u stdu  DI OP_03 OPE1_13 GR  NA | 
 | 		    ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		     (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		    "Store double word, update index") | 
 | (store-double-r-r-u stdfu DF OP_03 OPE1_1B FR  FR-ACCESS | 
 | 		    ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		     (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		    "Store double float,update index") | 
 | (store-double-r-r-u stdcu DI OP_03 OPE1_2E CPR (MACH frv) () | 
 | 		    "Store coprocessor double word, update index") | 
 |  | 
 | (define-pmacro (store-quad-r-r-u name op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR500-MAJOR I-3) (MACH frv) attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$GRj)") | 
 |        (+ pack (.sym regtype k) op GRi ope GRj) | 
 |        (sequence ((WI address)) | 
 | 		 (store-quad-semantics regtype address GRj) | 
 | 		 (set GRi address)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-quad-r-r-u stqu  OP_03 OPE1_14 GR    NA | 
 | 		  ((fr500 (unit u-gr-store))) | 
 | 		  "Store quad word, update index") | 
 | (store-quad-r-r-u stqfu OP_03 OPE1_1C FRint FR-ACCESS | 
 | 		  ((fr500 (unit u-fr-store))) | 
 | 		  "Store quad float, update index") | 
 | (store-quad-r-r-u stqcu OP_03 OPE1_2F CPR   NA () | 
 | 		  "Store coprocessor quad   word, update index") | 
 |  | 
 | (define-pmacro (conditional-load name mode op ope regtype profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k,$CCi,$cond") | 
 |        (+ pack (.sym regtype k) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set (.sym regtype k) | 
 | 		(c-call mode (.str "@cpu@_read_mem_" mode) pc (add GRi GRj)))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-load cldsb  QI OP_5E OPE4_0 GR | 
 | 		  ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		   (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		  "Load   signed byte") | 
 | (conditional-load cldub UQI OP_5E OPE4_1 GR | 
 | 		  ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		   (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		  "Load unsigned byte") | 
 | (conditional-load cldsh  HI OP_5E OPE4_2 GR | 
 | 		  ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		   (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		  "Load   signed half") | 
 | (conditional-load clduh UHI OP_5E OPE4_3 GR | 
 | 		  ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		   (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		  "Load unsigned half") | 
 | (conditional-load cld    SI OP_5F OPE4_0 GR | 
 | 		  ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 		   (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 		  "Load          word") | 
 |  | 
 | (conditional-load cldbf UQI OP_60 OPE4_0 FRint | 
 | 		  ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		   (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		  "Load byte float") | 
 | (conditional-load cldhf UHI OP_60 OPE4_1 FRint | 
 | 		  ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		   (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		  "Load half float") | 
 | (conditional-load cldf   SI OP_60 OPE4_2 FRint | 
 | 		  ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 		   (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | 		  "Load word float") | 
 |  | 
 | (define-pmacro (conditional-load-double | 
 | 		name not_gr mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL attr) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "doublek,$CCi,$cond") | 
 |        (+ pack (.sym regtype doublek) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (load-double-semantics not_gr mode regtype address GRj))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-load-double cldd  0 DI OP_5F OPE4_1 GR NA | 
 | 			 ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 			  (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | 			 "Load double word") | 
 | (conditional-load-double clddf 1 DF OP_60 OPE4_3 FR FR-ACCESS | 
 | 			 ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 			  (fr500 (unit u-gr-load)) (fr550 (unit u-fr-load))) | 
 | 			 "Load double float") | 
 |  | 
 | (dni cldq | 
 |      "conditional load quad integer" | 
 |      ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) CONDITIONAL) | 
 |      "cldq$pack @($GRi,$GRj),$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_5F GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence ((WI address)) | 
 | 		   (load-quad-semantics GR address GRj))) | 
 |      ((fr500 (unit u-gr-load))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-load-gr-u name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL) | 
 |        (.str name "$pack @($GRi,$GRj),$GRk,$CCi,$cond") | 
 |        (+ pack GRk op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (set address (add GRi GRj)) | 
 | 		     (set GRk | 
 | 			  (c-call mode (.str "@cpu@_read_mem_" mode) | 
 | 				  pc address)) | 
 | 		     (if (ne (index-of GRi) (index-of GRk)) | 
 | 			 (set GRi address)))) | 
 |        ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 | 	(fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-load-gr-u cldsbu  QI OP_61 OPE4_0 "Load   signed byte, update") | 
 | (conditional-load-gr-u cldubu UQI OP_61 OPE4_1 "Load unsigned byte, update") | 
 | (conditional-load-gr-u cldshu  HI OP_61 OPE4_2 "Load   signed half, update") | 
 | (conditional-load-gr-u clduhu UHI OP_61 OPE4_3 "Load unsigned half, update") | 
 | (conditional-load-gr-u cldu    SI OP_62 OPE4_0 "Load          word, update") | 
 |  | 
 | (define-pmacro (conditional-load-non-gr-u name mode op ope regtype comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 | 	(FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL FR-ACCESS) | 
 |        (.str name "$pack @($GRi,$GRj),$" regtype "k,$CCi,$cond") | 
 |        (+ pack (.sym regtype k) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (set address (add GRi GRj)) | 
 | 		     (set (.sym regtype k) | 
 | 			  (c-call mode (.str "@cpu@_read_mem_" mode) | 
 | 				  pc address)) | 
 | 		     (set GRi address))) | 
 |        ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 | 	(fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-load-non-gr-u cldbfu UQI OP_63 OPE4_0 FRint "Load byte float, update") | 
 | (conditional-load-non-gr-u cldhfu UHI OP_63 OPE4_1 FRint "Load half float, update") | 
 | (conditional-load-non-gr-u cldfu   SI OP_63 OPE4_2 FRint "Load word float, update") | 
 |  | 
 |  | 
 | (dni clddu | 
 |      "Load double word,  update" | 
 |      ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 |       (FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL) | 
 |      "clddu$pack @($GRi,$GRj),$GRdoublek,$CCi,$cond" | 
 |      (+ pack GRdoublek OP_62 GRi CCi cond OPE4_1 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence ((WI address)) | 
 | 		   (load-double-semantics 0 DI GR address GRj) | 
 | 		   (if (ne (index-of GRi) (index-of GRdoublek)) | 
 | 		       (set GRi address)))) | 
 |      ((fr400 (unit u-gr-load)) (fr450 (unit u-gr-load)) | 
 |       (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load))) | 
 | ) | 
 |  | 
 | (dni clddfu | 
 |      "Load double float, update" | 
 |      ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) | 
 |       (FR400-MAJOR I-2) (FR450-MAJOR I-2) CONDITIONAL FR-ACCESS) | 
 |      "clddfu$pack @($GRi,$GRj),$FRdoublek,$CCi,$cond" | 
 |      (+ pack FRdoublek OP_63 GRi CCi cond OPE4_3 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence ((WI address)) | 
 | 		   (load-double-semantics 1 DF FR address GRj) | 
 | 		   (set GRi address))) | 
 |      ((fr400 (unit u-fr-load)) (fr450 (unit u-fr-load)) | 
 |       (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) | 
 | ) | 
 |  | 
 | (dni cldqu | 
 |      "conditional load quad integer and update index" | 
 |      ((UNIT LOAD) (FR500-MAJOR I-2) (MACH frv) CONDITIONAL) | 
 |      "cldqu$pack @($GRi,$GRj),$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_62 GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence ((WI address)) | 
 | 		   (load-quad-semantics GR address GRj) | 
 | 		   (if (ne (index-of GRi) (index-of GRk)) | 
 | 		       (set GRi address)))) | 
 |      ((fr500 (unit u-gr-load))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-store name mode op ope regtype profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) CONDITIONAL) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$GRj),$CCi,$cond") | 
 |        (+ pack (.sym regtype k) op GRi CCi cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 		   pc (add GRi GRj) (.sym regtype k))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-store cstb  QI OP_64 OPE4_0 GR | 
 | 		   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		   "Store unsigned byte") | 
 | (conditional-store csth  HI OP_64 OPE4_1 GR | 
 | 		   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		   "Store unsigned half") | 
 | (conditional-store cst   SI OP_64 OPE4_2 GR | 
 | 		   ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		    (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		   "Store          word") | 
 |  | 
 | (conditional-store cstbf QI OP_66 OPE4_0 FRint | 
 | 		   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		   "Store byte float") | 
 | (conditional-store csthf HI OP_66 OPE4_1 FRint | 
 | 		   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		   "Store half float") | 
 | (conditional-store cstf  SI OP_66 OPE4_2 FRint | 
 | 		   ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		    (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		   "Store word float") | 
 |  | 
 | (define-pmacro (conditional-store-double | 
 | 		name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) CONDITIONAL attr) | 
 |        (.str name "$pack $" regtype "doublek,@($GRi,$GRj),$CCi,$cond") | 
 |        (+ pack (.sym regtype doublek) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (store-double-semantics mode regtype address GRj))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-store-double cstd  DI OP_64 OPE4_3 GR NA | 
 | 			  ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 			   (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 			  "Store double word") | 
 | (conditional-store-double cstdf DF OP_66 OPE4_3 FR FR-ACCESS | 
 | 			  ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 			   (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 			  "Store double float") | 
 |  | 
 | (dni cstq | 
 |      "conditionally store quad word" | 
 |      ((UNIT STORE) (FR500-MAJOR I-3) (MACH frv) CONDITIONAL) | 
 |      "cstq$pack $GRk,@($GRi,$GRj),$CCi,$cond" | 
 |      (+ pack GRk OP_65 GRi CCi cond OPE4_0 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (sequence ((WI address)) | 
 | 		   (store-quad-semantics GR address GRj))) | 
 |      ((fr500 (unit u-gr-store))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-store-u | 
 | 		name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) CONDITIONAL attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$GRj),$CCi,$cond") | 
 |        (+ pack (.sym regtype k) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (set address (add GRi GRj)) | 
 | 		     (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 			     pc address (.sym regtype k)) | 
 | 		     (set GRi address))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-store-u cstbu QI OP_67 OPE4_0 GR NA | 
 | 		     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		     "Store unsigned byte, update index") | 
 | (conditional-store-u csthu HI OP_67 OPE4_1 GR NA | 
 | 		     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		     "Store unsigned half, update index") | 
 | (conditional-store-u cstu  SI OP_67 OPE4_2 GR NA | 
 | 		     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		     "Store          word, update index") | 
 |  | 
 | (conditional-store-u cstbfu QI OP_68 OPE4_0 FRint FR-ACCESS | 
 | 		     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		     "Store byte float, update index") | 
 | (conditional-store-u csthfu HI OP_68 OPE4_1 FRint FR-ACCESS | 
 | 		     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		     "Store half float, update index") | 
 | (conditional-store-u cstfu  SI OP_68 OPE4_2 FRint FR-ACCESS | 
 | 		     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		     "Store word float, update index") | 
 |  | 
 | (define-pmacro (conditional-store-double-u | 
 | 		name mode op ope regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) CONDITIONAL attr) | 
 |        (.str name "$pack $" regtype "doublek,@($GRi,$GRj),$CCi,$cond") | 
 |        (+ pack (.sym regtype doublek) op GRi CCi  cond ope GRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (sequence ((WI address)) | 
 | 		     (store-double-semantics mode regtype address GRj) | 
 | 		     (set GRi address))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-store-double-u cstdu  DI OP_67 OPE4_3 GR NA | 
 | 			    ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 			     (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 			    "Store double word, update index") | 
 | (conditional-store-double-u cstdfu DF OP_68 OPE4_3 FR FR-ACCESS | 
 | 			    ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 			     (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 			    "Store double float, update index") | 
 |  | 
 | (define-pmacro (store-r-simm name mode op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$d12)") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (c-call VOID (.str "@cpu@_write_mem_" mode) | 
 | 	       pc (add GRi d12) (.sym regtype k)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-r-simm stbi QI OP_50 GR NA | 
 | 	      ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	       (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	      "Store unsigned byte") | 
 | (store-r-simm sthi HI OP_51 GR NA | 
 | 	      ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	       (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	      "Store unsigned half") | 
 | (store-r-simm sti  SI OP_52 GR NA | 
 | 	      ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 	       (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 	      "Store          word") | 
 |  | 
 | (store-r-simm stbfi QI OP_4E FRint FR-ACCESS | 
 | 	      ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	       (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	      "Store byte float") | 
 | (store-r-simm sthfi HI OP_4F FRint FR-ACCESS | 
 | 	      ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	       (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	      "Store half float") | 
 | (store-r-simm stfi  SI OP_55 FRint FR-ACCESS | 
 | 	      ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 	       (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 	      "Store word float") | 
 |  | 
 | (define-pmacro (store-double-r-simm name mode op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) | 
 | 	(FR400-MAJOR I-3) (FR450-MAJOR I-3) attr) | 
 |        (.str name "$pack $" regtype "doublek,@($GRi,$d12)") | 
 |        (+ pack (.sym regtype doublek) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (store-double-semantics mode regtype address d12)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-double-r-simm stdi  DI OP_53 GR NA | 
 | 		     ((fr400 (unit u-gr-store)) (fr450 (unit u-gr-store)) | 
 | 		      (fr500 (unit u-gr-store)) (fr550 (unit u-gr-store))) | 
 | 		     "Store double word") | 
 | (store-double-r-simm stdfi DF OP_56 FR FR-ACCESS | 
 | 		     ((fr400 (unit u-fr-store)) (fr450 (unit u-fr-store)) | 
 | 		      (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store))) | 
 | 		     "Store double float") | 
 |  | 
 | (define-pmacro (store-quad-r-simm name op regtype attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT STORE) (FR500-MAJOR I-3) (MACH frv) attr) | 
 |        (.str name "$pack $" regtype "k,@($GRi,$d12)") | 
 |        (+ pack (.sym regtype k) op GRi d12) | 
 |        (sequence ((WI address)) | 
 | 		 (store-quad-semantics regtype address d12)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (store-quad-r-simm stqi  OP_54 GR    NA ((fr500 (unit u-gr-store))) | 
 | 		   "Store quad word") | 
 | (store-quad-r-simm stqfi OP_57 FRint FR-ACCESS () | 
 | 		   "Store quad float") | 
 |  | 
 | (define-pmacro (swap-semantics base offset arg) | 
 |   (sequence ((WI tmp) (WI address)) | 
 | 	    (set tmp arg) | 
 | 	    (set address (add base offset)) | 
 | 	    (c-call VOID "@cpu@_check_swap_address" address) | 
 | 	    (set arg (c-call WI "@cpu@_read_mem_WI" pc address)) | 
 | 	    (c-call VOID "@cpu@_write_mem_WI" pc address tmp)) | 
 | ) | 
 |  | 
 | (dni swap | 
 |      "Swap contents of memory with GR" | 
 |      ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 |       (FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |      "swap$pack @($GRi,$GRj),$GRk" | 
 |      (+ pack GRk OP_03 GRi OPE1_05 GRj) | 
 |      (swap-semantics GRi GRj GRk) | 
 |      ((fr400 (unit u-swap)) (fr450 (unit u-swap)) | 
 |       (fr500 (unit u-swap)) (fr550 (unit u-swap))) | 
 | ) | 
 |  | 
 | (dni "swapi" | 
 |      "Swap contents of memory with GR" | 
 |      ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 |       (FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |      ("swapi$pack @($GRi,$d12),$GRk") | 
 |      (+ pack GRk OP_4D GRi d12) | 
 |      (swap-semantics GRi d12 GRk) | 
 |      ((fr400 (unit u-swap)) (fr450 (unit u-swap)) | 
 |       (fr500 (unit u-swap)) (fr550 (unit u-swap))) | 
 | ) | 
 |  | 
 | (dni cswap | 
 |      "Conditionally swap contents of memory with GR" | 
 |      ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 |       (FR400-MAJOR C-2) (FR450-MAJOR C-2) CONDITIONAL) | 
 |      "cswap$pack @($GRi,$GRj),$GRk,$CCi,$cond" | 
 |      (+ pack GRk OP_65 GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (swap-semantics GRi GRj GRk)) | 
 |      ((fr400 (unit u-swap)) (fr450 (unit u-swap)) | 
 |       (fr500 (unit u-swap)) (fr550 (unit u-swap))) | 
 | ) | 
 |  | 
 | (define-pmacro (register-transfer | 
 | 		name op ope reg_src reg_targ pipe attrs	profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) (.unsplice attrs)) | 
 |        (.str name "$pack $" reg_src ",$" reg_targ) | 
 |        (+ pack reg_targ op (rs-null) ope reg_src) | 
 |        (set reg_targ reg_src) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (register-transfer movgf OP_03 OPE1_15 | 
 | 		   GRj FRintk I0 | 
 | 		   ((FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 | 		    (FR400-MAJOR I-4) (FR450-MAJOR I-4) FR-ACCESS) | 
 | 		   ((fr400 (unit u-gr2fr)) (fr450 (unit u-gr2fr)) | 
 | 		    (fr500 (unit u-gr2fr)) (fr550 (unit u-gr2fr))) | 
 | 		   "transfer gr to fr") | 
 | (register-transfer movfg OP_03 OPE1_0D | 
 | 		   FRintk GRj I0 | 
 | 		   ((FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 | 		    (FR400-MAJOR I-4) (FR450-MAJOR I-4) FR-ACCESS) | 
 | 		   ((fr400 (unit u-fr2gr)) (fr450 (unit u-fr2gr)) | 
 | 		    (fr500 (unit u-fr2gr)) (fr550 (unit u-fr2gr))) | 
 | 		   "transfer fr to gr") | 
 |  | 
 | (define-pmacro (nextreg hw r offset) (reg hw (add (index-of r) offset))) | 
 |  | 
 | (define-pmacro (register-transfer-double-from-gr-semantics cond) | 
 |   (if cond | 
 |       (if (eq (index-of GRj) 0) | 
 | 	  (sequence () | 
 | 		    (set FRintk 0) | 
 | 		    (set (nextreg h-fr_int FRintk 1) 0)) | 
 | 	  (sequence () | 
 | 		    (set FRintk GRj) | 
 | 		    (set (nextreg h-fr_int FRintk 1) (nextreg h-gr GRj 1))))) | 
 | ) | 
 |  | 
 | (dni movgfd | 
 |      "move GR for FR double" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 |       (FR400-MAJOR I-4) (FR450-MAJOR I-4) FR-ACCESS) | 
 |      "movgfd$pack $GRj,$FRintk" | 
 |      (+ pack FRintk OP_03 (rs-null) OPE1_16 GRj) | 
 |      (register-transfer-double-from-gr-semantics 1) | 
 |      ; TODO -- doesn't handle second register in the pair | 
 |      ((fr400 (unit u-gr2fr)) (fr450 (unit u-gr2fr)) | 
 |       (fr500 (unit u-gr2fr)) (fr550 (unit u-gr2fr))) | 
 | ) | 
 |  | 
 | (define-pmacro (register-transfer-double-to-gr-semantics cond) | 
 |   (if (andif (ne (index-of GRj) 0) cond) | 
 |       (sequence () | 
 | 		(set GRj FRintk) | 
 | 		(set (nextreg h-gr GRj 1) (nextreg h-fr_int FRintk 1)))) | 
 | ) | 
 |  | 
 | (dni movfgd | 
 |      "move FR for GR double" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 |       (FR400-MAJOR I-4) (FR450-MAJOR I-4) FR-ACCESS) | 
 |      "movfgd$pack $FRintk,$GRj" | 
 |      (+ pack FRintk OP_03 (rs-null) OPE1_0E GRj) | 
 |      (register-transfer-double-to-gr-semantics 1) | 
 |      ; TODO -- doesn't handle second register in the pair | 
 |      ((fr400 (unit u-fr2gr)) (fr450 (unit u-fr2gr)) | 
 |       (fr500 (unit u-fr2gr)) (fr550 (unit u-fr2gr))) | 
 | ) | 
 |  | 
 | (dni movgfq | 
 |      "move GR for FR quad" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (MACH frv) FR-ACCESS) | 
 |      "movgfq$pack $GRj,$FRintk" | 
 |      (+ pack FRintk OP_03 (rs-null) OPE1_17 GRj) | 
 |      (if (eq (index-of GRj) 0) | 
 | 	 (sequence () | 
 | 		   (set FRintk 0) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 1)) 0) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 2)) 0) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 3)) 0)) | 
 | 	 (sequence () | 
 | 		   (set FRintk GRj) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 1)) | 
 | 			(reg h-gr (add (index-of GRj)    1))) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 2)) | 
 | 			(reg h-gr (add (index-of GRj)    2))) | 
 | 		   (set (reg h-fr_int (add (index-of FRintk) 3)) | 
 | 			(reg h-gr (add (index-of GRj)    3))))) | 
 |      () | 
 | ) | 
 |  | 
 | (dni movfgq | 
 |      "move FR for GR quad" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (MACH frv) FR-ACCESS) | 
 |      "movfgq$pack $FRintk,$GRj" | 
 |      (+ pack FRintk OP_03 (rs-null) OPE1_0F GRj) | 
 |      (if (ne (index-of GRj) 0) | 
 | 	 (sequence () | 
 | 		   (set GRj FRintk) | 
 | 		   (set (reg h-gr (add (index-of GRj)    1)) | 
 | 			(reg h-fr_int (add (index-of FRintk) 1))) | 
 | 		   (set (reg h-gr (add (index-of GRj)    2)) | 
 | 			(reg h-fr_int (add (index-of FRintk) 2))) | 
 | 		   (set (reg h-gr (add (index-of GRj)    3)) | 
 | 			(reg h-fr_int (add (index-of FRintk) 3))))) | 
 |      () | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-register-transfer | 
 | 		name op ope reg_src reg_targ pipe attrs	profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) CONDITIONAL FR-ACCESS (.unsplice attrs)) | 
 |        (.str name "$pack $" reg_src ",$" reg_targ ",$CCi,$cond") | 
 |        (+ pack reg_targ op (rs-null) CCi cond ope reg_src) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set reg_targ reg_src)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-register-transfer cmovgf OP_69 OPE4_0 GRj FRintk I0 | 
 | 			       ((FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 | 				(FR400-MAJOR I-4) (FR450-MAJOR I-4)) | 
 | 			       ((fr400 (unit u-gr2fr)) (fr450 (unit u-gr2fr)) | 
 | 				(fr500 (unit u-gr2fr)) (fr550 (unit u-gr2fr))) | 
 | 			       "transfer gr to fr") | 
 | (conditional-register-transfer cmovfg OP_69 OPE4_2 FRintk GRj I0 | 
 | 			       ((FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 | 				(FR400-MAJOR I-4) (FR450-MAJOR I-4)) | 
 | 			       ((fr400 (unit u-fr2gr)) (fr450 (unit u-fr2gr)) | 
 | 				(fr500 (unit u-fr2gr)) (fr550 (unit u-fr2gr))) | 
 | 			       "transfer fr to gr") | 
 |  | 
 |  | 
 | (dni cmovgfd | 
 |      "Conditional move GR to FR double" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 |       (FR400-MAJOR I-4) (FR450-MAJOR I-4) CONDITIONAL FR-ACCESS) | 
 |      "cmovgfd$pack $GRj,$FRintk,$CCi,$cond" | 
 |      (+ pack FRintk OP_69 (rs-null) CCi cond OPE4_1 GRj) | 
 |      (register-transfer-double-from-gr-semantics (eq CCi (or cond 2))) | 
 |      ; TODO -- doesn't handle extra registers in double | 
 |      ((fr400 (unit u-gr2fr)) (fr450 (unit u-gr2fr)) | 
 |       (fr500 (unit u-gr2fr)) (fr550 (unit u-gr2fr))) | 
 | ) | 
 |  | 
 | (dni cmovfgd | 
 |      "Conditional move FR to GR double" | 
 |      ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) | 
 |       (FR400-MAJOR I-4) (FR450-MAJOR I-4) CONDITIONAL FR-ACCESS) | 
 |      "cmovfgd$pack $FRintk,$GRj,$CCi,$cond" | 
 |      (+ pack FRintk OP_69 (rs-null) CCi cond OPE4_3 GRj) | 
 |      (register-transfer-double-to-gr-semantics (eq CCi (or cond 2))) | 
 |      ; TODO -- doesn't handle second register in the pair | 
 |      ((fr400 (unit u-fr2gr)) (fr450 (unit u-fr2gr)) | 
 |       (fr500 (unit u-fr2gr)) (fr550 (unit u-fr2gr))) | 
 | ) | 
 |  | 
 | (define-pmacro (register-transfer-spr | 
 | 		name op ope reg_src reg_targ unitname comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 | 	(FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |        (.str name "$pack $" reg_src ",$" reg_targ) | 
 |        (+ pack reg_targ op ope reg_src) | 
 |        (set reg_targ reg_src) | 
 |        ((fr400 (unit unitname)) (fr450 (unit unitname)) | 
 | 	(fr500 (unit unitname)) (fr550 (unit unitname))) | 
 |   ) | 
 | ) | 
 |  | 
 | (register-transfer-spr movgs OP_03 OPE1_06 GRj spr u-gr2spr "transfer gr->spr") | 
 | (register-transfer-spr movsg OP_03 OPE1_07 spr GRj u-spr2gr "transfer spr->gr") | 
 |  | 
 | ; Integer Branch Conditions | 
 | (define-pmacro (Inev cc) (const BI 0)) | 
 | (define-pmacro (Ira  cc) (const BI 1)) | 
 | (define-pmacro (Ieq  cc) (     zbit cc)) | 
 | (define-pmacro (Ine  cc) (not (zbit cc))) | 
 | (define-pmacro (Ile  cc) (     orif (zbit cc) (xor (nbit cc) (vbit cc)))) | 
 | (define-pmacro (Igt  cc) (not (orif (zbit cc) (xor (nbit cc) (vbit cc))))) | 
 | (define-pmacro (Ilt  cc) (     xor  (nbit cc) (vbit cc))) | 
 | (define-pmacro (Ige  cc) (not (xor  (nbit cc) (vbit cc)))) | 
 | (define-pmacro (Ils  cc) (     orif (cbit cc) (zbit cc))) | 
 | (define-pmacro (Ihi  cc) (not (orif (cbit cc) (zbit cc)))) | 
 | (define-pmacro (Ic   cc) (     cbit cc)) | 
 | (define-pmacro (Inc  cc) (not (cbit cc))) | 
 | (define-pmacro (In   cc) (     nbit cc)) | 
 | (define-pmacro (Ip   cc) (not (nbit cc))) | 
 | (define-pmacro (Iv   cc) (     vbit cc)) | 
 | (define-pmacro (Inv  cc) (not (vbit cc))) | 
 |  | 
 | ; Float Branch Conditions | 
 | (define-pmacro (Fnev cc) (const BI 0)) | 
 | (define-pmacro (Fra  cc) (const BI 1)) | 
 | (define-pmacro (Fne  cc) (orif (lbit cc) (orif (gbit cc) (ubit cc)))) | 
 | (define-pmacro (Feq  cc) (ebit cc)) | 
 | (define-pmacro (Flg  cc) (orif (lbit cc) (gbit cc))) | 
 | (define-pmacro (Fue  cc) (orif (ebit cc) (ubit cc))) | 
 | (define-pmacro (Ful  cc) (orif (lbit cc) (ubit cc))) | 
 | (define-pmacro (Fge  cc) (orif (ebit cc) (gbit cc))) | 
 | (define-pmacro (Flt  cc) (lbit cc)) | 
 | (define-pmacro (Fuge cc) (orif (ebit cc) (orif (gbit cc) (ubit cc)))) | 
 | (define-pmacro (Fug  cc) (orif (gbit cc) (ubit cc))) | 
 | (define-pmacro (Fle  cc) (orif (ebit cc) (lbit cc))) | 
 | (define-pmacro (Fgt  cc) (gbit cc)) | 
 | (define-pmacro (Fule cc) (orif (ebit cc) (orif (lbit cc) (ubit cc)))) | 
 | (define-pmacro (Fu   cc) (ubit cc)) | 
 | (define-pmacro (Fo   cc) (orif (ebit cc) (orif (lbit cc) (gbit cc)))) | 
 |  | 
 | (define-pmacro (conditional-branch-i prefix cc op cond comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 | 	(FR400-MAJOR B-1) (FR450-MAJOR B-1)) | 
 |        (.str (.sym prefix cc) "$pack $ICCi_2,$hint,$label16") | 
 |        (+ pack (.sym ICC_ cc) ICCi_2 op hint label16) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_model_branch" label16 hint) | 
 | 		 (if (cond ICCi_2) | 
 | 		     (set pc label16))) | 
 |        ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 | 	(fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni bra | 
 |      "integer branch equal" | 
 |       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 |        (FR400-MAJOR B-1) (FR450-MAJOR B-1)) | 
 |       "bra$pack $hint_taken$label16" | 
 |       (+ pack ICC_ra (ICCi_2-null) OP_06 hint_taken label16) | 
 |       (sequence () | 
 | 		(c-call VOID "@cpu@_model_branch" label16 hint_taken) | 
 | 		(set pc label16)) | 
 |       ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |        (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni bno | 
 |      "integer branch never" | 
 |       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 |        (FR400-MAJOR B-1) (FR450-MAJOR B-1)) | 
 |       "bno$pack$hint_not_taken" | 
 |       (+ pack ICC_nev (ICCi_2-null) OP_06 hint_not_taken (label16-null)) | 
 |       (c-call VOID "@cpu@_model_branch" label16 hint_not_taken) | 
 |       ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |        (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-i b eq  OP_06 Ieq  "integer branch equal") | 
 | (conditional-branch-i b ne  OP_06 Ine  "integer branch not equal") | 
 | (conditional-branch-i b le  OP_06 Ile  "integer branch less or equal") | 
 | (conditional-branch-i b gt  OP_06 Igt  "integer branch greater") | 
 | (conditional-branch-i b lt  OP_06 Ilt  "integer branch less") | 
 | (conditional-branch-i b ge  OP_06 Ige  "integer branch greater or equal") | 
 | (conditional-branch-i b ls  OP_06 Ils  "integer branch less or equal unsigned") | 
 | (conditional-branch-i b hi  OP_06 Ihi  "integer branch greater unsigned") | 
 | (conditional-branch-i b c   OP_06 Ic   "integer branch carry set") | 
 | (conditional-branch-i b nc  OP_06 Inc  "integer branch carry clear") | 
 | (conditional-branch-i b n   OP_06 In   "integer branch negative") | 
 | (conditional-branch-i b p   OP_06 Ip   "integer branch positive") | 
 | (conditional-branch-i b v   OP_06 Iv   "integer branch overflow set") | 
 | (conditional-branch-i b nv  OP_06 Inv  "integer branch overflow clear") | 
 |  | 
 | (define-pmacro (conditional-branch-f prefix cc op cond comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 | 	(FR400-MAJOR B-1) (FR450-MAJOR B-1) FR-ACCESS) | 
 |        (.str (.sym prefix cc) "$pack $FCCi_2,$hint,$label16") | 
 |        (+ pack (.sym FCC_ cc) FCCi_2 op hint label16) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_model_branch" label16 hint) | 
 | 		 (if (cond FCCi_2) (set pc label16))) | 
 |        ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 | 	(fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni fbra | 
 |      "float branch equal" | 
 |       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 |        (FR400-MAJOR B-1) (FR450-MAJOR B-1) FR-ACCESS) | 
 |       "fbra$pack $hint_taken$label16" | 
 |       (+ pack FCC_ra (FCCi_2-null) OP_07 hint_taken label16) | 
 |       (sequence () | 
 | 		(c-call VOID "@cpu@_model_branch" label16 hint_taken) | 
 | 		(set pc label16)) | 
 |       ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |        (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni fbno | 
 |      "float branch never" | 
 |       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) | 
 |        (FR400-MAJOR B-1) (FR450-MAJOR B-1) FR-ACCESS) | 
 |       "fbno$pack$hint_not_taken" | 
 |       (+ pack FCC_nev (FCCi_2-null) OP_07 hint_not_taken (label16-null)) | 
 |       (c-call VOID "@cpu@_model_branch" label16 hint_not_taken) | 
 |       ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |        (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-f fb ne  OP_07 Fne  "float branch not equal") | 
 | (conditional-branch-f fb eq  OP_07 Feq  "float branch equal") | 
 | (conditional-branch-f fb lg  OP_07 Flg  "float branch less or greater") | 
 | (conditional-branch-f fb ue  OP_07 Fue  "float branch unordered or equal") | 
 | (conditional-branch-f fb ul  OP_07 Ful  "float branch unordered or less") | 
 | (conditional-branch-f fb ge  OP_07 Fge  "float branch greater or equal") | 
 | (conditional-branch-f fb lt  OP_07 Flt  "float branch less") | 
 | (conditional-branch-f fb uge OP_07 Fuge "float branch unordered, greater,equal") | 
 | (conditional-branch-f fb ug  OP_07 Fug  "float branch unordered or greater") | 
 | (conditional-branch-f fb le  OP_07 Fle  "float branch less or equal") | 
 | (conditional-branch-f fb gt  OP_07 Fgt  "float branch greater") | 
 | (conditional-branch-f fb ule OP_07 Fule "float branch unordered, less or equal") | 
 | (conditional-branch-f fb u   OP_07 Fu   "float branch unordered") | 
 | (conditional-branch-f fb o   OP_07 Fo   "float branch ordered") | 
 |  | 
 | (define-pmacro (ctrlr-branch-semantics cond ccond) | 
 |   (sequence ((SI tmp)) | 
 | 	    (set tmp (sub (spr-lcr) 1)) | 
 | 	    (set (spr-lcr) tmp) | 
 | 	    (if cond | 
 | 		(if (eq ccond 0) | 
 | 		    (if (ne tmp 0) | 
 | 			(set pc (spr-lr))) | 
 | 		    (if (eq tmp 0) | 
 | 			(set pc (spr-lr)))))) | 
 | ) | 
 |  | 
 | (dni bctrlr | 
 |      "LCR conditional branch to lr" | 
 |      ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 |       (FR400-MAJOR B-2) (FR450-MAJOR B-2)) | 
 |      ("bctrlr$pack $ccond,$hint") | 
 |      (+ pack (cond-null) (ICCi_2-null) OP_0E hint OPE3_01 ccond (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint) | 
 | 	       (ctrlr-branch-semantics (const BI 1) ccond)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-branch-cclr prefix cc i-f op ope cond attr comment) | 
 |   (dni (.sym prefix cc lr) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) | 
 | 	(FR400-MAJOR B-3) (FR450-MAJOR B-3) attr) | 
 |        (.str (.sym prefix cc lr) "$pack $" i-f "CCi_2,$hint") | 
 |        (+ pack (.sym i-f CC_ cc) (.sym i-f CCi_2) op hint ope | 
 | 	  (ccond-null) (s12-null)) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_model_branch" (spr-lr) hint) | 
 | 		 (if (cond (.sym i-f CCi_2)) (set pc (spr-lr)))) | 
 |        ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 | 	(fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni bralr | 
 |      "integer cclr branch always" | 
 |      ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) | 
 |       (FR400-MAJOR B-3) (FR450-MAJOR B-3)) | 
 |      "bralr$pack$hint_taken" | 
 |      (+ pack ICC_ra (ICCi_2-null) OP_0E hint_taken OPE3_02 (ccond-null) (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_taken) | 
 | 	       (set pc (spr-lr))) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni bnolr | 
 |      "integer cclr branch never" | 
 |      ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) | 
 |       (FR400-MAJOR B-3) (FR450-MAJOR B-3)) | 
 |      "bnolr$pack$hint_not_taken" | 
 |      (+ pack ICC_nev (ICCi_2-null) OP_0E hint_not_taken OPE3_02 (ccond-null) (s12-null)) | 
 |      (c-call VOID "@cpu@_model_branch" (spr-lr) hint_not_taken) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-cclr b eq  I OP_0E OPE3_02 Ieq  NA "integer cclr branch equal") | 
 | (conditional-branch-cclr b ne  I OP_0E OPE3_02 Ine  NA "integer cclr branch not equal") | 
 | (conditional-branch-cclr b le  I OP_0E OPE3_02 Ile  NA "integer cclr branch less or equal") | 
 | (conditional-branch-cclr b gt  I OP_0E OPE3_02 Igt  NA "integer cclr branch greater") | 
 | (conditional-branch-cclr b lt  I OP_0E OPE3_02 Ilt  NA "integer cclr branch less") | 
 | (conditional-branch-cclr b ge  I OP_0E OPE3_02 Ige  NA "integer cclr branch greater or equal") | 
 | (conditional-branch-cclr b ls  I OP_0E OPE3_02 Ils  NA "integer cclr branch less or equal unsigned") | 
 | (conditional-branch-cclr b hi  I OP_0E OPE3_02 Ihi  NA "integer cclr branch greater unsigned") | 
 | (conditional-branch-cclr b c   I OP_0E OPE3_02 Ic   NA "integer cclr branch carry set") | 
 | (conditional-branch-cclr b nc  I OP_0E OPE3_02 Inc  NA "integer cclr branch carry clear") | 
 | (conditional-branch-cclr b n   I OP_0E OPE3_02 In   NA "integer cclr branch negative") | 
 | (conditional-branch-cclr b p   I OP_0E OPE3_02 Ip   NA "integer cclr branch positive") | 
 | (conditional-branch-cclr b v   I OP_0E OPE3_02 Iv   NA "integer cclr branch overflow set") | 
 | (conditional-branch-cclr b nv  I OP_0E OPE3_02 Inv  NA "integer cclr branch overflow clear") | 
 |  | 
 | (dni fbralr | 
 |      "float cclr branch always" | 
 |      ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) | 
 |       (FR400-MAJOR B-3) (FR450-MAJOR B-3) FR-ACCESS) | 
 |      "fbralr$pack$hint_taken" | 
 |      (+ pack FCC_ra (FCCi_2-null) OP_0E hint_taken OPE3_06 (ccond-null) (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_taken) | 
 | 	       (set pc (spr-lr))) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni fbnolr | 
 |      "float cclr branch never" | 
 |      ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) | 
 |       (FR400-MAJOR B-3) (FR450-MAJOR B-3) FR-ACCESS) | 
 |      "fbnolr$pack$hint_not_taken" | 
 |      (+ pack FCC_nev (FCCi_2-null) OP_0E hint_not_taken OPE3_06 (ccond-null) (s12-null)) | 
 |      (c-call VOID "@cpu@_model_branch" (spr-lr) hint_not_taken) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-cclr fb eq  F OP_0E OPE3_06 Feq  FR-ACCESS "float cclr branch equal") | 
 | (conditional-branch-cclr fb ne  F OP_0E OPE3_06 Fne  FR-ACCESS "float cclr branch not equal") | 
 | (conditional-branch-cclr fb lg  F OP_0E OPE3_06 Flg  FR-ACCESS "float branch less or greater") | 
 | (conditional-branch-cclr fb ue  F OP_0E OPE3_06 Fue  FR-ACCESS "float branch unordered or equal") | 
 | (conditional-branch-cclr fb ul  F OP_0E OPE3_06 Ful  FR-ACCESS "float branch unordered or less") | 
 | (conditional-branch-cclr fb ge  F OP_0E OPE3_06 Fge  FR-ACCESS "float branch greater or equal") | 
 | (conditional-branch-cclr fb lt  F OP_0E OPE3_06 Flt  FR-ACCESS "float branch less") | 
 | (conditional-branch-cclr fb uge F OP_0E OPE3_06 Fuge FR-ACCESS "float branch unordered, greater, equal") | 
 | (conditional-branch-cclr fb ug  F OP_0E OPE3_06 Fug  FR-ACCESS "float branch unordered or greater") | 
 | (conditional-branch-cclr fb le  F OP_0E OPE3_06 Fle  FR-ACCESS "float branch less or equal") | 
 | (conditional-branch-cclr fb gt  F OP_0E OPE3_06 Fgt  FR-ACCESS "float branch greater") | 
 | (conditional-branch-cclr fb ule F OP_0E OPE3_06 Fule FR-ACCESS "float branch unordered, less or equal") | 
 | (conditional-branch-cclr fb u   F OP_0E OPE3_06 Fu   FR-ACCESS "float branch unordered") | 
 | (conditional-branch-cclr fb o   F OP_0E OPE3_06 Fo   FR-ACCESS "float branch ordered") | 
 |  | 
 | (define-pmacro (conditional-branch-ctrlr prefix cc i-f op ope cond attr comment) | 
 |   (dni (.sym prefix cc lr) | 
 |        (comment) | 
 |        ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 | 	(FR400-MAJOR B-2) (FR450-MAJOR B-2) attr) | 
 |        (.str (.sym prefix cc lr) "$pack $" i-f "CCi_2,$ccond,$hint") | 
 |        (+ pack (.sym i-f CC_ cc) (.sym i-f CCi_2) op hint ope ccond (s12-null)) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_model_branch" (spr-lr) hint) | 
 | 		 (ctrlr-branch-semantics (cond (.sym i-f CCi_2)) ccond)) | 
 |        ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 | 	(fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni bcralr | 
 |      "integer ctrlr branch always" | 
 |      ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 |       (FR400-MAJOR B-2) (FR450-MAJOR B-2)) | 
 |      "bcralr$pack $ccond$hint_taken" | 
 |      (+ pack ICC_ra (ICCi_2-null) OP_0E hint_taken OPE3_03 ccond (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_taken) | 
 | 	       (ctrlr-branch-semantics (const BI 1) ccond)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni bcnolr | 
 |      "integer ctrlr branch never" | 
 |      ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 |       (FR400-MAJOR B-2) (FR450-MAJOR B-2)) | 
 |      "bcnolr$pack$hint_not_taken" | 
 |      (+ pack ICC_nev (ICCi_2-null) OP_0E hint_not_taken OPE3_03 (ccond-null) (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_not_taken) | 
 | 	       (ctrlr-branch-semantics (const BI 0) ccond)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-ctrlr bc eq  I OP_0E OPE3_03 Ieq  NA "integer ctrlr branch equal") | 
 | (conditional-branch-ctrlr bc ne  I OP_0E OPE3_03 Ine  NA "integer ctrlr branch not equal") | 
 | (conditional-branch-ctrlr bc le  I OP_0E OPE3_03 Ile  NA "integer ctrlr branch less equal") | 
 | (conditional-branch-ctrlr bc gt  I OP_0E OPE3_03 Igt  NA "integer ctrlr branch greater") | 
 | (conditional-branch-ctrlr bc lt  I OP_0E OPE3_03 Ilt  NA "integer ctrlr branch less") | 
 | (conditional-branch-ctrlr bc ge  I OP_0E OPE3_03 Ige  NA "integer ctrlr branch greater equal") | 
 | (conditional-branch-ctrlr bc ls  I OP_0E OPE3_03 Ils  NA "integer ctrlr branch less equal unsigned") | 
 | (conditional-branch-ctrlr bc hi  I OP_0E OPE3_03 Ihi  NA "integer ctrlr branch greater unsigned") | 
 | (conditional-branch-ctrlr bc c   I OP_0E OPE3_03 Ic   NA "integer ctrlr branch carry set") | 
 | (conditional-branch-ctrlr bc nc  I OP_0E OPE3_03 Inc  NA "integer ctrlr branch carry clear") | 
 | (conditional-branch-ctrlr bc n   I OP_0E OPE3_03 In   NA "integer ctrlr branch negative") | 
 | (conditional-branch-ctrlr bc p   I OP_0E OPE3_03 Ip   NA "integer ctrlr branch positive") | 
 | (conditional-branch-ctrlr bc v   I OP_0E OPE3_03 Iv   NA "integer ctrlr branch overflow set") | 
 | (conditional-branch-ctrlr bc nv  I OP_0E OPE3_03 Inv  NA "integer ctrlr branch overflow clear") | 
 |  | 
 | (dni fcbralr | 
 |      "float ctrlr branch always" | 
 |      ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 |       (FR400-MAJOR B-2) (FR450-MAJOR B-2) FR-ACCESS) | 
 |      "fcbralr$pack $ccond$hint_taken" | 
 |      (+ pack FCC_ra (FCCi_2-null) OP_0E hint_taken OPE3_07 ccond (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_taken) | 
 | 	       (ctrlr-branch-semantics (const BI 1) ccond)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni fcbnolr | 
 |      "float ctrlr branch never" | 
 |      ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) | 
 |       (FR400-MAJOR B-2) (FR450-MAJOR B-2) FR-ACCESS) | 
 |      "fcbnolr$pack$hint_not_taken" | 
 |      (+ pack FCC_nev (FCCi_2-null) OP_0E hint_not_taken OPE3_07 (ccond-null) (s12-null)) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_model_branch" (spr-lr) hint_not_taken) | 
 | 	       (ctrlr-branch-semantics (const BI 0) ccond)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (conditional-branch-ctrlr fcb eq  F OP_0E OPE3_07 Feq  FR-ACCESS "float cclr branch equal") | 
 | (conditional-branch-ctrlr fcb ne  F OP_0E OPE3_07 Fne  FR-ACCESS "float cclr branch not equal") | 
 | (conditional-branch-ctrlr fcb lg  F OP_0E OPE3_07 Flg  FR-ACCESS "float branch less or greater") | 
 | (conditional-branch-ctrlr fcb ue  F OP_0E OPE3_07 Fue  FR-ACCESS "float branch unordered or equal") | 
 | (conditional-branch-ctrlr fcb ul  F OP_0E OPE3_07 Ful  FR-ACCESS "float branch unordered or less") | 
 | (conditional-branch-ctrlr fcb ge  F OP_0E OPE3_07 Fge  FR-ACCESS "float branch greater or equal") | 
 | (conditional-branch-ctrlr fcb lt  F OP_0E OPE3_07 Flt  FR-ACCESS "float branch less") | 
 | (conditional-branch-ctrlr fcb uge F OP_0E OPE3_07 Fuge FR-ACCESS "float branch unordered, greater, equal") | 
 | (conditional-branch-ctrlr fcb ug  F OP_0E OPE3_07 Fug  FR-ACCESS "float branch unordered or greater") | 
 | (conditional-branch-ctrlr fcb le  F OP_0E OPE3_07 Fle  FR-ACCESS "float branch less or equal") | 
 | (conditional-branch-ctrlr fcb gt  F OP_0E OPE3_07 Fgt  FR-ACCESS "float branch greater") | 
 | (conditional-branch-ctrlr fcb ule F OP_0E OPE3_07 Fule FR-ACCESS "float branch unordered, less or equal") | 
 | (conditional-branch-ctrlr fcb u   F OP_0E OPE3_07 Fu   FR-ACCESS "float branch unordered") | 
 | (conditional-branch-ctrlr fcb o   F OP_0E OPE3_07 Fo   FR-ACCESS "float branch ordered") | 
 |  | 
 | (define-pmacro (jump-and-link-semantics base offset LI) | 
 |   (sequence () | 
 | 	    (if (eq LI 1) | 
 | 		(c-call VOID "@cpu@_set_write_next_vliw_addr_to_LR" 1)) | 
 | 	    ; Target address gets aligned here | 
 | 	    (set pc (and (add base offset) #xfffffffc)) | 
 | 	    (c-call VOID "@cpu@_model_branch" pc #x2)) ; hint branch taken | 
 | ) | 
 |  | 
 | (dni jmpl | 
 |      "jump and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5)) | 
 |      "jmpl$pack @($GRi,$GRj)" | 
 |      (+ pack (misc-null-1) (LI-off) OP_0C GRi (misc-null-2) GRj) | 
 |      (jump-and-link-semantics GRi GRj LI) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dann callann "call annotation" SI "call_annotation" "at") | 
 |  | 
 | (dni calll | 
 |      "call and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5)) | 
 |      "calll$pack $callann($GRi,$GRj)" | 
 |      (+ pack (misc-null-1) (LI-on) OP_0C GRi (misc-null-2) GRj) | 
 |      (jump-and-link-semantics GRi GRj LI) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni jmpil | 
 |      "jump immediate and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5)) | 
 |      "jmpil$pack @($GRi,$s12)" | 
 |      (+ pack (misc-null-1) (LI-off) OP_0D GRi s12) | 
 |      (jump-and-link-semantics GRi s12 LI) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni callil | 
 |      "call immediate and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5)) | 
 |      "callil$pack @($GRi,$s12)" | 
 |      (+ pack (misc-null-1) (LI-on) OP_0D GRi s12) | 
 |      (jump-and-link-semantics GRi s12 LI) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni call | 
 |      "call and link" | 
 |      ((UNIT B0) (FR500-MAJOR B-4) (FR550-MAJOR B-4) | 
 |       (FR400-MAJOR B-4) (FR450-MAJOR B-4)) | 
 |      "call$pack $label24" | 
 |      (+ pack OP_0F label24) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_write_next_vliw_addr_to_LR" 1) | 
 | 	       (set pc label24) | 
 | 	       (c-call VOID "@cpu@_model_branch" pc #x2)) ; hint branch taken | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni rett | 
 |     "return from trap" | 
 |     ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 |      (FR400-MAJOR C-2) (FR450-MAJOR C-2) PRIVILEGED) | 
 |     "rett$pack $debug" | 
 |     (+ pack (misc-null-1) debug OP_05 (rs-null) (s12-null)) | 
 |     ; frv_rett handles operating vs user mode | 
 |     (sequence () | 
 | 	      (set pc (c-call UWI "frv_rett" pc debug)) | 
 | 	      (c-call VOID "@cpu@_model_branch" pc #x2)) ; hint branch taken | 
 |     () | 
 | ) | 
 |  | 
 | (dni rei | 
 |      "run exception instruction" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (MACH frv) PRIVILEGED) | 
 |      "rei$pack $eir" | 
 |      (+ pack (rd-null) OP_37 eir (s12-null)) | 
 |      (nop) ; for now | 
 |      () | 
 | ) | 
 |  | 
 | (define-pmacro (trap-semantics cond base offset) | 
 |   (if cond | 
 |       (sequence () | 
 | 		; This is defered to frv_itrap because for the breakpoint | 
 | 		; case we want to change as little of the machine state as | 
 | 		; possible. | 
 | 		; | 
 | 		; PCSR=PC | 
 | 		; PSR.PS=PSR.S | 
 | 		; PSR.ET=0 | 
 | 		; if PSR.ESR==1 | 
 | 		;   SR0 through SR3=GR4 through GR7 | 
 | 		; TBR.TT=0x80 + ((GRi + s12) & 0x7f) | 
 | 		; PC=TBR | 
 | 		; We still should indicate what is modified by this insn. | 
 | 		(clobber (spr-pcsr)) | 
 | 		(clobber psr_ps) | 
 | 		(clobber psr_et) | 
 | 		(clobber tbr_tt) | 
 | 		(if (ne psr_esr (const 0)) | 
 | 		    (sequence () | 
 | 			      (clobber (spr-sr0)) | 
 | 			      (clobber (spr-sr1)) | 
 | 			      (clobber (spr-sr2)) | 
 | 			      (clobber (spr-sr3)))) | 
 | 		; frv_itrap handles operating vs user mode | 
 | 		(c-call VOID "frv_itrap" pc base offset))) | 
 | ) | 
 |  | 
 | (define-pmacro (trap-r prefix cc i-f op ope cond attr comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 | 	(FR400-MAJOR C-1) (FR450-MAJOR C-1) attr) | 
 |        (.str (.sym prefix cc) "$pack $" i-f "CCi_2,$GRi,$GRj") | 
 |        (+ pack (.sym i-f CC_ cc) (.sym i-f CCi_2) op GRi (misc-null-3) ope GRj) | 
 |        (trap-semantics (cond (.sym i-f CCi_2)) GRi GRj) | 
 |        ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 | 	(fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni tra | 
 |      "integer trap always" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1)) | 
 |      "tra$pack $GRi,$GRj" | 
 |      (+ pack ICC_ra (ICCi_2-null) OP_04 GRi (misc-null-3) OPE4_0 GRj) | 
 |      (trap-semantics (const BI 1) GRi GRj) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (dni tno | 
 |      "integer trap never" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1)) | 
 |      "tno$pack" | 
 |      (+ pack ICC_nev (ICCi_2-null) OP_04 (GRi-null) (misc-null-3) OPE4_0 (GRj-null)) | 
 |      (trap-semantics (const BI 0) GRi GRj) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (trap-r t eq  I OP_04 OPE4_0 Ieq  NA "integer trap equal") | 
 | (trap-r t ne  I OP_04 OPE4_0 Ine  NA "integer trap not equal") | 
 | (trap-r t le  I OP_04 OPE4_0 Ile  NA "integer trap less or equal") | 
 | (trap-r t gt  I OP_04 OPE4_0 Igt  NA "integer trap greater") | 
 | (trap-r t lt  I OP_04 OPE4_0 Ilt  NA "integer trap less") | 
 | (trap-r t ge  I OP_04 OPE4_0 Ige  NA "integer trap greater or equal") | 
 | (trap-r t ls  I OP_04 OPE4_0 Ils  NA "integer trap less or equal unsigned") | 
 | (trap-r t hi  I OP_04 OPE4_0 Ihi  NA "integer trap greater unsigned") | 
 | (trap-r t c   I OP_04 OPE4_0 Ic   NA "integer trap carry set") | 
 | (trap-r t nc  I OP_04 OPE4_0 Inc  NA "integer trap carry clear") | 
 | (trap-r t n   I OP_04 OPE4_0 In   NA "integer trap negative") | 
 | (trap-r t p   I OP_04 OPE4_0 Ip   NA "integer trap positive") | 
 | (trap-r t v   I OP_04 OPE4_0 Iv   NA "integer trap overflow set") | 
 | (trap-r t nv  I OP_04 OPE4_0 Inv  NA "integer trap overflow clear") | 
 |  | 
 | (dni ftra | 
 |      "float trap always" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1) FR-ACCESS) | 
 |      "ftra$pack $GRi,$GRj" | 
 |      (+ pack FCC_ra (FCCi_2-null) OP_04 GRi (misc-null-3) OPE4_1 GRj) | 
 |      (trap-semantics (const BI 1) GRi GRj) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (dni ftno | 
 |      "flost trap never" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1) FR-ACCESS) | 
 |      "ftno$pack" | 
 |      (+ pack FCC_nev (FCCi_2-null) OP_04 (GRi-null) (misc-null-3) OPE4_1 (GRj-null)) | 
 |      (trap-semantics (const BI 0) GRi GRj) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (trap-r ft ne  F OP_04 OPE4_1 Fne  FR-ACCESS "float trap not equal") | 
 | (trap-r ft eq  F OP_04 OPE4_1 Feq  FR-ACCESS "float trap equal") | 
 | (trap-r ft lg  F OP_04 OPE4_1 Flg  FR-ACCESS "float trap greater or less") | 
 | (trap-r ft ue  F OP_04 OPE4_1 Fue  FR-ACCESS "float trap unordered or equal") | 
 | (trap-r ft ul  F OP_04 OPE4_1 Ful  FR-ACCESS "float trap unordered or less") | 
 | (trap-r ft ge  F OP_04 OPE4_1 Fge  FR-ACCESS "float trap greater or equal") | 
 | (trap-r ft lt  F OP_04 OPE4_1 Flt  FR-ACCESS "float trap less") | 
 | (trap-r ft uge F OP_04 OPE4_1 Fuge FR-ACCESS "float trap unordered greater or equal") | 
 | (trap-r ft ug  F OP_04 OPE4_1 Fug  FR-ACCESS "float trap unordered or greater") | 
 | (trap-r ft le  F OP_04 OPE4_1 Fle  FR-ACCESS "float trap less or equal") | 
 | (trap-r ft gt  F OP_04 OPE4_1 Fgt  FR-ACCESS "float trap greater") | 
 | (trap-r ft ule F OP_04 OPE4_1 Fule FR-ACCESS "float trap unordered less or equal") | 
 | (trap-r ft u   F OP_04 OPE4_1 Fu   FR-ACCESS "float trap unordered") | 
 | (trap-r ft o   F OP_04 OPE4_1 Fo   FR-ACCESS "float trap ordered") | 
 |  | 
 | (define-pmacro (trap-immed prefix cc i-f op cond attr comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 | 	(FR400-MAJOR C-1) (FR450-MAJOR C-1) attr) | 
 |        (.str (.sym prefix cc) "$pack $" i-f "CCi_2,$GRi,$s12") | 
 |        (+ pack (.sym i-f CC_ cc) (.sym i-f CCi_2) op GRi s12) | 
 |        (trap-semantics (cond (.sym i-f CCi_2)) GRi s12) | 
 |        ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 | 	(fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni tira | 
 |      "integer trap always" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1)) | 
 |      "tira$pack $GRi,$s12" | 
 |      (+ pack ICC_ra (ICCi_2-null) OP_1C GRi s12) | 
 |      (trap-semantics (const BI 1) GRi s12) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (dni tino | 
 |      "integer trap never" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1)) | 
 |      "tino$pack" | 
 |      (+ pack ICC_nev (ICCi_2-null) OP_1C (GRi-null) (s12-null)) | 
 |      (trap-semantics (const BI 0) GRi s12) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (trap-immed ti eq  I OP_1C Ieq  NA "integer trap equal") | 
 | (trap-immed ti ne  I OP_1C Ine  NA "integer trap not equal") | 
 | (trap-immed ti le  I OP_1C Ile  NA "integer trap less or equal") | 
 | (trap-immed ti gt  I OP_1C Igt  NA "integer trap greater") | 
 | (trap-immed ti lt  I OP_1C Ilt  NA "integer trap less") | 
 | (trap-immed ti ge  I OP_1C Ige  NA "integer trap greater or equal") | 
 | (trap-immed ti ls  I OP_1C Ils  NA "integer trap less or equal unsigned") | 
 | (trap-immed ti hi  I OP_1C Ihi  NA "integer trap greater unsigned") | 
 | (trap-immed ti c   I OP_1C Ic   NA "integer trap carry set") | 
 | (trap-immed ti nc  I OP_1C Inc  NA "integer trap carry clear") | 
 | (trap-immed ti n   I OP_1C In   NA "integer trap negative") | 
 | (trap-immed ti p   I OP_1C Ip   NA "integer trap positive") | 
 | (trap-immed ti v   I OP_1C Iv   NA "integer trap overflow set") | 
 | (trap-immed ti nv  I OP_1C Inv  NA "integer trap overflow clear") | 
 |  | 
 | (dni ftira | 
 |      "float trap always" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1) FR-ACCESS) | 
 |      "ftira$pack $GRi,$s12" | 
 |      (+ pack FCC_ra (ICCi_2-null) OP_1D GRi s12) | 
 |      (trap-semantics (const BI 1) GRi s12) | 
 |      ((fr400 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (dni ftino | 
 |      "float trap never" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1) FR-ACCESS) | 
 |      "ftino$pack" | 
 |      (+ pack FCC_nev (FCCi_2-null) OP_1D (GRi-null) (s12-null)) | 
 |      (trap-semantics (const BI 0) GRi s12) | 
 |      ((fr400 (unit u-trap)) (fr450 (unit u-trap)) | 
 |       (fr500 (unit u-trap)) (fr550 (unit u-trap))) | 
 | ) | 
 |  | 
 | (trap-immed fti ne  F OP_1D Fne  FR-ACCESS "float trap not equal") | 
 | (trap-immed fti eq  F OP_1D Feq  FR-ACCESS "float trap equal") | 
 | (trap-immed fti lg  F OP_1D Flg  FR-ACCESS "float trap greater or less") | 
 | (trap-immed fti ue  F OP_1D Fue  FR-ACCESS "float trap unordered or equal") | 
 | (trap-immed fti ul  F OP_1D Ful  FR-ACCESS "float trap unordered or less") | 
 | (trap-immed fti ge  F OP_1D Fge  FR-ACCESS "float trap greater or equal") | 
 | (trap-immed fti lt  F OP_1D Flt  FR-ACCESS "float trap less") | 
 | (trap-immed fti uge F OP_1D Fuge FR-ACCESS "float trap unordered greater or equal") | 
 | (trap-immed fti ug  F OP_1D Fug  FR-ACCESS "float trap unordered or greater") | 
 | (trap-immed fti le  F OP_1D Fle  FR-ACCESS "float trap less or equal") | 
 | (trap-immed fti gt  F OP_1D Fgt  FR-ACCESS "float trap greater") | 
 | (trap-immed fti ule F OP_1D Fule FR-ACCESS "float trap unordered less or equal") | 
 | (trap-immed fti u   F OP_1D Fu   FR-ACCESS "float trap unordered") | 
 | (trap-immed fti o   F OP_1D Fo   FR-ACCESS "float trap ordered") | 
 |  | 
 | (dni break | 
 |      "break trap" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1)) | 
 |      "break$pack" | 
 |      (+ pack (rd-null) OP_04 (rs-null) (misc-null-3) OPE4_3 (GRj-null)) | 
 |      (sequence () | 
 | 	       ; This is defered to frv_break because for the breakpoint | 
 | 	       ; case we want to change as little of the machine state as | 
 | 	       ; possible. | 
 | 	       ; | 
 | 	       ; BPCSR=PC | 
 | 	       ; BPSR.BS=PSR.S | 
 | 	       ; BPSR.BET=PSR.ET | 
 | 	       ; PSR.S=1 | 
 | 	       ; PSR.ET=0 | 
 | 	       ; TBR.TT=0xff | 
 | 	       ; PC=TBR | 
 | 	       ; We still should indicate what is modified by this insn. | 
 | 	       (clobber (spr-bpcsr)) | 
 | 	       (clobber bpsr_bs) | 
 | 	       (clobber bpsr_bet) | 
 | 	       (clobber psr_s) | 
 | 	       (clobber psr_et) | 
 | 	       (clobber tbr_tt) | 
 | 	       (c-call VOID "frv_break")) | 
 |      () | 
 | ) | 
 |  | 
 | (dni mtrap | 
 |      "media trap" | 
 |      ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) | 
 |       (FR400-MAJOR C-1) (FR450-MAJOR C-1) FR-ACCESS) | 
 |      "mtrap$pack" | 
 |      (+ pack (rd-null) OP_04 (rs-null) (misc-null-3) OPE4_2 (GRj-null)) | 
 |      (c-call VOID "frv_mtrap") | 
 |      () | 
 | ) | 
 |  | 
 | (define-pmacro (condition-code-logic name operation ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-6) (FR550-MAJOR B-6) | 
 | 	(FR400-MAJOR B-6) (FR450-MAJOR B-6)) | 
 |        (.str name "$pack $CRi,$CRj,$CRk") | 
 |        (+ pack (misc-null-6) CRk OP_0A (misc-null-7) CRi ope (misc-null-8) CRj) | 
 |        (set CRk (c-call UQI "@cpu@_cr_logic" operation CRi CRj)) | 
 |        () | 
 |   ) | 
 | ) | 
 | (define-pmacro (op-andcr)   0) | 
 | (define-pmacro (op-orcr)    1) | 
 | (define-pmacro (op-xorcr)   2) | 
 | (define-pmacro (op-nandcr)  3) | 
 | (define-pmacro (op-norcr)   4) | 
 | (define-pmacro (op-andncr)  5) | 
 | (define-pmacro (op-orncr)   6) | 
 | (define-pmacro (op-nandncr) 7) | 
 | (define-pmacro (op-norncr)  8) | 
 |  | 
 | (define-pmacro (cr-true)  3) | 
 | (define-pmacro (cr-false) 2) | 
 | (define-pmacro (cr-undefined) 0) | 
 |  | 
 | (condition-code-logic andcr   (op-andcr)   OPE1_08 "and   condition code regs") | 
 | (condition-code-logic orcr    (op-orcr)    OPE1_09 "or    condition code regs") | 
 | (condition-code-logic xorcr   (op-xorcr)   OPE1_0A "xor   condition code regs") | 
 | (condition-code-logic nandcr  (op-nandcr)  OPE1_0C "nand  condition code regs") | 
 | (condition-code-logic norcr   (op-norcr)   OPE1_0D "nor   condition code regs") | 
 | (condition-code-logic andncr  (op-andncr)  OPE1_10 "andn  condition code regs") | 
 | (condition-code-logic orncr   (op-orncr)   OPE1_11 "orn   condition code regs") | 
 | (condition-code-logic nandncr (op-nandncr) OPE1_14 "nandn condition code regs") | 
 | (condition-code-logic norncr  (op-norncr)  OPE1_15 "norn  condition code regs") | 
 |  | 
 | (dni notcr | 
 |      ("not cccr register") | 
 |      ((UNIT B01) (FR500-MAJOR B-6) (FR550-MAJOR B-6) | 
 |       (FR400-MAJOR B-6) (FR450-MAJOR B-6)) | 
 |      (.str notcr "$pack $CRj,$CRk") | 
 |      (+ pack (misc-null-6) CRk OP_0A (rs-null) OPE1_0B (misc-null-8) CRj) | 
 |      (set CRk (xor CRj 1)) | 
 |      () | 
 | ) | 
 |  | 
 | (define-pmacro (check-semantics cond cr) | 
 |   (if cond (set cr (cr-true)) (set cr (cr-false))) | 
 | ) | 
 |  | 
 | (define-pmacro (check-int-condition-code prefix cc op cond comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 | 	(FR400-MAJOR B-5) (FR450-MAJOR B-5)) | 
 |        (.str (.sym prefix cc) "$pack $ICCi_3,$CRj_int") | 
 |        (+ pack (.sym ICC_ cc) CRj_int op (misc-null-5) ICCi_3) | 
 |        (check-semantics (cond ICCi_3) CRj_int) | 
 |        ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 | 	(fr500 (unit u-check)) (fr550 (unit u-check))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni ckra | 
 |      "check integer cc always" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5)) | 
 |      "ckra$pack $CRj_int" | 
 |      (+ pack ICC_ra CRj_int OP_08 (misc-null-5) (ICCi_3-null)) | 
 |      (check-semantics (const BI 1) CRj_int) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (dni ckno | 
 |      "check integer cc never" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5)) | 
 |      "ckno$pack $CRj_int" | 
 |      (+ pack ICC_nev CRj_int OP_08 (misc-null-5) (ICCi_3-null)) | 
 |      (check-semantics (const BI 0) CRj_int) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (check-int-condition-code ck eq  OP_08 Ieq  "check integer cc equal") | 
 | (check-int-condition-code ck ne  OP_08 Ine  "check integer cc not equal") | 
 | (check-int-condition-code ck le  OP_08 Ile  "check integer cc less or equal") | 
 | (check-int-condition-code ck gt  OP_08 Igt  "check integer cc greater") | 
 | (check-int-condition-code ck lt  OP_08 Ilt  "check integer cc less") | 
 | (check-int-condition-code ck ge  OP_08 Ige  "check integer cc greater or equal") | 
 | (check-int-condition-code ck ls  OP_08 Ils  "check integer cc less or equal unsigned") | 
 | (check-int-condition-code ck hi  OP_08 Ihi  "check integer cc greater unsigned") | 
 | (check-int-condition-code ck c   OP_08 Ic   "check integer cc carry set") | 
 | (check-int-condition-code ck nc  OP_08 Inc  "check integer cc carry clear") | 
 | (check-int-condition-code ck n   OP_08 In   "check integer cc negative") | 
 | (check-int-condition-code ck p   OP_08 Ip   "check integer cc positive") | 
 | (check-int-condition-code ck v   OP_08 Iv   "check integer cc overflow set") | 
 | (check-int-condition-code ck nv  OP_08 Inv  "check integer cc overflow clear") | 
 |  | 
 | (define-pmacro (check-float-condition-code prefix cc op cond comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 | 	(FR400-MAJOR B-5) (FR450-MAJOR B-5) FR-ACCESS) | 
 |        (.str (.sym prefix cc) "$pack $FCCi_3,$CRj_float") | 
 |        (+ pack (.sym FCC_ cc) CRj_float op (misc-null-5) FCCi_3) | 
 |        (check-semantics (cond FCCi_3) CRj_float) | 
 |        ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 | 	(fr500 (unit u-check)) (fr550 (unit u-check))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni fckra | 
 |      "check float cc always" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) FR-ACCESS) | 
 |      "fckra$pack $CRj_float" | 
 |      (+ pack FCC_ra CRj_float OP_09 (misc-null-5) FCCi_3) | 
 |      (check-semantics (const BI 1) CRj_float) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (dni fckno | 
 |      "check float cc never" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) FR-ACCESS) | 
 |      "fckno$pack $CRj_float" | 
 |      (+ pack FCC_nev CRj_float OP_09 (misc-null-5) FCCi_3) | 
 |      (check-semantics (const BI 0) CRj_float) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (check-float-condition-code fck ne  OP_09 Fne  "check float cc not equal") | 
 | (check-float-condition-code fck eq  OP_09 Feq  "check float cc equal") | 
 | (check-float-condition-code fck lg  OP_09 Flg  "check float cc greater or less") | 
 | (check-float-condition-code fck ue  OP_09 Fue  "check float cc unordered or equal") | 
 | (check-float-condition-code fck ul  OP_09 Ful  "check float cc unordered or less") | 
 | (check-float-condition-code fck ge  OP_09 Fge  "check float cc greater or equal") | 
 | (check-float-condition-code fck lt  OP_09 Flt  "check float cc less") | 
 | (check-float-condition-code fck uge OP_09 Fuge "check float cc unordered greater or equal") | 
 | (check-float-condition-code fck ug  OP_09 Fug  "check float cc unordered or greater") | 
 | (check-float-condition-code fck le  OP_09 Fle  "check float cc less or equal") | 
 | (check-float-condition-code fck gt  OP_09 Fgt  "check float cc greater") | 
 | (check-float-condition-code fck ule OP_09 Fule "check float cc unordered less or equal") | 
 | (check-float-condition-code fck u   OP_09 Fu   "check float cc unordered") | 
 | (check-float-condition-code fck o   OP_09 Fo   "check float cc ordered") | 
 |  | 
 | (define-pmacro (conditional-check-int-condition-code prefix cc op ope test comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 | 	(FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL) | 
 |        (.str (.sym prefix cc) "$pack $ICCi_3,$CRj_int,$CCi,$cond") | 
 |        (+ pack (.sym ICC_ cc) CRj_int op (rs-null) CCi cond ope | 
 | 	  (misc-null-9) ICCi_3) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (check-semantics (test ICCi_3) CRj_int) | 
 | 	   (set CRj_int (cr-undefined))) | 
 |        ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 | 	(fr500 (unit u-check)) (fr550 (unit u-check))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni cckra | 
 |      "conditional check integer cc always" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL) | 
 |      "cckra$pack $CRj_int,$CCi,$cond" | 
 |      (+ pack ICC_ra CRj_int OP_6A (rs-null) CCi cond OPE4_0 | 
 | 	(misc-null-9) (ICCi_3-null)) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (check-semantics (const BI 1) CRj_int) | 
 | 	 (set CRj_int (cr-undefined))) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (dni cckno | 
 |      "conditional check integer cc never" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL) | 
 |      "cckno$pack $CRj_int,$CCi,$cond" | 
 |      (+ pack ICC_nev CRj_int OP_6A (rs-null) CCi cond OPE4_0 | 
 | 	(misc-null-9) (ICCi_3-null)) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (check-semantics (const BI 0) CRj_int) | 
 | 	 (set CRj_int (cr-undefined))) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (conditional-check-int-condition-code cck eq  OP_6A OPE4_0 Ieq  "check integer cc equal") | 
 | (conditional-check-int-condition-code cck ne  OP_6A OPE4_0 Ine  "check integer cc not equal") | 
 | (conditional-check-int-condition-code cck le  OP_6A OPE4_0 Ile  "check integer cc less or equal") | 
 | (conditional-check-int-condition-code cck gt  OP_6A OPE4_0 Igt  "check integer cc greater") | 
 | (conditional-check-int-condition-code cck lt  OP_6A OPE4_0 Ilt  "check integer cc less") | 
 | (conditional-check-int-condition-code cck ge  OP_6A OPE4_0 Ige  "check integer cc greater or equal") | 
 | (conditional-check-int-condition-code cck ls  OP_6A OPE4_0 Ils  "check integer cc less or equal unsigned") | 
 | (conditional-check-int-condition-code cck hi  OP_6A OPE4_0 Ihi  "check integer cc greater unsigned") | 
 | (conditional-check-int-condition-code cck c   OP_6A OPE4_0 Ic   "check integer cc carry set") | 
 | (conditional-check-int-condition-code cck nc  OP_6A OPE4_0 Inc  "check integer cc carry clear") | 
 | (conditional-check-int-condition-code cck n   OP_6A OPE4_0 In   "check integer cc negative") | 
 | (conditional-check-int-condition-code cck p   OP_6A OPE4_0 Ip   "check integer cc positive") | 
 | (conditional-check-int-condition-code cck v   OP_6A OPE4_0 Iv   "check integer cc overflow set") | 
 | (conditional-check-int-condition-code cck nv  OP_6A OPE4_0 Inv  "check integer cc overflow clear") | 
 |  | 
 | (define-pmacro (conditional-check-float-condition-code prefix cc op ope test comment) | 
 |   (dni (.sym prefix cc) | 
 |        (comment) | 
 |        ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 | 	(FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL FR-ACCESS) | 
 |        (.str (.sym prefix cc) "$pack $FCCi_3,$CRj_float,$CCi,$cond") | 
 |        (+ pack (.sym FCC_ cc) CRj_float op (rs-null) CCi cond ope | 
 | 	  (misc-null-9) FCCi_3) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (check-semantics (test FCCi_3) CRj_float) | 
 | 	   (set CRj_float (cr-undefined))) | 
 |        ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 | 	(fr500 (unit u-check)) (fr550 (unit u-check))) | 
 |   ) | 
 | ) | 
 |  | 
 | (dni cfckra | 
 |      "conditional check float cc always" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL FR-ACCESS) | 
 |      "cfckra$pack $CRj_float,$CCi,$cond" | 
 |      (+ pack FCC_ra CRj_float OP_6A (rs-null) CCi cond OPE4_1 | 
 | 	(misc-null-9) (FCCi_3-null)) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (check-semantics (const BI 1) CRj_float) | 
 | 	 (set CRj_float (cr-undefined))) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (dni cfckno | 
 |      "conditional check float cc never" | 
 |      ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) | 
 |       (FR400-MAJOR B-5) (FR450-MAJOR B-5) CONDITIONAL FR-ACCESS) | 
 |      "cfckno$pack $CRj_float,$CCi,$cond" | 
 |      (+ pack FCC_nev CRj_float OP_6A (rs-null) CCi cond OPE4_1 | 
 | 	(misc-null-9) (FCCi_3-null)) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (check-semantics (const BI 0) CRj_float) | 
 | 	 (set CRj_float (cr-undefined))) | 
 |      ((fr400 (unit u-check)) (fr450 (unit u-check)) | 
 |       (fr500 (unit u-check)) (fr550 (unit u-check))) | 
 | ) | 
 |  | 
 | (conditional-check-float-condition-code cfck ne  OP_6A OPE4_1 Fne  "check float cc not equal") | 
 | (conditional-check-float-condition-code cfck eq  OP_6A OPE4_1 Feq  "check float cc equal") | 
 | (conditional-check-float-condition-code cfck lg  OP_6A OPE4_1 Flg  "check float cc greater or less") | 
 | (conditional-check-float-condition-code cfck ue  OP_6A OPE4_1 Fue  "check float cc unordered or equal") | 
 | (conditional-check-float-condition-code cfck ul  OP_6A OPE4_1 Ful  "check float cc unordered or less") | 
 | (conditional-check-float-condition-code cfck ge  OP_6A OPE4_1 Fge  "check float cc greater or equal") | 
 | (conditional-check-float-condition-code cfck lt  OP_6A OPE4_1 Flt  "check float cc less") | 
 | (conditional-check-float-condition-code cfck uge OP_6A OPE4_1 Fuge "check float cc unordered greater or equal") | 
 | (conditional-check-float-condition-code cfck ug  OP_6A OPE4_1 Fug  "check float cc unordered or greater") | 
 | (conditional-check-float-condition-code cfck le  OP_6A OPE4_1 Fle  "check float cc less or equal") | 
 | (conditional-check-float-condition-code cfck gt  OP_6A OPE4_1 Fgt  "check float cc greater") | 
 | (conditional-check-float-condition-code cfck ule OP_6A OPE4_1 Fule "check float cc unordered less or equal") | 
 | (conditional-check-float-condition-code cfck u   OP_6A OPE4_1 Fu   "check float cc unordered") | 
 | (conditional-check-float-condition-code cfck o   OP_6A OPE4_1 Fo   "check float cc ordered") | 
 |  | 
 | (dni cjmpl | 
 |      "conditional jump and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5) CONDITIONAL) | 
 |      "cjmpl$pack @($GRi,$GRj),$CCi,$cond" | 
 |      (+ pack (misc-null-1) (LI-off) OP_6A GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (jump-and-link-semantics GRi GRj LI)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (dni ccalll | 
 |      "conditional call and link" | 
 |      ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) | 
 |       (FR400-MAJOR I-5) (FR450-MAJOR I-5) CONDITIONAL) | 
 |      "ccalll$pack @($GRi,$GRj),$CCi,$cond" | 
 |      (+ pack (misc-null-1) (LI-on) OP_6A GRi CCi cond OPE4_2 GRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (jump-and-link-semantics GRi GRj LI)) | 
 |      ((fr400 (unit u-branch)) (fr450 (unit u-branch)) | 
 |       (fr500 (unit u-branch)) (fr550 (unit u-branch))) | 
 | ) | 
 |  | 
 | (define-pmacro (cache-invalidate name cache all op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 | 	(FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |        (.str name "$pack @($GRi,$GRj)") | 
 |        (+ pack (rd-null) op GRi ope GRj) | 
 |        (c-call VOID (.str "@cpu@_" cache "_cache_invalidate") (add GRi GRj) all) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (cache-invalidate ici insn 0 OP_03 OPE1_38 | 
 | 		  ((fr400 (unit u-ici)) (fr450 (unit u-ici)) | 
 | 		   (fr500 (unit u-ici)) (fr550 (unit u-ici))) | 
 | 		  "invalidate insn cache") | 
 | (cache-invalidate dci data 0 OP_03 OPE1_3C | 
 | 		  ((fr400 (unit u-dci)) (fr450 (unit u-dci)) | 
 | 		   (fr500 (unit u-dci)) (fr550 (unit u-dci))) | 
 | 		  "invalidate data cache") | 
 |  | 
 | (define-pmacro (cache-invalidate-entry name cache op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (MACH fr400,fr450,fr550) (FR550-MAJOR C-2) | 
 | 	(FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |        (.str name "$pack @($GRi,$GRj),$ae") | 
 |        (+ pack (misc-null-1) ae op GRi ope GRj) | 
 |        (if (eq ae 0) | 
 | 	   (c-call VOID (.str "@cpu@_" cache "_cache_invalidate") (add GRi GRj) -1) ; Invalid ae setting for this insn | 
 | 	   (c-call VOID (.str "@cpu@_" cache "_cache_invalidate") (add GRi GRj) ae)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (cache-invalidate-entry icei insn OP_03 OPE1_39 | 
 | 			((fr400 (unit u-ici)) (fr450 (unit u-ici)) | 
 | 			 (fr550 (unit u-ici))) | 
 | 			"invalidate insn cache entry") | 
 | (cache-invalidate-entry dcei data OP_03 OPE1_3A | 
 | 			((fr400 (unit u-dci)) (fr450 (unit u-dci)) | 
 | 			 (fr550 (unit u-dci))) | 
 | 			"invalidate data cache entry") | 
 |  | 
 | (dni dcf | 
 |      "Data cache flush" | 
 |      ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 |       (FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |      "dcf$pack @($GRi,$GRj)" | 
 |      (+ pack (rd-null) OP_03 GRi OPE1_3D GRj) | 
 |      (c-call VOID "@cpu@_data_cache_flush" (add GRi GRj) 0) | 
 |      ((fr400 (unit u-dcf)) (fr450 (unit u-dcf)) | 
 |       (fr500 (unit u-dcf)) (fr550 (unit u-dcf))) | 
 | ) | 
 |  | 
 | (dni dcef | 
 |      "Data cache entry flush" | 
 |      ((UNIT C) (MACH fr400,fr450,fr550) (FR550-MAJOR C-2) | 
 |       (FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |      "dcef$pack @($GRi,$GRj),$ae" | 
 |      (+ pack (misc-null-1) ae OP_03 GRi OPE1_3B GRj) | 
 |      (if (eq ae 0) | 
 | 	 (c-call VOID "@cpu@_data_cache_flush" (add GRi GRj) -1) | 
 | 	 (c-call VOID "@cpu@_data_cache_flush" (add GRi GRj) ae)) | 
 |      ((fr400 (unit u-dcf)) (fr450 (unit u-dcf)) (fr550 (unit u-dcf))) | 
 | ) | 
 |  | 
 | (define-pmacro (write-TLB name insn op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (MACH frv) PRIVILEGED) | 
 |        (.str insn "$pack $GRk,@($GRi,$GRj)") | 
 |        (+ pack GRk op GRi ope GRj) | 
 |        (nop) ; for now | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (write-TLB witlb witlb OP_03 OPE1_32 "write for insn TLB") | 
 | (write-TLB wdtlb wdtlb OP_03 OPE1_36 "write for data TLB") | 
 |  | 
 | (define-pmacro (invalidate-TLB name insn op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (MACH frv) PRIVILEGED) | 
 |        (.str insn "$pack @($GRi,$GRj)") | 
 |        (+ pack (rd-null) op GRi ope GRj) | 
 |        (nop) ; for now | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (invalidate-TLB itlbi itlbi OP_03 OPE1_33 "invalidate insn TLB") | 
 | (invalidate-TLB dtlbi dtlbi OP_03 OPE1_37 "invalidate data TLB") | 
 |  | 
 | (define-pmacro (cache-preload name cache pipe attrs op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) (FR500-MAJOR C-2) | 
 | 		(FR400-MAJOR C-2) (.unsplice attrs)) | 
 |        (.str name "$pack $GRi,$GRj,$lock") | 
 |        (+ pack (misc-null-1) lock op GRi ope GRj) | 
 |        (c-call VOID (.str "@cpu@_" cache "_cache_preload") GRi GRj lock) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (cache-preload icpl insn C ((FR550-MAJOR C-2) (FR450-MAJOR C-2)) OP_03 OPE1_30 | 
 | 	       ((fr400 (unit u-icpl)) (fr450 (unit u-icpl))  | 
 | 		(fr500 (unit u-icpl)) (fr550 (unit u-icpl))) | 
 | 	       "preload insn cache") | 
 | (cache-preload dcpl data DCPL ((FR550-MAJOR I-8) (FR450-MAJOR I-2)) OP_03 OPE1_34 | 
 | 	       ((fr400 (unit u-dcpl)) (fr450 (unit u-dcpl)) | 
 | 		(fr500 (unit u-dcpl)) (fr550 (unit u-dcpl))) | 
 | 	       "preload data cache") | 
 |  | 
 | (define-pmacro (cache-unlock name cache op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 | 	(FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |        (.str name "$pack $GRi") | 
 |        (+ pack (rd-null) op GRi ope (GRj-null)) | 
 |        (c-call VOID (.str "@cpu@_" cache "_cache_unlock") GRi) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (cache-unlock icul insn OP_03 OPE1_31 | 
 | 	      ((fr400 (unit u-icul)) (fr450 (unit u-icul)) | 
 | 	       (fr500 (unit u-icul)) (fr550 (unit u-icul))) | 
 | 	      "unlock insn cache") | 
 | (cache-unlock dcul data OP_03 OPE1_35 | 
 | 	      ((fr400 (unit u-dcul)) (fr450 (unit u-dcul)) | 
 | 	       (fr500 (unit u-dcul)) (fr550 (unit u-dcul))) | 
 | 	      "unlock data cache") | 
 |  | 
 | (define-pmacro (barrier name insn op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) | 
 | 	(FR400-MAJOR C-2) (FR450-MAJOR C-2)) | 
 |        (.str insn "$pack") | 
 |        (+ pack (rd-null) op (rs-null) ope (GRj-null)) | 
 |        (nop) ; sufficient implementation | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (barrier bar    bar    OP_03 OPE1_3E | 
 | 	 ((fr400 (unit u-barrier)) (fr450 (unit u-barrier)) | 
 | 	  (fr500 (unit u-barrier))) | 
 | 	 "barrier") | 
 | (barrier membar membar OP_03 OPE1_3F | 
 | 	 ((fr400 (unit u-membar)) (fr450 (unit u-membar)) | 
 | 	  (fr500 (unit u-membar))) | 
 | 	 "memory barrier") | 
 |  | 
 | ; Load real address instructions | 
 | (define-pmacro (load-real-address name insn what op ope) | 
 |   (dni name | 
 |        (.str "Load real address of " what) | 
 |        ((UNIT C) (FR450-MAJOR C-2) (MACH fr450)) | 
 |        (.str insn "$pack $GRi,$GRk,$LRAE,$LRAD,$LRAS") | 
 |        (+ pack GRk op GRi ope LRAE LRAD LRAS (LRA-null)) | 
 |        (nop) ; not simulated | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (load-real-address lrai "lrai" "instruction" OP_03 OPE1_20) | 
 | (load-real-address lrad "lrad" "data" OP_03 OPE1_21) | 
 |  | 
 | (dni tlbpr | 
 |      "TLB Probe" | 
 |      ((UNIT C) (FR450-MAJOR C-2) (MACH fr450)) | 
 |      "tlbpr$pack $GRi,$GRj,$TLBPRopx,$TLBPRL" | 
 |      (+ pack (TLBPR-null) TLBPRopx TLBPRL OP_03 GRi OPE1_24 GRj) | 
 |      (nop) ; not simulated | 
 |      () | 
 | ) | 
 |  | 
 | ; Coprocessor operations | 
 | (define-pmacro (cop-op num op) | 
 |   (dni (.sym cop num) | 
 |        "Coprocessor operation" | 
 |        ((UNIT C) (FR500-MAJOR C-2) (MACH frv)) | 
 |        (.str "cop" num "$pack $s6_1,$CPRi,$CPRj,$CPRk") | 
 |        (+ pack CPRk op CPRi s6_1 CPRj) | 
 |        (nop) ; sufficient implementation | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (cop-op 1 OP_7E) | 
 | (cop-op 2 OP_7F) | 
 |  | 
 | (define-pmacro (clear-ne-flag-semantics target_index is_float) | 
 |   (c-call VOID "@cpu@_clear_ne_flags" target_index is_float) | 
 | ) | 
 |  | 
 | (define-pmacro (clear-ne-flag-r name op ope reg is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT I01) (FR500-MAJOR I-6) (FR550-MAJOR I-7) (MACH simple,tomcat,fr500,fr550,frv) attr) | 
 |        (.str name "$pack $" reg "k") | 
 |        (+ pack (.sym reg k) op (rs-null) ope (GRj-null)) | 
 |        (sequence () | 
 | 		 ; hack to get this referenced for profiling | 
 | 		 (c-raw-call VOID "frv_ref_SI" (.sym reg k)) | 
 | 		 (clear-ne-flag-semantics (index-of (.sym reg k)) is_float)) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (clear-ne-flag-r clrgr OP_0A OPE1_00 GR 0 NA | 
 | 		 ((fr500 (unit u-clrgr)) (fr550 (unit u-clrgr))) | 
 | 		 "Clear GR NE flag") | 
 | (clear-ne-flag-r clrfr OP_0A OPE1_02 FR 1 FR-ACCESS | 
 | 		 ((fr500 (unit u-clrfr)) (fr550 (unit u-clrfr))) | 
 | 		 "Clear FR NE flag") | 
 |  | 
 | (define-pmacro (clear-ne-flag-all name op ope is_float attr profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT I01) (FR500-MAJOR I-6) (FR550-MAJOR I-7) (MACH simple,tomcat,fr500,fr550,frv) attr) | 
 |        (.str name "$pack") | 
 |        (+ pack (rd-null) op (rs-null) ope (GRj-null)) | 
 |        (clear-ne-flag-semantics -1 is_float) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (clear-ne-flag-all clrga OP_0A OPE1_01 0 NA | 
 | 		 ((fr500 (unit u-clrgr)) (fr550 (unit u-clrgr))) | 
 | 		   "Clear GR NE flag ALL") | 
 | (clear-ne-flag-all clrfa OP_0A OPE1_03 1 FR-ACCESS | 
 | 		 ((fr500 (unit u-clrfr)) (fr550 (unit u-clrfr))) | 
 | 		   "Clear FR NE flag ALL") | 
 |  | 
 | (define-pmacro (commit-semantics target_index is_float) | 
 |   (c-call VOID "@cpu@_commit" target_index is_float) | 
 | ) | 
 |  | 
 | (define-pmacro (commit-r name op ope reg is_float attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT I01) (FR500-MAJOR I-6) (FR550-MAJOR I-7) (MACH frv,fr500,fr550) attr) | 
 |        (.str name "$pack $" reg "k") | 
 |        (+ pack (.sym reg k) op (rs-null) ope (GRj-null)) | 
 |        (commit-semantics (index-of (.sym reg k)) is_float) | 
 |        ((fr500 (unit u-commit)) (fr550 (unit u-commit))) | 
 |   ) | 
 | ) | 
 |  | 
 | (commit-r commitgr OP_0A OPE1_04 GR 0 NA        "commit exceptions, specific GR") | 
 | (commit-r commitfr OP_0A OPE1_06 FR 1 FR-ACCESS "commit exceptions, specific FR") | 
 |  | 
 | (define-pmacro (commit name op ope is_float attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT I01) (FR500-MAJOR I-6) (FR550-MAJOR I-7) (MACH frv,fr500,fr550) attr) | 
 |        (.str name "$pack") | 
 |        (+ pack (rd-null) op (rs-null) ope (GRj-null)) | 
 |        (commit-semantics -1 is_float) | 
 |        ((fr500 (unit u-commit)) (fr550 (unit u-commit))) | 
 |   ) | 
 | ) | 
 |  | 
 | (commit commitga OP_0A OPE1_05 0 NA        "commit exceptions, any GR") | 
 | (commit commitfa OP_0A OPE1_07 1 FR-ACCESS "commit exceptions, any FR") | 
 |  | 
 | (define-pmacro (floating-point-conversion | 
 | 		name op ope conv mode src targ attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT FMALL) (FR500-MAJOR F-1) (.unsplice attr)) | 
 |        (.str name "$pack $" src ",$" targ) | 
 |        (+ pack targ op (rs-null) ope src) | 
 |        (set targ (conv mode FPCONV-DEFAULT src)) | 
 |        ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert))) | 
 |   ) | 
 | ) | 
 |  | 
 | (floating-point-conversion fitos OP_79 OPE1_00 float SF FRintj FRk | 
 | 			   ((FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 | 			   "Convert Integer to Single") | 
 | (floating-point-conversion fstoi OP_79 OPE1_01 fix   SI FRj FRintk | 
 | 			   ((FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 | 			   "Convert Single  to Integer") | 
 | (floating-point-conversion fitod OP_7A OPE1_00 float DF FRintj FRdoublek | 
 | 			   ((MACH frv)) | 
 | 			   "Convert Integer to Double") | 
 | (floating-point-conversion fdtoi OP_7A OPE1_01 fix   SI FRdoublej FRintk | 
 | 			   ((MACH frv)) | 
 | 			   "Convert Double to Integer") | 
 |  | 
 | (define-pmacro (floating-point-dual-conversion | 
 | 		name op ope conv mode src src_hw targ targ_hw attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((MACH frv) (UNIT FMALL) (FR500-MAJOR F-1) attr) | 
 |        (.str name "$pack $" src ",$" targ) | 
 |        (+ pack targ op (rs-null) ope src) | 
 |        (sequence () | 
 | 		 (set targ (conv mode FPCONV-DEFAULT src)) | 
 | 		 (set (nextreg targ_hw targ 1) | 
 | 		      (conv mode FPCONV-DEFAULT (nextreg src_hw src 1)))) | 
 |        ((fr500 (unit u-float-dual-convert))) | 
 |   ) | 
 | ) | 
 |  | 
 | (floating-point-dual-conversion fditos OP_79 OPE1_10 float SF FRintj h-fr_int FRk h-fr NA "Dual Convert Integer to Single") | 
 | (floating-point-dual-conversion fdstoi OP_79 OPE1_11 fix   SI FRj h-fr FRintk h-fr_int NA "Dual Convert Single  to Integer") | 
 |  | 
 | (define-pmacro (ne-floating-point-dual-conversion | 
 | 		name op ope conv mode src src_hw targ targ_hw attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((MACH frv) (UNIT FMALL) (FR500-MAJOR F-1) NON-EXCEPTING attr) | 
 |        (.str name "$pack $" src ",$" targ) | 
 |        (+ pack targ op (rs-null) ope src) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of targ)) | 
 | 		 (set targ (conv mode FPCONV-DEFAULT src)) | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (add (index-of targ) 1)) | 
 | 		 (set (nextreg targ_hw targ 1) | 
 | 		      (conv mode FPCONV-DEFAULT (nextreg src_hw src 1)))) | 
 |        ((fr500 (unit u-float-dual-convert))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-floating-point-dual-conversion nfditos OP_79 OPE1_30 float SF FRintj h-fr_int FRk h-fr NA "Non excepting dual Convert Integer to Single") | 
 | (ne-floating-point-dual-conversion nfdstoi OP_79 OPE1_31 fix   SI FRj h-fr FRintk h-fr_int NA "Non excepting dual Convert Single  to Integer") | 
 |  | 
 | (define-pmacro (conditional-floating-point-conversion | 
 | 		name op ope conv mode src targ comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR F-1) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack $" src ",$" targ ",$CCi,$cond") | 
 |        (+ pack targ op (rs-null) CCi cond ope src) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set targ (conv mode FPCONV-DEFAULT src))) | 
 |        ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-floating-point-conversion cfitos OP_6B OPE4_0 float SF FRintj FRk "Conditional convert Integer to Single") | 
 | (conditional-floating-point-conversion cfstoi OP_6B OPE4_1 fix   SI FRj FRintk "Conditional convert Single to Integer") | 
 |  | 
 | (define-pmacro (ne-floating-point-conversion  | 
 | 		name op ope conv mode src targ comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR F-1) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack $" src ",$" targ) | 
 |        (+ pack targ op (rs-null) ope src) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of targ)) | 
 | 		 (set targ (conv mode FPCONV-DEFAULT src))) | 
 |        ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-floating-point-conversion nfitos OP_79 OPE1_20 float SF FRintj FRk "NE convert Integer to Single") | 
 | (ne-floating-point-conversion nfstoi OP_79 OPE1_21 fix   SI FRj FRintk "NE convert Single to Integer") | 
 |  | 
 | (register-transfer fmovs OP_79 OPE1_02 | 
 | 		   FRj FRk FMALL | 
 | 		   ((FR500-MAJOR F-1) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 | 		   ((fr500 (unit u-fr2fr))) | 
 | 		   "Move Single Float") | 
 | (register-transfer fmovd OP_7A OPE1_02 | 
 | 		   ; TODO -- unit doesn't handle extra register | 
 | 		   FRdoublej FRdoublek FM01 | 
 | 		   ((FR500-MAJOR F-1) (MACH frv)) | 
 | 		   ((fr500 (unit u-fr2fr)) (fr550 (unit u-fr2fr))) | 
 | 		   "Move Double Float") | 
 |  | 
 | (dni fdmovs | 
 |      "Dual move single float" | 
 |      ((MACH frv) (UNIT FMALL) (FR500-MAJOR F-1)) | 
 |      "fdmovs$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_12 FRj) | 
 |      (sequence () | 
 | 	       (set FRk FRj) | 
 | 	       (set (nextreg h-fr FRk 1) (nextreg h-fr FRj 1))) | 
 |      ; TODO -- unit doesn't handle extra register | 
 |      ((fr500 (unit u-fr2fr))) | 
 | ) | 
 |  | 
 | (conditional-register-transfer cfmovs OP_6C OPE4_0 FRj FRk FMALL | 
 | 			       ((FR500-MAJOR F-1) (FR550-MAJOR F-2) | 
 | 				(MACH simple,tomcat,fr500,fr550,frv)) | 
 | 			       ((fr500 (unit u-fr2fr)) (fr550 (unit u-fr2fr))) | 
 | 			       "Conditional move Single Float") | 
 |  | 
 | (define-pmacro (floating-point-neg name src targ op ope attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT FMALL) (FR500-MAJOR F-1) (.unsplice attr)) | 
 |        (.str name "$pack $" src ",$" targ) | 
 |        (+ pack src op (rs-null) ope targ) | 
 |        (set targ (neg src)) | 
 |        ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (floating-point-neg fnegs FRj FRk OP_79 OPE1_03 ((FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) "Floating point negate, single") | 
 | (floating-point-neg fnegd FRdoublej FRdoublek OP_7A OPE1_03 ((MACH frv)) "Floating point negate, double") | 
 |  | 
 | (dni fdnegs | 
 |      "Floating point dual negate, single" | 
 |      ((MACH frv) (UNIT FMALL) (FR500-MAJOR F-1)) | 
 |      "fdnegs$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_13 FRj) | 
 |      (sequence () | 
 | 	       (set FRk (neg FRj)) | 
 | 	       (set (nextreg h-fr FRk 1) (neg (nextreg h-fr FRj 1)))) | 
 |      ((fr500 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (dni cfnegs | 
 |      "Conditional floating point negate, single" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-1) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "cfnegs$pack $FRj,$FRk,$CCi,$cond" | 
 |      (+ pack FRj OP_6C (rs-null) CCi cond OPE4_1 FRk) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set FRk (neg FRj))) | 
 |      ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-abs name src targ op ope attr comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT FMALL) (FR500-MAJOR F-1) (.unsplice attr)) | 
 |        (.str name "$pack $" src ",$" targ ) | 
 |        (+ pack targ op (rs-null) ope src) | 
 |        (set targ (abs src)) | 
 |        ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-abs fabss FRj FRk OP_79 OPE1_04 ((FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) "Float absolute value, single") | 
 | (float-abs fabsd FRdoublej FRdoublek OP_7A OPE1_04 ((MACH frv)) "Float absolute value, double") | 
 |  | 
 | (dni fdabss | 
 |      "Floating point dual absolute value, single" | 
 |      ((MACH frv) (UNIT FMALL) (FR500-MAJOR F-1)) | 
 |      "fdabss$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_14 FRj) | 
 |      (sequence () | 
 | 	       (set FRk (abs FRj)) | 
 | 	       (set (nextreg h-fr FRk 1) (abs (nextreg h-fr FRj 1)))) | 
 |      ((fr500 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (dni cfabss | 
 |      "Conditional floating point absolute value, single" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-1) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "cfabss$pack $FRj,$FRk,$CCi,$cond" | 
 |      (+ pack FRj OP_6C (rs-null) CCi cond OPE4_2 FRk) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set FRk (abs FRj))) | 
 |      ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | ) | 
 |  | 
 | (dni fsqrts | 
 |      "Square root single" | 
 |      ((UNIT FM01) (FR500-MAJOR F-4) (FR550-MAJOR F-3) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fsqrts$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_05 FRj) | 
 |      (set FRk (sqrt SF FRj)) | 
 |      ((fr500 (unit u-float-sqrt)) (fr550 (unit u-float-sqrt))) | 
 | ) | 
 |  | 
 | (dni fdsqrts | 
 |      "Dual square root single" | 
 |      ((MACH frv) (UNIT FM01) (FR500-MAJOR F-4)) | 
 |      "fdsqrts$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_15 FRj) | 
 |      (sequence () | 
 | 	       (set FRk (sqrt SF FRj)) | 
 | 	       (set (nextreg h-fr FRk 1) (sqrt (nextreg h-fr FRj 1)))) | 
 |      ((fr500 (unit u-float-dual-sqrt))) | 
 | ) | 
 |  | 
 | (dni nfdsqrts | 
 |      "Non excepting Dual square root single" | 
 |      ((MACH frv) (UNIT FM01) (FR500-MAJOR F-4) NON-EXCEPTING) | 
 |      "nfdsqrts$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_35 FRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 	       (set FRk (sqrt SF FRj)) | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 	       (set (nextreg h-fr FRk 1) (sqrt (nextreg h-fr FRj 1)))) | 
 |      ((fr500 (unit u-float-dual-sqrt))) | 
 | ) | 
 |  | 
 | (dni fsqrtd | 
 |      "Square root double" | 
 |      ((UNIT FM01) (FR500-MAJOR F-4) (MACH frv)) | 
 |      "fsqrtd$pack $FRdoublej,$FRdoublek" | 
 |      (+ pack FRdoublek OP_7A (rs-null) OPE1_05 FRdoublej) | 
 |      (set FRdoublek (sqrt DF FRdoublej)) | 
 |      ((fr500 (unit u-float-sqrt))) | 
 | ) | 
 |  | 
 | (dni cfsqrts | 
 |      "Conditional square root single" | 
 |      ((UNIT FM01) (FR500-MAJOR F-4) (FR550-MAJOR F-3) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "cfsqrts$pack $FRj,$FRk,$CCi,$cond" | 
 |      (+ pack FRk OP_6E (rs-null) CCi cond OPE4_2 FRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set FRk (sqrt SF FRj))) | 
 |      ((fr500 (unit u-float-sqrt)) (fr550 (unit u-float-sqrt))) | 
 | ) | 
 |  | 
 | (dni nfsqrts | 
 |      "Non exception square root, single" | 
 |      ((UNIT FM01) (FR500-MAJOR F-4) (FR550-MAJOR F-3) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nfsqrts$pack $FRj,$FRk" | 
 |      (+ pack FRk OP_79 (rs-null) OPE1_25 FRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 	       (set FRk (sqrt SF FRj))) | 
 |      ((fr500 (unit u-float-sqrt)) (fr550 (unit u-float-sqrt))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-binary-op-s name pipe attr operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) (MACH simple,tomcat,fr500,fr550,frv) (.unsplice attr)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi ope FRj) | 
 |        (set FRk (operation FRi FRj)) | 
 |        ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-binary-op-s fadds FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) add OP_79 OPE1_06 "add single float") | 
 | (float-binary-op-s fsubs FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) sub OP_79 OPE1_07 "sub single float") | 
 | (float-binary-op-s fmuls FM01  ((FR500-MAJOR F-3) (FR550-MAJOR F-3)) mul OP_79 OPE1_08 "mul single float") | 
 |  | 
 | (dni fdivs | 
 |      "div single float" | 
 |      ((UNIT FM01) (FR500-MAJOR F-4) (FR550-MAJOR F-3) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fdivs$pack $FRi,$FRj,$FRk" | 
 |      (+ pack FRk OP_79 FRi OPE1_09 FRj) | 
 |      (set FRk (div FRi FRj)) | 
 |      ((fr500 (unit u-float-div)) | 
 |       (fr550 (unit u-float-div))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-binary-op-d name operation op ope major comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR major) (MACH frv)) | 
 |        (.str name "$pack $FRdoublei,$FRdoublej,$FRdoublek") | 
 |        (+ pack FRdoublek op FRdoublei ope FRdoublej) | 
 |        (set FRdoublek (operation FRdoublei FRdoublej)) | 
 |        ((fr500 (unit u-float-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-binary-op-d faddd add OP_7A OPE1_06 F-2 "add double float") | 
 | (float-binary-op-d fsubd sub OP_7A OPE1_07 F-2 "sub double float") | 
 | (float-binary-op-d fmuld mul OP_7A OPE1_08 F-3 "mul double float") | 
 | (float-binary-op-d fdivd div OP_7A OPE1_09 F-4 "div double float") | 
 |  | 
 | (define-pmacro (conditional-float-binary-op name pipe attr operation op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) (MACH simple,tomcat,fr500,fr550,frv) | 
 | 		(.unsplice attr)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk,$CCi,$cond") | 
 |        (+ pack FRk op FRi CCi cond ope FRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set FRk (operation FRi FRj))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-float-binary-op cfadds FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) add OP_6D OPE4_0 | 
 | 			     ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 			     "cond add single") | 
 | (conditional-float-binary-op cfsubs FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) sub OP_6D OPE4_1 | 
 | 			     ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 			     "cond sub single") | 
 | (conditional-float-binary-op cfmuls FM01  ((FR500-MAJOR F-3) (FR550-MAJOR F-3)) mul OP_6E OPE4_0 | 
 | 			     ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 			     "cond mul single") | 
 | (conditional-float-binary-op cfdivs FM01  ((FR500-MAJOR F-4) (FR550-MAJOR F-3)) div OP_6E OPE4_1 | 
 | 			     ((fr500 (unit u-float-div)) (fr550 (unit u-float-div))) | 
 | 			     "cond div single") | 
 |  | 
 | (define-pmacro (ne-float-binary-op name pipe attr operation op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT pipe) (MACH simple,tomcat,fr500,fr550,frv) | 
 | 		(.unsplice attr)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi ope FRj) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 		 (set FRk (operation FRi FRj))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-float-binary-op nfadds FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) add OP_79 OPE1_26 | 
 | 		    ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 		    "ne add single") | 
 | (ne-float-binary-op nfsubs FMALL ((FR500-MAJOR F-2) (FR550-MAJOR F-2)) sub OP_79 OPE1_27 | 
 | 		    ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 		    "ne sub single") | 
 | (ne-float-binary-op nfmuls FM01  ((FR500-MAJOR F-3) (FR550-MAJOR F-3)) mul OP_79 OPE1_28 | 
 | 		    ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith))) | 
 | 		    "ne mul single") | 
 | (ne-float-binary-op nfdivs FM01  ((FR500-MAJOR F-4) (FR550-MAJOR F-3)) div OP_79 OPE1_29 | 
 | 		    ((fr500 (unit u-float-div)) (fr550 (unit u-float-div))) | 
 | 		    "ne div single") | 
 |  | 
 | (define-pmacro (fcc-eq) 8) | 
 | (define-pmacro (fcc-lt) 4) | 
 | (define-pmacro (fcc-gt) 2) | 
 | (define-pmacro (fcc-uo) 1) | 
 |  | 
 | (define-pmacro (compare-and-set-fcc arg1 arg2 fcc) | 
 |   (if (gt arg1 arg2) | 
 |       (set fcc (fcc-gt)) | 
 |       (if (eq arg1 arg2) | 
 | 	  (set fcc (fcc-eq)) | 
 | 	  (if (lt arg1 arg2) | 
 | 	      (set fcc (fcc-lt)) | 
 | 	      (set fcc (fcc-uo))))) | 
 | ) | 
 |  | 
 | (dni fcmps | 
 |      "compare single float" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-2) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fcmps$pack $FRi,$FRj,$FCCi_2" | 
 |      (+ pack (cond-null) FCCi_2 OP_79 FRi OPE1_0A FRj) | 
 |      (compare-and-set-fcc FRi FRj FCCi_2) | 
 |      ((fr500 (unit u-float-compare)) (fr550 (unit u-float-compare))) | 
 | ) | 
 |  | 
 | (dni fcmpd | 
 |      "compare double float" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-2) (MACH frv)) | 
 |      "fcmpd$pack $FRdoublei,$FRdoublej,$FCCi_2" | 
 |      (+ pack (cond-null) FCCi_2 OP_7A FRdoublei OPE1_0A FRdoublej) | 
 |      (compare-and-set-fcc FRdoublei FRdoublej FCCi_2) | 
 |      ((fr500 (unit u-float-compare))) | 
 | ) | 
 |  | 
 | (dni cfcmps | 
 |      "Conditional compare single, float" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-2) (FR550-MAJOR F-2) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "cfcmps$pack $FRi,$FRj,$FCCi_2,$CCi,$cond" | 
 |      (+ pack (cond-null) FCCi_2 OP_6D FRi CCi cond OPE4_2 FRj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (compare-and-set-fcc FRi FRj FCCi_2)) | 
 |      ((fr500 (unit u-float-compare)) (fr550 (unit u-float-compare))) | 
 | ) | 
 |  | 
 | (dni fdcmps | 
 |      "float dual compare single" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fdcmps$pack $FRi,$FRj,$FCCi_2" | 
 |      (+ pack (cond-null) FCCi_2 OP_79 FRi OPE1_1A FRj) | 
 |      (sequence () | 
 | 	       (compare-and-set-fcc FRi FRj FCCi_2) | 
 | 	       (compare-and-set-fcc (nextreg h-fr FRi 1) (nextreg h-fr FRj 1) | 
 | 				    (nextreg h-fccr FCCi_2 1))) | 
 |      ((fr500 (unit u-float-dual-compare)) (fr550 (unit u-float-dual-compare))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-mul-with-add name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR F-5) (MACH frv)) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (set targ (add_sub (mul arg1 arg2) targ)) | 
 |        ((fr500 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-mul-with-add fmadds add FRi FRj FRk OP_79 OPE1_0B "mul with add, single") | 
 | (float-mul-with-add fmsubs sub FRi FRj FRk OP_79 OPE1_0C "mul with sub, single") | 
 |  | 
 | (float-mul-with-add fmaddd add FRdoublei FRdoublej FRdoublek OP_7A OPE1_0B "mul with add, double") | 
 | (float-mul-with-add fmsubd sub FRdoublei FRdoublej FRdoublek OP_7A OPE1_0C "mul with sub, double") | 
 |  | 
 | (dni fdmadds | 
 |      "Float dual multiply with add" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-5) (MACH frv)) | 
 |      "fdmadds$pack $FRi,$FRj,$FRk" | 
 |      (+ pack FRk OP_79 FRi OPE1_1B FRj) | 
 |      (sequence () | 
 | 	       (set FRk (add (mul FRi FRj) FRk)) | 
 | 	       (set (nextreg h-fr FRk 1) | 
 | 		    (add (mul (nextreg h-fr FRi 1) (nextreg h-fr FRj 1)) | 
 | 			 (nextreg h-fr FRk 1)))) | 
 |      ; TODO dual registers not referenced for profiling | 
 |      ((fr500 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (dni nfdmadds | 
 |      "Non excepting float dual multiply with add" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-5) (MACH frv)) | 
 |      "nfdmadds$pack $FRi,$FRj,$FRk" | 
 |      (+ pack FRk OP_79 FRi OPE1_3B FRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 	       (set FRk (add (mul FRi FRj) FRk)) | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 	       (set (nextreg h-fr FRk 1) | 
 | 		    (add (mul (nextreg h-fr FRi 1) (nextreg h-fr FRj 1)) | 
 | 			 (nextreg h-fr FRk 1)))) | 
 |      ; TODO dual registers not referenced for profiling | 
 |      ((fr500 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-float-mul-with-add | 
 | 		name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR F-5) (MACH frv) CONDITIONAL) | 
 |        (.str name "$pack $FRi,$FRj,$FRk,$CCi,$cond") | 
 |        (+ pack FRk op FRi CCi cond ope FRj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set targ (add_sub (mul arg1 arg2) targ))) | 
 |        ((fr500 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-float-mul-with-add cfmadds add FRi FRj FRk OP_6F OPE4_0 "conditional mul with add, single") | 
 | (conditional-float-mul-with-add cfmsubs sub FRi FRj FRk OP_6F OPE4_1 "conditional mul with sub, single") | 
 |  | 
 | (define-pmacro (ne-float-mul-with-add name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR F-5) (MACH frv) NON-EXCEPTING) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of targ)) | 
 | 		 (set targ (add_sub (mul arg1 arg2) targ))) | 
 |        ((fr500 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-float-mul-with-add nfmadds add FRi FRj FRk OP_79 OPE1_2B "non excepting mul with add, single") | 
 | (ne-float-mul-with-add nfmsubs sub FRi FRj FRk OP_79 OPE1_2C "non excepting mul with sub, single") | 
 |  | 
 | (define-pmacro (float-parallel-mul-add-semantics cond add_sub arg1 arg2 targ) | 
 |   (if cond | 
 |       (sequence () | 
 | 		(set targ (mul arg1 arg2)) | 
 | 		(set (nextreg h-fr targ 1) | 
 | 		     (add_sub (nextreg h-fr arg1 1) (nextreg h-fr arg2 1))))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-parallel-mul-add | 
 | 		name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (float-parallel-mul-add-semantics 1 add_sub arg1 arg2 targ) | 
 |        ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-parallel-mul-add fmas add FRi FRj FRk OP_79 OPE1_0E "parallel mul/add, single") | 
 | (float-parallel-mul-add fmss sub FRi FRj FRk OP_79 OPE1_0F "parallel mul/sub, single") | 
 |  | 
 | (define-pmacro (float-dual-parallel-mul-add-semantics add_sub arg1 arg2 targ) | 
 |   (sequence () | 
 | 	    (set targ (mul arg1 arg2)) | 
 | 	    (set (nextreg h-fr targ 1) | 
 | 		 (add_sub (nextreg h-fr arg1 1) (nextreg h-fr arg2 1))) | 
 | 	    (set (nextreg h-fr targ 2) | 
 | 		 (mul (nextreg h-fr arg1 2)	(nextreg h-fr arg2 2))) | 
 | 	    (set (nextreg h-fr targ 3) | 
 | 		 (add_sub (nextreg h-fr arg1 3) (nextreg h-fr arg2 3)))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-dual-parallel-mul-add | 
 | 		name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (MACH frv)) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (float-dual-parallel-mul-add-semantics add_sub arg1 arg2 targ) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (float-dual-parallel-mul-add fdmas add FRi FRj FRk OP_79 OPE1_1C "dual parallel mul/add, single") | 
 | (float-dual-parallel-mul-add fdmss sub FRi FRj FRk OP_79 OPE1_1D "dual parallel mul/sub, single") | 
 |  | 
 | (define-pmacro (ne-float-dual-parallel-mul-add-semantics add_sub arg1 arg2 targ) | 
 |   (sequence () | 
 | 	    (c-call VOID "@cpu@_set_ne_index" (index-of targ)) | 
 | 	    (c-call VOID "@cpu@_set_ne_index" (add (index-of targ) 1)) | 
 | 	    (c-call VOID "@cpu@_set_ne_index" (add (index-of targ) 2)) | 
 | 	    (c-call VOID "@cpu@_set_ne_index" (add (index-of targ) 3)) | 
 | 	    (set targ (mul arg1 arg2)) | 
 | 	    (set (nextreg h-fr targ 1) | 
 | 		 (add_sub (nextreg h-fr arg1 1) (nextreg h-fr arg2 1))) | 
 | 	    (set (nextreg h-fr targ 2) | 
 | 		 (mul (nextreg h-fr arg1 2)	(nextreg h-fr arg2 2))) | 
 | 	    (set (nextreg h-fr targ 3) | 
 | 		 (add_sub (nextreg h-fr arg1 3) (nextreg h-fr arg2 3)))) | 
 | ) | 
 |  | 
 | (define-pmacro (ne-float-dual-parallel-mul-add | 
 | 		name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (MACH frv)) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (ne-float-dual-parallel-mul-add-semantics add_sub arg1 arg2 targ) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-float-dual-parallel-mul-add nfdmas add FRi FRj FRk OP_79 OPE1_3C "non excepting dual parallel mul/add, single") | 
 | (ne-float-dual-parallel-mul-add nfdmss sub FRi FRj FRk OP_79 OPE1_3D "non excepting dual parallel mul/sub, single") | 
 |  | 
 | (define-pmacro (conditional-float-parallel-mul-add name add_sub op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (FR550-MAJOR F-4) CONDITIONAL (MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk,$CCi,$cond") | 
 |        (+ pack FRk op FRi CCi cond ope FRj) | 
 |        (float-parallel-mul-add-semantics (eq CCi (or cond 2)) | 
 | 					 add_sub FRi FRj FRk) | 
 |        ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-float-parallel-mul-add cfmas add OP_6F OPE4_2 "conditional parallel mul/add, single") | 
 | (conditional-float-parallel-mul-add cfmss sub OP_6F OPE4_3 "conditional parallel mul/sub, single") | 
 |  | 
 | (define-pmacro (float-parallel-mul-add-double-semantics add_sub arg1 arg2 targ) | 
 |   (sequence () | 
 | 	    (set targ (ftrunc SF FPCONV-DEFAULT | 
 | 			      (mul DF | 
 | 				   (fext DF FPCONV-DEFAULT arg1) | 
 | 				   (fext DF FPCONV-DEFAULT arg2)))) | 
 | 	    (set (nextreg h-fr targ 1) | 
 | 		 (ftrunc SF FPCONV-DEFAULT | 
 | 			 (add_sub DF | 
 | 				  (fext DF FPCONV-DEFAULT (nextreg h-fr arg1 1)) | 
 | 				  (fext DF FPCONV-DEFAULT (nextreg h-fr arg2 1)))))) | 
 | ) | 
 |  | 
 | (define-pmacro (float-parallel-mul-add-double | 
 | 		name add_sub arg1 arg2 targ op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (MACH frv)) | 
 |        (.str name "$pack $" arg1 ",$" arg2 ",$" targ) | 
 |        (+ pack targ op arg1 ope arg2) | 
 |        (float-parallel-mul-add-double-semantics add_sub arg1 arg2 targ) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (float-parallel-mul-add-double fmad add FRi FRj FRk OP_7A OPE1_0E "parallel mul/add, double") | 
 | (float-parallel-mul-add-double fmsd sub FRi FRj FRk OP_7A OPE1_0F "parallel mul/sub, double") | 
 |  | 
 | (define-pmacro (ne-float-parallel-mul-add name add_sub op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR F-5) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi ope FRj) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 		 (set FRk (mul FRi FRj)) | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 		 (set (nextreg h-fr FRk 1) | 
 | 		      (add_sub (nextreg h-fr FRi 1) (nextreg h-fr FRj 1)))) | 
 |        ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-float-parallel-mul-add nfmas add OP_79 OPE1_2E "ne parallel mul/add,single") | 
 | (ne-float-parallel-mul-add nfmss sub OP_79 OPE1_2F "ne parallel mul/sub,single") | 
 |  | 
 | (define-pmacro (float-dual-arith name attr oper1 oper2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT FM01) (.unsplice attr)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi ope FRj) | 
 |        (sequence () | 
 | 		 (set FRk (oper1 FRi FRj)) | 
 | 		 (set (nextreg h-fr FRk 1) | 
 | 		      (oper2 (nextreg h-fr FRi 1) (nextreg h-fr FRj 1)))) | 
 |        ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (float-dual-arith fdadds ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) add add OP_79 OPE1_16 "dual add, single") | 
 | (float-dual-arith fdsubs ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) sub sub OP_79 OPE1_17 "dual sub, single") | 
 | (float-dual-arith fdmuls ((FR500-MAJOR F-7) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) mul mul OP_79 OPE1_18 "dual mul, single") | 
 | (float-dual-arith fddivs ((FR500-MAJOR F-7) (MACH frv))                           div div OP_79 OPE1_19 "dual div,single") | 
 | (float-dual-arith fdsads ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) add sub OP_79 OPE1_1E "dual add/sub, single") | 
 |  | 
 | (dni fdmulcs | 
 |      "Float dual cross multiply single" | 
 |      ((UNIT FM01) (FR500-MAJOR F-7) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fdmulcs$pack $FRi,$FRj,$FRk" | 
 |      (+ pack FRk OP_79 FRi OPE1_1F FRj) | 
 |      (sequence () | 
 | 	       (set FRk (mul FRi (nextreg h-fr FRj 1))) | 
 | 	       (set (nextreg h-fr FRk 1) (mul (nextreg h-fr FRi 1) FRj))) | 
 |      ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (dni nfdmulcs | 
 |      "NE float dual cross multiply single" | 
 |      ((UNIT FM01) (FR500-MAJOR F-7) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "nfdmulcs$pack $FRi,$FRj,$FRk" | 
 |      (+ pack FRk OP_79 FRi OPE1_3F FRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 	       (set FRk (mul FRi (nextreg h-fr FRj 1))) | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 	       (set (nextreg h-fr FRk 1) (mul (nextreg h-fr FRi 1) FRj))) | 
 |      ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 | ) | 
 |  | 
 | (define-pmacro (ne-float-dual-arith name attr oper1 oper2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        (.splice (UNIT FM01) (.unsplice attr)) | 
 |        (.str name "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi ope FRj) | 
 |        (sequence () | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 		 (set FRk (oper1 FRi FRj)) | 
 | 		 (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 		 (set (nextreg h-fr FRk 1) | 
 | 		      (oper2 (nextreg h-fr FRi 1) (nextreg h-fr FRj 1)))) | 
 |        ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith))) | 
 |   ) | 
 | ) | 
 |  | 
 | (ne-float-dual-arith nfdadds ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) add add OP_79 OPE1_36 "ne dual add, single") | 
 | (ne-float-dual-arith nfdsubs ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) sub sub OP_79 OPE1_37 "ne dual sub, single") | 
 | (ne-float-dual-arith nfdmuls ((FR500-MAJOR F-7) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) mul mul OP_79 OPE1_38 "ne dual mul, single") | 
 | (ne-float-dual-arith nfddivs ((FR500-MAJOR F-7) (MACH frv))                           div div OP_79 OPE1_39 "ne dual div,single") | 
 | (ne-float-dual-arith nfdsads ((FR500-MAJOR F-6) (FR550-MAJOR F-4) (MACH simple,tomcat,fr500,fr550,frv)) add sub OP_79 OPE1_3E "ne dual add/sub, single") | 
 |  | 
 | (dni nfdcmps | 
 |      "non-excepting dual float compare" | 
 |      ((UNIT FM01) (FR500-MAJOR F-6) (MACH simple,tomcat,frv)) | 
 |      "nfdcmps$pack $FRi,$FRj,$FCCi_2" | 
 |      (+ pack (cond-null) FCCi_2 OP_79 FRi OPE1_3A FRj) | 
 |      (sequence () | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (index-of FRk)) | 
 | 	       (compare-and-set-fcc FRi FRj FCCi_2) | 
 | 	       (c-call VOID "@cpu@_set_ne_index" (add (index-of FRk) 1)) | 
 | 	       (compare-and-set-fcc (nextreg h-fr FRi 1) (nextreg h-fr FRj 1) | 
 | 				    (nextreg h-fccr FCCi_2 1))) | 
 |      ((fr500 (unit u-float-dual-compare))) | 
 | ) | 
 |  | 
 | ; Media Instructions | 
 | ; | 
 | (define-pmacro (halfword hilo arg offset) | 
 |   (reg (.sym h-fr_ hilo) (add (index-of arg) offset))) | 
 |  | 
 | (dni mhsetlos | 
 |      "Media set lower signed 12 bits" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-5) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mhsetlos$pack $u12,$FRklo" | 
 |      (+ pack FRklo OP_78 OPE1_20 u12) | 
 |      (set FRklo u12) | 
 |      ((fr400 (unit u-media-hilo)) (fr450 (unit u-media-hilo)) | 
 |       (fr550 (unit u-media-set (out FRintk FRklo)))) | 
 | ) | 
 |  | 
 | (dni mhsethis | 
 |      "Media set upper signed 12 bits" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-5) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mhsethis$pack $u12,$FRkhi" | 
 |      (+ pack FRkhi OP_78 OPE1_22 u12) | 
 |      (set FRkhi u12) | 
 |      ((fr400 (unit u-media-hilo)) (fr450 (unit u-media-hilo)) | 
 |       (fr550 (unit u-media-set (out FRintk FRkhi)))) | 
 | ) | 
 |  | 
 | (dni mhdsets | 
 |      "Media dual set halfword signed 12 bits" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-5) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mhdsets$pack $u12,$FRintk" | 
 |      (+ pack FRintk OP_78 OPE1_24 u12) | 
 |      (sequence () | 
 | 	       ; hack to get FRintk passed to modelling functions | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (set (halfword hi FRintk 0) u12) | 
 | 	       (set (halfword lo FRintk 0) u12)) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr550 (unit u-media-set))) | 
 | ) | 
 |  | 
 | (define-pmacro (set-5-semantics target value) | 
 |   (sequence ((HI tmp)) | 
 | 	    (set tmp target) | 
 | 	    (set tmp (and tmp #x07ff)) | 
 | 	    (set tmp (or tmp (sll (and s5 #x1f) 11))) | 
 | 	    (set target tmp)) | 
 | ) | 
 |  | 
 | (define-pmacro (media-set-5 name hilo op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-5) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $s5,$FRk" hilo) | 
 |        (+ pack (.sym FRk hilo) op (FRi-null) ope (misc-null-11) s5) | 
 |        (set-5-semantics (.sym FRk hilo) s5) | 
 |        ((fr400 (unit u-media-hilo)) (fr450 (unit u-media-hilo)) | 
 | 	(fr550 (unit u-media-set (out FRintk (.sym FRk hilo))))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-set-5 mhsetloh lo OP_78 OPE1_21 "Media set upper 5 bits lo") | 
 | (media-set-5 mhsethih hi OP_78 OPE1_23 "Media set upper 5 bits hi") | 
 |  | 
 | (dni mhdseth | 
 |      "Media dual set halfword upper 5 bits" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-5) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mhdseth$pack $s5,$FRintk" | 
 |      (+ pack FRintk OP_78 (FRi-null) OPE1_25 (misc-null-11) s5) | 
 |      (sequence () | 
 | 	       ; hack to get FRintk passed to modelling functions | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (set-5-semantics (halfword hi FRintk 0) s5) | 
 | 	       (set-5-semantics (halfword lo FRintk 0) s5)) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr550 (unit u-media-set))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-logic-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $FRinti,$FRintj,$FRintk") | 
 |        (+ pack FRintk op FRinti ope FRintj) | 
 |        (set FRintk (operation FRinti FRintj)) | 
 |        ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-logic-r-r mand and OP_7B OPE1_00 "and reg/reg") | 
 | (media-logic-r-r mor  or  OP_7B OPE1_01 "or  reg/reg") | 
 | (media-logic-r-r mxor xor OP_7B OPE1_02 "xor reg/reg") | 
 |  | 
 | (define-pmacro (conditional-media-logic name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1) CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$FRintk,$CCi,$cond") | 
 |        (+ pack FRintk op FRinti CCi cond ope FRintj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (set FRintk (operation FRinti FRintj))) | 
 |        ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-logic cmand and OP_70 OPE4_0 "conditional and reg/reg") | 
 | (conditional-media-logic cmor  or  OP_70 OPE4_1 "conditional or  reg/reg") | 
 | (conditional-media-logic cmxor xor OP_70 OPE4_2 "conditional xor reg/reg") | 
 |  | 
 | (dni mnot | 
 |      ("mnot") | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      ("mnot$pack $FRintj,$FRintk") | 
 |      (+ pack FRintk OP_7B (rs-null) OPE1_03 FRintj) | 
 |      (set FRintk (inv FRintj)) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (dni cmnot | 
 |      ("cmnot") | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1) CONDITIONAL) | 
 |      ("cmnot$pack $FRintj,$FRintk,$CCi,$cond") | 
 |      (+ pack FRintk OP_70 (rs-null) CCi cond OPE4_3 FRintj) | 
 |      (if (eq CCi (or cond 2)) | 
 | 	 (set FRintk (inv FRintj))) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-rotate-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $FRinti,$u6,$FRintk") | 
 |        (+ pack FRintk op FRinti ope u6) | 
 |        (set FRintk (operation FRinti (and u6 #x1f))) | 
 |        ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-rotate-r-r mrotli rol OP_7B OPE1_04 "rotate left reg/reg") | 
 | (media-rotate-r-r mrotri ror OP_7B OPE1_05 "rotate right reg/reg") | 
 |  | 
 | (define-pmacro (media-cut-r-r name arg op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |        (.str name "$pack $FRinti,$" arg ",$FRintk") | 
 |        (+ pack FRintk op FRinti ope arg) | 
 |        (set FRintk (c-call SI "@cpu@_cut" FRinti (nextreg h-fr_int FRinti 1) arg)) | 
 |        ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-cut-r-r mwcut  FRintj OP_7B OPE1_06 "media cut") | 
 | (media-cut-r-r mwcuti u6     OP_7B OPE1_07 "media cut") | 
 |  | 
 | (define-pmacro (media-cut-acc name arg op ope fr450-major comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR fr450-major)) | 
 |        (.str name "$pack $ACC40Si,$" arg ",$FRintk") | 
 |        (+ pack FRintk op ACC40Si ope arg) | 
 |        (set FRintk (c-call SI "@cpu@_media_cut" ACC40Si arg)) | 
 |        ((fr400 (unit u-media-4)) (fr450 (unit u-media-4)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media-3-acc))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-cut-acc mcut  FRintj OP_7B OPE1_2C M-1 "media accumulator cut reg") | 
 | (media-cut-acc mcuti s6     OP_7B OPE1_2E M-5 "media accumulator cut immed") | 
 |  | 
 | (define-pmacro (media-cut-acc-ss name arg op ope fr450-major comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR fr450-major)) | 
 |        (.str name "$pack $ACC40Si,$" arg ",$FRintk") | 
 |        (+ pack FRintk op ACC40Si ope arg) | 
 |        (set FRintk (c-call SI "@cpu@_media_cut_ss" ACC40Si arg)) | 
 |        ((fr400 (unit u-media-4)) (fr450 (unit u-media-4)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media-3-acc))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-cut-acc-ss mcutss  FRintj OP_7B OPE1_2D M-1 "media accumulator cut reg with saturation") | 
 | (media-cut-acc-ss mcutssi s6     OP_7B OPE1_2F M-5 "media accumulator cut immed with saturation") | 
 |  | 
 | ; Dual Media Instructions | 
 | ; | 
 | (define-pmacro (register-unaligned register alignment) | 
 |   (and (index-of register) (sub alignment 1)) | 
 | ) | 
 |  | 
 | (dni mdcutssi | 
 |      "Media dual cut with signed saturation" | 
 |      ((UNIT MDCUTSSI) (MACH fr400,fr450,fr550) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-6)) | 
 |      "mdcutssi$pack $ACC40Si,$s6,$FRintkeven" | 
 |      (+ pack FRintkeven OP_78 ACC40Si OPE1_0E s6) | 
 |      (if (register-unaligned ACC40Si 2) | 
 | 	 (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	 (if (register-unaligned FRintkeven 2) | 
 | 	     (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	     (sequence () | 
 | 		       (set FRintkeven (c-call SI "@cpu@_media_cut_ss" ACC40Si s6)) | 
 | 		       (set (nextreg h-fr_int FRintkeven 1) | 
 | 			    (c-call SI "@cpu@_media_cut_ss" | 
 | 				    (nextreg h-acc40S ACC40Si 1) s6))))) | 
 |      ((fr400 (unit u-media-4-acc-dual | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-4-acc-dual | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-3-acc-dual))) | 
 | ) | 
 |  | 
 | ; The (add (xxxx) (mul arg 0)) is a hack to get a reference to arg generated | 
 | ; so it will be passed to the unit modelers.   YUCK!!!!! | 
 | (define-pmacro (extract-hilo reg1 off1 reg2 off2 arg1hi arg1lo arg2hi arg2lo) | 
 |   (sequence () | 
 | 	    (set arg1hi (add (halfword hi reg1 off1) (mul reg1 0))) | 
 | 	    (set arg1lo (add (halfword lo reg1 off1) (mul reg1 0))) | 
 | 	    (set arg2hi (add (halfword hi reg2 off2) (mul reg2 0))) | 
 | 	    (set arg2lo (add (halfword lo reg2 off2) (mul reg2 0)))) | 
 | ) | 
 |  | 
 | (dni maveh | 
 |      "Media dual average" | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "maveh$pack $FRinti,$FRintj,$FRintk" | 
 |      (+ pack FRintk OP_7B FRinti OPE1_08 FRintj) | 
 |      (set FRintk (c-call SI "@cpu@_media_average" FRinti FRintj)) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-shift name operation op ope profile comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $FRinti,$u6,$FRintk") | 
 |        (+ pack FRintk op FRinti ope u6) | 
 |        (sequence () | 
 | 		 ; hack to get these referenced for profiling | 
 | 		 (set FRinti (c-raw-call SI "frv_ref_SI" FRinti)) | 
 | 		 (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 		 (set (halfword hi FRintk 0) | 
 | 		      (operation (halfword hi FRinti 0) (and u6 #xf))) | 
 | 		 (set (halfword lo FRintk 0) | 
 | 		      (operation (halfword lo FRinti 0) (and u6 #xf)))) | 
 |        profile | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-shift msllhi sll OP_7B OPE1_09 | 
 | 		  ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 | 		   (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | 		  "Media dual shift left  logical") | 
 | (media-dual-shift msrlhi srl OP_7B OPE1_0A | 
 | 		  ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 | 		   (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | 		  "Media dual shift right logical") | 
 | (media-dual-shift msrahi sra OP_7B OPE1_0B | 
 | 		  ((fr400 (unit u-media-6)) (fr450 (unit u-media-6)) | 
 | 		   (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | 		  "Media dual shift right arithmetic") | 
 |  | 
 | (define-pmacro (media-dual-word-rotate-r-r name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMLOW) (MACH fr400,fr450,fr550) (FR550-MAJOR M-3) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |        (.str name "$pack $FRintieven,$s6,$FRintkeven") | 
 |        (+ pack FRintkeven op FRintieven ope s6) | 
 |        (if (orif (register-unaligned FRintieven 2) | 
 | 		 (register-unaligned FRintkeven 2)) | 
 | 	   (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	   (sequence () | 
 | 		     (set FRintkeven (operation FRintieven (and s6 #x1f))) | 
 | 		     (set (nextreg h-fr_int FRintkeven 1) | 
 | 			  (operation (nextreg h-fr_int FRintieven 1) | 
 | 				     (and s6 #x1f))))) | 
 |        ((fr400 (unit u-media-3-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (out FRintk FRintkeven)))  | 
 | 	(fr450 (unit u-media-3-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (out FRintk FRintkeven))) | 
 | 	(fr550 (unit u-media-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-word-rotate-r-r mdrotli rol OP_78 OPE1_0B "rotate left reg/reg") | 
 |  | 
 | (dni mcplhi | 
 |      "Media bit concatenate, halfword" | 
 |      ((UNIT FMLOW) (MACH fr400,fr450,fr550) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mcplhi$pack $FRinti,$u6,$FRintk" | 
 |      (+ pack FRintk OP_78 FRinti OPE1_0C u6) | 
 |      (sequence ((HI arg1) (HI arg2) (HI shift)) | 
 | 	       (set FRinti (c-raw-call SI "frv_ref_SI" FRinti)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (set shift (and u6 #xf)) | 
 | 	       (set arg1 (sll (halfword hi FRinti 0) shift)) | 
 | 	       (if (ne shift 0) | 
 | 		   (sequence () | 
 | 			     (set arg2 (halfword hi FRinti 1)) | 
 | 			     (set arg2 (srl HI (sll HI arg2 (sub 15 shift)) | 
 | 					    (sub 15 shift))) | 
 | 			     (set arg1 (or HI arg1 arg2)))) | 
 | 	       (set (halfword hi FRintk 0) arg1)) | 
 |      ((fr400 (unit u-media-3-dual)) (fr450 (unit u-media-3-dual)) | 
 |       (fr550 (unit u-media-3-dual))) | 
 | ) | 
 |  | 
 | (dni mcpli | 
 |      "Media bit concatenate, word" | 
 |      ((UNIT FMLOW) (MACH fr400,fr450,fr550) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mcpli$pack $FRinti,$u6,$FRintk" | 
 |      (+ pack FRintk OP_78 FRinti OPE1_0D u6) | 
 |      (sequence ((SI tmp) (SI shift)) | 
 | 	       (set shift (and u6 #x1f)) | 
 | 	       (set tmp (sll FRinti shift)) | 
 | 	       (if (ne shift 0) | 
 | 		   (sequence ((SI tmp1)) | 
 | 			     (set tmp1 (srl (sll (nextreg h-fr_int FRinti 1) | 
 | 						 (sub 31 shift)) | 
 | 					    (sub 31 shift))) | 
 | 			     (set tmp (or tmp tmp1)))) | 
 | 	       (set FRintk tmp)) | 
 |      ((fr400 (unit u-media-3-dual)) (fr450 (unit u-media-3-dual)) | 
 |       (fr550 (unit u-media-3-dual))) | 
 | ) | 
 |  | 
 | (define-pmacro (saturate arg max min result) | 
 |   (if (gt arg max) | 
 |       (set result max) | 
 |       (if (lt arg min) | 
 | 	  (set result min) | 
 | 	  (set result arg))) | 
 | ) | 
 |  | 
 | (dni msaths | 
 |      "Media dual saturation signed" | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "msaths$pack $FRinti,$FRintj,$FRintk" | 
 |      (+ pack FRintk OP_7B FRinti OPE1_0C FRintj) | 
 |      (sequence ((HI argihi) (HI argilo) (HI argjhi) (HI argjlo)) | 
 | 	       (extract-hilo FRinti 0 FRintj 0 argihi argilo argjhi argjlo) | 
 | 	       (saturate argihi argjhi (inv argjhi) (halfword hi FRintk 0)) | 
 | 	       (saturate argilo argjlo (inv argjlo) (halfword lo FRintk 0))) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (dni mqsaths | 
 |      "Media quad saturation signed" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mqsaths$pack $FRintieven,$FRintjeven,$FRintkeven" | 
 |      (+ pack FRintkeven OP_78 FRintieven OPE1_0F FRintjeven) | 
 |      (if (orif (register-unaligned FRintieven 2) | 
 | 	       (orif (register-unaligned FRintjeven 2) | 
 | 		     (register-unaligned FRintkeven 2))) | 
 | 	 (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	 (sequence ((HI argihi) (HI argilo) (HI argjhi) (HI argjlo)) | 
 | 		   ; hack to get FRintkeven referenced as a target for profiling | 
 | 		   (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		   (extract-hilo FRintieven 0 FRintjeven 0 argihi argilo argjhi argjlo) | 
 | 		   (saturate argihi argjhi (inv argjhi) (halfword hi FRintkeven 0)) | 
 | 		   (saturate argilo argjlo (inv argjlo) (halfword lo FRintkeven 0)) | 
 | 		   (extract-hilo FRintieven 1 FRintjeven 1 argihi argilo argjhi argjlo) | 
 | 		   (saturate argihi argjhi (inv argjhi) (halfword hi FRintkeven 1)) | 
 | 		   (saturate argilo argjlo (inv argjlo) (halfword lo FRintkeven 1)))) | 
 |      ((fr400 (unit u-media-1-quad | 
 | 		   (in  FRinti FRintieven) | 
 | 		   (in  FRintj FRintjeven) | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-1-quad | 
 | 		   (in  FRinti FRintieven) | 
 | 		   (in  FRintj FRintjeven) | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-quad))) | 
 | ) | 
 |  | 
 | (define-pmacro (saturate-unsigned arg max result) | 
 |   (if (gt arg max) | 
 |       (set result max) | 
 |       (set result arg)) | 
 | ) | 
 |  | 
 | (dni msathu | 
 |      "Media dual saturation unsigned" | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "msathu$pack $FRinti,$FRintj,$FRintk" | 
 |      (+ pack FRintk OP_7B FRinti OPE1_0D FRintj) | 
 |      (sequence ((UHI argihi) (UHI argilo) (UHI argjhi) (UHI argjlo)) | 
 | 	       (extract-hilo FRinti 0 FRintj 0 argihi argilo argjhi argjlo) | 
 | 	       (saturate-unsigned argihi argjhi (halfword hi FRintk 0)) | 
 | 	       (saturate-unsigned argilo argjlo (halfword lo FRintk 0))) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-compare name mode op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $FRinti,$FRintj,$FCCk") | 
 |        (+ pack (cond-null) FCCk op FRinti ope FRintj) | 
 |        (if (register-unaligned FCCk 2) | 
 | 	   (c-call VOID "@cpu@_media_cr_not_aligned") | 
 | 	   (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 		     (extract-hilo FRinti 0 FRintj 0 | 
 | 				   argihi argilo argjhi argjlo) | 
 | 		     (compare-and-set-fcc argihi argjhi FCCk) | 
 | 		     (compare-and-set-fcc argilo argjlo (nextreg h-fccr FCCk 1)))) | 
 |        ; TODO - doesn't handle second FCC | 
 |        ((fr400 (unit u-media-7)) (fr450 (unit u-media-7)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-compare mcmpsh HI  OP_7B OPE1_0E "Media dual compare signed") | 
 | (media-dual-compare mcmpuh UHI OP_7B OPE1_0F "Media dual compare unsigned") | 
 |  | 
 | ; Bits for the MSR.SIE field | 
 | (define-pmacro (msr-sie-nil)      0) | 
 | (define-pmacro (msr-sie-fri-hi)   8) | 
 | (define-pmacro (msr-sie-fri-lo)   4) | 
 | (define-pmacro (msr-sie-fri-1-hi) 2) | 
 | (define-pmacro (msr-sie-fri-1-lo) 1) | 
 | (define-pmacro (msr-sie-acci)     8) | 
 | (define-pmacro (msr-sie-acci-1)   4) | 
 | (define-pmacro (msr-sie-acci-2)   2) | 
 | (define-pmacro (msr-sie-acci-3)   1) | 
 |  | 
 | (define-pmacro (saturate-v arg max min sie result) | 
 |   (if (gt DI arg max) | 
 |       (sequence () | 
 | 		(set result max) | 
 | 		(c-call VOID "@cpu@_media_overflow" sie)) | 
 |       (if (lt DI arg min) | 
 | 	  (sequence () | 
 | 		    (set result min) | 
 | 		    (c-call VOID "@cpu@_media_overflow" sie)) | 
 | 	  (set result arg))) | 
 | ) | 
 |  | 
 | (dni mabshs | 
 |      "Media dual absolute value, halfword" | 
 |      ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-2) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mabshs$pack $FRintj,$FRintk" | 
 |      (+ pack FRintk OP_78 (FRi-null) OPE1_0A FRintj) | 
 |      (sequence ((HI arghi) (HI arglo)) | 
 | 	       (set FRintj (c-raw-call SI "frv_ref_SI" FRintj)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (set arghi (halfword hi FRintj 0)) | 
 | 	       (set arglo (halfword lo FRintj 0)) | 
 | 	       ; We extend the argument before the abs operation so we can | 
 | 	       ; notice -32768 overflowing as 32768. | 
 | 	       (saturate-v (abs (ext DI arghi)) 32767 -32768 (msr-sie-fri-hi) | 
 | 			   (halfword hi FRintk 0)) | 
 | 	       (saturate-v (abs (ext DI arglo)) 32767 -32768 (msr-sie-fri-lo) | 
 | 			   (halfword lo FRintk 0))) | 
 |      ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 |       (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | ; How to extend from a mode to get the intended signedness. | 
 | (define-pmacro (DI-ext-HI x) (ext DI x)) | 
 | (define-pmacro (DI-ext-UHI x) (zext DI x)) | 
 | (define-pmacro (DI-ext-DI x) x) | 
 |  | 
 | (define-pmacro (media-arith-sat-semantics | 
 | 		operation arg1 arg2 res mode max min sie) | 
 |   (sequence ((DI tmp)) | 
 | 	    ; Make sure we saturate at max/min against a value that is | 
 | 	    ; sign- or zero-extended appropriately from "mode". | 
 | 	    (set tmp (operation DI | 
 | 		      ((.sym DI-ext- mode) arg1) ((.sym DI-ext- mode) arg2))) | 
 | 	    (saturate-v tmp max min sie res)) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-arith-sat-semantics operation mode max min) | 
 |   (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 	    (extract-hilo FRinti 0 FRintj 0 argihi argilo argjhi argjlo) | 
 | 	    (media-arith-sat-semantics operation argihi argjhi | 
 | 				       (halfword hi FRintk 0) mode max min | 
 | 				       (msr-sie-fri-hi)) | 
 | 	    (media-arith-sat-semantics operation argilo argjlo | 
 | 				       (halfword lo FRintk 0) mode max min | 
 | 				       (msr-sie-fri-lo))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-arith-sat name operation mode max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |        (.str name "$pack $FRinti,$FRintj,$FRintk") | 
 |        (+ pack FRintk op FRinti ope FRintj) | 
 |        (media-dual-arith-sat-semantics operation mode max min) | 
 |        ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-arith-sat maddhss add  HI 32767 -32768 OP_7B OPE1_10 "Media dual add signed with saturation") | 
 | (media-dual-arith-sat maddhus add UHI 65535      0 OP_7B OPE1_11 "Media dual add unsigned with saturation") | 
 |  | 
 | (media-dual-arith-sat msubhss sub  HI 32767 -32768 OP_7B OPE1_12 "Media dual sub signed with saturation") | 
 | (media-dual-arith-sat msubhus sub UHI 65535      0 OP_7B OPE1_13 "Media dual sub unsigned with saturation") | 
 |  | 
 | (define-pmacro (conditional-media-dual-arith-sat | 
 | 		name operation mode max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-1) CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$FRintk,$CCi,$cond") | 
 |        (+ pack FRintk op FRinti CCi cond ope FRintj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (media-dual-arith-sat-semantics operation mode max min)) | 
 |        ((fr400 (unit u-media-1)) (fr450 (unit u-media-1)) | 
 | 	(fr500 (unit u-media)) (fr550 (unit u-media))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-dual-arith-sat cmaddhss add  HI 32767 -32768 OP_71 OPE4_0 "Conditional Media dual add signed with saturation") | 
 | (conditional-media-dual-arith-sat cmaddhus add UHI 65535      0 OP_71 OPE4_1 "Conditional Media dual add unsigned with saturation") | 
 |  | 
 | (conditional-media-dual-arith-sat cmsubhss sub  HI 32767 -32768 OP_71 OPE4_2 "Conditional Media dual sub signed with saturation") | 
 | (conditional-media-dual-arith-sat cmsubhus sub UHI 65535      0 OP_71 OPE4_3 "Conditional Media dual sub unsigned with saturation") | 
 |  | 
 | (define-pmacro (media-quad-arith-sat-semantics cond operation mode max min) | 
 |   (if (orif (register-unaligned FRintieven 2) | 
 | 	    (orif (register-unaligned FRintjeven 2) | 
 | 		  (register-unaligned FRintkeven 2))) | 
 |       (c-call VOID "@cpu@_media_register_not_aligned") | 
 |       (if cond | 
 | 	  (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 		    ; hack to get FRintkeven referenced as a target for profiling | 
 | 		    (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 				  argihi argilo argjhi argjlo) | 
 | 		    (media-arith-sat-semantics operation argihi argjhi | 
 | 					       (halfword hi FRintkeven 0) mode | 
 | 					       max min (msr-sie-fri-hi)) | 
 | 		    (media-arith-sat-semantics operation argilo argjlo | 
 | 					       (halfword lo FRintkeven 0) mode | 
 | 					       max min (msr-sie-fri-lo)) | 
 | 		    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 				  argihi argilo argjhi argjlo) | 
 | 		    (media-arith-sat-semantics operation argihi argjhi | 
 | 					       (halfword hi FRintkeven 1) mode | 
 | 					       max min	(msr-sie-fri-1-hi)) | 
 | 		    (media-arith-sat-semantics operation argilo argjlo | 
 | 					       (halfword lo FRintkeven 1) mode | 
 | 					       max min (msr-sie-fri-1-lo))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-arith-sat name operation mode max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$FRintkeven") | 
 |        (+ pack FRintkeven op FRintieven ope FRintjeven) | 
 |        (media-quad-arith-sat-semantics 1 operation mode max min) | 
 |        ((fr400 (unit u-media-1-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) | 
 | 	(fr450 (unit u-media-1-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) | 
 | 	(fr500 (unit u-media-quad-arith | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) (fr550 (unit u-media-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-arith-sat mqaddhss add  HI 32767 -32768 OP_7B OPE1_18 "Media quad add signed with saturation") | 
 | (media-quad-arith-sat mqaddhus add UHI 65535      0 OP_7B OPE1_19 "Media quad add unsigned with saturation") | 
 |  | 
 | (media-quad-arith-sat mqsubhss sub  HI 32767 -32768 OP_7B OPE1_1A "Media quad sub signed with saturation") | 
 | (media-quad-arith-sat mqsubhus sub UHI 65535      0 OP_7B OPE1_1B "Media quad sub unsigned with saturation") | 
 |  | 
 | (define-pmacro (conditional-media-quad-arith-sat | 
 | 		name operation mode max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-2) CONDITIONAL) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$FRintkeven,$CCi,$cond") | 
 |        (+ pack FRintkeven op FRintieven CCi cond ope FRintjeven) | 
 |        (media-quad-arith-sat-semantics (eq CCi (or cond 2)) | 
 | 				       operation mode max min) | 
 |        ((fr400 (unit u-media-1-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) | 
 | 	(fr450 (unit u-media-1-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) | 
 | 	(fr500 (unit u-media-quad-arith | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven))) (fr550 (unit u-media-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-quad-arith-sat cmqaddhss add  HI 32767 -32768 OP_73 OPE4_0 "Conditional Media quad add signed with saturation") | 
 | (conditional-media-quad-arith-sat cmqaddhus add UHI 65535      0 OP_73 OPE4_1 "Conditional Media quad add unsigned with saturation") | 
 |  | 
 | (conditional-media-quad-arith-sat cmqsubhss sub  HI 32767 -32768 OP_73 OPE4_2 "Conditional Media quad sub signed with saturation") | 
 | (conditional-media-quad-arith-sat cmqsubhus sub UHI 65535      0 OP_73 OPE4_3 "Conditional Media quad sub unsigned with saturation") | 
 |  | 
 | ;; Return A if |A| > |B| and B is positive.  Return -A if |A| > |B| and | 
 | ;; B is negative, saturating 0x8000 as 0x7fff.  Return 0 otherwise. | 
 | (define-pmacro (media-low-clear-semantics a b) | 
 |   (cond HI | 
 | 	((le UHI (abs a) (abs b)) 0) | 
 | 	((le HI 0 b) a) | 
 | 	((eq HI a -32768) 32767) | 
 | 	(else (neg a)))) | 
 |  | 
 | ;; Return A if -|B| < A < |B|.  Return -B if A <= -|B|, saturating 0x8000 | 
 | ;; as 0x7fff.  Return B if A >= |B|. | 
 | (define-pmacro (media-scope-limit-semantics a b) | 
 |   (cond HI | 
 | 	((andif (gt HI b -32768) | 
 | 		(ge HI a (abs b))) b) | 
 | 	((gt HI a (neg (abs b))) a) | 
 | 	((eq HI b -32768) 32767) | 
 | 	(else (neg b)))) | 
 |  | 
 | (define-pmacro (media-quad-limit name operation op ope comment) | 
 |   (dni name | 
 |        comment | 
 |        ((UNIT FM0) (MACH fr450) (FR450-MAJOR M-2)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$FRintkeven") | 
 |        (+ pack FRintkeven op FRintieven ope FRintjeven) | 
 |        (if (orif (register-unaligned FRintieven 2) | 
 | 		 (orif (register-unaligned FRintjeven 2) | 
 | 		       (register-unaligned FRintkeven 2))) | 
 | 	   (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	   (sequence ((HI a1) (HI a2) (HI a3) (HI a4) | 
 | 		      (HI b1) (HI b2) (HI b3) (HI b4)) | 
 | 		     ; hack to get FRintkeven referenced as a target | 
 | 		     ; for profiling | 
 | 		     (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		     (extract-hilo FRintieven 0 FRintjeven 0 a1 a2 b1 b2) | 
 | 		     (extract-hilo FRintieven 1 FRintjeven 1 a3 a4 b3 b4) | 
 | 		     (set (halfword hi FRintkeven 0) (operation a1 b1)) | 
 | 		     (set (halfword lo FRintkeven 0) (operation a2 b2)) | 
 | 		     (set (halfword hi FRintkeven 1) (operation a3 b3)) | 
 | 		     (set (halfword lo FRintkeven 1) (operation a4 b4)))) | 
 |        ((fr450 (unit u-media-1-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven) | 
 | 		     (out FRintk FRintkeven)))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-limit mqlclrhs media-low-clear-semantics OP_78 OPE1_10 | 
 | 		  "Media quad low clear") | 
 | (media-quad-limit mqlmths media-scope-limit-semantics OP_78 OPE1_14 | 
 | 		  "Media quad scope limitation") | 
 |  | 
 | (define-pmacro (media-quad-shift name operation op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FM0) (MACH fr450) (FR450-MAJOR M-2)) | 
 |        (.str name "$pack $FRintieven,$u6,$FRintkeven") | 
 |        (+ pack FRintkeven op FRintieven ope u6) | 
 |        (if (orif (register-unaligned FRintieven 2) | 
 | 		 (register-unaligned FRintkeven 2)) | 
 | 	   (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	   (sequence () | 
 | 		     ; hack to get these referenced for profiling | 
 | 		     (set FRintieven (c-raw-call SI "frv_ref_SI" FRintieven)) | 
 | 		     (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		     (set (halfword hi FRintkeven 0) | 
 | 			  (operation HI (halfword hi FRintieven 0) | 
 | 					(and u6 #xf))) | 
 | 		     (set (halfword lo FRintkeven 0) | 
 | 			  (operation HI (halfword lo FRintieven 0) | 
 | 					(and u6 #xf))) | 
 | 		     (set (halfword hi FRintkeven 1) | 
 | 			  (operation HI (halfword hi FRintieven 1) | 
 | 					(and u6 #xf))) | 
 | 		     (set (halfword lo FRintkeven 1) | 
 | 			  (operation HI (halfword lo FRintieven 1) | 
 | 					(and u6 #xf))))) | 
 |        ((fr450 (unit u-media-3-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintieven) | 
 | 		     (out FRintk FRintkeven)))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-shift mqsllhi sll OP_78 OPE1_11 "Media quad left shift") | 
 | (media-quad-shift mqsrahi sra OP_78 OPE1_13 "Media quad right shift") | 
 |  | 
 | (define-pmacro (media-acc-arith-sat name operation mode max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |        (.str name "$pack $ACC40Si,$ACC40Sk") | 
 |        (+ pack ACC40Sk op ACC40Si ope (ACCj-null)) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Si)) | 
 | 	   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	       (if (register-unaligned ACC40Si 2) | 
 | 		   (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		   (media-arith-sat-semantics operation ACC40Si | 
 | 					      (nextreg h-acc40S ACC40Si 1) | 
 | 					      ACC40Sk mode max min (msr-sie-acci))))) | 
 |        ((fr400 (unit u-media-2-acc)) (fr450 (unit u-media-2-acc)) | 
 | 	(fr550 (unit u-media-4-acc))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-acc-arith-sat maddaccs add DI #x7fffffffff (inv DI #x7fffffffff) | 
 | 		     OP_78 OPE1_04 "Media accumulator addition") | 
 | (media-acc-arith-sat msubaccs sub DI #x7fffffffff (inv DI #x7fffffffff) | 
 | 		     OP_78 OPE1_05 "Media accumulator subtraction") | 
 |  | 
 | (define-pmacro (media-dual-acc-arith-sat name operation mode max min op ope | 
 | 					 comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT MDUALACC) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $ACC40Si,$ACC40Sk") | 
 |        (+ pack ACC40Sk op ACC40Si ope (ACCj-null)) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Si)) | 
 | 	   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	       (if (register-unaligned ACC40Si 4) | 
 | 		   (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		   (if (register-unaligned ACC40Sk 2) | 
 | 		       (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		       (sequence () | 
 | 				 (media-arith-sat-semantics operation ACC40Si | 
 | 							    (nextreg h-acc40S ACC40Si 1) | 
 | 							    ACC40Sk mode max min | 
 | 							    (msr-sie-acci)) | 
 | 				 (media-arith-sat-semantics operation | 
 | 							    (nextreg h-acc40S ACC40Si 2) | 
 | 							    (nextreg h-acc40S ACC40Si 3) | 
 | 							    (nextreg h-acc40S ACC40Sk 1) | 
 | 							    mode max min | 
 | 							    (msr-sie-acci-1))))))) | 
 |        ((fr400 (unit u-media-2-acc-dual)) (fr450 (unit u-media-2-acc-dual)) | 
 | 	(fr550 (unit u-media-4-acc-dual))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-acc-arith-sat mdaddaccs add DI #x7fffffffff (inv DI #x7fffffffff) | 
 | 			  OP_78 OPE1_06 "Media accumulator addition") | 
 | (media-dual-acc-arith-sat mdsubaccs sub DI #x7fffffffff (inv DI #x7fffffffff) | 
 | 			  OP_78 OPE1_07 "Media accumulator subtraction") | 
 |  | 
 | (dni masaccs | 
 |      "Media add and subtract signed accumulator with saturation" | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |        "masaccs$pack $ACC40Si,$ACC40Sk" | 
 |        (+ pack ACC40Sk OP_78 ACC40Si OPE1_08 (ACCj-null)) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Si)) | 
 | 	   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	       (if (register-unaligned ACC40Si 2) | 
 | 		   (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		   (if (register-unaligned ACC40Sk 2) | 
 | 		       (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		       (sequence () | 
 | 				 (media-arith-sat-semantics add ACC40Si | 
 | 							    (nextreg h-acc40S ACC40Si 1) | 
 | 							    ACC40Sk DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci)) | 
 | 				 (media-arith-sat-semantics sub ACC40Si | 
 | 							    (nextreg h-acc40S ACC40Si 1) | 
 | 							    (nextreg h-acc40S ACC40Sk 1) | 
 | 							    DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci-1))))))) | 
 |        ((fr400 (unit u-media-2-add-sub)) (fr450 (unit u-media-2-add-sub)) | 
 | 	(fr550 (unit u-media-4-add-sub))) | 
 |   ) | 
 |  | 
 | (dni mdasaccs | 
 |      "Media add and subtract signed accumulator with saturation" | 
 |        ((UNIT MDUALACC) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        "mdasaccs$pack $ACC40Si,$ACC40Sk" | 
 |        (+ pack ACC40Sk OP_78 ACC40Si OPE1_09 (ACCj-null)) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Si)) | 
 | 	   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	       (if (register-unaligned ACC40Si 4) | 
 | 		   (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		   (if (register-unaligned ACC40Sk 4) | 
 | 		       (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 		       (sequence () | 
 | 				 (media-arith-sat-semantics add ACC40Si | 
 | 							    (nextreg h-acc40S ACC40Si 1) | 
 | 							    ACC40Sk DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci)) | 
 | 				 (media-arith-sat-semantics sub ACC40Si | 
 | 							    (nextreg h-acc40S ACC40Si 1) | 
 | 							    (nextreg h-acc40S ACC40Sk 1) | 
 | 							    DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci-1)) | 
 | 				 (media-arith-sat-semantics add | 
 | 							    (nextreg h-acc40S ACC40Si 2) | 
 | 							    (nextreg h-acc40S ACC40Si 3) | 
 | 							    (nextreg h-acc40S ACC40Sk 2) | 
 | 							    DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci-2)) | 
 | 				 (media-arith-sat-semantics sub | 
 | 							    (nextreg h-acc40S ACC40Si 2) | 
 | 							    (nextreg h-acc40S ACC40Si 3) | 
 | 							    (nextreg h-acc40S ACC40Sk 3) | 
 | 							    DI | 
 | 							    #x7fffffffff | 
 | 							    (inv DI #x7fffffffff) | 
 | 							    (msr-sie-acci-3))))))) | 
 |        ((fr400 (unit u-media-2-add-sub-dual)) | 
 | 	(fr450 (unit u-media-2-add-sub-dual)) | 
 | 	(fr550 (unit u-media-4-add-sub-dual))) | 
 |   ) | 
 |  | 
 | (define-pmacro (media-multiply-semantics conv arg1 arg2 res) | 
 |   (set res (mul DI (conv DI arg1) (conv DI arg2))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-multiply-semantics cond mode conv rhs1 rhs2) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 |       (if (register-unaligned ACC40Sk 2) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if cond | 
 | 	      (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 			(extract-hilo FRinti 0 FRintj 0 | 
 | 				      argihi argilo argjhi argjlo) | 
 | 			(media-multiply-semantics conv argihi rhs1 ACC40Sk) | 
 | 			(media-multiply-semantics conv argilo rhs2 | 
 | 						  (nextreg h-acc40S ACC40Sk 1)))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-multiply name mode conv rhs1 rhs2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3) PRESERVE-OVF) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRinti ope FRintj) | 
 |        (media-dual-multiply-semantics 1 mode conv rhs1 rhs2) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-multiply mmulhs  HI ext  argjhi argjlo OP_7B OPE1_14 "Media dual multiply signed") | 
 | (media-dual-multiply mmulhu UHI zext argjhi argjlo OP_7B OPE1_15 "Media dual multiply unsigned") | 
 |  | 
 | (media-dual-multiply mmulxhs  HI ext  argjlo argjhi OP_7B OPE1_28 "Media dual cross multiply signed") | 
 | (media-dual-multiply mmulxhu UHI zext argjlo argjhi OP_7B OPE1_29 "Media dual cross multiply unsigned") | 
 |  | 
 | (define-pmacro (conditional-media-dual-multiply | 
 | 		name mode conv rhs1 rhs2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3) | 
 | 	PRESERVE-OVF CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk,$CCi,$cond") | 
 |        (+ pack ACC40Sk op FRinti CCi cond ope FRintj) | 
 |        (media-dual-multiply-semantics (eq CCi (or cond 2)) mode conv rhs1 rhs2) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-dual-multiply cmmulhs  HI ext  argjhi argjlo OP_72 OPE4_0 "Conditional Media dual multiply signed") | 
 | (conditional-media-dual-multiply cmmulhu UHI zext argjhi argjlo OP_72 OPE4_1 "Conditional Media dual multiply unsigned") | 
 |  | 
 | (define-pmacro (media-quad-multiply-semantics cond mode conv rhs1 rhs2) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 |       (if (register-unaligned ACC40Sk 4) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if (orif (register-unaligned FRintieven 2) | 
 | 		    (register-unaligned FRintjeven 2)) | 
 | 	      (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	      (if cond | 
 | 		  (sequence ((mode argihi) (mode argilo) | 
 | 			     (mode argjhi) (mode argjlo)) | 
 | 			    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-semantics conv argihi rhs1 ACC40Sk) | 
 | 			    (media-multiply-semantics conv argilo rhs2 | 
 | 						      (nextreg h-acc40S ACC40Sk 1)) | 
 | 			    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-semantics conv argihi rhs1 | 
 | 						      (nextreg h-acc40S ACC40Sk 2)) | 
 | 			    (media-multiply-semantics conv argilo rhs2 | 
 | 						      (nextreg h-acc40S ACC40Sk 3))))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-multiply name mode conv rhs1 rhs2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4) PRESERVE-OVF) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRintieven ope FRintjeven) | 
 |        (media-quad-multiply-semantics 1 mode conv rhs1 rhs2)  | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-mul | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-multiply mqmulhs  HI ext  argjhi argjlo OP_7B OPE1_1C "Media quad multiply signed") | 
 | (media-quad-multiply mqmulhu UHI zext argjhi argjlo OP_7B OPE1_1D "Media quad multiply unsigned") | 
 |  | 
 | (media-quad-multiply mqmulxhs  HI ext  argjlo argjhi OP_7B OPE1_2A "Media quad cross multiply signed") | 
 | (media-quad-multiply mqmulxhu UHI zext argjlo argjhi OP_7B OPE1_2B "Media quad cross multiply unsigned") | 
 |  | 
 | (define-pmacro (conditional-media-quad-multiply | 
 | 		name mode conv rhs1 rhs2 op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4) | 
 | 	PRESERVE-OVF CONDITIONAL) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk,$CCi,$cond") | 
 |        (+ pack ACC40Sk op FRintieven CCi cond ope FRintjeven) | 
 |        (media-quad-multiply-semantics (eq CCi (or cond 2)) mode conv rhs1 rhs2) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-mul | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-quad-multiply cmqmulhs  HI ext  argjhi argjlo OP_74 OPE4_0 "Conditional Media quad multiply signed") | 
 | (conditional-media-quad-multiply cmqmulhu UHI zext argjhi argjlo OP_74 OPE4_1 "Conditional Media quad multiply unsigned") | 
 |  | 
 | (define-pmacro (media-multiply-acc-semantics  | 
 | 		conv arg1 addop arg2 res max min sie) | 
 |   (sequence ((DI tmp)) | 
 | 	    (set tmp (addop res (mul DI (conv DI arg1) (conv DI arg2)))) | 
 | 	    (saturate-v tmp max min sie res)) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-multiply-acc-semantics | 
 | 		cond mode conv addop rhw res max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of res)) | 
 |       (if (register-unaligned res 2) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if cond | 
 | 	      (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 			(extract-hilo FRinti 0 FRintj 0 | 
 | 				      argihi argilo argjhi argjlo) | 
 | 			(media-multiply-acc-semantics conv argihi addop argjhi | 
 | 						      res | 
 | 						      max min (msr-sie-acci)) | 
 | 			(media-multiply-acc-semantics conv argilo addop argjlo | 
 | 						      (nextreg rhw res 1) | 
 | 						      max min (msr-sie-acci-1)))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-multiply-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |        (.str name "$pack $FRinti,$FRintj,$" res) | 
 |        (+ pack res op FRinti ope FRintj) | 
 |        (media-dual-multiply-acc-semantics 1 mode conv addop rhw res max min) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-multiply-acc mmachs HI ext add h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_7B OPE1_16 | 
 | 			 "Media dual multiply and accumulate signed") | 
 |  | 
 | (media-dual-multiply-acc mmachu UHI zext add h-acc40U ACC40Uk | 
 | 			 (const DI #xffffffffff) (const DI 0) | 
 | 			 OP_7B OPE1_17 | 
 | 			 "Media dual multiply and accumulate unsigned") | 
 |  | 
 | (media-dual-multiply-acc mmrdhs HI ext sub h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_7B OPE1_30 | 
 | 			 "Media dual multiply and reduce signed") | 
 |  | 
 | (media-dual-multiply-acc mmrdhu UHI zext sub h-acc40U ACC40Uk | 
 | 			 (const DI #xffffffffff) (const DI 0) | 
 | 			 OP_7B OPE1_31 | 
 | 			 "Media dual multiply and reduce unsigned") | 
 |  | 
 | (define-pmacro (conditional-media-dual-multiply-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3) CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$" res ",$CCi,$cond") | 
 |        (+ pack res op FRinti CCi cond ope FRintj) | 
 |        (media-dual-multiply-acc-semantics (eq CCi (or cond 2)) | 
 | 					  mode conv addop rhw res max min) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-dual-multiply-acc cmmachs HI ext add h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_72 OPE4_2 | 
 | 			 "Conditional Media dual multiply and accumulate signed") | 
 |  | 
 | (conditional-media-dual-multiply-acc cmmachu UHI zext add  h-acc40U ACC40Uk | 
 | 			 (const DI #xffffffffff) (const DI 0) | 
 | 			 OP_72 OPE4_3 | 
 | 			 "Conditional Media dual multiply and accumulate unsigned") | 
 |  | 
 | (define-pmacro (media-quad-multiply-acc-semantics | 
 | 		cond mode conv addop rhw res max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of res)) | 
 |       (if (register-unaligned res 4) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if (orif (register-unaligned FRintieven 2) | 
 | 		    (register-unaligned FRintjeven 2)) | 
 | 	      (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	      (if cond | 
 | 		  (sequence ((mode argihi) (mode argilo) | 
 | 			     (mode argjhi) (mode argjlo)) | 
 | 			    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjhi | 
 | 							  res | 
 | 							  max min (msr-sie-acci)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjlo | 
 | 							  (nextreg rhw res 1) | 
 | 							  max min (msr-sie-acci-1)) | 
 | 			    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjhi | 
 | 							  (nextreg rhw res 2) | 
 | 							  max min (msr-sie-acci-2)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjlo | 
 | 							  (nextreg rhw res 3) | 
 | 							  max min | 
 | 							  (msr-sie-acci-3))))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-multiply-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$" res) | 
 |        (+ pack res op FRintieven ope FRintjeven) | 
 |        (media-quad-multiply-acc-semantics 1 mode conv addop rhw res max min) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-mul | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-multiply-acc mqmachs HI ext add h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_7B OPE1_1E | 
 | 			 "Media quad multiply and accumulate signed") | 
 |  | 
 | (media-quad-multiply-acc mqmachu UHI zext add h-acc40U ACC40Uk | 
 | 			 (const DI #xffffffffff) (const DI 0) | 
 | 			 OP_7B OPE1_1F | 
 | 			 "Media quad multiply and accumulate unsigned") | 
 |  | 
 | (define-pmacro (conditional-media-quad-multiply-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4) CONDITIONAL) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$" res ",$CCi,$cond") | 
 |        (+ pack res op FRintieven CCi cond ope FRintjeven) | 
 |        (media-quad-multiply-acc-semantics (eq CCi (or cond 2)) | 
 | 					  mode conv addop rhw res max min) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-mul | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-quad-multiply-acc cmqmachs HI ext add h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_74 OPE4_2 | 
 | 			 "Conditional Media quad multiply and accumulate signed") | 
 |  | 
 | (conditional-media-quad-multiply-acc cmqmachu UHI zext add h-acc40U ACC40Uk | 
 | 			 (const DI #xffffffffff) (const DI 0) | 
 | 			 OP_74 OPE4_3 | 
 | 			 "Conditional media quad multiply and accumulate unsigned") | 
 |  | 
 | (define-pmacro (media-quad-multiply-cross-acc-semantics | 
 | 		cond mode conv addop rhw res max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of res)) | 
 |       (if (register-unaligned res 4) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if (orif (register-unaligned FRintieven 2) | 
 | 		    (register-unaligned FRintjeven 2)) | 
 | 	      (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	      (if cond | 
 | 		  (sequence ((mode argihi) (mode argilo) | 
 | 			     (mode argjhi) (mode argjlo)) | 
 | 			    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjhi | 
 | 							  (nextreg rhw res 2) | 
 | 							  max min (msr-sie-acci-2)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjlo | 
 | 							  (nextreg rhw res 3) | 
 | 							  max min (msr-sie-acci-3)) | 
 | 			    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjhi | 
 | 							  res | 
 | 							  max min (msr-sie-acci)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjlo | 
 | 							  (nextreg rhw res 1) | 
 | 							  max min | 
 | 							  (msr-sie-acci-1))))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-multiply-cross-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$" res) | 
 |        (+ pack res op FRintieven ope FRintjeven) | 
 |        (media-quad-multiply-cross-acc-semantics 1 mode conv addop rhw res | 
 | 						max min) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-multiply-cross-acc mqxmachs HI ext add h-acc40S ACC40Sk | 
 | 			 (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			 OP_78 OPE1_00 | 
 | 			 "Media quad multiply and cross accumulate signed") | 
 |  | 
 | (define-pmacro (media-quad-cross-multiply-cross-acc-semantics | 
 | 		cond mode conv addop rhw res max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of res)) | 
 |       (if (register-unaligned res 4) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if (orif (register-unaligned FRintieven 2) | 
 | 		    (register-unaligned FRintjeven 2)) | 
 | 	      (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	      (if cond | 
 | 		  (sequence ((mode argihi) (mode argilo) | 
 | 			     (mode argjhi) (mode argjlo)) | 
 | 			    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjlo | 
 | 							  (nextreg rhw res 2) | 
 | 							  max min (msr-sie-acci-2)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjhi | 
 | 							  (nextreg rhw res 3) | 
 | 							  max min (msr-sie-acci-3)) | 
 | 			    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjlo | 
 | 							  res | 
 | 							  max min (msr-sie-acci)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjhi | 
 | 							  (nextreg rhw res 1) | 
 | 							  max min | 
 | 							  (msr-sie-acci-1))))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-cross-multiply-cross-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$" res) | 
 |        (+ pack res op FRintieven ope FRintjeven) | 
 |        (media-quad-cross-multiply-cross-acc-semantics 1 mode conv addop rhw res | 
 | 						      max min) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in  FRinti FRintieven) | 
 | 		     (in  FRintj FRintjeven))) | 
 | 	(fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-cross-multiply-cross-acc mqxmacxhs HI ext add h-acc40S ACC40Sk | 
 | 			(const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			OP_78 OPE1_01 | 
 | 			"Media quad cross multiply and cross accumulate signed") | 
 |  | 
 | (define-pmacro (media-quad-cross-multiply-acc-semantics | 
 | 		cond mode conv addop rhw res max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of res)) | 
 |       (if (register-unaligned res 4) | 
 | 	  (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	  (if (orif (register-unaligned FRintieven 2) | 
 | 		    (register-unaligned FRintjeven 2)) | 
 | 	      (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	      (if cond | 
 | 		  (sequence ((mode argihi) (mode argilo) | 
 | 			     (mode argjhi) (mode argjlo)) | 
 | 			    (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjlo | 
 | 							  res | 
 | 							  max min (msr-sie-acci)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjhi | 
 | 							  (nextreg rhw res 1) | 
 | 							  max min (msr-sie-acci-1)) | 
 | 			    (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					  argihi argilo argjhi argjlo) | 
 | 			    (media-multiply-acc-semantics conv argihi addop argjlo | 
 | 							  (nextreg rhw res 2) | 
 | 							  max min (msr-sie-acci-2)) | 
 | 			    (media-multiply-acc-semantics conv argilo addop argjhi | 
 | 							  (nextreg rhw res 3) | 
 | 							  max min | 
 | 							  (msr-sie-acci-3))))))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-cross-multiply-acc | 
 | 		name mode conv addop rhw res max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (MACH fr400,fr450,fr550) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$" res) | 
 |        (+ pack res op FRintieven ope FRintjeven) | 
 |        (media-quad-cross-multiply-acc-semantics 1 mode conv addop rhw res | 
 | 						max min) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-cross-multiply-acc mqmacxhs HI ext add h-acc40S ACC40Sk | 
 | 			(const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 			OP_78 OPE1_02 | 
 | 			"Media quad cross multiply and accumulate signed") | 
 |  | 
 | (define-pmacro (media-complex-semantics | 
 | 		conv lhs1 rhs1 lhs2 rhs2 res max min sie) | 
 |   (sequence ((DI tmp1) (DI tmp2)) | 
 | 	    (media-multiply-semantics conv lhs1 rhs1 tmp1) | 
 | 	    (media-multiply-semantics conv lhs2 rhs2 tmp2) | 
 | 	    (set tmp1 (sub tmp1 tmp2)) | 
 | 	    (saturate-v tmp1 max min sie res)) | 
 | ) | 
 |  | 
 | (define-pmacro (media-complex-semantics-i | 
 | 		conv lhs1 rhs1 lhs2 rhs2 res max min sie) | 
 |   (sequence ((DI tmp1) (DI tmp2)) | 
 | 	    (media-multiply-semantics conv lhs1 rhs1 tmp1) | 
 | 	    (media-multiply-semantics conv lhs2 rhs2 tmp2) | 
 | 	    (set tmp1 (add tmp1 tmp2)) | 
 | 	    (saturate-v tmp1 max min sie res)) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-complex-semantics mode conv rhs1 rhs2 max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 |       (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 		(extract-hilo FRinti 0 FRintj 0 argihi argilo argjhi argjlo) | 
 | 		(media-complex-semantics conv argihi rhs1 argilo rhs2 ACC40Sk | 
 | 					 max min (msr-sie-acci)))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-complex-semantics-i mode conv rhs1 rhs2 max min) | 
 |   (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 |       (sequence ((mode argihi) (mode argilo) (mode argjhi) (mode argjlo)) | 
 | 		(extract-hilo FRinti 0 FRintj 0 argihi argilo argjhi argjlo) | 
 | 		(media-complex-semantics-i conv argihi rhs1 argilo rhs2 ACC40Sk | 
 | 					   max min (msr-sie-acci)))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-complex | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRinti ope FRintj) | 
 |        (media-dual-complex-semantics mode conv rhs1 rhs2 max min) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-pmacro (media-dual-complex-i | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRinti ope FRintj) | 
 |        (media-dual-complex-semantics-i mode conv rhs1 rhs2 max min) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-dual-complex mcpxrs HI ext argjhi argjlo | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_7B OPE1_20 | 
 | 		    "Media dual complex real signed with saturation") | 
 |  | 
 | (media-dual-complex mcpxru UHI zext argjhi argjlo | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_7B OPE1_21 | 
 | 		    "Media dual complex real unsigned with saturation") | 
 |  | 
 | (media-dual-complex-i mcpxis HI ext argjlo argjhi | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_7B OPE1_22 | 
 | 		    "Media dual complex imaginary signed with saturation") | 
 |  | 
 | (media-dual-complex-i mcpxiu UHI zext argjlo argjhi | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_7B OPE1_23 | 
 | 		    "Media dual complex imaginary unsigned with saturation") | 
 |  | 
 | (define-pmacro (conditional-media-dual-complex | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3) CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk,$CCi,$cond") | 
 |        (+ pack ACC40Sk op FRinti CCi cond ope FRintj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (media-dual-complex-semantics mode conv rhs1 rhs2 max min)) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-pmacro (conditional-media-dual-complex-i | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-1) (FR450-MAJOR M-3) CONDITIONAL) | 
 |        (.str name "$pack $FRinti,$FRintj,$ACC40Sk,$CCi,$cond") | 
 |        (+ pack ACC40Sk op FRinti CCi cond ope FRintj) | 
 |        (if (eq CCi (or cond 2)) | 
 | 	   (media-dual-complex-semantics-i mode conv rhs1 rhs2 max min)) | 
 |        ((fr400 (unit u-media-2)) (fr450 (unit u-media-2)) | 
 | 	(fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4))) | 
 |   ) | 
 | ) | 
 |  | 
 | (conditional-media-dual-complex cmcpxrs HI ext argjhi argjlo | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_75 OPE4_0 | 
 | 		    "Conditional Media dual complex real signed with saturation") | 
 |  | 
 | (conditional-media-dual-complex cmcpxru UHI zext argjhi argjlo | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_75 OPE4_1 | 
 | 		    "Conditional Media dual complex real unsigned with saturation") | 
 |  | 
 | (conditional-media-dual-complex-i cmcpxis HI ext argjlo argjhi | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_75 OPE4_2 | 
 | 		    "Conditional Media dual complex imaginary signed with saturation") | 
 |  | 
 | (conditional-media-dual-complex-i cmcpxiu UHI zext argjlo argjhi | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_75 OPE4_3 | 
 | 		    "Conditional Media dual complex imaginary unsigned with saturation") | 
 |  | 
 | (define-pmacro (media-quad-complex | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRintieven ope FRintjeven) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	   (if (register-unaligned ACC40Sk 2) | 
 | 	       (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	       (if (orif (register-unaligned FRintieven 2) | 
 | 			 (register-unaligned FRintjeven 2)) | 
 | 		   (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 		   (sequence ((mode argihi) (mode argilo) | 
 | 			      (mode argjhi) (mode argjlo)) | 
 | 			     (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					   argihi argilo argjhi argjlo) | 
 | 			     (media-complex-semantics conv argihi rhs1 argilo rhs2 | 
 | 						      ACC40Sk | 
 | 						      max min (msr-sie-acci)) | 
 | 			     (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					   argihi argilo argjhi argjlo) | 
 | 			     (media-complex-semantics conv argihi rhs1 argilo rhs2 | 
 | 						      (nextreg h-acc40S ACC40Sk 1) | 
 | 						      max min (msr-sie-acci-1)))))) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-complex | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (define-pmacro (media-quad-complex-i | 
 | 		name mode conv rhs1 rhs2 max min op ope comment) | 
 |   (dni name | 
 |        (comment) | 
 |        ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) | 
 | 	(FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk") | 
 |        (+ pack ACC40Sk op FRintieven ope FRintjeven) | 
 |        (if (c-call SI "@cpu@_check_acc_range" (index-of ACC40Sk)) | 
 | 	   (if (register-unaligned ACC40Sk 2) | 
 | 	       (c-call VOID "@cpu@_media_acc_not_aligned") | 
 | 	       (if (orif (register-unaligned FRintieven 2) | 
 | 			 (register-unaligned FRintjeven 2)) | 
 | 		   (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 		   (sequence ((mode argihi) (mode argilo) | 
 | 			      (mode argjhi) (mode argjlo)) | 
 | 			     (extract-hilo FRintieven 0 FRintjeven 0 | 
 | 					   argihi argilo argjhi argjlo) | 
 | 			     (media-complex-semantics-i conv argihi rhs1 argilo rhs2 | 
 | 							ACC40Sk | 
 | 							max min (msr-sie-acci)) | 
 | 			     (extract-hilo FRintieven 1 FRintjeven 1 | 
 | 					   argihi argilo argjhi argjlo) | 
 | 			     (media-complex-semantics-i conv argihi rhs1 argilo rhs2 | 
 | 							(nextreg h-acc40S ACC40Sk 1) | 
 | 							max min (msr-sie-acci-1)))))) | 
 |        ((fr400 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr450 (unit u-media-2-quad | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) | 
 | 	(fr500 (unit u-media-quad-complex | 
 | 		     (in FRinti FRintieven) | 
 | 		     (in FRintj FRintjeven))) (fr550 (unit u-media-4-quad))) | 
 |   ) | 
 | ) | 
 |  | 
 | (media-quad-complex mqcpxrs HI ext argjhi argjlo | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_7B OPE1_24 | 
 | 		    "Media quad complex real signed with saturation") | 
 |  | 
 | (media-quad-complex mqcpxru UHI zext argjhi argjlo | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_7B OPE1_25 | 
 | 		    "Media quad complex real unsigned with saturation") | 
 |  | 
 | (media-quad-complex-i mqcpxis HI ext argjlo argjhi | 
 | 		    (const DI #x7fffffffff) (const DI #xffffff8000000000) | 
 | 		    OP_7B OPE1_26 | 
 | 		    "Media quad complex imaginary signed with saturation") | 
 |  | 
 | (media-quad-complex-i mqcpxiu UHI zext argjlo argjhi | 
 | 		    (const DI #xffffffffff) (const DI 0) | 
 | 		    OP_7B OPE1_27 | 
 | 		    "Media quad complex imaginary unsigned with saturation") | 
 |  | 
 | (define-pmacro (media-pack src1 src2 targ offset) | 
 |   (sequence () | 
 | 	    (set (halfword hi targ offset) (halfword lo src1 offset)) | 
 | 	    (set (halfword lo targ offset) (halfword lo src2 offset))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-expand-halfword-to-word-semantics cond) | 
 |   (if cond | 
 |       (sequence ((UHI tmp)) | 
 | 		(if (and u6 1) | 
 | 		    (set tmp (halfword lo FRinti 0)) | 
 | 		    (set tmp (halfword hi FRinti 0))) | 
 | 		(set (halfword hi FRintk 0) tmp) | 
 | 		(set (halfword lo FRintk 0) tmp))) | 
 | ) | 
 |  | 
 | (dni mexpdhw | 
 |      "Media expand halfword to word" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mexpdhw$pack $FRinti,$u6,$FRintk" | 
 |      (+ pack FRintk OP_7B FRinti OPE1_32 u6) | 
 |      (media-expand-halfword-to-word-semantics 1) | 
 |      ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (dni cmexpdhw | 
 |      "Conditional media expand halfword to word" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1) CONDITIONAL) | 
 |      "cmexpdhw$pack $FRinti,$u6,$FRintk,$CCi,$cond" | 
 |      (+ pack FRintk OP_76 FRinti CCi cond OPE4_2 u6) | 
 |      (media-expand-halfword-to-word-semantics (eq CCi (or cond 2))) | 
 |      ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-expand-halfword-to-double-semantics cond) | 
 |   (if (register-unaligned FRintkeven 2) | 
 |       (c-call VOID "@cpu@_media_register_not_aligned") | 
 |       (if cond | 
 | 	  (sequence ((UHI tmp)) | 
 | 		    ; a hack to get FRintkeven referenced for profiling | 
 | 		    (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		    (if (and u6 1) | 
 | 			(set tmp (halfword lo FRinti 0)) | 
 | 			(set tmp (halfword hi FRinti 0))) | 
 | 		    (set (halfword hi FRintkeven 0) tmp) | 
 | 		    (set (halfword lo FRintkeven 0) tmp) | 
 | 		    (set (halfword hi FRintkeven 1) tmp) | 
 | 		    (set (halfword lo FRintkeven 1) tmp)))) | 
 | ) | 
 |  | 
 | (dni mexpdhd | 
 |      "Media expand halfword to double" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mexpdhd$pack $FRinti,$u6,$FRintkeven" | 
 |      (+ pack FRintkeven OP_7B FRinti OPE1_33 u6) | 
 |      (media-expand-halfword-to-double-semantics 1) | 
 |      ((fr400 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-dual-expand))) | 
 | ) | 
 |  | 
 | (dni cmexpdhd | 
 |      "Conditional media expand halfword to double" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2) CONDITIONAL) | 
 |      "cmexpdhd$pack $FRinti,$u6,$FRintkeven,$CCi,$cond" | 
 |      (+ pack FRintkeven OP_76 FRinti CCi cond OPE4_3 u6) | 
 |      (media-expand-halfword-to-double-semantics (eq CCi (or cond 2))) | 
 |      ((fr400 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-dual-expand))) | 
 | ) | 
 |  | 
 | (dni mpackh | 
 |      "Media halfword pack" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mpackh$pack $FRinti,$FRintj,$FRintk" | 
 |      (+ pack FRintk OP_7B FRinti OPE1_34 FRintj) | 
 |      (media-pack FRinti FRintj FRintk 0) | 
 |      ((fr400 (unit u-media-3)) (fr450 (unit u-media-3)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media))) | 
 | ) | 
 |  | 
 | (dni mdpackh | 
 |      "Media dual pack" | 
 |      ((UNIT FM01) (FR500-MAJOR M-5) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mdpackh$pack $FRintieven,$FRintjeven,$FRintkeven" | 
 |      (+ pack FRintkeven OP_7B FRintieven OPE1_36 FRintjeven) | 
 |      (if (orif (register-unaligned FRintieven 2) | 
 | 	       (orif (register-unaligned FRintjeven 2) | 
 | 		     (register-unaligned FRintkeven 2))) | 
 | 	 (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	 (sequence () | 
 | 		   ; hack to get these referenced for profiling | 
 | 		   (set FRintieven (c-raw-call SI "frv_ref_SI" FRintieven)) | 
 | 		   (set FRintjeven (c-raw-call SI "frv_ref_SI" FRintjeven)) | 
 | 		   (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		   (media-pack FRintieven FRintjeven FRintkeven 0) | 
 | 		   (media-pack FRintieven FRintjeven FRintkeven 1))) | 
 |      ((fr400 (unit u-media-3-quad | 
 | 		   (in  FRinti FRintieven) | 
 | 		   (in  FRintj FRintjeven) | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-3-quad | 
 | 		   (in  FRinti FRintieven) | 
 | 		   (in  FRintj FRintjeven) | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-quad-arith | 
 | 		   (in  FRinti FRintieven) | 
 | 		   (in  FRintj FRintjeven) | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-quad))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-unpack src soff targ toff) | 
 |   (sequence () | 
 | 	    (set (halfword hi targ toff) (halfword hi src soff)) | 
 | 	    (set (halfword lo targ toff) (halfword hi src soff)) | 
 | 	    (set (halfword hi targ (add toff 1)) (halfword lo src soff)) | 
 | 	    (set (halfword lo targ (add toff 1)) (halfword lo src soff))) | 
 | ) | 
 |  | 
 | (dni munpackh | 
 |      "Media halfword unpack" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "munpackh$pack $FRinti,$FRintkeven" | 
 |      (+ pack FRintkeven OP_7B FRinti OPE1_35 (FRj-null)) | 
 |      (if (register-unaligned FRintkeven 2) | 
 | 	 (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	 (sequence () | 
 | 		   ; hack to get these referenced for profiling | 
 | 		   (set FRinti (c-raw-call SI "frv_ref_SI" FRinti)) | 
 | 		   (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 		   (media-unpack FRinti 0 FRintkeven 0))) | 
 |      ((fr400 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-dual-expand))) | 
 | ) | 
 |  | 
 | (dni mdunpackh | 
 |      "Media dual unpack" | 
 |      ((UNIT FM01) (FR500-MAJOR M-7) (MACH simple,tomcat,frv)) | 
 |      "mdunpackh$pack $FRintieven,$FRintk" | 
 |      (+ pack FRintk OP_7B FRintieven OPE1_37 (FRj-null)) | 
 |      (if (orif (register-unaligned FRintieven 2) (register-unaligned FRintk 4)) | 
 | 	 (c-call VOID "@cpu@_media_register_not_aligned") | 
 | 	 (sequence () | 
 | 		   ; hack to get these referenced for profiling | 
 | 		   (set FRintieven (c-raw-call SI "frv_ref_SI" FRintieven)) | 
 | 		   (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 		   (media-unpack FRintieven 0 FRintk 0) | 
 | 		   (media-unpack FRintieven 1 FRintk 2))) | 
 |      ((fr500 (unit u-media-dual-unpack | 
 | 		   (in FRinti FRintieven)))) | 
 | ) | 
 |  | 
 | (define-pmacro (ubyte num arg offset) | 
 |   (reg (.sym h-fr_ num) (add (index-of arg) offset))) | 
 |  | 
 | (define-pmacro (mbtoh-semantics cond) | 
 |   (if (register-unaligned FRintkeven 2) | 
 |       (c-call VOID "@cpu@_media_register_not_aligned") | 
 |       (if cond | 
 | 	  (sequence () | 
 | 		    (set (halfword hi FRintkeven 0) (ubyte 3 FRintj 0)) | 
 | 		    (set (halfword lo FRintkeven 0) (ubyte 2 FRintj 0)) | 
 | 		    (set (halfword hi FRintkeven 1) (ubyte 1 FRintj 0)) | 
 | 		    (set (halfword lo FRintkeven 1) (ubyte 0 FRintj 0))))) | 
 | ) | 
 |  | 
 | (dni mbtoh | 
 |      "Media convert byte to halfword" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mbtoh$pack $FRintj,$FRintkeven" | 
 |      (+ pack FRintkeven OP_7B (FRi-null) OPE1_38 FRintj) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintj (c-raw-call SI "frv_ref_SI" FRintj)) | 
 | 	       (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 	       (mbtoh-semantics 1)) | 
 |      ((fr400 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-dual-btoh | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-dual-expand))) | 
 | ) | 
 |  | 
 | (dni cmbtoh | 
 |      "Conditional media convert byte to halfword" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2) CONDITIONAL) | 
 |      "cmbtoh$pack $FRintj,$FRintkeven,$CCi,$cond" | 
 |      (+ pack FRintkeven OP_77 (FRi-null) CCi cond OPE4_0 FRintj) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintj (c-raw-call SI "frv_ref_SI" FRintj)) | 
 | 	       (set FRintkeven (c-raw-call SI "frv_ref_SI" FRintkeven)) | 
 | 	       (mbtoh-semantics (eq CCi (or cond 2)))) | 
 |      ((fr400 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr450 (unit u-media-dual-expand | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr500 (unit u-media-dual-btoh | 
 | 		   (out FRintk FRintkeven))) | 
 |       (fr550 (unit u-media-dual-expand | 
 | 		   (in FRinti FRintj)))) | 
 | ) | 
 |  | 
 | (define-pmacro (mhtob-semantics cond) | 
 |   (if (register-unaligned FRintjeven 2) | 
 |       (c-call VOID "@cpu@_media_register_not_aligned") | 
 |       (if cond | 
 | 	  (sequence () | 
 | 		    (set (ubyte 3 FRintk 0) (halfword hi FRintjeven 0)) | 
 | 		    (set (ubyte 2 FRintk 0) (halfword lo FRintjeven 0)) | 
 | 		    (set (ubyte 1 FRintk 0) (halfword hi FRintjeven 1)) | 
 | 		    (set (ubyte 0 FRintk 0) (halfword lo FRintjeven 1))))) | 
 | ) | 
 |  | 
 | (dni mhtob | 
 |      "Media convert halfword to byte" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2)) | 
 |      "mhtob$pack $FRintjeven,$FRintk" | 
 |      (+ pack FRintk OP_7B (FRi-null) OPE1_39 FRintjeven) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintjeven (c-raw-call SI "frv_ref_SI" FRintjeven)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (mhtob-semantics 1)) | 
 |      ((fr400 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr450 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr500 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr550 (unit u-media-3-dual | 
 | 		   (in FRinti FRintjeven)))) | 
 | ) | 
 |  | 
 | (dni cmhtob | 
 |      "Conditional media convert halfword to byte" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-2) CONDITIONAL) | 
 |      "cmhtob$pack $FRintjeven,$FRintk,$CCi,$cond" | 
 |      (+ pack FRintk OP_77 (FRi-null) CCi cond OPE4_1 FRintjeven) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintjeven (c-raw-call SI "frv_ref_SI" FRintjeven)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (mhtob-semantics (eq CCi (or cond 2)))) | 
 |      ((fr400 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr450 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr500 (unit u-media-dual-htob | 
 | 		   (in FRintj FRintjeven))) | 
 |       (fr550 (unit u-media-3-dual | 
 | 		   (in FRinti FRintjeven)))) | 
 | ) | 
 |  | 
 | (define-pmacro (mbtohe-semantics cond) | 
 |   (if (register-unaligned FRintk 4) | 
 |       (c-call VOID "@cpu@_media_register_not_aligned") | 
 |       (if cond | 
 | 	  (sequence () | 
 | 		    (set (halfword hi FRintk 0) (ubyte 3 FRintj 0)) | 
 | 		    (set (halfword lo FRintk 0) (ubyte 3 FRintj 0)) | 
 | 		    (set (halfword hi FRintk 1) (ubyte 2 FRintj 0)) | 
 | 		    (set (halfword lo FRintk 1) (ubyte 2 FRintj 0)) | 
 | 		    (set (halfword hi FRintk 2) (ubyte 1 FRintj 0)) | 
 | 		    (set (halfword lo FRintk 2) (ubyte 1 FRintj 0)) | 
 | 		    (set (halfword hi FRintk 3) (ubyte 0 FRintj 0)) | 
 | 		    (set (halfword lo FRintk 3) (ubyte 0 FRintj 0))))) | 
 | ) | 
 |  | 
 | (dni mbtohe | 
 |      "Media convert byte to halfword extended" | 
 |      ((UNIT FM01) (FR500-MAJOR M-7) (MACH simple,tomcat,frv)) | 
 |      "mbtohe$pack $FRintj,$FRintk" | 
 |      (+ pack FRintk OP_7B (FRi-null) OPE1_3A FRintj) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintj (c-raw-call SI "frv_ref_SI" FRintj)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (mbtohe-semantics 1)) | 
 |      ((fr500 (unit u-media-dual-btohe))) | 
 | ) | 
 |  | 
 | (dni cmbtohe | 
 |      "Conditional media convert byte to halfword extended" | 
 |      ((UNIT FM01) (FR500-MAJOR M-7) CONDITIONAL (MACH simple,tomcat,frv)) | 
 |      "cmbtohe$pack $FRintj,$FRintk,$CCi,$cond" | 
 |      (+ pack FRintk OP_77 (FRi-null) CCi cond OPE4_2 FRintj) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (set FRintj (c-raw-call SI "frv_ref_SI" FRintj)) | 
 | 	       (set FRintk (c-raw-call SI "frv_ref_SI" FRintk)) | 
 | 	       (mbtohe-semantics (eq CCi (or cond 2)))) | 
 |      ((fr500 (unit u-media-dual-btohe))) | 
 | ) | 
 |  | 
 | ; Media NOP | 
 | ; A special case of mclracc | 
 | (dni mnop "Media nop" | 
 |      ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-1) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-1)) | 
 |      "mnop$pack" | 
 |      (+ pack (f-ACC40Sk 63) OP_7B (f-A 1) (misc-null-10) OPE1_3B (FRj-null)) | 
 |      (nop) | 
 |      () | 
 | ) | 
 |  | 
 | ; mclracc with #A==0 | 
 | (dni mclracc-0 | 
 |      "Media clear accumulator(s)" | 
 |      ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |      "mclracc$pack $ACC40Sk,$A0" | 
 |      (+ pack ACC40Sk OP_7B (f-A 0) (misc-null-10) OPE1_3B (FRj-null)) | 
 |      (c-call VOID "@cpu@_clear_accumulators" (index-of ACC40Sk) 0) | 
 |      ((fr400 (unit u-media-4)) (fr450 (unit u-media-4)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-mclracc))) | 
 | ) | 
 |  | 
 | ; mclracc with #A==1 | 
 | (dni mclracc-1 | 
 |      "Media clear accumulator(s)" | 
 |      ((UNIT MCLRACC-1) (FR500-MAJOR M-6) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-2) (FR450-MAJOR M-4)) | 
 |      "mclracc$pack $ACC40Sk,$A1" | 
 |      (+ pack ACC40Sk OP_7B (f-A 1) (misc-null-10) OPE1_3B (FRj-null)) | 
 |      (c-call VOID "@cpu@_clear_accumulators" (index-of ACC40Sk) 1) | 
 |      ((fr400 (unit u-media-4)) (fr450 (unit u-media-4-mclracca)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-mclracc))) | 
 | ) | 
 |  | 
 | (dni mrdacc | 
 |      "Media read accumulator" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-5)) | 
 |      "mrdacc$pack $ACC40Si,$FRintk" | 
 |      (+ pack FRintk OP_7B ACC40Si OPE1_3C (FRj-null)) | 
 |      (set FRintk ACC40Si) | 
 |      ((fr400 (unit u-media-4)) (fr450 (unit u-media-4)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-acc))) | 
 | ) | 
 |  | 
 | (dni mrdaccg | 
 |      "Media read accumulator guard" | 
 |      ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-5)) | 
 |      "mrdaccg$pack $ACCGi,$FRintk" | 
 |      (+ pack FRintk OP_7B ACCGi OPE1_3E (FRj-null)) | 
 |      (set FRintk ACCGi) | 
 |      ((fr400 (unit u-media-4-accg)) (fr450 (unit u-media-4-accg)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-acc (in ACC40Si ACCGi)))) | 
 | ) | 
 |  | 
 | (dni mwtacc | 
 |      "Media write accumulator" | 
 |      ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |      "mwtacc$pack $FRinti,$ACC40Sk" | 
 |      (+ pack ACC40Sk OP_7B FRinti OPE1_3D (FRj-null)) | 
 |      (set ACC40Sk (or (and ACC40Sk (const DI #xffffffff00000000)) | 
 | 		     FRinti)) | 
 |      ((fr400 (unit u-media-4)) (fr450 (unit u-media-4)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-wtacc))) | 
 | ) | 
 |  | 
 | (dni mwtaccg | 
 |      "Media write accumulator guard" | 
 |      ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) | 
 |       (FR400-MAJOR M-1) (FR450-MAJOR M-3)) | 
 |      "mwtaccg$pack $FRinti,$ACCGk" | 
 |      (+ pack ACCGk OP_7B FRinti OPE1_3F (FRj-null)) | 
 |      (sequence () | 
 | 	       ; hack to get these referenced for profiling | 
 | 	       (c-raw-call VOID "frv_ref_SI" ACCGk) | 
 | 	       (set ACCGk FRinti)) | 
 |      ((fr400 (unit u-media-4-accg)) (fr450 (unit u-media-4-accg)) | 
 |       (fr500 (unit u-media)) (fr550 (unit u-media-3-wtacc (in ACC40Sk ACCGk)))) | 
 | ) | 
 |  | 
 | (define-pmacro (media-cop num op) | 
 |   (dni (.sym mcop num) | 
 |        "Media custom instruction" | 
 |        ((UNIT FM01) (FR500-MAJOR M-1) (MACH frv)) | 
 |        (.str "mcop" num "$pack $FRi,$FRj,$FRk") | 
 |        (+ pack FRk op FRi OPE1_00 FRj) | 
 |        (c-call VOID "@cpu@_media_cop" num) | 
 |        () | 
 |   ) | 
 | ) | 
 |  | 
 | (media-cop 1 OP_7C) | 
 | (media-cop 2 OP_7D) | 
 |  | 
 | ; nop | 
 | ; A nop is defined to be a "ori gr0,0,gr0" | 
 | ; This needn't be a macro-insn, but making it one greatly simplifies decode.c | 
 | ; On the other hand spending a little time in the decoder is often worth it. | 
 | ; | 
 | (dnmi nop "nop" | 
 |      ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |      "nop$pack" | 
 |      (emit ori pack (GRi 0) (s12 0) (GRk 0)) | 
 | ) | 
 |  | 
 | ; Floating point NOP | 
 | (dni fnop | 
 |      "Floating point nop" | 
 |      ((UNIT FMALL) (FR500-MAJOR F-8) (FR550-MAJOR F-1) (MACH simple,tomcat,fr500,fr550,frv)) | 
 |      "fnop$pack" | 
 |      (+ pack (rd-null) OP_79 (FRi-null) OPE1_0D (FRj-null)) | 
 |      (nop) | 
 |      () | 
 | ) | 
 |  | 
 | ; A return instruction | 
 | (dnmi ret "return" | 
 |       (NO-DIS (UNIT B01) (FR500-MAJOR B-3) | 
 | 	      (FR400-MAJOR B-3) (FR450-MAJOR B-3)) | 
 |       "ret$pack" | 
 |       (emit bralr pack (hint_taken 2)) | 
 | ) | 
 |  | 
 | (dnmi cmp "compare" | 
 |       (NO-DIS (UNIT IALL) (FR500-MAJOR I-1) | 
 | 	      (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |       "cmp$pack $GRi,$GRj,$ICCi_1" | 
 |       (emit subcc pack GRi GRj (GRk 0) ICCi_1) | 
 | ) | 
 |  | 
 | (dnmi cmpi "compare immediate" | 
 |       (NO-DIS (UNIT IALL) (FR500-MAJOR I-1) | 
 | 	      (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |       "cmpi$pack $GRi,$s10,$ICCi_1" | 
 |       (emit subicc pack GRi s10 (GRk 0) ICCi_1) | 
 | ) | 
 |  | 
 | (dnmi ccmp "conditional compare" | 
 |       (NO-DIS (UNIT IALL) (FR500-MAJOR I-1) | 
 | 	      (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |       "ccmp$pack $GRi,$GRj,$CCi,$cond" | 
 |       (emit csubcc pack GRi GRj (GRk 0) CCi cond) | 
 | ) | 
 |  | 
 | (dnmi mov "move" | 
 |       (NO-DIS (UNIT IALL) (FR500-MAJOR I-1) | 
 | 	      (FR400-MAJOR I-1) (FR450-MAJOR I-1)) | 
 |       "mov$pack $GRi,$GRk" | 
 |       (emit ori pack GRi (s12 0) GRk) | 
 | )    | 
 |  | 
 | (dnmi cmov "conditional move" | 
 |       (NO-DIS (UNIT IALL) (FR500-MAJOR I-1) | 
 | 	      (FR400-MAJOR I-1) (FR450-MAJOR I-1) CONDITIONAL) | 
 |       "cmov$pack $GRi,$GRk,$CCi,$cond" | 
 |       (emit cor pack GRi (GRj 0) GRk CCi cond) | 
 | )    |