internal static GlobalAccessorInstruction Create(BinaryParsingReader reader, bool getter) { uint globalIndex = reader.ReadVarUint32(); OpCodes opcode = getter ? OpCodes.GetGlobal : OpCodes.SetGlobal; if (MaxReusableIndex < globalIndex) { return(new GlobalAccessorInstruction(opcode) { GlobalIndex = globalIndex }); } GlobalAccessorInstruction[] reuseTarget = getter ? _knownGlobalGetters : _knownGlobalSetters; GlobalAccessorInstruction result = reuseTarget[globalIndex]; if (null != result) { _reuseCount++; } else { result = new GlobalAccessorInstruction(opcode) { GlobalIndex = globalIndex }; reuseTarget[globalIndex] = result; } return(result); }
internal static LocalAccessorInstruction Create(BinaryParsingReader reader, OpCodes opcode) { uint localIndex = reader.ReadVarUint32(); if (MaxReusablIndex < localIndex) { return(new LocalAccessorInstruction(opcode) { LocalIndex = localIndex }); } LocalAccessorInstruction[] reuseTable = GetReuseTable(opcode); LocalAccessorInstruction result = reuseTable[localIndex]; if (null != result) { _reuseCount++; } else { result = new LocalAccessorInstruction(opcode) { LocalIndex = localIndex }; reuseTable[localIndex] = result; } return(result); }
internal static BranchInstruction Create(BinaryParsingReader reader, OpCodes opcode) { uint depth = reader.ReadVarUint32(); bool conditional = (OpCodes.BrIf == opcode); if (MaxReusableDepth < depth) { return(new BranchInstruction(opcode) { Conditional = conditional, Depth = depth }); } BranchInstruction[] reuseTargets = conditional ? _perDepthConditionalBranch : _perDepthBranch; BranchInstruction result = reuseTargets[depth]; if (null != result) { _reuseCount++; } else { result = new BranchInstruction(opcode) { Conditional = conditional, Depth = depth }; reuseTargets[depth] = result; } return(result); }
internal static MemoryControlInstruction Create(BinaryParsingReader reader, OpCodes opcode) { byte reserved = reader.ReadVarUint1(); UseCount++; return(new MemoryControlInstruction(opcode) { Reserved = reserved }); }
internal static CallInstruction Create(BinaryParsingReader reader, OpCodes opcode) { uint itemIndex = reader.ReadVarUint32(); bool indirect = (OpCodes.CallIndirect == opcode); byte expectedSignature = indirect ? reader.ReadVarUint1() : (byte)0; return(new CallInstruction(opcode) { ExpectedSignature = expectedSignature, Indirect = indirect, ItemIndex = itemIndex }); }
internal static BranchTableInstruction Create(BinaryParsingReader reader) { uint targetCount = reader.ReadVarUint32(); uint[] targets = new uint[targetCount]; for (int index = 0; index < targetCount; index++) { targets[index] = reader.ReadVarUint32(); } uint defaultTarget = reader.ReadVarUint32(); return(new BranchTableInstruction() { DefaultTarget = defaultTarget, Targets = targets }); }
internal static ConstantValueInstruction <T> Create(BinaryParsingReader reader, OpCodes opcode, T value) { ConstantValueInstruction <T> result; if (_knownValues.TryGetValue(value, out result)) { _reuseCount++; return(result); } result = new ConstantValueInstruction <T>(opcode) { Value = value }; _knownValues.Add(value, result); return(result); }
internal static IfInstruction Create(BinaryParsingReader reader) { BuiltinLanguageType valueType = reader.ReadValueType(true); IfInstruction result = _knownTests[(int)valueType + 128]; if (null != result) { _reuseCount++; } else { result = new IfInstruction() { ValueType = valueType }; _knownTests[(int)valueType + 128] = result; } return(result); }
internal static BlockInstruction Create(BinaryParsingReader reader) { BuiltinLanguageType blockType = (BuiltinLanguageType)reader.ReadVarInt7(); BlockInstruction result = _perTypeBlock[(int)blockType + 128]; if (null != result) { _reuseCount++; } else { result = new BlockInstruction() { BlockType = blockType }; _perTypeBlock[(int)blockType + 128] = result; } return(result); }
internal static MemoryAccessInstruction Create(BinaryParsingReader reader, OpCodes opcode) { RawValueEncoding rawValue; bool store = false; switch (opcode) { case OpCodes.I32Store: store = true; goto case OpCodes.I32Load; case OpCodes.I32Load: rawValue = RawValueEncoding.I32; break; case OpCodes.I64Store: store = true; goto case OpCodes.I64Load; case OpCodes.I64Load: rawValue = RawValueEncoding.I64; break; case OpCodes.F32Store: store = true; goto case OpCodes.F32Load; case OpCodes.F32Load: rawValue = RawValueEncoding.F32; break; case OpCodes.F64Store: store = true; goto case OpCodes.F64Load; case OpCodes.F64Load: rawValue = RawValueEncoding.F64; break; case OpCodes.I32Load8_s: rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Signed; break; case OpCodes.I32Load8_u: rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Unsigned; break; case OpCodes.I32Load16_s: rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize | RawValueEncoding.Signed; break; case OpCodes.I32Load16_u: rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize | RawValueEncoding.Unsigned; break; case OpCodes.I64Load8_s: rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Signed; break; case OpCodes.I64Load8_u: rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize | RawValueEncoding.Unsigned; break; case OpCodes.I64Load16_s: rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize | RawValueEncoding.Signed; break; case OpCodes.I64Load16_u: rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize | RawValueEncoding.Unsigned; break; case OpCodes.I64Load32_s: rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize | RawValueEncoding.Signed; break; case OpCodes.I64Load32_u: rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize | RawValueEncoding.Unsigned; break; case OpCodes.I32Store8: rawValue = RawValueEncoding.I32 | RawValueEncoding.ByteStorageSize; store = true; break; case OpCodes.I32Store16: rawValue = RawValueEncoding.I32 | RawValueEncoding.WordStorageSize; store = true; break; case OpCodes.I64Store8: rawValue = RawValueEncoding.I64 | RawValueEncoding.ByteStorageSize; store = true; break; case OpCodes.I64Store16: rawValue = RawValueEncoding.I64 | RawValueEncoding.WordStorageSize; store = true; break; case OpCodes.I64Store32: rawValue = RawValueEncoding.I64 | RawValueEncoding.DoubleWordStorageSize; store = true; break; default: throw new NotSupportedException(); } uint flags = reader.ReadVarUint32(); uint offset = reader.ReadVarUint32(); InstructionsCount++; MemoryAccessInstruction result; // if (_knownInstructions.TryGetValue(opcode, out result)) { return result; } result = new MemoryAccessInstruction(opcode) { _rawValue = rawValue, IsLoad = !store, Offset = offset, Align = flags }; // _knownInstructions.Add(opcode, result); return(result); }