Added a function for memory size alignment

This commit is contained in:
2025-04-15 11:08:33 +02:00
parent 19a8154e06
commit 80aa833a9b
5 changed files with 44 additions and 0 deletions

11
lib/math/math.q Normal file
View File

@ -0,0 +1,11 @@
align2(x uint64) -> uint64 {
x -= 1
x |= x >> 1
x |= x >> 2
x |= x >> 4
x |= x >> 8
x |= x >> 16
x |= x >> 32
x += 1
return x
}

View File

@ -117,6 +117,9 @@ func TestParse(t *testing.T) {
{"Dereferencing 2", "[a+b]", "(@ (+ a b))"}, {"Dereferencing 2", "[a+b]", "(@ (+ a b))"},
{"Dereferencing 3", "[a+b]=c", "(= (@ (+ a b)) c)"}, {"Dereferencing 3", "[a+b]=c", "(= (@ (+ a b)) c)"},
{"Dereferencing 3", "[a+b]=c+d", "(= (@ (+ a b)) (+ c d))"}, {"Dereferencing 3", "[a+b]=c+d", "(= (@ (+ a b)) (+ c d))"},
{"Assign bitwise OR", "a|=b", "(|= a b)"},
{"Assign bitwise OR 2", "a|=b<<c", "(|= a (<< b c))"},
} }
for _, test := range tests { for _, test := range tests {

View File

@ -51,6 +51,9 @@ var Operators = [64]Operator{
token.MulAssign: {"*=", math.MinInt8, 2}, token.MulAssign: {"*=", math.MinInt8, 2},
token.DivAssign: {"/=", math.MinInt8, 2}, token.DivAssign: {"/=", math.MinInt8, 2},
token.ModAssign: {"%=", math.MinInt8, 2}, token.ModAssign: {"%=", math.MinInt8, 2},
token.AndAssign: {"&=", math.MinInt8, 2},
token.OrAssign: {"|=", math.MinInt8, 2},
token.XorAssign: {"^=", math.MinInt8, 2},
token.ShrAssign: {">>=", math.MinInt8, 2}, token.ShrAssign: {">>=", math.MinInt8, 2},
token.ShlAssign: {"<<=", math.MinInt8, 2}, token.ShlAssign: {"<<=", math.MinInt8, 2},
} }

26
tests/programs/align.q Normal file
View File

@ -0,0 +1,26 @@
import math
main() {
assert math.align2(0) == 0
assert math.align2(1) == 1
assert math.align2(2) == 2
assert math.align2(3) == 4
assert math.align2(4) == 4
assert math.align2(5) == 8
assert math.align2(6) == 8
assert math.align2(7) == 8
assert math.align2(8) == 8
assert math.align2(9) == 16
assert math.align2(10) == 16
assert math.align2(30) == 32
assert math.align2(60) == 64
assert math.align2(100) == 128
assert math.align2(200) == 256
assert math.align2(500) == 512
assert math.align2(1000) == 1024
assert math.align2(2000) == 2048
assert math.align2(4000) == 4096
assert math.align2(8000) == 8192
assert math.align2(16000) == 16384
assert math.align2(32000) == 32768
}

View File

@ -40,6 +40,7 @@ var programs = []struct {
{"bitwise-or", 0}, {"bitwise-or", 0},
{"bitwise-xor", 0}, {"bitwise-xor", 0},
{"shift", 0}, {"shift", 0},
{"align", 0},
{"modulo", 0}, {"modulo", 0},
{"modulo-assign", 0}, {"modulo-assign", 0},
{"div-split", 0}, {"div-split", 0},