Skip to content

Commit 65c799c

Browse files
MaxGraeydcodeIO
authored andcommitted
Speedup some compiler routines (AssemblyScript#441)
1 parent cc5522d commit 65c799c

File tree

6 files changed

+136
-127
lines changed

6 files changed

+136
-127
lines changed

src/builtins.ts

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -451,14 +451,11 @@ export function compileCall(
451451
arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);
452452
}
453453
switch (compiler.currentType.kind) {
454+
case TypeKind.BOOL: // usually overflows
454455
case TypeKind.I8:
455-
case TypeKind.I16:
456456
case TypeKind.U8:
457-
case TypeKind.U16: {
458-
ret = module.createUnary(UnaryOp.ClzI32, arg0);
459-
break;
460-
}
461-
case TypeKind.BOOL: // usually overflows
457+
case TypeKind.I16:
458+
case TypeKind.U16:
462459
case TypeKind.I32:
463460
case TypeKind.U32: {
464461
ret = module.createUnary(UnaryOp.ClzI32, arg0);
@@ -531,14 +528,11 @@ export function compileCall(
531528
arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);
532529
}
533530
switch (compiler.currentType.kind) {
531+
case TypeKind.BOOL: // usually overflows
534532
case TypeKind.I8:
535-
case TypeKind.I16:
536533
case TypeKind.U8:
537-
case TypeKind.U16: {
538-
ret = module.createUnary(UnaryOp.CtzI32, arg0);
539-
break;
540-
}
541-
case TypeKind.BOOL: // usually overflows
534+
case TypeKind.I16:
535+
case TypeKind.U16:
542536
case TypeKind.I32:
543537
case TypeKind.U32: {
544538
ret = module.createUnary(UnaryOp.CtzI32, arg0);
@@ -611,14 +605,11 @@ export function compileCall(
611605
arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);
612606
}
613607
switch (compiler.currentType.kind) {
608+
case TypeKind.BOOL: // usually overflows
614609
case TypeKind.I8:
615-
case TypeKind.I16:
616610
case TypeKind.U8:
617-
case TypeKind.U16: {
618-
ret = module.createUnary(UnaryOp.PopcntI32, arg0);
619-
break;
620-
}
621-
case TypeKind.BOOL: // usually overflows
611+
case TypeKind.I16:
612+
case TypeKind.U16:
622613
case TypeKind.I32:
623614
case TypeKind.U32: {
624615
ret = module.createUnary(UnaryOp.PopcntI32, arg0);
@@ -2525,11 +2516,8 @@ export function compileCall(
25252516
case TypeKind.I16:
25262517
case TypeKind.U8:
25272518
case TypeKind.U16:
2528-
case TypeKind.BOOL: {
2529-
ret = module.createSelect(arg0, arg1, arg2);
2530-
break;
2531-
}
2532-
default: { // any other value type
2519+
case TypeKind.BOOL:
2520+
default: {
25332521
ret = module.createSelect(arg0, arg1, arg2);
25342522
break;
25352523
}

src/compiler.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4499,7 +4499,6 @@ export class Compiler extends DiagnosticEmitter {
44994499

45004500
// simplify if cloning left without side effects is possible
45014501
if (expr = module.cloneExpression(leftExpr, true, 0)) {
4502-
this.makeIsTrueish(leftExpr, this.currentType);
45034502
expr = module.createIf(
45044503
this.makeIsTrueish(leftExpr, this.currentType),
45054504
rightExpr,
@@ -6420,14 +6419,16 @@ export class Compiler extends DiagnosticEmitter {
64206419
var arrayOffset = arraySegment.offset;
64216420
if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));
64226421
this.currentType = arrayInstance.type;
6422+
var buffer_offset = pos + arrayInstance.offsetof("buffer_");
6423+
var length_offset = pos + arrayInstance.offsetof("length_");
64236424
if (usizeTypeSize == 8) {
6424-
writeI64(bufferOffset, buf, pos + arrayInstance.offsetof("buffer_"));
6425-
writeI32(length, buf, pos + arrayInstance.offsetof("length_"));
6425+
writeI64(bufferOffset, buf, buffer_offset);
6426+
writeI32(length, buf, length_offset);
64266427
return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));
64276428
} else {
64286429
assert(i64_is_u32(bufferOffset));
6429-
writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof("buffer_"));
6430-
writeI32(length, buf, pos + arrayInstance.offsetof("length_"));
6430+
writeI32(i64_low(bufferOffset), buf, buffer_offset);
6431+
writeI32(length, buf, length_offset);
64316432
assert(i64_is_u32(arrayOffset));
64326433
return this.module.createI32(i64_low(arrayOffset));
64336434
}
@@ -6448,12 +6449,13 @@ export class Compiler extends DiagnosticEmitter {
64486449
var nativeElementType = elementType.toNativeType();
64496450
var isStatic = true;
64506451
for (let i = 0; i < length; ++i) {
6451-
let expr = expressions[i]
6452-
? this.compileExpression(<Expression>expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)
6452+
let expression = expressions[i];
6453+
let expr = expression
6454+
? this.compileExpression(<Expression>expression, elementType, ConversionKind.IMPLICIT, WrapMode.NONE)
64536455
: elementType.toNativeZero(module);
64546456
compiledValues[i] = expr;
64556457
if (isStatic) {
6456-
expr = module.precomputeExpression(compiledValues[i]);
6458+
expr = module.precomputeExpression(expr);
64576459
if (getExpressionId(expr) == ExpressionId.Const) {
64586460
assert(getExpressionType(expr) == nativeElementType);
64596461
constantValues[i] = expr;

src/program.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,33 +1614,34 @@ export class Program extends DiagnosticEmitter {
16141614
element = assert(parent.lookupInSelf(name)); // possibly merged
16151615
var members = declaration.members;
16161616
for (let i = 0, k = members.length; i < k; ++i) {
1617-
switch (members[i].kind) {
1617+
let member = members[i];
1618+
switch (member.kind) {
16181619
case NodeKind.CLASSDECLARATION: {
1619-
this.initializeClass(<ClassDeclaration>members[i], element, queuedExtends, queuedImplements);
1620+
this.initializeClass(<ClassDeclaration>member, element, queuedExtends, queuedImplements);
16201621
break;
16211622
}
16221623
case NodeKind.ENUMDECLARATION: {
1623-
this.initializeEnum(<EnumDeclaration>members[i], element);
1624+
this.initializeEnum(<EnumDeclaration>member, element);
16241625
break;
16251626
}
16261627
case NodeKind.FUNCTIONDECLARATION: {
1627-
this.initializeFunction(<FunctionDeclaration>members[i], element);
1628+
this.initializeFunction(<FunctionDeclaration>member, element);
16281629
break;
16291630
}
16301631
case NodeKind.INTERFACEDECLARATION: {
1631-
this.initializeInterface(<InterfaceDeclaration>members[i], element);
1632+
this.initializeInterface(<InterfaceDeclaration>member, element);
16321633
break;
16331634
}
16341635
case NodeKind.NAMESPACEDECLARATION: {
1635-
this.initializeNamespace(<NamespaceDeclaration>members[i], element, queuedExtends, queuedImplements);
1636+
this.initializeNamespace(<NamespaceDeclaration>member, element, queuedExtends, queuedImplements);
16361637
break;
16371638
}
16381639
case NodeKind.TYPEDECLARATION: {
1639-
this.initializeTypeDefinition(<TypeDeclaration>members[i], element);
1640+
this.initializeTypeDefinition(<TypeDeclaration>member, element);
16401641
break;
16411642
}
16421643
case NodeKind.VARIABLE: {
1643-
this.initializeVariables(<VariableStatement>members[i], element);
1644+
this.initializeVariables(<VariableStatement>member, element);
16441645
break;
16451646
}
16461647
default: assert(false); // namespace member expected

0 commit comments

Comments
 (0)