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
This commit is contained in:
parent
ed69811298
commit
f6bc51cbc4
@ -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.
|
||||
|
@ -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
|
||||
|
77
gcc/config/i386/gmm_malloc.h
Normal file
77
gcc/config/i386/gmm_malloc.h
Normal file
@ -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 */
|
56
gcc/config/i386/pmm_malloc.h
Normal file
56
gcc/config/i386/pmm_malloc.h
Normal file
@ -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 */
|
6
gcc/config/i386/t-gmm_malloc
Normal file
6
gcc/config/i386/t-gmm_malloc
Normal file
@ -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 $^ > $@
|
6
gcc/config/i386/t-pmm_malloc
Normal file
6
gcc/config/i386/t-pmm_malloc
Normal file
@ -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 $^ > $@
|
@ -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)));
|
||||
|
||||
|
@ -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.
|
||||
|
36
gcc/testsuite/gcc.dg/i386-sse-9.c
Normal file
36
gcc/testsuite/gcc.dg/i386-sse-9.c
Normal file
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user