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