OSDN Git Service

2003-10-06 Dave Brolley <brolley@redhat.com>
authorbrolley <brolley>
Wed, 8 Oct 2003 17:53:39 +0000 (17:53 +0000)
committerbrolley <brolley>
Wed, 8 Oct 2003 17:53:39 +0000 (17:53 +0000)
        * frv.cpu, frv.opc: Add support for fr550.

cpu/ChangeLog
cpu/frv.cpu
cpu/frv.opc

index a5d1900..5d09377 100644 (file)
@@ -1,3 +1,7 @@
+2003-10-06  Dave Brolley  <brolley@redhat.com>
+
+       * frv.cpu, frv.opc: Add support for fr550.
+
 2003-09-24  Dave Brolley  <brolley@redhat.com>
 
        * frv.cpu (u-commit): New modelling unit for fr500.
index 9ded338..f70c3eb 100644 (file)
@@ -28,7 +28,7 @@
   (name frv) ; name of cpu architecture
   (comment "Fujitsu FRV")
   (insn-lsb0? #t)
-  (machs frv fr500 fr400 tomcat simple)
+  (machs frv fr550 fr500 fr400 tomcat simple)
   (isas frv)
 )
 
@@ -38,7 +38,7 @@
   ; 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 4)  ; The frv executes up to 4 insns at a time.
+  (parallel-insns 8)  ; The frv executes up to 8 insns at a time.
 )
 
 ; Cpu family definitions.
        )
 )
 \f
+; 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)
   ; 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 IALL
-         FM0 FM1 FM01 FMALL FMLOW
+         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
          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)
    (hsr56     72) (hsr57     73) (hsr58     74) (hsr59     75)
    (hsr60     76) (hsr61     77) (hsr62     78) (hsr63     79)
 
-   (ccr      256) (cccr     263) (lr       272) (lcr      273) (isr      288)
+   (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)
 (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))
                 (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))
+  (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)
 ;
 (define-pmacro (int-logic-r-r name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni not
      ("not")
-     ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-      (fr500 (unit u-integer)))
+      (fr500 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 (dni sdiv
      "signed division"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-MAJOR I-1))
      "sdiv$pack $GRi,$GRj,$GRk"
      (+ pack GRk OP_00 GRi (ICCi_1-null) OPE2_0E GRj)
      (sequence ()
                       GRi GRj (index-of GRk) 0)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (fr500 (unit u-idiv)) (fr550 (unit u-idiv)))
 )
 
 (dni nsdiv
      "non excepting signed division"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) NON-EXCEPTING
-      (MACH simple,tomcat,fr500,frv))
+     ((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 ()
                       GRi GRj (index-of GRk) 1)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (fr500 (unit u-idiv)) (fr550 (unit u-idiv)))
 )
 
 (dni udiv
      "unsigned division reg/reg"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-MAJOR I-1))
      "udiv$pack $GRi,$GRj,$GRk"
      (+ pack GRk OP_00 GRi (ICCi_1-null) OPE2_0F GRj)
      (sequence ()
                       GRi GRj (index-of GRk) 0)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (fr500 (unit u-idiv)) (fr550 (unit u-idiv)))
 )
 
 (dni nudiv
      "non excepting unsigned division"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) NON-EXCEPTING
-      (MACH simple,tomcat,fr500,frv))
+     ((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 ()
                       GRi GRj (index-of GRk) 1)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (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) (FR400-MAJOR I-1))
+       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-       (fr500 (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 MULT-DIV) (FR400-MAJOR I-1) (MACH fr400))
+       (.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)))
+  )
+)
+
+(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) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (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) (FR400-MAJOR I-1) (MACH fr400))
+     "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 IALL) (FR400-MAJOR I-1) (MACH fr400))
+     "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)
 
 (dni scan
      "scan"
-     ((UNIT SCAN) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-      (fr500 (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) (FR400-MAJOR I-1) CONDITIONAL)
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni cnot
      "conditional not"
-     ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-      (fr500 (unit u-integer)))
+      (fr500 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 (dni csmul
      "conditional signed multiply"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-      (fr500 (unit u-imul)))
+      (fr500 (unit u-imul)) (fr550 (unit u-imul)))
 )
 
 (dni csdiv
      "conditional signed division"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
                           GRi GRj (index-of GRk) 0)
                   (clobber GRk)))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (fr500 (unit u-idiv)) (fr550 (unit u-idiv)))
 )
 
 (dni cudiv
      "conditional unsigned division"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
                           GRi GRj (index-of GRk) 0)
                   (clobber GRk)))
      ((fr400 (unit u-idiv))
-      (fr500 (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) (FR400-MAJOR I-1) CONDITIONAL)
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni cscan
      "conditional scan"
-     ((UNIT SCAN) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-      (fr500 (unit u-integer)))
+      (fr500 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 ; Format: INT, Logic, Shift, cc r-r
 (define-pmacro (int-arith-cc-r-r name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-logic-cc-r-r name op ope comment)
   (dni (.sym name cc)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-shift-cc-r-r name l-r op ope comment)
   (dni (.sym name cc)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (multiply-cc-r-r name signop op ope comment)
   (dni name
        (comment)
-       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-imul)))
+       (fr500 (unit u-imul)) (fr550 (unit u-imul)))
   )
 )
 
 (define-pmacro (conditional-int-arith-cc name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni csmulcc
      "conditional signed multiply and set condition code"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-      (fr500 (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) (FR400-MAJOR I-1) CONDITIONAL)
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (conditional-int-shift-cc name l-r op ope comment)
   (dni (.sym c name cc)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1) CONDITIONAL)
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-arith-x-r-r name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-arith-x-cc-r-r name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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 GRk tmp)
                 (set ICCi_1 cc))
        ((fr400 (unit u-integer))
-       (fr500 (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) (FR400-MAJOR I-1) (MACH fr400))
+       (.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)))
+  )
+)
+
+(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) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
        (.str name "$pack $GRi,$s12,$GRk")
        (+ pack GRk op GRi s12)
        (set GRk (operation GRi s12))
        ((fr400 (unit u-integer))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni sdivi
      "signed division reg/immed"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-MAJOR I-1))
      "sdivi$pack $GRi,$s12,$GRk"
      (+ pack GRk OP_1E GRi s12)
      (sequence ()
                       GRi s12 (index-of GRk) 0)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (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) NON-EXCEPTING
-      (MACH simple,tomcat,fr500,frv))
+     ((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 ()
                       GRi s12 (index-of GRk) 1)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (fr500 (unit u-idiv)) (fr550 (unit u-idiv)))
 )
 
 (dni udivi
      "unsigned division reg/immed"
-     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-MAJOR I-1))
      "udivi$pack $GRi,$s12,$GRk"
      (+ pack GRk OP_1F GRi s12)
      (sequence ()
                       GRi s12 (index-of GRk) 0)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (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) NON-EXCEPTING
-      (MACH simple,tomcat,fr500,frv))
+     ((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 ()
                       GRi s12 (index-of GRk) 1)
               (clobber GRk))
      ((fr400 (unit u-idiv))
-      (fr500 (unit u-idiv)))
+      (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) (FR400-MAJOR I-1))
+       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-imul)))
+       (fr500 (unit u-imul)) (fr550 (unit u-imul)))
   )
 )
 
 (define-pmacro (int-shift-r-simm name op comment)
   (dni (.sym name i)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni scani
      "scan immediate"
-     ((UNIT SCAN) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT SCAN) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
      "scani$pack $GRi,$s12,$GRk"
      (+ pack GRk OP_47 GRi s12)
      (scan-semantics GRi s12 GRk)
      ((fr400 (unit u-integer))
-      (fr500 (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) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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 GRk result)
                 (set ICCi_1 cc))
        ((fr400 (unit u-integer))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-logic-cc-r-simm name op comment)
   (dni (.sym name icc)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
        (.str (.sym name icc) "$pack $GRi,$s10,$GRk,$ICCi_1")
        (+ pack GRk op GRi ICCi_1 s10)
        (sequence ((SI tmp))
                 (set GRk tmp)
                 (set-z-and-n ICCi_1 tmp))
        ((fr400 (unit u-integer))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (multiply-cc-r-simm name signop op comment)
   (dni name
        (comment)
-       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT MULT-DIV) (FR500-MAJOR I-1) (FR550-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-imul)))
+       (fr500 (unit u-imul)) (fr550 (unit u-imul)))
   )
 )
 
 (define-pmacro (int-shift-cc-r-simm name l-r op comment)
   (dni (.sym name icc)
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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-z-and-n cc tmp)
                 (set ICCi_1 cc))
        ((fr400 (unit u-integer))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-arith-x-r-simm name operation op comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-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))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 (define-pmacro (int-arith-x-cc-r-simm name operation op comment)
   (dni name
        (comment)
-       ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+       ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
        (.str name "$pack $GRi,$s10,$GRk,$ICCi_1")
        (+ pack GRk op GRi ICCi_1 s10)
        (sequence ((WI tmp) (QI cc))
                 (set GRk tmp)
                 (set ICCi_1 cc))
        ((fr400 (unit u-integer))
-       (fr500 (unit u-integer)))
+       (fr500 (unit u-integer)) (fr550 (unit u-integer)))
   )
 )
 
 
 (dni cmpb
      "Compare bytes"
-     ((UNIT IALL) (FR400-MAJOR I-1) (MACH fr400))
+     ((UNIT IALL) (FR400-MAJOR I-1) (FR550-MAJOR I-1) (MACH fr400,fr550))
      "cmpb$pack $GRi,$GRj,$ICCi_1"
      (+ pack (GRk-null) OP_00 GRi ICCi_1 OPE2_0C GRj)
      (sequence ((QI cc))
               (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)))
