Macros 3.31 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
; 
; 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
51
      [ "$fpreg" = "FPSID"
52
        MRC$cond p10,7,$reg,c0,c0,0
53
      ELIF "$fpreg" = "FPSCR"
54
        MRC$cond p10,7,$reg,c1,c0,0
55 56 57
      ELIF "$fpreg" = "MVFR2"
        MRC$cond p10,7,$reg,c5,c0,0
      ELIF "$fpreg" = "MVFR1"
58
        MRC$cond p10,7,$reg,c6,c0,0
59
      ELIF "$fpreg" = "MVFR0"
60
        MRC$cond p10,7,$reg,c7,c0,0
61
      ELIF "$fpreg" = "FPEXC"
62
        MRC$cond p10,7,$reg,c8,c0,0
63
      ELIF "$fpreg" = "FPINST"
64 65 66 67 68 69 70 71 72 73
        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
74
      [ "$fpreg" = "FPSID"
75
        MCR$cond p10,7,$reg,c0,c0,0
76
      ELIF "$fpreg" = "FPSCR"
77
        MCR$cond p10,7,$reg,c1,c0,0
78
      ELIF "$fpreg" = "FPEXC"
79
        MCR$cond p10,7,$reg,c8,c0,0
80
      ELIF "$fpreg" = "FPINST"
81 82 83 84 85 86 87 88 89
        MCR$cond p10,7,$reg,c9,c0,0
      |
        ASSERT "$fpreg" = "FPINST2"
        MCR$cond p10,7,$reg,c10,c0,0
      ]
        MEND


        END