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


; Push : Push registers given in reglist
        MACRO
$label  Push   $reglist, $cond
$label  STM$cond.FD R13!, {$reglist}
        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


; 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 (optim. for one reg)
;   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
