summaryrefslogtreecommitdiff
path: root/gcc/config/i386/gmm_malloc.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl@gcc.gnu.org>2004-08-03 12:52:52 -0700
committerH.J. Lu <hjl@gcc.gnu.org>2004-08-03 12:52:52 -0700
commitf6bc51cbc49e3a9dd714a5291dcb29e928a6af74 (patch)
tree9360d9558cf36d04f4ecdef44f7ff349f4e11160 /gcc/config/i386/gmm_malloc.h
parented69811298e1f257486c59df4d62953809a83b18 (diff)
downloadgcc-f6bc51cbc49e3a9dd714a5291dcb29e928a6af74.tar.gz
re PR target/16570 (missing _mm_malloc and _mm_free functions in xmmintrin.h)
gcc/ 2004-08-03 H.J. Lu <hongjiu.lu@intel.com> PR target/16570 * config.gcc (i[34567]86-*-* | x86_64-*-*): Add i386/t-gmm_malloc to tmake_file. (i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1): Likewise. (i[34567]86-*-linux* | x86_64-*-linux*): Add i386/t-pmm_malloc to tmake_file. * config/i386/t-gmm_malloc: New file. * config/i386/t-pmm_malloc: Likewise. * config/i386/xmmintrin.h: Include <mm_malloc.h>. 2004-08-03 H.J. Lu <hongjiu.lu@intel.com> Tanguy Fautr� <tfautre@pandora.be> * config/i386/pmm_malloc.h: New file. 2004-08-03 Danny Smith <dannysmith@users.sourceforge.net> * config/i386/gmm_malloc.h: New file. gcc/testsuite/ 2004-08-03 H.J. Lu <hongjiu.lu@intel.com> PR target/16570 * gcc.dg/i386-sse-9.c: New test. From-SVN: r85496
Diffstat (limited to 'gcc/config/i386/gmm_malloc.h')
-rw-r--r--gcc/config/i386/gmm_malloc.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/gcc/config/i386/gmm_malloc.h b/gcc/config/i386/gmm_malloc.h
new file mode 100644
index 00000000000..c2454cdbfb2
--- /dev/null
+++ b/gcc/config/i386/gmm_malloc.h
@@ -0,0 +1,77 @@
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING. If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, if you include this header file into source
+ files compiled by GCC, this header file does not by itself cause
+ the resulting executable to be covered by the GNU General Public
+ License. This exception does not however invalidate any other
+ reasons why the executable file might be covered by the GNU General
+ Public License. */
+
+#ifndef _MM_MALLOC_H_INCLUDED
+#define _MM_MALLOC_H_INCLUDED
+
+#include <stdlib.h>
+#include <errno.h>
+
+static __inline__ void*
+_mm_malloc (size_t size, size_t align)
+{
+ void * malloc_ptr;
+ void * aligned_ptr;
+
+ /* Error if align is not a power of two. */
+ if (align & (align - 1))
+ {
+ errno = EINVAL;
+ return ((void*) 0);
+ }
+
+ if (size == 0)
+ return ((void *) 0);
+
+ /* Assume malloc'd pointer is aligned at least to sizeof (void*).
+ If necesary, add another sizeof (void*) to store the value
+ returned by malloc. Effectively this enforces a minimum alignment
+ of sizeof double. */
+ if (align < 2 * sizeof (void *))
+ align = 2 * sizeof (void *);
+
+ malloc_ptr = malloc (size + align);
+ if (!malloc_ptr)
+ return ((void *) 0);
+
+ /* Align We have at least sizeof (void *) space below malloc'd ptr. */
+ aligned_ptr = (void *) (((size_t) malloc_ptr + align)
+ & ~((size_t) (align) - 1));
+
+ /* Store the original pointer just before p. */
+ ((void **) aligned_ptr) [-1] = malloc_ptr;
+
+ return aligned_ptr;
+}
+
+static __inline__ void
+_mm_free (void * aligned_ptr)
+{
+ if (aligned_ptr)
+ free (((void **) aligned_ptr) [-1]);
+}
+
+#endif /* _MM_MALLOC_H_INCLUDED */