From: H.J. Lu Date: Tue, 3 Aug 2004 19:52:52 +0000 (-0700) Subject: re PR target/16570 (missing _mm_malloc and _mm_free functions in xmmintrin.h) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f6bc51cbc49e3a9dd714a5291dcb29e928a6af74;p=gcc.git re PR target/16570 (missing _mm_malloc and _mm_free functions in xmmintrin.h) gcc/ 2004-08-03 H.J. Lu 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 . 2004-08-03 H.J. Lu Tanguy Fautr� * config/i386/pmm_malloc.h: New file. 2004-08-03 Danny Smith * config/i386/gmm_malloc.h: New file. gcc/testsuite/ 2004-08-03 H.J. Lu PR target/16570 * gcc.dg/i386-sse-9.c: New test. From-SVN: r85496 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35d137afe42..9ac4825fce5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2004-08-03 H.J. Lu + + 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 . + +2004-08-03 H.J. Lu + Tanguy Fautrà + + * config/i386/pmm_malloc.h: New file. + +2004-08-03 Danny Smith + + * config/i386/gmm_malloc.h: New file. + 2004-08-03 Dale Johannesen * config/rs6000/rs6000.c (machopic_output_stub): Align Darwin stubs. diff --git a/gcc/config.gcc b/gcc/config.gcc index 472f71327da..d20d3c5c3a1 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -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 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 +#include + +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 index 00000000000..16a808c7d81 --- /dev/null +++ b/gcc/config/i386/pmm_malloc.h @@ -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 + +/* We can't depend on 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 index 00000000000..c37f8a75985 --- /dev/null +++ b/gcc/config/i386/t-gmm_malloc @@ -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 index 00000000000..109009fbfc5 --- /dev/null +++ b/gcc/config/i386/t-pmm_malloc @@ -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 $^ > $@ diff --git a/gcc/config/i386/xmmintrin.h b/gcc/config/i386/xmmintrin.h index 4271f03ab38..ae55c26fb56 100644 --- a/gcc/config/i386/xmmintrin.h +++ b/gcc/config/i386/xmmintrin.h @@ -37,6 +37,9 @@ /* We need type definitions from the MMX header file. */ #include +/* Get _mm_malloc () and _mm_free (). */ +#include + /* The data type intended for user use. */ typedef float __m128 __attribute__ ((vector_size (16))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ccb810df06..85dd35b19fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-08-03 H.J. Lu + + PR target/16570 + * gcc.dg/i386-sse-9.c: New test. + 2004-08-03 Joseph S. Myers * 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 index 00000000000..1fe7adac542 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-sse-9.c @@ -0,0 +1,36 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -msse" } */ +#include +#include +#include +#include + +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); +}