chiark / gitweb /
@@@ tvec buffer align power-of-two
authorMark Wooding <mdw@distorted.org.uk>
Tue, 9 Jul 2024 17:07:01 +0000 (18:07 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 9 Jul 2024 17:07:01 +0000 (18:07 +0100)
test/tvec-types.c

index 27381b5865ffb158c86586b93dcf32bc29509269..9e7a35fe5f76b07f35b319a6a39e50613aea89e2 100644 (file)
@@ -3976,17 +3976,18 @@ void tvec_initbuffer(union tvec_regval *rv,
 void tvec_allocbuffer(union tvec_regval *rv)
 {
   unsigned char *p; size_t n;
 void tvec_allocbuffer(union tvec_regval *rv)
 {
   unsigned char *p; size_t n;
+  size_t m = rv->buf.m, a = rv->buf.a, off;
 
   if (rv->buf.p) free(rv->buf.p - rv->buf.off);
 
 
   if (rv->buf.p) free(rv->buf.p - rv->buf.off);
 
-  if (rv->buf.m < 2) {
-    rv->buf.p = x_alloc(&arena_stdlib, rv->buf.sz); rv->buf.off = 0;
+  if (m < 2) {
+    p = x_alloc(&arena_stdlib, rv->buf.sz); off = 0;
   } else {
   } else {
-    p = x_alloc(&arena_stdlib, rv->buf.sz + rv->buf.m - 1);
-    n = (size_t)p%rv->buf.m;
-    rv->buf.off = (rv->buf.a - n + rv->buf.m)%rv->buf.m;
-    rv->buf.p = p + rv->buf.off;
+    p = x_alloc(&arena_stdlib, rv->buf.sz + m - 1);
+    if (!(m&(m - 1))) off = (a - (size_t)p)&(m - 1);
+    else off = (a + m - (size_t)p%m)%m;
   }
   }
+  rv->buf.p = p + off; rv->buf.off = off;
   memset(rv->buf.p, '?', rv->buf.sz);
 }
 
   memset(rv->buf.p, '?', rv->buf.sz);
 }