diff options
author | H.J. Lu <hjl@gcc.gnu.org> | 2004-08-03 12:52:52 -0700 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2004-08-03 12:52:52 -0700 |
commit | f6bc51cbc49e3a9dd714a5291dcb29e928a6af74 (patch) | |
tree | 9360d9558cf36d04f4ecdef44f7ff349f4e11160 /gcc/config/i386/gmm_malloc.h | |
parent | ed69811298e1f257486c59df4d62953809a83b18 (diff) | |
download | gcc-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.h | 77 |
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 */ |