text: /* macros to align and unalign the stack on 8 byte boundary for ABI compliance */
  .macro stack_align, tempreg
      /* make sure the stack is aligned */
      mov     \tempreg, sp
      tst     sp, #4
      subeq   sp, #4
      push    { \tempreg }
  
      /* tempreg holds the original stack */
  .endm
  
  .macro stack_restore, tempreg
      /* restore the potentially unaligned stack */
      pop     { \tempreg }
      mov     sp, \tempreg
  .endm
  
  /* save and disable the vfp unit */
  .macro vfp_save, temp1
      /* save old fpexc */
      vmrs    \temp1, fpexc
  
      push    { \temp1 }
  
      /* hard disable the vfp unit */
      bic     \temp1, #(1<<30)
      vmsr    fpexc, \temp1
  .endm
  
  /* restore the vfp enable/disable state */
  .macro vfp_restore, temp1
      /* restore fpexc */
      pop     { \temp1 }
  
      vmsr    fpexc, \temp1
  .endm
  
  /* Save callee trashed registers.
   * At exit r0 contains a pointer to the register frame.
   */
  .macro save
      /* save spsr and r14 onto the svc stack */
      srsdb   #0x13!
  
      /* switch to svc mode, interrupts disabled */
      cpsid   i, #0x13
  
      /* save callee trashed regs and lr */
      push    { r0-r3, r12, lr }
  
  #if 0
      #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
      /* save and disable the vfp unit */
      vfp_save    r0
      #endif
  #endif
  
      /* make sure the stack is 8 byte aligned */
      stack_align r0
  
      /* r0 now holds the pointer to the original iframe (before alignment) */
  .endm
  
  .macro save_offset, offset
      sub     lr, \offset
      save
  .endm
  
  .macro restore
      /* undo the stack alignment we did before */
      stack_restore r0
  
  #if 0
      #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
      /* restore the old state of the vfp unit */
      vfp_restore r0
      #endif
  #endif
  
      pop     { r0-r3, r12, lr }
  
      /* return to whence we came from */
      rfeia   sp!
  .endm
  
  /* Save all registers.
   * At exit r0 contains a pointer to the register frame.
   */
  .macro saveall
      /* save spsr and r14 onto the svc stack */
      srsdb   #0x13!
  
      /* switch to svc mode, interrupts disabled */
      cpsid   i,#0x13
  
      /* save all regs */
      push    { r0-r12, lr }
  
      #if 0
      #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
      /* save and disable the vfp unit */
      vfp_save    r0
      #endif
      #endif
  
      /* make sure the stack is 8 byte aligned */
      stack_align r0
  
      /* r0 now holds the pointer to the original iframe (before alignment) */
  .endm
  
  .macro saveall_offset, offset
      sub     lr, \offset
      saveall
  .endm
  
  .macro restoreall
      /* undo the stack alignment we did before */
      stack_restore r0
  
      #if 0
      #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
      /* restore the old state of the vfp unit */
      vfp_restore r0
      #endif
      #endif
  
      pop     { r0-r12, r14 }
  
      /* return to whence we came from */
      rfeia   sp!
  .endm
  
  