; 
; Copyright�(c)�2010, RISC OS Open Ltd
; All�rights�reserved.
; 
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met: 
;     * Redistributions of source code must retain the above copyright
;       notice, this list of conditions and the following disclaimer.
;     * Redistributions in binary form must reproduce the above copyright
;       notice, this list of conditions and the following disclaimer in the
;       documentation and/or other materials provided with the distribution.
;     * Neither the name of RISC OS Open Ltd nor the names of its contributors
;       may be used to endorse or promote products derived from this software
;       without specific prior written permission.
; 
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
; POSSIBILITY OF SUCH DAMAGE.
; 

; Macros to make up for the fact that objasm doesn't support the required instructions yet

; Instruction Synchronisation Barrier - required on ARMv6+ to ensure the effects of the following are visible to following instructions:
; * Completed cache, TLB & branch predictor maintenance operations
; * CP14/CP15 writes
; This version will only work on ARMv6+!
        MACRO
        myISB $cond,$temp
       [ NoARMv7
        ; ARMv6 support required, use legacy MCR op
        MOV$cond $temp,#0
        MCR$cond p15,0,$temp,c7,c5,4
       |
        ; ARMv7+, use ISB instruction (saves on temp register, but instruction is unconditional)
        ; Shouldn't hurt too much if we just ignore the condition code
        DCI &F57FF06F ; ISB SY
       ]
        MEND

; VMRS
        MACRO
        myVMRS $cond,$reg,$fpreg
 [ "$fpreg" = "FPSID"
        MRC$cond p10,7,$reg,c0,c0,0
 |
  [ "$fpreg" = "FPSCR"
        MRC$cond p10,7,$reg,c1,c0,0
  |
   [ "$fpreg" = "MVFR1"
        MRC$cond p10,7,$reg,c6,c0,0
   |
    [ "$fpreg" = "MVFR0"
        MRC$cond p10,7,$reg,c7,c0,0
    |
     [ "$fpreg" = "FPEXC"
        MRC$cond p10,7,$reg,c8,c0,0
     |
      [ "$fpreg" = "FPINST"
        MRC$cond p10,7,$reg,c9,c0,0
      |
        ASSERT "$fpreg" = "FPINST2"
        MRC$cond p10,7,$reg,c10,c0,0
      ]
     ]
    ]
   ]
  ]
 ]
        MEND

; VMSR
        MACRO
        myVMSR $cond,$fpreg,$reg
   [ "$fpreg" = "FPSID"
        MCR$cond p10,7,$reg,c0,c0,0
   |
    [ "$fpreg" = "FPSCR"
        MCR$cond p10,7,$reg,c1,c0,0
    |
     [ "$fpreg" = "FPEXC"
        MCR$cond p10,7,$reg,c8,c0,0
     |
      [ "$fpreg" = "FPINST"
        MCR$cond p10,7,$reg,c9,c0,0
      |
        ASSERT "$fpreg" = "FPINST2"
        MCR$cond p10,7,$reg,c10,c0,0
      ]
     ]
    ]
   ]
        MEND


        END