diff --git a/MagickCore/cache-view.c b/MagickCore/cache-view.c
index b029c69..e26d2ee 100644
--- a/MagickCore/cache-view.c
+++ b/MagickCore/cache-view.c
@@ -51,6 +51,7 @@
#include "MagickCore/cache-private.h"
#include "MagickCore/cache-view.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
#include "MagickCore/exception.h"
#include "MagickCore/exception-private.h"
#include "MagickCore/pixel-accessor.h"
@@ -160,7 +161,8 @@
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
(void) exception;
- cache_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*cache_view));
+ cache_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
+ sizeof(*cache_view)));
if (cache_view == (CacheView *) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
(void) ResetMagickMemory(cache_view,0,sizeof(*cache_view));
@@ -207,7 +209,8 @@
if (cache_view->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
cache_view->image->filename);
- clone_view=(CacheView *) AcquireAlignedMemory(1,sizeof(*clone_view));
+ clone_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1,
+ sizeof(*clone_view)));
if (clone_view == (CacheView *) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
(void) ResetMagickMemory(clone_view,0,sizeof(*clone_view));
diff --git a/MagickCore/cache.c b/MagickCore/cache.c
index fb0929e..1874a1d 100644
--- a/MagickCore/cache.c
+++ b/MagickCore/cache.c
@@ -247,8 +247,8 @@
register ssize_t
i;
- nexus_info=(NexusInfo **) AcquireAlignedMemory(number_threads,
- sizeof(*nexus_info));
+ nexus_info=(NexusInfo **) MagickAssumeAligned(AcquireAlignedMemory(
+ number_threads,sizeof(*nexus_info)));
if (nexus_info == (NexusInfo **) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
nexus_info[0]=(NexusInfo *) AcquireQuantumMemory(number_threads,
@@ -3677,8 +3677,8 @@
static inline void AllocatePixelCachePixels(CacheInfo *cache_info)
{
cache_info->mapped=MagickFalse;
- cache_info->pixels=(Quantum *) AcquireAlignedMemory(1,(size_t)
- cache_info->length);
+ cache_info->pixels=(Quantum *) MagickAssumeAligned(AcquireAlignedMemory(1,
+ (size_t) cache_info->length));
if (cache_info->pixels == (Quantum *) NULL)
{
cache_info->mapped=MagickTrue;
@@ -4742,8 +4742,8 @@
if (nexus_info->length != (MagickSizeType) ((size_t) nexus_info->length))
return(MagickFalse);
nexus_info->mapped=MagickFalse;
- nexus_info->cache=(Quantum *) AcquireAlignedMemory(1,(size_t)
- nexus_info->length);
+ nexus_info->cache=(Quantum *) MagickAssumeAligned(AcquireAlignedMemory(1,
+ (size_t) nexus_info->length));
if (nexus_info->cache == (Quantum *) NULL)
{
nexus_info->mapped=MagickTrue;
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 137fa8f..fc0aa2d 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -63,6 +63,7 @@
#include "MagickCore/list.h"
#include "MagickCore/log.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
#include "MagickCore/monitor.h"
#include "MagickCore/monitor-private.h"
#include "MagickCore/montage.h"
@@ -244,8 +245,8 @@
Create a set of kernels from maximum (radius,sigma) to minimum.
*/
width=GetOptimalKernelWidth2D(radius,sigma);
- kernel=(MagickRealType **) AcquireAlignedMemory((size_t) width,
- sizeof(*kernel));
+ kernel=(MagickRealType **) MagickAssumeAligned(AcquireAlignedMemory((size_t)
+ width,sizeof(*kernel)));
if (kernel == (MagickRealType **) NULL)
{
edge_image=DestroyImage(edge_image);
@@ -255,8 +256,8 @@
(void) ResetMagickMemory(kernel,0,(size_t) width*sizeof(*kernel));
for (i=0; i < (ssize_t) width; i+=2)
{
- kernel[i]=(MagickRealType *) AcquireAlignedMemory((size_t) (width-i),
- (width-i)*sizeof(**kernel));
+ kernel[i]=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory(
+ (size_t) (width-i),(width-i)*sizeof(**kernel)));
if (kernel[i] == (MagickRealType *) NULL)
break;
normalize=0.0;
@@ -567,8 +568,8 @@
Create a set of kernels from maximum (radius,sigma) to minimum.
*/
width=GetOptimalKernelWidth2D(radius,sigma);
- kernel=(MagickRealType **) AcquireAlignedMemory((size_t) width,
- sizeof(*kernel));
+ kernel=(MagickRealType **) MagickAssumeAligned(AcquireAlignedMemory((size_t)
+ width,sizeof(*kernel)));
if (kernel == (MagickRealType **) NULL)
{
edge_image=DestroyImage(edge_image);
@@ -578,8 +579,8 @@
(void) ResetMagickMemory(kernel,0,(size_t) width*sizeof(*kernel));
for (i=0; i < (ssize_t) width; i+=2)
{
- kernel[i]=(MagickRealType *) AcquireAlignedMemory((size_t) (width-i),
- (width-i)*sizeof(**kernel));
+ kernel[i]=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory(
+ (size_t) (width-i),(width-i)*sizeof(**kernel)));
if (kernel[i] == (double *) NULL)
break;
normalize=0.0;
@@ -835,8 +836,8 @@
Generate a 1-D convolution kernel.
*/
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
- kernel=(MagickRealType *) AcquireAlignedMemory((size_t) width,
- sizeof(*kernel));
+ kernel=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory((size_t)
+ width,sizeof(*kernel)));
if (kernel == (MagickRealType *) NULL)
return(0);
normalize=0.0;
@@ -1583,8 +1584,9 @@
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
kernel_info->width=width;
kernel_info->height=width;
- kernel_info->values=(MagickRealType *) AcquireAlignedMemory(
- kernel_info->width,kernel_info->width*sizeof(*kernel_info->values));
+ kernel_info->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel_info->width,kernel_info->width*
+ sizeof(*kernel_info->values)));
if (kernel_info->values == (MagickRealType *) NULL)
{
kernel_info=DestroyKernelInfo(kernel_info);
@@ -1674,8 +1676,9 @@
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
kernel_info->width=width;
kernel_info->height=width;
- kernel_info->values=(MagickRealType *) AcquireAlignedMemory(
- kernel_info->width,kernel_info->width*sizeof(*kernel_info->values));
+ kernel_info->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel_info->width,kernel_info->width*
+ sizeof(*kernel_info->values)));
if (kernel_info->values == (MagickRealType *) NULL)
{
kernel_info=DestroyKernelInfo(kernel_info);
@@ -1771,8 +1774,9 @@
kernel_info->width=width;
kernel_info->height=width;
kernel_info->signature=MagickSignature;
- kernel_info->values=(MagickRealType *) AcquireAlignedMemory(
- kernel_info->width,kernel_info->width*sizeof(*kernel_info->values));
+ kernel_info->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel_info->width,kernel_info->width*
+ sizeof(*kernel_info->values)));
if (kernel_info->values == (MagickRealType *) NULL)
{
kernel_info=DestroyKernelInfo(kernel_info);
@@ -1847,8 +1851,8 @@
Generate a 1-D convolution kernel.
*/
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
- kernel=(MagickRealType *) AcquireAlignedMemory((size_t) width,
- sizeof(*kernel));
+ kernel=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory((size_t)
+ width,sizeof(*kernel)));
if (kernel == (MagickRealType *) NULL)
return(kernel);
normalize=0.0;
@@ -2950,8 +2954,8 @@
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
width=GetOptimalKernelWidth1D(radius,sigma);
- kernel=(MagickRealType *) AcquireAlignedMemory((size_t) width,width*
- sizeof(*kernel));
+ kernel=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory((size_t)
+ width,width*sizeof(*kernel)));
if (kernel == (MagickRealType *) NULL)
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
j=(ssize_t) width/2;
@@ -3500,8 +3504,9 @@
kernel_info->width=width;
kernel_info->height=width;
kernel_info->signature=MagickSignature;
- kernel_info->values=(MagickRealType *) AcquireAlignedMemory(
- kernel_info->width,kernel_info->width*sizeof(*kernel_info->values));
+ kernel_info->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel_info->width,kernel_info->width*
+ sizeof(*kernel_info->values)));
if (kernel_info->values == (MagickRealType *) NULL)
{
kernel_info=DestroyKernelInfo(kernel_info);
diff --git a/MagickCore/memory-private.h b/MagickCore/memory-private.h
index 6b56223..20076c4 100644
--- a/MagickCore/memory-private.h
+++ b/MagickCore/memory-private.h
@@ -22,13 +22,22 @@
extern "C" {
#endif
+
#if defined(MAGICK_TARGET_CPU) && (MAGICK_TARGET_CPU == powerpc)
-# define CACHE_LINE_SIZE (16*sizeof(void *))
+# define CACHE_LINE_SIZE 128
#else
-# define CACHE_LINE_SIZE (8*sizeof(void *))
+# define CACHE_LINE_SIZE 64
#endif
+
#define CacheAlign(size) ((size) < CACHE_LINE_SIZE ? CACHE_LINE_SIZE : (size))
+#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR > 6))
+#define MagickAssumeAligned(address) \
+ __builtin_assume_aligned((address),CACHE_LINE_SIZE)
+#else
+#define MagickAssumeAligned(address) (address)
+#endif
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c
index c2bd1a6..40cce5c 100644
--- a/MagickCore/morphology.c
+++ b/MagickCore/morphology.c
@@ -64,6 +64,7 @@
#include "MagickCore/list.h"
#include "MagickCore/magick.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
#include "MagickCore/monitor-private.h"
#include "MagickCore/morphology.h"
#include "MagickCore/morphology-private.h"
@@ -333,8 +334,8 @@
}
/* Read in the kernel values from rest of input string argument */
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(AcquireAlignedMemory(
+ kernel->width,kernel->height*sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
kernel->minimum = +MagickHuge;
@@ -1052,8 +1053,8 @@
{
kernel->height = kernel->width = (size_t) 1;
kernel->x = kernel->y = (ssize_t) 0;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(1,
- sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(1,sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
kernel->maximum = kernel->values[0] = args->rho;
@@ -1076,8 +1077,9 @@
kernel->width = GetOptimalKernelWidth2D(args->rho,sigma2);
kernel->height = kernel->width;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1167,8 +1169,9 @@
kernel->x = (ssize_t) (kernel->width-1)/2;
kernel->y = 0;
kernel->negative_range = kernel->positive_range = 0.0;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1253,8 +1256,9 @@
kernel->x = kernel->y = 0;
kernel->height = 1;
kernel->negative_range = kernel->positive_range = 0.0;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1322,8 +1326,9 @@
order_f = fact(kernel->width-1);
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1554,8 +1559,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1595,8 +1601,9 @@
kernel->y = (ssize_t) args->psi;
scale = 1.0;
}
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1616,8 +1623,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1642,8 +1650,9 @@
kernel->width = kernel->height = (size_t)fabs(args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1664,8 +1673,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1685,8 +1695,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -1726,8 +1737,9 @@
kernel->height = kernel->width;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -2096,8 +2108,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -2116,8 +2129,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -2136,8 +2150,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -2161,8 +2176,9 @@
kernel->width = kernel->height = ((size_t)args->rho)*2+1;
kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
- kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*
+ sizeof(*kernel->values)));
if (kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(kernel));
@@ -2226,8 +2242,8 @@
*new_kernel=(*kernel); /* copy values in structure */
/* replace the values with a copy of the values */
- new_kernel->values=(MagickRealType *) AcquireAlignedMemory(kernel->width,
- kernel->height*sizeof(*kernel->values));
+ new_kernel->values=(MagickRealType *) MagickAssumeAligned(
+ AcquireAlignedMemory(kernel->width,kernel->height*sizeof(*kernel->values)));
if (new_kernel->values == (MagickRealType *) NULL)
return(DestroyKernelInfo(new_kernel));
for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++)
diff --git a/MagickCore/resize.c b/MagickCore/resize.c
index ea24983..b261b84 100644
--- a/MagickCore/resize.c
+++ b/MagickCore/resize.c
@@ -54,6 +54,7 @@
#include "MagickCore/image-private.h"
#include "MagickCore/list.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
#include "MagickCore/magick.h"
#include "MagickCore/pixel-accessor.h"
#include "MagickCore/property.h"
@@ -2149,8 +2150,8 @@
(void) ResetMagickMemory(contribution,0,number_threads*sizeof(*contribution));
for (i=0; i < (ssize_t) number_threads; i++)
{
- contribution[i]=(ContributionInfo *) AcquireAlignedMemory(count,
- sizeof(**contribution));
+ contribution[i]=(ContributionInfo *) MagickAssumeAligned(
+ AcquireAlignedMemory(count,sizeof(**contribution)));
if (contribution[i] == (ContributionInfo *) NULL)
return(DestroyContributionThreadSet(contribution));
}
diff --git a/MagickCore/stream.c b/MagickCore/stream.c
index db2a11d..7be49c8 100644
--- a/MagickCore/stream.c
+++ b/MagickCore/stream.c
@@ -52,6 +52,7 @@
#include "MagickCore/exception-private.h"
#include "MagickCore/geometry.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
#include "MagickCore/pixel.h"
#include "MagickCore/pixel-accessor.h"
#include "MagickCore/quantum.h"
@@ -161,8 +162,8 @@
if (stream_info == (StreamInfo *) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
(void) ResetMagickMemory(stream_info,0,sizeof(*stream_info));
- stream_info->pixels=(unsigned char *) AcquireAlignedMemory(1,
- sizeof(*stream_info->pixels));
+ stream_info->pixels=(unsigned char *) MagickAssumeAligned(
+ AcquireAlignedMemory(1,sizeof(*stream_info->pixels)));
if (stream_info->pixels == (unsigned char *) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
stream_info->map=ConstantString("RGB");