+     ((fr400 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 (dni cmpba
      "OR of Compare bytes"
-     ((UNIT IALL) (FR400-MAJOR I-1) (MACH fr400))
+     ((UNIT IALL) (FR400-MAJOR I-1) (FR550-MAJOR I-1) (MACH fr400,fr550))
      "cmpba$pack $GRi,$GRj,$ICCi_1"
      (+ pack (GRk-null) OP_00 GRi ICCi_1 OPE2_0D GRj)
      (sequence ((QI cc))
                                         (eq (and GRi #x000000ff)
                                            (and GRj #x000000ff))))))
               (set ICCi_1 cc))
-     ((fr400 (unit u-integer)))
+     ((fr400 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 ; Format: Load immediate
 ;
 (dni setlo
      "set low order bits"
-     ((UNIT IALL) (FR500-MAJOR I-1) (FR400-MAJOR I-1))
+     ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
      "setlo$pack $ulo16,$GRklo"
      (+ pack GRk OP_3D (misc-null-4) u16)
      (set GRklo u16)
      ((fr400 (unit u-set-hilo))
-      (fr500 (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) (FR400-MAJOR I-1))
+     ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
      "sethi$pack $uhi16,$GRkhi"
      (+ pack GRkhi OP_3E (misc-null-4) u16)
      (set GRkhi u16)
      ((fr400 (unit u-set-hilo))
-      (fr500 (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) (FR400-MAJOR I-1))
+     ((UNIT IALL) (FR500-MAJOR I-1) (FR550-MAJOR I-1) (FR400-MAJOR I-1))
      "setlos$pack $slo16,$GRk"
      (+ pack GRk OP_3F (misc-null-4) s16)
      (set GRk s16)
      ((fr400 (unit u-integer))
-      (fr500 (unit u-integer)))
+      (fr500 (unit u-integer)) (fr550 (unit u-integer)))
 )
 
 (define-pmacro (load-gr-r name mode op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2))
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-MAJOR I-2))
        (.str name "$pack @($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))
-       (fr500 (unit u-gr-load)))
+       (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (load-fr-r name mode op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) FR-ACCESS)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-fr-load)))
+       (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
 (define-pmacro (ne-load-gr-r name mode op ope size comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (ne-load-fr-r name mode op ope size comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
                name not_gr mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
        (.str name "$pack @($GRi,$GRj),$" regtype "doublek")
        (+ pack (.sym regtype doublek) op GRi ope GRj)
        (sequence ((WI address))
 )
 
 (load-double-r-r ldd  0 DI OP_02 OPE1_05 GR  NA
-                ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)))
+                ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
                 "Load double word")
 (load-double-r-r lddf 1 DF OP_02 OPE1_0B FR  FR-ACCESS
-                ((fr400 (unit u-fr-load)) (fr500 (unit u-fr-load)))
+                ((fr400 (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")
                comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING attr
-       (MACH simple,tomcat,fr500,frv))
+       ((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-double-r-r nldd  0 DI OP_02 OPE1_25 GR (ne-DI-size) 0 NA
-                   ((fr500 (unit u-gr-load))) "Load double   word")
+                   ((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))) "Load double float")
+                   ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load))) "Load double float")
 
 ; Semantics for a load-quad insn
 ;
 (define-pmacro (load-gr-u name mode op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2))
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-gr-load)))
+       (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (ne-load-gr-u name mode op ope size comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (load-fr-u name mode op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) FR-ACCESS)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-fr-load)))
+       (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
 (define-pmacro (ne-load-non-gr-u name mode op ope regtype size comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
 (define-pmacro (load-double-gr-u name op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2))
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
-       (fr500 (unit u-gr-load)))
+       (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (ne-load-double-gr-u name op ope size comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) NON-EXCEPTING
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
 
   )
 )
                name mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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)
 )
 
 (load-double-non-gr-u lddfu DF OP_02 OPE1_1B FR  FR-ACCESS
-                     ((fr400 (unit u-fr-load)) (fr500 (unit u-fr-load)))
+                     ((fr400 (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) (FR500-MAJOR I-2) NON-EXCEPTING FR-ACCESS
-       (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
 (define-pmacro (load-r-simm name mode op regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
        (.str name "$pack @($GRi,$d12),$" regtype "k")
        (+ pack (.sym regtype k) op GRi d12)
        (set (.sym regtype k)
 )
 
 (load-r-simm ldsbi  QI OP_30 GR NA
-            ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)))
+            ((fr400 (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)) (fr500 (unit u-gr-load)))
+            ((fr400 (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)) (fr500 (unit u-gr-load)))
+            ((fr400 (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)) (fr500 (unit u-gr-load)))
+            ((fr400 (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)) (fr500 (unit u-gr-load)))
+            ((fr400 (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)) (fr500 (unit u-fr-load)))
+            ((fr400 (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)) (fr500 (unit u-fr-load)))
+            ((fr400 (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)) (fr500 (unit u-fr-load)))
+            ((fr400 (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) (FR500-MAJOR I-2) NON-EXCEPTING attr
-       (MACH simple,tomcat,fr500,frv))
+       ((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
 )
 
 (ne-load-r-simm nldsbi  QI OP_40 GR (ne-QI-size)  0 NA
-               ((fr500 (unit u-gr-load))) "Load   signed byte")
+               ((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))) "Load unsigned byte")
+               ((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))) "Load   signed half")
+               ((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))) "Load unsigned half")
+               ((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))) "Load          word")
+               ((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))) "Load byte float")
+               ((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))) "Load half float")
+               ((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))) "Load word float")
+               ((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) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-MAJOR I-2) attr)
        (.str name "$pack @($GRi,$d12),$" regtype "doublek")
        (+ pack (.sym regtype doublek) op GRi d12)
        (sequence ((WI address))
 )
 
 (load-double-r-simm lddi  0 DI OP_33 GR NA
-                   ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)))
+                   ((fr400 (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)) (fr500 (unit u-fr-load)))
+                   ((fr400 (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) (FR500-MAJOR I-2) NON-EXCEPTING attr
-       (MACH simple,tomcat,fr500,frv))
+       ((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-double-r-simm nlddi  0 DI OP_45 GR (ne-DI-size) 0 NA
-                      ((fr500 (unit u-gr-load))) "Load double word")
+                      ((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))) "Load double float")
+                      ((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
 (define-pmacro (store-r-r name mode op ope reg attr profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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)
 )
 
 (store-r-r stb   QI OP_03 OPE1_00 GR NA
-          ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+          ((fr400 (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)) (fr500 (unit u-gr-store)))
+          ((fr400 (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)) (fr500 (unit u-gr-store)))
+          ((fr400 (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)) (fr500 (unit u-fr-store)))
+          ((fr400 (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)) (fr500 (unit u-fr-store)))
+          ((fr400 (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)) (fr500 (unit u-fr-store)))
+          ((fr400 (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")
 (define-pmacro (store-double-r-r name mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
        (.str name "$pack $" regtype "k,@($GRi,$GRj)")
        (+ pack (.sym regtype k) op GRi ope GRj)
        (sequence ((WI address))
 )
 
 (store-double-r-r std  DI OP_03 OPE1_03 GR  NA
-                 ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                 ((fr400 (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)) (fr500 (unit u-fr-store)))
+                 ((fr400 (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)
 (define-pmacro (store-r-r-u name mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
        (.str name "$pack $" regtype "k,@($GRi,$GRj)")
        (+ pack (.sym regtype k) op GRi ope GRj)
        (sequence ((UWI address))
 )
 
 (store-r-r-u stbu  QI OP_03 OPE1_10 GR NA
-            ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+            ((fr400 (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)) (fr500 (unit u-gr-store)))
+            ((fr400 (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)) (fr500 (unit u-gr-store)))
+            ((fr400 (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)) (fr500 (unit u-fr-store)))
+            ((fr400 (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)) (fr500 (unit u-fr-store)))
+            ((fr400 (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)) (fr500 (unit u-fr-store)))
+            ((fr400 (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) ()
                name mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
        (.str name "$pack $" regtype "k,@($GRi,$GRj)")
        (+ pack (.sym regtype k) op GRi ope GRj)
        (sequence ((WI address))
 )
 
 (store-double-r-r-u stdu  DI OP_03 OPE1_13 GR  NA
-                   ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                   ((fr400 (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)) (fr500 (unit u-fr-store)))
+                   ((fr400 (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 (conditional-load name mode op ope regtype profile comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
 )
 
 (conditional-load cldsb  QI OP_5E OPE4_0 GR
-                 ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)))
+                 ((fr400 (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)) (fr500 (unit u-gr-load)))
+                 ((fr400 (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)) (fr500 (unit u-gr-load)))
+                 ((fr400 (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)) (fr500 (unit u-gr-load)))
+                 ((fr400 (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)) (fr500 (unit u-gr-load)))
+                 ((fr400 (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)) (fr500 (unit u-fr-load)))
+                 ((fr400 (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)) (fr500 (unit u-fr-load)))
+                 ((fr400 (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)) (fr500 (unit u-fr-load)))
+                 ((fr400 (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) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL attr)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
 )
 
 (conditional-load-double cldd  0 DI OP_5F OPE4_1 GR NA
-                        ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)))
+                        ((fr400 (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)) (fr500 (unit u-gr-load)))
+                        ((fr400 (unit u-gr-load)) (fr500 (unit u-gr-load)) (fr550 (unit u-fr-load)))
                         "Load double float")
 
 (dni cldq
 (define-pmacro (conditional-load-gr-u name mode op ope comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
                     (if (ne (index-of GRi) (index-of GRk))
                         (set GRi address))))
        ((fr400 (unit u-gr-load))
-       (fr500 (unit u-gr-load)))
+       (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
   )
 )
 
 (define-pmacro (conditional-load-non-gr-u name mode op ope regtype comment)
   (dni name
        (comment)
-       ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL FR-ACCESS)
+       ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
                                  pc address))
                     (set GRi address)))
        ((fr400 (unit u-fr-load))
-       (fr500 (unit u-fr-load)))
+       (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
   )
 )
 
 
 (dni clddu
      "Load double word,  update"
-     ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL)
+     ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
                   (if (ne (index-of GRi) (index-of GRdoublek))
                       (set GRi address))))
      ((fr400 (unit u-gr-load))
-      (fr500 (unit u-gr-load)))
+      (fr500 (unit u-gr-load)) (fr550 (unit u-gr-load)))
 )
 
 (dni clddfu
      "Load double float, update"
-     ((UNIT LOAD) (FR500-MAJOR I-2) (FR400-MAJOR I-2) CONDITIONAL FR-ACCESS)
+     ((UNIT LOAD) (FR550-MAJOR I-3) (FR500-MAJOR I-2) (FR400-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))
                   (load-double-semantics 1 DF FR address GRj)
                   (set GRi address)))
      ((fr400 (unit u-fr-load))
-      (fr500 (unit u-fr-load)))
+      (fr500 (unit u-fr-load)) (fr550 (unit u-fr-load)))
 )
 
 (dni cldqu
 (define-pmacro (conditional-store name mode op ope regtype profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) CONDITIONAL)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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))
 )
 
 (conditional-store cstb  QI OP_64 OPE4_0 GR
-                  ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                  ((fr400 (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)) (fr500 (unit u-gr-store)))
+                  ((fr400 (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)) (fr500 (unit u-gr-store)))
+                  ((fr400 (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)) (fr500 (unit u-fr-store)))
+                  ((fr400 (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)) (fr500 (unit u-fr-store)))
+                  ((fr400 (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)) (fr500 (unit u-fr-store)))
+                  ((fr400 (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) (FR500-MAJOR I-3) (FR400-MAJOR I-3) CONDITIONAL attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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))
 )
 
 (conditional-store-double cstd  DI OP_64 OPE4_3 GR NA
-                         ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                         ((fr400 (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)) (fr500 (unit u-fr-store)))
+                         ((fr400 (unit u-fr-store)) (fr500 (unit u-fr-store)) (fr550 (unit u-fr-store)))
                          "Store double float")
 
 (dni cstq
                name mode op ope regtype attr profile comment)
   (dni name
        (comment)
-       ((UNIT STORE) (FR500-MAJOR I-3) (FR400-MAJOR I-3) CONDITIONAL attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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))
 )
 
 (conditional-store-u cstbu QI OP_67 OPE4_0 GR NA
-                    ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                    ((fr400 (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)) (fr500 (unit u-gr-store)))
+                    ((fr400 (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)) (fr500 (unit u-gr-store)))
+                    ((fr400 (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)) (fr500 (unit u-fr-store)))
+                    ((fr400 (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)) (fr500 (unit u-fr-store)))
+                    ((fr400 (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)) (fr500 (unit u-fr-store)))
+                    ((fr400 (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) (FR500-MAJOR I-3) (FR400-MAJOR I-3) CONDITIONAL attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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))
 
 (conditional-store-double-u cstdu  DI OP_67 OPE4_3 GR NA
                            ((fr400 (unit u-gr-store))
-                            (fr500 (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)) (fr500 (unit u-fr-store)))
+                           ((fr400 (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) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-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)
 )
 
 (store-r-simm stbi QI OP_50 GR NA
-             ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+             ((fr400 (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)) (fr500 (unit u-gr-store)))
+             ((fr400 (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)) (fr500 (unit u-gr-store)))
+             ((fr400 (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)) (fr500 (unit u-fr-store)))
+             ((fr400 (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)) (fr500 (unit u-fr-store)))
+             ((fr400 (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)) (fr500 (unit u-fr-store)))
+             ((fr400 (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) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
+       ((UNIT STORE) (FR550-MAJOR I-4) (FR500-MAJOR I-3) (FR400-MAJOR I-3) attr)
        (.str name "$pack $" regtype "k,@($GRi,$d12)")
        (+ pack (.sym regtype k) op GRi d12)
        (sequence ((WI address))
 )
 
 (store-double-r-simm stdi  DI OP_53 GR NA
-                    ((fr400 (unit u-gr-store)) (fr500 (unit u-gr-store)))
+                    ((fr400 (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)) (fr500 (unit u-fr-store)))
+                    ((fr400 (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)
   (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) (FR400-MAJOR C-2))
+     ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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))
-      (fr500 (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) (FR400-MAJOR C-2))
+     ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-MAJOR C-2))
      ("swapi$pack @($GRi,$d12),$GRk")
      (+ pack GRk OP_4D GRi d12)
      (swap-semantics GRi d12 GRk)
      ((fr400 (unit u-swap))
-      (fr500 (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) (FR400-MAJOR C-2) CONDITIONAL)
+     ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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))
-      (fr500 (unit u-swap)))
+      (fr500 (unit u-swap)) (fr550 (unit u-swap)))
 )
 
 (define-pmacro (register-transfer
 
 (register-transfer movgf OP_03 OPE1_15
                   GRj FRintk I0
-                  ((FR500-MAJOR I-4) (FR400-MAJOR I-4) FR-ACCESS)
-                  ((fr400 (unit u-gr2fr)) (fr500 (unit u-gr2fr)))
+                  ((FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-MAJOR I-4) FR-ACCESS)
+                  ((fr400 (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) (FR400-MAJOR I-4) FR-ACCESS)
-                  ((fr400 (unit u-fr2gr)) (fr500 (unit u-fr2gr)))
+                  ((FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-MAJOR I-4) FR-ACCESS)
+                  ((fr400 (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)))
 
 (dni movgfd
      "move GR for FR double"
-     ((UNIT I0) (FR500-MAJOR I-4) (FR400-MAJOR I-4) FR-ACCESS)
+     ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-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))
-      (fr500 (unit u-gr2fr)))
+      (fr500 (unit u-gr2fr)) (fr550 (unit u-gr2fr)))
 )
 
 (define-pmacro (register-transfer-double-to-gr-semantics cond)
 
 (dni movfgd
      "move FR for GR double"
-     ((UNIT I0) (FR500-MAJOR I-4) (FR400-MAJOR I-4) FR-ACCESS)
+     ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-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))
-      (fr500 (unit u-fr2gr)))
+      (fr500 (unit u-fr2gr)) (fr550 (unit u-fr2gr)))
 )
 
 (dni movgfq
 )
 
 (conditional-register-transfer cmovgf OP_69 OPE4_0 GRj FRintk I0
-                              ((FR500-MAJOR I-4) (FR400-MAJOR I-4))
-                              ((fr400 (unit u-gr2fr)) (fr500 (unit u-gr2fr)))
+                              ((FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-MAJOR I-4))
+                              ((fr400 (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) (FR400-MAJOR I-4))
-                              ((fr400 (unit u-fr2gr)) (fr500 (unit u-fr2gr)))
+                              ((FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-MAJOR I-4))
+                              ((fr400 (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) (FR400-MAJOR I-4) CONDITIONAL FR-ACCESS)
+     ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-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))
-      (fr500 (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) (FR400-MAJOR I-4) CONDITIONAL FR-ACCESS)
+     ((UNIT I0) (FR500-MAJOR I-4) (FR550-MAJOR I-5) (FR400-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))
-      (fr500 (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) (FR400-MAJOR C-2))
+       ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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))
-       (fr500 (unit unitname)))
+       (fr500 (unit unitname)) (fr550 (unit unitname)))
   )
 )
 
 (define-pmacro (conditional-branch-i prefix cc op cond comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1))
