Replace modulus with mask operation in over-aligned new
authorJonathan Wakely <jwakely@redhat.com>
Fri, 16 Sep 2016 18:09:14 +0000 (19:09 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 16 Sep 2016 18:09:14 +0000 (19:09 +0100)
2016-09-16  Jonathan Wakely  <jwakely@redhat.com>
    Marc Glisse  <marc.glisse@inria.fr>

* libsupc++/new_opa.cc [_GLIBCXX_HAVE_ALIGNED_ALLOC]
(operator new(size_t, align_val_t)): Replace modulus operator with
mask.

Co-Authored-By: Marc Glisse <marc.glisse@inria.fr>
From-SVN: r240192

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/new_opa.cc

index cddff99..21ee3fd 100644 (file)
@@ -1,4 +1,11 @@
 2016-09-16  Jonathan Wakely  <jwakely@redhat.com>
+           Marc Glisse  <marc.glisse@inria.fr>
+
+       * libsupc++/new_opa.cc [_GLIBCXX_HAVE_ALIGNED_ALLOC]
+       (operator new(size_t, align_val_t)): Replace modulus operator with
+       mask.
+
+2016-09-16  Jonathan Wakely  <jwakely@redhat.com>
 
        * libsupc++/new_opa.cc [_GLIBCXX_HAVE_POSIX_MEMALIGN] (aligned_alloc):
        Increase alignment if less than sizeof(void*).
index 9c859c1..91e53a8 100644 (file)
@@ -69,7 +69,7 @@ operator new (std::size_t sz, std::align_val_t al)
 
 #if _GLIBCXX_HAVE_ALIGNED_ALLOC
   /* C11: the value of size shall be an integral multiple of alignment.  */
-  if (std::size_t rem = sz % align)
+  if (std::size_t rem = sz & (align - 1))
     sz += align - rem;
 #endif