| ... | ... | @@ -1481,6 +1481,7 @@ test "subArrayPtr" { |
| 1481 | 1481 | } |
| 1482 | 1482 | |
| 1483 | 1483 | /// Round an address up to the nearest aligned address |
| 1484 | /// The alignment must be a power of 2 and greater than 0. |
| 1484 | 1485 | pub fn alignForward(addr: usize, alignment: usize) usize { |
| 1485 | 1486 | return alignBackward(addr + (alignment - 1), alignment); |
| 1486 | 1487 | } |
| ... | ... | @@ -1500,13 +1501,18 @@ test "alignForward" { |
| 1500 | 1501 | testing.expect(alignForward(17, 8) == 24); |
| 1501 | 1502 | } |
| 1502 | 1503 | |
| 1504 | /// Round an address up to the previous aligned address |
| 1505 | /// The alignment must be a power of 2 and greater than 0. |
| 1503 | 1506 | pub fn alignBackward(addr: usize, alignment: usize) usize { |
| 1507 | assert(@popCount(usize, alignment) == 1); |
| 1504 | 1508 | // 000010000 // example addr |
| 1505 | 1509 | // 000001111 // subtract 1 |
| 1506 | 1510 | // 111110000 // binary not |
| 1507 | 1511 | return addr & ~(alignment - 1); |
| 1508 | 1512 | } |
| 1509 | 1513 | |
| 1514 | /// Given an address and an alignment, return true if the address is a multiple of the alignment |
| 1515 | /// The alignment must be a power of 2 and greater than 0. |
| 1510 | 1516 | pub fn isAligned(addr: usize, alignment: usize) bool { |
| 1511 | 1517 | return alignBackward(addr, alignment) == addr; |
| 1512 | 1518 | } |