+       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-MAJOR B-1))
        (.str (.sym prefix cc) "$pack $ICCi_2,$hint,$label16")
        (+ pack (.sym ICC_ cc) ICCi_2 op hint label16)
        (sequence ()
                 (if (cond ICCi_2)
                     (set pc label16)))
        ((fr400 (unit u-branch))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
   )
 )
 
 (dni bra
      "integer branch equal"
-      ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1))
+      ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni bno
      "integer branch never"
-      ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1))
+      ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (conditional-branch-i b eq  OP_06 Ieq  "integer branch equal")
 (define-pmacro (conditional-branch-f prefix cc op cond comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1) FR-ACCESS)
+       ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
   )
 )
 
 (dni fbra
      "float branch equal"
-      ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1) FR-ACCESS)
+      ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni fbno
      "float branch never"
-      ((UNIT B01) (FR500-MAJOR B-1) (FR400-MAJOR B-1) FR-ACCESS)
+      ((UNIT B01) (FR500-MAJOR B-1) (FR550-MAJOR B-1) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (conditional-branch-f fb ne  OP_07 Fne  "float branch not equal")
 
 (dni bctrlr
      "LCR conditional branch to lr"
-     ((UNIT B0) (FR500-MAJOR B-2) (FR400-MAJOR B-2))
+     ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-      (fr500 (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) (FR400-MAJOR B-3) attr)
+       ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) (FR400-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))
                 (c-call VOID "@cpu@_model_branch" (spr-lr) hint)
                 (if (cond (.sym i-f CCi_2)) (set pc (spr-lr))))
        ((fr400 (unit u-branch))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
   )
 )
 
 (dni bralr
      "integer cclr branch always"
-     ((UNIT B01) (FR500-MAJOR B-3) (FR400-MAJOR B-3))
+     ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni bnolr
      "integer cclr branch never"
-     ((UNIT B01) (FR500-MAJOR B-3) (FR400-MAJOR B-3))
+     ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) (FR400-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))
-      (fr500 (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")
 
 (dni fbralr
      "float cclr branch always"
-     ((UNIT B01) (FR500-MAJOR B-3) (FR400-MAJOR B-3) FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni fbnolr
      "float cclr branch never"
-     ((UNIT B01) (FR500-MAJOR B-3) (FR400-MAJOR B-3) FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-3) (FR550-MAJOR B-3) (FR400-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))
-      (fr500 (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")
 (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) (FR400-MAJOR B-2) attr)
+       ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-       (fr500 (unit u-branch)))
+       (fr500 (unit u-branch)) (fr550 (unit u-branch)))
   )
 )
 
 (dni bcralr
      "integer ctrlr branch always"
-     ((UNIT B0) (FR500-MAJOR B-2) (FR400-MAJOR B-2))
+     ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni bcnolr
      "integer ctrlr branch never"
-     ((UNIT B0) (FR500-MAJOR B-2) (FR400-MAJOR B-2))
+     ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-      (fr500 (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")
 
 (dni fcbralr
      "float ctrlr branch always"
-     ((UNIT B0) (FR500-MAJOR B-2) (FR400-MAJOR B-2) FR-ACCESS)
+     ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni fcbnolr
      "float ctrlr branch never"
-     ((UNIT B0) (FR500-MAJOR B-2) (FR400-MAJOR B-2) FR-ACCESS)
+     ((UNIT B0) (FR500-MAJOR B-2) (FR550-MAJOR B-2) (FR400-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))
-      (fr500 (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")
 
 (dni jmpl
      "jump and link"
-     ((UNIT I0) (FR500-MAJOR I-5) (FR400-MAJOR I-5))
+     ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni calll
 
 (dni jmpil
      "jump immediate and link"
-     ((UNIT I0) (FR500-MAJOR I-5) (FR400-MAJOR I-5))
+     ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni callil
 
 (dni call
      "call and link"
-     ((UNIT B0) (FR500-MAJOR B-4) (FR400-MAJOR B-4))
+     ((UNIT B0) (FR500-MAJOR B-4) (FR550-MAJOR B-4) (FR400-MAJOR B-4))
      "call$pack $label24"
      (+ pack OP_0F label24)
      (sequence ()
               (set pc label24)
               (c-call VOID "@cpu@_model_branch" pc #x2)) ; hint branch taken
      ((fr400 (unit u-branch))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni rett
     "return from trap"
-    ((UNIT C) (FR500-MAJOR C-2) (FR400-MAJOR C-2) PRIVILEGED)
+    ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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
 (define-pmacro (trap-r prefix cc i-f op ope cond attr comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) attr)
+       ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-       (fr500 (unit u-trap)))
+       (fr500 (unit u-trap)) (fr550 (unit u-trap)))
   )
 )
 
 (dni tra
      "integer trap always"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1))
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (unit u-trap)))
+      (fr500 (unit u-trap)) (fr550 (unit u-trap)))
 )
 
 (dni tno
      "integer trap never"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1))
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (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")
 
 (dni ftra
      "float trap always"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) FR-ACCESS)
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (unit u-trap)))
+      (fr500 (unit u-trap)) (fr550 (unit u-trap)))
 )
 
 (dni ftno
      "flost trap never"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) FR-ACCESS)
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (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")
 (define-pmacro (trap-immed prefix cc i-f op cond attr comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) attr)
+       ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-       (fr500 (unit u-trap)))
+       (fr500 (unit u-trap)) (fr550 (unit u-trap)))
   )
 )
 
 (dni tira
      "integer trap always"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1))
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (unit u-trap)))
+      (fr500 (unit u-trap)) (fr550 (unit u-trap)))
 )
 
 (dni tino
      "integer trap never"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1))
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (unit u-trap)))
+      (fr500 (unit u-trap)) (fr550 (unit u-trap)))
 )
 
 (trap-immed ti eq  I OP_1C Ieq  NA "integer trap equal")
 
 (dni ftira
      "float trap always"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) FR-ACCESS)
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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)))
+      (fr500 (unit u-trap)) (fr550 (unit u-trap)))
 )
 
 (dni ftino
      "float trap never"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) FR-ACCESS)
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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))
-      (fr500 (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")
 
 (dni break
      "break trap"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1))
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-MAJOR C-1))
      "break$pack"
      (+ pack (rd-null) OP_04 (rs-null) (misc-null-3) OPE4_3 (GRj-null))
      (sequence ()
 
 (dni mtrap
      "media trap"
-     ((UNIT C) (FR500-MAJOR C-1) (FR400-MAJOR C-1) FR-ACCESS)
+     ((UNIT C) (FR500-MAJOR C-1) (FR550-MAJOR C-1) (FR400-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) (FR400-MAJOR B-6))
+       ((UNIT B01) (FR500-MAJOR B-6) (FR550-MAJOR B-6) (FR400-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))
 
 (dni notcr
      ("not cccr register")
-     ((UNIT B01) (FR500-MAJOR B-6) (FR400-MAJOR B-6))
+     ((UNIT B01) (FR500-MAJOR B-6) (FR550-MAJOR B-6) (FR400-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-int-condition-code prefix cc op cond comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5))
+       ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-       (fr500 (unit u-check)))
+       (fr500 (unit u-check)) (fr550 (unit u-check)))
   )
 )
 
 (dni ckra
      "check integer cc always"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5))
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-      (fr500 (unit u-check)))
+      (fr500 (unit u-check)) (fr550 (unit u-check)))
 )
 
 (dni ckno
      "check integer cc never"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5))
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-      (fr500 (unit u-check)))
+      (fr500 (unit u-check)) (fr550 (unit u-check)))
 )
 
 (check-int-condition-code ck eq  OP_08 Ieq  "check integer cc equal")
 (define-pmacro (check-float-condition-code prefix cc op cond comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) FR-ACCESS)
