; *************************************
; BSR : Branch to subroutine saving R14 (around it)
; *************************************
        MACRO
$label  BSR     $dest
$label  PushLR
        BL      $dest
        PullLR
        MEND


; **************************************
; Pull : Pull registers given in reglist (use hat with care!)
; **************************************
        MACRO
$label  Pull    $reglist, $cond, $hat
$label  LDM$cond.FD R13!, {$reglist}$hat
        MEND


; **************************************
; Push : Push registers given in reglist
; **************************************
        MACRO
$label  Push   $reglist, $cond
$label  STM$cond.FD R13!, {$reglist}
        MEND


; ****************
; PushLR : Push LR (optimised for one register)
; ****************
        MACRO
$label  PushLR    $cond
$label  STR$cond. R14, [R13, #-4]!
        MEND


; ****************
; PullLR : Pull LR (optimised for one register)
; ****************
        MACRO
$label  PullLR    $cond
$label  LDR$cond. R14, [R13], #4
        MEND

; **************************
; Ret : Return from function
; **************************
        MACRO
$label  Ret     $cond
$label  MOV$cond PC, R14
        MEND


; *******************************************
; Return : Return from function (same as Ret)
; *******************************************
        MACRO
$label  Return $cond
$label  MOV$cond PC, R14
        MEND


; ****************************
; PullRet : Pull LR and Return (optimised for one register)
; ****************************
;   This is equivalent to:
;     PullLR
;     Return
;   but saves an instruction as we load PC directly.
;
        MACRO
$label  PullRet    $cond
$label  LDR$cond. PC, [R13], #4
        MEND


; ************************  ===============
; SETV : Set oVerflow flag (on 26 or 32 bit)
; ************************  ===============
        MACRO
$label  SetV     ; DOES NOT TAKE A CONDITION
$label  CMP      R0, #1<<31
        CMNVC    R0, #1<<31
        MEND

        END
