xref: /freebsd/sys/amd64/include/asmacros.h (revision 0967373e1c0b42e519f4debc37b2e2a05c785122)
10967373eSDavid Greenman #define ALIGN_DATA	.align	2	/* 4 byte alignment, zero filled */
20967373eSDavid Greenman #define ALIGN_TEXT	.align	2,0x90	/* 4-byte alignment, nop filled */
30967373eSDavid Greenman #define SUPERALIGN_TEXT	.align	4,0x90	/* 16-byte alignment (better for 486), nop filled */
40967373eSDavid Greenman 
50967373eSDavid Greenman #define GEN_ENTRY(name)		ALIGN_TEXT;	.globl name; name:
60967373eSDavid Greenman #define NON_GPROF_ENTRY(name)	GEN_ENTRY(_/**/name)
70967373eSDavid Greenman 
80967373eSDavid Greenman #ifdef GPROF
90967373eSDavid Greenman /*
100967373eSDavid Greenman  * ALTENTRY() must be before a corresponding ENTRY() so that it can jump
110967373eSDavid Greenman  * over the mcounting.
120967373eSDavid Greenman  */
130967373eSDavid Greenman #define ALTENTRY(name)	GEN_ENTRY(_/**/name); MCOUNT; jmp 2f
140967373eSDavid Greenman #define ENTRY(name)	GEN_ENTRY(_/**/name); MCOUNT; 2:
150967373eSDavid Greenman /*
160967373eSDavid Greenman  * The call to mcount supports the usual (bad) conventions.  We allocate
170967373eSDavid Greenman  * some data and pass a pointer to it although the FreeBSD doesn't use
180967373eSDavid Greenman  * the data.  We set up a frame before calling mcount because that is
190967373eSDavid Greenman  * the standard convention although it makes work for both mcount and
200967373eSDavid Greenman  * callers.
210967373eSDavid Greenman  */
220967373eSDavid Greenman #define MCOUNT		.data; ALIGN_DATA; 1:; .long 0; .text; \
230967373eSDavid Greenman 			pushl %ebp; movl %esp,%ebp; \
240967373eSDavid Greenman 			movl $1b,%eax; call mcount; popl %ebp
250967373eSDavid Greenman #else
260967373eSDavid Greenman /*
270967373eSDavid Greenman  * ALTENTRY() has to align because it is before a corresponding ENTRY().
280967373eSDavid Greenman  * ENTRY() has to align to because there may be no ALTENTRY() before it.
290967373eSDavid Greenman  * If there is a previous ALTENTRY() then the alignment code is empty.
300967373eSDavid Greenman  */
310967373eSDavid Greenman #define ALTENTRY(name)	GEN_ENTRY(_/**/name)
320967373eSDavid Greenman #define ENTRY(name)	GEN_ENTRY(_/**/name)
330967373eSDavid Greenman 
340967373eSDavid Greenman #endif
350967373eSDavid Greenman 
360967373eSDavid Greenman #ifdef DUMMY_NOPS			/* this will break some older machines */
370967373eSDavid Greenman #define FASTER_NOP
380967373eSDavid Greenman #define NOP
390967373eSDavid Greenman #else
400967373eSDavid Greenman #define FASTER_NOP	pushl %eax ; inb $0x84,%al ; popl %eax
410967373eSDavid Greenman #define NOP		pushl %eax ; inb $0x84,%al ; inb $0x84,%al ; popl %eax
420967373eSDavid Greenman #endif
430967373eSDavid Greenman 
44