+       ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-       (fr500 (unit u-check)))
+       (fr500 (unit u-check)) (fr550 (unit u-check)))
   )
 )
 
 (dni fckra
      "check float cc always"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-      (fr500 (unit u-check)))
+      (fr500 (unit u-check)) (fr550 (unit u-check)))
 )
 
 (dni fckno
      "check float cc never"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
-      (fr500 (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")
 (define-pmacro (conditional-check-int-condition-code prefix cc op ope test comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL)
+       ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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)
           (check-semantics (test ICCi_3) CRj_int)
           (set CRj_int (cr-undefined)))
        ((fr400 (unit u-check))
-       (fr500 (unit u-check)))
+       (fr500 (unit u-check)) (fr550 (unit u-check)))
   )
 )
 
 (dni cckra
      "conditional check integer cc always"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
         (check-semantics (const BI 1) CRj_int)
         (set CRj_int (cr-undefined)))
      ((fr400 (unit u-check))
-      (fr500 (unit u-check)))
+      (fr500 (unit u-check)) (fr550 (unit u-check)))
 )
 
 (dni cckno
      "conditional check integer cc never"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
         (check-semantics (const BI 0) CRj_int)
         (set CRj_int (cr-undefined)))
      ((fr400 (unit u-check))
-      (fr500 (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")
 (define-pmacro (conditional-check-float-condition-code prefix cc op ope test comment)
   (dni (.sym prefix cc)
        (comment)
-       ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL FR-ACCESS)
+       ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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)
           (check-semantics (test FCCi_3) CRj_float)
           (set CRj_float (cr-undefined)))
        ((fr400 (unit u-check))
-       (fr500 (unit u-check)))
+       (fr500 (unit u-check)) (fr550 (unit u-check)))
   )
 )
 
 (dni cfckra
      "conditional check float cc always"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
         (check-semantics (const BI 1) CRj_float)
         (set CRj_float (cr-undefined)))
      ((fr400 (unit u-check))
-      (fr500 (unit u-check)))
+      (fr500 (unit u-check)) (fr550 (unit u-check)))
 )
 
 (dni cfckno
      "conditional check float cc never"
-     ((UNIT B01) (FR500-MAJOR B-5) (FR400-MAJOR B-5) CONDITIONAL FR-ACCESS)
+     ((UNIT B01) (FR500-MAJOR B-5) (FR550-MAJOR B-5) (FR400-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))
         (check-semantics (const BI 0) CRj_float)
         (set CRj_float (cr-undefined)))
      ((fr400 (unit u-check))
-      (fr500 (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")
 
 (dni cjmpl
      "conditional jump and link"
-     ((UNIT I0) (FR500-MAJOR I-5) (FR400-MAJOR I-5) CONDITIONAL)
+     ((UNIT I0) (FR500-MAJOR I-5) (FR550-MAJOR I-6) (FR400-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))
-      (fr500 (unit u-branch)))
+      (fr500 (unit u-branch)) (fr550 (unit u-branch)))
 )
 
 (dni ccalll
 (define-pmacro (cache-invalidate name cache all op ope profile comment)
   (dni name
        (comment)
-       ((UNIT C) (FR500-MAJOR C-2) (FR400-MAJOR C-2))
+       ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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)
 )
 
 (cache-invalidate ici insn 0 OP_03 OPE1_38
-                 ((fr400 (unit u-ici)) (fr500 (unit u-ici)))
+                 ((fr400 (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)) (fr500 (unit u-dci)))
+                 ((fr400 (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) (FR400-MAJOR C-2) (MACH fr400))
+       ((UNIT C) (FR400-MAJOR C-2) (FR550-MAJOR C-2) (MACH fr400,fr550))
        (.str name "$pack @($GRi,$GRj),$ae")
        (+ pack (misc-null-1) ae op GRi ope GRj)
        (if (eq ae 0)
 )
 
 (cache-invalidate-entry icei insn OP_03 OPE1_39
-                       ((fr400 (unit u-ici)))
+                       ((fr400 (unit u-ici)) (fr550 (unit u-ici)))
                        "invalidate insn cache entry")
 (cache-invalidate-entry dcei data OP_03 OPE1_3A
-                       ((fr400 (unit u-dci)))
+                       ((fr400 (unit u-dci)) (fr550 (unit u-dci)))
                        "invalidate data cache entry")
 
 (dni dcf
      "Data cache flush"
-     ((UNIT C) (FR500-MAJOR C-2) (FR400-MAJOR C-2))
+     ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-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))
-      (fr500 (unit u-dcf)))
+      (fr500 (unit u-dcf)) (fr550 (unit u-dcf)))
 )
 
 (dni dcef
      "Data cache entry flush"
-     ((UNIT C) (FR400-MAJOR C-2) (MACH fr400))
+     ((UNIT C) (FR400-MAJOR C-2) (FR550-MAJOR C-2) (MACH fr400,fr550))
      "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)))
+     ((fr400 (unit u-dcf)) (fr550 (unit u-dcf)))
 )
 
 (define-pmacro (write-TLB name insn op ope comment)
   )
 )
 
-(cache-preload icpl insn C () OP_03 OPE1_30
-              ((fr400 (unit u-icpl)) (fr500 (unit u-icpl)))
+(cache-preload icpl insn C ((FR550-MAJOR C-2)) OP_03 OPE1_30
+              ((fr400 (unit u-icpl)) (fr500 (unit u-icpl)) (fr550 (unit u-icpl)))
               "preload insn cache")
-(cache-preload dcpl data DCPL () OP_03 OPE1_34
-              ((fr400 (unit u-dcpl)) (fr500 (unit u-dcpl)))
+(cache-preload dcpl data DCPL ((FR550-MAJOR I-8)) OP_03 OPE1_34
+              ((fr400 (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) (FR400-MAJOR C-2))
+       ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-MAJOR C-2))
        (.str name "$pack $GRi")
        (+ pack (rd-null) op GRi ope (GRj-null))
        (c-call VOID (.str "@cpu@_" cache "_cache_unlock") GRi)
 )
 
 (cache-unlock icul insn OP_03 OPE1_31
-             ((fr400 (unit u-icul)) (fr500 (unit u-icul)))
+             ((fr400 (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)) (fr500 (unit u-dcul)))
+             ((fr400 (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) (FR400-MAJOR C-2))
+       ((UNIT C) (FR500-MAJOR C-2) (FR550-MAJOR C-2) (FR400-MAJOR C-2))
        (.str insn "$pack")
        (+ pack (rd-null) op (rs-null) ope (GRj-null))
        (nop) ; sufficient implementation
 (define-pmacro (clear-ne-flag-r name op ope reg is_float attr profile comment)
   (dni name
        (comment)
-       ((UNIT I01) (FR500-MAJOR I-6) (MACH simple,tomcat,fr500,frv) attr)
+       ((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 ()
 )
 
 (clear-ne-flag-r clrgr OP_0A OPE1_00 GR 0 NA
-                ((fr500 (unit u-clrgr)))
+                ((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)))
+                ((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) (MACH simple,tomcat,fr500,frv) attr)
+       ((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)
 )
 
 (clear-ne-flag-all clrga OP_0A OPE1_01 0 NA
-                  ((fr500 (unit u-clrgr)))
+                ((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)))
+                ((fr500 (unit u-clrfr)) (fr550 (unit u-clrfr)))
                   "Clear FR NE flag ALL")
 
 (define-pmacro (commit-semantics 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) (MACH frv,fr500) attr)
+       ((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)))
+       ((fr500 (unit u-commit)) (fr550 (unit u-commit)))
   )
 )
 
 (define-pmacro (commit name op ope is_float attr comment)
   (dni name
        (comment)
-       ((UNIT I01) (FR500-MAJOR I-6) (MACH frv,fr500) attr)
+       ((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)))
+       ((fr500 (unit u-commit)) (fr550 (unit u-commit)))
   )
 )
 
        (.str name "$pack $" src ",$" targ)
        (+ pack targ op (rs-null) ope src)
        (set targ (conv mode src))
-       ((fr500 (unit u-float-convert)))
+       ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert)))
   )
 )
 
 (floating-point-conversion fitos OP_79 OPE1_00 float SF FRintj FRk
-                          ((MACH simple,tomcat,fr500,frv))
+                          ((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
-                          ((MACH simple,tomcat,fr500,frv))
+                          ((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))
                name op ope conv mode src targ comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR F-1) (MACH simple,tomcat,fr500,frv))
+       ((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 src)))
-       ((fr500 (unit u-float-convert)))
+       ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert)))
   )
 )
 
                name op ope conv mode src targ comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR F-1) (MACH simple,tomcat,fr500,frv))
+       ((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 src)))
-       ((fr500 (unit u-float-convert)))
+       ((fr500 (unit u-float-convert)) (fr550 (unit u-float-convert)))
   )
 )
 
 
 (register-transfer fmovs OP_79 OPE1_02
                   FRj FRk FM01
-                  ((FR500-MAJOR F-1) (MACH simple,tomcat,fr500,frv))
+                  ((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)))
+                  ((fr500 (unit u-fr2fr)) (fr550 (unit u-fr2fr)))
                   "Move Double Float")
 
 (dni fdmovs
 )
 
 (conditional-register-transfer cfmovs OP_6C OPE4_0 FRj FRk FM01
-                              ((FR500-MAJOR F-1)
-                               (MACH simple,tomcat,fr500,frv))
-                              ((fr500 (unit u-fr2fr)))
+                              ((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)
        (.str name "$pack $" src ",$" targ)
        (+ pack src op (rs-null) ope targ)
        (set targ (neg src))
-       ((fr500 (unit u-float-arith)))
+       ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith)))
   )
 )
 
-(floating-point-neg fnegs FRj FRk OP_79 OPE1_03 ((MACH simple,tomcat,fr500,frv)) "Floating point negate, single")
+(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
 
 (dni cfnegs
      "Conditional floating point negate, single"
-     ((UNIT FMALL) (FR500-MAJOR F-1) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith)))
 )
 
 (define-pmacro (float-abs name src targ op ope attr comment)
        (.str name "$pack $" src ",$" targ )
        (+ pack targ op (rs-null) ope src)
        (set targ (abs src))
-       ((fr500 (unit u-float-arith)))
+       ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith)))
   )
 )
 
-(float-abs fabss FRj FRk OP_79 OPE1_04 ((MACH simple,tomcat,fr500,frv)) "Float absolute value, single")
+(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
 
 (dni cfabss
      "Conditional floating point absolute value, single"
-     ((UNIT FMALL) (FR500-MAJOR F-1) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith)))
 )
 
 (dni fsqrts
      "Square root single"
-     ((UNIT FM01) (FR500-MAJOR F-4) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-sqrt)) (fr550 (unit u-float-sqrt)))
 )
 
 (dni fdsqrts
 
 (dni cfsqrts
      "Conditional square root single"
-     ((UNIT FM01) (FR500-MAJOR F-4) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-sqrt)) (fr550 (unit u-float-sqrt)))
 )
 
 (dni nfsqrts
      "Non exception square root, single"
-     ((UNIT FM01) (FR500-MAJOR F-4) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((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,frv) (.unsplice attr))
+       (.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)))
+       ((fr500 (unit u-float-arith)) (fr550 (unit u-float-arith)))
   )
 )
 
