Added a function for memory size alignment
This commit is contained in:
11
lib/math/math.q
Normal file
11
lib/math/math.q
Normal 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
|
||||||
|
}
|
@ -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 {
|
||||||
|
@ -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
26
tests/programs/align.q
Normal 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
|
||||||
|
}
|
@ -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},
|
||||||
|
Reference in New Issue
Block a user