;;; -*- Mode:LISP; Package:(MICRO GLOBAL); Base:8; Readtable:ZL -*-

(define-micro-component popj-after-next ()
  lam-ir-popj-after-next 1
  )

(define-micro-component no-op ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu)

(define-micro-component jump ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-unc
  lam-ir-n 1
  lam-ir-jump-addr :required
  )

(define-micro-component jump-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-unc
  lam-ir-jump-addr :required
  )

(define-micro-component call ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-unc
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  )

(define-micro-component call-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-cond lam-jump-cond-unc
  lam-ir-jump-addr :required
  )

(define-micro-component popj ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-unc
  lam-ir-r 1
  lam-ir-n 1
  )

(define-micro-component popj-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-r 1
  lam-ir-jump-cond lam-jump-cond-unc
  )

(define-micro-component jump-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m=a
  lam-ir-n 1
  lam-ir-jump-addr :required
  )

(define-micro-component jump-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m=a
  lam-ir-jump-addr :required
  )

(define-micro-component call-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m=a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  )

(define-micro-component call-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-cond lam-jump-cond-m=a
  lam-ir-jump-addr :required
  )

(define-micro-component popj-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m=a
  lam-ir-r 1
  lam-ir-n 1
  )

(define-micro-component popj-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-r 1
  lam-ir-jump-cond lam-jump-cond-m=a
  )

(define-micro-component jump-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  lam-ir-n 1
  lam-ir-jump-addr :required
  )

(define-micro-component jump-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  lam-ir-jump-addr :required
  )

(define-micro-component call-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  )

(define-micro-component call-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  lam-ir-jump-addr :required
  )

(define-micro-component popj-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  lam-ir-r 1
  lam-ir-n 1
  )

(define-micro-component popj-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-r 1
  lam-ir-jump-cond lam-jump-cond-m-neq-a
  )

(define-micro-component jump-less-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-less-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-greater-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-greater-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-less-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-less-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-greater-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-greater-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)


(define-micro-component popj-less-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-less-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-greater-than-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-greater-or-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-less-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-less-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-greater-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-greater-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-less-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-less-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-greater-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-greater-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-a-src :required
  lam-ir-m-src :required)


(define-micro-component popj-less-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<a
  lam-ir-n 1
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-less-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m<=a
  lam-ir-n 1
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-greater-than ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>a
  lam-ir-n 1
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-greater-or-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-m>=a
  lam-ir-n 1
  lam-ir-r 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-if-bit-set ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component jump-if-bit-set-xct-next ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component jump-if-bit-clear ()
  lam-ir-op lam-op-jump
  lam-ir-jump-invert-condition 1
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component jump-if-bit-clear-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-invert-condition 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component call-if-bit-set ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-n 1
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component call-if-bit-set-xct-next ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-p 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component call-if-bit-clear ()
  lam-ir-op lam-op-jump
  lam-ir-jump-invert-condition 1
  lam-ir-p 1
  lam-ir-n 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component call-if-bit-clear-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-invert-condition 1
  lam-ir-jump-addr :required
  lam-ir-m-src :required)

(define-micro-component popj-if-bit-set ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-n 1
  lam-ir-r 1
  lam-ir-m-src :required)

(define-micro-component popj-if-bit-set-xct-next ()
  lam-ir-op lam-op-jump
  ;;leave jump-cond 0 to mean "if bit set"
  lam-ir-r 1
  lam-ir-m-src :required)

(define-micro-component popj-if-bit-clear ()
  lam-ir-op lam-op-jump
  lam-ir-jump-invert-condition 1
  lam-ir-r 1
  lam-ir-n 1
  lam-ir-m-src :required)

(define-micro-component popj-if-bit-clear-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-invert-condition 1
  lam-ir-r 1
  lam-ir-m-src :required)

(define-micro-component jump-data-type-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-data-type-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-data-type-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-p 1
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-data-type-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-data-type-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-r 1
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-data-type-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-r 1
  lam-ir-jump-cond lam-jump-cond-data-type-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-data-type-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component jump-data-type-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-data-type-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-p 1
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-data-type-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-data-type-not-equal ()
  lam-ir-op lam-op-jump
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-r 1
  lam-ir-n 1
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component popj-data-type-not-equal-xct-next ()
  lam-ir-op lam-op-jump
  lam-ir-r 1
  lam-ir-jump-cond lam-jump-cond-data-type-not-equal
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component call-if-page-fault-or-interrupt ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-n 1
  lam-ir-jump-cond lam-jump-cond-page-fault-or-interrupt
  lam-ir-jump-addr :required)