-(float-binary-op-s fadds FMALL ((FR500-MAJOR F-2)) add OP_79 OPE1_06 "add single float")
-(float-binary-op-s fsubs FMALL ((FR500-MAJOR F-2)) sub OP_79 OPE1_07 "sub single float")
-(float-binary-op-s fmuls FM01  ((FR500-MAJOR F-3)) mul OP_79 OPE1_08 "mul single float")
+(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) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-div))
+      (fr550 (unit u-float-div)))
 )
 
 (define-pmacro (float-binary-op-d name operation op ope major comment)
 (define-pmacro (conditional-float-binary-op name pipe attr operation op ope profile comment)
   (dni name
        (comment)
-       (.splice (UNIT pipe) (MACH simple,tomcat,fr500,frv)
+       (.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)
   )
 )
 
-(conditional-float-binary-op cfadds FMALL ((FR500-MAJOR F-2)) add OP_6D OPE4_0
-                            ((fr500 (unit u-float-arith)))
+(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)) sub OP_6D OPE4_1
-                            ((fr500 (unit u-float-arith)))
+(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)) mul OP_6E OPE4_0
-                            ((fr500 (unit u-float-arith)))
+(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)) div OP_6E OPE4_1
-                            ((fr500 (unit u-float-div)))
+(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,frv)
+       (.splice (UNIT pipe) (MACH simple,tomcat,fr500,fr550,frv)
                (.unsplice attr))
        (.str name "$pack $FRi,$FRj,$FRk")
        (+ pack FRk op FRi ope FRj)
   )
 )
 
-(ne-float-binary-op nfadds FMALL ((FR500-MAJOR F-2)) add OP_79 OPE1_26
-                   ((fr500 (unit u-float-arith)))
+(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)) sub OP_79 OPE1_27
-                   ((fr500 (unit u-float-arith)))
+(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)) mul OP_79 OPE1_28
-                   ((fr500 (unit u-float-arith)))
+(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)) div OP_79 OPE1_29
-                   ((fr500 (unit u-float-div)))
+(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)
 
 (dni fcmps
      "compare single float"
-     ((UNIT FMALL) (FR500-MAJOR F-2) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-compare)) (fr550 (unit u-float-compare)))
 )
 
 (dni fcmpd
 
 (dni cfcmps
      "Conditional compare single, float"
-     ((UNIT FMALL) (FR500-MAJOR F-2) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((fr500 (unit u-float-compare)) (fr550 (unit u-float-compare)))
 )
 
 (dni fdcmps
      "float dual compare single"
-     ((UNIT FMALL) (FR500-MAJOR F-6) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((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)
                name add_sub arg1 arg2 targ op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR F-5) (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith)))
   )
 )
 
 (define-pmacro (conditional-float-parallel-mul-add name add_sub op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR F-5) CONDITIONAL (MACH simple,tomcat,fr500,frv))
+       ((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)))
+       ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith)))
   )
 )
 
 (define-pmacro (ne-float-parallel-mul-add name add_sub op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR F-5) (MACH simple,tomcat,fr500,frv))
+       ((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" (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)))
+       ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith)))
   )
 )
 
                 (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)))
+       ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith)))
   )
 )
 
-(float-dual-arith fdadds ((FR500-MAJOR F-6) (MACH simple,tomcat,fr500,frv)) add add OP_79 OPE1_16 "dual add, single")
-(float-dual-arith fdsubs ((FR500-MAJOR F-6) (MACH simple,tomcat,fr500,frv)) sub sub OP_79 OPE1_17 "dual sub, single")
-(float-dual-arith fdmuls ((FR500-MAJOR F-7) (MACH simple,tomcat,fr500,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) (MACH simple,tomcat,fr500,frv)) add sub OP_79 OPE1_1E "dual add/sub, single")
+(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) (MACH simple,tomcat,fr500,frv))
+     ((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)))
+     ((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) (MACH simple,tomcat,fr500,frv))
+     ((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 ()
               (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)))
+     ((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)
                 (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)))
+       ((fr500 (unit u-float-dual-arith)) (fr550 (unit u-float-dual-arith)))
   )
 )
 
-(ne-float-dual-arith nfdadds ((FR500-MAJOR F-6) (MACH simple,tomcat,fr500,frv)) add add OP_79 OPE1_36 "ne dual add, single")
-(ne-float-dual-arith nfdsubs ((FR500-MAJOR F-6) (MACH simple,tomcat,fr500,frv)) sub sub OP_79 OPE1_37 "ne dual sub, single")
-(ne-float-dual-arith nfdmuls ((FR500-MAJOR F-7) (MACH simple,tomcat,fr500,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) (MACH simple,tomcat,fr500,frv)) add sub OP_79 OPE1_3E "ne dual add/sub, single")
+(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"
 
 (dni mhsetlos
      "Media set lower signed 12 bits"
-     ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-5) (FR400-MAJOR M-1))
      "mhsetlos$pack $u12,$FRklo"
      (+ pack FRklo OP_78 OPE1_20 u12)
      (set FRklo u12)
-     ((fr400 (unit u-media-hilo)))
+     ((fr400 (unit u-media-hilo)) (fr550 (unit u-media-set (out FRintk FRklo))))
 )
 
 (dni mhsethis
      "Media set upper signed 12 bits"
-     ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-5) (FR400-MAJOR M-1))
      "mhsethis$pack $u12,$FRkhi"
      (+ pack FRkhi OP_78 OPE1_22 u12)
      (set FRkhi u12)
-     ((fr400 (unit u-media-hilo)))
+     ((fr400 (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) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-5) (FR400-MAJOR M-1))
      "mhdsets$pack $u12,$FRintk"
      (+ pack FRintk OP_78 OPE1_24 u12)
      (sequence ()
               (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)))
+     ((fr400 (unit u-media-1)) (fr550 (unit u-media-set)))
 )
 
 (define-pmacro (set-5-semantics target value)
 (define-pmacro (media-set-5 name hilo op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-5) (FR400-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)))
+       ((fr400 (unit u-media-hilo)) (fr550 (unit u-media-set (out FRintk (.sym FRk hilo)))))
   )
 )
 
 
 (dni mhdseth
      "Media dual set halfword upper 5 bits"
-     ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-5) (FR400-MAJOR M-1))
      "mhdseth$pack $s5,$FRintk"
      (+ pack FRintk OP_78 (FRi-null) OPE1_25 (misc-null-11) s5)
      (sequence ()
               (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)))
+     ((fr400 (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) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 (define-pmacro (conditional-media-logic name operation op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 
 (dni mnot
      ("mnot")
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media)))
 )
 
 (dni cmnot
      ("cmnot")
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1) CONDITIONAL)
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-      (fr500 (unit u-media)))
+      (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) (FR400-MAJOR M-1))
+       ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 (define-pmacro (media-cut-r-r name arg op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2))
+       ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 (define-pmacro (media-cut-acc name arg op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+       ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
        (.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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media-3-acc)))
   )
 )
 
 (define-pmacro (media-cut-acc-ss name arg op ope comment)
   (dni name
        (comment)
-       ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+       ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
        (.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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media-3-acc)))
   )
 )
 
 
 (dni mdcutssi
      "Media dual cut with signed saturation"
-     ((UNIT FMLOW) (MACH fr400) (FR400-MAJOR M-2))
+     ((UNIT FMLOW) (MACH fr400,fr550) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mdcutssi$pack $ACC40Si,$s6,$FRintkeven"
      (+ pack FRintkeven OP_78 ACC40Si OPE1_0E s6)
      (if (register-unaligned ACC40Si 2)
                            (c-call SI "@cpu@_media_cut_ss"
                                    (nextreg h-acc40S ACC40Si 1) s6)))))
      ((fr400 (unit u-media-4-acc-dual
-                  (out FRintk FRintkeven))))
+                  (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
 
 (dni maveh
      "Media dual average"
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-      (fr500 (unit u-media)))
+      (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) (FR400-MAJOR M-1))
+       ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
        (.str name "$pack $FRinti,$u6,$FRintk")
        (+ pack FRintk op FRinti ope u6)
        (sequence ()
 )
 
 (media-dual-shift msllhi sll OP_7B OPE1_09
-                 ((fr400 (unit u-media-3)) (fr500 (unit u-media)))
+                 ((fr400 (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)) (fr500 (unit u-media)))
+                 ((fr400 (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)) (fr500 (unit u-media)))
+                 ((fr400 (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) (FR400-MAJOR M-2))
+       ((UNIT FMLOW) (MACH fr400,fr550) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
        (.str name "$pack $FRintieven,$s6,$FRintkeven")
        (+ pack FRintkeven op FRintieven ope s6)
        (if (orif (register-unaligned FRintieven 2)
                                     (and s6 #x1f)))))
        ((fr400 (unit u-media-3-quad
                     (in  FRinti FRintieven)
-                    (out FRintk FRintkeven))))
+                    (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 dual couple, halfword"
-     ((UNIT FMLOW) (MACH fr400) (FR400-MAJOR M-2))
+     "Media bit concatenate, halfword"
+     ((UNIT FMLOW) (MACH fr400,fr550) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mcplhi$pack $FRinti,$u6,$FRintk"
      (+ pack FRintk OP_78 FRinti OPE1_0C u6)
      (sequence ((HI arg1) (HI arg2) (HI shift))
                                            (sub 15 shift)))
                             (set arg1 (or HI arg1 arg2))))
               (set (halfword hi FRintk 0) arg1))
-     ((fr400 (unit u-media-3-dual)))
+     ((fr400 (unit u-media-3-dual)) (fr550 (unit u-media-3-dual)))
 )
 
 (dni mcpli
-     "Media dual couple, word"
-     ((UNIT FMLOW) (MACH fr400) (FR400-MAJOR M-2))
+     "Media bit concatenate, word"
+     ((UNIT FMLOW) (MACH fr400,fr550) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mcpli$pack $FRinti,$u6,$FRintk"
      (+ pack FRintk OP_78 FRinti OPE1_0D u6)
      (sequence ((SI tmp) (SI shift))
                                            (sub 31 shift)))
                             (set tmp (or tmp tmp1))))
               (set FRintk tmp))
-     ((fr400 (unit u-media-3-dual)))
+     ((fr400 (unit u-media-3-dual)) (fr550 (unit u-media-3-dual)))
 )
 
 (define-pmacro (saturate arg max min result)
 
 (dni msaths
      "Media dual saturation signed"
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
               (saturate argihi argjhi (inv argjhi) (halfword hi FRintk 0))
               (saturate argilo argjlo (inv argjlo) (halfword lo FRintk 0)))
      ((fr400 (unit u-media-1))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media)))
 )
 
 (dni mqsaths
      "Media quad saturation signed"
-     ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-2) (FR400-MAJOR M-1))
      "mqsaths$pack $FRintieven,$FRintjeven,$FRintkeven"
      (+ pack FRintkeven OP_78 FRintieven OPE1_0F FRintjeven)
      (if (orif (register-unaligned FRintieven 2)
      ((fr400 (unit u-media-1-quad
                   (in  FRinti FRintieven)
                   (in  FRintj FRintjeven)
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-quad)))
 )
 
 (define-pmacro (saturate-unsigned arg max result)
 
 (dni msathu
      "Media dual saturation unsigned"
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
               (saturate-unsigned argihi argjhi (halfword hi FRintk 0))
               (saturate-unsigned argilo argjlo (halfword lo FRintk 0)))
      ((fr400 (unit u-media-1))
-      (fr500 (unit u-media)))
+      (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) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-MAJOR M-1))
        (.str name "$pack $FRinti,$FRintj,$FCCk")
        (+ pack (cond-null) FCCk op FRinti ope FRintj)
        (if (register-unaligned FCCk 2)
                     (compare-and-set-fcc argilo argjlo (nextreg h-fccr FCCk 1))))
        ; TODO - doesn't handle second FCC
        ((fr400 (unit u-media-7))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 
 (dni mabshs
      "Media dual absolute value, halfword"
-     ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-2) (FR400-MAJOR M-1))
      "mabshs$pack $FRintj,$FRintk"
      (+ pack FRintk OP_78 (FRi-null) OPE1_0A FRintj)
      (sequence ((HI arghi) (HI arglo))
                           (halfword hi FRintk 0))
               (saturate-v (abs arglo) 32767 -32768 (msr-sie-fri-lo)
                           (halfword lo FRintk 0)))
