mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-07-01 23:51:51 +00:00
Rework inlining logic (#463)
This commit is contained in:
130
src/builtins.ts
130
src/builtins.ts
@ -154,7 +154,7 @@ export function compileCall(
|
||||
}
|
||||
let element = compiler.resolver.resolveExpression(
|
||||
operands[0],
|
||||
compiler.currentFunction,
|
||||
compiler.currentFlow,
|
||||
Type.void,
|
||||
ReportMode.SWALLOW
|
||||
);
|
||||
@ -639,11 +639,11 @@ export function compileCall(
|
||||
case TypeKind.I8:
|
||||
case TypeKind.I16:
|
||||
case TypeKind.I32: {
|
||||
let currentFunction = compiler.currentFunction;
|
||||
let flow = compiler.currentFlow;
|
||||
|
||||
// possibly overflows, e.g. abs<i8>(-128) == 128
|
||||
let tempLocal1 = currentFunction.getTempLocal(Type.i32, false);
|
||||
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i32, false).index;
|
||||
let tempLocal1 = flow.getTempLocal(Type.i32, false);
|
||||
let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;
|
||||
let tempLocalIndex1 = tempLocal1.index;
|
||||
|
||||
// (x + (x >> 31)) ^ (x >> 31)
|
||||
@ -661,16 +661,16 @@ export function compileCall(
|
||||
module.createGetLocal(tempLocalIndex2, NativeType.I32)
|
||||
);
|
||||
|
||||
currentFunction.freeTempLocal(tempLocal1);
|
||||
flow.freeTempLocal(tempLocal1);
|
||||
break;
|
||||
}
|
||||
case TypeKind.ISIZE: {
|
||||
let options = compiler.options;
|
||||
let currentFunction = compiler.currentFunction;
|
||||
let flow = compiler.currentFlow;
|
||||
let wasm64 = options.isWasm64;
|
||||
|
||||
let tempLocal1 = currentFunction.getTempLocal(options.usizeType, false);
|
||||
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(options.usizeType, false).index;
|
||||
let tempLocal1 = flow.getTempLocal(options.usizeType, false);
|
||||
let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;
|
||||
let tempLocalIndex1 = tempLocal1.index;
|
||||
|
||||
ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,
|
||||
@ -687,14 +687,14 @@ export function compileCall(
|
||||
module.createGetLocal(tempLocalIndex2, options.nativeSizeType)
|
||||
);
|
||||
|
||||
currentFunction.freeTempLocal(tempLocal1);
|
||||
flow.freeTempLocal(tempLocal1);
|
||||
break;
|
||||
}
|
||||
case TypeKind.I64: {
|
||||
let currentFunction = compiler.currentFunction;
|
||||
let flow = compiler.currentFlow;
|
||||
|
||||
let tempLocal1 = currentFunction.getTempLocal(Type.i64, false);
|
||||
let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i64, false).index;
|
||||
let tempLocal1 = flow.getTempLocal(Type.i64, false);
|
||||
let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;
|
||||
let tempLocalIndex1 = tempLocal1.index;
|
||||
|
||||
// (x + (x >> 63)) ^ (x >> 63)
|
||||
@ -712,7 +712,7 @@ export function compileCall(
|
||||
module.createGetLocal(tempLocalIndex2, NativeType.I64)
|
||||
);
|
||||
|
||||
currentFunction.freeTempLocal(tempLocal1);
|
||||
flow.freeTempLocal(tempLocal1);
|
||||
break;
|
||||
}
|
||||
case TypeKind.USIZE: {
|
||||
@ -792,16 +792,16 @@ export function compileCall(
|
||||
case TypeKind.I8:
|
||||
case TypeKind.I16:
|
||||
case TypeKind.I32: {
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg0, compiler.currentType)
|
||||
);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg1, compiler.currentType)
|
||||
);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -816,16 +816,16 @@ export function compileCall(
|
||||
case TypeKind.U16:
|
||||
case TypeKind.U32:
|
||||
case TypeKind.BOOL: {
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg0, compiler.currentType)
|
||||
);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg1, compiler.currentType)
|
||||
);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -837,9 +837,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.I64: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -851,9 +852,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.U64: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -865,9 +867,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.ISIZE: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -890,9 +893,10 @@ export function compileCall(
|
||||
ret = module.createUnreachable();
|
||||
break;
|
||||
}
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -960,16 +964,16 @@ export function compileCall(
|
||||
case TypeKind.I8:
|
||||
case TypeKind.I16:
|
||||
case TypeKind.I32: {
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg0, compiler.currentType)
|
||||
);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg1, compiler.currentType)
|
||||
);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -984,16 +988,16 @@ export function compileCall(
|
||||
case TypeKind.U16:
|
||||
case TypeKind.U32:
|
||||
case TypeKind.BOOL: {
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg0, compiler.currentType)
|
||||
);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg1, compiler.currentType)
|
||||
);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -1005,9 +1009,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.I64: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -1019,9 +1024,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.U64: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(Type.i64, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -1033,9 +1039,10 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.ISIZE: {
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -1058,9 +1065,10 @@ export function compileCall(
|
||||
ret = module.createUnreachable();
|
||||
break;
|
||||
}
|
||||
let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
compiler.currentFunction.freeTempLocal(tempLocal0);
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
flow.freeTempLocal(tempLocal0);
|
||||
ret = module.createSelect(
|
||||
module.createTeeLocal(tempLocal0.index, arg0),
|
||||
module.createTeeLocal(tempLocal1.index, arg1),
|
||||
@ -2186,8 +2194,8 @@ export function compileCall(
|
||||
case TypeKind.U8:
|
||||
case TypeKind.U16:
|
||||
case TypeKind.BOOL: {
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(
|
||||
let flow = compiler.currentFlow;
|
||||
let tempLocal = flow.getAndFreeTempLocal(
|
||||
compiler.currentType,
|
||||
!flow.canOverflow(arg0, compiler.currentType)
|
||||
);
|
||||
@ -2201,7 +2209,7 @@ export function compileCall(
|
||||
case TypeKind.I32:
|
||||
case TypeKind.U32:
|
||||
default: {
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);
|
||||
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);
|
||||
ret = module.createIf(
|
||||
module.createTeeLocal(tempLocal.index, arg0),
|
||||
module.createGetLocal(tempLocal.index, NativeType.I32),
|
||||
@ -2211,7 +2219,7 @@ export function compileCall(
|
||||
}
|
||||
case TypeKind.I64:
|
||||
case TypeKind.U64: {
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);
|
||||
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);
|
||||
ret = module.createIf(
|
||||
module.createUnary(UnaryOp.EqzI64,
|
||||
module.createTeeLocal(tempLocal.index, arg0)
|
||||
@ -2223,7 +2231,7 @@ export function compileCall(
|
||||
}
|
||||
case TypeKind.ISIZE:
|
||||
case TypeKind.USIZE: {
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);
|
||||
ret = module.createIf(
|
||||
module.createUnary(
|
||||
compiler.options.isWasm64
|
||||
@ -2237,7 +2245,7 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.F32: {
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);
|
||||
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);
|
||||
ret = module.createIf(
|
||||
module.createBinary(BinaryOp.EqF32,
|
||||
module.createTeeLocal(tempLocal.index, arg0),
|
||||
@ -2249,7 +2257,7 @@ export function compileCall(
|
||||
break;
|
||||
}
|
||||
case TypeKind.F64: {
|
||||
let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);
|
||||
let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);
|
||||
ret = module.createIf(
|
||||
module.createBinary(BinaryOp.EqF64,
|
||||
module.createTeeLocal(tempLocal.index, arg0),
|
||||
@ -2286,7 +2294,7 @@ export function compileCall(
|
||||
);
|
||||
return module.createUnreachable();
|
||||
}
|
||||
let flow = compiler.currentFunction.flow;
|
||||
let flow = compiler.currentFlow;
|
||||
flow.set(FlowFlags.UNCHECKED_CONTEXT);
|
||||
ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);
|
||||
flow.unset(FlowFlags.UNCHECKED_CONTEXT);
|
||||
|
Reference in New Issue
Block a user