summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/asm.h
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1997-03-09 13:57:33 +0000
committerbde <bde@FreeBSD.org>1997-03-09 13:57:33 +0000
commit323777f28dd6fc4f0197ee45869323407aec04de (patch)
treeda333547a38aad77c82955958128a57560bb7f15 /sys/amd64/include/asm.h
parent0df49cb9cfc20544d5a22327db106151826ea246 (diff)
downloadFreeBSD-src-323777f28dd6fc4f0197ee45869323407aec04de.zip
FreeBSD-src-323777f28dd6fc4f0197ee45869323407aec04de.tar.gz
Moved userland assembler macros from <machine/asmacros.h> to
<machine/asm.h>.
Diffstat (limited to 'sys/amd64/include/asm.h')
-rw-r--r--sys/amd64/include/asm.h83
1 files changed, 82 insertions, 1 deletions
diff --git a/sys/amd64/include/asm.h b/sys/amd64/include/asm.h
index 73200b0..d700579 100644
--- a/sys/amd64/include/asm.h
+++ b/sys/amd64/include/asm.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)DEFS.h 5.1 (Berkeley) 4/23/90
- * $Id$
+ * $Id: asm.h,v 1.1 1997/03/09 10:39:15 bde Exp $
*/
#include <sys/cdefs.h>
@@ -118,3 +118,84 @@
#define ALTASENTRY(x) ASENTRY(x)
#endif
+
+/*
+ * This header is currently only used in lib/msun/i387.
+ * Use it to generate code to select between the generic math functions
+ * and the i387 ones.
+ */
+#undef ENTRY
+#define ANAME(x) CNAME(__CONCAT(__i387_,x))
+#define ASELNAME(x) CNAME(__CONCAT(__arch_select_,x))
+#define AVECNAME(x) CNAME(__CONCAT(__arch_,x))
+#define GNAME(x) CNAME(__CONCAT(__generic_,x))
+
+/* Don't bother profiling this. */
+#ifdef PIC
+#define ARCH_DISPATCH(x) \
+ _START_ENTRY; \
+ .globl CNAME(x); .type CNAME(x),@function; CNAME(x): ; \
+ PIC_PROLOGUE; \
+ movl PIC_GOT(AVECNAME(x)),%eax; \
+ PIC_EPILOGUE; \
+ jmpl *(%eax)
+
+#define ARCH_SELECT(x) _START_ENTRY; \
+ .type ASELNAME(x),@function; \
+ ASELNAME(x): \
+ PIC_PROLOGUE; \
+ call PIC_PLT(CNAME(__get_hw_float)); \
+ testl %eax,%eax; \
+ movl PIC_GOT(ANAME(x)),%eax; \
+ jne 8f; \
+ movl PIC_GOT(GNAME(x)),%eax; \
+ 8: \
+ movl PIC_GOT(AVECNAME(x)),%edx; \
+ movl %eax,(%edx); \
+ PIC_EPILOGUE; \
+ jmpl *%eax
+#else /* !PIC */
+#define ARCH_DISPATCH(x) \
+ _START_ENTRY; \
+ .globl CNAME(x); .type CNAME(x),@function; CNAME(x): ; \
+ jmpl *AVECNAME(x)
+
+#define ARCH_SELECT(x) _START_ENTRY; \
+ .type ASELNAME(x),@function; \
+ ASELNAME(x): \
+ call CNAME(__get_hw_float); \
+ testl %eax,%eax; \
+ movl $ANAME(x),%eax; \
+ jne 8f; \
+ movl $GNAME(x),%eax; \
+ 8: \
+ movl %eax,AVECNAME(x); \
+ jmpl *%eax
+#endif /* PIC */
+
+#define ARCH_VECTOR(x) .data; .align 2; \
+ .globl AVECNAME(x); \
+ .type AVECNAME(x),@object; \
+ .size AVECNAME(x),4; \
+ AVECNAME(x): .long ASELNAME(x)
+
+#ifdef PROF
+
+#define ALTENTRY(x) ENTRY(x); jmp 9f
+#define ENTRY(x) ARCH_VECTOR(x); ARCH_SELECT(x); ARCH_DISPATCH(x); \
+ _START_ENTRY; \
+ .globl ANAME(x); .type ANAME(x),@function; ANAME(x):; \
+ call HIDENAME(mcount); 9:
+
+#else /* !PROF */
+
+#define ALTENTRY(x) ENTRY(x)
+#define ENTRY(x) ARCH_VECTOR(x); ARCH_SELECT(x); ARCH_DISPATCH(x); \
+ _START_ENTRY; \
+ .globl ANAME(x); .type ANAME(x),@function; ANAME(x):
+
+#endif /* PROF */
+
+#ifndef RCSID
+#define RCSID(a)
+#endif
OpenPOWER on IntegriCloud