-     ((fr400 (unit u-media-1)))
+     ((fr400 (unit u-media-1)) (fr550 (unit u-media)))
 )
 
 (define-pmacro (media-arith-sat-semantics
 (define-pmacro (media-dual-arith-sat name operation mode max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
                name operation mode max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media)) (fr550 (unit u-media)))
   )
 )
 
 (define-pmacro (media-quad-arith-sat name operation mode max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-2))
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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)
        (fr500 (unit u-media-quad-arith
                     (in  FRinti FRintieven)
                     (in  FRintj FRintjeven)
-                    (out FRintk FRintkeven))))
+                    (out FRintk FRintkeven))) (fr550 (unit u-media-quad)))
   )
 )
 
                name operation mode max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-2) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-2) (FR400-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))
        (fr500 (unit u-media-quad-arith
                     (in  FRinti FRintieven)
                     (in  FRintj FRintjeven)
-                    (out FRintk FRintkeven))))
+                    (out FRintk FRintkeven))) (fr550 (unit u-media-quad)))
   )
 )
 
 (define-pmacro (media-acc-arith-sat name operation mode max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-1))
        (.str name "$pack $ACC40Si,$ACC40Sk")
        (+ pack ACC40Sk op ACC40Si ope (ACCj-null))
-       (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)))
+       (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)) (fr550 (unit u-media-4-acc)))
   )
 )
 
                                         comment)
   (dni name
        (comment)
-       ((UNIT MDUALACC) (MACH fr400) (FR400-MAJOR M-2))
+       ((UNIT MDUALACC) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.str name "$pack $ACC40Si,$ACC40Sk")
        (+ pack ACC40Sk op ACC40Si ope (ACCj-null))
-       (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)))
+       (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)) (fr550 (unit u-media-4-acc-dual)))
   )
 )
 
 
 (dni masaccs
      "Media add and subtract signed accumulator with saturation"
-       ((UNIT FMALL) (MACH fr400) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-1))
        "masaccs$pack $ACC40Si,$ACC40Sk"
        (+ pack ACC40Sk OP_78 ACC40Si OPE1_08 (ACCj-null))
-       (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)))
+       (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)) (fr550 (unit u-media-4-add-sub)))
   )
 
 (dni mdasaccs
      "Media add and subtract signed accumulator with saturation"
-       ((UNIT MDUALACC) (MACH fr400) (FR400-MAJOR M-2))
+       ((UNIT MDUALACC) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        "mdasaccs$pack $ACC40Si,$ACC40Sk"
        (+ pack ACC40Sk OP_78 ACC40Si OPE1_09 (ACCj-null))
-       (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)))
+       (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)) (fr550 (unit u-media-4-add-sub-dual)))
   )
 
 (define-pmacro (media-multiply-semantics conv arg1 arg2 res)
 )
 
 (define-pmacro (media-dual-multiply-semantics cond mode conv rhs1 rhs2)
-  (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)))))
+  (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) (FR400-MAJOR M-1) PRESERVE-OVF)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1) 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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv rhs1 rhs2 op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-1)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1)
        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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
 (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 (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))))))
+  (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) (FR400-MAJOR M-2) PRESERVE-OVF)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2) PRESERVE-OVF)
        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk")
        (+ pack ACC40Sk op FRintieven ope FRintjeven)
        (media-quad-multiply-semantics 1 mode conv rhs1 rhs2) 
                     (in  FRintj FRintjeven)))
        (fr500 (unit u-media-quad-mul
                     (in  FRinti FRintieven)
-                    (in  FRintj FRintjeven))))
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
                name mode conv rhs1 rhs2 op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-2)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2)
        PRESERVE-OVF CONDITIONAL)
        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk,$CCi,$cond")
        (+ pack ACC40Sk op FRintieven CCi cond ope FRintjeven)
                     (in  FRintj FRintjeven)))
        (fr500 (unit u-media-quad-mul
                     (in  FRinti FRintieven)
-                    (in  FRintj FRintjeven))))      
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 
 (define-pmacro (media-dual-multiply-acc-semantics
                cond mode conv addop rhw res max min)
-  (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)))))
+  (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) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1))
        (.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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv addop rhw res max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-1) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1) 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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
 
 (define-pmacro (media-quad-multiply-acc-semantics
                cond mode conv addop rhw res max min)
-  (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))))))
+  (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) (FR400-MAJOR M-2))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.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)
                     (in  FRintj FRintjeven)))
        (fr500 (unit u-media-quad-mul
                     (in  FRinti FRintieven)
-                    (in  FRintj FRintjeven))))
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
                name mode conv addop rhw res max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-2) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2) 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))
                     (in  FRintj FRintjeven)))
        (fr500 (unit u-media-quad-mul
                     (in  FRinti FRintieven)
-                    (in  FRintj FRintjeven))))
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 
 (define-pmacro (media-quad-multiply-cross-acc-semantics
                cond mode conv addop rhw res max min)
-  (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))))))
+  (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 MDUALACC) (MACH fr400) (FR400-MAJOR M-2))
+       ((UNIT MDUALACC) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.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))))
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 
 (define-pmacro (media-quad-cross-multiply-cross-acc-semantics
                cond mode conv addop rhw res max min)
-  (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))))))
+  (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 MDUALACC) (MACH fr400) (FR400-MAJOR M-2))
+       ((UNIT MDUALACC) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.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))))
+                    (in  FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 
 (define-pmacro (media-quad-cross-multiply-acc-semantics
                cond mode conv addop rhw res max min)
-  (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))))))
+  (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 MDUALACC) (MACH fr400) (FR400-MAJOR M-2))
+       ((UNIT MDUALACC) (MACH fr400,fr550) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.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))))
+                    (in FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 )
 
 (define-pmacro (media-dual-complex-semantics mode conv rhs1 rhs2 max min)
-  (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)))
+  (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)
-  (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)))
+  (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) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1))
        (.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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv rhs1 rhs2 max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-1))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1))
        (.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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv rhs1 rhs2 max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-1) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1) 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))
-       (fr500 (unit u-media)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv rhs1 rhs2 max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-1) CONDITIONAL)
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-1) 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))
-       (fr500 (unit u-media-dual-mul)))
+       (fr500 (unit u-media-dual-mul)) (fr550 (unit u-media-4)))
   )
 )
 
                name mode conv rhs1 rhs2 max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-2))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk")
        (+ pack ACC40Sk op FRintieven ope FRintjeven)
