Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions aeneas/src/ir/Ir.v3
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class IrClass extends IrItem {
var machSize: int = -1;
var boxing: Boxing;
var packed: bool;
var packingExpr: List<VstPackingExpr>;

new(ctype, typeArgs, parent, fields, methods) { }
def inherits(m: IrMember) -> bool {
Expand Down
1 change: 1 addition & 0 deletions aeneas/src/ir/Normalization.v3
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class NormalizerConfig {
var GetScalar: (Compiler, Program, Type) -> Scalar.set = defaultGetScalar;
var GetBitWidth: (Compiler, Program, Type) -> byte = defaultGetBitWidth;
var MaxScalarWidth: byte = 64;
var UsedScalars: Scalar.set = Scalar.B32 | Scalar.B64 | Scalar.F32 | Scalar.F64 | Scalar.Ref;

def setSignatureLimits(maxp: int, maxr: int) {
if (maxp < MaxParams) MaxParams = maxp;
Expand Down
12 changes: 11 additions & 1 deletion aeneas/src/ir/PackingSolver.v3
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def COLOR = false;
// An interval from {start}, inclusive, to {end}, exclusive.
type Interval(start: byte, end: byte) #unboxed {
def render(buf: StringBuilder) -> StringBuilder { return buf.put2("%d...%d", start, end); }
def shl(n: byte) -> Interval { return Interval(start + n, end + n); }
def size() -> byte { return end - start; }
}

Expand Down Expand Up @@ -62,7 +63,10 @@ class ScalarPattern(bits: Array<PackingBit>) {
var start = 0;
for (end < size) {
if (bits[end] != PackingBit.Unassigned) start = end + 1;
else if (end + 1 - start >= s) intervals.put(Interval(byte.view(end + 1 - s), byte.view(end + 1)));
else if (end + 1 - start >= s) {
intervals.put(Interval(byte.view(end + 1 - s), byte.view(end + 1)));
start = end; // don't try all intervals
}
}
return intervals.extract();
}
Expand All @@ -81,6 +85,12 @@ class ScalarPattern(bits: Array<PackingBit>) {
for (j = i.start; j < i.end; j++) bits[j] = PackingBit.Unassigned;
}
def copy() -> ScalarPattern { return ScalarPattern.new(Arrays.dup(bits)); }
def padTo(n: byte) -> ScalarPattern { return ScalarPattern.new(Arrays.grow(bits, n)); }
def extractFixed() -> u64 {
var result: u64;
for (i < size) if (bits[i] == PackingBit.Fixed(1)) result |= 1ul << byte.view(i);
return result;
}
}

type PackingField #unboxed {
Expand Down
14 changes: 11 additions & 3 deletions aeneas/src/ir/SsaNormalizer.v3
Original file line number Diff line number Diff line change
Expand Up @@ -1384,11 +1384,19 @@ class SsaRaNormalizer extends SsaRebuilder {

var result = Array<SsaInstr>.new(vn.size);
for (i < result.length) result[i] = newGraph.nullConst(vn.at(i));

for (i < vn.pattern.scalars.length) {
if (IntRepType.?(vn.at(i))) {
var irt = IntRepType.!(vn.at(i));
var fixed = vn.pattern.scalars[i].extractFixed();
if (irt.width == 64) result[i] = newGraph.valConst(irt, irt.boxL(long.view(fixed)));
else result[i] = newGraph.valConst(irt, irt.box(int.view(fixed)));
}
}
if (vn.hasExplicitTag()) {
var tagIdx = vn.tag.indexes[0];
if (IntRepType.?(vn.at(tagIdx))) result[tagIdx] = genSetInterval(result[tagIdx], newGraph.intConst(vn.tagValue), vn.tag.intervals[0], vn.tag.tn.newType, IntRepType.!(vn.at(tagIdx)));
else result[tagIdx] = newGraph.intConst(vn.tagValue);
if (!IntRepType.?(vn.at(tagIdx))) {
result[tagIdx] = newGraph.intConst(vn.tagValue); // explicit tag scalar (not packed)
}
}

for (i < vn.fields.length) {
Expand Down
Loading