re PR target/16570 (missing _mm_malloc and _mm_free functions in xmmintrin.h)
authorH.J. Lu <hjl@gcc.gnu.org>
Tue, 3 Aug 2004 19:52:52 +0000 (12:52 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 3 Aug 2004 19:52:52 +0000 (12:52 -0700)
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

gcc/ChangeLog
gcc/config.gcc
gcc/config/i386/gmm_malloc.h [new file with mode: 0644]
gcc/config/i386/pmm_malloc.h [new file with mode: 0644]
gcc/config/i386/t-gmm_malloc [new file with mode: 0644]
gcc/config/i386/t-pmm_malloc [new file with mode: 0644]
gcc/config/i386/xmmintrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/i386-sse-9.c [new file with mode: 0644]

index 35d137a..9ac4825 100644 (file)
@@ -1,3 +1,26 @@
+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.
+
 2004-08-03  Dale Johannesen  <dalej@apple.com>
 
        * config/rs6000/rs6000.c (machopic_output_stub):  Align Darwin stubs.
index 472f713..d20d3c5 100644 (file)
@@ -2122,6 +2122,18 @@ am33_2.0-*-linux*)
        ;;
 esac
 
+case ${target} in
+i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1)
+       tmake_file="${tmake_file} i386/t-gmm_malloc"
+       ;;
+i[34567]86-*-linux* | x86_64-*-linux*)
+       tmake_file="${tmake_file} i386/t-pmm_malloc"
+       ;;
+i[34567]86-*-* | x86_64-*-*)
+       tmake_file="${tmake_file} i386/t-gmm_malloc"
+       ;;
+esac
+
 # Support for --with-cpu and related options (and a few unrelated options,
 # too).
 case ${with_cpu} in
diff --git a/gcc/config/i386/gmm_malloc.h b/gcc/config/i386/gmm_malloc.h
new file mode 100644 (file)
index 0000000..c2454cd
--- /dev/null
@@ -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 */
diff --git a/gcc/config/i386/pmm_malloc.h b/gcc/config/i386/pmm_malloc.h
new file mode 100644 (file)
index 0000000..16a808c
--- /dev/null
@@ -0,0 +1,56 @@
+/* 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>
+
+/* We can't depend on <stdlib.h> since the prototype of posix_memalign
+   may not be visible.  */
+extern int posix_memalign (void **, size_t, size_t);
+
+static __inline void *
+_mm_malloc (size_t size, size_t alignment)
+{
+  void *ptr;
+  if (alignment == 1)
+    return malloc (size);
+  if (alignment == 2 || (sizeof (void *) == 8 && alignment == 4))
+    alignment = sizeof (void *);
+  if (posix_memalign (&ptr, alignment, size) == 0)
+    return ptr;
+  else
+    return NULL;
+}
+
+static __inline void
+_mm_free (void * ptr)
+{
+  free (ptr);
+}
+
+#endif /* _MM_MALLOC_H_INCLUDED */
diff --git a/gcc/config/i386/t-gmm_malloc b/gcc/config/i386/t-gmm_malloc
new file mode 100644 (file)
index 0000000..c37f8a7
--- /dev/null
@@ -0,0 +1,6 @@
+# Install gmm_malloc.h as mm_malloc.h.
+
+EXTRA_HEADERS += mm_malloc.h
+mm_malloc.h: $(srcdir)/config/i386/gmm_malloc.h
+       rm -f $@
+       cat $^ > $@
diff --git a/gcc/config/i386/t-pmm_malloc b/gcc/config/i386/t-pmm_malloc
new file mode 100644 (file)
index 0000000..109009f
--- /dev/null
@@ -0,0 +1,6 @@
+# Install pmm_malloc.h as mm_malloc.h.
+
+EXTRA_HEADERS += mm_malloc.h
+mm_malloc.h: $(srcdir)/config/i386/pmm_malloc.h
+       rm -f $@
+       cat $^ > $@
index 4271f03..ae55c26 100644 (file)
@@ -37,6 +37,9 @@
 /* We need type definitions from the MMX header file.  */
 #include <mmintrin.h>
 
+/* Get _mm_malloc () and _mm_free ().  */
+#include <mm_malloc.h>
+
 /* The data type intended for user use.  */
 typedef float __m128 __attribute__ ((vector_size (16)));
 
index 1ccb810..85dd35b 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/16570
+       * gcc.dg/i386-sse-9.c: New test.
+
 2004-08-03  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * gcc.dg/array-7.c, gcc.dg/c99-tag-2.c: New tests.
diff --git a/gcc/testsuite/gcc.dg/i386-sse-9.c b/gcc/testsuite/gcc.dg/i386-sse-9.c
new file mode 100644 (file)
index 0000000..1fe7ada
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -msse" } */
+#include <xmmintrin.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+int
+main()
+{
+  int alignment, n;
+  void *ptr;
+  int errors = 0;
+  const char test [] = "This is a test.";
+
+  for (alignment = 1; alignment <= (1 << 20); alignment += alignment)
+    {
+      ptr = _mm_malloc (alignment, alignment);
+      if (((ptrdiff_t) ptr) & (alignment - 1))
+       abort ();
+      if (ptr)
+       {
+         n = alignment > sizeof test ? sizeof test : alignment;
+         memcpy (ptr, test, n);
+         if (memcmp (ptr, test, n) != 0)
+           errors++;
+         _mm_free (ptr);
+       }
+      else
+       errors++;
+    }
+   
+  if (errors != 0)
+    abort ();
+  exit (0);
+}