-       (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)))))
+       (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)))
        (fr500 (unit u-media-quad-complex
                     (in FRinti FRintieven)
-                    (in FRintj FRintjeven))))
+                    (in FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
                name mode conv rhs1 rhs2 max min op ope comment)
   (dni name
        (comment)
-       ((UNIT FMALL) (FR500-MAJOR M-4) (FR400-MAJOR M-2))
+       ((UNIT FMALL) (FR500-MAJOR M-4) (FR550-MAJOR M-4) (FR400-MAJOR M-2))
        (.str name "$pack $FRintieven,$FRintjeven,$ACC40Sk")
        (+ pack ACC40Sk op FRintieven ope FRintjeven)
-       (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)))))
+       (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)))
        (fr500 (unit u-media-quad-complex
                     (in FRinti FRintieven)
-                    (in FRintj FRintjeven))))
+                    (in FRintj FRintjeven))) (fr550 (unit u-media-4-quad)))
   )
 )
 
 
 (dni mexpdhw
      "Media expand halfword to word"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media)))
 )
 
 (dni cmexpdhw
      "Conditional media expand halfword to word"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1) CONDITIONAL)
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media)))
 )
 
 (define-pmacro (media-expand-halfword-to-double-semantics cond)
 
 (dni mexpdhd
      "Media expand halfword to double"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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)))
       (fr500 (unit u-media-dual-expand
-                    (out FRintk FRintkeven))))
+                    (out FRintk FRintkeven))) (fr550 (unit u-media-dual-expand)))
 )
 
 (dni cmexpdhd
      "Conditional media expand halfword to double"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2) CONDITIONAL)
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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)))
       (fr500 (unit u-media-dual-expand
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-dual-expand)))
 )
 
 (dni mpackh
      "Media halfword pack"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media)))
 )
 
 (dni mdpackh
      "Media dual pack"
-     ((UNIT FM01) (FR500-MAJOR M-5) (FR400-MAJOR M-2))
+     ((UNIT FM01) (FR500-MAJOR M-5) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mdpackh$pack $FRintieven,$FRintjeven,$FRintkeven"
      (+ pack FRintkeven OP_7B FRintieven OPE1_36 FRintjeven)
      (if (orif (register-unaligned FRintieven 2)
       (fr500 (unit u-media-quad-arith
                   (in  FRinti FRintieven)
                   (in  FRintj FRintjeven)
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-quad)))
 )
 
 (define-pmacro (media-unpack src soff targ toff)
 
 (dni munpackh
      "Media halfword unpack"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "munpackh$pack $FRinti,$FRintkeven"
      (+ pack FRintkeven OP_7B FRinti OPE1_35 (FRj-null))
      (if (register-unaligned FRintkeven 2)
      ((fr400 (unit u-media-dual-expand
                   (out FRintk FRintkeven)))
       (fr500 (unit u-media-dual-expand
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-dual-expand)))
 )
 
 (dni mdunpackh
 
 (dni mbtoh
      "Media convert byte to halfword"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mbtoh$pack $FRintj,$FRintkeven"
      (+ pack FRintkeven OP_7B (FRi-null) OPE1_38 FRintj)
      (sequence ()
      ((fr400 (unit u-media-dual-expand
                   (out FRintk FRintkeven)))
       (fr500 (unit u-media-dual-btoh
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-dual-expand)))
 )
 
 (dni cmbtoh
      "Conditional media convert byte to halfword"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2) CONDITIONAL)
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-2) CONDITIONAL)
      "cmbtoh$pack $FRintj,$FRintkeven,$CCi,$cond"
      (+ pack FRintkeven OP_77 (FRi-null) CCi cond OPE4_0 FRintj)
      (sequence ()
      ((fr400 (unit u-media-dual-expand
                   (out FRintk FRintkeven)))
       (fr500 (unit u-media-dual-btoh
-                  (out FRintk FRintkeven))))
+                  (out FRintk FRintkeven))) (fr550 (unit u-media-dual-expand (in FRinti FRintj))))
 )
 
 (define-pmacro (mhtob-semantics cond)
 
 (dni mhtob
      "Media convert halfword to byte"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-2))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "mhtob$pack $FRintjeven,$FRintk"
      (+ pack FRintk OP_7B (FRi-null) OPE1_39 FRintjeven)
      (sequence ()
      ((fr400 (unit u-media-dual-htob
                   (in FRintj FRintjeven)))
       (fr500 (unit u-media-dual-htob
-                  (in FRintj FRintjeven))))
+                  (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) (FR400-MAJOR M-2) CONDITIONAL)
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-2) CONDITIONAL)
      "cmhtob$pack $FRintjeven,$FRintk,$CCi,$cond"
      (+ pack FRintk OP_77 (FRi-null) CCi cond OPE4_1 FRintjeven)
      (sequence ()
      ((fr400 (unit u-media-dual-htob
                   (in FRintj FRintjeven)))
       (fr500 (unit u-media-dual-htob
-                  (in FRintj FRintjeven))))
+                  (in FRintj FRintjeven))) (fr550 (unit u-media-3-dual (in FRinti FRintjeven))))
 )
 
 (define-pmacro (mbtohe-semantics cond)
 ; Media NOP
 ; A special case of mclracc
 (dni mnop "Media nop"
-     ((UNIT FMALL) (FR500-MAJOR M-1) (FR400-MAJOR M-1))
+     ((UNIT FMALL) (FR500-MAJOR M-1) (FR550-MAJOR M-1) (FR400-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) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
      "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))
-      (fr500 (unit u-media)))
+      (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) (FR400-MAJOR M-2))
+     ((UNIT MCLRACC-1) (FR500-MAJOR M-6) (FR550-MAJOR M-3) (FR400-MAJOR M-2))
      "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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media-3-mclracc)))
 )
 
 (dni mrdacc
      "Media read accumulator"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
      "mrdacc$pack $ACC40Si,$FRintk"
      (+ pack FRintk OP_7B ACC40Si OPE1_3C (FRj-null))
      (set FRintk ACC40Si)
      ((fr400 (unit u-media-4))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media-3-acc)))
 )
 
 (dni mrdaccg
      "Media read accumulator guard"
-     ((UNIT FM01) (FR500-MAJOR M-2) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-2) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
      "mrdaccg$pack $ACCGi,$FRintk"
      (+ pack FRintk OP_7B ACCGi OPE1_3E (FRj-null))
      (set FRintk ACCGi)
      ((fr400 (unit u-media-4-accg))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media-3-acc (in ACC40Si ACCGi))))
 )
 
 (dni mwtacc
      "Media write accumulator"
-     ((UNIT FM01) (FR500-MAJOR M-3) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
      "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))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media-3-wtacc)))
 )
 
 (dni mwtaccg
      "Media write accumulator guard"
-     ((UNIT FM01) (FR500-MAJOR M-3) (FR400-MAJOR M-1))
+     ((UNIT FM01) (FR500-MAJOR M-3) (FR550-MAJOR M-3) (FR400-MAJOR M-1))
      "mwtaccg$pack $FRinti,$ACCGk"
      (+ pack ACCGk OP_7B FRinti OPE1_3F (FRj-null))
      (sequence ()
               (c-raw-call VOID "frv_ref_SI" ACCGk)
               (set ACCGk FRinti))
      ((fr400 (unit u-media-4-accg))
-      (fr500 (unit u-media)))
+      (fr500 (unit u-media)) (fr550 (unit u-media-3-wtacc (in ACC40Sk ACCGk))))
 )
 
 (define-pmacro (media-cop num op)
 ; Floating point NOP
 (dni fnop
      "Floating point nop"
-     ((UNIT FMALL) (FR500-MAJOR F-8) (MACH simple,tomcat,fr500,frv))
+     ((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)
index cd3572f..e149508 100644 (file)
@@ -1,6 +1,6 @@
 /* Fujitsu FRV opcode support, for GNU Binutils.  -*- C -*-
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2003 Free Software Foundation, Inc.
 
    Contributed by Red Hat Inc; developed under contract from Fujitsu.
 
@@ -49,7 +49,8 @@
 #define CGEN_VERBOSE_ASSEMBLER_ERRORS
 
 /* Vliw support.  */
-#define FRV_VLIW_SIZE 4 /* fr500 has largest vliw size of 4.  */
+#define FRV_VLIW_SIZE 8 /* fr550 has largest vliw size of 8.  */
+#define PAD_VLIW_COMBO ,UNIT_NIL,UNIT_NIL,UNIT_NIL,UNIT_NIL
 typedef CGEN_ATTR_VALUE_TYPE VLIW_COMBO[FRV_VLIW_SIZE];
 
 typedef struct
@@ -61,6 +62,7 @@ typedef struct
   CGEN_ATTR_VALUE_TYPE *unit_mapping;
   VLIW_COMBO           *current_vliw;
   CGEN_ATTR_VALUE_TYPE  major[FRV_VLIW_SIZE];
+  const CGEN_INSN*      insn[FRV_VLIW_SIZE];
 } FRV_VLIW;
 
 int frv_is_branch_major PARAMS ((CGEN_ATTR_VALUE_TYPE, unsigned long));
@@ -76,6 +78,7 @@ int spr_valid           PARAMS ((long));
 \f
 /* -- opc.c */
 #include "elf/frv.h"
+#include <stdio.h>
 
 static int match_unit
   PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, CGEN_ATTR_VALUE_TYPE));
@@ -89,8 +92,10 @@ static int fr400_check_insn_major_constraints
   PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
 static int fr500_check_insn_major_constraints
   PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
+static int fr550_check_insn_major_constraints
+  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, const CGEN_INSN *));
 static int check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
+  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, const CGEN_INSN *));
 
 int
 frv_is_branch_major (CGEN_ATTR_VALUE_TYPE major, unsigned long mach)
@@ -190,32 +195,69 @@ frv_is_media_insn (const CGEN_INSN *insn)
 static VLIW_COMBO fr400_allowed_vliw[] =
 {
   /*  slot0       slot1       slot2       slot3    */
-  {  UNIT_I0,    UNIT_I1,    UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_I0,    UNIT_FM0,   UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_I0,    UNIT_B0,    UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_FM0,   UNIT_FM1,   UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_FM0,   UNIT_B0,    UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_B0,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_C,     UNIT_NIL,   UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL  }
+  {  UNIT_I0,    UNIT_I1,    UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_B0,    UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_FM0,   UNIT_FM1,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_FM0,   UNIT_B0,    UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_B0,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_C,     UNIT_NIL,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO }
 };
 
 /* This table represents the allowable packing for vliw insns for the fr500.
+   The fr500 has only 4 vliw slots. Represent this by not allowing any insns
+   in the extra slots.
    Subsets of any given row are also allowed.  */
 static VLIW_COMBO fr500_allowed_vliw[] =
 {
   /*  slot0       slot1       slot2       slot3    */
-  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1  },
-  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_B0   },
-  {  UNIT_I0,    UNIT_FM0,   UNIT_FM1,   UNIT_B0   },
-  {  UNIT_I0,    UNIT_FM0,   UNIT_B0,    UNIT_B1   },
-  {  UNIT_I0,    UNIT_I1,    UNIT_B0,    UNIT_B1   },
-  {  UNIT_I0,    UNIT_B0,    UNIT_B1,    UNIT_NIL  },
-  {  UNIT_FM0,   UNIT_FM1,   UNIT_B0,    UNIT_B1   },
-  {  UNIT_FM0,   UNIT_B0,    UNIT_B1,    UNIT_NIL  },
-  {  UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_C,     UNIT_NIL,   UNIT_NIL,   UNIT_NIL  },
-  {  UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL  }
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1  PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_B0   PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_FM1,   UNIT_B0   PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_B0,    UNIT_B1   PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_I1,    UNIT_B0,    UNIT_B1   PAD_VLIW_COMBO },
+  {  UNIT_I0,    UNIT_B0,    UNIT_B1,    UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_FM0,   UNIT_FM1,   UNIT_B0,    UNIT_B1   PAD_VLIW_COMBO },
+  {  UNIT_FM0,   UNIT_B0,    UNIT_B1,    UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_C,     UNIT_NIL,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO },
+  {  UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL  PAD_VLIW_COMBO }
+};
+
+/* This table represents the allowable packing for vliw insns for the fr550.
+   Subsets of any given row are also allowed.  */
+static VLIW_COMBO fr550_allowed_vliw[] =
+{
+  /*  slot0       slot1       slot2       slot3       slot4       slot5       slot6       slot7   */
+  {  UNIT_I0,    UNIT_I1,    UNIT_I2,    UNIT_I3,    UNIT_B0,    UNIT_B1 ,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_I1,    UNIT_I2,    UNIT_B0,    UNIT_B1 ,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_I1,    UNIT_B0,    UNIT_B1 ,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_B0,    UNIT_B1 ,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_FM2,   UNIT_I3,    UNIT_FM3 },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_FM2,   UNIT_I3,    UNIT_B0  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_FM2,   UNIT_FM3,   UNIT_B0  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_FM2,   UNIT_B0,    UNIT_B1  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_I3,    UNIT_B0,    UNIT_B1  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_I2,    UNIT_B0,    UNIT_B1,    UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_FM2,   UNIT_FM3,   UNIT_B0,    UNIT_B1  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_FM2,   UNIT_FM3,   UNIT_B0,    UNIT_B1  },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_FM2,   UNIT_B0,    UNIT_B1,    UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_FM1,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_I2,    UNIT_I3,    UNIT_B0,    UNIT_B1,    UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_I2,    UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_I1,    UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_FM1,   UNIT_FM2,   UNIT_FM3,   UNIT_B0,    UNIT_B1,    UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_FM1,   UNIT_FM2,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_FM1,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_I0,    UNIT_FM0,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_C,     UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_FM0,   UNIT_FM1,   UNIT_FM2,   UNIT_FM3,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL },
+  {  UNIT_FM0,   UNIT_FM1,   UNIT_FM2,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_FM0,   UNIT_FM1,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_FM0,   UNIT_B0,    UNIT_B1,    UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL },
+  {  UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL,   UNIT_NIL }
 };
 
 /* Some insns are assigned specialized implementation units which map to
@@ -228,10 +270,14 @@ static CGEN_ATTR_VALUE_TYPE fr400_unit_mapping[] =
 /* I0       */     UNIT_I0,
 /* I1       */     UNIT_I1,
 /* I01      */     UNIT_I01, 
+/* I2       */     UNIT_NIL, /* no I2 or I3 unit */
+/* I3       */     UNIT_NIL,
 /* IALL     */     UNIT_I01, /* only I0 and I1 units */
 /* FM0      */     UNIT_FM0,
 /* FM1      */     UNIT_FM1,
 /* FM01     */     UNIT_FM01,
+/* FM2      */     UNIT_NIL, /* no F2 or M2 units */
+/* FM3      */     UNIT_NIL, /* no F3 or M3 units */
 /* FMALL    */     UNIT_FM01,/* Only F0,F1,M0,M1 units */
 /* FMLOW    */     UNIT_FM0, /* Only F0,M0 units */
 /* B0       */     UNIT_B0,  /* branches only in B0 unit.  */
