diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 423fe711fbe7a3b1b4326862b39f9e28e10758c9..1ef0f9aba9510624fb7e36dc0c3a1c7cd4895eb7 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,8 @@
+1999-06-17  Anthony Green  <green@cygnus.com>
+
+	* mach_dep.c (GC_push_regs): FreeBSD-elf support (from
+	Carlo Dapor <carlo@vis.ethz.ch>).
+
 1999-05-05  Gilles Zunino  <Gilles.Zunino@hei.fr>
 
 	* configure.in: Switch from irix threads to posix threads
diff --git a/boehm-gc/mach_dep.c b/boehm-gc/mach_dep.c
index e6087d94684458263aa8dc7bbf48d3b78bde8d97..09a79883fdf9f3ec4592189e26252d04bcb2c954 100644
--- a/boehm-gc/mach_dep.c
+++ b/boehm-gc/mach_dep.c
@@ -170,7 +170,7 @@ void GC_push_regs()
 
 #       if defined(I386) &&!defined(OS2) &&!defined(SVR4) &&!defined(MSWIN32) \
 	&& !defined(SCO) && !defined(SCO_ELF) && !(defined(LINUX) \
-	&& defined(__ELF__)) && !defined(DOS4GW)
+	&& defined(__ELF__)) && !defined(DOS4GW) && !defined(FREEBSD)
 	/* I386 code, generic code does not appear to work */
 	/* It does appear to work under OS2, and asms dont */
 	/* This is used for some 38g UNIX variants and for CYGWIN32 */
@@ -183,8 +183,8 @@ void GC_push_regs()
 	  asm("pushl %ebx");  asm("call _GC_push_one"); asm("addl $4,%esp");
 #       endif
 
-#	if defined(I386) && defined(LINUX) && defined(__ELF__)
-	/* This is modified for Linux with ELF (Note: _ELF_ only) */
+#	if defined(I386) && (defined(LINUX) || defined(FREEBSD)) && defined(__ELF__)
+	/* This is modified for Linux/FreeBSD with ELF (Note: _ELF_ only) */
 	  asm("pushl %eax");  asm("call GC_push_one"); asm("addl $4,%esp");
 	  asm("pushl %ecx");  asm("call GC_push_one"); asm("addl $4,%esp");
 	  asm("pushl %edx");  asm("call GC_push_one"); asm("addl $4,%esp");