(define-micro-component call-if-page-fault ()
  lam-ir-op lam-op-jump
  lam-ir-p 1
  lam-ir-n 1
  lam-ir-jump-cond lam-jump-cond-page-fault
  lam-ir-jump-addr :required)

(define-micro-component jump-no-page-fault-or-interrupt-or-sequence-break ()
  lam-ir-op lam-op-jump
  lam-ir-n 1
  lam-ir-jump-cond LAM-JUMP-COND-PAGE-FAULT-OR-INTERRUPT-OR-SEQUENCE-BREAK
  lam-ir-jump-invert-condition 1
  lam-ir-jump-addr :required)

(define-micro-component jump-page-fault-or-interrupt-or-sequence-break ()
  lam-ir-op lam-op-jump
  lam-ir-n 1
  lam-ir-jump-cond LAM-JUMP-COND-PAGE-FAULT-OR-INTERRUPT-OR-SEQUENCE-BREAK
  lam-ir-jump-addr :required)

(define-micro-component vma ()
  lam-ir-m-src lam-m-src-vma
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component vma (destination)
  lam-ir-func-dest lam-func-dest-vma
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component vma-start-read (destination)
  lam-ir-func-dest lam-func-dest-vma-start-read
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component vma-start-write (destination)
  lam-ir-func-dest lam-func-dest-vma-start-write
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component md ()
  lam-ir-m-src lam-m-src-md
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component md (destination)
  lam-ir-func-dest lam-func-dest-md
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component md-start-read (destination)
  lam-ir-func-dest lam-func-dest-md-start-read
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component md-start-write (destination)
  lam-ir-func-dest lam-func-dest-md-start-write
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component pdl-pop ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-pointer-pop)

(define-micro-component pdl-top ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-pointer)