@@ -254,10 +300,14 @@ static CGEN_ATTR_VALUE_TYPE fr500_unit_mapping[] =
 /* I0       */     UNIT_I0,
 /* I1       */     UNIT_I1,
 /* I01      */     UNIT_I01, 
+/* I2       */     UNIT_NIL, /* no I2 or I3 unit */
+/* I3       */     UNIT_NIL,
 /* IALL     */     UNIT_I01, /* only I0 and I1 units */
 /* FM0      */     UNIT_FM0,
 /* FM1      */     UNIT_FM1,
 /* FM01     */     UNIT_FM01,
+/* FM2      */     UNIT_NIL, /* no F2 or M2 units */
+/* FM3      */     UNIT_NIL, /* no F3 or M2 units */
 /* FMALL    */     UNIT_FM01,/* Only F0,F1,M0,M1 units */
 /* FMLOW    */     UNIT_FM0, /* Only F0,M0 units */
 /* B0       */     UNIT_B0,
@@ -273,6 +323,36 @@ static CGEN_ATTR_VALUE_TYPE fr500_unit_mapping[] =
 /* MCLRACC-1*/     UNIT_FM01 /* mclracc,A==1 in FM0 or FM1 unit.  */
 };
 
+static CGEN_ATTR_VALUE_TYPE fr550_unit_mapping[] =
+{
+/* unit in insn    actual unit */
+/* NIL      */     UNIT_NIL,
+/* I0       */     UNIT_I0,
+/* I1       */     UNIT_I1,
+/* I01      */     UNIT_I01, 
+/* I2       */     UNIT_I2,
+/* I3       */     UNIT_I3,
+/* IALL     */     UNIT_IALL, 
+/* FM0      */     UNIT_FM0,
+/* FM1      */     UNIT_FM1,
+/* FM01     */     UNIT_FM01,
+/* FM2      */     UNIT_FM2,
+/* FM3      */     UNIT_FM3,
+/* FMALL    */     UNIT_FMALL,
+/* FMLOW    */     UNIT_FM01, /* Only F0,F1,M0,M1 units */
+/* B0       */     UNIT_B0,
+/* B1       */     UNIT_B1,
+/* B01      */     UNIT_B01,
+/* C        */     UNIT_C,
+/* MULT-DIV */     UNIT_I01,  /* multiply and divide in I0 or I1 unit.    */
+/* LOAD     */     UNIT_I01,  /* load                in I0 or I1 unit.    */
+/* STORE    */     UNIT_I01,  /* store               in I0 or I1 unit.    */
+/* SCAN     */     UNIT_IALL, /* scan                in any integer unit. */
+/* DCPL     */     UNIT_I0,   /* dcpl                only in I0 unit.     */
+/* MDUALACC */     UNIT_FMALL,/* media dual acc insn in all media units   */
+/* MCLRACC-1*/     UNIT_FM01  /* mclracc,A==1 in FM0 or FM1 unit.         */
+};
+
 void
 frv_vliw_reset (FRV_VLIW *vliw, unsigned long mach, unsigned long elf_flags)
 {
@@ -287,6 +367,10 @@ frv_vliw_reset (FRV_VLIW *vliw, unsigned long mach, unsigned long elf_flags)
       vliw->current_vliw = fr400_allowed_vliw;
       vliw->unit_mapping = fr400_unit_mapping;
       break;
+    case bfd_mach_fr550:
+      vliw->current_vliw = fr550_allowed_vliw;
+      vliw->unit_mapping = fr550_unit_mapping;
+      break;
     default:
       vliw->current_vliw = fr500_allowed_vliw;
       vliw->unit_mapping = fr500_unit_mapping;
@@ -319,6 +403,13 @@ match_unit (FRV_VLIW *vliw,
       if (unit1 - unit2 <= 2)
        return 1;
       break;
+    case UNIT_IALL:
+    case UNIT_FMALL:
+      /* The ALL versions of these units are within 5 enums of the 0, 1, 2 or 3
+        versions.  */
+      if (unit1 - unit2 <= 5)
+       return 1;
+      break;
     default:
       break;
     }
@@ -353,7 +444,11 @@ add_next_to_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit)
   VLIW_COMBO    *potential;
 
   if (next <= 0)
-    abort (); /* Should never happen */
+    {
+      fprintf (stderr, "frv-opc.c line %d: bad vliw->next_slot value.\n",
+              __LINE__);
+      abort (); /* Should never happen */
+    }
 
   /* The table is sorted by units allowed within slots, so vliws with
      identical starting sequences are together.  */
@@ -408,6 +503,123 @@ fr400_check_insn_major_constraints (
 }
 
 static int
+find_unit_in_vliw (
+  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit
+)
+{
+  int i;
+  for (i = 0; i < vliw->next_slot; ++i)
+    if (CGEN_INSN_ATTR_VALUE (vliw->insn[i], CGEN_INSN_UNIT) == unit)
+      return 1;
+
+  return 0; /* not found */
+}
+
+static int
+find_major_in_slot (
+  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, CGEN_ATTR_VALUE_TYPE slot
+)
+{
+  int i;
+
+  for (i = 0; i < vliw->next_slot; ++i)
+    if (vliw->major[i] == major && (*vliw->current_vliw)[i] == slot)
+      return 1;
+
+  return 0;
+}
+
+static int
+fr550_find_media_in_vliw (FRV_VLIW *vliw)
+{
+  int i;
+
+  for (i = 0; i < vliw->next_slot; ++i)
+    {
+      if (vliw->major[i] < FR550_MAJOR_M_1 || vliw->major[i] > FR550_MAJOR_M_5)
+       continue;
+
+      /* Found a media insn, however, MNOP and MCLRACC don't count.  */
+      if (CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_MNOP
+         || CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_MCLRACC_0
+         || CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_MCLRACC_1)
+       continue;
+
+      return 1; /* found one */
+    }
+
+  return 0;
+}
+
+static int
+fr550_find_float_in_vliw (FRV_VLIW *vliw)
+{
+  int i;
+
+  for (i = 0; i < vliw->next_slot; ++i)
+    {
+      if (vliw->major[i] < FR550_MAJOR_F_1 || vliw->major[i] > FR550_MAJOR_F_4)
+       continue;
+
+      /* Found a floating point insn, however, FNOP doesn't count.  */
+      if (CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_FNOP)
+       continue;
+
+      return 1; /* found one */
+    }
+
+  return 0;
+}
+
+static int
+fr550_check_insn_major_constraints (
+  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, const CGEN_INSN *insn
+)
+{
+  CGEN_ATTR_VALUE_TYPE unit;
+  CGEN_ATTR_VALUE_TYPE slot = (*vliw->current_vliw)[vliw->next_slot];
+  switch (slot)
+    {
+    case UNIT_I2:
+      /* If it's a store, then there must be another store in I1 */
+      unit = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_UNIT);
+      if (unit == UNIT_STORE)
+       return find_unit_in_vliw (vliw, UNIT_STORE);
+      break;
+    case UNIT_FM2:
+    case UNIT_FM3:
+      /* Floating point insns other than FNOP in slot f2 or f3 cannot coexist with
+        media insns.  */
+      if (major >= FR550_MAJOR_F_1 && major <= FR550_MAJOR_F_4
+         && CGEN_INSN_NUM (insn) != FRV_INSN_FNOP)
+       return ! fr550_find_media_in_vliw (vliw);
+      /* Media insns other than MNOP in slot m2 or m3 cannot coexist with
+        floating point insns.  */
+      if (major >= FR550_MAJOR_M_1 && major <= FR550_MAJOR_M_5
+         && CGEN_INSN_NUM (insn) != FRV_INSN_MNOP)
+       return ! fr550_find_float_in_vliw (vliw);
+      /* F-2 in slot f2 or f3 cannot coexist with F-2 or F-4 in slot f1 or f2
+        respectively.
+       */
+      if (major == FR550_MAJOR_F_2)
+       return ! find_major_in_slot (vliw, FR550_MAJOR_F_2, slot - (UNIT_FM2 - UNIT_FM0))
+         &&   ! find_major_in_slot (vliw, FR550_MAJOR_F_4, slot - (UNIT_FM2 - UNIT_FM0));
+      /* M-2 or M-5 in slot m2 or m3 cannot coexist with M-2 in slot m1 or m2
+        respectively.  */
+      if (major == FR550_MAJOR_M_2 || major == FR550_MAJOR_M_5)
+       return ! find_major_in_slot (vliw, FR550_MAJOR_M_2, slot - (UNIT_FM2 - UNIT_FM0));
+      /* M-4 in slot m2 or m3 cannot coexist with M-4 in slot m1 or m2
+        respectively.  */
+      if (major == FR550_MAJOR_M_4)
+       return ! find_major_in_slot (vliw, FR550_MAJOR_M_4, slot - (UNIT_FM2 - UNIT_FM0));
+      break;
+    default:
+      break;
+    }
+  return 1; /* all ok */
+}
+
+static int
 fr500_check_insn_major_constraints (
   FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major
 )
@@ -508,6 +720,8 @@ fr500_check_insn_major_constraints (
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_6)
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_7);
     default:
+      fprintf (stderr, "frv-opc.c, line %d: bad major code, aborting.\n",
+              __LINE__);
       abort ();
       break;
     }
@@ -516,7 +730,7 @@ fr500_check_insn_major_constraints (
 
 static int
 check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major
+  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, const CGEN_INSN *insn
 )
 {
   int rc;
@@ -525,6 +739,9 @@ check_insn_major_constraints (
     case bfd_mach_fr400:
       rc = fr400_check_insn_major_constraints (vliw, major);
       break;
+    case bfd_mach_fr550:
+      rc = fr550_check_insn_major_constraints (vliw, major, insn);
+      break;
     default:
       rc = fr500_check_insn_major_constraints (vliw, major);
       break;
@@ -551,13 +768,20 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
 
   unit = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_UNIT);
   if (unit == UNIT_NIL)
-    abort (); /* no UNIT specified for this insn in frv.cpu  */
+    {
+      fprintf (stderr, "frv-opc.c line %d: bad insn unit.\n",
+              __LINE__);
+      abort (); /* no UNIT specified for this insn in frv.cpu  */
+    }
 
   switch (vliw->mach)
     {
     case bfd_mach_fr400:
       major = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR);
       break;
+    case bfd_mach_fr550:
+      major = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR550_MAJOR);
+      break;
     default:
       major = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR);
       break;
@@ -569,6 +793,7 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
       while (! match_unit (vliw, unit, (*vliw->current_vliw)[0]))
        ++vliw->current_vliw;
       vliw->major[0] = major;
+      vliw->insn[0] = insn;
       vliw->next_slot = 1;
       return 0;
     }
@@ -579,10 +804,11 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
   if (! (vliw->elf_flags & EF_FRV_NOPACK))
     {
       new_vliw = add_next_to_vliw (vliw, unit);
-      if (new_vliw && check_insn_major_constraints (vliw, major))
+      if (new_vliw && check_insn_major_constraints (vliw, major, insn))
        {
          vliw->current_vliw = new_vliw;
          vliw->major[index] = major;
+         vliw->insn[index] = insn;
          vliw->next_slot++;
          return 0;
        }