From 561866edc1ae53c842df6c6338336e7d4cc4fe1b Mon Sep 17 00:00:00 2001 From: hjl Date: Tue, 3 Aug 2004 19:52:52 +0000 Subject: [PATCH] gcc/ MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@85496 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 23 ++++++++++++ gcc/config.gcc | 12 ++++++ gcc/config/i386/gmm_malloc.h | 77 +++++++++++++++++++++++++++++++++++++++ gcc/config/i386/pmm_malloc.h | 56 ++++++++++++++++++++++++++++ gcc/config/i386/t-gmm_malloc | 6 +++ gcc/config/i386/t-pmm_malloc | 6 +++ gcc/config/i386/xmmintrin.h | 3 ++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/i386-sse-9.c | 36 ++++++++++++++++++ 9 files changed, 224 insertions(+) create mode 100644 gcc/config/i386/gmm_malloc.h create mode 100644 gcc/config/i386/pmm_malloc.h create mode 100644 gcc/config/i386/t-gmm_malloc create mode 100644 gcc/config/i386/t-pmm_malloc create mode 100644 gcc/testsuite/gcc.dg/i386-sse-9.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35d137a..9ac4825 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 472f713..d20d3c5 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 0000000..c2454cd --- /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 0000000..16a808c --- /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 0000000..c37f8a7 --- /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 0000000..109009f --- /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 4271f03..ae55c26 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 1ccb810..85dd35b 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 0000000..1fe7ada --- /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); +} -- 2.7.4