1179404Sobrien/*===---- mm_malloc.h - Implementation of _mm_malloc and _mm_free ----------===
2208737Sjmallett *
3179404Sobrien * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4179404Sobrien * See https://llvm.org/LICENSE.txt for license information.
5179404Sobrien * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6179404Sobrien *
7179404Sobrien *===-----------------------------------------------------------------------===
8179404Sobrien */
9179404Sobrien
10179404Sobrien#ifndef _MM_MALLOC_H_INCLUDED
11179404Sobrien#define _MM_MALLOC_H_INCLUDED
12179404Sobrien
13179404Sobrien#if defined(__linux__) && defined(__ppc64__)
14179404Sobrien
15179404Sobrien#include <stdlib.h>
16179404Sobrien
17179404Sobrien/* We can't depend on <stdlib.h> since the prototype of posix_memalign
18179404Sobrien   may not be visible.  */
19208737Sjmallett#ifndef __cplusplus
20208737Sjmallettextern int posix_memalign (void **, size_t, size_t);
21179404Sobrien#else
22179404Sobrienextern "C" int posix_memalign (void **, size_t, size_t) throw ();
23179404Sobrien#endif
24179404Sobrien
25179404Sobrienstatic __inline void *
26179404Sobrien_mm_malloc (size_t size, size_t alignment)
27179404Sobrien{
28179404Sobrien  /* PowerPC64 ELF V2 ABI requires quadword alignment.  */
29179404Sobrien  size_t vec_align = sizeof (__vector float);
30179404Sobrien  void *ptr;
31179404Sobrien
32179404Sobrien  if (alignment < vec_align)
33179404Sobrien    alignment = vec_align;
34179404Sobrien  if (posix_memalign (&ptr, alignment, size) == 0)
35179404Sobrien    return ptr;
36179404Sobrien  else
37179404Sobrien    return NULL;
38179404Sobrien}
39179404Sobrien
40179404Sobrienstatic __inline void
41179404Sobrien_mm_free (void * ptr)
42179404Sobrien{
43179404Sobrien  free (ptr);
44179404Sobrien}
45179404Sobrien
46179404Sobrien#else
47179404Sobrien#include_next <mm_malloc.h>
48179404Sobrien#endif
49179404Sobrien
50179404Sobrien#endif /* _MM_MALLOC_H_INCLUDED */
51179404Sobrien