             MACRO
$label       p1arg

             IF FPE_POINTERS
; Arguments are passed as pointers to FPE doubles in r0
$label       vmov.F64 d0,r1,r0
             ELIF {TARGET_FPU_SOFTVFP_VFP}
; Arguments are passed in integer registers r0 and r1
$label       vmov.F64 d0,r0,r1
             ELIF {TARGET_FPU_VFP}
; Arguments are passed in VFP register d0
$label
             ENDIF
             MEND

             MACRO
$label       p2arg

             IF FPE_POINTERS
; Arguments are passed as pointers to FPE doubles in r1
$label       vmov.F64 d1,r3,r2
             ELIF {TARGET_FPU_SOFTVFP_VFP}
; Arguments are passed in integer registers r2 and r3
$label       vmov.F64 d1,r2,r3
             ELIF {TARGET_FPU_VFP}
; Arguments are passed in VFP register d1
$label
             ENDIF
             MEND

             MACRO
             pres

             IF FPE_POINTERS
; Result is returned as a pointer to a double in r0
             vmov.F64 r1,r0,d0
             stmdb r13!,{r0,r1}
             DCD 0xECBD8102
             ELIF {TARGET_FPU_SOFTVFP_VFP}
; Result is returned in integer registers r0 and r1
             vmov.F64 r0,r1,d0
             ELIF {TARGET_FPU_VFP}
; Result is returned in VFP register d0

             ENDIF
             MEND

             MACRO
             pcall

             IF FPE_POINTERS
; Save d0 as pointer to FPE double in r0 
             vmov.F64 r1,r0,d0
             ELIF {TARGET_FPU_SOFTVFP_VFP}
; Save d0 to integer registers r0 and r1
             vmov.F64 r0,r1,d0
             ELIF {TARGET_FPU_VFP}
; Leave d0 alone ready for function call

             ENDIF
             MEND

; The following macro extracts the fraction and exponent. Used by
; various functions like frexp and cbrt, it returns the fraction
; between 0.5 and 1 in $freg and exponent in $exreg.

             MACRO
             getfexp $exreg,$freg

             IF FPE_POINTERS
             mov r3,#&FF
             orr r3,r3,#&700
             and r2,r0,r3,lsl #20
             mov r3,r3,lsr #1
             rsb r2,r3,r2,lsr #20
             orr r0,r0,r3,lsl #20
             bic r0,r0,#&40000000
             bic r0,r0,#&100000
             vmov.F64 $freg,r1,r0
             ELIF {TARGET_FPU_SOFTVFP_VFP}
             mov r3,#&FF
             orr r3,r3,#&700
             and r2,r1,r3,lsl #20
             mov r3,r3,lsr #1
             rsb r2,r3,r2,lsr #20
             orr r1,r1,r3,lsl #20
             bic r1,r1,#&40000000
             bic r1,r1,#&100000
             vmov.F64 $freg,r0,r1
             ELIF {TARGET_FPU_VFP}
             vmov.F64 r0,r1,d0
             mov r3,#&FF
             orr r3,r3,#&700
             and r2,r1,r3,lsl #20
             mov r3,r3,lsr #1
             rsb r2,r3,r2,lsr #20
             orr r1,r1,r3,lsl #20
             bic r1,r1,#&40000000
             bic r1,r1,#&100000
             vmov.F64 $freg,r0,r1
             ENDIF
             add $exreg,r2,#1
             MEND

; The following macro is used by all the various log functions
; to extract the mantissa and base two exponent in $result.
; Similar to getfexp but leaves fraction between 1 and 2 in $freg

             MACRO
             getmexp $exreg,$freg

             IF FPE_POINTERS
             mov r3,#&FF
             orr r3,r3,#&300
             rsb r2,r3,r0,lsr #20
             orr r0,r0,r3,lsl #20
             bic r0,r0,#&40000000
             vmov.F64 $freg,r1,r0
             ELIF {TARGET_FPU_SOFTVFP_VFP}
             mov r3,#&FF
             orr r3,r3,#&300
             rsb r2,r3,r1,lsr #20
             orr r1,r1,r3,lsl #20
             bic r1,r1,#&40000000
             vmov.F64 $freg,r0,r1             
             ELIF {TARGET_FPU_VFP}
             vmov.F64 r0,r1,d0
             mov r3,#&FF
             orr r3,r3,#&300
             rsb r2,r3,r1,lsr #20
             orr r1,r1,r3,lsl #20
             bic r1,r1,#&40000000
             vmov.F64 $freg,r0,r1
             ENDIF
             mov $exreg,r2
             MEND

             END
