From 14abf0fda5080b52ddfc0976d0e7c93928dbe543 Mon Sep 17 00:00:00 2001 From: SamTebbs33 Date: Thu, 27 Jun 2019 22:22:17 +0100 Subject: [PATCH 1/2] Add doc comments to alignment functions --- std/mem.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/std/mem.zig b/std/mem.zig index 7ecd483020..969b9af4c1 100644 --- a/std/mem.zig +++ b/std/mem.zig @@ -1481,6 +1481,7 @@ test "subArrayPtr" { } /// Round an address up to the nearest aligned address +/// The alignment must be greater than 0. pub fn alignForward(addr: usize, alignment: usize) usize { return alignBackward(addr + (alignment - 1), alignment); } @@ -1500,6 +1501,8 @@ test "alignForward" { testing.expect(alignForward(17, 8) == 24); } +/// Round an address up to the previous aligned address +/// The alignment must be greater than 0. pub fn alignBackward(addr: usize, alignment: usize) usize { // 000010000 // example addr // 000001111 // subtract 1 @@ -1507,6 +1510,8 @@ pub fn alignBackward(addr: usize, alignment: usize) usize { return addr & ~(alignment - 1); } +/// Given an address and an alignment, return true if the address is a multiple of the alignment +/// The alignment must be greater than 0. pub fn isAligned(addr: usize, alignment: usize) bool { return alignBackward(addr, alignment) == addr; } From 623dbb73df7d8350f79f62c13587a354fdcd56d5 Mon Sep 17 00:00:00 2001 From: SamTebbs33 Date: Thu, 27 Jun 2019 22:23:09 +0100 Subject: [PATCH 2/2] Add check for power of 2 to std.mem.alignBackward --- std/mem.zig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/std/mem.zig b/std/mem.zig index 969b9af4c1..ef001d5dab 100644 --- a/std/mem.zig +++ b/std/mem.zig @@ -1481,7 +1481,7 @@ test "subArrayPtr" { } /// Round an address up to the nearest aligned address -/// The alignment must be greater than 0. +/// The alignment must be a power of 2 and greater than 0. pub fn alignForward(addr: usize, alignment: usize) usize { return alignBackward(addr + (alignment - 1), alignment); } @@ -1502,8 +1502,9 @@ test "alignForward" { } /// Round an address up to the previous aligned address -/// The alignment must be greater than 0. +/// The alignment must be a power of 2 and greater than 0. pub fn alignBackward(addr: usize, alignment: usize) usize { + assert(@popCount(usize, alignment) == 1); // 000010000 // example addr // 000001111 // subtract 1 // 111110000 // binary not @@ -1511,7 +1512,7 @@ pub fn alignBackward(addr: usize, alignment: usize) usize { } /// Given an address and an alignment, return true if the address is a multiple of the alignment -/// The alignment must be greater than 0. +/// The alignment must be a power of 2 and greater than 0. pub fn isAligned(addr: usize, alignment: usize) bool { return alignBackward(addr, alignment) == addr; }