(define-micro-component pdl-top (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-pointer)

(define-micro-component c-pdl-buffer-pointer ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-pointer)

(define-micro-component pdl-pointer-indirect ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-pointer)

(define-micro-component c-pdl-buffer-pointer (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-pointer)

(define-micro-component pdl-pointer-indirect (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-pointer)

(define-micro-component pdl-push (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-pointer-push)

(define-micro-component c-pdl-buffer-index ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-index)

(define-micro-component pdl-index-indirect ()
  lam-ir-m-src lam-m-src-c-pdl-buffer-index)

(define-micro-component c-pdl-buffer-index (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-index)

(define-micro-component c-pdl-buffer-index-pre-inc (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-index-inc)

(define-micro-component c-pdl-buffer-index-pre-dec (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-index-dec)

(define-micro-component pdl-index-indirect (destination)
  lam-ir-func-dest lam-func-dest-c-pdl-buffer-index)

(define-micro-component pdl-buffer-pointer ()
  lam-ir-m-src lam-m-src-pdl-buffer-pointer)

(define-micro-component pdl-buffer-pointer (destination)
  lam-ir-func-dest lam-func-dest-pdl-buffer-pointer)

(define-micro-component pdl-buffer-index ()
  lam-ir-m-src lam-m-src-pdl-buffer-index)

(define-micro-component pdl-buffer-index (destination)
  lam-ir-func-dest lam-func-dest-pdl-buffer-index)

(define-micro-component pdl-pointer ()
  lam-ir-m-src lam-m-src-pdl-buffer-pointer)

(define-micro-component pdl-pointer (destination)
  lam-ir-func-dest lam-func-dest-pdl-buffer-pointer)

(define-micro-component pdl-index ()
  lam-ir-m-src lam-m-src-pdl-buffer-index)

(define-micro-component pdl-index (destination)
  lam-ir-func-dest lam-func-dest-pdl-buffer-index)

(define-micro-component setz ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-setz)

(define-micro-component and ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-and
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component andca ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-andca
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component setm ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-setm
  lam-ir-m-src :required)

(define-micro-component andcm ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf 4
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component seta ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-seta
  lam-ir-a-src :required)

(define-micro-component xor ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-xor
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component ior ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-ior
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component andcb ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o10
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component eqv ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o11
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component setca ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o12
  lam-ir-a-src :required)

(define-micro-component orca ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o13
  lam-ir-a-src :required)

(define-micro-component setcm ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o14
  lam-ir-m-src :required)

(define-micro-component orcm ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o15
  lam-ir-m-src :required)

(define-micro-component orcb ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf #o16
  lam-ir-a-src :required
  lam-ir-m-src :required)

(define-micro-component seto ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-seto)

(define-micro-component add ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-add
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component add-mask-25 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf  LAM-ALU-ADD-25
  lam-ir-m-src :required
  lam-ir-a-src :required
;  lam-ir-alu-control-5 
  )

(define-micro-component sub ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-sub
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component sub-m+1 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m-a-1
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component m+m ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m+m
  lam-ir-m-src :required)

(define-micro-component m+1 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m+1
  lam-ir-m-src :required)

(define-micro-component m-a-1 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m-a-1
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component m+a+1 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m+a+1
  lam-ir-m-src :required
  lam-ir-a-src :required)

(define-micro-component m+m+1 ()
  lam-ir-op lam-op-alu
  lam-ir-ob lam-ob-alu
  lam-ir-aluf lam-alu-m+m+1
  lam-ir-m-src :required)



(define-micro-component ldb ()
  lam-ir-op lam-op-byte
  lam-ir-byte-func lam-byte-func-ldb
  lam-ir-m-src :required
  lam-byte-spec :required)

(define-micro-component dpb ()
  lam-ir-op lam-op-byte
  lam-ir-byte-func lam-byte-func-dpb
  lam-ir-m-src :required
  lam-byte-spec :required)

(define-micro-component selective-deposit ()
  lam-ir-op lam-op-byte
  lam-ir-byte-func lam-byte-func-selective-deposit
  lam-ir-m-src :required
  lam-byte-spec :required)

(define-micro-component dispatch ()
  lam-ir-op lam-op-dispatch
  lam-ir-dispatch-addr :required
  lam-byte-spec :required)

(define-micro-component dispatch-xct-next ()
  lam-ir-op lam-op-dispatch
  lam-ir-dispatch-addr :required
  lam-byte-spec :required)

(define-micro-component gc-map-test ()
  lam-ir-slow-dest 1)

(define-micro-component clobbers-mem-subr ()
  lam-ir-clobbers-mem-subr-bit :required)
  
(define-micro-component dispatch-write-vma ()
  lam-ir-disp-write-vma 1
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component alu-carry-in-one ()
  lam-ir-carry 1)

(define-micro-component output-selector-rightshift-1 ()
  lam-ir-ob lam-ob-alu-right-1)
  
(define-micro-component output-selector-leftshift-1 ()
  lam-ir-ob lam-ob-alu-left-1)

(define-micro-component shift-alu-right ()
  lam-ir-ob lam-ob-alu-right-1)

(define-micro-component shift-alu-left ()
  lam-ir-ob lam-ob-alu-left-1)

(define-micro-component output-selector-extend-25 ()
  lam-ir-ob lam-ob-alu-extend-25)

(define-micro-component output-selector-bit-mirror ()
  lam-ir-ob lam-ob-alu-mirror)

(define-micro-component output-selector-mask-25 ()
  lam-ir-ob lam-ob-alu
  lam-ir-alu-control-5 1
  )

(define-micro-component output-selector-mask-11 ()
  lam-ir-ob 5
  lam-ir-alu-control-5 1)

(define-micro-component shift-q-left ()
  lam-ir-q lam-q-left)

(define-micro-component shift-q-right ()
  lam-ir-q lam-q-right)

(define-micro-component halt-bit ()
  lam-ir-halt 1)

(define-micro-component i-long ()
  lam-ir-ilong 1)


(define-micro-component i-arg ()
  lam-ir-m-src lam-m-src-disp-const)

(define-micro-component micro-stack-pntr-and-data ()
  lam-ir-m-src lam-m-src-micro-stack)

(define-micro-component q-r ()
  lam-ir-m-src lam-m-src-q)

(define-micro-component q-r (destination)
  lam-ir-q lam-q-load)

(define-micro-component location-counter ()
  lam-ir-m-src lam-m-src-lc)

(define-micro-component location-counter (destination)
  lam-ir-func-dest lam-func-dest-lc)

(define-micro-component micro-stack-pntr-and-data-pop ()
  lam-ir-m-src lam-m-src-micro-stack-pop)

(defun (:property micro-stack-pointer micro-expand) (ignore)
  `(micro-stack-pntr-and-data (byte 8 24.)))

(defun (:property micro-stack-pointer micro-expand) (ignore)
  `(micro-stack-pntr-and-data-pop (byte 8 24.)))

(defun (:property micro-stack-data micro-expand) (ignore)
  `(micro-stack-pntr-and-data (byte 16. 0)))

(defun (:property micro-stack-data-pop micro-expand) (ignore)
  `(micro-stack-pntr-and-data-pop (byte 20. 0)))

(defun (:property micro-stack-pc-data micro-expand) (ignore)
  `(micro-stack-pntr-and-data (byte 16. 0)))

(defun (:property micro-stack-pc-data-pop micro-expand) (ignore)
  `(micro-stack-pntr-and-data-pop (byte 16. 0)))

(define-micro-component interrupt-pointer ()
  lam-ir-m-src lam-m-src-interrupt-pointer)

(define-micro-component macro-ir-displacement ()
  lam-ir-m-src lam-m-src-macro.ir.displacement)

(define-micro-component macro-ir ()
  lam-ir-m-src lam-m-src-macro.ir)

(define-micro-component stat-counter ()
  lam-ir-m-src lam-m-src-stat-counter)

(define-micro-component stat-counter (destination)
  lam-ir-func-dest lam-func-dest-stat-counter)

(define-micro-component stat-counter-aux ()
  lam-ir-m-src lam-m-src-stat-counter-aux)

(define-micro-component stat-counter-aux (destination)
  lam-ir-func-dest lam-func-dest-stat-counter-aux)

(define-micro-component macro-ir-decode ()
  lam-ir-m-src lam-m-src-macro.ir.decode.ram
  lam-ir-ilong 1)

(define-micro-component macro-ir-decode (destination)
  lam-ir-func-dest lam-func-dest-macro.ir.decode.ram
  lam-ir-slow-dest 1)

(define-micro-component spy-reg ()
  lam-ir-m-src lam-m-src-spy-reg)

(define-micro-component l1-map ()
  lam-ir-m-src lam-m-src-l1-map
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component l1-map (destination)
  lam-ir-func-dest lam-func-dest-l1-map
  lam-ir-slow-dest 1
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component l2-map-control ()
  lam-ir-m-src lam-m-src-l2-map-control
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component l2-map-control (destination)
  lam-ir-func-dest lam-func-dest-l2-map-control
  lam-ir-clobbers-mem-subr-bit :required
  lam-ir-slow-dest 1)

(define-micro-component l2-map-physical-page ()
  lam-ir-m-src lam-m-src-l2-map-physical-page
  lam-ir-clobbers-mem-subr-bit :required)

(define-micro-component l2-map-physical-page (destination)
  lam-ir-func-dest lam-func-dest-l2-map-physical-page
  lam-ir-clobbers-mem-subr-bit :required
  lam-ir-slow-dest 1)


(define-micro-component interrupt-clear (destination)
  lam-ir-func-dest lam-func-dest-interrupt-clear)

(define-micro-component rg-mode ()
  lam-ir-m-src lam-m-src-rg-mode)

(define-micro-component rg-mode (destination)
  lam-ir-func-dest lam-func-dest-rg-mode)

(define-micro-component dp-mode ()
  lam-ir-m-src lam-m-src-dp-mode)

(define-micro-component dp-mode (destination)
  lam-ir-func-dest lam-func-dest-dp-mode)

(define-micro-component micro-stack-data-push (destination)
  lam-ir-func-dest lam-func-dest-micro-stack-push)

(define-micro-component oa-reg-low (destination)
  lam-ir-func-dest lam-func-dest-imod-low)

(define-micro-component oa-reg-high (destination)
  lam-ir-func-dest lam-func-dest-imod-high)

(define-micro-component oa-reg-hi (destination)
  lam-ir-func-dest lam-func-dest-imod-high)

(defun (:property q-cdr-code micro-expand) (ignore)
  `((byte 2 30.)))

(defun (:property q-data-type micro-expand) (ignore)
  `((byte 5 25.)))

(defun (:property q-data-type-plus-one-bit micro-expand) (ignore)
  `((byte 6 24.)))

(defun (:property q-pointer micro-expand) (ignore)
  `((byte 25. 0)))

(defun (:property q-immediate micro-expand) (ignore)
  `((byte 25. 0)))

(defun (:property q-typed-pointer micro-expand) (ignore)
  `((byte 30. 0)))

(defun (:property q-all-but-typed-pointer micro-expand) (ignore)
  `((byte 2 30.)))

(defun (:property q-all-but-pointer micro-expand) (ignore)
  `((byte 7 25.)))

(defun (:property q-all-but-cdr-code micro-expand) (ignore)
  `((byte 30. 0)))

(defun (:property sign-bit micro-expand) (ignore)
  `((byte 1 31.)))

(defun (:property boxed-sign-bit micro-expand) (ignore)
  `((byte 1 24.)))

(defun (:property bit-above-boxed-sign-bit micro-expand) (ignore)
  `((byte 1 25.)))

(defun (:property boxed-num-except-sign-bit micro-expand) (ignore)
  `((byte 24. 0)))

(defun (:property positive-setz micro-expand) (ignore)
  `(1_24.))

(defun (:property negative-setz micro-expand) (ignore)
  `(-1_24.))

(defun (:property bits-above-fixnum micro-expand) (ignore)
  `((byte 7 25.)))

(defun (:property oah-a-src micro-expand) (ignore)
  `((byte 12. 7)))

(defun (:property oal-a-dest micro-expand) (ignore)
  `((byte 12. 14.)))

(defun (:property oal-m-dest micro-expand) (ignore)
  `((byte 6 14.)))

(defun (:property oal-aluf micro-expand) (ignore)
  `((byte 4 3)))

(defun (:property oal-jump micro-expand) (ignore)
  `((byte 16. 14.)))

(defun (:property oal-mrot micro-expand) (ignore)
  `((byte 6 0)))

(defun (:property oal-bytl-1 micro-expand) (ignore)
  `((byte 6 6)))

(defun (:property transport micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 1) q-data-type-plus-one-bit))

(defun (:property transport-no-trap micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 21) q-data-type-plus-one-bit))

(defun (:property transport-no-trap-read-write micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 61) q-data-type-plus-one-bit))

(defun (:property transport-cdr micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 32) q-data-type-plus-one-bit))

(defun (:property transport-ivc micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 23) q-data-type-plus-one-bit))

(defun (:property transport-write micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 63) q-data-type-plus-one-bit))

(defun (:property transport-read-write micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 41) q-data-type-plus-one-bit))

(defun (:property transport-header micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 4) q-data-type-plus-one-bit))

(defun (:property transport-ac micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 20) q-data-type-plus-one-bit))

(defun (:property transport-scav micro-expand) (ignore)
  `(d-transport i-not-linked oldspace-meta push-own-address (i-arg 130) q-data-type-plus-one-bit))

(defun (:property transport-no-evcp micro-expand) (ignore)
  `(d-transport-no-evcp i-not-linked oldspace-meta push-own-address (i-arg 20) q-data-type-plus-one-bit))

(defun (:property transport-no-evcp-write micro-expand) (ignore)
  `(d-transport-no-evcp i-not-linked oldspace-meta push-own-address (i-arg 62) q-data-type-plus-one-bit))

(defun (:property transport-no-evcp-read-write micro-expand) (ignore)
  `(d-transport-no-evcp i-not-linked oldspace-meta push-own-address (i-arg 60) q-data-type-plus-one-bit))

(defun (:property transport-no-evcp-for-pdl-reload micro-expand) (ignore)
  `(d-transport-no-evcp i-not-linked oldspace-meta push-own-address (i-arg 30) q-data-type-plus-one-bit))

(defun (:property transport-no-evcp-for-stack-env micro-expand) (ignore)
  `(d-transport-no-evcp i-not-linked oldspace-meta push-own-address (i-arg 0) q-data-type-plus-one-bit))

(define-micro-component i-not-linked ()
  lam-ir-this-instruction-not-linked-to-next 1)

(define-micro-component oldspace-meta ()
  lam-ir-disp-enable-oldspace-meta 1)

(define-micro-component gc-write-test-meta ()
  lam-ir-disp-enable-gc-write-test-meta 1)

(define-micro-component push-own-address ()
  lam-ir-push-own-address 1)


(defun (:property check-page-read micro-macro) (form)
  form
  `((call-if-page-fault-or-interrupt pgf-r-i)))

(defun (:property check-page-write micro-macro) (form)
  form
  `((call-if-page-fault-or-interrupt pgf-w-i)))

(defun (:property check-page-write-unboxed micro-macro) (form)
  form
  `((call-if-page-fault-or-interrupt pgf-w-unboxed)))

(defun (:property check-page-read-no-interrupt micro-macro) (form)
  form
  `((call-if-page-fault pgf-r)))

(defun (:property check-page-write-no-interrupt micro-macro) (form)
  form
  `((call-if-page-fault pgf-w)))

(defun (:property illop-if-page-fault micro-macro) (form)
  form
  `((call-if-page-fault illop)))

(defun (:property gc-write-test micro-macro) (form)
  form
  `((dispatch q-data-type-plus-one-bit gc-write-test-meta md d-gc-write-test gc-map-test i-not-linked)))

(defun (:property gc-write-test-volatility micro-macro) (form)
  form
  `((dispatch gc-map-test q-data-type-plus-one-bit gc-write-test-meta md d-gc-write-test (i-arg 2) i-not-linked)))