Update comments to start_step_over
[external/binutils.git] / cpu / or1korbis.cpu
index 73c9ab2..408a135 100644 (file)
 (dnh h-uimm16      "16-bit unsigned immediate" ()                   (immediate (UINT 16)) () () ())
 (dnh h-uimm6       "6-bit unsigned immediate"  ()                   (immediate (UINT 6)) () () ())
 
+; Hardware for the (internal) atomic registers
+(dsh h-atomic-reserve "atomic reserve flag" () (register BI))
+(dsh h-atomic-address "atomic reserve address" () (register SI))
+
 ; Instruction classes.
 (dnf f-opcode      "insn opcode"               ((MACH ORBIS-MACHS)) 31 6)
 
@@ -48,6 +52,7 @@
 (dnf f-resv-25-10  "resv-25-10"                ((MACH ORBIS-MACHS) RESERVED) 25 10)
 (dnf f-resv-25-5   "resv-25-5"                 ((MACH ORBIS-MACHS) RESERVED) 25 5)
 (dnf f-resv-23-8   "resv-23-8"                 ((MACH ORBIS-MACHS) RESERVED) 23 8)
+(dnf f-resv-20-21  "resv-20-21"                ((MACH ORBIS-MACHS) RESERVED) 20 21)
 (dnf f-resv-20-5   "resv-20-5"                 ((MACH ORBIS-MACHS) RESERVED) 20 5)
 (dnf f-resv-20-4   "resv-20-4"                 ((MACH ORBIS-MACHS) RESERVED) 20 4)
 (dnf f-resv-15-8   "resv-15-8"                 ((MACH ORBIS-MACHS) RESERVED) 15 8)
    ("JR"           #x11)
    ("JALR"         #x12)
    ("MACI"         #x13)
+   ("LWA"          #x1b)
    ("CUST1"        #x1c)
    ("CUST2"        #x1d)
    ("CUST3"        #x1e)
    ("MTSPR"        #x30)
    ("MAC"          #x31)
    ("FLOAT"        #x32)
+   ("SWA"          #x33)
    ("SD"           #x34)
    ("SW"           #x35)
    ("SB"           #x36)
 (dnop mac-machi         "MAC HI result register"           ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-machi         f-nil)
 (dnop mac-maclo         "MAC LO result register"           ((MACH ORBIS-MACHS) SEM-ONLY) h-mac-maclo         f-nil)
 
+(dnop atomic-reserve    "atomic reserve flag"              ((MACH ORBIS-MACHS) SEM-ONLY) h-atomic-reserve    f-nil)
+(dnop atomic-address    "atomic address"                   ((MACH ORBIS-MACHS) SEM-ONLY) h-atomic-address    f-nil)
+
 (dnop uimm6             "uimm6"                            ((MACH ORBIS-MACHS))          h-uimm6             f-uimm6)
 
 (dnop rD                "destination register"             ((MACH ORBIS-MACHS))          h-gpr               f-r1)
      ()
 )
 
+(dni l-msync "memory sync"
+     ((MACH ORBIS-MACHS))
+     "l.msync"
+     (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_MSYNC (f-resv-20-21 0))
+     (nop)
+     ()
+)
+
+(dni l-psync "pipeline sync"
+     ((MACH ORBIS-MACHS))
+     "l.psync"
+     (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_PSYNC (f-resv-20-21 0))
+     (nop)
+     ()
+)
+
+(dni l-csync "context sync"
+     ((MACH ORBIS-MACHS))
+     "l.csync"
+     (+ OPC_SYSTRAPSYNCS OPC_SYSTRAPSYNCS_CSYNC (f-resv-20-21 0))
+     (nop)
+     ()
+)
 
 (dni l-rfe "return from exception"
      ; This function may not be in delay slot
      ()
 )
 
+(dni l-lwa "l.lwa reg/simm16(reg)"
+     ((MACH ORBIS-MACHS))
+     "l.lwa $rD,${simm16}($rA)"
+     (+ OPC_LWA rD rA simm16)
+     (sequence ()
+               (set UWI rD (zext UWI (mem USI (load-store-addr rA simm16 4))))
+               (set atomic-reserve (const 1))
+               (set atomic-address (load-store-addr rA simm16 4))
+               )
+     ()
+)
+
 (dni l-lbz "l.lbz reg/simm16(reg)"
      ((MACH ORBIS-MACHS))
      "l.lbz $rD,${simm16}($rA)"
      ()
 )
 
-(dni l-lbs "l.lbz reg/simm16(reg)"
+(dni l-lbs "l.lbs reg/simm16(reg)"
      ((MACH ORBIS-MACHS))
      "l.lbs $rD,${simm16}($rA)"
      (+ OPC_LBS rD rA simm16)
           (.str "l." mnemonic " simm16(reg)/reg")
           ((MACH ORBIS-MACHS))
           (.str "l." mnemonic " ${simm16-split}($rA),$rB")
-          (+ opc-op rB rD simm16-split)
-          (set mode (mem mode (load-store-addr rA simm16-split size)) (trunc mode rB))
+          (+ opc-op rA rB simm16-split)
+          (sequence ((SI addr))
+                   (set addr (load-store-addr rA simm16-split size))
+                   (set mode (mem mode addr) (trunc mode rB))
+                   (if (eq (and addr #xffffffc) atomic-address)
+                       (set atomic-reserve (const 0))
+                       )
+                    )
           ()
      )
    )
 (store-insn sb OPC_SB UQI 1)
 (store-insn sh OPC_SH UHI 2)
 
+(dni l-swa "l.swa simm16(reg)/reg"
+     ((MACH ORBIS-MACHS))
+     "l.swa ${simm16-split}($rA),$rB"
+     (+ OPC_SWA rA rB simm16)
+     (sequence ((SI addr) (BI flag))
+              (set addr (load-store-addr rA simm16-split 4))
+              (set sys-sr-f (and atomic-reserve (eq addr atomic-address)))
+              (if sys-sr-f
+                  (set USI (mem USI addr) (trunc USI rB))
+                  )
+              (set atomic-reserve (const 0))
+              )
+     ()
+)
 
 \f
 ; Shift and rotate instructions