
	.macro stack_entry
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
#ifdef __HAS_MOVWT
	movw r6, 0x111
#else
	ldr  r6, =0x111
#endif /* __HAS_MOVWT */
	str r6, [r5], 4
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro block_entry
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
	sub r6, pc, 7
	str r6, [r5], 4
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro stack_exit
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
#ifdef __HAS_MOVWT
	movw r6, 0x112
#else
	ldr  r6, =0x112
#endif /* __HAS_MOVWT */
	str r6, [r5], 4
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro explicit_stack_depth_clobber
#if defined(__GHS_DTRACE_INSTRUMENTATION)
	.dtinst
#ifdef __HAS_MOVWT
	movw r6, 0x113
#else
	ldr  r6, =0x113
#endif /* __HAS_MOVWT */
	str r6, [r5], 4
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm
	
	.macro preimage_8	reg, offset
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
	add 	r6, reg, offset
	str	r6, [r5]
	ldrb	r6, [reg,offset]
	str	r6, [r5, 4]
	add	r5, r5, 8
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro preimage_16	reg, offset
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
	add	r6, reg, offset
	str	r6, [r5]
	ldrh	r6, [reg, offset]
#ifdef __HAS_MOVWT
	movt	r6, 0xffff
#else
	orr	r6, r6, 0xff0000
	orr	r6, r6, 0xff000000
#endif /* __HAS_MOVWT */
	str	r6, [r5,4]
	add	r5, r5, 8
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro preimage_32	reg, offset
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
	.dtinst
	ldr	r6, [reg, offset]
	str	r6, [r5]
	add	r6, reg, offset
	str	r6, [r5,4]
	add	r5, r5, 8
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

	.macro dtrace_stamp file
#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
..bdt. >< file ::
#endif
	.endm

#if defined(__GHS_DTRACE_INSTRUMENTATION) && !defined(__GHS_ASM_DTINST)
    .macro retcond cond
    .macrolocal lab1
    .macrolocal lab2
    b><cond lab1
    b       lab2
lab1:
    block_entry
    stack_exit
    bx lr
lab2:
    block_entry
    .endm
#define reteq	retcond		eq
#define retne	retcond		ne
#define retmi	retcond		mi
#define retpl	retcond		pl
#define rethi	retcond		hi
#define reths	retcond		hs
#define retlo	retcond		lo
#define retls	retcond		ls
#define retcs	retcond		cs
#define retcc	retcond		cc
#define retgt	retcond		gt
#define retge	retcond		ge
#define retlt	retcond		lt
#define retle	retcond		le

@ This is a hack - we use beq __division_by_zero to tailcall to this routine.
@ I changed these occurrences to beqtail __division_by_zero.
@ If the routine does not exist, we rely on the linker to convert this into
@ bxeq lr if __division_by_zero does not exist.  Here for this temporary
@ hack, we don't care about __division_by_zero, and we just return.  The @
@ at the end of the line hacks around the __division_by_zero argument that
@ would otherwise be left hanging.
#define beqtail retcond		eq	@

#else
#define beqtail	beq
#endif /* __GHS_DTRACE_INSTRUMENTATION */

@
@  EXPLICIT DTRACE INSTRUMENTATION MACROS
@

	@ We just performed a volatile load into "reg" as the destination.
	@ Dtrace instrument this load
	.macro logvld reg
#if defined(__GHS_DTRACE_INSTRUMENTATION)
	.dtinst
	str	reg, [r5], 4
#ifdef __HAS_MOVWT
	movw	r6, 0x160
#else
	ldr	r6, =0x160
#endif /* __HAS_MOVWT */
	str	r6, [r5], 4
	.nodtinst
#endif /* __GHS_DTRACE_INSTRUMENTATION */
	.endm

@
@  DTRACE UTILITY INSTRUMENTATION MACROS
@

     @ This macro checks that we are not in dtrace mode
    .macro check_not_dtrace
#if defined(__GHS_DTRACE_INSTRUMENTATION)
    .error "We should not be in dtrace mode here"
#endif /* __GHS_DTRACE_INSTRUMENTATION */
    .endm

    @ This macro checks that we are in dtrace mode
    .macro check_dtrace
#if !defined(__GHS_DTRACE_INSTRUMENTATION)
    .error "We should be in dtrace mode here"
#endif
    .endm

    @ This macro goes into an infinite loop in dtrace mode.  It is used
    @ for a couple of routines that we should not be calling because they
    @ violate the dtrace ABI.  However for convenience, we allow these
    @ places to be built into the libraries.
    .macro spin_if_dtrace
#if defined(__GHS_DTRACE_INSTRUMENTATION)
    b .		@ jump to self
#endif
    .endm
