From e17146d71a7e7af60e0f9320659c4677d4b68b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Sat, 16 Aug 2025 00:41:10 +0200 Subject: [PATCH 1/6] Add mechanism to allow CoreLib trimming to leverage whole program analysis (#118769) A couple times in the past I needed a way to say "if X is not part of the program, eliminate the entire basic block". We can do this for allocated types (this is how branches under `is` checks elimination works), but we can't do this for more general "characteristics". This introduces a mechanism where AOT compiler and CoreLib (or System.Private.* universe in general) can define whole program tags such as "whole program has X in it" and CoreLib can condition code on the presence of this tag. This is easier shown than described, so I extracted the first use of this into a separate commit. In this commit, we eliminate code that tries looking for `StackTraceHiddenAttribute` if we know the whole program has no `StackTraceHiddenAttribute` in it. With this code eliminated, #118640 can then eliminate all custom attributes on methods, which in turn plays into #118718 and we can eliminate enum boxing even when StackTraceSupport is not set to false (right now #118718 really needs the StackTraceSupport=false to get rid of boxed enums; we get more boxed enums from method attributes). We have a new node that represents the characteristic. The node can be dropped into the graph wherever needed. ILScanner then uses this to condition parts of the method body on this characteristic node. We need similar logic in the substitution IL provider because we need to guarantee that RyuJIT is not going to see basic blocks we didn't scan. So we treat it as a substitution during codegen phase too. --- .../AnalysisCharacteristicAttribute.cs | 11 ++++++ .../StackTraceMetadata/StackTraceMetadata.cs | 28 +++++++++------ .../System.Private.StackTraceMetadata.csproj | 2 ++ .../AnalysisCharacteristicNode.cs | 26 ++++++++++++++ .../DependencyAnalysis/MethodMetadataNode.cs | 10 +++++- .../DependencyAnalysis/NodeFactory.cs | 11 ++++++ .../ILCompiler.Compiler/Compiler/ILScanner.cs | 9 +++++ .../Compiler/SubstitutedILProvider.cs | 30 +++++++++++++++- .../IL/ILImporter.Scanner.cs | 23 +++++++++++- .../ILCompiler.Compiler.csproj | 1 + src/coreclr/tools/aot/ILCompiler/Program.cs | 2 +- .../AttributeTrimming/AttributeTrimming.cs | 36 +++++++++++++++++++ .../AttributeTrimming.csproj | 12 +++++++ 13 files changed, 187 insertions(+), 14 deletions(-) create mode 100644 src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/CompilerServices/AnalysisCharacteristicAttribute.cs create mode 100644 src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/AnalysisCharacteristicNode.cs create mode 100644 src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.cs create mode 100644 src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.csproj diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/CompilerServices/AnalysisCharacteristicAttribute.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/CompilerServices/AnalysisCharacteristicAttribute.cs new file mode 100644 index 00000000000000..63dbbfe07e173e --- /dev/null +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/CompilerServices/AnalysisCharacteristicAttribute.cs @@ -0,0 +1,11 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace System.Runtime.CompilerServices +{ + // When applied to an intrinsic method, the method will become a characteristic check. + [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] + internal class AnalysisCharacteristicAttribute : Attribute + { + } +} diff --git a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/StackTraceMetadata.cs b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/StackTraceMetadata.cs index 008119ebd10cad..352568239c0d4e 100644 --- a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/StackTraceMetadata.cs +++ b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/Internal/StackTraceMetadata/StackTraceMetadata.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Reflection.Runtime.General; +using System.Runtime.CompilerServices; using Internal.Metadata.NativeFormat; using Internal.NativeFormat; @@ -41,6 +42,10 @@ internal static void Initialize() RuntimeAugments.InitializeStackTraceMetadataSupport(new StackTraceMetadataCallbacksImpl()); } + [Intrinsic] + [AnalysisCharacteristic] + internal static extern bool StackTraceHiddenMetadataPresent(); + /// /// Locate the containing module for a method and try to resolve its name based on start address. /// @@ -75,21 +80,24 @@ public static unsafe string GetMethodNameFromStartAddressIfAvailable(IntPtr meth out TypeDefinitionHandle typeHandle, out MethodHandle methodHandle)) { - foreach (CustomAttributeHandle cah in reader.GetTypeDefinition(typeHandle).CustomAttributes) + if (StackTraceHiddenMetadataPresent()) { - if (cah.IsCustomAttributeOfType(reader, ["System", "Diagnostics"], "StackTraceHiddenAttribute")) + foreach (CustomAttributeHandle cah in reader.GetTypeDefinition(typeHandle).CustomAttributes) { - isStackTraceHidden = true; - break; + if (cah.IsCustomAttributeOfType(reader, ["System", "Diagnostics"], "StackTraceHiddenAttribute")) + { + isStackTraceHidden = true; + break; + } } - } - foreach (CustomAttributeHandle cah in reader.GetMethod(methodHandle).CustomAttributes) - { - if (cah.IsCustomAttributeOfType(reader, ["System", "Diagnostics"], "StackTraceHiddenAttribute")) + foreach (CustomAttributeHandle cah in reader.GetMethod(methodHandle).CustomAttributes) { - isStackTraceHidden = true; - break; + if (cah.IsCustomAttributeOfType(reader, ["System", "Diagnostics"], "StackTraceHiddenAttribute")) + { + isStackTraceHidden = true; + break; + } } } diff --git a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/System.Private.StackTraceMetadata.csproj b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/System.Private.StackTraceMetadata.csproj index cd40e0ec8ba54d..1fe8f87c09d76e 100644 --- a/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/System.Private.StackTraceMetadata.csproj +++ b/src/coreclr/nativeaot/System.Private.StackTraceMetadata/src/System.Private.StackTraceMetadata.csproj @@ -23,5 +23,7 @@ Internal\Runtime\StackTraceData.cs + + diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/AnalysisCharacteristicNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/AnalysisCharacteristicNode.cs new file mode 100644 index 00000000000000..1d667fd833d72c --- /dev/null +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/AnalysisCharacteristicNode.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +using ILCompiler.DependencyAnalysisFramework; + +namespace ILCompiler.DependencyAnalysis +{ + public class AnalysisCharacteristicNode : DependencyNodeCore + { + public AnalysisCharacteristicNode(string characteristic) + => Characteristic = characteristic; + + public string Characteristic { get; } + + public override bool InterestingForDynamicDependencyAnalysis => false; + public override bool HasDynamicDependencies => false; + public override bool HasConditionalStaticDependencies => false; + public override bool StaticDependenciesAreComputed => true; + public override IEnumerable GetConditionalStaticDependencies(NodeFactory context) => null; + public override IEnumerable GetStaticDependencies(NodeFactory context) => null; + public override IEnumerable SearchDynamicDependencies(List> markedNodes, int firstNode, NodeFactory context) => null; + protected override string GetName(NodeFactory context) => $"Analysis characteristic: {Characteristic}"; + } +} diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/MethodMetadataNode.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/MethodMetadataNode.cs index 8cccdf4b93ea93..f145aa9504eaaa 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/MethodMetadataNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/MethodMetadataNode.cs @@ -40,7 +40,9 @@ public MethodMetadataNode(MethodDesc method, bool isMinimal) public override IEnumerable GetStaticDependencies(NodeFactory factory) { DependencyList dependencies = new DependencyList(); - dependencies.Add(factory.TypeMetadata((MetadataType)_method.OwningType), "Owning type metadata"); + + var owningType = (MetadataType)_method.OwningType; + dependencies.Add(factory.TypeMetadata(owningType), "Owning type metadata"); if (!_isMinimal) { @@ -77,6 +79,12 @@ public override IEnumerable GetStaticDependencies(NodeFacto { GenericArgumentDataFlow.ProcessGenericArgumentDataFlow(ref dependencies, factory, new MessageOrigin(_method), parameterType, _method); } + + if (_method.HasCustomAttribute("System.Diagnostics", "StackTraceHiddenAttribute") + || owningType.HasCustomAttribute("System.Diagnostics", "StackTraceHiddenAttribute")) + { + dependencies.Add(factory.AnalysisCharacteristic("StackTraceHiddenMetadataPresent"), "Method is StackTraceHidden"); + } } return dependencies; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs index ef6a4fed1c1949..8afd930fb88383 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs @@ -604,6 +604,11 @@ private void CreateNodeCaches() return new ProxyTypeMapRequestNode(type); }); + _analysisCharacteristics = new NodeCache(c => + { + return new AnalysisCharacteristicNode(c); + }); + NativeLayout = new NativeLayoutHelper(this); } @@ -1526,6 +1531,12 @@ public ProxyTypeMapRequestNode ProxyTypeMapRequest(TypeDesc type) return _proxyTypeMapRequests.GetOrAdd(type); } + private NodeCache _analysisCharacteristics; + public AnalysisCharacteristicNode AnalysisCharacteristic(string ch) + { + return _analysisCharacteristics.GetOrAdd(ch); + } + /// /// Returns alternative symbol name that object writer should produce for given symbols /// in addition to the regular one. diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs index d9ad0888ee2f4b..18fdd2f65550eb 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ILScanner.cs @@ -310,6 +310,15 @@ public TypeMapManager GetTypeMapManager() return new ScannedTypeMapManager(_factory); } + public IEnumerable GetAnalysisCharacteristics() + { + foreach (DependencyNodeCore n in MarkedNodes) + { + if (n is AnalysisCharacteristicNode acn) + yield return acn.Characteristic; + } + } + private sealed class ScannedVTableProvider : VTableSliceProvider { private readonly Dictionary _vtableSlices = new Dictionary(); diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/SubstitutedILProvider.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/SubstitutedILProvider.cs index 8476dd391808bd..d455183bb0b5ae 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/SubstitutedILProvider.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/SubstitutedILProvider.cs @@ -10,6 +10,7 @@ using ILCompiler.DependencyAnalysis; using Internal.IL; +using Internal.IL.Stubs; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; @@ -24,13 +25,15 @@ public class SubstitutedILProvider : ILProvider private readonly SubstitutionProvider _substitutionProvider; private readonly DevirtualizationManager _devirtualizationManager; private readonly MetadataManager _metadataManager; + private readonly HashSet _characteristics; - public SubstitutedILProvider(ILProvider nestedILProvider, SubstitutionProvider substitutionProvider, DevirtualizationManager devirtualizationManager, MetadataManager metadataManager = null) + public SubstitutedILProvider(ILProvider nestedILProvider, SubstitutionProvider substitutionProvider, DevirtualizationManager devirtualizationManager, MetadataManager metadataManager = null, IEnumerable characteristics = null) { _nestedILProvider = nestedILProvider; _substitutionProvider = substitutionProvider; _devirtualizationManager = devirtualizationManager; _metadataManager = metadataManager; + _characteristics = characteristics != null ? new HashSet(characteristics) : null; } public override MethodIL GetMethodIL(MethodDesc method) @@ -41,6 +44,13 @@ public override MethodIL GetMethodIL(MethodDesc method) return substitution.EmitIL(method); } + if (TryGetCharacteristicValue(method, out bool characteristicEnabled)) + { + return new ILStubMethodIL(method, + [characteristicEnabled ? (byte)ILOpCode.Ldc_i4_1 : (byte)ILOpCode.Ldc_i4_0, (byte)ILOpCode.Ret], + [], []); + } + // BEGIN TEMPORARY WORKAROUND // // The following lines should just be: @@ -819,6 +829,11 @@ private bool TryGetConstantArgument(MethodIL methodIL, byte[] body, OpcodeFlags[ { return true; } + else if (TryGetCharacteristicValue(method, out bool characteristic)) + { + constant = characteristic ? 1 : 0; + return true; + } else { constant = 0; @@ -1127,6 +1142,19 @@ private static bool ReadGetTypeFromHandle(ref ILReader reader, MethodIL methodIL return true; } + private bool TryGetCharacteristicValue(MethodDesc maybeCharacteristicMethod, out bool value) + { + if (maybeCharacteristicMethod.IsIntrinsic + && maybeCharacteristicMethod.HasCustomAttribute("System.Runtime.CompilerServices", "AnalysisCharacteristicAttribute")) + { + value = _characteristics == null || _characteristics.Contains(maybeCharacteristicMethod.Name); + return true; + } + + value = false; + return false; + } + private sealed class SubstitutedMethodIL : MethodIL { private readonly byte[] _body; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs index 92e8126b482dd1..799a17899a6779 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.cs @@ -61,6 +61,8 @@ public enum ImportState : byte private bool _isReadOnly; private TypeDesc _constrained; + private int _currentInstructionOffset; + private int _previousInstructionOffset; private DependencyList _dependencies; private BasicBlock _lateBasicBlocks; @@ -258,6 +260,13 @@ private void StartImportingBasicBlock(BasicBlock basicBlock) _typeEqualityPatternAnalyzer = default; _isInstCheckPatternAnalyzer = default; + _currentInstructionOffset = 0; + _previousInstructionOffset = -1; + } + + private void StartImportingInstruction() + { + _currentInstructionOffset = _currentOffset; } partial void StartImportingInstruction(ILOpcode opcode) @@ -271,6 +280,8 @@ private void EndImportingInstruction() // The instruction should have consumed any prefixes. _constrained = null; _isReadOnly = false; + + _previousInstructionOffset = _currentInstructionOffset; } private void ImportCasting(ILOpcode opcode, int token) @@ -853,6 +864,17 @@ private void ImportBranch(ILOpcode opcode, BasicBlock target, BasicBlock fallthr } } + if (opcode == ILOpcode.brfalse && _previousInstructionOffset >= 0) + { + var reader = new ILReader(_ilBytes, _previousInstructionOffset); + if (reader.ReadILOpcode() == ILOpcode.call + && _methodIL.GetObject(reader.ReadILToken()) is MethodDesc { IsIntrinsic: true } intrinsicMethod + && intrinsicMethod.HasCustomAttribute("System.Runtime.CompilerServices", "AnalysisCharacteristicAttribute")) + { + condition = _factory.AnalysisCharacteristic(intrinsicMethod.Name); + } + } + ImportFallthrough(target); if (fallthrough != null) @@ -1531,7 +1553,6 @@ private DefType GetWellKnownType(WellKnownType wellKnownType) return _compilation.TypeSystemContext.GetWellKnownType(wellKnownType); } - private static void StartImportingInstruction() { } private static void ImportNop() { } private static void ImportBreak() { } private static void ImportLoadVar(int index, bool argument) { } diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csproj b/src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csproj index 3ac5cfb27289d4..862404c49d4eb6 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csproj +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csproj @@ -347,6 +347,7 @@ + diff --git a/src/coreclr/tools/aot/ILCompiler/Program.cs b/src/coreclr/tools/aot/ILCompiler/Program.cs index 6a2b680f279ab6..04795875d6d071 100644 --- a/src/coreclr/tools/aot/ILCompiler/Program.cs +++ b/src/coreclr/tools/aot/ILCompiler/Program.cs @@ -534,7 +534,7 @@ void RunScanner() substitutionProvider = new SubstitutionProvider(logger, featureSwitches, substitutions); - ilProvider = new SubstitutedILProvider(unsubstitutedILProvider, substitutionProvider, devirtualizationManager, metadataManager); + ilProvider = new SubstitutedILProvider(unsubstitutedILProvider, substitutionProvider, devirtualizationManager, metadataManager, scanResults.GetAnalysisCharacteristics()); // Use a more precise IL provider that uses whole program analysis for dead branch elimination builder.UseILProvider(ilProvider); diff --git a/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.cs b/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.cs new file mode 100644 index 00000000000000..863b2708f1b6bc --- /dev/null +++ b/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; + +[Type] +class Program +{ + [Method] + static int Main() + { + // Sanity check: we don't currently expect attributes on types to be optimized away + if (GetTypeSecretly(nameof(TypeAttribute)) == null) + throw new Exception("Type"); + + // Main should be reflection visible + if (MethodBase.GetCurrentMethod().Name != nameof(Main)) + throw new Exception("Name"); + +#if !DEBUG + // But we should have optimized out the attributes on it + if (GetTypeSecretly(nameof(MethodAttribute)) != null) + throw new Exception("Method"); +#endif + + return 100; + } + + [UnconditionalSuppressMessage("Trimming", "IL2057", Justification = "That's the point")] + static Type GetTypeSecretly(string name) => Type.GetType(name); +} + +class MethodAttribute : Attribute; +class TypeAttribute : Attribute; diff --git a/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.csproj b/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.csproj new file mode 100644 index 00000000000000..e4650db0af37db --- /dev/null +++ b/src/tests/nativeaot/SmokeTests/AttributeTrimming/AttributeTrimming.csproj @@ -0,0 +1,12 @@ + + + Exe + 0 + true + true + false + + + + + From ca2a98f3cef49a97399f2eed9cd2c865a3143c98 Mon Sep 17 00:00:00 2001 From: Jacob Crawley Date: Fri, 15 Aug 2025 23:56:34 +0100 Subject: [PATCH 2/6] SVE2 FP APIs (#118332) Contributing towards [#115479](https://github.com/dotnet/runtime/issues/115479) Contains implementations for the set of [SVE2 FP APIs](https://github.com/dotnet/runtime/issues/94018#issuecomment-3025106850), aside from `ConvertToSingleOdd` and `ConvertToSingleOddRoundToOdd`. This is due to concerns I have about the API proposal for these intrinsics being incorrect, when I have a resolution to [my comments](https://github.com/dotnet/runtime/issues/94018#issuecomment-3126709279) on this they will be implemented. --- src/coreclr/jit/codegenarm64test.cpp | 64 +-- src/coreclr/jit/emitarm64sve.cpp | 34 +- src/coreclr/jit/hwintrinsic.h | 2 + src/coreclr/jit/hwintrinsicarm64.cpp | 41 ++ src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 104 ++--- src/coreclr/jit/hwintrinsiclistarm64sve.h | 15 +- src/coreclr/jit/lowerarmarch.cpp | 6 + src/coreclr/jit/lsraarm64.cpp | 6 + .../Arm/Sve2.PlatformNotSupported.cs | 250 +++++++++++ .../src/System/Runtime/Intrinsics/Arm/Sve2.cs | 251 +++++++++++ .../ref/System.Runtime.Intrinsics.cs | 36 ++ .../GenerateHWIntrinsicTests/Arm/Sve2Tests.cs | 184 ++++++++ .../GenerateHWIntrinsicTests/Arm/SveTests.cs | 4 +- .../GenerateHWIntrinsicTests/Arm/Templates.cs | 3 +- .../HardwareIntrinsics/Arm/Shared/Helpers.cs | 417 ++++++++++++++++-- 15 files changed, 1256 insertions(+), 161 deletions(-) diff --git a/src/coreclr/jit/codegenarm64test.cpp b/src/coreclr/jit/codegenarm64test.cpp index 496eca72fe44b9..2c7de903fded27 100644 --- a/src/coreclr/jit/codegenarm64test.cpp +++ b/src/coreclr/jit/codegenarm64test.cpp @@ -6977,19 +6977,19 @@ void CodeGen::genArm64EmitterUnitTestsSve() // IF_SVE_EK_3A theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V0, REG_V1, REG_V2, 0, INS_OPTS_SCALABLE_B); // CMLA ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V3, REG_V4, REG_V5, 90, + theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V3, REG_V4, REG_V5, 1, INS_OPTS_SCALABLE_H); // CMLA ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V7, REG_V8, 180, + theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V7, REG_V8, 2, INS_OPTS_SCALABLE_S); // CMLA ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V9, REG_V10, REG_V11, 270, + theEmitter->emitIns_R_R_R_I(INS_sve_cmla, EA_SCALABLE, REG_V9, REG_V10, REG_V11, 3, INS_OPTS_SCALABLE_D); // CMLA ., ., ., theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V12, REG_V13, REG_V14, 0, INS_OPTS_SCALABLE_B); // SQRDCMLAH ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V15, REG_V16, REG_V17, 90, + theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V15, REG_V16, REG_V17, 1, INS_OPTS_SCALABLE_H); // SQRDCMLAH ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V18, REG_V19, REG_V20, 180, + theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V18, REG_V19, REG_V20, 2, INS_OPTS_SCALABLE_S); // SQRDCMLAH ., ., ., - theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V21, REG_V22, REG_V23, 270, + theEmitter->emitIns_R_R_R_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V21, REG_V22, REG_V23, 3, INS_OPTS_SCALABLE_D); // SQRDCMLAH ., ., ., #ifdef ALL_ARM64_EMITTER_UNIT_TESTS_SVE_UNSUPPORTED @@ -7289,21 +7289,21 @@ void CodeGen::genArm64EmitterUnitTestsSve() INS_OPTS_SCALABLE_D); // USHLLT ., ., # // IF_SVE_FV_2A - theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V0, REG_V1, 90, + theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V0, REG_V1, 0, INS_OPTS_SCALABLE_B); // CADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V2, REG_V3, 90, + theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V2, REG_V3, 0, INS_OPTS_SCALABLE_H); // CADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V4, REG_V5, 270, + theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V4, REG_V5, 1, INS_OPTS_SCALABLE_S); // CADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V6, REG_V7, 270, + theEmitter->emitIns_R_R_I(INS_sve_cadd, EA_SCALABLE, REG_V6, REG_V7, 1, INS_OPTS_SCALABLE_D); // CADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V8, REG_V9, 270, + theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V8, REG_V9, 1, INS_OPTS_SCALABLE_B); // SQCADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V10, REG_V11, 270, + theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V10, REG_V11, 1, INS_OPTS_SCALABLE_H); // SQCADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V12, REG_V13, 90, + theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V12, REG_V13, 0, INS_OPTS_SCALABLE_S); // SQCADD ., ., ., - theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V14, REG_V15, 90, + theEmitter->emitIns_R_R_I(INS_sve_sqcadd, EA_SCALABLE, REG_V14, REG_V15, 0, INS_OPTS_SCALABLE_D); // SQCADD ., ., ., // IF_SVE_FY_3A @@ -7365,61 +7365,61 @@ void CodeGen::genArm64EmitterUnitTestsSve() // IF_SVE_FA_3A theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V0, REG_V7, REG_V1, 3, 0, INS_OPTS_SCALABLE_B); // CDOT .S, .B, .B[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 1, INS_OPTS_SCALABLE_B); // CDOT .S, .B, .B[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 2, INS_OPTS_SCALABLE_B); // CDOT .S, .B, .B[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 3, INS_OPTS_SCALABLE_B); // CDOT .S, .B, .B[], // IF_SVE_FA_3B theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V0, REG_V1, REG_V0, 0, 0, INS_OPTS_SCALABLE_H); // CDOT .D, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 1, INS_OPTS_SCALABLE_H); // CDOT .D, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 2, INS_OPTS_SCALABLE_H); // CDOT .D, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cdot, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 3, INS_OPTS_SCALABLE_H); // CDOT .D, .H, .H[], // IF_SVE_FB_3A theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V0, REG_V7, REG_V1, 3, 0, INS_OPTS_SCALABLE_H); // CMLA .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 1, INS_OPTS_SCALABLE_H); // CMLA .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 2, INS_OPTS_SCALABLE_H); // CMLA .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 3, INS_OPTS_SCALABLE_H); // CMLA .H, .H, .H[], // IF_SVE_FB_3B theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V0, REG_V1, REG_V0, 0, 0, INS_OPTS_SCALABLE_S); // CMLA .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 1, INS_OPTS_SCALABLE_S); // CMLA .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 2, INS_OPTS_SCALABLE_S); // CMLA .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_cmla, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 3, INS_OPTS_SCALABLE_S); // CMLA .S, .S, .S[], // IF_SVE_FC_3A theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V0, REG_V7, REG_V1, 3, 0, INS_OPTS_SCALABLE_H); // SQRDCMLAH .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V2, REG_V5, REG_V3, 2, 1, INS_OPTS_SCALABLE_H); // SQRDCMLAH .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V4, REG_V3, REG_V5, 1, 2, INS_OPTS_SCALABLE_H); // SQRDCMLAH .H, .H, .H[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V6, REG_V1, REG_V7, 0, 3, INS_OPTS_SCALABLE_H); // SQRDCMLAH .H, .H, .H[], // IF_SVE_FC_3B theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V0, REG_V1, REG_V0, 0, 0, INS_OPTS_SCALABLE_S); // SQRDCMLAH .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 90, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V2, REG_V3, REG_V5, 1, 1, INS_OPTS_SCALABLE_S); // SQRDCMLAH .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 180, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V4, REG_V5, REG_V10, 0, 2, INS_OPTS_SCALABLE_S); // SQRDCMLAH .S, .S, .S[], - theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 270, + theEmitter->emitIns_R_R_R_I_I(INS_sve_sqrdcmlah, EA_SCALABLE, REG_V6, REG_V7, REG_V15, 1, 3, INS_OPTS_SCALABLE_S); // SQRDCMLAH .S, .S, .S[], // IF_SVE_IH_3A diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index 10f2b195347479..83e367392ac9c7 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -2645,9 +2645,9 @@ void emitter::emitInsSve_R_R_I(instruction ins, assert(isVectorRegister(reg1)); // ddddd assert(isVectorRegister(reg2)); // nnnnn assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx + assert(isValidRot(emitDecodeRotationImm90_or_270(imm))); // Convert rot to bitwise representation: 0 if 90, 1 if 270 - imm = emitEncodeRotationImm90_or_270(imm); // r fmt = IF_SVE_FV_2A; break; @@ -4574,14 +4574,13 @@ void emitter::emitInsSve_R_R_R_I(instruction ins, case INS_sve_sqrdcmlah: assert(insScalableOptsNone(sopt)); assert(insOptsScalableStandard(opt)); - assert(isVectorRegister(reg1)); // ddddd - assert(isVectorRegister(reg2)); // nnnnn - assert(isVectorRegister(reg3)); // mmmmm - assert(isValidRot(imm)); // rr - assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx + assert(isVectorRegister(reg1)); // ddddd + assert(isVectorRegister(reg2)); // nnnnn + assert(isVectorRegister(reg3)); // mmmmm + assert(isValidRot(emitDecodeRotationImm0_to_270(imm))); // rr + assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx // Convert rot to bitwise representation - imm = emitEncodeRotationImm0_to_270(imm); fmt = IF_SVE_EK_3A; break; @@ -5785,12 +5784,12 @@ void emitter::emitInsSve_R_R_R_I_I(instruction ins, break; case INS_sve_cmla: - assert(isVectorRegister(reg1)); // ddddd - assert(isVectorRegister(reg2)); // nnnnn - assert(isLowVectorRegister(reg3)); // mmmm - assert(isValidRot(imm2)); // rr + assert(isVectorRegister(reg1)); // ddddd + assert(isVectorRegister(reg2)); // nnnnn + assert(isLowVectorRegister(reg3)); // mmmm + assert(isValidRot(emitDecodeRotationImm0_to_270(imm2))); // rr // Convert imm2 from rotation value (0-270) to bitwise representation (0-3) - imm = (imm1 << 2) | emitEncodeRotationImm0_to_270(imm2); + imm = (imm1 << 2) | imm2; if (opt == INS_OPTS_SCALABLE_H) { @@ -5807,13 +5806,12 @@ void emitter::emitInsSve_R_R_R_I_I(instruction ins, break; case INS_sve_sqrdcmlah: - assert(isVectorRegister(reg1)); // ddddd - assert(isVectorRegister(reg2)); // nnnnn - assert(isLowVectorRegister(reg3)); // mmmm - assert(isValidRot(imm2)); // rr - // Convert imm2 from rotation value (0-270) to bitwise representation (0-3) - imm = (imm1 << 2) | emitEncodeRotationImm0_to_270(imm2); + assert(isVectorRegister(reg1)); // ddddd + assert(isVectorRegister(reg2)); // nnnnn + assert(isLowVectorRegister(reg3)); // mmmm + assert(isValidRot(emitDecodeRotationImm0_to_270(imm2))); // rr + imm = (imm1 << 2) | imm2; if (opt == INS_OPTS_SCALABLE_H) { assert(isValidUimm<2>(imm1)); // ii diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 2929430ac566c2..5267d426237a79 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -1275,6 +1275,8 @@ struct HWIntrinsicInfo } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: case NI_Sve2_DotProductRotateComplexBySelectedIndex: { assert(sig->numArgs == 5); diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index dba081ee00a5a1..650919f3934e23 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -445,11 +445,15 @@ void HWIntrinsicInfo::lookupImmBounds( break; case NI_Sve_AddRotateComplex: + case NI_Sve2_AddRotateComplex: + case NI_Sve2_AddSaturateRotateComplex: immLowerBound = 0; immUpperBound = 1; break; case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex: case NI_Sve2_DotProductRotateComplex: immLowerBound = 0; immUpperBound = 3; @@ -493,6 +497,41 @@ void HWIntrinsicInfo::lookupImmBounds( } break; + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + if (immNumber == 1) + { + // Bounds for rotation + immLowerBound = 0; + immUpperBound = 3; + } + else + { + // Bounds for index + assert(immNumber == 2); + assert(baseType == TYP_USHORT || baseType == TYP_SHORT || baseType == TYP_INT || + baseType == TYP_UINT); + immLowerBound = 0; + immUpperBound = (baseType == TYP_USHORT || baseType == TYP_SHORT) ? 3 : 1; + } + break; + + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: + if (immNumber == 1) + { + // Bounds for rotation + immLowerBound = 0; + immUpperBound = 3; + } + else + { + // Bounds for index + assert(immNumber == 2); + assert(baseType == TYP_INT || baseType == TYP_SHORT); + immLowerBound = 0; + immUpperBound = (baseType == TYP_SHORT) ? 3 : 1; + } + break; + case NI_Sve_TrigonometricMultiplyAddCoefficient: immLowerBound = 0; immUpperBound = 7; @@ -3180,6 +3219,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: case NI_Sve2_DotProductRotateComplexBySelectedIndex: { assert(sig->numArgs == 5); diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index f04be0c243870d..13c7163c4fcbb1 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -583,6 +583,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_ConvertToInt32: case NI_Sve_ConvertToUInt32: case NI_Sve_ConvertToSingle: + case NI_Sve2_ConvertToSingleEvenRoundToOdd: { embOpt = emitTypeSize(intrinEmbMask.baseType) == EA_8BYTE ? INS_OPTS_D_TO_S : INS_OPTS_SCALABLE_S; @@ -592,6 +593,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_ConvertToInt64: case NI_Sve_ConvertToUInt64: case NI_Sve_ConvertToDouble: + case NI_Sve2_ConvertToDoubleOdd: { embOpt = emitTypeSize(intrinEmbMask.baseType) == EA_4BYTE ? INS_OPTS_S_TO_D : INS_OPTS_SCALABLE_D; @@ -2609,6 +2611,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } case NI_Sve_TrigonometricMultiplyAddCoefficient: + case NI_Sve2_AddRotateComplex: + case NI_Sve2_AddSaturateRotateComplex: { assert(isRMW); @@ -2629,6 +2633,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: { assert(isRMW); assert(hasImmediateOperand); @@ -2651,19 +2657,22 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) else { // Use the helper to generate a table. The table can only use a single lookup value, therefore - // the two immediates index (0 to 1, in op4Reg) and rotation (0 to 3, in op5Reg) must be - // combined to a single value (0 to 7) + // the two immediates index and rotation must be combined to a single value assert(!intrin.op4->isContainedIntOrIImmed() && !intrin.op5->isContainedIntOrIImmed()); emitAttr scalarSize = emitActualTypeSize(node->GetSimdBaseType()); - // Combine the two immediates into op4Reg - // Shift rotation left to be out of range of index - GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, 1); - // Combine the two values by ORing + var_types baseType = node->GetSimdBaseType(); + + const unsigned rotMask = 0b11; + const unsigned indexMask = (baseType == TYP_SHORT || baseType == TYP_USHORT) ? 0b11 : 0b1; + const unsigned numIndexBits = genCountBits(indexMask); + + GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, numIndexBits); GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); - // Generate the table using the combined immediate - HWIntrinsicImmOpHelper helper(this, op4Reg, 0, 7, node, (targetReg != op1Reg) ? 2 : 1); + const unsigned upperBound = (rotMask << numIndexBits) | indexMask; + HWIntrinsicImmOpHelper helper(this, op4Reg, 0, upperBound, node, (targetReg != op1Reg) ? 2 : 1); + for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) { if (targetReg != op1Reg) @@ -2673,17 +2682,15 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); } - // Extract index and rotation from the immediate const int value = helper.ImmValue(); - const ssize_t index = value & 1; - const ssize_t rotation = value >> 1; + const ssize_t index = value & indexMask; + const ssize_t rotation = value >> numIndexBits; GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, rotation, opt); } - // Restore the original values in op4Reg and op5Reg - GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, 1); - GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, 1); + GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, indexMask); + GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, numIndexBits); } break; @@ -2748,6 +2755,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op3Reg, op1Reg, INS_OPTS_SCALABLE_D); break; + case NI_Sve2_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex: case NI_Sve2_DotProductRotateComplex: { assert(isRMW); @@ -2798,61 +2807,34 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) var_types baseType = node->GetSimdBaseType(); - if (baseType == TYP_BYTE) - { - GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, 2); - GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); + const unsigned rotMask = 0b11; + const unsigned indexMask = (baseType == TYP_BYTE) ? 0b11 : 0b1; + const unsigned numIndexBits = genCountBits(indexMask); - // index and rotation both take values 0 to 3 so must be - // combined to a single value (0 to 15) - HWIntrinsicImmOpHelper helper(this, op4Reg, 0, 15, node, (targetReg != op1Reg) ? 2 : 1); - for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) - { - if (targetReg != op1Reg) - { - assert(targetReg != op2Reg); - assert(targetReg != op3Reg); - GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); - } + GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, numIndexBits); + GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); - const int value = helper.ImmValue(); - const ssize_t index = value & 3; - const ssize_t rotation = (value >> 2) & 3; - GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, - rotation, opt); - } + const unsigned upperBound = (rotMask << numIndexBits) | indexMask; + HWIntrinsicImmOpHelper helper(this, op4Reg, 0, upperBound, node, (targetReg != op1Reg) ? 2 : 1); - GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, 3); - GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, 2); - } - else + for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) { - assert(baseType == TYP_SHORT); - GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, 1); - GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); - - // index (0 to 1, in op4Reg) and rotation (0 to 3, in op5Reg) must be - // combined to a single value (0 to 7) - HWIntrinsicImmOpHelper helper(this, op4Reg, 0, 7, node, (targetReg != op1Reg) ? 2 : 1); - for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) + if (targetReg != op1Reg) { - if (targetReg != op1Reg) - { - assert(targetReg != op2Reg); - assert(targetReg != op3Reg); - GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); - } - - const int value = helper.ImmValue(); - const ssize_t index = value & 1; - const ssize_t rotation = value >> 1; - GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, - rotation, opt); + assert(targetReg != op2Reg); + assert(targetReg != op3Reg); + GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); } - GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, 1); - GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, 1); + const int value = helper.ImmValue(); + const ssize_t index = value & indexMask; + const ssize_t rotation = value >> numIndexBits; + GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, rotation, + opt); } + + GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, indexMask); + GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, numIndexBits); } break; diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 90ed46def1308b..56cc4d3c2d9e3e 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -326,9 +326,11 @@ HARDWARE_INTRINSIC(Sve2, AddHighNarrowingEven, HARDWARE_INTRINSIC(Sve2, AddHighNarrowingOdd, -1, 3, {INS_sve_addhnt, INS_sve_addhnt, INS_sve_addhnt, INS_sve_addhnt, INS_sve_addhnt, INS_sve_addhnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, AddPairwise, -1, -1, {INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_addp, INS_sve_faddp, INS_sve_faddp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation|HW_Flag_ReduceOperation) HARDWARE_INTRINSIC(Sve2, AddPairwiseWideningAndAdd, -1, -1, {INS_invalid, INS_invalid, INS_sve_sadalp, INS_sve_uadalp, INS_sve_sadalp, INS_sve_uadalp, INS_sve_sadalp, INS_sve_uadalp, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve2, AddRotateComplex, -1, 3, {INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_sve_cadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Sve2, AddRoundedHighNarrowingEven, -1, 2, {INS_sve_raddhnb, INS_sve_raddhnb, INS_sve_raddhnb, INS_sve_raddhnb, INS_sve_raddhnb, INS_sve_raddhnb, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, AddRoundedHighNarrowingOdd, -1, 3, {INS_sve_raddhnt, INS_sve_raddhnt, INS_sve_raddhnt, INS_sve_raddhnt, INS_sve_raddhnt, INS_sve_raddhnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, AddSaturate, -1, -1, {INS_sve_sqadd, INS_sve_uqadd, INS_sve_sqadd, INS_sve_uqadd, INS_sve_sqadd, INS_sve_uqadd, INS_sve_sqadd, INS_sve_uqadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_OptionalEmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve2, AddSaturateRotateComplex, -1, 3, {INS_sve_sqcadd, INS_invalid, INS_sve_sqcadd, INS_invalid, INS_sve_sqcadd, INS_invalid, INS_sve_sqcadd, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Sve2, AddSaturateWithSignedAddend, -1, -1, {INS_invalid, INS_sve_usqadd, INS_invalid, INS_sve_usqadd, INS_invalid, INS_sve_usqadd, INS_invalid, INS_sve_usqadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, AddSaturateWithUnsignedAddend, -1, -1, {INS_sve_suqadd, INS_invalid, INS_sve_suqadd, INS_invalid, INS_sve_suqadd, INS_invalid, INS_sve_suqadd, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, AddWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_sve_saddwb, INS_sve_uaddwb, INS_sve_saddwb, INS_sve_uaddwb, INS_sve_saddwb, INS_sve_uaddwb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen) @@ -338,18 +340,25 @@ HARDWARE_INTRINSIC(Sve2, BitwiseClearXor, HARDWARE_INTRINSIC(Sve2, BitwiseSelect, -1, 3, {INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectLeftInverted, -1, 3, {INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectRightInverted, -1, 3, {INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) -HARDWARE_INTRINSIC(Sve2, DotProductRotateComplex, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) -HARDWARE_INTRINSIC(Sve2, DotProductRotateComplexBySelectedIndex, -1, 5, {INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg) +HARDWARE_INTRINSIC(Sve2, ConvertToDoubleOdd, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fcvtlt, INS_sve_fcvtlt}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve2, ConvertToSingleEvenRoundToOdd, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fcvtx, INS_sve_fcvtx}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve2, DotProductRotateComplex, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve2, DotProductRotateComplexBySelectedIndex, -1, 5, {INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg) HARDWARE_INTRINSIC(Sve2, FusedAddHalving, -1, -1, {INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedAddRoundedHalving, -1, -1, {INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedSubtractHalving, -1, -1, {INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, InterleavingXorEvenOdd, -1, 3, {INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, InterleavingXorOddEven, -1, 3, {INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, Log2, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_flogb, INS_invalid, INS_sve_flogb, INS_invalid, INS_sve_flogb, INS_sve_flogb}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, MaxNumberPairwise, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnmp, INS_sve_fmaxnmp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MaxPairwise, -1, -1, {INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_fmaxp, INS_sve_fmaxp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_ReduceOperation) HARDWARE_INTRINSIC(Sve2, MinNumberPairwise, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fminnmp, INS_sve_fminnmp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MinPairwise, -1, -1, {INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_fminp, INS_sve_fminp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_ReduceOperation) HARDWARE_INTRINSIC(Sve2, MultiplyAddBySelectedScalar, -1, 4, {INS_invalid, INS_invalid, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyAddRotateComplex, -1, 4, {INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve2, MultiplyAddRotateComplexBySelectedScalar, -1, 5, {INS_invalid, INS_invalid, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_sve_cmla, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport) +HARDWARE_INTRINSIC(Sve2, MultiplyAddRoundedDoublingSaturateHighRotateComplex, -1, 4, {INS_sve_sqrdcmlah, INS_invalid, INS_sve_sqrdcmlah, INS_invalid, INS_sve_sqrdcmlah, INS_invalid, INS_sve_sqrdcmlah, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve2, MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar, -1, 5, {INS_invalid, INS_invalid, INS_sve_sqrdcmlah, INS_invalid, INS_sve_sqrdcmlah, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalar, -1, 3, {INS_invalid, INS_invalid, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningEven, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smullb, INS_sve_umullb, INS_sve_smullb, INS_sve_umullb, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningEvenAndAdd, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smlalb, INS_sve_umlalb, INS_sve_smlalb, INS_sve_umlalb, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) @@ -390,6 +399,8 @@ HARDWARE_INTRINSIC(Sve2, NegateSaturate, HARDWARE_INTRINSIC(Sve2, PolynomialMultiply, -1, 2, {INS_sve_pmul, INS_sve_pmul, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, PolynomialMultiplyWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullb, INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, PolynomialMultiplyWideningOdd, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullt, INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) +HARDWARE_INTRINSIC(Sve2, ReciprocalEstimate, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_urecpe, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve2, ReciprocalSqrtEstimate, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ursqrte, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, ShiftArithmeticRounded, -1, -1, {INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, ShiftArithmeticRoundedSaturate, -1, -1, {INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, ShiftArithmeticSaturate, -1, -1, {INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index bb336a6a8ce4c9..5fd53c25fbb137 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -3862,6 +3862,8 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_AddRotateComplex: case NI_Sve_TrigonometricMultiplyAddCoefficient: case NI_Sve2_ShiftLeftAndInsert: + case NI_Sve2_AddRotateComplex: + case NI_Sve2_AddSaturateRotateComplex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op3)); if (intrin.op3->IsCnsIntOrI()) @@ -4066,6 +4068,8 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_FusedMultiplyAddBySelectedScalar: case NI_Sve_FusedMultiplySubtractBySelectedScalar: case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex: case NI_Sve2_DotProductRotateComplex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); @@ -4124,6 +4128,8 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: case NI_Sve2_DotProductRotateComplexBySelectedIndex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index b736fe3debf27f..d9712b31506bab 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1710,6 +1710,8 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: case NI_Sve2_DotProductRotateComplexBySelectedIndex: // This API has two immediates, one of which is used to index pairs of floats in a vector. // For a vector width of 128 bits, this means the index's range is [0, 1], @@ -1735,6 +1737,8 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRotateComplex: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex: case NI_Sve2_DotProductRotateComplex: needBranchTargetReg = !intrin.op4->isContainedIntOrIImmed(); break; @@ -2168,6 +2172,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: case NI_Sve2_DotProductRotateComplexBySelectedIndex: case NI_Sve2_MultiplyAddBySelectedScalar: + case NI_Sve2_MultiplyAddRotateComplexBySelectedScalar: case NI_Sve2_MultiplyBySelectedScalarWideningEvenAndAdd: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd: case NI_Sve2_MultiplySubtractBySelectedScalar: @@ -2179,6 +2184,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd: case NI_Sve2_MultiplyRoundedDoublingSaturateBySelectedScalarAndAddHigh: case NI_Sve2_MultiplyRoundedDoublingSaturateBySelectedScalarAndSubtractHigh: + case NI_Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar: isLowVectorOpNum = (opNum == 3); break; case NI_Sve_MultiplyBySelectedScalar: diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs index 032c2d57e8ff49..bcab1359869df7 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs @@ -513,6 +513,55 @@ internal Arm64() { } /// public static Vector AddPairwiseWideningAndAdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Complex add with rotate + + /// + /// svuint8_t svcadd[_u8](svuint8_t op1, svuint8_t op2, uint64_t imm_rotation) + /// CADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svcadd[_s16](svint16_t op1, svint16_t op2, uint64_t imm_rotation) + /// CADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svcadd[_s32](svint32_t op1, svint32_t op2, uint64_t imm_rotation) + /// CADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svcadd[_s64](svint64_t op1, svint64_t op2, uint64_t imm_rotation) + /// CADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svcadd[_s8](svint8_t op1, svint8_t op2, uint64_t imm_rotation) + /// CADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svcadd[_u16](svuint16_t op1, svuint16_t op2, uint64_t imm_rotation) + /// CADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svcadd[_u32](svuint32_t op1, svuint32_t op2, uint64_t imm_rotation) + /// CADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svcadd[_u64](svuint64_t op1, svuint64_t op2, uint64_t imm_rotation) + /// CADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } // Rounding add narrow high part (bottom) @@ -674,6 +723,32 @@ internal Arm64() { } /// public static new Vector AddSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Saturating complex add with rotate + + /// + /// svint16_t svqcadd[_s16](svint16_t op1, svint16_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqcadd[_s32](svint32_t op1, svint32_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqcadd[_s64](svint64_t op1, svint64_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svqcadd[_s8](svint8_t op1, svint8_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw new PlatformNotSupportedException(); } + // Saturating add with signed addend /// @@ -1147,6 +1222,26 @@ internal Arm64() { } /// public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + // Up convert long (top) + + /// + /// svfloat64_t svcvtlt_f64[_f32]_m(svfloat64_t inactive, svbool_t pg, svfloat32_t op) + /// svfloat64_t svcvtlt_f64[_f32]_x(svbool_t pg, svfloat32_t op) + /// FCVTLT Ztied.D, Pg/M, Zop.S + /// FCVTLT Ztied.D, Pg/M, Ztied.S + /// + public static Vector ConvertToDoubleOdd(Vector value) { throw new PlatformNotSupportedException(); } + + // Down convert, rounding to odd + + /// + /// svfloat32_t svcvtx_f32[_f64]_m(svfloat32_t inactive, svbool_t pg, svfloat64_t op) + /// svfloat32_t svcvtx_f32[_f64]_x(svbool_t pg, svfloat64_t op) + /// svfloat32_t svcvtx_f32[_f64]_z(svbool_t pg, svfloat64_t op) + /// FCVTX Ztied.S, Pg/M, Zop.D + /// FCVTX Ztied.S, Pg/M, Ztied.D + /// + public static unsafe Vector ConvertToSingleEvenRoundToOdd(Vector value) { throw new PlatformNotSupportedException(); } // Halving add @@ -1462,6 +1557,26 @@ internal Arm64() { } /// public static Vector InterleavingXorOddEven(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Base 2 logarithm as integer + + /// + /// svint32_t svlogb[_f32]_m(svint32_t inactive, svbool_t pg, svfloat32_t op) + /// svint32_t svlogb[_f32]_x(svbool_t pg, svfloat32_t op) + /// svint32_t svlogb[_f32]_z(svbool_t pg, svfloat32_t op) + /// FLOGB Ztied.S, Pg/M, Zop.S + /// FLOGB Ztied.S, Pg/M, Ztied.S + /// + public static Vector Log2(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svlogb[_f64]_m(svint64_t inactive, svbool_t pg, svfloat64_t op) + /// svint64_t svlogb[_f64]_x(svbool_t pg, svfloat64_t op) + /// svint64_t svlogb[_f64]_z(svbool_t pg, svfloat64_t op) + /// FLOGB Ztied.D, Pg/M, Zop.D + /// FLOGB Ztied.D, Pg/M, Ztied.D + /// + public static Vector Log2(Vector value) { throw new PlatformNotSupportedException(); } + // Maximum number pairwise /// @@ -1676,6 +1791,120 @@ internal Arm64() { } /// public static Vector MultiplyAddBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + // Complex multiply-add with rotate + + /// + /// svuint8_t svcmla[_u8](svuint8_t op1, svuint8_t op2, svuint8_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svcmla[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svcmla[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svcmla[_s64](svint64_t op1, svint64_t op2, svint64_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svcmla[_s8](svint8_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svcmla[_u16](svuint16_t op1, svuint16_t op2, svuint16_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svcmla[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svcmla[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + // Complex multiply-add with rotate + + /// + /// svint16_t svcmla_lane[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svcmla_lane[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svcmla_lane[_u16](svuint16_t op1, svuint16_t op2, svuint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svcmla_lane[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + // Saturating rounding doubling complex multiply-add high with rotate + + /// + /// svint16_t svqrdcmlah[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static unsafe Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqrdcmlah[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static unsafe Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqrdcmlah[_s64](svint64_t op1, svint64_t op2, svint64_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static unsafe Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svqrdcmlah[_s8](svint8_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static unsafe Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqrdcmlah_lane[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqrdcmlah_lane[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + // Multiply-add long (bottom) @@ -2666,6 +2895,27 @@ internal Arm64() { } /// public static Vector NegateSaturate(Vector value) { throw new PlatformNotSupportedException(); } + // Reciprocal estimate + + /// + /// svuint32_t svrecpe[_u32]_m(svuint32_t inactive, svbool_t pg, svuint32_t op) + /// svuint32_t svrecpe[_u32]_x(svbool_t pg, svuint32_t op) + /// svuint32_t svrecpe[_u32]_z(svbool_t pg, svuint32_t op) + /// URECPE Ztied.S, Pg/M, Zop.S + /// URECPE Ztied.S, Pg/M, Ztied.S + /// + public static Vector ReciprocalEstimate(Vector value) { throw new PlatformNotSupportedException(); } + + // Reciprocal square root estimate + + /// + /// svuint32_t svrsqrte[_u32]_m(svuint32_t inactive, svbool_t pg, svuint32_t op) + /// svuint32_t svrsqrte[_u32]_x(svbool_t pg, svuint32_t op) + /// svuint32_t svrsqrte[_u32]_z(svbool_t pg, svuint32_t op) + /// URSQRTE Ztied.S, Pg/M, Zop.S + /// URSQRTE Ztied.S, Pg/M, Ztied.S + /// + public static Vector ReciprocalSqrtEstimate(Vector value) { throw new PlatformNotSupportedException(); } // Rounding shift left diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs index 3f9545d4290a7c..815909fa63c7fc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs @@ -512,6 +512,55 @@ internal Arm64() { } /// public static Vector AddPairwiseWideningAndAdd(Vector left, Vector right) => AddPairwiseWideningAndAdd(left, right); + // Complex add with rotate + + /// + /// svuint8_t svcadd[_u8](svuint8_t op1, svuint8_t op2, uint64_t imm_rotation) + /// CADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svint16_t svcadd[_s16](svint16_t op1, svint16_t op2, uint64_t imm_rotation) + /// CADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svint32_t svcadd[_s32](svint32_t op1, svint32_t op2, uint64_t imm_rotation) + /// CADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svint64_t svcadd[_s64](svint64_t op1, svint64_t op2, uint64_t imm_rotation) + /// CADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svint8_t svcadd[_s8](svint8_t op1, svint8_t op2, uint64_t imm_rotation) + /// CADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svuint16_t svcadd[_u16](svuint16_t op1, svuint16_t op2, uint64_t imm_rotation) + /// CADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svuint32_t svcadd[_u32](svuint32_t op1, svuint32_t op2, uint64_t imm_rotation) + /// CADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); + + /// + /// svuint64_t svcadd[_u64](svuint64_t op1, svuint64_t op2, uint64_t imm_rotation) + /// CADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddRotateComplex(Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddRotateComplex(left, right, rotation); // Rounding add narrow high part (bottom) @@ -673,6 +722,33 @@ internal Arm64() { } /// public static new Vector AddSaturate(Vector left, Vector right) => AddSaturate(left, right); + // Saturating complex add with rotate + + /// + /// svint16_t svqcadd[_s16](svint16_t op1, svint16_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.H, Ztied1.H, Zop2.H, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddSaturateRotateComplex(op1, op2, rotation); + + /// + /// svint32_t svqcadd[_s32](svint32_t op1, svint32_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.S, Ztied1.S, Zop2.S, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddSaturateRotateComplex(op1, op2, rotation); + + /// + /// svint64_t svqcadd[_s64](svint64_t op1, svint64_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.D, Ztied1.D, Zop2.D, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddSaturateRotateComplex(op1, op2, rotation); + + /// + /// svint8_t svqcadd[_s8](svint8_t op1, svint8_t op2, uint64_t imm_rotation) + /// SQCADD Ztied1.B, Ztied1.B, Zop2.B, #imm_rotation + /// + public static Vector AddSaturateRotateComplex(Vector op1, Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) => AddSaturateRotateComplex(op1, op2, rotation); + + // Saturating add with signed addend /// @@ -1146,6 +1222,26 @@ internal Arm64() { } /// public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductRotateComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); + // Up convert long (top) + + /// + /// svfloat64_t svcvtlt_f64[_f32]_m(svfloat64_t inactive, svbool_t pg, svfloat32_t op) + /// svfloat64_t svcvtlt_f64[_f32]_x(svbool_t pg, svfloat32_t op) + /// FCVTLT Ztied.D, Pg/M, Zop.S + /// FCVTLT Ztied.D, Pg/M, Ztied.S + /// + public static Vector ConvertToDoubleOdd(Vector value) => ConvertToDoubleOdd(value); + + // Down convert, rounding to odd + + /// + /// svfloat32_t svcvtx_f32[_f64]_m(svfloat32_t inactive, svbool_t pg, svfloat64_t op) + /// svfloat32_t svcvtx_f32[_f64]_x(svbool_t pg, svfloat64_t op) + /// svfloat32_t svcvtx_f32[_f64]_z(svbool_t pg, svfloat64_t op) + /// FCVTX Ztied.S, Pg/M, Zop.D + /// FCVTX Ztied.S, Pg/M, Ztied.D + /// + public static Vector ConvertToSingleEvenRoundToOdd(Vector value) => ConvertToSingleEvenRoundToOdd(value); // Halving add @@ -1461,6 +1557,26 @@ internal Arm64() { } /// public static Vector InterleavingXorOddEven(Vector even, Vector left, Vector right) => InterleavingXorOddEven(even, left, right); + // Base 2 logarithm as integer + + /// + /// svint32_t svlogb[_f32]_m(svint32_t inactive, svbool_t pg, svfloat32_t op) + /// svint32_t svlogb[_f32]_x(svbool_t pg, svfloat32_t op) + /// svint32_t svlogb[_f32]_z(svbool_t pg, svfloat32_t op) + /// FLOGB Ztied.S, Pg/M, Zop.S + /// FLOGB Ztied.S, Pg/M, Ztied.S + /// + public static Vector Log2(Vector value) => Log2(value); + + /// + /// svint64_t svlogb[_f64]_m(svint64_t inactive, svbool_t pg, svfloat64_t op) + /// svint64_t svlogb[_f64]_x(svbool_t pg, svfloat64_t op) + /// svint64_t svlogb[_f64]_z(svbool_t pg, svfloat64_t op) + /// FLOGB Ztied.D, Pg/M, Zop.D + /// FLOGB Ztied.D, Pg/M, Ztied.D + /// + public static Vector Log2(Vector value) => Log2(value); + // Maximum number pairwise /// @@ -1699,6 +1815,120 @@ internal Arm64() { } /// public static Vector MultiplyAddBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyAddBySelectedScalar(addend, left, right, rightIndex); + // Complex multiply-add with rotate + + /// + /// svuint8_t svcmla[_u8](svuint8_t op1, svuint8_t op2, svuint8_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svint16_t svcmla[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svint32_t svcmla[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svint64_t svcmla[_s64](svint64_t op1, svint64_t op2, svint64_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svint8_t svcmla[_s8](svint8_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svuint16_t svcmla[_u16](svuint16_t op1, svuint16_t op2, svuint16_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svuint32_t svcmla[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + /// + /// svuint64_t svcmla[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3, uint64_t imm_rotation) + /// CMLA Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static Vector MultiplyAddRotateComplex(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplex(addend, left, right, rotation); + + // Complex multiply-add with rotate + + /// + /// svint16_t svcmla_lane[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplexBySelectedScalar(addend, left, right, rightIndex, rotation); + + /// + /// svint32_t svcmla_lane[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplexBySelectedScalar(addend, left, right, rightIndex, rotation); + + /// + /// svuint16_t svcmla_lane[_u16](svuint16_t op1, svuint16_t op2, svuint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplexBySelectedScalar(addend, left, right, rightIndex, rotation); + + /// + /// svuint32_t svcmla_lane[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CMLA Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRotateComplexBySelectedScalar(Vector addend, Vector left, Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRotateComplexBySelectedScalar(addend, left, right, rightIndex, rotation); + + // Saturating rounding doubling complex multiply-add high with rotate + + /// + /// svint16_t svqrdcmlah[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.H, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplex(op1, op2, op3, rotation); + + /// + /// svint32_t svqrdcmlah[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.S, Zop2.S, Zop3.S, #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplex(op1, op2, op3, rotation); + + /// + /// svint64_t svqrdcmlah[_s64](svint64_t op1, svint64_t op2, svint64_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.D, Zop2.D, Zop3.D, #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplex(op1, op2, op3, rotation); + + /// + /// svint8_t svqrdcmlah[_s8](svint8_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.B, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplex(op1, op2, op3, rotation); + + /// + /// svint16_t svqrdcmlah_lane[_s16](svint16_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.H, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(op1, op2, op3, imm_index, rotation); + + /// + /// svint32_t svqrdcmlah_lane[_s32](svint32_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// SQRDCMLAH Ztied1.S, Zop2.S, Zop3.S[imm_index], #imm_rotation + /// + public static Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(op1, op2, op3, imm_index, rotation); + // Multiply-add long (bottom) @@ -2689,6 +2919,27 @@ internal Arm64() { } /// public static Vector NegateSaturate(Vector value) => NegateSaturate(value); + // Reciprocal estimate + + /// + /// svuint32_t svrecpe[_u32]_m(svuint32_t inactive, svbool_t pg, svuint32_t op) + /// svuint32_t svrecpe[_u32]_x(svbool_t pg, svuint32_t op) + /// svuint32_t svrecpe[_u32]_z(svbool_t pg, svuint32_t op) + /// URECPE Ztied.S, Pg/M, Zop.S + /// URECPE Ztied.S, Pg/M, Ztied.S + /// + public static Vector ReciprocalEstimate(Vector value) => ReciprocalEstimate(value); + + // Reciprocal square root estimate + + /// + /// svuint32_t svrsqrte[_u32]_m(svuint32_t inactive, svbool_t pg, svuint32_t op) + /// svuint32_t svrsqrte[_u32]_x(svbool_t pg, svuint32_t op) + /// svuint32_t svrsqrte[_u32]_z(svbool_t pg, svuint32_t op) + /// URSQRTE Ztied.S, Pg/M, Zop.S + /// URSQRTE Ztied.S, Pg/M, Ztied.S + /// + public static Vector ReciprocalSqrtEstimate(Vector value) => ReciprocalSqrtEstimate(value); // Rounding shift left diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs index 384489481f9cd4..a4fd8d42365efd 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6181,6 +6181,14 @@ internal Arm64() { } public static System.Numerics.Vector AddPairwiseWideningAndAdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddPairwiseWideningAndAdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddPairwiseWideningAndAdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddRotateComplex(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } public static System.Numerics.Vector AddRoundedHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddRoundedHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddRoundedHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } @@ -6201,6 +6209,10 @@ internal Arm64() { } public static new System.Numerics.Vector AddSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static new System.Numerics.Vector AddSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static new System.Numerics.Vector AddSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector AddSaturateRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddSaturateRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddSaturateRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } + public static System.Numerics.Vector AddSaturateRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rotation) { throw null; } public static System.Numerics.Vector AddSaturateWithSignedAddend(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddSaturateWithSignedAddend(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AddSaturateWithSignedAddend(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } @@ -6268,6 +6280,8 @@ internal Arm64() { } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector ConvertToDoubleOdd(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector ConvertToSingleEvenRoundToOdd(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector DotProductRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector DotProductRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector DotProductRotateComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } @@ -6312,6 +6326,8 @@ internal Arm64() { } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector Log2(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector Log2(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector MaxNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MaxNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } @@ -6342,6 +6358,18 @@ internal Arm64() { } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplex(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplexBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplexBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplexBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRotateComplexBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected(Min = 0, Max = (byte)(1))] byte rightIndex, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalar(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalar(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalar(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } @@ -6478,6 +6506,12 @@ internal Arm64() { } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } @@ -6488,6 +6522,8 @@ internal Arm64() { } public static System.Numerics.Vector PolynomialMultiplyWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector PolynomialMultiplyWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector PolynomialMultiplyWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector ReciprocalEstimate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector ReciprocalSqrtEstimate(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector ShiftArithmeticRounded(System.Numerics.Vector value, System.Numerics.Vector count) { throw null; } public static System.Numerics.Vector ShiftArithmeticRounded(System.Numerics.Vector value, System.Numerics.Vector count) { throw null; } public static System.Numerics.Vector ShiftArithmeticRounded(System.Numerics.Vector value, System.Numerics.Vector count) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/Arm/Sve2Tests.cs b/src/tests/Common/GenerateHWIntrinsicTests/Arm/Sve2Tests.cs index f16ad8e20fd2ad..bfe40fee207c69 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/Arm/Sve2Tests.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/Arm/Sve2Tests.cs @@ -87,6 +87,30 @@ public static (string templateFileName, Dictionary templateData) ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_AddPairwiseWideningAndAdd_uint_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddPairwiseWideningAndAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddPairwiseWideningAndAdd(left, right, i) != result[i]", ["GetIterResult"] = "(UInt32) Helpers.AddPairwiseWideningAndAdd(left, right, i)"}), ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_AddPairwiseWideningAndAdd_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddPairwiseWideningAndAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddPairwiseWideningAndAdd(left, right, i) != result[i]", ["GetIterResult"] = "(UInt64) Helpers.AddPairwiseWideningAndAdd(left, right, i)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_int_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_int_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_long_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_long_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_byte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_byte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_ushort_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_ushort_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_uint_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_uint_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_ulong_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_AddRotateComplex_ulong_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddRotateComplex(first, second, Imm)"}), + ("SveVecBinOpDifferentRetType.template",new Dictionary {["TestName"] = "Sve2_AddRoundedHighNarrowingEven_sbyte_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRoundedHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddRoundedHighNarrowingEven(left[Helpers.NarrowIdx(i)], right[Helpers.NarrowIdx(i)], i) != result[i]", ["GetIterResult"] = "Helpers.AddRoundedHighNarrowingEven(leftOp[Helpers.NarrowIdx(i)], rightOp[Helpers.NarrowIdx(i)], i)"}), ("SveVecBinOpDifferentRetType.template",new Dictionary {["TestName"] = "Sve2_AddRoundedHighNarrowingEven_short_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRoundedHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddRoundedHighNarrowingEven(left[Helpers.NarrowIdx(i)], right[Helpers.NarrowIdx(i)], i) != result[i]", ["GetIterResult"] = "Helpers.AddRoundedHighNarrowingEven(leftOp[Helpers.NarrowIdx(i)], rightOp[Helpers.NarrowIdx(i)], i)"}), ("SveVecBinOpDifferentRetType.template",new Dictionary {["TestName"] = "Sve2_AddRoundedHighNarrowingEven_int_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddRoundedHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddRoundedHighNarrowingEven(left[Helpers.NarrowIdx(i)], right[Helpers.NarrowIdx(i)], i) != result[i]", ["GetIterResult"] = "Helpers.AddRoundedHighNarrowingEven(leftOp[Helpers.NarrowIdx(i)], rightOp[Helpers.NarrowIdx(i)], i)"}), @@ -110,6 +134,18 @@ public static (string templateFileName, Dictionary templateData) ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_AddSaturate_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "(UInt32) Helpers.AddSaturate(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_AddSaturate_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "(UInt64) Helpers.AddSaturate(left[i], right[i])"}), + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "0", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "1", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "0", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "1", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_int_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "0", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_int_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "1", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_long_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "0", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + ("SveVecImmBinOpVecTest.template", new Dictionary {["TestName"] = "Sve2_AddSaturateRotateComplex_long_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "1", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.AddSaturateRotateComplex(firstOp, secondOp, Imm))", ["GetVectorResult"] = "Helpers.AddSaturateRotateComplex(first, second, Imm)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary {["TestName"] = "Sve2_AddSaturateWithSignedAddend_byte_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateWithSignedAddend", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "(Byte) Helpers.AddSaturate(left[i], right[i])"}), ("SveVecBinOpDifferentRetType.template", new Dictionary {["TestName"] = "Sve2_AddSaturateWithSignedAddend_ushort_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateWithSignedAddend", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "(UInt16) Helpers.AddSaturate(left[i], right[i])"}), ("SveVecBinOpDifferentRetType.template", new Dictionary {["TestName"] = "Sve2_AddSaturateWithSignedAddend_uint_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AddSaturateWithSignedAddend", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AddSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "(UInt32) Helpers.AddSaturate(left[i], right[i])"}), @@ -186,6 +222,10 @@ public static (string templateFileName, Dictionary templateData) ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), + ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary {["TestName"] = "Sve2_ConvertToDoubleOdd_double_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ConvertToDoubleOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.ConvertToDouble(firstOp[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.ConvertToDouble(left[i * 2 + 1])"}), + + ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary {["TestName"] = "Sve2_ConvertToSingleEvenRoundToOdd_float_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ConvertToSingleEvenRoundToOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.ConvertToSingleEvenRoundToOdd(firstOp, i) != result[i]", ["GetIterResult"] = "Helpers.ConvertToSingleEvenRoundToOdd(left, i)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), @@ -266,6 +306,9 @@ public static (string templateFileName, Dictionary templateData) ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_InterleavingXorOddEven_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "InterleavingXorOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.InterleavingXorOddEven(firstOp, secondOp, thirdOp)[i]", ["GetIterResult"] = "Helpers.InterleavingXorOddEven(first, second, third)[i]"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_InterleavingXorOddEven_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "InterleavingXorOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.InterleavingXorOddEven(firstOp, secondOp, thirdOp)[i]", ["GetIterResult"] = "Helpers.InterleavingXorOddEven(first, second, third)[i]"}), + ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary { ["TestName"] = "Sve2_Log2_int_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "Log2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.Log2(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.Log2(left[i])"}), + ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary { ["TestName"] = "Sve2_Log2_long_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "Log2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.Log2(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.Log2(left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxNumberPairwise_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i)"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxNumberPairwise_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i)"}), @@ -301,6 +344,144 @@ public static (string templateFileName, Dictionary templateData) ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyAddBySelectedScalar_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["ConvertFunc"] = "", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])",}), ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyAddBySelectedScalar_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["ConvertFunc"] = "", ["Imm"] = "0", ["InvalidImm"] = "2", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])",}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_sbyte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_short_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_short_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_int_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_int_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_int_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_int_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_long_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_long_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_long_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_long_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_byte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Byte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_byte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Byte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_byte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Byte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_byte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Byte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ushort_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ushort_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ushort_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ushort_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_uint_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_uint_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_uint_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_uint_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ulong_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ulong_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ulong_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplex_ulong_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplex(first, second, third, Imm)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_short_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_int_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "2", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "2", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "2", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "2", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "3", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "3", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "3", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_ushort_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["Imm1"] = "3", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRotateComplexBySelectedScalar_uint_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_sbyte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_short_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_short_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_int_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_int_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_int_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_int_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_long_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_long_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_long_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + ("SveVecImmTernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplex_long_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(firstOp, secondOp, thirdOp, Imm))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplex(first, second, third, Imm)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "2", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "2", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "2", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "3", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "3", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "3", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_short_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm1"] = "3", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecImm2TernOpVecTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar_int_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(firstOp, secondOp, thirdOp, Imm1, Imm2))", ["GetVectorResult"] = "Helpers.MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(first, second, third, Imm1, Imm2)"}), + ("SveVecTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyWideningEvenAndAdd_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEvenAndAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])", ["GetIterResult"] = "Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])",}), ("SveVecTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyWideningEvenAndAdd_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEvenAndAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])", ["GetIterResult"] = "Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])",}), ("SveVecTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyWideningEvenAndAdd_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEvenAndAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])", ["GetIterResult"] = "Helpers.MultiplyAddWidening(firstOp[i], secondOp[2 * i], thirdOp[2 * i])",}), @@ -487,6 +668,9 @@ public static (string templateFileName, Dictionary templateData) ("SveVecBinOpDifferentRetType.template",new Dictionary {["TestName"] = "Sve2_PolynomialMultiplyWideningOdd_ushort_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "PolynomialMultiplyWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.PolynomialMultiplyWidening(left[2 * i + 1], right[2 * i + 1])", ["GetIterResult"] = "Helpers.PolynomialMultiplyWidening(leftOp[2 * i + 1], rightOp[2 * i + 1])"}), ("SveVecBinOpDifferentRetType.template",new Dictionary {["TestName"] = "Sve2_PolynomialMultiplyWideningOdd_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "PolynomialMultiplyWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.PolynomialMultiplyWidening(left[2 * i + 1], right[2 * i + 1])", ["GetIterResult"] = "Helpers.PolynomialMultiplyWidening(leftOp[2 * i + 1], rightOp[2 * i + 1])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_ReciprocalEstimate_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ReciprocalEstimate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.UnsignedReciprocalEstimate(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.UnsignedReciprocalEstimate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_ReciprocalSqrtEstimate_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ReciprocalSqrtEstimate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.UnsignedReciprocalSqrtEstimate(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.UnsignedReciprocalSqrtEstimate(leftOp[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_ShiftArithmeticRounded_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ShiftArithmeticRounded", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != (sbyte)Helpers.SveShiftArithmeticRounded(left[i], right[i])", ["GetIterResult"] = "(sbyte)Helpers.SveShiftArithmeticRounded(leftOp[i], rightOp[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_ShiftArithmeticRounded_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ShiftArithmeticRounded", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != (short)Helpers.SveShiftArithmeticRounded(left[i], right[i])", ["GetIterResult"] = "(short)Helpers.SveShiftArithmeticRounded(leftOp[i], rightOp[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_ShiftArithmeticRounded_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ShiftArithmeticRounded", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != (int) Helpers.SveShiftArithmeticRounded(left[i], right[i])", ["GetIterResult"] = "(int) Helpers.SveShiftArithmeticRounded(leftOp[i], rightOp[i])"}), diff --git a/src/tests/Common/GenerateHWIntrinsicTests/Arm/SveTests.cs b/src/tests/Common/GenerateHWIntrinsicTests/Arm/SveTests.cs index 433da9776b85d2..d4937989a06688 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/Arm/SveTests.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/Arm/SveTests.cs @@ -442,8 +442,8 @@ public static (string templateFileName, Dictionary templateData) ("SveVecBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve_CreateMaskForNextActiveElement_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "CreateMaskForNextActiveElement", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()", ["NextValueOp2"] = "Helpers.getMaskUInt32()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.CreateMaskForNextActiveElement(left, right))", ["GetVectorResult"] = "Helpers.CreateMaskForNextActiveElement(left, right)"}), ("SveVecBinOpVecTest.template", new Dictionary { ["TestName"] = "Sve_CreateMaskForNextActiveElement_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "CreateMaskForNextActiveElement", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()", ["NextValueOp2"] = "Helpers.getMaskUInt64()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.CreateMaskForNextActiveElement(left, right))", ["GetVectorResult"] = "Helpers.CreateMaskForNextActiveElement(left, right)"}), - ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary {["TestName"] = "Sve_FloatingPointExponentialAccelerator_float_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "FloatingPointExponentialAccelerator", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "BitConverter.SingleToInt32Bits(Helpers.FPExponentialAccelerator(firstOp[i])) != BitConverter.SingleToInt32Bits(result[i])", ["GetIterResult"] = "Helpers.FPExponentialAccelerator(leftOp[i])", ["ConvertFunc"] = "BitConverter.SingleToInt32Bits"}), - ("SveSimpleVecOpDiffRetTypeTest.template", new Dictionary {["TestName"] = "Sve_FloatingPointExponentialAccelerator_double_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "FloatingPointExponentialAccelerator", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "BitConverter.DoubleToInt64Bits(Helpers.FPExponentialAccelerator(firstOp[i])) != BitConverter.DoubleToInt64Bits(result[i])", ["GetIterResult"] = "Helpers.FPExponentialAccelerator(leftOp[i])", ["ConvertFunc"] = "BitConverter.DoubleToInt64Bits"}), + ("SveSimpleVecOpNarrowingTest.template", new Dictionary {["TestName"] = "Sve_FloatingPointExponentialAccelerator_float_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "FloatingPointExponentialAccelerator", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "BitConverter.SingleToInt32Bits(Helpers.FPExponentialAccelerator(firstOp[i])) != BitConverter.SingleToInt32Bits(result[i])", ["GetIterResult"] = "Helpers.FPExponentialAccelerator(leftOp[i])", ["ConvertFunc"] = "BitConverter.SingleToInt32Bits"}), + ("SveSimpleVecOpNarrowingTest.template", new Dictionary {["TestName"] = "Sve_FloatingPointExponentialAccelerator_double_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "FloatingPointExponentialAccelerator", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "BitConverter.DoubleToInt64Bits(Helpers.FPExponentialAccelerator(firstOp[i])) != BitConverter.DoubleToInt64Bits(result[i])", ["GetIterResult"] = "Helpers.FPExponentialAccelerator(leftOp[i])", ["ConvertFunc"] = "BitConverter.DoubleToInt64Bits"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_ExtractAfterLastActiveElement_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastActiveElement", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "Helpers.ExtractAfterLastActiveElement(left, right)[i] != result[i]", ["GetIterResult"] = "Helpers.ExtractAfterLastActiveElement(left, right)[i]", ["ConvertFunc"] = " ",}), ("SveScalarBinOpTest.template", new Dictionary { ["TestName"] = "Sve_ExtractAfterLastActiveElement_byte_scalar", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastActiveElementScalar", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateScalarResult"] = "Helpers.ExtractAfterLastActiveElementScalar(left, right) != result",}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_ExtractAfterLastActiveElement_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastActiveElement", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.ExtractAfterLastActiveElement(left, right)[i] != result[i]", ["GetIterResult"] = "Helpers.ExtractAfterLastActiveElement(left, right)[i]", ["ConvertFunc"] = " ",}), diff --git a/src/tests/Common/GenerateHWIntrinsicTests/Arm/Templates.cs b/src/tests/Common/GenerateHWIntrinsicTests/Arm/Templates.cs index a472228367aeca..cdf2f8340f7ac3 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/Arm/Templates.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/Arm/Templates.cs @@ -310,7 +310,8 @@ public static (string templateFileName, string outputTemplateName, Dictionary { ["TemplateName"] = "SecureHash", ["TemplateValidationLogic"] = SecureHashOpTest_ValidationLogic }), ("_TernaryOpTestTemplate.template", "SecureHashTernOpTest.template", new Dictionary { ["TemplateName"] = "SecureHash", ["TemplateValidationLogic"] = SecureHashOpTest_ValidationLogic }), ("_SveUnaryOpTestTemplate.template", "SveSimpleVecOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_ValidationLogicForCndSel_FalseValue }), - ("_SveUnaryOpDifferentRetTypeTestTemplate.template", "SveSimpleVecOpDiffRetTypeTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogicForNarrowing, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSelForNarrowing, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_ValidationLogicForCndSelForNarrowing_FalseValue }), + ("_SveUnaryOpDifferentRetTypeTestTemplate.template", "SveSimpleVecOpDiffRetTypeTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_ValidationLogicForCndSel_FalseValue }), + ("_SveUnaryOpDifferentRetTypeTestTemplate.template", "SveSimpleVecOpNarrowingTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogicForNarrowing, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSelForNarrowing, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_ValidationLogicForCndSelForNarrowing_FalseValue }), ("_SveUnaryOpDifferentRetTypeTestTemplate.template", "SveSimpleVecOpDiffRetTypeTestVec.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_VectorValidationLogicForCndSel_FalseValue }), ("_SveBinaryOpTestTemplate.template", "SveVecBinOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_ValidationLogicForCndSel_FalseValue }), ("_SveBinaryOpTestTemplate.template", "SveVecBinOpVecTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_VectorValidationLogicForCndSel_FalseValue }), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index 1248daccf4ebd5..ab0388d112bb92 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -1004,6 +1004,24 @@ public static short AddHighNarrowingOdd(short[] even, int[] op1, int[] op2, int public static short FusedSubtractHalving(short op1, short op2) => (short)((uint)((int)op1 - (int)op2) >> 1); + public static int Log2(float val) + { + if (float.IsNaN(val) || val <= 0) + { + return int.MinValue; + } + if (float.IsInfinity(val)) + { + return int.MaxValue; + } + + double log2 = Math.Log(val, 2.0); + if (log2 >= int.MaxValue) return int.MaxValue; + if (log2 <= int.MinValue) return int.MinValue; + + return (int)Math.Floor(log2); + } + public static int MultiplyByScalarWideningUpper(short[] op1, short op2, int i) => MultiplyWidening(op1[i + op1.Length / 2], op2); public static int MultiplyByScalarWideningUpperAndAdd(int[] op1, short[] op2, short op3, int i) => MultiplyAddWidening(op1[i], op2[i + op2.Length / 2], op3); @@ -1186,6 +1204,24 @@ public static int AddHighNarrowingOdd(int[] even, long[] op1, long[] op2, int i) public static int FusedSubtractHalving(int op1, int op2) => (int)((ulong)((long)op1 - (long)op2) >> 1); + public static long Log2(double val) + { + if (double.IsNaN(val) || val <= 0) + { + return long.MinValue; + } + if (double.IsInfinity(val)) + { + return long.MaxValue; + } + + double log2 = Math.Log(val, 2.0); + if (log2 >= long.MaxValue) return long.MaxValue; + if (log2 <= long.MinValue) return long.MinValue; + + return (long)Math.Floor(log2); + } + public static long MultiplyByScalarWideningUpper(int[] op1, int op2, int i) => MultiplyWidening(op1[i + op1.Length / 2], op2); public static long MultiplyByScalarWideningUpperAndAdd(long[] op1, int[] op2, int op3, int i) => MultiplyAddWidening(op1[i], op2[i + op2.Length / 2], op3); @@ -1829,6 +1865,28 @@ public static sbyte MultiplyRoundedDoublingAndSubtractSaturateHigh(sbyte op1, sb return SaturateHigh(val, ovf); } + public static sbyte[] MultiplyAddRoundedDoublingSaturateHighRotateComplex(sbyte[] op1, sbyte[] op2, sbyte[] op3, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (sbyte ans1, sbyte ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3[img])), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3[real])), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3[img])), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3[real])), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static short MultiplyDoublingWideningAndAddSaturate(short op1, sbyte op2, sbyte op3) => AddSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); public static short MultiplyDoublingWideningAndSubtractSaturate(short op1, sbyte op2, sbyte op3) => SubtractSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); @@ -2168,6 +2226,51 @@ public static short MultiplyRoundedDoublingAndSubtractSaturateHigh(short op1, sh return SaturateHigh(val, ovf); } + public static short[] MultiplyAddRoundedDoublingSaturateHighRotateComplex(short[] op1, short[] op2, short[] op3, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (short ans1, short ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3[img])), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3[real])), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3[img])), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3[real])), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + + public static short[] MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(short[] op1, short[] op2, short[] op3, byte index, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (short op3Real, short op3Img) = (op3[index * 2], op3[(index * 2) + 1]); + (short ans1, short ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3Real), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3Img)), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3Img), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3Real)), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3Real), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3Img)), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3Img), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3Real)), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static int MultiplyDoublingWideningAndAddSaturate(int op1, short op2, short op3) => AddSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); public static int MultiplyDoublingWideningAndSubtractSaturate(int op1, short op2, short op3) => SubtractSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); @@ -2507,6 +2610,51 @@ public static int MultiplyRoundedDoublingAndSubtractSaturateHigh(int op1, int op return SaturateHigh(val, ovf); } + public static int[] MultiplyAddRoundedDoublingSaturateHighRotateComplex(int[] op1, int[] op2, int[] op3, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (int ans1, int ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3[img])), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3[real])), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3[img])), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3[real])), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + + public static int[] MultiplyAddRoundedDoublingSaturateHighRotateComplexBySelectedScalar(int[] op1, int[] op2, int[] op3, byte index, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (int op3Real, int op3Img) = (op3[index * 2], op3[(index * 2) + 1]); + (int ans1, int ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3Real), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3Img)), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3Img), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3Real)), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3Real), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3Img)), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3Img), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3Real)), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static long MultiplyDoublingWideningAndAddSaturate(long op1, int op2, int op3) => AddSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); public static long MultiplyDoublingWideningAndSubtractSaturate(long op1, int op2, int op3) => SubtractSaturate(op1, MultiplyDoublingWideningSaturate(op2, op3)); @@ -2581,6 +2729,28 @@ private static long MultiplyDoublingSaturate(long op1, long op2, bool rounding, return long.CreateChecked(result); } + public static long[] MultiplyAddRoundedDoublingSaturateHighRotateComplex(long[] op1, long[] op2, long[] op3, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (long ans1, long ans2) = rot switch + { + 0 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[real], op3[img])), + 1 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndAddSaturateHigh(op1[img], op2[img], op3[real])), + 2 => (MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[real], op2[real], op3[real]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[real], op3[img])), + 3 => (MultiplyRoundedDoublingAndAddSaturateHigh(op1[real], op2[img], op3[img]), MultiplyRoundedDoublingAndSubtractSaturateHigh(op1[img], op2[img], op3[real])), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static long ShiftLeftLogicalWidening(int op1, byte op2) => UnsignedShift((long)op1, (long)op2); public static ulong ShiftLeftLogicalWidening(uint op1, byte op2) => UnsignedShift((ulong)op1, (long)op2); @@ -2992,6 +3162,28 @@ public static byte AddSaturate(byte op1, byte op2) return ovf ? byte.MaxValue : result; } + public static sbyte[] AddSaturateRotateComplex(sbyte[] op1, sbyte[] op2, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + + if (rot == 0) + { + op1[real] = SubtractSaturate(op1[real], op2[img]); + op1[img] = AddSaturate(op1[img], op2[real]); + } + else + { + op1[real] = AddSaturate(op1[real], op2[img]); + op1[img] = SubtractSaturate(op1[img], op2[real]); + } + } + + return op1; + } + public static double AddSequentialAcross(double[] op1, double[] op2, double[] mask = null) { // If mask isn't provided, default to all true @@ -3294,6 +3486,28 @@ public static ushort AddSaturate(ushort op1, ushort op2) return ovf ? ushort.MaxValue : result; } + public static short[] AddSaturateRotateComplex(short[] op1, short[] op2, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + + if (rot == 0) + { + op1[real] = SubtractSaturate(op1[real], op2[img]); + op1[img] = AddSaturate(op1[img], op2[real]); + } + else + { + op1[real] = AddSaturate(op1[real], op2[img]); + op1[img] = SubtractSaturate(op1[img], op2[real]); + } + } + + return op1; + } + public static short NegateSaturate(short op1) => SubtractSaturate((short)0, op1); public static short SubtractSaturate(short op1, short op2) @@ -3562,6 +3776,28 @@ public static uint AddSaturate(uint op1, uint op2) return ovf ? uint.MaxValue : result; } + public static int[] AddSaturateRotateComplex(int[] op1, int[] op2, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + + if (rot == 0) + { + op1[real] = SubtractSaturate(op1[real], op2[img]); + op1[img] = AddSaturate(op1[img], op2[real]); + } + else + { + op1[real] = AddSaturate(op1[real], op2[img]); + op1[img] = SubtractSaturate(op1[img], op2[real]); + } + } + + return op1; + } + public static int NegateSaturate(int op1) => SubtractSaturate((int)0, op1); public static int SubtractSaturate(int op1, int op2) @@ -3830,6 +4066,28 @@ public static ulong AddSaturate(ulong op1, ulong op2) return ovf ? ulong.MaxValue : result; } + public static long[] AddSaturateRotateComplex(long[] op1, long[] op2, byte rot) + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + + if (rot == 0) + { + op1[real] = SubtractSaturate(op1[real], op2[img]); + op1[img] = AddSaturate(op1[img], op2[real]); + } + else + { + op1[real] = AddSaturate(op1[real], op2[img]); + op1[img] = SubtractSaturate(op1[img], op2[real]); + } + } + + return op1; + } + public static long NegateSaturate(long op1) => SubtractSaturate((long)0, op1); public static long SubtractSaturate(long op1, long op2) @@ -4070,6 +4328,43 @@ private static (ulong val, bool ovf) ShiftOvf(ulong value, int shift) public static float AbsoluteDifference(float op1, float op2) => MathF.Abs(op1 - op2); + public static float ConvertToSingleEvenRoundToOdd(double[] value, int i) + { + if (i % 2 == 0) + { + double val = value[i / 2]; + float floatVal = (float)val; + + float f = (float)val; + + // If val is NaN or Inf there’s nothing else to do + if (double.IsNaN(val) || double.IsInfinity(val)) + return f; + + // Detect the cases where the default cast rounded away from zero + if ((val > 0 && (double)f > val) || + (val < 0 && (double)f < val)) + { + // Move toward zero to get truncate() behaviour. + int bits = BitConverter.SingleToInt32Bits(f); + bits += (val > 0) ? -1 : +1; + f = BitConverter.Int32BitsToSingle(bits); + } + + // Round to odd, force the last bit of the mantissa to 1 if the conversion was inexact + if (val != (double)f) + { + int bits = BitConverter.SingleToInt32Bits(f); + bits |= 0x1; + f = BitConverter.Int32BitsToSingle(bits); + } + + return f; + } + + return 0f; + } + public static float FusedMultiplyAdd(float op1, float op2, float op3) => MathF.FusedMultiplyAdd(op2, op3, op1); public static float FusedMultiplyAddNegated(float op1, float op2, float op3) => MathF.FusedMultiplyAdd(-op2, op3, -op1); @@ -4120,6 +4415,28 @@ public static float[] MultiplyAddRotateComplex(float[] op1, float[] op2, float[] return op1; } + public static T[] MultiplyAddRotateComplex(T[] op1, T[] op2, T[] op3, byte imm) where T : INumber + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (T ans1, T ans2) = imm switch + { + 0 => (op1[real] + op2[real] * op3[real], op1[img] + op2[real] * op3[img]), + 1 => (op1[real] - op2[img] * op3[img], op1[img] + op2[img] * op3[real]), + 2 => (op1[real] - op2[real] * op3[real], op1[img] - op2[real] * op3[img]), + 3 => (op1[real] + op2[img] * op3[img], op1[img] - op2[img] * op3[real]), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static float[] MultiplyAddRotateComplexBySelectedScalar(float[] op1, float[] op2, float[] op3, byte index, byte imm) { for (int i = 0; i < op1.Length; i += 2) @@ -4143,6 +4460,29 @@ public static float[] MultiplyAddRotateComplexBySelectedScalar(float[] op1, floa return op1; } + public static T[] MultiplyAddRotateComplexBySelectedScalar(T[] op1, T[] op2, T[] op3, byte index, byte imm) where T : INumber + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + (T op3Real, T op3Img) = (op3[index * 2], op3[(index * 2) + 1]); + (T ans1, T ans2) = imm switch + { + 0 => (op1[real] + op2[real] * op3Real, op1[img] + op2[real] * op3Img), + 1 => (op1[real] - op2[img] * op3Img, op1[img] + op2[img] * op3Real), + 2 => (op1[real] - op2[real] * op3Real, op1[img] - op2[real] * op3Img), + 3 => (op1[real] + op2[img] * op3Img, op1[img] - op2[img] * op3Real), + _ => (default, default) + }; + + op1[real] = ans1; + op1[img] = ans2; + } + + return op1; + } + public static float MultiplyExtended(float op1, float op2) { bool inf1 = float.IsInfinity(op1); @@ -4615,36 +4955,24 @@ private static uint ExtractBits(uint val, byte msbPos, byte lsbPos) public static uint UnsignedReciprocalEstimate(uint op1) { - uint result; + if ((op1 & 0x8000_0000u) == 0) + return 0xFFFF_FFFFu; - if ((op1 & (1 << 31)) == 0) - { - result = ~0U; - } - else - { - uint estimate = ReciprocalEstimate(ExtractBits(op1, 31, 23)); - result = ExtractBits(estimate, 8, 0) << 31; - } + uint idx = (op1 >> 23) & 0x1FFu; - return result; + uint estimate = ReciprocalEstimate(idx) & 0x1FFu; + + return estimate << 23; } public static uint UnsignedReciprocalSqrtEstimate(uint op1) { - uint result; + if ((op1 & 0xC0000000u) == 0) + return 0xFFFFFFFFu; - if ((op1 & (3 << 30)) == 0) - { - result = ~0U; - } - else - { - uint estimate = ReciprocalSqrtEstimate(ExtractBits(op1, 31, 23)); - result = ExtractBits(estimate, 8, 0) << 31; - } + uint estimate = ReciprocalSqrtEstimate(ExtractBits(op1, 31, 23)) & 0x1FFu; - return result; + return estimate << 23; } public static T Add(T a, T b) where T : INumber => a + b; @@ -4667,6 +4995,28 @@ public static T AddPairwiseSve(T[] array1, T[] array2, int i) where T : unmanaged, INumber => PairwiseSve((a, b) => Add(a, b), array1, array2, i); + public static T[] AddRotateComplex(T[] op1, T[] op2, byte rot) where T : INumber + { + for (int i = 0; i < op1.Length; i += 2) + { + int real = i; + int img = i + 1; + + if (rot == 0) + { + op1[real] -= op2[img]; + op1[img] += op2[real]; + } + else + { + op1[real] += op2[img]; + op1[img] -= op2[real]; + } + } + + return op1; + } + public static T MaxPairwise(T[] array, int i) where T : unmanaged, INumber, IComparisonOperators => Pairwise((a, b) => Max(a, b), array, i); @@ -4725,29 +5075,6 @@ public static T PairwiseSve(Func op, T[] array1, T[] array2, int i) : op(array2[i - 1], array2[i]); } - public static T[] AddRotateComplex(T[] op1, T[] op2, byte rot) - where T : unmanaged, IFloatingPoint - { - for (int i = 0; i < op1.Length; i += 2) - { - int real = i; - int img = i + 1; - - if (rot == 0) - { - op1[real] -= op2[img]; - op1[img] += op2[real]; - } - else - { - op1[real] += op2[img]; - op1[img] -= op2[real]; - } - } - - return op1; - } - public static T AddAcross(T[] values) where T : unmanaged, INumber => Reduce((a, b) => Add(a, b), values); From 6edbc501ed9ccaa928e139695d45de010b3a45e1 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 15 Aug 2025 19:00:42 -0400 Subject: [PATCH 3/6] Fix Composite ML-DSA OIDs --- .../src/System/Security/Cryptography/Oids.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/libraries/Common/src/System/Security/Cryptography/Oids.cs b/src/libraries/Common/src/System/Security/Cryptography/Oids.cs index 15ced1c97f7c85..10785201fde8ab 100644 --- a/src/libraries/Common/src/System/Security/Cryptography/Oids.cs +++ b/src/libraries/Common/src/System/Security/Cryptography/Oids.cs @@ -135,24 +135,24 @@ internal static partial class Oids internal const string Mgf1 = "1.2.840.113549.1.1.8"; internal const string PSpecified = "1.2.840.113549.1.1.9"; - internal const string MLDsa44WithRSA2048PssPreHashSha256 = "2.16.840.1.114027.80.9.0"; - internal const string MLDsa44WithRSA2048Pkcs15PreHashSha256 = "2.16.840.1.114027.80.9.1"; - internal const string MLDsa44WithEd25519PreHashSha512 = "2.16.840.1.114027.80.9.2"; - internal const string MLDsa44WithECDsaP256PreHashSha256 = "2.16.840.1.114027.80.9.3"; - internal const string MLDsa65WithRSA3072PssPreHashSha512 = "2.16.840.1.114027.80.9.4"; - internal const string MLDsa65WithRSA3072Pkcs15PreHashSha512 = "2.16.840.1.114027.80.9.5"; - internal const string MLDsa65WithRSA4096PssPreHashSha512 = "2.16.840.1.114027.80.9.6"; - internal const string MLDsa65WithRSA4096Pkcs15PreHashSha512 = "2.16.840.1.114027.80.9.7"; - internal const string MLDsa65WithECDsaP256PreHashSha512 = "2.16.840.1.114027.80.9.8"; - internal const string MLDsa65WithECDsaP384PreHashSha512 = "2.16.840.1.114027.80.9.9"; - internal const string MLDsa65WithECDsaBrainpoolP256r1PreHashSha512 = "2.16.840.1.114027.80.9.10"; - internal const string MLDsa65WithEd25519PreHashSha512 = "2.16.840.1.114027.80.9.11"; - internal const string MLDsa87WithECDsaP384PreHashSha512 = "2.16.840.1.114027.80.9.12"; - internal const string MLDsa87WithECDsaBrainpoolP384r1PreHashSha512 = "2.16.840.1.114027.80.9.13"; - internal const string MLDsa87WithEd448PreHashShake256_512 = "2.16.840.1.114027.80.9.14"; - internal const string MLDsa87WithRSA3072PssPreHashSha512 = "2.16.840.1.114027.80.9.15"; - internal const string MLDsa87WithRSA4096PssPreHashSha512 = "2.16.840.1.114027.80.9.16"; - internal const string MLDsa87WithECDsaP521PreHashSha512 = "2.16.840.1.114027.80.9.17"; + internal const string MLDsa44WithRSA2048PssPreHashSha256 = "2.16.840.1.114027.80.9.1.0"; + internal const string MLDsa44WithRSA2048Pkcs15PreHashSha256 = "2.16.840.1.114027.80.9.1.1"; + internal const string MLDsa44WithEd25519PreHashSha512 = "2.16.840.1.114027.80.9.1.2"; + internal const string MLDsa44WithECDsaP256PreHashSha256 = "2.16.840.1.114027.80.9.1.3"; + internal const string MLDsa65WithRSA3072PssPreHashSha512 = "2.16.840.1.114027.80.9.1.4"; + internal const string MLDsa65WithRSA3072Pkcs15PreHashSha512 = "2.16.840.1.114027.80.9.1.5"; + internal const string MLDsa65WithRSA4096PssPreHashSha512 = "2.16.840.1.114027.80.9.1.6"; + internal const string MLDsa65WithRSA4096Pkcs15PreHashSha512 = "2.16.840.1.114027.80.9.1.7"; + internal const string MLDsa65WithECDsaP256PreHashSha512 = "2.16.840.1.114027.80.9.1.8"; + internal const string MLDsa65WithECDsaP384PreHashSha512 = "2.16.840.1.114027.80.9.1.9"; + internal const string MLDsa65WithECDsaBrainpoolP256r1PreHashSha512 = "2.16.840.1.114027.80.9.1.10"; + internal const string MLDsa65WithEd25519PreHashSha512 = "2.16.840.1.114027.80.9.1.11"; + internal const string MLDsa87WithECDsaP384PreHashSha512 = "2.16.840.1.114027.80.9.1.12"; + internal const string MLDsa87WithECDsaBrainpoolP384r1PreHashSha512 = "2.16.840.1.114027.80.9.1.13"; + internal const string MLDsa87WithEd448PreHashShake256_512 = "2.16.840.1.114027.80.9.1.14"; + internal const string MLDsa87WithRSA3072PssPreHashSha512 = "2.16.840.1.114027.80.9.1.15"; + internal const string MLDsa87WithRSA4096PssPreHashSha512 = "2.16.840.1.114027.80.9.1.16"; + internal const string MLDsa87WithECDsaP521PreHashSha512 = "2.16.840.1.114027.80.9.1.17"; // PKCS#7 internal const string NoSignature = "1.3.6.1.5.5.7.6.2"; From 55b6d648f616083db06a454dfe2bd7da685bff65 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 15 Aug 2025 16:34:17 -0700 Subject: [PATCH 4/6] Add more info for StdErrAfter assertion in host tests (#118712) The assertion only ended up printing stderr, but it would be useful to have all the information about the command that was run (the exit code, stdout). --- .../Assertions/CommandResultAssertions.cs | 15 +-------------- .../Assertions/CommandResultExtensions.cs | 6 +----- src/installer/tests/TestUtils/CommandResult.cs | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/installer/tests/TestUtils/Assertions/CommandResultAssertions.cs b/src/installer/tests/TestUtils/Assertions/CommandResultAssertions.cs index b2195ce1973772..f2331aec6d69a2 100644 --- a/src/installer/tests/TestUtils/Assertions/CommandResultAssertions.cs +++ b/src/installer/tests/TestUtils/Assertions/CommandResultAssertions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Linq; using System.Text.RegularExpressions; using FluentAssertions; using FluentAssertions.Execution; @@ -154,18 +153,6 @@ public AndConstraint NotFileContains(string path, strin return new AndConstraint(this); } - public string GetDiagnosticsInfo() - => $""" - - File Name: {Result.StartInfo.FileName} - Arguments: {Result.StartInfo.Arguments} - Environment: - {string.Join(Environment.NewLine, Result.StartInfo.Environment.Where(i => i.Key.StartsWith(Constants.DotnetRoot.EnvironmentVariable)).Select(i => $" {i.Key} = {i.Value}"))} - Exit Code: 0x{Result.ExitCode:x} - StdOut: - {Result.StdOut} - StdErr: - {Result.StdErr} - """; + public string GetDiagnosticsInfo() => Result.GetDiagnosticsInfo(); } } diff --git a/src/installer/tests/TestUtils/Assertions/CommandResultExtensions.cs b/src/installer/tests/TestUtils/Assertions/CommandResultExtensions.cs index d0e0175060b893..7ca15639b7dc2d 100644 --- a/src/installer/tests/TestUtils/Assertions/CommandResultExtensions.cs +++ b/src/installer/tests/TestUtils/Assertions/CommandResultExtensions.cs @@ -4,7 +4,6 @@ using FluentAssertions; using FluentAssertions.Execution; using Microsoft.DotNet.Cli.Build.Framework; -using System; namespace Microsoft.DotNet.CoreSetup.Test { @@ -20,10 +19,7 @@ public static CommandResult StdErrAfter(this CommandResult commandResult, string int i = commandResult.StdErr.IndexOf(pattern); i.Should().BeGreaterThanOrEqualTo( 0, - "Trying to filter StdErr after '{0}', but such string can't be found in the StdErr.{1}{2}", - pattern, - Environment.NewLine, - commandResult.StdErr); + $"'{pattern}' should be in StdErr - cannot filter StdErr to after expected string.{commandResult.GetDiagnosticsInfo()}"); string filteredStdErr = commandResult.StdErr.Substring(i); return new CommandResult(commandResult.StartInfo, commandResult.ProcessId, commandResult.ExitCode, commandResult.StdOut, filteredStdErr); diff --git a/src/installer/tests/TestUtils/CommandResult.cs b/src/installer/tests/TestUtils/CommandResult.cs index ac2f959835fca0..5e850ab4220fa2 100644 --- a/src/installer/tests/TestUtils/CommandResult.cs +++ b/src/installer/tests/TestUtils/CommandResult.cs @@ -2,8 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Text; using System.Diagnostics; +using System.Linq; +using System.Text; namespace Microsoft.DotNet.Cli.Build.Framework { @@ -23,5 +24,19 @@ public CommandResult(ProcessStartInfo startInfo, int pid, int exitCode, string s StdOut = stdOut; StdErr = stdErr; } + + internal string GetDiagnosticsInfo() + => $""" + + File Name: {StartInfo.FileName} + Arguments: {StartInfo.Arguments} + Environment: + {string.Join(Environment.NewLine, StartInfo.Environment.Where(i => i.Key.StartsWith("DOTNET_", OperatingSystem.IsWindows() ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal)).Select(i => $" {i.Key} = {i.Value}"))} + Exit Code: 0x{ExitCode:x} + StdOut: + {StdOut} + StdErr: + {StdErr} + """; } } From fffd8c0208d09ad1d701f1f26ef26bb22ddb97e6 Mon Sep 17 00:00:00 2001 From: Maoni Stephens Date: Fri, 15 Aug 2025 16:53:00 -0700 Subject: [PATCH 5/6] introduce a few configs for DATAS fine tuning (#118762) and if the GCGen0MaxBudget config is specified, always honor it including for DATAS --- src/coreclr/gc/gc.cpp | 105 +++++++++++++++++++++++++++----------- src/coreclr/gc/gcconfig.h | 5 +- src/coreclr/gc/gcpriv.h | 30 +++++++---- 3 files changed, 101 insertions(+), 39 deletions(-) diff --git a/src/coreclr/gc/gc.cpp b/src/coreclr/gc/gc.cpp index cacae581ae019a..d2c6420aa265dd 100644 --- a/src/coreclr/gc/gc.cpp +++ b/src/coreclr/gc/gc.cpp @@ -44216,42 +44216,48 @@ void gc_heap::init_static_data() { size_t gen0_min_size = get_gen0_min_size(); - size_t gen0_max_size = -#ifdef MULTIPLE_HEAPS - max ((size_t)6*1024*1024, min ( Align(soh_segment_size/2), (size_t)200*1024*1024)); -#else //MULTIPLE_HEAPS - ( -#ifdef BACKGROUND_GC - gc_can_use_concurrent ? - 6*1024*1024 : -#endif //BACKGROUND_GC - max ((size_t)6*1024*1024, min ( Align(soh_segment_size/2), (size_t)200*1024*1024)) - ); -#endif //MULTIPLE_HEAPS - - gen0_max_size = max (gen0_min_size, gen0_max_size); - - if (heap_hard_limit) - { - size_t gen0_max_size_seg = soh_segment_size / 4; - dprintf (GTC_LOG, ("limit gen0 max %zd->%zd", gen0_max_size, gen0_max_size_seg)); - gen0_max_size = min (gen0_max_size, gen0_max_size_seg); - } + size_t gen0_max_size = 0; size_t gen0_max_size_config = (size_t)GCConfig::GetGCGen0MaxBudget(); if (gen0_max_size_config) { - gen0_max_size = min (gen0_max_size, gen0_max_size_config); + gen0_max_size = gen0_max_size_config; #ifdef FEATURE_EVENT_TRACE gen0_max_budget_from_config = gen0_max_size; #endif //FEATURE_EVENT_TRACE } + else + { + gen0_max_size = +#ifdef MULTIPLE_HEAPS + max ((size_t)6 * 1024 * 1024, min (Align(soh_segment_size / 2), (size_t)200 * 1024 * 1024)); +#else //MULTIPLE_HEAPS + ( +#ifdef BACKGROUND_GC + gc_can_use_concurrent ? + 6 * 1024 * 1024 : +#endif //BACKGROUND_GC + max ((size_t)6 * 1024 * 1024, min (Align(soh_segment_size / 2), (size_t)200 * 1024 * 1024)) + ); +#endif //MULTIPLE_HEAPS + + gen0_max_size = max (gen0_min_size, gen0_max_size); + + if (heap_hard_limit) + { + size_t gen0_max_size_seg = soh_segment_size / 4; + dprintf (GTC_LOG, ("limit gen0 max %zd->%zd", gen0_max_size, gen0_max_size_seg)); + gen0_max_size = min (gen0_max_size, gen0_max_size_seg); + } + } gen0_max_size = Align (gen0_max_size); gen0_min_size = min (gen0_min_size, gen0_max_size); + GCConfig::SetGCGen0MaxBudget (gen0_max_size); + // TODO: gen0_max_size has a 200mb cap; gen1_max_size should also have a cap. size_t gen1_max_size = (size_t) #ifdef MULTIPLE_HEAPS @@ -44284,6 +44290,17 @@ void gc_heap::init_static_data() static_data_table[i][0].max_size = gen0_max_size; static_data_table[i][1].max_size = gen1_max_size; } + +#ifdef DYNAMIC_HEAP_COUNT + if (gc_heap::dynamic_adaptation_mode == dynamic_adaptation_to_application_sizes) + { + gc_heap::dynamic_heap_count_data.min_gen0_new_allocation = gen0_min_size; + if (gen0_max_size_config) + { + gc_heap::dynamic_heap_count_data.max_gen0_new_allocation = gen0_max_size; + } + } +#endif //DYNAMIC_HEAP_COUNT } bool gc_heap::init_dynamic_data() @@ -49735,13 +49752,43 @@ HRESULT GCHeap::Initialize() } // This should be adjusted based on the target tcp. See comments in gcpriv.h gc_heap::dynamic_heap_count_data.around_target_threshold = 10.0; - // This should really be set as part of computing static data and should take conserve_mem_setting into consideration. - gc_heap::dynamic_heap_count_data.max_gen0_new_allocation = Align (min (dd_max_size (gc_heap::g_heaps[0]->dynamic_data_of (0)), (size_t)(64 * 1024 * 1024)), get_alignment_constant (TRUE)); - gc_heap::dynamic_heap_count_data.min_gen0_new_allocation = Align (dd_min_size (gc_heap::g_heaps[0]->dynamic_data_of (0)), get_alignment_constant (TRUE)); - dprintf (6666, ("datas max gen0 budget %Id, min %Id", - gc_heap::dynamic_heap_count_data.max_gen0_new_allocation, gc_heap::dynamic_heap_count_data.min_gen0_new_allocation)); + int gen0_growth_soh_ratio_percent = (int)GCConfig::GetGCDGen0GrowthPercent(); + if (gen0_growth_soh_ratio_percent) + { + gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_percent = (int)GCConfig::GetGCDGen0GrowthPercent() * 0.01f; + } + // You can specify what sizes you want to allow DATAS to stay within wrt the SOH stable size. + // By default DATAS allows 10x this size for gen0 budget when the size is small, and 0.1x when the size is large. + int gen0_growth_min_permil = (int)GCConfig::GetGCDGen0GrowthMinFactor(); + int gen0_growth_max_permil = (int)GCConfig::GetGCDGen0GrowthMaxFactor(); + if (gen0_growth_min_permil) + { + gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_min = gen0_growth_min_permil * 0.001f; + } + if (gen0_growth_max_permil) + { + gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_max = gen0_growth_max_permil * 0.001f; + } + + if (gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_min > gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_max) + { + log_init_error_to_host ("DATAS min permil for gen0 growth %d is greater than max %d, it needs to be lower", + gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_min, gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_max); + return E_FAIL; + } + + GCConfig::SetGCDTargetTCP ((int)gc_heap::dynamic_heap_count_data.target_tcp); + GCConfig::SetGCDGen0GrowthPercent ((int)(gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_percent * 100.0f)); + GCConfig::SetGCDGen0GrowthMinFactor ((int)(gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_min * 1000.0f)); + GCConfig::SetGCDGen0GrowthMaxFactor ((int)(gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_max * 1000.0f)); + dprintf (6666, ("DATAS gen0 growth multiplier will be adjusted by %d%%, cap %.3f-%.3f, min budget %Id, max %Id", + (int)GCConfig::GetGCDGen0GrowthPercent(), + gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_min, gc_heap::dynamic_heap_count_data.gen0_growth_soh_ratio_max, + gc_heap::dynamic_heap_count_data.min_gen0_new_allocation, gc_heap::dynamic_heap_count_data.max_gen0_new_allocation)); } + + GCConfig::SetGCDynamicAdaptationMode (gc_heap::dynamic_adaptation_mode); #endif //DYNAMIC_HEAP_COUNT GCScan::GcRuntimeStructuresValid (TRUE); @@ -52280,13 +52327,11 @@ size_t gc_heap::get_gen0_min_size() gen0size = gen0size / 8 * 5; } -#ifdef USE_REGIONS #ifdef STRESS_REGIONS // This is just so we can test allocation using more than one region on machines with very // small caches. gen0size = ((size_t)1 << min_segment_size_shr) * 3; #endif //STRESS_REGIONS -#endif //USE_REGIONS gen0size = Align (gen0size); @@ -53883,6 +53928,8 @@ bool gc_heap::compute_memory_settings(bool is_initialization, uint32_t& nhp, uin m_high_memory_load_th = min ((high_memory_load_th + 5), v_high_memory_load_th); almost_high_memory_load_th = (high_memory_load_th > 5) ? (high_memory_load_th - 5) : 1; // avoid underflow of high_memory_load_th - 5 + GCConfig::SetGCHighMemPercent (high_memory_load_th); + return true; } diff --git a/src/coreclr/gc/gcconfig.h b/src/coreclr/gc/gcconfig.h index 9d5af77fa74fb0..aa23ff7ebc59c8 100644 --- a/src/coreclr/gc/gcconfig.h +++ b/src/coreclr/gc/gcconfig.h @@ -98,7 +98,7 @@ class GCConfigStringHolder "prefixed by the CPU group number. Example: Unix - 1,3,5,7-9,12, Windows - 0:1,1:7-9") \ INT_CONFIG (GCHighMemPercent, "GCHighMemPercent", "System.GC.HighMemoryPercent", 0, "The percent for GC to consider as high memory") \ INT_CONFIG (GCProvModeStress, "GCProvModeStress", NULL, 0, "Stress the provisional modes") \ - INT_CONFIG (GCGen0MaxBudget, "GCGen0MaxBudget", NULL, 0, "Specifies the largest gen0 allocation budget") \ + INT_CONFIG (GCGen0MaxBudget, "GCGen0MaxBudget", "System.GC.Gen0MaxBudget", 0, "Specifies the largest gen0 allocation budget") \ INT_CONFIG (GCGen1MaxBudget, "GCGen1MaxBudget", NULL, 0, "Specifies the largest gen1 allocation budget") \ INT_CONFIG (GCLowSkipRatio, "GCLowSkipRatio", NULL, 30, "Specifies the low generation skip ratio") \ INT_CONFIG (GCHeapHardLimit, "GCHeapHardLimit", "System.GC.HeapHardLimit", 0, "Specifies a hard limit for the GC heap") \ @@ -144,6 +144,9 @@ class GCConfigStringHolder INT_CONFIG (GCDynamicAdaptationMode, "GCDynamicAdaptationMode", "System.GC.DynamicAdaptationMode", 1, "Enable the GC to dynamically adapt to application sizes.") \ INT_CONFIG (GCDTargetTCP, "GCDTargetTCP", "System.GC.DTargetTCP", 0, "Specifies the target tcp for DATAS") \ INT_CONFIG (GCDBGCRatio, "GCDBGCRatio", NULL, 0, "Specifies the ratio of BGC to NGC2 for HC change") \ + INT_CONFIG (GCDGen0GrowthPercent, "GCDGen0GrowthPercent", "System.GC.DGen0GrowthPercent", 0, "Specifies the percentage of the default growth factor") \ + INT_CONFIG (GCDGen0GrowthMinFactor, "GCDGen0GrowthMinFactor", "System.GC.DGen0GrowthMinFactor", 0, "Specifies the minimum growth factor in permil") \ + INT_CONFIG (GCDGen0GrowthMaxFactor, "GCDGen0GrowthMaxFactor", "System.GC.DGen0GrowthMaxFactor", 0, "Specifies the maximum growth factor in permil") \ BOOL_CONFIG (GCCacheSizeFromSysConf, "GCCacheSizeFromSysConf", NULL, false, "Specifies using sysconf to retrieve the last level cache size for Unix.") // This class is responsible for retreiving configuration information diff --git a/src/coreclr/gc/gcpriv.h b/src/coreclr/gc/gcpriv.h index 5c8988b7ac8a92..79a2dd1b2d4ba5 100644 --- a/src/coreclr/gc/gcpriv.h +++ b/src/coreclr/gc/gcpriv.h @@ -4388,6 +4388,18 @@ class gc_heap float target_tcp = 2.0; float target_gen2_tcp = 10.0; + // The following 3 constants are used in the computation for the total gen0 budget relative to the stable soh size. + // + // By default DATAS computes a multiplier (gen0_growth_soh_ratio) that scales the size. This multiplier follows + // a power decay curve where the multiplier decreases rapidly as the size increases. We cap it at 10x at the low + // end and 10% at the high end. + // + // You can choose to modify these by specifying gen0_growth_factor_percent to reduce or increase this multiplier + // and the min/max multipliers. + float gen0_growth_soh_ratio_percent = 1.0; + float gen0_growth_soh_ratio_min = 0.1f; + float gen0_growth_soh_ratio_max = 10.0; + static const int recorded_adjustment_size = 4; static const int sample_size = 3; static const int recorded_tcp_array_size = 64; @@ -5069,23 +5081,23 @@ class gc_heap // time in msl). // - size_t max_gen0_new_allocation; - size_t min_gen0_new_allocation; + size_t max_gen0_new_allocation = 64 * 1024 * 1024; + size_t min_gen0_new_allocation = 0; size_t compute_total_gen0_budget (size_t total_soh_stable_size) { assert (total_soh_stable_size > 0); - float factor = (float)(20 - conserve_mem_setting); - double old_gen_growth_factor = factor / sqrt ((double)total_soh_stable_size / 1000.0 / 1000.0); - double saved_old_gen_growth_factor = old_gen_growth_factor; - old_gen_growth_factor = min (10.0, old_gen_growth_factor); - old_gen_growth_factor = max (0.1, old_gen_growth_factor); + float factor = (float)(20 - conserve_mem_setting) * gen0_growth_soh_ratio_percent; + double gen0_growth_soh_ratio = factor / sqrt ((double)total_soh_stable_size / 1000.0 / 1000.0); + double saved_gen0_growth_soh_ratio = gen0_growth_soh_ratio; + gen0_growth_soh_ratio = min ((double)gen0_growth_soh_ratio_max, gen0_growth_soh_ratio); + gen0_growth_soh_ratio = max ((double)gen0_growth_soh_ratio_min, gen0_growth_soh_ratio); - size_t total_new_allocation_old_gen = (size_t)(old_gen_growth_factor * (double)total_soh_stable_size); + size_t total_new_allocation_old_gen = (size_t)(gen0_growth_soh_ratio * (double)total_soh_stable_size); dprintf (6666, ("stable soh %Id (%.3fmb), factor %.3f=>%.3f -> total gen0 new_alloc %Id (%.3fmb)", total_soh_stable_size, ((double)total_soh_stable_size / 1000.0 / 1000.0), - saved_old_gen_growth_factor, old_gen_growth_factor, total_new_allocation_old_gen, + saved_gen0_growth_soh_ratio, gen0_growth_soh_ratio, total_new_allocation_old_gen, ((double)total_new_allocation_old_gen / 1000.0 / 1000.0))); return total_new_allocation_old_gen; } From c270c9e92d16d7fd0592eff15521f50cf8d9cf25 Mon Sep 17 00:00:00 2001 From: Jackson Schuster <36744439+jtschuster@users.noreply.github.com> Date: Fri, 15 Aug 2025 17:14:04 -0700 Subject: [PATCH 6/6] Add limit on trim analyzer CFG convergence iterations (#118760) With large block counts, the CFG convergence takes a long time and performs a lot of Meets, allocating a new Dictionary for each Value in each block. This adds up to gigabytes of allocations in the process. Ideally we would fix the performance issue with some optimization, but I'm still working on a proper solution. To fix the issue for .NET 10 in the meantime, we can add a limit to the number of iterations to bail out if we reach an excessively large number of iterations. The largest number of iterations in the runtime build is 2600, so 10,000 seems fairly reasonable. The build time of the project in issue #118121 is around ~20 seconds with 10,000 iterations and ~70 seconds with 20,000. --- .../DataFlow/LocalDataFlowAnalysis.cs | 19 +- .../DynamicallyAccessedMembersAnalyzer.cs | 12 +- .../DataFlow/ForwardDataFlowAnalysis.cs | 10 +- .../illink/src/ILLink.Shared/DiagnosticId.cs | 1 + .../src/ILLink.Shared/SharedStrings.resx | 6 + .../DataFlow/DataflowFailsToConverge.cs | 10027 ++++++++++++++++ 6 files changed, 10064 insertions(+), 11 deletions(-) create mode 100644 src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/DataflowFailsToConverge.cs diff --git a/src/tools/illink/src/ILLink.RoslynAnalyzer/DataFlow/LocalDataFlowAnalysis.cs b/src/tools/illink/src/ILLink.RoslynAnalyzer/DataFlow/LocalDataFlowAnalysis.cs index 9a4b3484bd213c..3b87c62452fd28 100644 --- a/src/tools/illink/src/ILLink.RoslynAnalyzer/DataFlow/LocalDataFlowAnalysis.cs +++ b/src/tools/illink/src/ILLink.RoslynAnalyzer/DataFlow/LocalDataFlowAnalysis.cs @@ -63,8 +63,9 @@ protected LocalDataFlowAnalysis( OperationBlock = operationBlock; } - public void InterproceduralAnalyze() + public bool InterproceduralAnalyze() { + bool succeeded = true; ValueSetLattice methodGroupLattice = default; DictionaryLattice, MaybeLattice> hoistedLocalLattice = default; var interproceduralStateLattice = new InterproceduralStateLattice( @@ -75,8 +76,8 @@ public void InterproceduralAnalyze() if (OperationBlock is IAttributeOperation attribute) { - AnalyzeAttribute(Context.OwningSymbol, attribute); - return; + succeeded &= AnalyzeAttribute(Context.OwningSymbol, attribute); + return succeeded; } Debug.Assert(Context.OwningSymbol is not IMethodSymbol methodSymbol || @@ -91,29 +92,31 @@ public void InterproceduralAnalyze() Debug.Assert(!oldInterproceduralState.Methods.IsUnknown()); foreach (var method in oldInterproceduralState.Methods.GetKnownValues()) { - AnalyzeMethod(method, ref interproceduralState); + succeeded &= AnalyzeMethod(method, ref interproceduralState); } } + return succeeded; } - private void AnalyzeAttribute(ISymbol owningSymbol, IAttributeOperation attribute) + private bool AnalyzeAttribute(ISymbol owningSymbol, IAttributeOperation attribute) { var cfg = Context.GetControlFlowGraph(attribute); var lValueFlowCaptures = LValueFlowCapturesProvider.CreateLValueFlowCaptures(cfg); var visitor = GetVisitor(owningSymbol, cfg, lValueFlowCaptures, default); - Fixpoint(new ControlFlowGraphProxy(cfg), visitor); + return Fixpoint(new ControlFlowGraphProxy(cfg), visitor); } - private void AnalyzeMethod(MethodBodyValue method, ref InterproceduralState interproceduralState) + private bool AnalyzeMethod(MethodBodyValue method, ref InterproceduralState interproceduralState) { var cfg = method.ControlFlowGraph; var lValueFlowCaptures = LValueFlowCapturesProvider.CreateLValueFlowCaptures(cfg); var visitor = GetVisitor(method.OwningSymbol, cfg, lValueFlowCaptures, interproceduralState); - Fixpoint(new ControlFlowGraphProxy(cfg), visitor); + bool succeeded = Fixpoint(new ControlFlowGraphProxy(cfg), visitor); // The interprocedural state struct is stored as a field of the visitor and modified // in-place there, but we also need those modifications to be reflected here. interproceduralState = visitor.InterproceduralState; + return succeeded; } protected abstract TTransfer GetVisitor( diff --git a/src/tools/illink/src/ILLink.RoslynAnalyzer/DynamicallyAccessedMembersAnalyzer.cs b/src/tools/illink/src/ILLink.RoslynAnalyzer/DynamicallyAccessedMembersAnalyzer.cs index d7020dbbe546a8..31284d48b17d10 100644 --- a/src/tools/illink/src/ILLink.RoslynAnalyzer/DynamicallyAccessedMembersAnalyzer.cs +++ b/src/tools/illink/src/ILLink.RoslynAnalyzer/DynamicallyAccessedMembersAnalyzer.cs @@ -61,6 +61,7 @@ public static ImmutableArray GetSupportedDiagnostics() diagDescriptorsArrayBuilder.Add(DiagnosticDescriptors.GetDiagnosticDescriptor(DiagnosticId.ReturnValueDoesNotMatchFeatureGuards)); diagDescriptorsArrayBuilder.Add(DiagnosticDescriptors.GetDiagnosticDescriptor(DiagnosticId.InvalidFeatureGuard)); diagDescriptorsArrayBuilder.Add(DiagnosticDescriptors.GetDiagnosticDescriptor(DiagnosticId.TypeMapGroupTypeCannotBeStaticallyDetermined)); + diagDescriptorsArrayBuilder.Add(DiagnosticDescriptors.GetDiagnosticDescriptor(DiagnosticId.DataflowAnalysisDidNotConverge)); foreach (var requiresAnalyzer in RequiresAnalyzers.Value) { @@ -110,8 +111,17 @@ public override void Initialize(AnalysisContext context) foreach (var operationBlock in context.OperationBlocks) { TrimDataFlowAnalysis trimDataFlowAnalysis = new(context, dataFlowAnalyzerContext, operationBlock); - trimDataFlowAnalysis.InterproceduralAnalyze(); + bool success = trimDataFlowAnalysis.InterproceduralAnalyze(); trimDataFlowAnalysis.ReportDiagnostics(context.ReportDiagnostic); + if (!success) + { + context.ReportDiagnostic( + Diagnostic.Create(DiagnosticDescriptors.GetDiagnosticDescriptor( + DiagnosticId.DataflowAnalysisDidNotConverge, + diagnosticSeverity: DiagnosticSeverity.Warning), + operationBlock.Syntax.GetLocation(), + operationBlock.FindContainingSymbol(context.OwningSymbol).GetDisplayName())); + } } }); diff --git a/src/tools/illink/src/ILLink.Shared/DataFlow/ForwardDataFlowAnalysis.cs b/src/tools/illink/src/ILLink.Shared/DataFlow/ForwardDataFlowAnalysis.cs index a6db2e022b945b..e0499b9ca800cf 100644 --- a/src/tools/illink/src/ILLink.Shared/DataFlow/ForwardDataFlowAnalysis.cs +++ b/src/tools/illink/src/ILLink.Shared/DataFlow/ForwardDataFlowAnalysis.cs @@ -214,7 +214,7 @@ successor.ConditionKind is ConditionKind.WhenTrue // This just runs a dataflow algorithm until convergence. It doesn't cache any results, // allowing each particular kind of analysis to decide what is worth saving. - public void Fixpoint(TControlFlowGraph cfg, TTransfer transfer) + public bool Fixpoint(TControlFlowGraph cfg, TTransfer transfer) { TraceStart(cfg); @@ -244,11 +244,15 @@ public void Fixpoint(TControlFlowGraph cfg, TTransfer transfer) }; bool changed = true; - while (changed) + const int MaxIterations = 10_000; + int iterations = 0; + while (changed && iterations < MaxIterations) { changed = false; foreach (var block in cfg.Blocks) { + if (++iterations >= MaxIterations) + break; TraceVisitBlock(block); @@ -417,6 +421,8 @@ public void Fixpoint(TControlFlowGraph cfg, TTransfer transfer) } } + return !changed || iterations >= MaxIterations; + void FlowStateThroughExitedFinallys( IControlFlowGraph.ControlFlowBranch predecessor, ref TValue predecessorState) diff --git a/src/tools/illink/src/ILLink.Shared/DiagnosticId.cs b/src/tools/illink/src/ILLink.Shared/DiagnosticId.cs index 364a7974700a98..dba2ccee7ad288 100644 --- a/src/tools/illink/src/ILLink.Shared/DiagnosticId.cs +++ b/src/tools/illink/src/ILLink.Shared/DiagnosticId.cs @@ -190,6 +190,7 @@ public enum DiagnosticId RequiresUnreferencedCodeOnEntryPoint = 2123, TypeMapGroupTypeCannotBeStaticallyDetermined = 2124, ReferenceNotMarkedIsTrimmable = 2125, + DataflowAnalysisDidNotConverge = 2126, _EndTrimAnalysisWarningsSentinel, // Single-file diagnostic ids. diff --git a/src/tools/illink/src/ILLink.Shared/SharedStrings.resx b/src/tools/illink/src/ILLink.Shared/SharedStrings.resx index aaa57abe34b60b..04cd8c6e4f7c43 100644 --- a/src/tools/illink/src/ILLink.Shared/SharedStrings.resx +++ b/src/tools/illink/src/ILLink.Shared/SharedStrings.resx @@ -1251,4 +1251,10 @@ Referenced assembly '{0}' is not built with `true` and may not be compatible with AOT. + + Trim dataflow analysis took too long to complete. Trim safety cannot be guaranteed. + + + Trim dataflow analysis of member '{0}' took too long to complete. Trim safety cannot be guaranteed. + diff --git a/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/DataflowFailsToConverge.cs b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/DataflowFailsToConverge.cs new file mode 100644 index 00000000000000..508a44f7460ef4 --- /dev/null +++ b/src/tools/illink/test/Mono.Linker.Tests.Cases/DataFlow/DataflowFailsToConverge.cs @@ -0,0 +1,10027 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using Mono.Linker.Tests.Cases.Expectations.Assertions; +using Mono.Linker.Tests.Cases.Expectations.Helpers; +using Mono.Linker.Tests.Cases.Expectations.Metadata; + +namespace Mono.Linker.Tests.Cases.DataFlow +{ + [SkipKeptItemsValidation] + [ExpectedNoWarnings] + public class DataflowFailsToConverge + { + public static void Main() + { + System.Console.WriteLine(MyDictionary["1"]); + } + + [ExpectedWarning("IL2126", "MyDictionary", Tool.Analyzer, "Analyzer only warning")] + public static Dictionary MyDictionary { get; } = new() + { + ["1"] = "1", + ["2"] = "2", + ["3"] = "3", + ["4"] = "4", + ["5"] = "5", + ["6"] = "6", + ["7"] = "7", + ["8"] = "8", + ["9"] = "9", + ["10"] = "10", + ["11"] = "11", + ["12"] = "12", + ["13"] = "13", + ["14"] = "14", + ["15"] = "15", + ["16"] = "16", + ["17"] = "17", + ["18"] = "18", + ["19"] = "19", + ["20"] = "20", + ["21"] = "21", + ["22"] = "22", + ["23"] = "23", + ["24"] = "24", + ["25"] = "25", + ["26"] = "26", + ["27"] = "27", + ["28"] = "28", + ["29"] = "29", + ["30"] = "30", + ["31"] = "31", + ["32"] = "32", + ["33"] = "33", + ["34"] = "34", + ["35"] = "35", + ["36"] = "36", + ["37"] = "37", + ["38"] = "38", + ["39"] = "39", + ["40"] = "40", + ["41"] = "41", + ["42"] = "42", + ["43"] = "43", + ["44"] = "44", + ["45"] = "45", + ["46"] = "46", + ["47"] = "47", + ["48"] = "48", + ["49"] = "49", + ["50"] = "50", + ["51"] = "51", + ["52"] = "52", + ["53"] = "53", + ["54"] = "54", + ["55"] = "55", + ["56"] = "56", + ["57"] = "57", + ["58"] = "58", + ["59"] = "59", + ["60"] = "60", + ["61"] = "61", + ["62"] = "62", + ["63"] = "63", + ["64"] = "64", + ["65"] = "65", + ["66"] = "66", + ["67"] = "67", + ["68"] = "68", + ["69"] = "69", + ["70"] = "70", + ["71"] = "71", + ["72"] = "72", + ["73"] = "73", + ["74"] = "74", + ["75"] = "75", + ["76"] = "76", + ["77"] = "77", + ["78"] = "78", + ["79"] = "79", + ["80"] = "80", + ["81"] = "81", + ["82"] = "82", + ["83"] = "83", + ["84"] = "84", + ["85"] = "85", + ["86"] = "86", + ["87"] = "87", + ["88"] = "88", + ["89"] = "89", + ["90"] = "90", + ["91"] = "91", + ["92"] = "92", + ["93"] = "93", + ["94"] = "94", + ["95"] = "95", + ["96"] = "96", + ["97"] = "97", + ["98"] = "98", + ["99"] = "99", + ["100"] = "100", + ["101"] = "1", + ["102"] = "2", + ["103"] = "3", + ["104"] = "4", + ["105"] = "5", + ["106"] = "6", + ["107"] = "7", + ["108"] = "8", + ["109"] = "9", + ["110"] = "10", + ["111"] = "11", + ["112"] = "12", + ["113"] = "13", + ["114"] = "14", + ["115"] = "15", + ["116"] = "16", + ["117"] = "17", + ["118"] = "18", + ["119"] = "19", + ["120"] = "20", + ["121"] = "21", + ["122"] = "22", + ["123"] = "23", + ["124"] = "24", + ["125"] = "25", + ["126"] = "26", + ["127"] = "27", + ["128"] = "28", + ["129"] = "29", + ["130"] = "30", + ["131"] = "31", + ["132"] = "32", + ["133"] = "33", + ["134"] = "34", + ["135"] = "35", + ["136"] = "36", + ["137"] = "37", + ["138"] = "38", + ["139"] = "39", + ["140"] = "40", + ["141"] = "41", + ["142"] = "42", + ["143"] = "43", + ["144"] = "44", + ["145"] = "45", + ["146"] = "46", + ["147"] = "47", + ["148"] = "48", + ["149"] = "49", + ["150"] = "50", + ["151"] = "51", + ["152"] = "52", + ["153"] = "53", + ["154"] = "54", + ["155"] = "55", + ["156"] = "56", + ["157"] = "57", + ["158"] = "58", + ["159"] = "59", + ["160"] = "60", + ["161"] = "61", + ["162"] = "62", + ["163"] = "63", + ["164"] = "64", + ["165"] = "65", + ["166"] = "66", + ["167"] = "67", + ["168"] = "68", + ["169"] = "69", + ["170"] = "70", + ["171"] = "71", + ["172"] = "72", + ["173"] = "73", + ["174"] = "74", + ["175"] = "75", + ["176"] = "76", + ["177"] = "77", + ["178"] = "78", + ["179"] = "79", + ["180"] = "80", + ["181"] = "81", + ["182"] = "82", + ["183"] = "83", + ["184"] = "84", + ["185"] = "85", + ["186"] = "86", + ["187"] = "87", + ["188"] = "88", + ["189"] = "89", + ["190"] = "90", + ["191"] = "91", + ["192"] = "92", + ["193"] = "93", + ["194"] = "94", + ["195"] = "95", + ["196"] = "96", + ["197"] = "97", + ["198"] = "98", + ["199"] = "99", + ["200"] = "100", + ["201"] = "1", + ["202"] = "2", + ["203"] = "3", + ["204"] = "4", + ["205"] = "5", + ["206"] = "6", + ["207"] = "7", + ["208"] = "8", + ["209"] = "9", + ["210"] = "10", + ["211"] = "11", + ["212"] = "12", + ["213"] = "13", + ["214"] = "14", + ["215"] = "15", + ["216"] = "16", + ["217"] = "17", + ["218"] = "18", + ["219"] = "19", + ["220"] = "20", + ["221"] = "21", + ["222"] = "22", + ["223"] = "23", + ["224"] = "24", + ["225"] = "25", + ["226"] = "26", + ["227"] = "27", + ["228"] = "28", + ["229"] = "29", + ["230"] = "30", + ["231"] = "31", + ["232"] = "32", + ["233"] = "33", + ["234"] = "34", + ["235"] = "35", + ["236"] = "36", + ["237"] = "37", + ["238"] = "38", + ["239"] = "39", + ["240"] = "40", + ["241"] = "41", + ["242"] = "42", + ["243"] = "43", + ["244"] = "44", + ["245"] = "45", + ["246"] = "46", + ["247"] = "47", + ["248"] = "48", + ["249"] = "49", + ["250"] = "50", + ["251"] = "51", + ["252"] = "52", + ["253"] = "53", + ["254"] = "54", + ["255"] = "55", + ["256"] = "56", + ["257"] = "57", + ["258"] = "58", + ["259"] = "59", + ["260"] = "60", + ["261"] = "61", + ["262"] = "62", + ["263"] = "63", + ["264"] = "64", + ["265"] = "65", + ["266"] = "66", + ["267"] = "67", + ["268"] = "68", + ["269"] = "69", + ["270"] = "70", + ["271"] = "71", + ["272"] = "72", + ["273"] = "73", + ["274"] = "74", + ["275"] = "75", + ["276"] = "76", + ["277"] = "77", + ["278"] = "78", + ["279"] = "79", + ["280"] = "80", + ["281"] = "81", + ["282"] = "82", + ["283"] = "83", + ["284"] = "84", + ["285"] = "85", + ["286"] = "86", + ["287"] = "87", + ["288"] = "88", + ["289"] = "89", + ["290"] = "90", + ["291"] = "91", + ["292"] = "92", + ["293"] = "93", + ["294"] = "94", + ["295"] = "95", + ["296"] = "96", + ["297"] = "97", + ["298"] = "98", + ["299"] = "99", + ["300"] = "100", + ["301"] = "1", + ["302"] = "2", + ["303"] = "3", + ["304"] = "4", + ["305"] = "5", + ["306"] = "6", + ["307"] = "7", + ["308"] = "8", + ["309"] = "9", + ["310"] = "10", + ["311"] = "11", + ["312"] = "12", + ["313"] = "13", + ["314"] = "14", + ["315"] = "15", + ["316"] = "16", + ["317"] = "17", + ["318"] = "18", + ["319"] = "19", + ["320"] = "20", + ["321"] = "21", + ["322"] = "22", + ["323"] = "23", + ["324"] = "24", + ["325"] = "25", + ["326"] = "26", + ["327"] = "27", + ["328"] = "28", + ["329"] = "29", + ["330"] = "30", + ["331"] = "31", + ["332"] = "32", + ["333"] = "33", + ["334"] = "34", + ["335"] = "35", + ["336"] = "36", + ["337"] = "37", + ["338"] = "38", + ["339"] = "39", + ["340"] = "40", + ["341"] = "41", + ["342"] = "42", + ["343"] = "43", + ["344"] = "44", + ["345"] = "45", + ["346"] = "46", + ["347"] = "47", + ["348"] = "48", + ["349"] = "49", + ["350"] = "50", + ["351"] = "51", + ["352"] = "52", + ["353"] = "53", + ["354"] = "54", + ["355"] = "55", + ["356"] = "56", + ["357"] = "57", + ["358"] = "58", + ["359"] = "59", + ["360"] = "60", + ["361"] = "61", + ["362"] = "62", + ["363"] = "63", + ["364"] = "64", + ["365"] = "65", + ["366"] = "66", + ["367"] = "67", + ["368"] = "68", + ["369"] = "69", + ["370"] = "70", + ["371"] = "71", + ["372"] = "72", + ["373"] = "73", + ["374"] = "74", + ["375"] = "75", + ["376"] = "76", + ["377"] = "77", + ["378"] = "78", + ["379"] = "79", + ["380"] = "80", + ["381"] = "81", + ["382"] = "82", + ["383"] = "83", + ["384"] = "84", + ["385"] = "85", + ["386"] = "86", + ["387"] = "87", + ["388"] = "88", + ["389"] = "89", + ["390"] = "90", + ["391"] = "91", + ["392"] = "92", + ["393"] = "93", + ["394"] = "94", + ["395"] = "95", + ["396"] = "96", + ["397"] = "97", + ["398"] = "98", + ["399"] = "99", + ["400"] = "100", + ["401"] = "1", + ["402"] = "2", + ["403"] = "3", + ["404"] = "4", + ["405"] = "5", + ["406"] = "6", + ["407"] = "7", + ["408"] = "8", + ["409"] = "9", + ["410"] = "10", + ["411"] = "11", + ["412"] = "12", + ["413"] = "13", + ["414"] = "14", + ["415"] = "15", + ["416"] = "16", + ["417"] = "17", + ["418"] = "18", + ["419"] = "19", + ["420"] = "20", + ["421"] = "21", + ["422"] = "22", + ["423"] = "23", + ["424"] = "24", + ["425"] = "25", + ["426"] = "26", + ["427"] = "27", + ["428"] = "28", + ["429"] = "29", + ["430"] = "30", + ["431"] = "31", + ["432"] = "32", + ["433"] = "33", + ["434"] = "34", + ["435"] = "35", + ["436"] = "36", + ["437"] = "37", + ["438"] = "38", + ["439"] = "39", + ["440"] = "40", + ["441"] = "41", + ["442"] = "42", + ["443"] = "43", + ["444"] = "44", + ["445"] = "45", + ["446"] = "46", + ["447"] = "47", + ["448"] = "48", + ["449"] = "49", + ["450"] = "50", + ["451"] = "51", + ["452"] = "52", + ["453"] = "53", + ["454"] = "54", + ["455"] = "55", + ["456"] = "56", + ["457"] = "57", + ["458"] = "58", + ["459"] = "59", + ["460"] = "60", + ["461"] = "61", + ["462"] = "62", + ["463"] = "63", + ["464"] = "64", + ["465"] = "65", + ["466"] = "66", + ["467"] = "67", + ["468"] = "68", + ["469"] = "69", + ["470"] = "70", + ["471"] = "71", + ["472"] = "72", + ["473"] = "73", + ["474"] = "74", + ["475"] = "75", + ["476"] = "76", + ["477"] = "77", + ["478"] = "78", + ["479"] = "79", + ["480"] = "80", + ["481"] = "81", + ["482"] = "82", + ["483"] = "83", + ["484"] = "84", + ["485"] = "85", + ["486"] = "86", + ["487"] = "87", + ["488"] = "88", + ["489"] = "89", + ["490"] = "90", + ["491"] = "91", + ["492"] = "92", + ["493"] = "93", + ["494"] = "94", + ["495"] = "95", + ["496"] = "96", + ["497"] = "97", + ["498"] = "98", + ["499"] = "99", + ["500"] = "100", + ["501"] = "1", + ["502"] = "2", + ["503"] = "3", + ["504"] = "4", + ["505"] = "5", + ["506"] = "6", + ["507"] = "7", + ["508"] = "8", + ["509"] = "9", + ["510"] = "10", + ["511"] = "11", + ["512"] = "12", + ["513"] = "13", + ["514"] = "14", + ["515"] = "15", + ["516"] = "16", + ["517"] = "17", + ["518"] = "18", + ["519"] = "19", + ["520"] = "20", + ["521"] = "21", + ["522"] = "22", + ["523"] = "23", + ["524"] = "24", + ["525"] = "25", + ["526"] = "26", + ["527"] = "27", + ["528"] = "28", + ["529"] = "29", + ["530"] = "30", + ["531"] = "31", + ["532"] = "32", + ["533"] = "33", + ["534"] = "34", + ["535"] = "35", + ["536"] = "36", + ["537"] = "37", + ["538"] = "38", + ["539"] = "39", + ["540"] = "40", + ["541"] = "41", + ["542"] = "42", + ["543"] = "43", + ["544"] = "44", + ["545"] = "45", + ["546"] = "46", + ["547"] = "47", + ["548"] = "48", + ["549"] = "49", + ["550"] = "50", + ["551"] = "51", + ["552"] = "52", + ["553"] = "53", + ["554"] = "54", + ["555"] = "55", + ["556"] = "56", + ["557"] = "57", + ["558"] = "58", + ["559"] = "59", + ["560"] = "60", + ["561"] = "61", + ["562"] = "62", + ["563"] = "63", + ["564"] = "64", + ["565"] = "65", + ["566"] = "66", + ["567"] = "67", + ["568"] = "68", + ["569"] = "69", + ["570"] = "70", + ["571"] = "71", + ["572"] = "72", + ["573"] = "73", + ["574"] = "74", + ["575"] = "75", + ["576"] = "76", + ["577"] = "77", + ["578"] = "78", + ["579"] = "79", + ["580"] = "80", + ["581"] = "81", + ["582"] = "82", + ["583"] = "83", + ["584"] = "84", + ["585"] = "85", + ["586"] = "86", + ["587"] = "87", + ["588"] = "88", + ["589"] = "89", + ["590"] = "90", + ["591"] = "91", + ["592"] = "92", + ["593"] = "93", + ["594"] = "94", + ["595"] = "95", + ["596"] = "96", + ["597"] = "97", + ["598"] = "98", + ["599"] = "99", + ["600"] = "100", + ["601"] = "1", + ["602"] = "2", + ["603"] = "3", + ["604"] = "4", + ["605"] = "5", + ["606"] = "6", + ["607"] = "7", + ["608"] = "8", + ["609"] = "9", + ["610"] = "10", + ["611"] = "11", + ["612"] = "12", + ["613"] = "13", + ["614"] = "14", + ["615"] = "15", + ["616"] = "16", + ["617"] = "17", + ["618"] = "18", + ["619"] = "19", + ["620"] = "20", + ["621"] = "21", + ["622"] = "22", + ["623"] = "23", + ["624"] = "24", + ["625"] = "25", + ["626"] = "26", + ["627"] = "27", + ["628"] = "28", + ["629"] = "29", + ["630"] = "30", + ["631"] = "31", + ["632"] = "32", + ["633"] = "33", + ["634"] = "34", + ["635"] = "35", + ["636"] = "36", + ["637"] = "37", + ["638"] = "38", + ["639"] = "39", + ["640"] = "40", + ["641"] = "41", + ["642"] = "42", + ["643"] = "43", + ["644"] = "44", + ["645"] = "45", + ["646"] = "46", + ["647"] = "47", + ["648"] = "48", + ["649"] = "49", + ["650"] = "50", + ["651"] = "51", + ["652"] = "52", + ["653"] = "53", + ["654"] = "54", + ["655"] = "55", + ["656"] = "56", + ["657"] = "57", + ["658"] = "58", + ["659"] = "59", + ["660"] = "60", + ["661"] = "61", + ["662"] = "62", + ["663"] = "63", + ["664"] = "64", + ["665"] = "65", + ["666"] = "66", + ["667"] = "67", + ["668"] = "68", + ["669"] = "69", + ["670"] = "70", + ["671"] = "71", + ["672"] = "72", + ["673"] = "73", + ["674"] = "74", + ["675"] = "75", + ["676"] = "76", + ["677"] = "77", + ["678"] = "78", + ["679"] = "79", + ["680"] = "80", + ["681"] = "81", + ["682"] = "82", + ["683"] = "83", + ["684"] = "84", + ["685"] = "85", + ["686"] = "86", + ["687"] = "87", + ["688"] = "88", + ["689"] = "89", + ["690"] = "90", + ["691"] = "91", + ["692"] = "92", + ["693"] = "93", + ["694"] = "94", + ["695"] = "95", + ["696"] = "96", + ["697"] = "97", + ["698"] = "98", + ["699"] = "99", + ["700"] = "100", + ["701"] = "1", + ["702"] = "2", + ["703"] = "3", + ["704"] = "4", + ["705"] = "5", + ["706"] = "6", + ["707"] = "7", + ["708"] = "8", + ["709"] = "9", + ["710"] = "10", + ["711"] = "11", + ["712"] = "12", + ["713"] = "13", + ["714"] = "14", + ["715"] = "15", + ["716"] = "16", + ["717"] = "17", + ["718"] = "18", + ["719"] = "19", + ["720"] = "20", + ["721"] = "21", + ["722"] = "22", + ["723"] = "23", + ["724"] = "24", + ["725"] = "25", + ["726"] = "26", + ["727"] = "27", + ["728"] = "28", + ["729"] = "29", + ["730"] = "30", + ["731"] = "31", + ["732"] = "32", + ["733"] = "33", + ["734"] = "34", + ["735"] = "35", + ["736"] = "36", + ["737"] = "37", + ["738"] = "38", + ["739"] = "39", + ["740"] = "40", + ["741"] = "41", + ["742"] = "42", + ["743"] = "43", + ["744"] = "44", + ["745"] = "45", + ["746"] = "46", + ["747"] = "47", + ["748"] = "48", + ["749"] = "49", + ["750"] = "50", + ["751"] = "51", + ["752"] = "52", + ["753"] = "53", + ["754"] = "54", + ["755"] = "55", + ["756"] = "56", + ["757"] = "57", + ["758"] = "58", + ["759"] = "59", + ["760"] = "60", + ["761"] = "61", + ["762"] = "62", + ["763"] = "63", + ["764"] = "64", + ["765"] = "65", + ["766"] = "66", + ["767"] = "67", + ["768"] = "68", + ["769"] = "69", + ["770"] = "70", + ["771"] = "71", + ["772"] = "72", + ["773"] = "73", + ["774"] = "74", + ["775"] = "75", + ["776"] = "76", + ["777"] = "77", + ["778"] = "78", + ["779"] = "79", + ["780"] = "80", + ["781"] = "81", + ["782"] = "82", + ["783"] = "83", + ["784"] = "84", + ["785"] = "85", + ["786"] = "86", + ["787"] = "87", + ["788"] = "88", + ["789"] = "89", + ["790"] = "90", + ["791"] = "91", + ["792"] = "92", + ["793"] = "93", + ["794"] = "94", + ["795"] = "95", + ["796"] = "96", + ["797"] = "97", + ["798"] = "98", + ["799"] = "99", + ["800"] = "100", + ["801"] = "1", + ["802"] = "2", + ["803"] = "3", + ["804"] = "4", + ["805"] = "5", + ["806"] = "6", + ["807"] = "7", + ["808"] = "8", + ["809"] = "9", + ["810"] = "10", + ["811"] = "11", + ["812"] = "12", + ["813"] = "13", + ["814"] = "14", + ["815"] = "15", + ["816"] = "16", + ["817"] = "17", + ["818"] = "18", + ["819"] = "19", + ["820"] = "20", + ["821"] = "21", + ["822"] = "22", + ["823"] = "23", + ["824"] = "24", + ["825"] = "25", + ["826"] = "26", + ["827"] = "27", + ["828"] = "28", + ["829"] = "29", + ["830"] = "30", + ["831"] = "31", + ["832"] = "32", + ["833"] = "33", + ["834"] = "34", + ["835"] = "35", + ["836"] = "36", + ["837"] = "37", + ["838"] = "38", + ["839"] = "39", + ["840"] = "40", + ["841"] = "41", + ["842"] = "42", + ["843"] = "43", + ["844"] = "44", + ["845"] = "45", + ["846"] = "46", + ["847"] = "47", + ["848"] = "48", + ["849"] = "49", + ["850"] = "50", + ["851"] = "51", + ["852"] = "52", + ["853"] = "53", + ["854"] = "54", + ["855"] = "55", + ["856"] = "56", + ["857"] = "57", + ["858"] = "58", + ["859"] = "59", + ["860"] = "60", + ["861"] = "61", + ["862"] = "62", + ["863"] = "63", + ["864"] = "64", + ["865"] = "65", + ["866"] = "66", + ["867"] = "67", + ["868"] = "68", + ["869"] = "69", + ["870"] = "70", + ["871"] = "71", + ["872"] = "72", + ["873"] = "73", + ["874"] = "74", + ["875"] = "75", + ["876"] = "76", + ["877"] = "77", + ["878"] = "78", + ["879"] = "79", + ["880"] = "80", + ["881"] = "81", + ["882"] = "82", + ["883"] = "83", + ["884"] = "84", + ["885"] = "85", + ["886"] = "86", + ["887"] = "87", + ["888"] = "88", + ["889"] = "89", + ["890"] = "90", + ["891"] = "91", + ["892"] = "92", + ["893"] = "93", + ["894"] = "94", + ["895"] = "95", + ["896"] = "96", + ["897"] = "97", + ["898"] = "98", + ["899"] = "99", + ["900"] = "100", + ["901"] = "1", + ["902"] = "2", + ["903"] = "3", + ["904"] = "4", + ["905"] = "5", + ["906"] = "6", + ["907"] = "7", + ["908"] = "8", + ["909"] = "9", + ["910"] = "10", + ["911"] = "11", + ["912"] = "12", + ["913"] = "13", + ["914"] = "14", + ["915"] = "15", + ["916"] = "16", + ["917"] = "17", + ["918"] = "18", + ["919"] = "19", + ["920"] = "20", + ["921"] = "21", + ["922"] = "22", + ["923"] = "23", + ["924"] = "24", + ["925"] = "25", + ["926"] = "26", + ["927"] = "27", + ["928"] = "28", + ["929"] = "29", + ["930"] = "30", + ["931"] = "31", + ["932"] = "32", + ["933"] = "33", + ["934"] = "34", + ["935"] = "35", + ["936"] = "36", + ["937"] = "37", + ["938"] = "38", + ["939"] = "39", + ["940"] = "40", + ["941"] = "41", + ["942"] = "42", + ["943"] = "43", + ["944"] = "44", + ["945"] = "45", + ["946"] = "46", + ["947"] = "47", + ["948"] = "48", + ["949"] = "49", + ["950"] = "50", + ["951"] = "51", + ["952"] = "52", + ["953"] = "53", + ["954"] = "54", + ["955"] = "55", + ["956"] = "56", + ["957"] = "57", + ["958"] = "58", + ["959"] = "59", + ["960"] = "60", + ["961"] = "61", + ["962"] = "62", + ["963"] = "63", + ["964"] = "64", + ["965"] = "65", + ["966"] = "66", + ["967"] = "67", + ["968"] = "68", + ["969"] = "69", + ["970"] = "70", + ["971"] = "71", + ["972"] = "72", + ["973"] = "73", + ["974"] = "74", + ["975"] = "75", + ["976"] = "76", + ["977"] = "77", + ["978"] = "78", + ["979"] = "79", + ["980"] = "80", + ["981"] = "81", + ["982"] = "82", + ["983"] = "83", + ["984"] = "84", + ["985"] = "85", + ["986"] = "86", + ["987"] = "87", + ["988"] = "88", + ["989"] = "89", + ["990"] = "90", + ["991"] = "91", + ["992"] = "92", + ["993"] = "93", + ["994"] = "94", + ["995"] = "95", + ["996"] = "96", + ["997"] = "97", + ["998"] = "98", + ["999"] = "99", + ["1000"] = "99", + ["1001"] = "1", + ["1002"] = "2", + ["1003"] = "3", + ["1004"] = "4", + ["1005"] = "5", + ["1006"] = "6", + ["1007"] = "7", + ["1008"] = "8", + ["1009"] = "9", + ["1000"] = "10", + ["1011"] = "11", + ["1012"] = "12", + ["1013"] = "13", + ["1014"] = "14", + ["1015"] = "15", + ["1016"] = "16", + ["1017"] = "17", + ["1018"] = "18", + ["1019"] = "19", + ["1020"] = "20", + ["1021"] = "21", + ["1022"] = "22", + ["1023"] = "23", + ["1024"] = "24", + ["1025"] = "25", + ["1026"] = "26", + ["1027"] = "27", + ["1028"] = "28", + ["1029"] = "29", + ["1030"] = "30", + ["1031"] = "31", + ["1032"] = "32", + ["1033"] = "33", + ["1034"] = "34", + ["1035"] = "35", + ["1036"] = "36", + ["1037"] = "37", + ["1038"] = "38", + ["1039"] = "39", + ["1040"] = "40", + ["1041"] = "41", + ["1042"] = "42", + ["1043"] = "43", + ["1044"] = "44", + ["1045"] = "45", + ["1046"] = "46", + ["1047"] = "47", + ["1048"] = "48", + ["1049"] = "49", + ["1050"] = "50", + ["1051"] = "51", + ["1052"] = "52", + ["1053"] = "53", + ["1054"] = "54", + ["1055"] = "55", + ["1056"] = "56", + ["1057"] = "57", + ["1058"] = "58", + ["1059"] = "59", + ["1060"] = "60", + ["1061"] = "61", + ["1062"] = "62", + ["1063"] = "63", + ["1064"] = "64", + ["1065"] = "65", + ["1066"] = "66", + ["1067"] = "67", + ["1068"] = "68", + ["1069"] = "69", + ["1070"] = "70", + ["1071"] = "71", + ["1072"] = "72", + ["1073"] = "73", + ["1074"] = "74", + ["1075"] = "75", + ["1076"] = "76", + ["1077"] = "77", + ["1078"] = "78", + ["1079"] = "79", + ["1080"] = "80", + ["1081"] = "81", + ["1082"] = "82", + ["1083"] = "83", + ["1084"] = "84", + ["1085"] = "85", + ["1086"] = "86", + ["1087"] = "87", + ["1088"] = "88", + ["1089"] = "89", + ["1090"] = "90", + ["1091"] = "91", + ["1092"] = "92", + ["1093"] = "93", + ["1094"] = "94", + ["1095"] = "95", + ["1096"] = "96", + ["1097"] = "97", + ["1098"] = "98", + ["1099"] = "99", + ["1100"] = "100", + ["1101"] = "1", + ["1102"] = "2", + ["1103"] = "3", + ["1104"] = "4", + ["1105"] = "5", + ["1106"] = "6", + ["1107"] = "7", + ["1108"] = "8", + ["1109"] = "9", + ["1110"] = "10", + ["1111"] = "11", + ["1112"] = "12", + ["1113"] = "13", + ["1114"] = "14", + ["1115"] = "15", + ["1116"] = "16", + ["1117"] = "17", + ["1118"] = "18", + ["1119"] = "19", + ["1120"] = "20", + ["1121"] = "21", + ["1122"] = "22", + ["1123"] = "23", + ["1124"] = "24", + ["1125"] = "25", + ["1126"] = "26", + ["1127"] = "27", + ["1128"] = "28", + ["1129"] = "29", + ["1130"] = "30", + ["1131"] = "31", + ["1132"] = "32", + ["1133"] = "33", + ["1134"] = "34", + ["1135"] = "35", + ["1136"] = "36", + ["1137"] = "37", + ["1138"] = "38", + ["1139"] = "39", + ["1140"] = "40", + ["1141"] = "41", + ["1142"] = "42", + ["1143"] = "43", + ["1144"] = "44", + ["1145"] = "45", + ["1146"] = "46", + ["1147"] = "47", + ["1148"] = "48", + ["1149"] = "49", + ["1150"] = "50", + ["1151"] = "51", + ["1152"] = "52", + ["1153"] = "53", + ["1154"] = "54", + ["1155"] = "55", + ["1156"] = "56", + ["1157"] = "57", + ["1158"] = "58", + ["1159"] = "59", + ["1160"] = "60", + ["1161"] = "61", + ["1162"] = "62", + ["1163"] = "63", + ["1164"] = "64", + ["1165"] = "65", + ["1166"] = "66", + ["1167"] = "67", + ["1168"] = "68", + ["1169"] = "69", + ["1170"] = "70", + ["1171"] = "71", + ["1172"] = "72", + ["1173"] = "73", + ["1174"] = "74", + ["1175"] = "75", + ["1176"] = "76", + ["1177"] = "77", + ["1178"] = "78", + ["1179"] = "79", + ["1180"] = "80", + ["1181"] = "81", + ["1182"] = "82", + ["1183"] = "83", + ["1184"] = "84", + ["1185"] = "85", + ["1186"] = "86", + ["1187"] = "87", + ["1188"] = "88", + ["1189"] = "89", + ["1190"] = "90", + ["1191"] = "91", + ["1192"] = "92", + ["1193"] = "93", + ["1194"] = "94", + ["1195"] = "95", + ["1196"] = "96", + ["1197"] = "97", + ["1198"] = "98", + ["1199"] = "99", + ["1200"] = "100", + ["1201"] = "1", + ["1202"] = "2", + ["1203"] = "3", + ["1204"] = "4", + ["1205"] = "5", + ["1206"] = "6", + ["1207"] = "7", + ["1208"] = "8", + ["1209"] = "9", + ["1210"] = "10", + ["1211"] = "11", + ["1212"] = "12", + ["1213"] = "13", + ["1214"] = "14", + ["1215"] = "15", + ["1216"] = "16", + ["1217"] = "17", + ["1218"] = "18", + ["1219"] = "19", + ["1220"] = "20", + ["1221"] = "21", + ["1222"] = "22", + ["1223"] = "23", + ["1224"] = "24", + ["1225"] = "25", + ["1226"] = "26", + ["1227"] = "27", + ["1228"] = "28", + ["1229"] = "29", + ["1230"] = "30", + ["1231"] = "31", + ["1232"] = "32", + ["1233"] = "33", + ["1234"] = "34", + ["1235"] = "35", + ["1236"] = "36", + ["1237"] = "37", + ["1238"] = "38", + ["1239"] = "39", + ["1240"] = "40", + ["1241"] = "41", + ["1242"] = "42", + ["1243"] = "43", + ["1244"] = "44", + ["1245"] = "45", + ["1246"] = "46", + ["1247"] = "47", + ["1248"] = "48", + ["1249"] = "49", + ["1250"] = "50", + ["1251"] = "51", + ["1252"] = "52", + ["1253"] = "53", + ["1254"] = "54", + ["1255"] = "55", + ["1256"] = "56", + ["1257"] = "57", + ["1258"] = "58", + ["1259"] = "59", + ["1260"] = "60", + ["1261"] = "61", + ["1262"] = "62", + ["1263"] = "63", + ["1264"] = "64", + ["1265"] = "65", + ["1266"] = "66", + ["1267"] = "67", + ["1268"] = "68", + ["1269"] = "69", + ["1270"] = "70", + ["1271"] = "71", + ["1272"] = "72", + ["1273"] = "73", + ["1274"] = "74", + ["1275"] = "75", + ["1276"] = "76", + ["1277"] = "77", + ["1278"] = "78", + ["1279"] = "79", + ["1280"] = "80", + ["1281"] = "81", + ["1282"] = "82", + ["1283"] = "83", + ["1284"] = "84", + ["1285"] = "85", + ["1286"] = "86", + ["1287"] = "87", + ["1288"] = "88", + ["1289"] = "89", + ["1290"] = "90", + ["1291"] = "91", + ["1292"] = "92", + ["1293"] = "93", + ["1294"] = "94", + ["1295"] = "95", + ["1296"] = "96", + ["1297"] = "97", + ["1298"] = "98", + ["1299"] = "99", + ["1300"] = "100", + ["1301"] = "1", + ["1302"] = "2", + ["1303"] = "3", + ["1304"] = "4", + ["1305"] = "5", + ["1306"] = "6", + ["1307"] = "7", + ["1308"] = "8", + ["1309"] = "9", + ["1310"] = "10", + ["1311"] = "11", + ["1312"] = "12", + ["1313"] = "13", + ["1314"] = "14", + ["1315"] = "15", + ["1316"] = "16", + ["1317"] = "17", + ["1318"] = "18", + ["1319"] = "19", + ["1320"] = "20", + ["1321"] = "21", + ["1322"] = "22", + ["1323"] = "23", + ["1324"] = "24", + ["1325"] = "25", + ["1326"] = "26", + ["1327"] = "27", + ["1328"] = "28", + ["1329"] = "29", + ["1330"] = "30", + ["1331"] = "31", + ["1332"] = "32", + ["1333"] = "33", + ["1334"] = "34", + ["1335"] = "35", + ["1336"] = "36", + ["1337"] = "37", + ["1338"] = "38", + ["1339"] = "39", + ["1340"] = "40", + ["1341"] = "41", + ["1342"] = "42", + ["1343"] = "43", + ["1344"] = "44", + ["1345"] = "45", + ["1346"] = "46", + ["1347"] = "47", + ["1348"] = "48", + ["1349"] = "49", + ["1350"] = "50", + ["1351"] = "51", + ["1352"] = "52", + ["1353"] = "53", + ["1354"] = "54", + ["1355"] = "55", + ["1356"] = "56", + ["1357"] = "57", + ["1358"] = "58", + ["1359"] = "59", + ["1360"] = "60", + ["1361"] = "61", + ["1362"] = "62", + ["1363"] = "63", + ["1364"] = "64", + ["1365"] = "65", + ["1366"] = "66", + ["1367"] = "67", + ["1368"] = "68", + ["1369"] = "69", + ["1370"] = "70", + ["1371"] = "71", + ["1372"] = "72", + ["1373"] = "73", + ["1374"] = "74", + ["1375"] = "75", + ["1376"] = "76", + ["1377"] = "77", + ["1378"] = "78", + ["1379"] = "79", + ["1380"] = "80", + ["1381"] = "81", + ["1382"] = "82", + ["1383"] = "83", + ["1384"] = "84", + ["1385"] = "85", + ["1386"] = "86", + ["1387"] = "87", + ["1388"] = "88", + ["1389"] = "89", + ["1390"] = "90", + ["1391"] = "91", + ["1392"] = "92", + ["1393"] = "93", + ["1394"] = "94", + ["1395"] = "95", + ["1396"] = "96", + ["1397"] = "97", + ["1398"] = "98", + ["1399"] = "99", + ["1400"] = "100", + ["1401"] = "1", + ["1402"] = "2", + ["1403"] = "3", + ["1404"] = "4", + ["1405"] = "5", + ["1406"] = "6", + ["1407"] = "7", + ["1408"] = "8", + ["1409"] = "9", + ["1410"] = "10", + ["1411"] = "11", + ["1412"] = "12", + ["1413"] = "13", + ["1414"] = "14", + ["1415"] = "15", + ["1416"] = "16", + ["1417"] = "17", + ["1418"] = "18", + ["1419"] = "19", + ["1420"] = "20", + ["1421"] = "21", + ["1422"] = "22", + ["1423"] = "23", + ["1424"] = "24", + ["1425"] = "25", + ["1426"] = "26", + ["1427"] = "27", + ["1428"] = "28", + ["1429"] = "29", + ["1430"] = "30", + ["1431"] = "31", + ["1432"] = "32", + ["1433"] = "33", + ["1434"] = "34", + ["1435"] = "35", + ["1436"] = "36", + ["1437"] = "37", + ["1438"] = "38", + ["1439"] = "39", + ["1440"] = "40", + ["1441"] = "41", + ["1442"] = "42", + ["1443"] = "43", + ["1444"] = "44", + ["1445"] = "45", + ["1446"] = "46", + ["1447"] = "47", + ["1448"] = "48", + ["1449"] = "49", + ["1450"] = "50", + ["1451"] = "51", + ["1452"] = "52", + ["1453"] = "53", + ["1454"] = "54", + ["1455"] = "55", + ["1456"] = "56", + ["1457"] = "57", + ["1458"] = "58", + ["1459"] = "59", + ["1460"] = "60", + ["1461"] = "61", + ["1462"] = "62", + ["1463"] = "63", + ["1464"] = "64", + ["1465"] = "65", + ["1466"] = "66", + ["1467"] = "67", + ["1468"] = "68", + ["1469"] = "69", + ["1470"] = "70", + ["1471"] = "71", + ["1472"] = "72", + ["1473"] = "73", + ["1474"] = "74", + ["1475"] = "75", + ["1476"] = "76", + ["1477"] = "77", + ["1478"] = "78", + ["1479"] = "79", + ["1480"] = "80", + ["1481"] = "81", + ["1482"] = "82", + ["1483"] = "83", + ["1484"] = "84", + ["1485"] = "85", + ["1486"] = "86", + ["1487"] = "87", + ["1488"] = "88", + ["1489"] = "89", + ["1490"] = "90", + ["1491"] = "91", + ["1492"] = "92", + ["1493"] = "93", + ["1494"] = "94", + ["1495"] = "95", + ["1496"] = "96", + ["1497"] = "97", + ["1498"] = "98", + ["1499"] = "99", + ["1500"] = "100", + ["1501"] = "1", + ["1502"] = "2", + ["1503"] = "3", + ["1504"] = "4", + ["1505"] = "5", + ["1506"] = "6", + ["1507"] = "7", + ["1508"] = "8", + ["1509"] = "9", + ["1510"] = "10", + ["1511"] = "11", + ["1512"] = "12", + ["1513"] = "13", + ["1514"] = "14", + ["1515"] = "15", + ["1516"] = "16", + ["1517"] = "17", + ["1518"] = "18", + ["1519"] = "19", + ["1520"] = "20", + ["1521"] = "21", + ["1522"] = "22", + ["1523"] = "23", + ["1524"] = "24", + ["1525"] = "25", + ["1526"] = "26", + ["1527"] = "27", + ["1528"] = "28", + ["1529"] = "29", + ["1530"] = "30", + ["1531"] = "31", + ["1532"] = "32", + ["1533"] = "33", + ["1534"] = "34", + ["1535"] = "35", + ["1536"] = "36", + ["1537"] = "37", + ["1538"] = "38", + ["1539"] = "39", + ["1540"] = "40", + ["1541"] = "41", + ["1542"] = "42", + ["1543"] = "43", + ["1544"] = "44", + ["1545"] = "45", + ["1546"] = "46", + ["1547"] = "47", + ["1548"] = "48", + ["1549"] = "49", + ["1550"] = "50", + ["1551"] = "51", + ["1552"] = "52", + ["1553"] = "53", + ["1554"] = "54", + ["1555"] = "55", + ["1556"] = "56", + ["1557"] = "57", + ["1558"] = "58", + ["1559"] = "59", + ["1560"] = "60", + ["1561"] = "61", + ["1562"] = "62", + ["1563"] = "63", + ["1564"] = "64", + ["1565"] = "65", + ["1566"] = "66", + ["1567"] = "67", + ["1568"] = "68", + ["1569"] = "69", + ["1570"] = "70", + ["1571"] = "71", + ["1572"] = "72", + ["1573"] = "73", + ["1574"] = "74", + ["1575"] = "75", + ["1576"] = "76", + ["1577"] = "77", + ["1578"] = "78", + ["1579"] = "79", + ["1580"] = "80", + ["1581"] = "81", + ["1582"] = "82", + ["1583"] = "83", + ["1584"] = "84", + ["1585"] = "85", + ["1586"] = "86", + ["1587"] = "87", + ["1588"] = "88", + ["1589"] = "89", + ["1590"] = "90", + ["1591"] = "91", + ["1592"] = "92", + ["1593"] = "93", + ["1594"] = "94", + ["1595"] = "95", + ["1596"] = "96", + ["1597"] = "97", + ["1598"] = "98", + ["1599"] = "99", + ["1600"] = "100", + ["1601"] = "1", + ["1602"] = "2", + ["1603"] = "3", + ["1604"] = "4", + ["1605"] = "5", + ["1606"] = "6", + ["1607"] = "7", + ["1608"] = "8", + ["1609"] = "9", + ["1610"] = "10", + ["1611"] = "11", + ["1612"] = "12", + ["1613"] = "13", + ["1614"] = "14", + ["1615"] = "15", + ["1616"] = "16", + ["1617"] = "17", + ["1618"] = "18", + ["1619"] = "19", + ["1620"] = "20", + ["1621"] = "21", + ["1622"] = "22", + ["1623"] = "23", + ["1624"] = "24", + ["1625"] = "25", + ["1626"] = "26", + ["1627"] = "27", + ["1628"] = "28", + ["1629"] = "29", + ["1630"] = "30", + ["1631"] = "31", + ["1632"] = "32", + ["1633"] = "33", + ["1634"] = "34", + ["1635"] = "35", + ["1636"] = "36", + ["1637"] = "37", + ["1638"] = "38", + ["1639"] = "39", + ["1640"] = "40", + ["1641"] = "41", + ["1642"] = "42", + ["1643"] = "43", + ["1644"] = "44", + ["1645"] = "45", + ["1646"] = "46", + ["1647"] = "47", + ["1648"] = "48", + ["1649"] = "49", + ["1650"] = "50", + ["1651"] = "51", + ["1652"] = "52", + ["1653"] = "53", + ["1654"] = "54", + ["1655"] = "55", + ["1656"] = "56", + ["1657"] = "57", + ["1658"] = "58", + ["1659"] = "59", + ["1660"] = "60", + ["1661"] = "61", + ["1662"] = "62", + ["1663"] = "63", + ["1664"] = "64", + ["1665"] = "65", + ["1666"] = "66", + ["1667"] = "67", + ["1668"] = "68", + ["1669"] = "69", + ["1670"] = "70", + ["1671"] = "71", + ["1672"] = "72", + ["1673"] = "73", + ["1674"] = "74", + ["1675"] = "75", + ["1676"] = "76", + ["1677"] = "77", + ["1678"] = "78", + ["1679"] = "79", + ["1680"] = "80", + ["1681"] = "81", + ["1682"] = "82", + ["1683"] = "83", + ["1684"] = "84", + ["1685"] = "85", + ["1686"] = "86", + ["1687"] = "87", + ["1688"] = "88", + ["1689"] = "89", + ["1690"] = "90", + ["1691"] = "91", + ["1692"] = "92", + ["1693"] = "93", + ["1694"] = "94", + ["1695"] = "95", + ["1696"] = "96", + ["1697"] = "97", + ["1698"] = "98", + ["1699"] = "99", + ["1700"] = "100", + ["1701"] = "1", + ["1702"] = "2", + ["1703"] = "3", + ["1704"] = "4", + ["1705"] = "5", + ["1706"] = "6", + ["1707"] = "7", + ["1708"] = "8", + ["1709"] = "9", + ["1710"] = "10", + ["1711"] = "11", + ["1712"] = "12", + ["1713"] = "13", + ["1714"] = "14", + ["1715"] = "15", + ["1716"] = "16", + ["1717"] = "17", + ["1718"] = "18", + ["1719"] = "19", + ["1720"] = "20", + ["1721"] = "21", + ["1722"] = "22", + ["1723"] = "23", + ["1724"] = "24", + ["1725"] = "25", + ["1726"] = "26", + ["1727"] = "27", + ["1728"] = "28", + ["1729"] = "29", + ["1730"] = "30", + ["1731"] = "31", + ["1732"] = "32", + ["1733"] = "33", + ["1734"] = "34", + ["1735"] = "35", + ["1736"] = "36", + ["1737"] = "37", + ["1738"] = "38", + ["1739"] = "39", + ["1740"] = "40", + ["1741"] = "41", + ["1742"] = "42", + ["1743"] = "43", + ["1744"] = "44", + ["1745"] = "45", + ["1746"] = "46", + ["1747"] = "47", + ["1748"] = "48", + ["1749"] = "49", + ["1750"] = "50", + ["1751"] = "51", + ["1752"] = "52", + ["1753"] = "53", + ["1754"] = "54", + ["1755"] = "55", + ["1756"] = "56", + ["1757"] = "57", + ["1758"] = "58", + ["1759"] = "59", + ["1760"] = "60", + ["1761"] = "61", + ["1762"] = "62", + ["1763"] = "63", + ["1764"] = "64", + ["1765"] = "65", + ["1766"] = "66", + ["1767"] = "67", + ["1768"] = "68", + ["1769"] = "69", + ["1770"] = "70", + ["1771"] = "71", + ["1772"] = "72", + ["1773"] = "73", + ["1774"] = "74", + ["1775"] = "75", + ["1776"] = "76", + ["1777"] = "77", + ["1778"] = "78", + ["1779"] = "79", + ["1780"] = "80", + ["1781"] = "81", + ["1782"] = "82", + ["1783"] = "83", + ["1784"] = "84", + ["1785"] = "85", + ["1786"] = "86", + ["1787"] = "87", + ["1788"] = "88", + ["1789"] = "89", + ["1790"] = "90", + ["1791"] = "91", + ["1792"] = "92", + ["1793"] = "93", + ["1794"] = "94", + ["1795"] = "95", + ["1796"] = "96", + ["1797"] = "97", + ["1798"] = "98", + ["1799"] = "99", + ["1800"] = "100", + ["1801"] = "1", + ["1802"] = "2", + ["1803"] = "3", + ["1804"] = "4", + ["1805"] = "5", + ["1806"] = "6", + ["1807"] = "7", + ["1808"] = "8", + ["1809"] = "9", + ["1810"] = "10", + ["1811"] = "11", + ["1812"] = "12", + ["1813"] = "13", + ["1814"] = "14", + ["1815"] = "15", + ["1816"] = "16", + ["1817"] = "17", + ["1818"] = "18", + ["1819"] = "19", + ["1820"] = "20", + ["1821"] = "21", + ["1822"] = "22", + ["1823"] = "23", + ["1824"] = "24", + ["1825"] = "25", + ["1826"] = "26", + ["1827"] = "27", + ["1828"] = "28", + ["1829"] = "29", + ["1830"] = "30", + ["1831"] = "31", + ["1832"] = "32", + ["1833"] = "33", + ["1834"] = "34", + ["1835"] = "35", + ["1836"] = "36", + ["1837"] = "37", + ["1838"] = "38", + ["1839"] = "39", + ["1840"] = "40", + ["1841"] = "41", + ["1842"] = "42", + ["1843"] = "43", + ["1844"] = "44", + ["1845"] = "45", + ["1846"] = "46", + ["1847"] = "47", + ["1848"] = "48", + ["1849"] = "49", + ["1850"] = "50", + ["1851"] = "51", + ["1852"] = "52", + ["1853"] = "53", + ["1854"] = "54", + ["1855"] = "55", + ["1856"] = "56", + ["1857"] = "57", + ["1858"] = "58", + ["1859"] = "59", + ["1860"] = "60", + ["1861"] = "61", + ["1862"] = "62", + ["1863"] = "63", + ["1864"] = "64", + ["1865"] = "65", + ["1866"] = "66", + ["1867"] = "67", + ["1868"] = "68", + ["1869"] = "69", + ["1870"] = "70", + ["1871"] = "71", + ["1872"] = "72", + ["1873"] = "73", + ["1874"] = "74", + ["1875"] = "75", + ["1876"] = "76", + ["1877"] = "77", + ["1878"] = "78", + ["1879"] = "79", + ["1880"] = "80", + ["1881"] = "81", + ["1882"] = "82", + ["1883"] = "83", + ["1884"] = "84", + ["1885"] = "85", + ["1886"] = "86", + ["1887"] = "87", + ["1888"] = "88", + ["1889"] = "89", + ["1890"] = "90", + ["1891"] = "91", + ["1892"] = "92", + ["1893"] = "93", + ["1894"] = "94", + ["1895"] = "95", + ["1896"] = "96", + ["1897"] = "97", + ["1898"] = "98", + ["1899"] = "99", + ["1900"] = "100", + ["1901"] = "1", + ["1902"] = "2", + ["1903"] = "3", + ["1904"] = "4", + ["1905"] = "5", + ["1906"] = "6", + ["1907"] = "7", + ["1908"] = "8", + ["1909"] = "9", + ["1910"] = "10", + ["1911"] = "11", + ["1912"] = "12", + ["1913"] = "13", + ["1914"] = "14", + ["1915"] = "15", + ["1916"] = "16", + ["1917"] = "17", + ["1918"] = "18", + ["1919"] = "19", + ["1920"] = "20", + ["1921"] = "21", + ["1922"] = "22", + ["1923"] = "23", + ["1924"] = "24", + ["1925"] = "25", + ["1926"] = "26", + ["1927"] = "27", + ["1928"] = "28", + ["1929"] = "29", + ["1930"] = "30", + ["1931"] = "31", + ["1932"] = "32", + ["1933"] = "33", + ["1934"] = "34", + ["1935"] = "35", + ["1936"] = "36", + ["1937"] = "37", + ["1938"] = "38", + ["1939"] = "39", + ["1940"] = "40", + ["1941"] = "41", + ["1942"] = "42", + ["1943"] = "43", + ["1944"] = "44", + ["1945"] = "45", + ["1946"] = "46", + ["1947"] = "47", + ["1948"] = "48", + ["1949"] = "49", + ["1950"] = "50", + ["1951"] = "51", + ["1952"] = "52", + ["1953"] = "53", + ["1954"] = "54", + ["1955"] = "55", + ["1956"] = "56", + ["1957"] = "57", + ["1958"] = "58", + ["1959"] = "59", + ["1960"] = "60", + ["1961"] = "61", + ["1962"] = "62", + ["1963"] = "63", + ["1964"] = "64", + ["1965"] = "65", + ["1966"] = "66", + ["1967"] = "67", + ["1968"] = "68", + ["1969"] = "69", + ["1970"] = "70", + ["1971"] = "71", + ["1972"] = "72", + ["1973"] = "73", + ["1974"] = "74", + ["1975"] = "75", + ["1976"] = "76", + ["1977"] = "77", + ["1978"] = "78", + ["1979"] = "79", + ["1980"] = "80", + ["1981"] = "81", + ["1982"] = "82", + ["1983"] = "83", + ["1984"] = "84", + ["1985"] = "85", + ["1986"] = "86", + ["1987"] = "87", + ["1988"] = "88", + ["1989"] = "89", + ["1990"] = "90", + ["1991"] = "91", + ["1992"] = "92", + ["1993"] = "93", + ["1994"] = "94", + ["1995"] = "95", + ["1996"] = "96", + ["1997"] = "97", + ["1998"] = "98", + ["1999"] = "99", + ["2000"] = "99", + ["2001"] = "1", + ["2002"] = "2", + ["2003"] = "3", + ["2004"] = "4", + ["2005"] = "5", + ["2006"] = "6", + ["2007"] = "7", + ["2008"] = "8", + ["2009"] = "9", + ["2000"] = "10", + ["2011"] = "11", + ["2012"] = "12", + ["2013"] = "13", + ["2014"] = "14", + ["2015"] = "15", + ["2016"] = "16", + ["2017"] = "17", + ["2018"] = "18", + ["2019"] = "19", + ["2020"] = "20", + ["2021"] = "21", + ["2022"] = "22", + ["2023"] = "23", + ["2024"] = "24", + ["2025"] = "25", + ["2026"] = "26", + ["2027"] = "27", + ["2028"] = "28", + ["2029"] = "29", + ["2030"] = "30", + ["2031"] = "31", + ["2032"] = "32", + ["2033"] = "33", + ["2034"] = "34", + ["2035"] = "35", + ["2036"] = "36", + ["2037"] = "37", + ["2038"] = "38", + ["2039"] = "39", + ["2040"] = "40", + ["2041"] = "41", + ["2042"] = "42", + ["2043"] = "43", + ["2044"] = "44", + ["2045"] = "45", + ["2046"] = "46", + ["2047"] = "47", + ["2048"] = "48", + ["2049"] = "49", + ["2050"] = "50", + ["2051"] = "51", + ["2052"] = "52", + ["2053"] = "53", + ["2054"] = "54", + ["2055"] = "55", + ["2056"] = "56", + ["2057"] = "57", + ["2058"] = "58", + ["2059"] = "59", + ["2060"] = "60", + ["2061"] = "61", + ["2062"] = "62", + ["2063"] = "63", + ["2064"] = "64", + ["2065"] = "65", + ["2066"] = "66", + ["2067"] = "67", + ["2068"] = "68", + ["2069"] = "69", + ["2070"] = "70", + ["2071"] = "71", + ["2072"] = "72", + ["2073"] = "73", + ["2074"] = "74", + ["2075"] = "75", + ["2076"] = "76", + ["2077"] = "77", + ["2078"] = "78", + ["2079"] = "79", + ["2080"] = "80", + ["2081"] = "81", + ["2082"] = "82", + ["2083"] = "83", + ["2084"] = "84", + ["2085"] = "85", + ["2086"] = "86", + ["2087"] = "87", + ["2088"] = "88", + ["2089"] = "89", + ["2090"] = "90", + ["2091"] = "91", + ["2092"] = "92", + ["2093"] = "93", + ["2094"] = "94", + ["2095"] = "95", + ["2096"] = "96", + ["2097"] = "97", + ["2098"] = "98", + ["2099"] = "99", + ["2100"] = "100", + ["2101"] = "1", + ["2102"] = "2", + ["2103"] = "3", + ["2104"] = "4", + ["2105"] = "5", + ["2106"] = "6", + ["2107"] = "7", + ["2108"] = "8", + ["2109"] = "9", + ["2110"] = "10", + ["2111"] = "11", + ["2112"] = "12", + ["2113"] = "13", + ["2114"] = "14", + ["2115"] = "15", + ["2116"] = "16", + ["2117"] = "17", + ["2118"] = "18", + ["2119"] = "19", + ["2120"] = "20", + ["2121"] = "21", + ["2122"] = "22", + ["2123"] = "23", + ["2124"] = "24", + ["2125"] = "25", + ["2126"] = "26", + ["2127"] = "27", + ["2128"] = "28", + ["2129"] = "29", + ["2130"] = "30", + ["2131"] = "31", + ["2132"] = "32", + ["2133"] = "33", + ["2134"] = "34", + ["2135"] = "35", + ["2136"] = "36", + ["2137"] = "37", + ["2138"] = "38", + ["2139"] = "39", + ["2140"] = "40", + ["2141"] = "41", + ["2142"] = "42", + ["2143"] = "43", + ["2144"] = "44", + ["2145"] = "45", + ["2146"] = "46", + ["2147"] = "47", + ["2148"] = "48", + ["2149"] = "49", + ["2150"] = "50", + ["2151"] = "51", + ["2152"] = "52", + ["2153"] = "53", + ["2154"] = "54", + ["2155"] = "55", + ["2156"] = "56", + ["2157"] = "57", + ["2158"] = "58", + ["2159"] = "59", + ["2160"] = "60", + ["2161"] = "61", + ["2162"] = "62", + ["2163"] = "63", + ["2164"] = "64", + ["2165"] = "65", + ["2166"] = "66", + ["2167"] = "67", + ["2168"] = "68", + ["2169"] = "69", + ["2170"] = "70", + ["2171"] = "71", + ["2172"] = "72", + ["2173"] = "73", + ["2174"] = "74", + ["2175"] = "75", + ["2176"] = "76", + ["2177"] = "77", + ["2178"] = "78", + ["2179"] = "79", + ["2180"] = "80", + ["2181"] = "81", + ["2182"] = "82", + ["2183"] = "83", + ["2184"] = "84", + ["2185"] = "85", + ["2186"] = "86", + ["2187"] = "87", + ["2188"] = "88", + ["2189"] = "89", + ["2190"] = "90", + ["2191"] = "91", + ["2192"] = "92", + ["2193"] = "93", + ["2194"] = "94", + ["2195"] = "95", + ["2196"] = "96", + ["2197"] = "97", + ["2198"] = "98", + ["2199"] = "99", + ["2200"] = "100", + ["2201"] = "1", + ["2202"] = "2", + ["2203"] = "3", + ["2204"] = "4", + ["2205"] = "5", + ["2206"] = "6", + ["2207"] = "7", + ["2208"] = "8", + ["2209"] = "9", + ["2210"] = "10", + ["2211"] = "11", + ["2212"] = "12", + ["2213"] = "13", + ["2214"] = "14", + ["2215"] = "15", + ["2216"] = "16", + ["2217"] = "17", + ["2218"] = "18", + ["2219"] = "19", + ["2220"] = "20", + ["2221"] = "21", + ["2222"] = "22", + ["2223"] = "23", + ["2224"] = "24", + ["2225"] = "25", + ["2226"] = "26", + ["2227"] = "27", + ["2228"] = "28", + ["2229"] = "29", + ["2230"] = "30", + ["2231"] = "31", + ["2232"] = "32", + ["2233"] = "33", + ["2234"] = "34", + ["2235"] = "35", + ["2236"] = "36", + ["2237"] = "37", + ["2238"] = "38", + ["2239"] = "39", + ["2240"] = "40", + ["2241"] = "41", + ["2242"] = "42", + ["2243"] = "43", + ["2244"] = "44", + ["2245"] = "45", + ["2246"] = "46", + ["2247"] = "47", + ["2248"] = "48", + ["2249"] = "49", + ["2250"] = "50", + ["2251"] = "51", + ["2252"] = "52", + ["2253"] = "53", + ["2254"] = "54", + ["2255"] = "55", + ["2256"] = "56", + ["2257"] = "57", + ["2258"] = "58", + ["2259"] = "59", + ["2260"] = "60", + ["2261"] = "61", + ["2262"] = "62", + ["2263"] = "63", + ["2264"] = "64", + ["2265"] = "65", + ["2266"] = "66", + ["2267"] = "67", + ["2268"] = "68", + ["2269"] = "69", + ["2270"] = "70", + ["2271"] = "71", + ["2272"] = "72", + ["2273"] = "73", + ["2274"] = "74", + ["2275"] = "75", + ["2276"] = "76", + ["2277"] = "77", + ["2278"] = "78", + ["2279"] = "79", + ["2280"] = "80", + ["2281"] = "81", + ["2282"] = "82", + ["2283"] = "83", + ["2284"] = "84", + ["2285"] = "85", + ["2286"] = "86", + ["2287"] = "87", + ["2288"] = "88", + ["2289"] = "89", + ["2290"] = "90", + ["2291"] = "91", + ["2292"] = "92", + ["2293"] = "93", + ["2294"] = "94", + ["2295"] = "95", + ["2296"] = "96", + ["2297"] = "97", + ["2298"] = "98", + ["2299"] = "99", + ["2300"] = "100", + ["2301"] = "1", + ["2302"] = "2", + ["2303"] = "3", + ["2304"] = "4", + ["2305"] = "5", + ["2306"] = "6", + ["2307"] = "7", + ["2308"] = "8", + ["2309"] = "9", + ["2310"] = "10", + ["2311"] = "11", + ["2312"] = "12", + ["2313"] = "13", + ["2314"] = "14", + ["2315"] = "15", + ["2316"] = "16", + ["2317"] = "17", + ["2318"] = "18", + ["2319"] = "19", + ["2320"] = "20", + ["2321"] = "21", + ["2322"] = "22", + ["2323"] = "23", + ["2324"] = "24", + ["2325"] = "25", + ["2326"] = "26", + ["2327"] = "27", + ["2328"] = "28", + ["2329"] = "29", + ["2330"] = "30", + ["2331"] = "31", + ["2332"] = "32", + ["2333"] = "33", + ["2334"] = "34", + ["2335"] = "35", + ["2336"] = "36", + ["2337"] = "37", + ["2338"] = "38", + ["2339"] = "39", + ["2340"] = "40", + ["2341"] = "41", + ["2342"] = "42", + ["2343"] = "43", + ["2344"] = "44", + ["2345"] = "45", + ["2346"] = "46", + ["2347"] = "47", + ["2348"] = "48", + ["2349"] = "49", + ["2350"] = "50", + ["2351"] = "51", + ["2352"] = "52", + ["2353"] = "53", + ["2354"] = "54", + ["2355"] = "55", + ["2356"] = "56", + ["2357"] = "57", + ["2358"] = "58", + ["2359"] = "59", + ["2360"] = "60", + ["2361"] = "61", + ["2362"] = "62", + ["2363"] = "63", + ["2364"] = "64", + ["2365"] = "65", + ["2366"] = "66", + ["2367"] = "67", + ["2368"] = "68", + ["2369"] = "69", + ["2370"] = "70", + ["2371"] = "71", + ["2372"] = "72", + ["2373"] = "73", + ["2374"] = "74", + ["2375"] = "75", + ["2376"] = "76", + ["2377"] = "77", + ["2378"] = "78", + ["2379"] = "79", + ["2380"] = "80", + ["2381"] = "81", + ["2382"] = "82", + ["2383"] = "83", + ["2384"] = "84", + ["2385"] = "85", + ["2386"] = "86", + ["2387"] = "87", + ["2388"] = "88", + ["2389"] = "89", + ["2390"] = "90", + ["2391"] = "91", + ["2392"] = "92", + ["2393"] = "93", + ["2394"] = "94", + ["2395"] = "95", + ["2396"] = "96", + ["2397"] = "97", + ["2398"] = "98", + ["2399"] = "99", + ["2400"] = "100", + ["2401"] = "1", + ["2402"] = "2", + ["2403"] = "3", + ["2404"] = "4", + ["2405"] = "5", + ["2406"] = "6", + ["2407"] = "7", + ["2408"] = "8", + ["2409"] = "9", + ["2410"] = "10", + ["2411"] = "11", + ["2412"] = "12", + ["2413"] = "13", + ["2414"] = "14", + ["2415"] = "15", + ["2416"] = "16", + ["2417"] = "17", + ["2418"] = "18", + ["2419"] = "19", + ["2420"] = "20", + ["2421"] = "21", + ["2422"] = "22", + ["2423"] = "23", + ["2424"] = "24", + ["2425"] = "25", + ["2426"] = "26", + ["2427"] = "27", + ["2428"] = "28", + ["2429"] = "29", + ["2430"] = "30", + ["2431"] = "31", + ["2432"] = "32", + ["2433"] = "33", + ["2434"] = "34", + ["2435"] = "35", + ["2436"] = "36", + ["2437"] = "37", + ["2438"] = "38", + ["2439"] = "39", + ["2440"] = "40", + ["2441"] = "41", + ["2442"] = "42", + ["2443"] = "43", + ["2444"] = "44", + ["2445"] = "45", + ["2446"] = "46", + ["2447"] = "47", + ["2448"] = "48", + ["2449"] = "49", + ["2450"] = "50", + ["2451"] = "51", + ["2452"] = "52", + ["2453"] = "53", + ["2454"] = "54", + ["2455"] = "55", + ["2456"] = "56", + ["2457"] = "57", + ["2458"] = "58", + ["2459"] = "59", + ["2460"] = "60", + ["2461"] = "61", + ["2462"] = "62", + ["2463"] = "63", + ["2464"] = "64", + ["2465"] = "65", + ["2466"] = "66", + ["2467"] = "67", + ["2468"] = "68", + ["2469"] = "69", + ["2470"] = "70", + ["2471"] = "71", + ["2472"] = "72", + ["2473"] = "73", + ["2474"] = "74", + ["2475"] = "75", + ["2476"] = "76", + ["2477"] = "77", + ["2478"] = "78", + ["2479"] = "79", + ["2480"] = "80", + ["2481"] = "81", + ["2482"] = "82", + ["2483"] = "83", + ["2484"] = "84", + ["2485"] = "85", + ["2486"] = "86", + ["2487"] = "87", + ["2488"] = "88", + ["2489"] = "89", + ["2490"] = "90", + ["2491"] = "91", + ["2492"] = "92", + ["2493"] = "93", + ["2494"] = "94", + ["2495"] = "95", + ["2496"] = "96", + ["2497"] = "97", + ["2498"] = "98", + ["2499"] = "99", + ["2500"] = "100", + ["2501"] = "1", + ["2502"] = "2", + ["2503"] = "3", + ["2504"] = "4", + ["2505"] = "5", + ["2506"] = "6", + ["2507"] = "7", + ["2508"] = "8", + ["2509"] = "9", + ["2510"] = "10", + ["2511"] = "11", + ["2512"] = "12", + ["2513"] = "13", + ["2514"] = "14", + ["2515"] = "15", + ["2516"] = "16", + ["2517"] = "17", + ["2518"] = "18", + ["2519"] = "19", + ["2520"] = "20", + ["2521"] = "21", + ["2522"] = "22", + ["2523"] = "23", + ["2524"] = "24", + ["2525"] = "25", + ["2526"] = "26", + ["2527"] = "27", + ["2528"] = "28", + ["2529"] = "29", + ["2530"] = "30", + ["2531"] = "31", + ["2532"] = "32", + ["2533"] = "33", + ["2534"] = "34", + ["2535"] = "35", + ["2536"] = "36", + ["2537"] = "37", + ["2538"] = "38", + ["2539"] = "39", + ["2540"] = "40", + ["2541"] = "41", + ["2542"] = "42", + ["2543"] = "43", + ["2544"] = "44", + ["2545"] = "45", + ["2546"] = "46", + ["2547"] = "47", + ["2548"] = "48", + ["2549"] = "49", + ["2550"] = "50", + ["2551"] = "51", + ["2552"] = "52", + ["2553"] = "53", + ["2554"] = "54", + ["2555"] = "55", + ["2556"] = "56", + ["2557"] = "57", + ["2558"] = "58", + ["2559"] = "59", + ["2560"] = "60", + ["2561"] = "61", + ["2562"] = "62", + ["2563"] = "63", + ["2564"] = "64", + ["2565"] = "65", + ["2566"] = "66", + ["2567"] = "67", + ["2568"] = "68", + ["2569"] = "69", + ["2570"] = "70", + ["2571"] = "71", + ["2572"] = "72", + ["2573"] = "73", + ["2574"] = "74", + ["2575"] = "75", + ["2576"] = "76", + ["2577"] = "77", + ["2578"] = "78", + ["2579"] = "79", + ["2580"] = "80", + ["2581"] = "81", + ["2582"] = "82", + ["2583"] = "83", + ["2584"] = "84", + ["2585"] = "85", + ["2586"] = "86", + ["2587"] = "87", + ["2588"] = "88", + ["2589"] = "89", + ["2590"] = "90", + ["2591"] = "91", + ["2592"] = "92", + ["2593"] = "93", + ["2594"] = "94", + ["2595"] = "95", + ["2596"] = "96", + ["2597"] = "97", + ["2598"] = "98", + ["2599"] = "99", + ["2600"] = "100", + ["2601"] = "1", + ["2602"] = "2", + ["2603"] = "3", + ["2604"] = "4", + ["2605"] = "5", + ["2606"] = "6", + ["2607"] = "7", + ["2608"] = "8", + ["2609"] = "9", + ["2610"] = "10", + ["2611"] = "11", + ["2612"] = "12", + ["2613"] = "13", + ["2614"] = "14", + ["2615"] = "15", + ["2616"] = "16", + ["2617"] = "17", + ["2618"] = "18", + ["2619"] = "19", + ["2620"] = "20", + ["2621"] = "21", + ["2622"] = "22", + ["2623"] = "23", + ["2624"] = "24", + ["2625"] = "25", + ["2626"] = "26", + ["2627"] = "27", + ["2628"] = "28", + ["2629"] = "29", + ["2630"] = "30", + ["2631"] = "31", + ["2632"] = "32", + ["2633"] = "33", + ["2634"] = "34", + ["2635"] = "35", + ["2636"] = "36", + ["2637"] = "37", + ["2638"] = "38", + ["2639"] = "39", + ["2640"] = "40", + ["2641"] = "41", + ["2642"] = "42", + ["2643"] = "43", + ["2644"] = "44", + ["2645"] = "45", + ["2646"] = "46", + ["2647"] = "47", + ["2648"] = "48", + ["2649"] = "49", + ["2650"] = "50", + ["2651"] = "51", + ["2652"] = "52", + ["2653"] = "53", + ["2654"] = "54", + ["2655"] = "55", + ["2656"] = "56", + ["2657"] = "57", + ["2658"] = "58", + ["2659"] = "59", + ["2660"] = "60", + ["2661"] = "61", + ["2662"] = "62", + ["2663"] = "63", + ["2664"] = "64", + ["2665"] = "65", + ["2666"] = "66", + ["2667"] = "67", + ["2668"] = "68", + ["2669"] = "69", + ["2670"] = "70", + ["2671"] = "71", + ["2672"] = "72", + ["2673"] = "73", + ["2674"] = "74", + ["2675"] = "75", + ["2676"] = "76", + ["2677"] = "77", + ["2678"] = "78", + ["2679"] = "79", + ["2680"] = "80", + ["2681"] = "81", + ["2682"] = "82", + ["2683"] = "83", + ["2684"] = "84", + ["2685"] = "85", + ["2686"] = "86", + ["2687"] = "87", + ["2688"] = "88", + ["2689"] = "89", + ["2690"] = "90", + ["2691"] = "91", + ["2692"] = "92", + ["2693"] = "93", + ["2694"] = "94", + ["2695"] = "95", + ["2696"] = "96", + ["2697"] = "97", + ["2698"] = "98", + ["2699"] = "99", + ["2700"] = "100", + ["2701"] = "1", + ["2702"] = "2", + ["2703"] = "3", + ["2704"] = "4", + ["2705"] = "5", + ["2706"] = "6", + ["2707"] = "7", + ["2708"] = "8", + ["2709"] = "9", + ["2710"] = "10", + ["2711"] = "11", + ["2712"] = "12", + ["2713"] = "13", + ["2714"] = "14", + ["2715"] = "15", + ["2716"] = "16", + ["2717"] = "17", + ["2718"] = "18", + ["2719"] = "19", + ["2720"] = "20", + ["2721"] = "21", + ["2722"] = "22", + ["2723"] = "23", + ["2724"] = "24", + ["2725"] = "25", + ["2726"] = "26", + ["2727"] = "27", + ["2728"] = "28", + ["2729"] = "29", + ["2730"] = "30", + ["2731"] = "31", + ["2732"] = "32", + ["2733"] = "33", + ["2734"] = "34", + ["2735"] = "35", + ["2736"] = "36", + ["2737"] = "37", + ["2738"] = "38", + ["2739"] = "39", + ["2740"] = "40", + ["2741"] = "41", + ["2742"] = "42", + ["2743"] = "43", + ["2744"] = "44", + ["2745"] = "45", + ["2746"] = "46", + ["2747"] = "47", + ["2748"] = "48", + ["2749"] = "49", + ["2750"] = "50", + ["2751"] = "51", + ["2752"] = "52", + ["2753"] = "53", + ["2754"] = "54", + ["2755"] = "55", + ["2756"] = "56", + ["2757"] = "57", + ["2758"] = "58", + ["2759"] = "59", + ["2760"] = "60", + ["2761"] = "61", + ["2762"] = "62", + ["2763"] = "63", + ["2764"] = "64", + ["2765"] = "65", + ["2766"] = "66", + ["2767"] = "67", + ["2768"] = "68", + ["2769"] = "69", + ["2770"] = "70", + ["2771"] = "71", + ["2772"] = "72", + ["2773"] = "73", + ["2774"] = "74", + ["2775"] = "75", + ["2776"] = "76", + ["2777"] = "77", + ["2778"] = "78", + ["2779"] = "79", + ["2780"] = "80", + ["2781"] = "81", + ["2782"] = "82", + ["2783"] = "83", + ["2784"] = "84", + ["2785"] = "85", + ["2786"] = "86", + ["2787"] = "87", + ["2788"] = "88", + ["2789"] = "89", + ["2790"] = "90", + ["2791"] = "91", + ["2792"] = "92", + ["2793"] = "93", + ["2794"] = "94", + ["2795"] = "95", + ["2796"] = "96", + ["2797"] = "97", + ["2798"] = "98", + ["2799"] = "99", + ["2800"] = "100", + ["2801"] = "1", + ["2802"] = "2", + ["2803"] = "3", + ["2804"] = "4", + ["2805"] = "5", + ["2806"] = "6", + ["2807"] = "7", + ["2808"] = "8", + ["2809"] = "9", + ["2810"] = "10", + ["2811"] = "11", + ["2812"] = "12", + ["2813"] = "13", + ["2814"] = "14", + ["2815"] = "15", + ["2816"] = "16", + ["2817"] = "17", + ["2818"] = "18", + ["2819"] = "19", + ["2820"] = "20", + ["2821"] = "21", + ["2822"] = "22", + ["2823"] = "23", + ["2824"] = "24", + ["2825"] = "25", + ["2826"] = "26", + ["2827"] = "27", + ["2828"] = "28", + ["2829"] = "29", + ["2830"] = "30", + ["2831"] = "31", + ["2832"] = "32", + ["2833"] = "33", + ["2834"] = "34", + ["2835"] = "35", + ["2836"] = "36", + ["2837"] = "37", + ["2838"] = "38", + ["2839"] = "39", + ["2840"] = "40", + ["2841"] = "41", + ["2842"] = "42", + ["2843"] = "43", + ["2844"] = "44", + ["2845"] = "45", + ["2846"] = "46", + ["2847"] = "47", + ["2848"] = "48", + ["2849"] = "49", + ["2850"] = "50", + ["2851"] = "51", + ["2852"] = "52", + ["2853"] = "53", + ["2854"] = "54", + ["2855"] = "55", + ["2856"] = "56", + ["2857"] = "57", + ["2858"] = "58", + ["2859"] = "59", + ["2860"] = "60", + ["2861"] = "61", + ["2862"] = "62", + ["2863"] = "63", + ["2864"] = "64", + ["2865"] = "65", + ["2866"] = "66", + ["2867"] = "67", + ["2868"] = "68", + ["2869"] = "69", + ["2870"] = "70", + ["2871"] = "71", + ["2872"] = "72", + ["2873"] = "73", + ["2874"] = "74", + ["2875"] = "75", + ["2876"] = "76", + ["2877"] = "77", + ["2878"] = "78", + ["2879"] = "79", + ["2880"] = "80", + ["2881"] = "81", + ["2882"] = "82", + ["2883"] = "83", + ["2884"] = "84", + ["2885"] = "85", + ["2886"] = "86", + ["2887"] = "87", + ["2888"] = "88", + ["2889"] = "89", + ["2890"] = "90", + ["2891"] = "91", + ["2892"] = "92", + ["2893"] = "93", + ["2894"] = "94", + ["2895"] = "95", + ["2896"] = "96", + ["2897"] = "97", + ["2898"] = "98", + ["2899"] = "99", + ["2900"] = "100", + ["2901"] = "1", + ["2902"] = "2", + ["2903"] = "3", + ["2904"] = "4", + ["2905"] = "5", + ["2906"] = "6", + ["2907"] = "7", + ["2908"] = "8", + ["2909"] = "9", + ["2910"] = "10", + ["2911"] = "11", + ["2912"] = "12", + ["2913"] = "13", + ["2914"] = "14", + ["2915"] = "15", + ["2916"] = "16", + ["2917"] = "17", + ["2918"] = "18", + ["2919"] = "19", + ["2920"] = "20", + ["2921"] = "21", + ["2922"] = "22", + ["2923"] = "23", + ["2924"] = "24", + ["2925"] = "25", + ["2926"] = "26", + ["2927"] = "27", + ["2928"] = "28", + ["2929"] = "29", + ["2930"] = "30", + ["2931"] = "31", + ["2932"] = "32", + ["2933"] = "33", + ["2934"] = "34", + ["2935"] = "35", + ["2936"] = "36", + ["2937"] = "37", + ["2938"] = "38", + ["2939"] = "39", + ["2940"] = "40", + ["2941"] = "41", + ["2942"] = "42", + ["2943"] = "43", + ["2944"] = "44", + ["2945"] = "45", + ["2946"] = "46", + ["2947"] = "47", + ["2948"] = "48", + ["2949"] = "49", + ["2950"] = "50", + ["2951"] = "51", + ["2952"] = "52", + ["2953"] = "53", + ["2954"] = "54", + ["2955"] = "55", + ["2956"] = "56", + ["2957"] = "57", + ["2958"] = "58", + ["2959"] = "59", + ["2960"] = "60", + ["2961"] = "61", + ["2962"] = "62", + ["2963"] = "63", + ["2964"] = "64", + ["2965"] = "65", + ["2966"] = "66", + ["2967"] = "67", + ["2968"] = "68", + ["2969"] = "69", + ["2970"] = "70", + ["2971"] = "71", + ["2972"] = "72", + ["2973"] = "73", + ["2974"] = "74", + ["2975"] = "75", + ["2976"] = "76", + ["2977"] = "77", + ["2978"] = "78", + ["2979"] = "79", + ["2980"] = "80", + ["2981"] = "81", + ["2982"] = "82", + ["2983"] = "83", + ["2984"] = "84", + ["2985"] = "85", + ["2986"] = "86", + ["2987"] = "87", + ["2988"] = "88", + ["2989"] = "89", + ["2990"] = "90", + ["2991"] = "91", + ["2992"] = "92", + ["2993"] = "93", + ["2994"] = "94", + ["2995"] = "95", + ["2996"] = "96", + ["2997"] = "97", + ["2998"] = "98", + ["2999"] = "99", + ["3000"] = "99", + ["3001"] = "1", + ["3002"] = "2", + ["3003"] = "3", + ["3004"] = "4", + ["3005"] = "5", + ["3006"] = "6", + ["3007"] = "7", + ["3008"] = "8", + ["3009"] = "9", + ["3000"] = "10", + ["3011"] = "11", + ["3012"] = "12", + ["3013"] = "13", + ["3014"] = "14", + ["3015"] = "15", + ["3016"] = "16", + ["3017"] = "17", + ["3018"] = "18", + ["3019"] = "19", + ["3020"] = "20", + ["3021"] = "21", + ["3022"] = "22", + ["3023"] = "23", + ["3024"] = "24", + ["3025"] = "25", + ["3026"] = "26", + ["3027"] = "27", + ["3028"] = "28", + ["3029"] = "29", + ["3030"] = "30", + ["3031"] = "31", + ["3032"] = "32", + ["3033"] = "33", + ["3034"] = "34", + ["3035"] = "35", + ["3036"] = "36", + ["3037"] = "37", + ["3038"] = "38", + ["3039"] = "39", + ["3040"] = "40", + ["3041"] = "41", + ["3042"] = "42", + ["3043"] = "43", + ["3044"] = "44", + ["3045"] = "45", + ["3046"] = "46", + ["3047"] = "47", + ["3048"] = "48", + ["3049"] = "49", + ["3050"] = "50", + ["3051"] = "51", + ["3052"] = "52", + ["3053"] = "53", + ["3054"] = "54", + ["3055"] = "55", + ["3056"] = "56", + ["3057"] = "57", + ["3058"] = "58", + ["3059"] = "59", + ["3060"] = "60", + ["3061"] = "61", + ["3062"] = "62", + ["3063"] = "63", + ["3064"] = "64", + ["3065"] = "65", + ["3066"] = "66", + ["3067"] = "67", + ["3068"] = "68", + ["3069"] = "69", + ["3070"] = "70", + ["3071"] = "71", + ["3072"] = "72", + ["3073"] = "73", + ["3074"] = "74", + ["3075"] = "75", + ["3076"] = "76", + ["3077"] = "77", + ["3078"] = "78", + ["3079"] = "79", + ["3080"] = "80", + ["3081"] = "81", + ["3082"] = "82", + ["3083"] = "83", + ["3084"] = "84", + ["3085"] = "85", + ["3086"] = "86", + ["3087"] = "87", + ["3088"] = "88", + ["3089"] = "89", + ["3090"] = "90", + ["3091"] = "91", + ["3092"] = "92", + ["3093"] = "93", + ["3094"] = "94", + ["3095"] = "95", + ["3096"] = "96", + ["3097"] = "97", + ["3098"] = "98", + ["3099"] = "99", + ["3100"] = "100", + ["3101"] = "1", + ["3102"] = "2", + ["3103"] = "3", + ["3104"] = "4", + ["3105"] = "5", + ["3106"] = "6", + ["3107"] = "7", + ["3108"] = "8", + ["3109"] = "9", + ["3110"] = "10", + ["3111"] = "11", + ["3112"] = "12", + ["3113"] = "13", + ["3114"] = "14", + ["3115"] = "15", + ["3116"] = "16", + ["3117"] = "17", + ["3118"] = "18", + ["3119"] = "19", + ["3120"] = "20", + ["3121"] = "21", + ["3122"] = "22", + ["3123"] = "23", + ["3124"] = "24", + ["3125"] = "25", + ["3126"] = "26", + ["3127"] = "27", + ["3128"] = "28", + ["3129"] = "29", + ["3130"] = "30", + ["3131"] = "31", + ["3132"] = "32", + ["3133"] = "33", + ["3134"] = "34", + ["3135"] = "35", + ["3136"] = "36", + ["3137"] = "37", + ["3138"] = "38", + ["3139"] = "39", + ["3140"] = "40", + ["3141"] = "41", + ["3142"] = "42", + ["3143"] = "43", + ["3144"] = "44", + ["3145"] = "45", + ["3146"] = "46", + ["3147"] = "47", + ["3148"] = "48", + ["3149"] = "49", + ["3150"] = "50", + ["3151"] = "51", + ["3152"] = "52", + ["3153"] = "53", + ["3154"] = "54", + ["3155"] = "55", + ["3156"] = "56", + ["3157"] = "57", + ["3158"] = "58", + ["3159"] = "59", + ["3160"] = "60", + ["3161"] = "61", + ["3162"] = "62", + ["3163"] = "63", + ["3164"] = "64", + ["3165"] = "65", + ["3166"] = "66", + ["3167"] = "67", + ["3168"] = "68", + ["3169"] = "69", + ["3170"] = "70", + ["3171"] = "71", + ["3172"] = "72", + ["3173"] = "73", + ["3174"] = "74", + ["3175"] = "75", + ["3176"] = "76", + ["3177"] = "77", + ["3178"] = "78", + ["3179"] = "79", + ["3180"] = "80", + ["3181"] = "81", + ["3182"] = "82", + ["3183"] = "83", + ["3184"] = "84", + ["3185"] = "85", + ["3186"] = "86", + ["3187"] = "87", + ["3188"] = "88", + ["3189"] = "89", + ["3190"] = "90", + ["3191"] = "91", + ["3192"] = "92", + ["3193"] = "93", + ["3194"] = "94", + ["3195"] = "95", + ["3196"] = "96", + ["3197"] = "97", + ["3198"] = "98", + ["3199"] = "99", + ["3200"] = "100", + ["3201"] = "1", + ["3202"] = "2", + ["3203"] = "3", + ["3204"] = "4", + ["3205"] = "5", + ["3206"] = "6", + ["3207"] = "7", + ["3208"] = "8", + ["3209"] = "9", + ["3210"] = "10", + ["3211"] = "11", + ["3212"] = "12", + ["3213"] = "13", + ["3214"] = "14", + ["3215"] = "15", + ["3216"] = "16", + ["3217"] = "17", + ["3218"] = "18", + ["3219"] = "19", + ["3220"] = "20", + ["3221"] = "21", + ["3222"] = "22", + ["3223"] = "23", + ["3224"] = "24", + ["3225"] = "25", + ["3226"] = "26", + ["3227"] = "27", + ["3228"] = "28", + ["3229"] = "29", + ["3230"] = "30", + ["3231"] = "31", + ["3232"] = "32", + ["3233"] = "33", + ["3234"] = "34", + ["3235"] = "35", + ["3236"] = "36", + ["3237"] = "37", + ["3238"] = "38", + ["3239"] = "39", + ["3240"] = "40", + ["3241"] = "41", + ["3242"] = "42", + ["3243"] = "43", + ["3244"] = "44", + ["3245"] = "45", + ["3246"] = "46", + ["3247"] = "47", + ["3248"] = "48", + ["3249"] = "49", + ["3250"] = "50", + ["3251"] = "51", + ["3252"] = "52", + ["3253"] = "53", + ["3254"] = "54", + ["3255"] = "55", + ["3256"] = "56", + ["3257"] = "57", + ["3258"] = "58", + ["3259"] = "59", + ["3260"] = "60", + ["3261"] = "61", + ["3262"] = "62", + ["3263"] = "63", + ["3264"] = "64", + ["3265"] = "65", + ["3266"] = "66", + ["3267"] = "67", + ["3268"] = "68", + ["3269"] = "69", + ["3270"] = "70", + ["3271"] = "71", + ["3272"] = "72", + ["3273"] = "73", + ["3274"] = "74", + ["3275"] = "75", + ["3276"] = "76", + ["3277"] = "77", + ["3278"] = "78", + ["3279"] = "79", + ["3280"] = "80", + ["3281"] = "81", + ["3282"] = "82", + ["3283"] = "83", + ["3284"] = "84", + ["3285"] = "85", + ["3286"] = "86", + ["3287"] = "87", + ["3288"] = "88", + ["3289"] = "89", + ["3290"] = "90", + ["3291"] = "91", + ["3292"] = "92", + ["3293"] = "93", + ["3294"] = "94", + ["3295"] = "95", + ["3296"] = "96", + ["3297"] = "97", + ["3298"] = "98", + ["3299"] = "99", + ["3300"] = "100", + ["3301"] = "1", + ["3302"] = "2", + ["3303"] = "3", + ["3304"] = "4", + ["3305"] = "5", + ["3306"] = "6", + ["3307"] = "7", + ["3308"] = "8", + ["3309"] = "9", + ["3310"] = "10", + ["3311"] = "11", + ["3312"] = "12", + ["3313"] = "13", + ["3314"] = "14", + ["3315"] = "15", + ["3316"] = "16", + ["3317"] = "17", + ["3318"] = "18", + ["3319"] = "19", + ["3320"] = "20", + ["3321"] = "21", + ["3322"] = "22", + ["3323"] = "23", + ["3324"] = "24", + ["3325"] = "25", + ["3326"] = "26", + ["3327"] = "27", + ["3328"] = "28", + ["3329"] = "29", + ["3330"] = "30", + ["3331"] = "31", + ["3332"] = "32", + ["3333"] = "33", + ["3334"] = "34", + ["3335"] = "35", + ["3336"] = "36", + ["3337"] = "37", + ["3338"] = "38", + ["3339"] = "39", + ["3340"] = "40", + ["3341"] = "41", + ["3342"] = "42", + ["3343"] = "43", + ["3344"] = "44", + ["3345"] = "45", + ["3346"] = "46", + ["3347"] = "47", + ["3348"] = "48", + ["3349"] = "49", + ["3350"] = "50", + ["3351"] = "51", + ["3352"] = "52", + ["3353"] = "53", + ["3354"] = "54", + ["3355"] = "55", + ["3356"] = "56", + ["3357"] = "57", + ["3358"] = "58", + ["3359"] = "59", + ["3360"] = "60", + ["3361"] = "61", + ["3362"] = "62", + ["3363"] = "63", + ["3364"] = "64", + ["3365"] = "65", + ["3366"] = "66", + ["3367"] = "67", + ["3368"] = "68", + ["3369"] = "69", + ["3370"] = "70", + ["3371"] = "71", + ["3372"] = "72", + ["3373"] = "73", + ["3374"] = "74", + ["3375"] = "75", + ["3376"] = "76", + ["3377"] = "77", + ["3378"] = "78", + ["3379"] = "79", + ["3380"] = "80", + ["3381"] = "81", + ["3382"] = "82", + ["3383"] = "83", + ["3384"] = "84", + ["3385"] = "85", + ["3386"] = "86", + ["3387"] = "87", + ["3388"] = "88", + ["3389"] = "89", + ["3390"] = "90", + ["3391"] = "91", + ["3392"] = "92", + ["3393"] = "93", + ["3394"] = "94", + ["3395"] = "95", + ["3396"] = "96", + ["3397"] = "97", + ["3398"] = "98", + ["3399"] = "99", + ["3400"] = "100", + ["3401"] = "1", + ["3402"] = "2", + ["3403"] = "3", + ["3404"] = "4", + ["3405"] = "5", + ["3406"] = "6", + ["3407"] = "7", + ["3408"] = "8", + ["3409"] = "9", + ["3410"] = "10", + ["3411"] = "11", + ["3412"] = "12", + ["3413"] = "13", + ["3414"] = "14", + ["3415"] = "15", + ["3416"] = "16", + ["3417"] = "17", + ["3418"] = "18", + ["3419"] = "19", + ["3420"] = "20", + ["3421"] = "21", + ["3422"] = "22", + ["3423"] = "23", + ["3424"] = "24", + ["3425"] = "25", + ["3426"] = "26", + ["3427"] = "27", + ["3428"] = "28", + ["3429"] = "29", + ["3430"] = "30", + ["3431"] = "31", + ["3432"] = "32", + ["3433"] = "33", + ["3434"] = "34", + ["3435"] = "35", + ["3436"] = "36", + ["3437"] = "37", + ["3438"] = "38", + ["3439"] = "39", + ["3440"] = "40", + ["3441"] = "41", + ["3442"] = "42", + ["3443"] = "43", + ["3444"] = "44", + ["3445"] = "45", + ["3446"] = "46", + ["3447"] = "47", + ["3448"] = "48", + ["3449"] = "49", + ["3450"] = "50", + ["3451"] = "51", + ["3452"] = "52", + ["3453"] = "53", + ["3454"] = "54", + ["3455"] = "55", + ["3456"] = "56", + ["3457"] = "57", + ["3458"] = "58", + ["3459"] = "59", + ["3460"] = "60", + ["3461"] = "61", + ["3462"] = "62", + ["3463"] = "63", + ["3464"] = "64", + ["3465"] = "65", + ["3466"] = "66", + ["3467"] = "67", + ["3468"] = "68", + ["3469"] = "69", + ["3470"] = "70", + ["3471"] = "71", + ["3472"] = "72", + ["3473"] = "73", + ["3474"] = "74", + ["3475"] = "75", + ["3476"] = "76", + ["3477"] = "77", + ["3478"] = "78", + ["3479"] = "79", + ["3480"] = "80", + ["3481"] = "81", + ["3482"] = "82", + ["3483"] = "83", + ["3484"] = "84", + ["3485"] = "85", + ["3486"] = "86", + ["3487"] = "87", + ["3488"] = "88", + ["3489"] = "89", + ["3490"] = "90", + ["3491"] = "91", + ["3492"] = "92", + ["3493"] = "93", + ["3494"] = "94", + ["3495"] = "95", + ["3496"] = "96", + ["3497"] = "97", + ["3498"] = "98", + ["3499"] = "99", + ["3500"] = "100", + ["3501"] = "1", + ["3502"] = "2", + ["3503"] = "3", + ["3504"] = "4", + ["3505"] = "5", + ["3506"] = "6", + ["3507"] = "7", + ["3508"] = "8", + ["3509"] = "9", + ["3510"] = "10", + ["3511"] = "11", + ["3512"] = "12", + ["3513"] = "13", + ["3514"] = "14", + ["3515"] = "15", + ["3516"] = "16", + ["3517"] = "17", + ["3518"] = "18", + ["3519"] = "19", + ["3520"] = "20", + ["3521"] = "21", + ["3522"] = "22", + ["3523"] = "23", + ["3524"] = "24", + ["3525"] = "25", + ["3526"] = "26", + ["3527"] = "27", + ["3528"] = "28", + ["3529"] = "29", + ["3530"] = "30", + ["3531"] = "31", + ["3532"] = "32", + ["3533"] = "33", + ["3534"] = "34", + ["3535"] = "35", + ["3536"] = "36", + ["3537"] = "37", + ["3538"] = "38", + ["3539"] = "39", + ["3540"] = "40", + ["3541"] = "41", + ["3542"] = "42", + ["3543"] = "43", + ["3544"] = "44", + ["3545"] = "45", + ["3546"] = "46", + ["3547"] = "47", + ["3548"] = "48", + ["3549"] = "49", + ["3550"] = "50", + ["3551"] = "51", + ["3552"] = "52", + ["3553"] = "53", + ["3554"] = "54", + ["3555"] = "55", + ["3556"] = "56", + ["3557"] = "57", + ["3558"] = "58", + ["3559"] = "59", + ["3560"] = "60", + ["3561"] = "61", + ["3562"] = "62", + ["3563"] = "63", + ["3564"] = "64", + ["3565"] = "65", + ["3566"] = "66", + ["3567"] = "67", + ["3568"] = "68", + ["3569"] = "69", + ["3570"] = "70", + ["3571"] = "71", + ["3572"] = "72", + ["3573"] = "73", + ["3574"] = "74", + ["3575"] = "75", + ["3576"] = "76", + ["3577"] = "77", + ["3578"] = "78", + ["3579"] = "79", + ["3580"] = "80", + ["3581"] = "81", + ["3582"] = "82", + ["3583"] = "83", + ["3584"] = "84", + ["3585"] = "85", + ["3586"] = "86", + ["3587"] = "87", + ["3588"] = "88", + ["3589"] = "89", + ["3590"] = "90", + ["3591"] = "91", + ["3592"] = "92", + ["3593"] = "93", + ["3594"] = "94", + ["3595"] = "95", + ["3596"] = "96", + ["3597"] = "97", + ["3598"] = "98", + ["3599"] = "99", + ["3600"] = "100", + ["3601"] = "1", + ["3602"] = "2", + ["3603"] = "3", + ["3604"] = "4", + ["3605"] = "5", + ["3606"] = "6", + ["3607"] = "7", + ["3608"] = "8", + ["3609"] = "9", + ["3610"] = "10", + ["3611"] = "11", + ["3612"] = "12", + ["3613"] = "13", + ["3614"] = "14", + ["3615"] = "15", + ["3616"] = "16", + ["3617"] = "17", + ["3618"] = "18", + ["3619"] = "19", + ["3620"] = "20", + ["3621"] = "21", + ["3622"] = "22", + ["3623"] = "23", + ["3624"] = "24", + ["3625"] = "25", + ["3626"] = "26", + ["3627"] = "27", + ["3628"] = "28", + ["3629"] = "29", + ["3630"] = "30", + ["3631"] = "31", + ["3632"] = "32", + ["3633"] = "33", + ["3634"] = "34", + ["3635"] = "35", + ["3636"] = "36", + ["3637"] = "37", + ["3638"] = "38", + ["3639"] = "39", + ["3640"] = "40", + ["3641"] = "41", + ["3642"] = "42", + ["3643"] = "43", + ["3644"] = "44", + ["3645"] = "45", + ["3646"] = "46", + ["3647"] = "47", + ["3648"] = "48", + ["3649"] = "49", + ["3650"] = "50", + ["3651"] = "51", + ["3652"] = "52", + ["3653"] = "53", + ["3654"] = "54", + ["3655"] = "55", + ["3656"] = "56", + ["3657"] = "57", + ["3658"] = "58", + ["3659"] = "59", + ["3660"] = "60", + ["3661"] = "61", + ["3662"] = "62", + ["3663"] = "63", + ["3664"] = "64", + ["3665"] = "65", + ["3666"] = "66", + ["3667"] = "67", + ["3668"] = "68", + ["3669"] = "69", + ["3670"] = "70", + ["3671"] = "71", + ["3672"] = "72", + ["3673"] = "73", + ["3674"] = "74", + ["3675"] = "75", + ["3676"] = "76", + ["3677"] = "77", + ["3678"] = "78", + ["3679"] = "79", + ["3680"] = "80", + ["3681"] = "81", + ["3682"] = "82", + ["3683"] = "83", + ["3684"] = "84", + ["3685"] = "85", + ["3686"] = "86", + ["3687"] = "87", + ["3688"] = "88", + ["3689"] = "89", + ["3690"] = "90", + ["3691"] = "91", + ["3692"] = "92", + ["3693"] = "93", + ["3694"] = "94", + ["3695"] = "95", + ["3696"] = "96", + ["3697"] = "97", + ["3698"] = "98", + ["3699"] = "99", + ["3700"] = "100", + ["3701"] = "1", + ["3702"] = "2", + ["3703"] = "3", + ["3704"] = "4", + ["3705"] = "5", + ["3706"] = "6", + ["3707"] = "7", + ["3708"] = "8", + ["3709"] = "9", + ["3710"] = "10", + ["3711"] = "11", + ["3712"] = "12", + ["3713"] = "13", + ["3714"] = "14", + ["3715"] = "15", + ["3716"] = "16", + ["3717"] = "17", + ["3718"] = "18", + ["3719"] = "19", + ["3720"] = "20", + ["3721"] = "21", + ["3722"] = "22", + ["3723"] = "23", + ["3724"] = "24", + ["3725"] = "25", + ["3726"] = "26", + ["3727"] = "27", + ["3728"] = "28", + ["3729"] = "29", + ["3730"] = "30", + ["3731"] = "31", + ["3732"] = "32", + ["3733"] = "33", + ["3734"] = "34", + ["3735"] = "35", + ["3736"] = "36", + ["3737"] = "37", + ["3738"] = "38", + ["3739"] = "39", + ["3740"] = "40", + ["3741"] = "41", + ["3742"] = "42", + ["3743"] = "43", + ["3744"] = "44", + ["3745"] = "45", + ["3746"] = "46", + ["3747"] = "47", + ["3748"] = "48", + ["3749"] = "49", + ["3750"] = "50", + ["3751"] = "51", + ["3752"] = "52", + ["3753"] = "53", + ["3754"] = "54", + ["3755"] = "55", + ["3756"] = "56", + ["3757"] = "57", + ["3758"] = "58", + ["3759"] = "59", + ["3760"] = "60", + ["3761"] = "61", + ["3762"] = "62", + ["3763"] = "63", + ["3764"] = "64", + ["3765"] = "65", + ["3766"] = "66", + ["3767"] = "67", + ["3768"] = "68", + ["3769"] = "69", + ["3770"] = "70", + ["3771"] = "71", + ["3772"] = "72", + ["3773"] = "73", + ["3774"] = "74", + ["3775"] = "75", + ["3776"] = "76", + ["3777"] = "77", + ["3778"] = "78", + ["3779"] = "79", + ["3780"] = "80", + ["3781"] = "81", + ["3782"] = "82", + ["3783"] = "83", + ["3784"] = "84", + ["3785"] = "85", + ["3786"] = "86", + ["3787"] = "87", + ["3788"] = "88", + ["3789"] = "89", + ["3790"] = "90", + ["3791"] = "91", + ["3792"] = "92", + ["3793"] = "93", + ["3794"] = "94", + ["3795"] = "95", + ["3796"] = "96", + ["3797"] = "97", + ["3798"] = "98", + ["3799"] = "99", + ["3800"] = "100", + ["3801"] = "1", + ["3802"] = "2", + ["3803"] = "3", + ["3804"] = "4", + ["3805"] = "5", + ["3806"] = "6", + ["3807"] = "7", + ["3808"] = "8", + ["3809"] = "9", + ["3810"] = "10", + ["3811"] = "11", + ["3812"] = "12", + ["3813"] = "13", + ["3814"] = "14", + ["3815"] = "15", + ["3816"] = "16", + ["3817"] = "17", + ["3818"] = "18", + ["3819"] = "19", + ["3820"] = "20", + ["3821"] = "21", + ["3822"] = "22", + ["3823"] = "23", + ["3824"] = "24", + ["3825"] = "25", + ["3826"] = "26", + ["3827"] = "27", + ["3828"] = "28", + ["3829"] = "29", + ["3830"] = "30", + ["3831"] = "31", + ["3832"] = "32", + ["3833"] = "33", + ["3834"] = "34", + ["3835"] = "35", + ["3836"] = "36", + ["3837"] = "37", + ["3838"] = "38", + ["3839"] = "39", + ["3840"] = "40", + ["3841"] = "41", + ["3842"] = "42", + ["3843"] = "43", + ["3844"] = "44", + ["3845"] = "45", + ["3846"] = "46", + ["3847"] = "47", + ["3848"] = "48", + ["3849"] = "49", + ["3850"] = "50", + ["3851"] = "51", + ["3852"] = "52", + ["3853"] = "53", + ["3854"] = "54", + ["3855"] = "55", + ["3856"] = "56", + ["3857"] = "57", + ["3858"] = "58", + ["3859"] = "59", + ["3860"] = "60", + ["3861"] = "61", + ["3862"] = "62", + ["3863"] = "63", + ["3864"] = "64", + ["3865"] = "65", + ["3866"] = "66", + ["3867"] = "67", + ["3868"] = "68", + ["3869"] = "69", + ["3870"] = "70", + ["3871"] = "71", + ["3872"] = "72", + ["3873"] = "73", + ["3874"] = "74", + ["3875"] = "75", + ["3876"] = "76", + ["3877"] = "77", + ["3878"] = "78", + ["3879"] = "79", + ["3880"] = "80", + ["3881"] = "81", + ["3882"] = "82", + ["3883"] = "83", + ["3884"] = "84", + ["3885"] = "85", + ["3886"] = "86", + ["3887"] = "87", + ["3888"] = "88", + ["3889"] = "89", + ["3890"] = "90", + ["3891"] = "91", + ["3892"] = "92", + ["3893"] = "93", + ["3894"] = "94", + ["3895"] = "95", + ["3896"] = "96", + ["3897"] = "97", + ["3898"] = "98", + ["3899"] = "99", + ["3900"] = "100", + ["3901"] = "1", + ["3902"] = "2", + ["3903"] = "3", + ["3904"] = "4", + ["3905"] = "5", + ["3906"] = "6", + ["3907"] = "7", + ["3908"] = "8", + ["3909"] = "9", + ["3910"] = "10", + ["3911"] = "11", + ["3912"] = "12", + ["3913"] = "13", + ["3914"] = "14", + ["3915"] = "15", + ["3916"] = "16", + ["3917"] = "17", + ["3918"] = "18", + ["3919"] = "19", + ["3920"] = "20", + ["3921"] = "21", + ["3922"] = "22", + ["3923"] = "23", + ["3924"] = "24", + ["3925"] = "25", + ["3926"] = "26", + ["3927"] = "27", + ["3928"] = "28", + ["3929"] = "29", + ["3930"] = "30", + ["3931"] = "31", + ["3932"] = "32", + ["3933"] = "33", + ["3934"] = "34", + ["3935"] = "35", + ["3936"] = "36", + ["3937"] = "37", + ["3938"] = "38", + ["3939"] = "39", + ["3940"] = "40", + ["3941"] = "41", + ["3942"] = "42", + ["3943"] = "43", + ["3944"] = "44", + ["3945"] = "45", + ["3946"] = "46", + ["3947"] = "47", + ["3948"] = "48", + ["3949"] = "49", + ["3950"] = "50", + ["3951"] = "51", + ["3952"] = "52", + ["3953"] = "53", + ["3954"] = "54", + ["3955"] = "55", + ["3956"] = "56", + ["3957"] = "57", + ["3958"] = "58", + ["3959"] = "59", + ["3960"] = "60", + ["3961"] = "61", + ["3962"] = "62", + ["3963"] = "63", + ["3964"] = "64", + ["3965"] = "65", + ["3966"] = "66", + ["3967"] = "67", + ["3968"] = "68", + ["3969"] = "69", + ["3970"] = "70", + ["3971"] = "71", + ["3972"] = "72", + ["3973"] = "73", + ["3974"] = "74", + ["3975"] = "75", + ["3976"] = "76", + ["3977"] = "77", + ["3978"] = "78", + ["3979"] = "79", + ["3980"] = "80", + ["3981"] = "81", + ["3982"] = "82", + ["3983"] = "83", + ["3984"] = "84", + ["3985"] = "85", + ["3986"] = "86", + ["3987"] = "87", + ["3988"] = "88", + ["3989"] = "89", + ["3990"] = "90", + ["3991"] = "91", + ["3992"] = "92", + ["3993"] = "93", + ["3994"] = "94", + ["3995"] = "95", + ["3996"] = "96", + ["3997"] = "97", + ["3998"] = "98", + ["3999"] = "99", + ["4000"] = "99", + ["4001"] = "1", + ["4002"] = "2", + ["4003"] = "3", + ["4004"] = "4", + ["4005"] = "5", + ["4006"] = "6", + ["4007"] = "7", + ["4008"] = "8", + ["4009"] = "9", + ["4000"] = "10", + ["4011"] = "11", + ["4012"] = "12", + ["4013"] = "13", + ["4014"] = "14", + ["4015"] = "15", + ["4016"] = "16", + ["4017"] = "17", + ["4018"] = "18", + ["4019"] = "19", + ["4020"] = "20", + ["4021"] = "21", + ["4022"] = "22", + ["4023"] = "23", + ["4024"] = "24", + ["4025"] = "25", + ["4026"] = "26", + ["4027"] = "27", + ["4028"] = "28", + ["4029"] = "29", + ["4030"] = "30", + ["4031"] = "31", + ["4032"] = "32", + ["4033"] = "33", + ["4034"] = "34", + ["4035"] = "35", + ["4036"] = "36", + ["4037"] = "37", + ["4038"] = "38", + ["4039"] = "39", + ["4040"] = "40", + ["4041"] = "41", + ["4042"] = "42", + ["4043"] = "43", + ["4044"] = "44", + ["4045"] = "45", + ["4046"] = "46", + ["4047"] = "47", + ["4048"] = "48", + ["4049"] = "49", + ["4050"] = "50", + ["4051"] = "51", + ["4052"] = "52", + ["4053"] = "53", + ["4054"] = "54", + ["4055"] = "55", + ["4056"] = "56", + ["4057"] = "57", + ["4058"] = "58", + ["4059"] = "59", + ["4060"] = "60", + ["4061"] = "61", + ["4062"] = "62", + ["4063"] = "63", + ["4064"] = "64", + ["4065"] = "65", + ["4066"] = "66", + ["4067"] = "67", + ["4068"] = "68", + ["4069"] = "69", + ["4070"] = "70", + ["4071"] = "71", + ["4072"] = "72", + ["4073"] = "73", + ["4074"] = "74", + ["4075"] = "75", + ["4076"] = "76", + ["4077"] = "77", + ["4078"] = "78", + ["4079"] = "79", + ["4080"] = "80", + ["4081"] = "81", + ["4082"] = "82", + ["4083"] = "83", + ["4084"] = "84", + ["4085"] = "85", + ["4086"] = "86", + ["4087"] = "87", + ["4088"] = "88", + ["4089"] = "89", + ["4090"] = "90", + ["4091"] = "91", + ["4092"] = "92", + ["4093"] = "93", + ["4094"] = "94", + ["4095"] = "95", + ["4096"] = "96", + ["4097"] = "97", + ["4098"] = "98", + ["4099"] = "99", + ["4100"] = "100", + ["4101"] = "1", + ["4102"] = "2", + ["4103"] = "3", + ["4104"] = "4", + ["4105"] = "5", + ["4106"] = "6", + ["4107"] = "7", + ["4108"] = "8", + ["4109"] = "9", + ["4110"] = "10", + ["4111"] = "11", + ["4112"] = "12", + ["4113"] = "13", + ["4114"] = "14", + ["4115"] = "15", + ["4116"] = "16", + ["4117"] = "17", + ["4118"] = "18", + ["4119"] = "19", + ["4120"] = "20", + ["4121"] = "21", + ["4122"] = "22", + ["4123"] = "23", + ["4124"] = "24", + ["4125"] = "25", + ["4126"] = "26", + ["4127"] = "27", + ["4128"] = "28", + ["4129"] = "29", + ["4130"] = "30", + ["4131"] = "31", + ["4132"] = "32", + ["4133"] = "33", + ["4134"] = "34", + ["4135"] = "35", + ["4136"] = "36", + ["4137"] = "37", + ["4138"] = "38", + ["4139"] = "39", + ["4140"] = "40", + ["4141"] = "41", + ["4142"] = "42", + ["4143"] = "43", + ["4144"] = "44", + ["4145"] = "45", + ["4146"] = "46", + ["4147"] = "47", + ["4148"] = "48", + ["4149"] = "49", + ["4150"] = "50", + ["4151"] = "51", + ["4152"] = "52", + ["4153"] = "53", + ["4154"] = "54", + ["4155"] = "55", + ["4156"] = "56", + ["4157"] = "57", + ["4158"] = "58", + ["4159"] = "59", + ["4160"] = "60", + ["4161"] = "61", + ["4162"] = "62", + ["4163"] = "63", + ["4164"] = "64", + ["4165"] = "65", + ["4166"] = "66", + ["4167"] = "67", + ["4168"] = "68", + ["4169"] = "69", + ["4170"] = "70", + ["4171"] = "71", + ["4172"] = "72", + ["4173"] = "73", + ["4174"] = "74", + ["4175"] = "75", + ["4176"] = "76", + ["4177"] = "77", + ["4178"] = "78", + ["4179"] = "79", + ["4180"] = "80", + ["4181"] = "81", + ["4182"] = "82", + ["4183"] = "83", + ["4184"] = "84", + ["4185"] = "85", + ["4186"] = "86", + ["4187"] = "87", + ["4188"] = "88", + ["4189"] = "89", + ["4190"] = "90", + ["4191"] = "91", + ["4192"] = "92", + ["4193"] = "93", + ["4194"] = "94", + ["4195"] = "95", + ["4196"] = "96", + ["4197"] = "97", + ["4198"] = "98", + ["4199"] = "99", + ["4200"] = "100", + ["4201"] = "1", + ["4202"] = "2", + ["4203"] = "3", + ["4204"] = "4", + ["4205"] = "5", + ["4206"] = "6", + ["4207"] = "7", + ["4208"] = "8", + ["4209"] = "9", + ["4210"] = "10", + ["4211"] = "11", + ["4212"] = "12", + ["4213"] = "13", + ["4214"] = "14", + ["4215"] = "15", + ["4216"] = "16", + ["4217"] = "17", + ["4218"] = "18", + ["4219"] = "19", + ["4220"] = "20", + ["4221"] = "21", + ["4222"] = "22", + ["4223"] = "23", + ["4224"] = "24", + ["4225"] = "25", + ["4226"] = "26", + ["4227"] = "27", + ["4228"] = "28", + ["4229"] = "29", + ["4230"] = "30", + ["4231"] = "31", + ["4232"] = "32", + ["4233"] = "33", + ["4234"] = "34", + ["4235"] = "35", + ["4236"] = "36", + ["4237"] = "37", + ["4238"] = "38", + ["4239"] = "39", + ["4240"] = "40", + ["4241"] = "41", + ["4242"] = "42", + ["4243"] = "43", + ["4244"] = "44", + ["4245"] = "45", + ["4246"] = "46", + ["4247"] = "47", + ["4248"] = "48", + ["4249"] = "49", + ["4250"] = "50", + ["4251"] = "51", + ["4252"] = "52", + ["4253"] = "53", + ["4254"] = "54", + ["4255"] = "55", + ["4256"] = "56", + ["4257"] = "57", + ["4258"] = "58", + ["4259"] = "59", + ["4260"] = "60", + ["4261"] = "61", + ["4262"] = "62", + ["4263"] = "63", + ["4264"] = "64", + ["4265"] = "65", + ["4266"] = "66", + ["4267"] = "67", + ["4268"] = "68", + ["4269"] = "69", + ["4270"] = "70", + ["4271"] = "71", + ["4272"] = "72", + ["4273"] = "73", + ["4274"] = "74", + ["4275"] = "75", + ["4276"] = "76", + ["4277"] = "77", + ["4278"] = "78", + ["4279"] = "79", + ["4280"] = "80", + ["4281"] = "81", + ["4282"] = "82", + ["4283"] = "83", + ["4284"] = "84", + ["4285"] = "85", + ["4286"] = "86", + ["4287"] = "87", + ["4288"] = "88", + ["4289"] = "89", + ["4290"] = "90", + ["4291"] = "91", + ["4292"] = "92", + ["4293"] = "93", + ["4294"] = "94", + ["4295"] = "95", + ["4296"] = "96", + ["4297"] = "97", + ["4298"] = "98", + ["4299"] = "99", + ["4300"] = "100", + ["4301"] = "1", + ["4302"] = "2", + ["4303"] = "3", + ["4304"] = "4", + ["4305"] = "5", + ["4306"] = "6", + ["4307"] = "7", + ["4308"] = "8", + ["4309"] = "9", + ["4310"] = "10", + ["4311"] = "11", + ["4312"] = "12", + ["4313"] = "13", + ["4314"] = "14", + ["4315"] = "15", + ["4316"] = "16", + ["4317"] = "17", + ["4318"] = "18", + ["4319"] = "19", + ["4320"] = "20", + ["4321"] = "21", + ["4322"] = "22", + ["4323"] = "23", + ["4324"] = "24", + ["4325"] = "25", + ["4326"] = "26", + ["4327"] = "27", + ["4328"] = "28", + ["4329"] = "29", + ["4330"] = "30", + ["4331"] = "31", + ["4332"] = "32", + ["4333"] = "33", + ["4334"] = "34", + ["4335"] = "35", + ["4336"] = "36", + ["4337"] = "37", + ["4338"] = "38", + ["4339"] = "39", + ["4340"] = "40", + ["4341"] = "41", + ["4342"] = "42", + ["4343"] = "43", + ["4344"] = "44", + ["4345"] = "45", + ["4346"] = "46", + ["4347"] = "47", + ["4348"] = "48", + ["4349"] = "49", + ["4350"] = "50", + ["4351"] = "51", + ["4352"] = "52", + ["4353"] = "53", + ["4354"] = "54", + ["4355"] = "55", + ["4356"] = "56", + ["4357"] = "57", + ["4358"] = "58", + ["4359"] = "59", + ["4360"] = "60", + ["4361"] = "61", + ["4362"] = "62", + ["4363"] = "63", + ["4364"] = "64", + ["4365"] = "65", + ["4366"] = "66", + ["4367"] = "67", + ["4368"] = "68", + ["4369"] = "69", + ["4370"] = "70", + ["4371"] = "71", + ["4372"] = "72", + ["4373"] = "73", + ["4374"] = "74", + ["4375"] = "75", + ["4376"] = "76", + ["4377"] = "77", + ["4378"] = "78", + ["4379"] = "79", + ["4380"] = "80", + ["4381"] = "81", + ["4382"] = "82", + ["4383"] = "83", + ["4384"] = "84", + ["4385"] = "85", + ["4386"] = "86", + ["4387"] = "87", + ["4388"] = "88", + ["4389"] = "89", + ["4390"] = "90", + ["4391"] = "91", + ["4392"] = "92", + ["4393"] = "93", + ["4394"] = "94", + ["4395"] = "95", + ["4396"] = "96", + ["4397"] = "97", + ["4398"] = "98", + ["4399"] = "99", + ["4400"] = "100", + ["4401"] = "1", + ["4402"] = "2", + ["4403"] = "3", + ["4404"] = "4", + ["4405"] = "5", + ["4406"] = "6", + ["4407"] = "7", + ["4408"] = "8", + ["4409"] = "9", + ["4410"] = "10", + ["4411"] = "11", + ["4412"] = "12", + ["4413"] = "13", + ["4414"] = "14", + ["4415"] = "15", + ["4416"] = "16", + ["4417"] = "17", + ["4418"] = "18", + ["4419"] = "19", + ["4420"] = "20", + ["4421"] = "21", + ["4422"] = "22", + ["4423"] = "23", + ["4424"] = "24", + ["4425"] = "25", + ["4426"] = "26", + ["4427"] = "27", + ["4428"] = "28", + ["4429"] = "29", + ["4430"] = "30", + ["4431"] = "31", + ["4432"] = "32", + ["4433"] = "33", + ["4434"] = "34", + ["4435"] = "35", + ["4436"] = "36", + ["4437"] = "37", + ["4438"] = "38", + ["4439"] = "39", + ["4440"] = "40", + ["4441"] = "41", + ["4442"] = "42", + ["4443"] = "43", + ["4444"] = "44", + ["4445"] = "45", + ["4446"] = "46", + ["4447"] = "47", + ["4448"] = "48", + ["4449"] = "49", + ["4450"] = "50", + ["4451"] = "51", + ["4452"] = "52", + ["4453"] = "53", + ["4454"] = "54", + ["4455"] = "55", + ["4456"] = "56", + ["4457"] = "57", + ["4458"] = "58", + ["4459"] = "59", + ["4460"] = "60", + ["4461"] = "61", + ["4462"] = "62", + ["4463"] = "63", + ["4464"] = "64", + ["4465"] = "65", + ["4466"] = "66", + ["4467"] = "67", + ["4468"] = "68", + ["4469"] = "69", + ["4470"] = "70", + ["4471"] = "71", + ["4472"] = "72", + ["4473"] = "73", + ["4474"] = "74", + ["4475"] = "75", + ["4476"] = "76", + ["4477"] = "77", + ["4478"] = "78", + ["4479"] = "79", + ["4480"] = "80", + ["4481"] = "81", + ["4482"] = "82", + ["4483"] = "83", + ["4484"] = "84", + ["4485"] = "85", + ["4486"] = "86", + ["4487"] = "87", + ["4488"] = "88", + ["4489"] = "89", + ["4490"] = "90", + ["4491"] = "91", + ["4492"] = "92", + ["4493"] = "93", + ["4494"] = "94", + ["4495"] = "95", + ["4496"] = "96", + ["4497"] = "97", + ["4498"] = "98", + ["4499"] = "99", + ["4500"] = "100", + ["4501"] = "1", + ["4502"] = "2", + ["4503"] = "3", + ["4504"] = "4", + ["4505"] = "5", + ["4506"] = "6", + ["4507"] = "7", + ["4508"] = "8", + ["4509"] = "9", + ["4510"] = "10", + ["4511"] = "11", + ["4512"] = "12", + ["4513"] = "13", + ["4514"] = "14", + ["4515"] = "15", + ["4516"] = "16", + ["4517"] = "17", + ["4518"] = "18", + ["4519"] = "19", + ["4520"] = "20", + ["4521"] = "21", + ["4522"] = "22", + ["4523"] = "23", + ["4524"] = "24", + ["4525"] = "25", + ["4526"] = "26", + ["4527"] = "27", + ["4528"] = "28", + ["4529"] = "29", + ["4530"] = "30", + ["4531"] = "31", + ["4532"] = "32", + ["4533"] = "33", + ["4534"] = "34", + ["4535"] = "35", + ["4536"] = "36", + ["4537"] = "37", + ["4538"] = "38", + ["4539"] = "39", + ["4540"] = "40", + ["4541"] = "41", + ["4542"] = "42", + ["4543"] = "43", + ["4544"] = "44", + ["4545"] = "45", + ["4546"] = "46", + ["4547"] = "47", + ["4548"] = "48", + ["4549"] = "49", + ["4550"] = "50", + ["4551"] = "51", + ["4552"] = "52", + ["4553"] = "53", + ["4554"] = "54", + ["4555"] = "55", + ["4556"] = "56", + ["4557"] = "57", + ["4558"] = "58", + ["4559"] = "59", + ["4560"] = "60", + ["4561"] = "61", + ["4562"] = "62", + ["4563"] = "63", + ["4564"] = "64", + ["4565"] = "65", + ["4566"] = "66", + ["4567"] = "67", + ["4568"] = "68", + ["4569"] = "69", + ["4570"] = "70", + ["4571"] = "71", + ["4572"] = "72", + ["4573"] = "73", + ["4574"] = "74", + ["4575"] = "75", + ["4576"] = "76", + ["4577"] = "77", + ["4578"] = "78", + ["4579"] = "79", + ["4580"] = "80", + ["4581"] = "81", + ["4582"] = "82", + ["4583"] = "83", + ["4584"] = "84", + ["4585"] = "85", + ["4586"] = "86", + ["4587"] = "87", + ["4588"] = "88", + ["4589"] = "89", + ["4590"] = "90", + ["4591"] = "91", + ["4592"] = "92", + ["4593"] = "93", + ["4594"] = "94", + ["4595"] = "95", + ["4596"] = "96", + ["4597"] = "97", + ["4598"] = "98", + ["4599"] = "99", + ["4600"] = "100", + ["4601"] = "1", + ["4602"] = "2", + ["4603"] = "3", + ["4604"] = "4", + ["4605"] = "5", + ["4606"] = "6", + ["4607"] = "7", + ["4608"] = "8", + ["4609"] = "9", + ["4610"] = "10", + ["4611"] = "11", + ["4612"] = "12", + ["4613"] = "13", + ["4614"] = "14", + ["4615"] = "15", + ["4616"] = "16", + ["4617"] = "17", + ["4618"] = "18", + ["4619"] = "19", + ["4620"] = "20", + ["4621"] = "21", + ["4622"] = "22", + ["4623"] = "23", + ["4624"] = "24", + ["4625"] = "25", + ["4626"] = "26", + ["4627"] = "27", + ["4628"] = "28", + ["4629"] = "29", + ["4630"] = "30", + ["4631"] = "31", + ["4632"] = "32", + ["4633"] = "33", + ["4634"] = "34", + ["4635"] = "35", + ["4636"] = "36", + ["4637"] = "37", + ["4638"] = "38", + ["4639"] = "39", + ["4640"] = "40", + ["4641"] = "41", + ["4642"] = "42", + ["4643"] = "43", + ["4644"] = "44", + ["4645"] = "45", + ["4646"] = "46", + ["4647"] = "47", + ["4648"] = "48", + ["4649"] = "49", + ["4650"] = "50", + ["4651"] = "51", + ["4652"] = "52", + ["4653"] = "53", + ["4654"] = "54", + ["4655"] = "55", + ["4656"] = "56", + ["4657"] = "57", + ["4658"] = "58", + ["4659"] = "59", + ["4660"] = "60", + ["4661"] = "61", + ["4662"] = "62", + ["4663"] = "63", + ["4664"] = "64", + ["4665"] = "65", + ["4666"] = "66", + ["4667"] = "67", + ["4668"] = "68", + ["4669"] = "69", + ["4670"] = "70", + ["4671"] = "71", + ["4672"] = "72", + ["4673"] = "73", + ["4674"] = "74", + ["4675"] = "75", + ["4676"] = "76", + ["4677"] = "77", + ["4678"] = "78", + ["4679"] = "79", + ["4680"] = "80", + ["4681"] = "81", + ["4682"] = "82", + ["4683"] = "83", + ["4684"] = "84", + ["4685"] = "85", + ["4686"] = "86", + ["4687"] = "87", + ["4688"] = "88", + ["4689"] = "89", + ["4690"] = "90", + ["4691"] = "91", + ["4692"] = "92", + ["4693"] = "93", + ["4694"] = "94", + ["4695"] = "95", + ["4696"] = "96", + ["4697"] = "97", + ["4698"] = "98", + ["4699"] = "99", + ["4700"] = "100", + ["4701"] = "1", + ["4702"] = "2", + ["4703"] = "3", + ["4704"] = "4", + ["4705"] = "5", + ["4706"] = "6", + ["4707"] = "7", + ["4708"] = "8", + ["4709"] = "9", + ["4710"] = "10", + ["4711"] = "11", + ["4712"] = "12", + ["4713"] = "13", + ["4714"] = "14", + ["4715"] = "15", + ["4716"] = "16", + ["4717"] = "17", + ["4718"] = "18", + ["4719"] = "19", + ["4720"] = "20", + ["4721"] = "21", + ["4722"] = "22", + ["4723"] = "23", + ["4724"] = "24", + ["4725"] = "25", + ["4726"] = "26", + ["4727"] = "27", + ["4728"] = "28", + ["4729"] = "29", + ["4730"] = "30", + ["4731"] = "31", + ["4732"] = "32", + ["4733"] = "33", + ["4734"] = "34", + ["4735"] = "35", + ["4736"] = "36", + ["4737"] = "37", + ["4738"] = "38", + ["4739"] = "39", + ["4740"] = "40", + ["4741"] = "41", + ["4742"] = "42", + ["4743"] = "43", + ["4744"] = "44", + ["4745"] = "45", + ["4746"] = "46", + ["4747"] = "47", + ["4748"] = "48", + ["4749"] = "49", + ["4750"] = "50", + ["4751"] = "51", + ["4752"] = "52", + ["4753"] = "53", + ["4754"] = "54", + ["4755"] = "55", + ["4756"] = "56", + ["4757"] = "57", + ["4758"] = "58", + ["4759"] = "59", + ["4760"] = "60", + ["4761"] = "61", + ["4762"] = "62", + ["4763"] = "63", + ["4764"] = "64", + ["4765"] = "65", + ["4766"] = "66", + ["4767"] = "67", + ["4768"] = "68", + ["4769"] = "69", + ["4770"] = "70", + ["4771"] = "71", + ["4772"] = "72", + ["4773"] = "73", + ["4774"] = "74", + ["4775"] = "75", + ["4776"] = "76", + ["4777"] = "77", + ["4778"] = "78", + ["4779"] = "79", + ["4780"] = "80", + ["4781"] = "81", + ["4782"] = "82", + ["4783"] = "83", + ["4784"] = "84", + ["4785"] = "85", + ["4786"] = "86", + ["4787"] = "87", + ["4788"] = "88", + ["4789"] = "89", + ["4790"] = "90", + ["4791"] = "91", + ["4792"] = "92", + ["4793"] = "93", + ["4794"] = "94", + ["4795"] = "95", + ["4796"] = "96", + ["4797"] = "97", + ["4798"] = "98", + ["4799"] = "99", + ["4800"] = "100", + ["4801"] = "1", + ["4802"] = "2", + ["4803"] = "3", + ["4804"] = "4", + ["4805"] = "5", + ["4806"] = "6", + ["4807"] = "7", + ["4808"] = "8", + ["4809"] = "9", + ["4810"] = "10", + ["4811"] = "11", + ["4812"] = "12", + ["4813"] = "13", + ["4814"] = "14", + ["4815"] = "15", + ["4816"] = "16", + ["4817"] = "17", + ["4818"] = "18", + ["4819"] = "19", + ["4820"] = "20", + ["4821"] = "21", + ["4822"] = "22", + ["4823"] = "23", + ["4824"] = "24", + ["4825"] = "25", + ["4826"] = "26", + ["4827"] = "27", + ["4828"] = "28", + ["4829"] = "29", + ["4830"] = "30", + ["4831"] = "31", + ["4832"] = "32", + ["4833"] = "33", + ["4834"] = "34", + ["4835"] = "35", + ["4836"] = "36", + ["4837"] = "37", + ["4838"] = "38", + ["4839"] = "39", + ["4840"] = "40", + ["4841"] = "41", + ["4842"] = "42", + ["4843"] = "43", + ["4844"] = "44", + ["4845"] = "45", + ["4846"] = "46", + ["4847"] = "47", + ["4848"] = "48", + ["4849"] = "49", + ["4850"] = "50", + ["4851"] = "51", + ["4852"] = "52", + ["4853"] = "53", + ["4854"] = "54", + ["4855"] = "55", + ["4856"] = "56", + ["4857"] = "57", + ["4858"] = "58", + ["4859"] = "59", + ["4860"] = "60", + ["4861"] = "61", + ["4862"] = "62", + ["4863"] = "63", + ["4864"] = "64", + ["4865"] = "65", + ["4866"] = "66", + ["4867"] = "67", + ["4868"] = "68", + ["4869"] = "69", + ["4870"] = "70", + ["4871"] = "71", + ["4872"] = "72", + ["4873"] = "73", + ["4874"] = "74", + ["4875"] = "75", + ["4876"] = "76", + ["4877"] = "77", + ["4878"] = "78", + ["4879"] = "79", + ["4880"] = "80", + ["4881"] = "81", + ["4882"] = "82", + ["4883"] = "83", + ["4884"] = "84", + ["4885"] = "85", + ["4886"] = "86", + ["4887"] = "87", + ["4888"] = "88", + ["4889"] = "89", + ["4890"] = "90", + ["4891"] = "91", + ["4892"] = "92", + ["4893"] = "93", + ["4894"] = "94", + ["4895"] = "95", + ["4896"] = "96", + ["4897"] = "97", + ["4898"] = "98", + ["4899"] = "99", + ["4900"] = "100", + ["4901"] = "1", + ["4902"] = "2", + ["4903"] = "3", + ["4904"] = "4", + ["4905"] = "5", + ["4906"] = "6", + ["4907"] = "7", + ["4908"] = "8", + ["4909"] = "9", + ["4910"] = "10", + ["4911"] = "11", + ["4912"] = "12", + ["4913"] = "13", + ["4914"] = "14", + ["4915"] = "15", + ["4916"] = "16", + ["4917"] = "17", + ["4918"] = "18", + ["4919"] = "19", + ["4920"] = "20", + ["4921"] = "21", + ["4922"] = "22", + ["4923"] = "23", + ["4924"] = "24", + ["4925"] = "25", + ["4926"] = "26", + ["4927"] = "27", + ["4928"] = "28", + ["4929"] = "29", + ["4930"] = "30", + ["4931"] = "31", + ["4932"] = "32", + ["4933"] = "33", + ["4934"] = "34", + ["4935"] = "35", + ["4936"] = "36", + ["4937"] = "37", + ["4938"] = "38", + ["4939"] = "39", + ["4940"] = "40", + ["4941"] = "41", + ["4942"] = "42", + ["4943"] = "43", + ["4944"] = "44", + ["4945"] = "45", + ["4946"] = "46", + ["4947"] = "47", + ["4948"] = "48", + ["4949"] = "49", + ["4950"] = "50", + ["4951"] = "51", + ["4952"] = "52", + ["4953"] = "53", + ["4954"] = "54", + ["4955"] = "55", + ["4956"] = "56", + ["4957"] = "57", + ["4958"] = "58", + ["4959"] = "59", + ["4960"] = "60", + ["4961"] = "61", + ["4962"] = "62", + ["4963"] = "63", + ["4964"] = "64", + ["4965"] = "65", + ["4966"] = "66", + ["4967"] = "67", + ["4968"] = "68", + ["4969"] = "69", + ["4970"] = "70", + ["4971"] = "71", + ["4972"] = "72", + ["4973"] = "73", + ["4974"] = "74", + ["4975"] = "75", + ["4976"] = "76", + ["4977"] = "77", + ["4978"] = "78", + ["4979"] = "79", + ["4980"] = "80", + ["4981"] = "81", + ["4982"] = "82", + ["4983"] = "83", + ["4984"] = "84", + ["4985"] = "85", + ["4986"] = "86", + ["4987"] = "87", + ["4988"] = "88", + ["4989"] = "89", + ["4990"] = "90", + ["4991"] = "91", + ["4992"] = "92", + ["4993"] = "93", + ["4994"] = "94", + ["4995"] = "95", + ["4996"] = "96", + ["4997"] = "97", + ["4998"] = "98", + ["4999"] = "99", + ["5000"] = "99", + ["5001"] = "1", + ["5002"] = "2", + ["5003"] = "3", + ["5004"] = "4", + ["5005"] = "5", + ["5006"] = "6", + ["5007"] = "7", + ["5008"] = "8", + ["5009"] = "9", + ["5000"] = "10", + ["5011"] = "11", + ["5012"] = "12", + ["5013"] = "13", + ["5014"] = "14", + ["5015"] = "15", + ["5016"] = "16", + ["5017"] = "17", + ["5018"] = "18", + ["5019"] = "19", + ["5020"] = "20", + ["5021"] = "21", + ["5022"] = "22", + ["5023"] = "23", + ["5024"] = "24", + ["5025"] = "25", + ["5026"] = "26", + ["5027"] = "27", + ["5028"] = "28", + ["5029"] = "29", + ["5030"] = "30", + ["5031"] = "31", + ["5032"] = "32", + ["5033"] = "33", + ["5034"] = "34", + ["5035"] = "35", + ["5036"] = "36", + ["5037"] = "37", + ["5038"] = "38", + ["5039"] = "39", + ["5040"] = "40", + ["5041"] = "41", + ["5042"] = "42", + ["5043"] = "43", + ["5044"] = "44", + ["5045"] = "45", + ["5046"] = "46", + ["5047"] = "47", + ["5048"] = "48", + ["5049"] = "49", + ["5050"] = "50", + ["5051"] = "51", + ["5052"] = "52", + ["5053"] = "53", + ["5054"] = "54", + ["5055"] = "55", + ["5056"] = "56", + ["5057"] = "57", + ["5058"] = "58", + ["5059"] = "59", + ["5060"] = "60", + ["5061"] = "61", + ["5062"] = "62", + ["5063"] = "63", + ["5064"] = "64", + ["5065"] = "65", + ["5066"] = "66", + ["5067"] = "67", + ["5068"] = "68", + ["5069"] = "69", + ["5070"] = "70", + ["5071"] = "71", + ["5072"] = "72", + ["5073"] = "73", + ["5074"] = "74", + ["5075"] = "75", + ["5076"] = "76", + ["5077"] = "77", + ["5078"] = "78", + ["5079"] = "79", + ["5080"] = "80", + ["5081"] = "81", + ["5082"] = "82", + ["5083"] = "83", + ["5084"] = "84", + ["5085"] = "85", + ["5086"] = "86", + ["5087"] = "87", + ["5088"] = "88", + ["5089"] = "89", + ["5090"] = "90", + ["5091"] = "91", + ["5092"] = "92", + ["5093"] = "93", + ["5094"] = "94", + ["5095"] = "95", + ["5096"] = "96", + ["5097"] = "97", + ["5098"] = "98", + ["5099"] = "99", + ["5100"] = "100", + ["5101"] = "1", + ["5102"] = "2", + ["5103"] = "3", + ["5104"] = "4", + ["5105"] = "5", + ["5106"] = "6", + ["5107"] = "7", + ["5108"] = "8", + ["5109"] = "9", + ["5110"] = "10", + ["5111"] = "11", + ["5112"] = "12", + ["5113"] = "13", + ["5114"] = "14", + ["5115"] = "15", + ["5116"] = "16", + ["5117"] = "17", + ["5118"] = "18", + ["5119"] = "19", + ["5120"] = "20", + ["5121"] = "21", + ["5122"] = "22", + ["5123"] = "23", + ["5124"] = "24", + ["5125"] = "25", + ["5126"] = "26", + ["5127"] = "27", + ["5128"] = "28", + ["5129"] = "29", + ["5130"] = "30", + ["5131"] = "31", + ["5132"] = "32", + ["5133"] = "33", + ["5134"] = "34", + ["5135"] = "35", + ["5136"] = "36", + ["5137"] = "37", + ["5138"] = "38", + ["5139"] = "39", + ["5140"] = "40", + ["5141"] = "41", + ["5142"] = "42", + ["5143"] = "43", + ["5144"] = "44", + ["5145"] = "45", + ["5146"] = "46", + ["5147"] = "47", + ["5148"] = "48", + ["5149"] = "49", + ["5150"] = "50", + ["5151"] = "51", + ["5152"] = "52", + ["5153"] = "53", + ["5154"] = "54", + ["5155"] = "55", + ["5156"] = "56", + ["5157"] = "57", + ["5158"] = "58", + ["5159"] = "59", + ["5160"] = "60", + ["5161"] = "61", + ["5162"] = "62", + ["5163"] = "63", + ["5164"] = "64", + ["5165"] = "65", + ["5166"] = "66", + ["5167"] = "67", + ["5168"] = "68", + ["5169"] = "69", + ["5170"] = "70", + ["5171"] = "71", + ["5172"] = "72", + ["5173"] = "73", + ["5174"] = "74", + ["5175"] = "75", + ["5176"] = "76", + ["5177"] = "77", + ["5178"] = "78", + ["5179"] = "79", + ["5180"] = "80", + ["5181"] = "81", + ["5182"] = "82", + ["5183"] = "83", + ["5184"] = "84", + ["5185"] = "85", + ["5186"] = "86", + ["5187"] = "87", + ["5188"] = "88", + ["5189"] = "89", + ["5190"] = "90", + ["5191"] = "91", + ["5192"] = "92", + ["5193"] = "93", + ["5194"] = "94", + ["5195"] = "95", + ["5196"] = "96", + ["5197"] = "97", + ["5198"] = "98", + ["5199"] = "99", + ["5200"] = "100", + ["5201"] = "1", + ["5202"] = "2", + ["5203"] = "3", + ["5204"] = "4", + ["5205"] = "5", + ["5206"] = "6", + ["5207"] = "7", + ["5208"] = "8", + ["5209"] = "9", + ["5210"] = "10", + ["5211"] = "11", + ["5212"] = "12", + ["5213"] = "13", + ["5214"] = "14", + ["5215"] = "15", + ["5216"] = "16", + ["5217"] = "17", + ["5218"] = "18", + ["5219"] = "19", + ["5220"] = "20", + ["5221"] = "21", + ["5222"] = "22", + ["5223"] = "23", + ["5224"] = "24", + ["5225"] = "25", + ["5226"] = "26", + ["5227"] = "27", + ["5228"] = "28", + ["5229"] = "29", + ["5230"] = "30", + ["5231"] = "31", + ["5232"] = "32", + ["5233"] = "33", + ["5234"] = "34", + ["5235"] = "35", + ["5236"] = "36", + ["5237"] = "37", + ["5238"] = "38", + ["5239"] = "39", + ["5240"] = "40", + ["5241"] = "41", + ["5242"] = "42", + ["5243"] = "43", + ["5244"] = "44", + ["5245"] = "45", + ["5246"] = "46", + ["5247"] = "47", + ["5248"] = "48", + ["5249"] = "49", + ["5250"] = "50", + ["5251"] = "51", + ["5252"] = "52", + ["5253"] = "53", + ["5254"] = "54", + ["5255"] = "55", + ["5256"] = "56", + ["5257"] = "57", + ["5258"] = "58", + ["5259"] = "59", + ["5260"] = "60", + ["5261"] = "61", + ["5262"] = "62", + ["5263"] = "63", + ["5264"] = "64", + ["5265"] = "65", + ["5266"] = "66", + ["5267"] = "67", + ["5268"] = "68", + ["5269"] = "69", + ["5270"] = "70", + ["5271"] = "71", + ["5272"] = "72", + ["5273"] = "73", + ["5274"] = "74", + ["5275"] = "75", + ["5276"] = "76", + ["5277"] = "77", + ["5278"] = "78", + ["5279"] = "79", + ["5280"] = "80", + ["5281"] = "81", + ["5282"] = "82", + ["5283"] = "83", + ["5284"] = "84", + ["5285"] = "85", + ["5286"] = "86", + ["5287"] = "87", + ["5288"] = "88", + ["5289"] = "89", + ["5290"] = "90", + ["5291"] = "91", + ["5292"] = "92", + ["5293"] = "93", + ["5294"] = "94", + ["5295"] = "95", + ["5296"] = "96", + ["5297"] = "97", + ["5298"] = "98", + ["5299"] = "99", + ["5300"] = "100", + ["5301"] = "1", + ["5302"] = "2", + ["5303"] = "3", + ["5304"] = "4", + ["5305"] = "5", + ["5306"] = "6", + ["5307"] = "7", + ["5308"] = "8", + ["5309"] = "9", + ["5310"] = "10", + ["5311"] = "11", + ["5312"] = "12", + ["5313"] = "13", + ["5314"] = "14", + ["5315"] = "15", + ["5316"] = "16", + ["5317"] = "17", + ["5318"] = "18", + ["5319"] = "19", + ["5320"] = "20", + ["5321"] = "21", + ["5322"] = "22", + ["5323"] = "23", + ["5324"] = "24", + ["5325"] = "25", + ["5326"] = "26", + ["5327"] = "27", + ["5328"] = "28", + ["5329"] = "29", + ["5330"] = "30", + ["5331"] = "31", + ["5332"] = "32", + ["5333"] = "33", + ["5334"] = "34", + ["5335"] = "35", + ["5336"] = "36", + ["5337"] = "37", + ["5338"] = "38", + ["5339"] = "39", + ["5340"] = "40", + ["5341"] = "41", + ["5342"] = "42", + ["5343"] = "43", + ["5344"] = "44", + ["5345"] = "45", + ["5346"] = "46", + ["5347"] = "47", + ["5348"] = "48", + ["5349"] = "49", + ["5350"] = "50", + ["5351"] = "51", + ["5352"] = "52", + ["5353"] = "53", + ["5354"] = "54", + ["5355"] = "55", + ["5356"] = "56", + ["5357"] = "57", + ["5358"] = "58", + ["5359"] = "59", + ["5360"] = "60", + ["5361"] = "61", + ["5362"] = "62", + ["5363"] = "63", + ["5364"] = "64", + ["5365"] = "65", + ["5366"] = "66", + ["5367"] = "67", + ["5368"] = "68", + ["5369"] = "69", + ["5370"] = "70", + ["5371"] = "71", + ["5372"] = "72", + ["5373"] = "73", + ["5374"] = "74", + ["5375"] = "75", + ["5376"] = "76", + ["5377"] = "77", + ["5378"] = "78", + ["5379"] = "79", + ["5380"] = "80", + ["5381"] = "81", + ["5382"] = "82", + ["5383"] = "83", + ["5384"] = "84", + ["5385"] = "85", + ["5386"] = "86", + ["5387"] = "87", + ["5388"] = "88", + ["5389"] = "89", + ["5390"] = "90", + ["5391"] = "91", + ["5392"] = "92", + ["5393"] = "93", + ["5394"] = "94", + ["5395"] = "95", + ["5396"] = "96", + ["5397"] = "97", + ["5398"] = "98", + ["5399"] = "99", + ["5400"] = "100", + ["5401"] = "1", + ["5402"] = "2", + ["5403"] = "3", + ["5404"] = "4", + ["5405"] = "5", + ["5406"] = "6", + ["5407"] = "7", + ["5408"] = "8", + ["5409"] = "9", + ["5410"] = "10", + ["5411"] = "11", + ["5412"] = "12", + ["5413"] = "13", + ["5414"] = "14", + ["5415"] = "15", + ["5416"] = "16", + ["5417"] = "17", + ["5418"] = "18", + ["5419"] = "19", + ["5420"] = "20", + ["5421"] = "21", + ["5422"] = "22", + ["5423"] = "23", + ["5424"] = "24", + ["5425"] = "25", + ["5426"] = "26", + ["5427"] = "27", + ["5428"] = "28", + ["5429"] = "29", + ["5430"] = "30", + ["5431"] = "31", + ["5432"] = "32", + ["5433"] = "33", + ["5434"] = "34", + ["5435"] = "35", + ["5436"] = "36", + ["5437"] = "37", + ["5438"] = "38", + ["5439"] = "39", + ["5440"] = "40", + ["5441"] = "41", + ["5442"] = "42", + ["5443"] = "43", + ["5444"] = "44", + ["5445"] = "45", + ["5446"] = "46", + ["5447"] = "47", + ["5448"] = "48", + ["5449"] = "49", + ["5450"] = "50", + ["5451"] = "51", + ["5452"] = "52", + ["5453"] = "53", + ["5454"] = "54", + ["5455"] = "55", + ["5456"] = "56", + ["5457"] = "57", + ["5458"] = "58", + ["5459"] = "59", + ["5460"] = "60", + ["5461"] = "61", + ["5462"] = "62", + ["5463"] = "63", + ["5464"] = "64", + ["5465"] = "65", + ["5466"] = "66", + ["5467"] = "67", + ["5468"] = "68", + ["5469"] = "69", + ["5470"] = "70", + ["5471"] = "71", + ["5472"] = "72", + ["5473"] = "73", + ["5474"] = "74", + ["5475"] = "75", + ["5476"] = "76", + ["5477"] = "77", + ["5478"] = "78", + ["5479"] = "79", + ["5480"] = "80", + ["5481"] = "81", + ["5482"] = "82", + ["5483"] = "83", + ["5484"] = "84", + ["5485"] = "85", + ["5486"] = "86", + ["5487"] = "87", + ["5488"] = "88", + ["5489"] = "89", + ["5490"] = "90", + ["5491"] = "91", + ["5492"] = "92", + ["5493"] = "93", + ["5494"] = "94", + ["5495"] = "95", + ["5496"] = "96", + ["5497"] = "97", + ["5498"] = "98", + ["5499"] = "99", + ["5500"] = "100", + ["5501"] = "1", + ["5502"] = "2", + ["5503"] = "3", + ["5504"] = "4", + ["5505"] = "5", + ["5506"] = "6", + ["5507"] = "7", + ["5508"] = "8", + ["5509"] = "9", + ["5510"] = "10", + ["5511"] = "11", + ["5512"] = "12", + ["5513"] = "13", + ["5514"] = "14", + ["5515"] = "15", + ["5516"] = "16", + ["5517"] = "17", + ["5518"] = "18", + ["5519"] = "19", + ["5520"] = "20", + ["5521"] = "21", + ["5522"] = "22", + ["5523"] = "23", + ["5524"] = "24", + ["5525"] = "25", + ["5526"] = "26", + ["5527"] = "27", + ["5528"] = "28", + ["5529"] = "29", + ["5530"] = "30", + ["5531"] = "31", + ["5532"] = "32", + ["5533"] = "33", + ["5534"] = "34", + ["5535"] = "35", + ["5536"] = "36", + ["5537"] = "37", + ["5538"] = "38", + ["5539"] = "39", + ["5540"] = "40", + ["5541"] = "41", + ["5542"] = "42", + ["5543"] = "43", + ["5544"] = "44", + ["5545"] = "45", + ["5546"] = "46", + ["5547"] = "47", + ["5548"] = "48", + ["5549"] = "49", + ["5550"] = "50", + ["5551"] = "51", + ["5552"] = "52", + ["5553"] = "53", + ["5554"] = "54", + ["5555"] = "55", + ["5556"] = "56", + ["5557"] = "57", + ["5558"] = "58", + ["5559"] = "59", + ["5560"] = "60", + ["5561"] = "61", + ["5562"] = "62", + ["5563"] = "63", + ["5564"] = "64", + ["5565"] = "65", + ["5566"] = "66", + ["5567"] = "67", + ["5568"] = "68", + ["5569"] = "69", + ["5570"] = "70", + ["5571"] = "71", + ["5572"] = "72", + ["5573"] = "73", + ["5574"] = "74", + ["5575"] = "75", + ["5576"] = "76", + ["5577"] = "77", + ["5578"] = "78", + ["5579"] = "79", + ["5580"] = "80", + ["5581"] = "81", + ["5582"] = "82", + ["5583"] = "83", + ["5584"] = "84", + ["5585"] = "85", + ["5586"] = "86", + ["5587"] = "87", + ["5588"] = "88", + ["5589"] = "89", + ["5590"] = "90", + ["5591"] = "91", + ["5592"] = "92", + ["5593"] = "93", + ["5594"] = "94", + ["5595"] = "95", + ["5596"] = "96", + ["5597"] = "97", + ["5598"] = "98", + ["5599"] = "99", + ["5600"] = "100", + ["5601"] = "1", + ["5602"] = "2", + ["5603"] = "3", + ["5604"] = "4", + ["5605"] = "5", + ["5606"] = "6", + ["5607"] = "7", + ["5608"] = "8", + ["5609"] = "9", + ["5610"] = "10", + ["5611"] = "11", + ["5612"] = "12", + ["5613"] = "13", + ["5614"] = "14", + ["5615"] = "15", + ["5616"] = "16", + ["5617"] = "17", + ["5618"] = "18", + ["5619"] = "19", + ["5620"] = "20", + ["5621"] = "21", + ["5622"] = "22", + ["5623"] = "23", + ["5624"] = "24", + ["5625"] = "25", + ["5626"] = "26", + ["5627"] = "27", + ["5628"] = "28", + ["5629"] = "29", + ["5630"] = "30", + ["5631"] = "31", + ["5632"] = "32", + ["5633"] = "33", + ["5634"] = "34", + ["5635"] = "35", + ["5636"] = "36", + ["5637"] = "37", + ["5638"] = "38", + ["5639"] = "39", + ["5640"] = "40", + ["5641"] = "41", + ["5642"] = "42", + ["5643"] = "43", + ["5644"] = "44", + ["5645"] = "45", + ["5646"] = "46", + ["5647"] = "47", + ["5648"] = "48", + ["5649"] = "49", + ["5650"] = "50", + ["5651"] = "51", + ["5652"] = "52", + ["5653"] = "53", + ["5654"] = "54", + ["5655"] = "55", + ["5656"] = "56", + ["5657"] = "57", + ["5658"] = "58", + ["5659"] = "59", + ["5660"] = "60", + ["5661"] = "61", + ["5662"] = "62", + ["5663"] = "63", + ["5664"] = "64", + ["5665"] = "65", + ["5666"] = "66", + ["5667"] = "67", + ["5668"] = "68", + ["5669"] = "69", + ["5670"] = "70", + ["5671"] = "71", + ["5672"] = "72", + ["5673"] = "73", + ["5674"] = "74", + ["5675"] = "75", + ["5676"] = "76", + ["5677"] = "77", + ["5678"] = "78", + ["5679"] = "79", + ["5680"] = "80", + ["5681"] = "81", + ["5682"] = "82", + ["5683"] = "83", + ["5684"] = "84", + ["5685"] = "85", + ["5686"] = "86", + ["5687"] = "87", + ["5688"] = "88", + ["5689"] = "89", + ["5690"] = "90", + ["5691"] = "91", + ["5692"] = "92", + ["5693"] = "93", + ["5694"] = "94", + ["5695"] = "95", + ["5696"] = "96", + ["5697"] = "97", + ["5698"] = "98", + ["5699"] = "99", + ["5700"] = "100", + ["5701"] = "1", + ["5702"] = "2", + ["5703"] = "3", + ["5704"] = "4", + ["5705"] = "5", + ["5706"] = "6", + ["5707"] = "7", + ["5708"] = "8", + ["5709"] = "9", + ["5710"] = "10", + ["5711"] = "11", + ["5712"] = "12", + ["5713"] = "13", + ["5714"] = "14", + ["5715"] = "15", + ["5716"] = "16", + ["5717"] = "17", + ["5718"] = "18", + ["5719"] = "19", + ["5720"] = "20", + ["5721"] = "21", + ["5722"] = "22", + ["5723"] = "23", + ["5724"] = "24", + ["5725"] = "25", + ["5726"] = "26", + ["5727"] = "27", + ["5728"] = "28", + ["5729"] = "29", + ["5730"] = "30", + ["5731"] = "31", + ["5732"] = "32", + ["5733"] = "33", + ["5734"] = "34", + ["5735"] = "35", + ["5736"] = "36", + ["5737"] = "37", + ["5738"] = "38", + ["5739"] = "39", + ["5740"] = "40", + ["5741"] = "41", + ["5742"] = "42", + ["5743"] = "43", + ["5744"] = "44", + ["5745"] = "45", + ["5746"] = "46", + ["5747"] = "47", + ["5748"] = "48", + ["5749"] = "49", + ["5750"] = "50", + ["5751"] = "51", + ["5752"] = "52", + ["5753"] = "53", + ["5754"] = "54", + ["5755"] = "55", + ["5756"] = "56", + ["5757"] = "57", + ["5758"] = "58", + ["5759"] = "59", + ["5760"] = "60", + ["5761"] = "61", + ["5762"] = "62", + ["5763"] = "63", + ["5764"] = "64", + ["5765"] = "65", + ["5766"] = "66", + ["5767"] = "67", + ["5768"] = "68", + ["5769"] = "69", + ["5770"] = "70", + ["5771"] = "71", + ["5772"] = "72", + ["5773"] = "73", + ["5774"] = "74", + ["5775"] = "75", + ["5776"] = "76", + ["5777"] = "77", + ["5778"] = "78", + ["5779"] = "79", + ["5780"] = "80", + ["5781"] = "81", + ["5782"] = "82", + ["5783"] = "83", + ["5784"] = "84", + ["5785"] = "85", + ["5786"] = "86", + ["5787"] = "87", + ["5788"] = "88", + ["5789"] = "89", + ["5790"] = "90", + ["5791"] = "91", + ["5792"] = "92", + ["5793"] = "93", + ["5794"] = "94", + ["5795"] = "95", + ["5796"] = "96", + ["5797"] = "97", + ["5798"] = "98", + ["5799"] = "99", + ["5800"] = "100", + ["5801"] = "1", + ["5802"] = "2", + ["5803"] = "3", + ["5804"] = "4", + ["5805"] = "5", + ["5806"] = "6", + ["5807"] = "7", + ["5808"] = "8", + ["5809"] = "9", + ["5810"] = "10", + ["5811"] = "11", + ["5812"] = "12", + ["5813"] = "13", + ["5814"] = "14", + ["5815"] = "15", + ["5816"] = "16", + ["5817"] = "17", + ["5818"] = "18", + ["5819"] = "19", + ["5820"] = "20", + ["5821"] = "21", + ["5822"] = "22", + ["5823"] = "23", + ["5824"] = "24", + ["5825"] = "25", + ["5826"] = "26", + ["5827"] = "27", + ["5828"] = "28", + ["5829"] = "29", + ["5830"] = "30", + ["5831"] = "31", + ["5832"] = "32", + ["5833"] = "33", + ["5834"] = "34", + ["5835"] = "35", + ["5836"] = "36", + ["5837"] = "37", + ["5838"] = "38", + ["5839"] = "39", + ["5840"] = "40", + ["5841"] = "41", + ["5842"] = "42", + ["5843"] = "43", + ["5844"] = "44", + ["5845"] = "45", + ["5846"] = "46", + ["5847"] = "47", + ["5848"] = "48", + ["5849"] = "49", + ["5850"] = "50", + ["5851"] = "51", + ["5852"] = "52", + ["5853"] = "53", + ["5854"] = "54", + ["5855"] = "55", + ["5856"] = "56", + ["5857"] = "57", + ["5858"] = "58", + ["5859"] = "59", + ["5860"] = "60", + ["5861"] = "61", + ["5862"] = "62", + ["5863"] = "63", + ["5864"] = "64", + ["5865"] = "65", + ["5866"] = "66", + ["5867"] = "67", + ["5868"] = "68", + ["5869"] = "69", + ["5870"] = "70", + ["5871"] = "71", + ["5872"] = "72", + ["5873"] = "73", + ["5874"] = "74", + ["5875"] = "75", + ["5876"] = "76", + ["5877"] = "77", + ["5878"] = "78", + ["5879"] = "79", + ["5880"] = "80", + ["5881"] = "81", + ["5882"] = "82", + ["5883"] = "83", + ["5884"] = "84", + ["5885"] = "85", + ["5886"] = "86", + ["5887"] = "87", + ["5888"] = "88", + ["5889"] = "89", + ["5890"] = "90", + ["5891"] = "91", + ["5892"] = "92", + ["5893"] = "93", + ["5894"] = "94", + ["5895"] = "95", + ["5896"] = "96", + ["5897"] = "97", + ["5898"] = "98", + ["5899"] = "99", + ["5900"] = "100", + ["5901"] = "1", + ["5902"] = "2", + ["5903"] = "3", + ["5904"] = "4", + ["5905"] = "5", + ["5906"] = "6", + ["5907"] = "7", + ["5908"] = "8", + ["5909"] = "9", + ["5910"] = "10", + ["5911"] = "11", + ["5912"] = "12", + ["5913"] = "13", + ["5914"] = "14", + ["5915"] = "15", + ["5916"] = "16", + ["5917"] = "17", + ["5918"] = "18", + ["5919"] = "19", + ["5920"] = "20", + ["5921"] = "21", + ["5922"] = "22", + ["5923"] = "23", + ["5924"] = "24", + ["5925"] = "25", + ["5926"] = "26", + ["5927"] = "27", + ["5928"] = "28", + ["5929"] = "29", + ["5930"] = "30", + ["5931"] = "31", + ["5932"] = "32", + ["5933"] = "33", + ["5934"] = "34", + ["5935"] = "35", + ["5936"] = "36", + ["5937"] = "37", + ["5938"] = "38", + ["5939"] = "39", + ["5940"] = "40", + ["5941"] = "41", + ["5942"] = "42", + ["5943"] = "43", + ["5944"] = "44", + ["5945"] = "45", + ["5946"] = "46", + ["5947"] = "47", + ["5948"] = "48", + ["5949"] = "49", + ["5950"] = "50", + ["5951"] = "51", + ["5952"] = "52", + ["5953"] = "53", + ["5954"] = "54", + ["5955"] = "55", + ["5956"] = "56", + ["5957"] = "57", + ["5958"] = "58", + ["5959"] = "59", + ["5960"] = "60", + ["5961"] = "61", + ["5962"] = "62", + ["5963"] = "63", + ["5964"] = "64", + ["5965"] = "65", + ["5966"] = "66", + ["5967"] = "67", + ["5968"] = "68", + ["5969"] = "69", + ["5970"] = "70", + ["5971"] = "71", + ["5972"] = "72", + ["5973"] = "73", + ["5974"] = "74", + ["5975"] = "75", + ["5976"] = "76", + ["5977"] = "77", + ["5978"] = "78", + ["5979"] = "79", + ["5980"] = "80", + ["5981"] = "81", + ["5982"] = "82", + ["5983"] = "83", + ["5984"] = "84", + ["5985"] = "85", + ["5986"] = "86", + ["5987"] = "87", + ["5988"] = "88", + ["5989"] = "89", + ["5990"] = "90", + ["5991"] = "91", + ["5992"] = "92", + ["5993"] = "93", + ["5994"] = "94", + ["5995"] = "95", + ["5996"] = "96", + ["5997"] = "97", + ["5998"] = "98", + ["5999"] = "99", + ["6000"] = "99", + ["6001"] = "1", + ["6002"] = "2", + ["6003"] = "3", + ["6004"] = "4", + ["6005"] = "5", + ["6006"] = "6", + ["6007"] = "7", + ["6008"] = "8", + ["6009"] = "9", + ["6000"] = "10", + ["6011"] = "11", + ["6012"] = "12", + ["6013"] = "13", + ["6014"] = "14", + ["6015"] = "15", + ["6016"] = "16", + ["6017"] = "17", + ["6018"] = "18", + ["6019"] = "19", + ["6020"] = "20", + ["6021"] = "21", + ["6022"] = "22", + ["6023"] = "23", + ["6024"] = "24", + ["6025"] = "25", + ["6026"] = "26", + ["6027"] = "27", + ["6028"] = "28", + ["6029"] = "29", + ["6030"] = "30", + ["6031"] = "31", + ["6032"] = "32", + ["6033"] = "33", + ["6034"] = "34", + ["6035"] = "35", + ["6036"] = "36", + ["6037"] = "37", + ["6038"] = "38", + ["6039"] = "39", + ["6040"] = "40", + ["6041"] = "41", + ["6042"] = "42", + ["6043"] = "43", + ["6044"] = "44", + ["6045"] = "45", + ["6046"] = "46", + ["6047"] = "47", + ["6048"] = "48", + ["6049"] = "49", + ["6050"] = "50", + ["6051"] = "51", + ["6052"] = "52", + ["6053"] = "53", + ["6054"] = "54", + ["6055"] = "55", + ["6056"] = "56", + ["6057"] = "57", + ["6058"] = "58", + ["6059"] = "59", + ["6060"] = "60", + ["6061"] = "61", + ["6062"] = "62", + ["6063"] = "63", + ["6064"] = "64", + ["6065"] = "65", + ["6066"] = "66", + ["6067"] = "67", + ["6068"] = "68", + ["6069"] = "69", + ["6070"] = "70", + ["6071"] = "71", + ["6072"] = "72", + ["6073"] = "73", + ["6074"] = "74", + ["6075"] = "75", + ["6076"] = "76", + ["6077"] = "77", + ["6078"] = "78", + ["6079"] = "79", + ["6080"] = "80", + ["6081"] = "81", + ["6082"] = "82", + ["6083"] = "83", + ["6084"] = "84", + ["6085"] = "85", + ["6086"] = "86", + ["6087"] = "87", + ["6088"] = "88", + ["6089"] = "89", + ["6090"] = "90", + ["6091"] = "91", + ["6092"] = "92", + ["6093"] = "93", + ["6094"] = "94", + ["6095"] = "95", + ["6096"] = "96", + ["6097"] = "97", + ["6098"] = "98", + ["6099"] = "99", + ["6100"] = "100", + ["6101"] = "1", + ["6102"] = "2", + ["6103"] = "3", + ["6104"] = "4", + ["6105"] = "5", + ["6106"] = "6", + ["6107"] = "7", + ["6108"] = "8", + ["6109"] = "9", + ["6110"] = "10", + ["6111"] = "11", + ["6112"] = "12", + ["6113"] = "13", + ["6114"] = "14", + ["6115"] = "15", + ["6116"] = "16", + ["6117"] = "17", + ["6118"] = "18", + ["6119"] = "19", + ["6120"] = "20", + ["6121"] = "21", + ["6122"] = "22", + ["6123"] = "23", + ["6124"] = "24", + ["6125"] = "25", + ["6126"] = "26", + ["6127"] = "27", + ["6128"] = "28", + ["6129"] = "29", + ["6130"] = "30", + ["6131"] = "31", + ["6132"] = "32", + ["6133"] = "33", + ["6134"] = "34", + ["6135"] = "35", + ["6136"] = "36", + ["6137"] = "37", + ["6138"] = "38", + ["6139"] = "39", + ["6140"] = "40", + ["6141"] = "41", + ["6142"] = "42", + ["6143"] = "43", + ["6144"] = "44", + ["6145"] = "45", + ["6146"] = "46", + ["6147"] = "47", + ["6148"] = "48", + ["6149"] = "49", + ["6150"] = "50", + ["6151"] = "51", + ["6152"] = "52", + ["6153"] = "53", + ["6154"] = "54", + ["6155"] = "55", + ["6156"] = "56", + ["6157"] = "57", + ["6158"] = "58", + ["6159"] = "59", + ["6160"] = "60", + ["6161"] = "61", + ["6162"] = "62", + ["6163"] = "63", + ["6164"] = "64", + ["6165"] = "65", + ["6166"] = "66", + ["6167"] = "67", + ["6168"] = "68", + ["6169"] = "69", + ["6170"] = "70", + ["6171"] = "71", + ["6172"] = "72", + ["6173"] = "73", + ["6174"] = "74", + ["6175"] = "75", + ["6176"] = "76", + ["6177"] = "77", + ["6178"] = "78", + ["6179"] = "79", + ["6180"] = "80", + ["6181"] = "81", + ["6182"] = "82", + ["6183"] = "83", + ["6184"] = "84", + ["6185"] = "85", + ["6186"] = "86", + ["6187"] = "87", + ["6188"] = "88", + ["6189"] = "89", + ["6190"] = "90", + ["6191"] = "91", + ["6192"] = "92", + ["6193"] = "93", + ["6194"] = "94", + ["6195"] = "95", + ["6196"] = "96", + ["6197"] = "97", + ["6198"] = "98", + ["6199"] = "99", + ["6200"] = "100", + ["6201"] = "1", + ["6202"] = "2", + ["6203"] = "3", + ["6204"] = "4", + ["6205"] = "5", + ["6206"] = "6", + ["6207"] = "7", + ["6208"] = "8", + ["6209"] = "9", + ["6210"] = "10", + ["6211"] = "11", + ["6212"] = "12", + ["6213"] = "13", + ["6214"] = "14", + ["6215"] = "15", + ["6216"] = "16", + ["6217"] = "17", + ["6218"] = "18", + ["6219"] = "19", + ["6220"] = "20", + ["6221"] = "21", + ["6222"] = "22", + ["6223"] = "23", + ["6224"] = "24", + ["6225"] = "25", + ["6226"] = "26", + ["6227"] = "27", + ["6228"] = "28", + ["6229"] = "29", + ["6230"] = "30", + ["6231"] = "31", + ["6232"] = "32", + ["6233"] = "33", + ["6234"] = "34", + ["6235"] = "35", + ["6236"] = "36", + ["6237"] = "37", + ["6238"] = "38", + ["6239"] = "39", + ["6240"] = "40", + ["6241"] = "41", + ["6242"] = "42", + ["6243"] = "43", + ["6244"] = "44", + ["6245"] = "45", + ["6246"] = "46", + ["6247"] = "47", + ["6248"] = "48", + ["6249"] = "49", + ["6250"] = "50", + ["6251"] = "51", + ["6252"] = "52", + ["6253"] = "53", + ["6254"] = "54", + ["6255"] = "55", + ["6256"] = "56", + ["6257"] = "57", + ["6258"] = "58", + ["6259"] = "59", + ["6260"] = "60", + ["6261"] = "61", + ["6262"] = "62", + ["6263"] = "63", + ["6264"] = "64", + ["6265"] = "65", + ["6266"] = "66", + ["6267"] = "67", + ["6268"] = "68", + ["6269"] = "69", + ["6270"] = "70", + ["6271"] = "71", + ["6272"] = "72", + ["6273"] = "73", + ["6274"] = "74", + ["6275"] = "75", + ["6276"] = "76", + ["6277"] = "77", + ["6278"] = "78", + ["6279"] = "79", + ["6280"] = "80", + ["6281"] = "81", + ["6282"] = "82", + ["6283"] = "83", + ["6284"] = "84", + ["6285"] = "85", + ["6286"] = "86", + ["6287"] = "87", + ["6288"] = "88", + ["6289"] = "89", + ["6290"] = "90", + ["6291"] = "91", + ["6292"] = "92", + ["6293"] = "93", + ["6294"] = "94", + ["6295"] = "95", + ["6296"] = "96", + ["6297"] = "97", + ["6298"] = "98", + ["6299"] = "99", + ["6300"] = "100", + ["6301"] = "1", + ["6302"] = "2", + ["6303"] = "3", + ["6304"] = "4", + ["6305"] = "5", + ["6306"] = "6", + ["6307"] = "7", + ["6308"] = "8", + ["6309"] = "9", + ["6310"] = "10", + ["6311"] = "11", + ["6312"] = "12", + ["6313"] = "13", + ["6314"] = "14", + ["6315"] = "15", + ["6316"] = "16", + ["6317"] = "17", + ["6318"] = "18", + ["6319"] = "19", + ["6320"] = "20", + ["6321"] = "21", + ["6322"] = "22", + ["6323"] = "23", + ["6324"] = "24", + ["6325"] = "25", + ["6326"] = "26", + ["6327"] = "27", + ["6328"] = "28", + ["6329"] = "29", + ["6330"] = "30", + ["6331"] = "31", + ["6332"] = "32", + ["6333"] = "33", + ["6334"] = "34", + ["6335"] = "35", + ["6336"] = "36", + ["6337"] = "37", + ["6338"] = "38", + ["6339"] = "39", + ["6340"] = "40", + ["6341"] = "41", + ["6342"] = "42", + ["6343"] = "43", + ["6344"] = "44", + ["6345"] = "45", + ["6346"] = "46", + ["6347"] = "47", + ["6348"] = "48", + ["6349"] = "49", + ["6350"] = "50", + ["6351"] = "51", + ["6352"] = "52", + ["6353"] = "53", + ["6354"] = "54", + ["6355"] = "55", + ["6356"] = "56", + ["6357"] = "57", + ["6358"] = "58", + ["6359"] = "59", + ["6360"] = "60", + ["6361"] = "61", + ["6362"] = "62", + ["6363"] = "63", + ["6364"] = "64", + ["6365"] = "65", + ["6366"] = "66", + ["6367"] = "67", + ["6368"] = "68", + ["6369"] = "69", + ["6370"] = "70", + ["6371"] = "71", + ["6372"] = "72", + ["6373"] = "73", + ["6374"] = "74", + ["6375"] = "75", + ["6376"] = "76", + ["6377"] = "77", + ["6378"] = "78", + ["6379"] = "79", + ["6380"] = "80", + ["6381"] = "81", + ["6382"] = "82", + ["6383"] = "83", + ["6384"] = "84", + ["6385"] = "85", + ["6386"] = "86", + ["6387"] = "87", + ["6388"] = "88", + ["6389"] = "89", + ["6390"] = "90", + ["6391"] = "91", + ["6392"] = "92", + ["6393"] = "93", + ["6394"] = "94", + ["6395"] = "95", + ["6396"] = "96", + ["6397"] = "97", + ["6398"] = "98", + ["6399"] = "99", + ["6400"] = "100", + ["6401"] = "1", + ["6402"] = "2", + ["6403"] = "3", + ["6404"] = "4", + ["6405"] = "5", + ["6406"] = "6", + ["6407"] = "7", + ["6408"] = "8", + ["6409"] = "9", + ["6410"] = "10", + ["6411"] = "11", + ["6412"] = "12", + ["6413"] = "13", + ["6414"] = "14", + ["6415"] = "15", + ["6416"] = "16", + ["6417"] = "17", + ["6418"] = "18", + ["6419"] = "19", + ["6420"] = "20", + ["6421"] = "21", + ["6422"] = "22", + ["6423"] = "23", + ["6424"] = "24", + ["6425"] = "25", + ["6426"] = "26", + ["6427"] = "27", + ["6428"] = "28", + ["6429"] = "29", + ["6430"] = "30", + ["6431"] = "31", + ["6432"] = "32", + ["6433"] = "33", + ["6434"] = "34", + ["6435"] = "35", + ["6436"] = "36", + ["6437"] = "37", + ["6438"] = "38", + ["6439"] = "39", + ["6440"] = "40", + ["6441"] = "41", + ["6442"] = "42", + ["6443"] = "43", + ["6444"] = "44", + ["6445"] = "45", + ["6446"] = "46", + ["6447"] = "47", + ["6448"] = "48", + ["6449"] = "49", + ["6450"] = "50", + ["6451"] = "51", + ["6452"] = "52", + ["6453"] = "53", + ["6454"] = "54", + ["6455"] = "55", + ["6456"] = "56", + ["6457"] = "57", + ["6458"] = "58", + ["6459"] = "59", + ["6460"] = "60", + ["6461"] = "61", + ["6462"] = "62", + ["6463"] = "63", + ["6464"] = "64", + ["6465"] = "65", + ["6466"] = "66", + ["6467"] = "67", + ["6468"] = "68", + ["6469"] = "69", + ["6470"] = "70", + ["6471"] = "71", + ["6472"] = "72", + ["6473"] = "73", + ["6474"] = "74", + ["6475"] = "75", + ["6476"] = "76", + ["6477"] = "77", + ["6478"] = "78", + ["6479"] = "79", + ["6480"] = "80", + ["6481"] = "81", + ["6482"] = "82", + ["6483"] = "83", + ["6484"] = "84", + ["6485"] = "85", + ["6486"] = "86", + ["6487"] = "87", + ["6488"] = "88", + ["6489"] = "89", + ["6490"] = "90", + ["6491"] = "91", + ["6492"] = "92", + ["6493"] = "93", + ["6494"] = "94", + ["6495"] = "95", + ["6496"] = "96", + ["6497"] = "97", + ["6498"] = "98", + ["6499"] = "99", + ["6500"] = "100", + ["6501"] = "1", + ["6502"] = "2", + ["6503"] = "3", + ["6504"] = "4", + ["6505"] = "5", + ["6506"] = "6", + ["6507"] = "7", + ["6508"] = "8", + ["6509"] = "9", + ["6510"] = "10", + ["6511"] = "11", + ["6512"] = "12", + ["6513"] = "13", + ["6514"] = "14", + ["6515"] = "15", + ["6516"] = "16", + ["6517"] = "17", + ["6518"] = "18", + ["6519"] = "19", + ["6520"] = "20", + ["6521"] = "21", + ["6522"] = "22", + ["6523"] = "23", + ["6524"] = "24", + ["6525"] = "25", + ["6526"] = "26", + ["6527"] = "27", + ["6528"] = "28", + ["6529"] = "29", + ["6530"] = "30", + ["6531"] = "31", + ["6532"] = "32", + ["6533"] = "33", + ["6534"] = "34", + ["6535"] = "35", + ["6536"] = "36", + ["6537"] = "37", + ["6538"] = "38", + ["6539"] = "39", + ["6540"] = "40", + ["6541"] = "41", + ["6542"] = "42", + ["6543"] = "43", + ["6544"] = "44", + ["6545"] = "45", + ["6546"] = "46", + ["6547"] = "47", + ["6548"] = "48", + ["6549"] = "49", + ["6550"] = "50", + ["6551"] = "51", + ["6552"] = "52", + ["6553"] = "53", + ["6554"] = "54", + ["6555"] = "55", + ["6556"] = "56", + ["6557"] = "57", + ["6558"] = "58", + ["6559"] = "59", + ["6560"] = "60", + ["6561"] = "61", + ["6562"] = "62", + ["6563"] = "63", + ["6564"] = "64", + ["6565"] = "65", + ["6566"] = "66", + ["6567"] = "67", + ["6568"] = "68", + ["6569"] = "69", + ["6570"] = "70", + ["6571"] = "71", + ["6572"] = "72", + ["6573"] = "73", + ["6574"] = "74", + ["6575"] = "75", + ["6576"] = "76", + ["6577"] = "77", + ["6578"] = "78", + ["6579"] = "79", + ["6580"] = "80", + ["6581"] = "81", + ["6582"] = "82", + ["6583"] = "83", + ["6584"] = "84", + ["6585"] = "85", + ["6586"] = "86", + ["6587"] = "87", + ["6588"] = "88", + ["6589"] = "89", + ["6590"] = "90", + ["6591"] = "91", + ["6592"] = "92", + ["6593"] = "93", + ["6594"] = "94", + ["6595"] = "95", + ["6596"] = "96", + ["6597"] = "97", + ["6598"] = "98", + ["6599"] = "99", + ["6600"] = "100", + ["6601"] = "1", + ["6602"] = "2", + ["6603"] = "3", + ["6604"] = "4", + ["6605"] = "5", + ["6606"] = "6", + ["6607"] = "7", + ["6608"] = "8", + ["6609"] = "9", + ["6610"] = "10", + ["6611"] = "11", + ["6612"] = "12", + ["6613"] = "13", + ["6614"] = "14", + ["6615"] = "15", + ["6616"] = "16", + ["6617"] = "17", + ["6618"] = "18", + ["6619"] = "19", + ["6620"] = "20", + ["6621"] = "21", + ["6622"] = "22", + ["6623"] = "23", + ["6624"] = "24", + ["6625"] = "25", + ["6626"] = "26", + ["6627"] = "27", + ["6628"] = "28", + ["6629"] = "29", + ["6630"] = "30", + ["6631"] = "31", + ["6632"] = "32", + ["6633"] = "33", + ["6634"] = "34", + ["6635"] = "35", + ["6636"] = "36", + ["6637"] = "37", + ["6638"] = "38", + ["6639"] = "39", + ["6640"] = "40", + ["6641"] = "41", + ["6642"] = "42", + ["6643"] = "43", + ["6644"] = "44", + ["6645"] = "45", + ["6646"] = "46", + ["6647"] = "47", + ["6648"] = "48", + ["6649"] = "49", + ["6650"] = "50", + ["6651"] = "51", + ["6652"] = "52", + ["6653"] = "53", + ["6654"] = "54", + ["6655"] = "55", + ["6656"] = "56", + ["6657"] = "57", + ["6658"] = "58", + ["6659"] = "59", + ["6660"] = "60", + ["6661"] = "61", + ["6662"] = "62", + ["6663"] = "63", + ["6664"] = "64", + ["6665"] = "65", + ["6666"] = "66", + ["6667"] = "67", + ["6668"] = "68", + ["6669"] = "69", + ["6670"] = "70", + ["6671"] = "71", + ["6672"] = "72", + ["6673"] = "73", + ["6674"] = "74", + ["6675"] = "75", + ["6676"] = "76", + ["6677"] = "77", + ["6678"] = "78", + ["6679"] = "79", + ["6680"] = "80", + ["6681"] = "81", + ["6682"] = "82", + ["6683"] = "83", + ["6684"] = "84", + ["6685"] = "85", + ["6686"] = "86", + ["6687"] = "87", + ["6688"] = "88", + ["6689"] = "89", + ["6690"] = "90", + ["6691"] = "91", + ["6692"] = "92", + ["6693"] = "93", + ["6694"] = "94", + ["6695"] = "95", + ["6696"] = "96", + ["6697"] = "97", + ["6698"] = "98", + ["6699"] = "99", + ["6700"] = "100", + ["6701"] = "1", + ["6702"] = "2", + ["6703"] = "3", + ["6704"] = "4", + ["6705"] = "5", + ["6706"] = "6", + ["6707"] = "7", + ["6708"] = "8", + ["6709"] = "9", + ["6710"] = "10", + ["6711"] = "11", + ["6712"] = "12", + ["6713"] = "13", + ["6714"] = "14", + ["6715"] = "15", + ["6716"] = "16", + ["6717"] = "17", + ["6718"] = "18", + ["6719"] = "19", + ["6720"] = "20", + ["6721"] = "21", + ["6722"] = "22", + ["6723"] = "23", + ["6724"] = "24", + ["6725"] = "25", + ["6726"] = "26", + ["6727"] = "27", + ["6728"] = "28", + ["6729"] = "29", + ["6730"] = "30", + ["6731"] = "31", + ["6732"] = "32", + ["6733"] = "33", + ["6734"] = "34", + ["6735"] = "35", + ["6736"] = "36", + ["6737"] = "37", + ["6738"] = "38", + ["6739"] = "39", + ["6740"] = "40", + ["6741"] = "41", + ["6742"] = "42", + ["6743"] = "43", + ["6744"] = "44", + ["6745"] = "45", + ["6746"] = "46", + ["6747"] = "47", + ["6748"] = "48", + ["6749"] = "49", + ["6750"] = "50", + ["6751"] = "51", + ["6752"] = "52", + ["6753"] = "53", + ["6754"] = "54", + ["6755"] = "55", + ["6756"] = "56", + ["6757"] = "57", + ["6758"] = "58", + ["6759"] = "59", + ["6760"] = "60", + ["6761"] = "61", + ["6762"] = "62", + ["6763"] = "63", + ["6764"] = "64", + ["6765"] = "65", + ["6766"] = "66", + ["6767"] = "67", + ["6768"] = "68", + ["6769"] = "69", + ["6770"] = "70", + ["6771"] = "71", + ["6772"] = "72", + ["6773"] = "73", + ["6774"] = "74", + ["6775"] = "75", + ["6776"] = "76", + ["6777"] = "77", + ["6778"] = "78", + ["6779"] = "79", + ["6780"] = "80", + ["6781"] = "81", + ["6782"] = "82", + ["6783"] = "83", + ["6784"] = "84", + ["6785"] = "85", + ["6786"] = "86", + ["6787"] = "87", + ["6788"] = "88", + ["6789"] = "89", + ["6790"] = "90", + ["6791"] = "91", + ["6792"] = "92", + ["6793"] = "93", + ["6794"] = "94", + ["6795"] = "95", + ["6796"] = "96", + ["6797"] = "97", + ["6798"] = "98", + ["6799"] = "99", + ["6800"] = "100", + ["6801"] = "1", + ["6802"] = "2", + ["6803"] = "3", + ["6804"] = "4", + ["6805"] = "5", + ["6806"] = "6", + ["6807"] = "7", + ["6808"] = "8", + ["6809"] = "9", + ["6810"] = "10", + ["6811"] = "11", + ["6812"] = "12", + ["6813"] = "13", + ["6814"] = "14", + ["6815"] = "15", + ["6816"] = "16", + ["6817"] = "17", + ["6818"] = "18", + ["6819"] = "19", + ["6820"] = "20", + ["6821"] = "21", + ["6822"] = "22", + ["6823"] = "23", + ["6824"] = "24", + ["6825"] = "25", + ["6826"] = "26", + ["6827"] = "27", + ["6828"] = "28", + ["6829"] = "29", + ["6830"] = "30", + ["6831"] = "31", + ["6832"] = "32", + ["6833"] = "33", + ["6834"] = "34", + ["6835"] = "35", + ["6836"] = "36", + ["6837"] = "37", + ["6838"] = "38", + ["6839"] = "39", + ["6840"] = "40", + ["6841"] = "41", + ["6842"] = "42", + ["6843"] = "43", + ["6844"] = "44", + ["6845"] = "45", + ["6846"] = "46", + ["6847"] = "47", + ["6848"] = "48", + ["6849"] = "49", + ["6850"] = "50", + ["6851"] = "51", + ["6852"] = "52", + ["6853"] = "53", + ["6854"] = "54", + ["6855"] = "55", + ["6856"] = "56", + ["6857"] = "57", + ["6858"] = "58", + ["6859"] = "59", + ["6860"] = "60", + ["6861"] = "61", + ["6862"] = "62", + ["6863"] = "63", + ["6864"] = "64", + ["6865"] = "65", + ["6866"] = "66", + ["6867"] = "67", + ["6868"] = "68", + ["6869"] = "69", + ["6870"] = "70", + ["6871"] = "71", + ["6872"] = "72", + ["6873"] = "73", + ["6874"] = "74", + ["6875"] = "75", + ["6876"] = "76", + ["6877"] = "77", + ["6878"] = "78", + ["6879"] = "79", + ["6880"] = "80", + ["6881"] = "81", + ["6882"] = "82", + ["6883"] = "83", + ["6884"] = "84", + ["6885"] = "85", + ["6886"] = "86", + ["6887"] = "87", + ["6888"] = "88", + ["6889"] = "89", + ["6890"] = "90", + ["6891"] = "91", + ["6892"] = "92", + ["6893"] = "93", + ["6894"] = "94", + ["6895"] = "95", + ["6896"] = "96", + ["6897"] = "97", + ["6898"] = "98", + ["6899"] = "99", + ["6900"] = "100", + ["6901"] = "1", + ["6902"] = "2", + ["6903"] = "3", + ["6904"] = "4", + ["6905"] = "5", + ["6906"] = "6", + ["6907"] = "7", + ["6908"] = "8", + ["6909"] = "9", + ["6910"] = "10", + ["6911"] = "11", + ["6912"] = "12", + ["6913"] = "13", + ["6914"] = "14", + ["6915"] = "15", + ["6916"] = "16", + ["6917"] = "17", + ["6918"] = "18", + ["6919"] = "19", + ["6920"] = "20", + ["6921"] = "21", + ["6922"] = "22", + ["6923"] = "23", + ["6924"] = "24", + ["6925"] = "25", + ["6926"] = "26", + ["6927"] = "27", + ["6928"] = "28", + ["6929"] = "29", + ["6930"] = "30", + ["6931"] = "31", + ["6932"] = "32", + ["6933"] = "33", + ["6934"] = "34", + ["6935"] = "35", + ["6936"] = "36", + ["6937"] = "37", + ["6938"] = "38", + ["6939"] = "39", + ["6940"] = "40", + ["6941"] = "41", + ["6942"] = "42", + ["6943"] = "43", + ["6944"] = "44", + ["6945"] = "45", + ["6946"] = "46", + ["6947"] = "47", + ["6948"] = "48", + ["6949"] = "49", + ["6950"] = "50", + ["6951"] = "51", + ["6952"] = "52", + ["6953"] = "53", + ["6954"] = "54", + ["6955"] = "55", + ["6956"] = "56", + ["6957"] = "57", + ["6958"] = "58", + ["6959"] = "59", + ["6960"] = "60", + ["6961"] = "61", + ["6962"] = "62", + ["6963"] = "63", + ["6964"] = "64", + ["6965"] = "65", + ["6966"] = "66", + ["6967"] = "67", + ["6968"] = "68", + ["6969"] = "69", + ["6970"] = "70", + ["6971"] = "71", + ["6972"] = "72", + ["6973"] = "73", + ["6974"] = "74", + ["6975"] = "75", + ["6976"] = "76", + ["6977"] = "77", + ["6978"] = "78", + ["6979"] = "79", + ["6980"] = "80", + ["6981"] = "81", + ["6982"] = "82", + ["6983"] = "83", + ["6984"] = "84", + ["6985"] = "85", + ["6986"] = "86", + ["6987"] = "87", + ["6988"] = "88", + ["6989"] = "89", + ["6990"] = "90", + ["6991"] = "91", + ["6992"] = "92", + ["6993"] = "93", + ["6994"] = "94", + ["6995"] = "95", + ["6996"] = "96", + ["6997"] = "97", + ["6998"] = "98", + ["6999"] = "99", + ["7000"] = "99", + ["7001"] = "1", + ["7002"] = "2", + ["7003"] = "3", + ["7004"] = "4", + ["7005"] = "5", + ["7006"] = "6", + ["7007"] = "7", + ["7008"] = "8", + ["7009"] = "9", + ["7000"] = "10", + ["7011"] = "11", + ["7012"] = "12", + ["7013"] = "13", + ["7014"] = "14", + ["7015"] = "15", + ["7016"] = "16", + ["7017"] = "17", + ["7018"] = "18", + ["7019"] = "19", + ["7020"] = "20", + ["7021"] = "21", + ["7022"] = "22", + ["7023"] = "23", + ["7024"] = "24", + ["7025"] = "25", + ["7026"] = "26", + ["7027"] = "27", + ["7028"] = "28", + ["7029"] = "29", + ["7030"] = "30", + ["7031"] = "31", + ["7032"] = "32", + ["7033"] = "33", + ["7034"] = "34", + ["7035"] = "35", + ["7036"] = "36", + ["7037"] = "37", + ["7038"] = "38", + ["7039"] = "39", + ["7040"] = "40", + ["7041"] = "41", + ["7042"] = "42", + ["7043"] = "43", + ["7044"] = "44", + ["7045"] = "45", + ["7046"] = "46", + ["7047"] = "47", + ["7048"] = "48", + ["7049"] = "49", + ["7050"] = "50", + ["7051"] = "51", + ["7052"] = "52", + ["7053"] = "53", + ["7054"] = "54", + ["7055"] = "55", + ["7056"] = "56", + ["7057"] = "57", + ["7058"] = "58", + ["7059"] = "59", + ["7060"] = "60", + ["7061"] = "61", + ["7062"] = "62", + ["7063"] = "63", + ["7064"] = "64", + ["7065"] = "65", + ["7066"] = "66", + ["7067"] = "67", + ["7068"] = "68", + ["7069"] = "69", + ["7070"] = "70", + ["7071"] = "71", + ["7072"] = "72", + ["7073"] = "73", + ["7074"] = "74", + ["7075"] = "75", + ["7076"] = "76", + ["7077"] = "77", + ["7078"] = "78", + ["7079"] = "79", + ["7080"] = "80", + ["7081"] = "81", + ["7082"] = "82", + ["7083"] = "83", + ["7084"] = "84", + ["7085"] = "85", + ["7086"] = "86", + ["7087"] = "87", + ["7088"] = "88", + ["7089"] = "89", + ["7090"] = "90", + ["7091"] = "91", + ["7092"] = "92", + ["7093"] = "93", + ["7094"] = "94", + ["7095"] = "95", + ["7096"] = "96", + ["7097"] = "97", + ["7098"] = "98", + ["7099"] = "99", + ["7100"] = "100", + ["7101"] = "1", + ["7102"] = "2", + ["7103"] = "3", + ["7104"] = "4", + ["7105"] = "5", + ["7106"] = "6", + ["7107"] = "7", + ["7108"] = "8", + ["7109"] = "9", + ["7110"] = "10", + ["7111"] = "11", + ["7112"] = "12", + ["7113"] = "13", + ["7114"] = "14", + ["7115"] = "15", + ["7116"] = "16", + ["7117"] = "17", + ["7118"] = "18", + ["7119"] = "19", + ["7120"] = "20", + ["7121"] = "21", + ["7122"] = "22", + ["7123"] = "23", + ["7124"] = "24", + ["7125"] = "25", + ["7126"] = "26", + ["7127"] = "27", + ["7128"] = "28", + ["7129"] = "29", + ["7130"] = "30", + ["7131"] = "31", + ["7132"] = "32", + ["7133"] = "33", + ["7134"] = "34", + ["7135"] = "35", + ["7136"] = "36", + ["7137"] = "37", + ["7138"] = "38", + ["7139"] = "39", + ["7140"] = "40", + ["7141"] = "41", + ["7142"] = "42", + ["7143"] = "43", + ["7144"] = "44", + ["7145"] = "45", + ["7146"] = "46", + ["7147"] = "47", + ["7148"] = "48", + ["7149"] = "49", + ["7150"] = "50", + ["7151"] = "51", + ["7152"] = "52", + ["7153"] = "53", + ["7154"] = "54", + ["7155"] = "55", + ["7156"] = "56", + ["7157"] = "57", + ["7158"] = "58", + ["7159"] = "59", + ["7160"] = "60", + ["7161"] = "61", + ["7162"] = "62", + ["7163"] = "63", + ["7164"] = "64", + ["7165"] = "65", + ["7166"] = "66", + ["7167"] = "67", + ["7168"] = "68", + ["7169"] = "69", + ["7170"] = "70", + ["7171"] = "71", + ["7172"] = "72", + ["7173"] = "73", + ["7174"] = "74", + ["7175"] = "75", + ["7176"] = "76", + ["7177"] = "77", + ["7178"] = "78", + ["7179"] = "79", + ["7180"] = "80", + ["7181"] = "81", + ["7182"] = "82", + ["7183"] = "83", + ["7184"] = "84", + ["7185"] = "85", + ["7186"] = "86", + ["7187"] = "87", + ["7188"] = "88", + ["7189"] = "89", + ["7190"] = "90", + ["7191"] = "91", + ["7192"] = "92", + ["7193"] = "93", + ["7194"] = "94", + ["7195"] = "95", + ["7196"] = "96", + ["7197"] = "97", + ["7198"] = "98", + ["7199"] = "99", + ["7200"] = "100", + ["7201"] = "1", + ["7202"] = "2", + ["7203"] = "3", + ["7204"] = "4", + ["7205"] = "5", + ["7206"] = "6", + ["7207"] = "7", + ["7208"] = "8", + ["7209"] = "9", + ["7210"] = "10", + ["7211"] = "11", + ["7212"] = "12", + ["7213"] = "13", + ["7214"] = "14", + ["7215"] = "15", + ["7216"] = "16", + ["7217"] = "17", + ["7218"] = "18", + ["7219"] = "19", + ["7220"] = "20", + ["7221"] = "21", + ["7222"] = "22", + ["7223"] = "23", + ["7224"] = "24", + ["7225"] = "25", + ["7226"] = "26", + ["7227"] = "27", + ["7228"] = "28", + ["7229"] = "29", + ["7230"] = "30", + ["7231"] = "31", + ["7232"] = "32", + ["7233"] = "33", + ["7234"] = "34", + ["7235"] = "35", + ["7236"] = "36", + ["7237"] = "37", + ["7238"] = "38", + ["7239"] = "39", + ["7240"] = "40", + ["7241"] = "41", + ["7242"] = "42", + ["7243"] = "43", + ["7244"] = "44", + ["7245"] = "45", + ["7246"] = "46", + ["7247"] = "47", + ["7248"] = "48", + ["7249"] = "49", + ["7250"] = "50", + ["7251"] = "51", + ["7252"] = "52", + ["7253"] = "53", + ["7254"] = "54", + ["7255"] = "55", + ["7256"] = "56", + ["7257"] = "57", + ["7258"] = "58", + ["7259"] = "59", + ["7260"] = "60", + ["7261"] = "61", + ["7262"] = "62", + ["7263"] = "63", + ["7264"] = "64", + ["7265"] = "65", + ["7266"] = "66", + ["7267"] = "67", + ["7268"] = "68", + ["7269"] = "69", + ["7270"] = "70", + ["7271"] = "71", + ["7272"] = "72", + ["7273"] = "73", + ["7274"] = "74", + ["7275"] = "75", + ["7276"] = "76", + ["7277"] = "77", + ["7278"] = "78", + ["7279"] = "79", + ["7280"] = "80", + ["7281"] = "81", + ["7282"] = "82", + ["7283"] = "83", + ["7284"] = "84", + ["7285"] = "85", + ["7286"] = "86", + ["7287"] = "87", + ["7288"] = "88", + ["7289"] = "89", + ["7290"] = "90", + ["7291"] = "91", + ["7292"] = "92", + ["7293"] = "93", + ["7294"] = "94", + ["7295"] = "95", + ["7296"] = "96", + ["7297"] = "97", + ["7298"] = "98", + ["7299"] = "99", + ["7300"] = "100", + ["7301"] = "1", + ["7302"] = "2", + ["7303"] = "3", + ["7304"] = "4", + ["7305"] = "5", + ["7306"] = "6", + ["7307"] = "7", + ["7308"] = "8", + ["7309"] = "9", + ["7310"] = "10", + ["7311"] = "11", + ["7312"] = "12", + ["7313"] = "13", + ["7314"] = "14", + ["7315"] = "15", + ["7316"] = "16", + ["7317"] = "17", + ["7318"] = "18", + ["7319"] = "19", + ["7320"] = "20", + ["7321"] = "21", + ["7322"] = "22", + ["7323"] = "23", + ["7324"] = "24", + ["7325"] = "25", + ["7326"] = "26", + ["7327"] = "27", + ["7328"] = "28", + ["7329"] = "29", + ["7330"] = "30", + ["7331"] = "31", + ["7332"] = "32", + ["7333"] = "33", + ["7334"] = "34", + ["7335"] = "35", + ["7336"] = "36", + ["7337"] = "37", + ["7338"] = "38", + ["7339"] = "39", + ["7340"] = "40", + ["7341"] = "41", + ["7342"] = "42", + ["7343"] = "43", + ["7344"] = "44", + ["7345"] = "45", + ["7346"] = "46", + ["7347"] = "47", + ["7348"] = "48", + ["7349"] = "49", + ["7350"] = "50", + ["7351"] = "51", + ["7352"] = "52", + ["7353"] = "53", + ["7354"] = "54", + ["7355"] = "55", + ["7356"] = "56", + ["7357"] = "57", + ["7358"] = "58", + ["7359"] = "59", + ["7360"] = "60", + ["7361"] = "61", + ["7362"] = "62", + ["7363"] = "63", + ["7364"] = "64", + ["7365"] = "65", + ["7366"] = "66", + ["7367"] = "67", + ["7368"] = "68", + ["7369"] = "69", + ["7370"] = "70", + ["7371"] = "71", + ["7372"] = "72", + ["7373"] = "73", + ["7374"] = "74", + ["7375"] = "75", + ["7376"] = "76", + ["7377"] = "77", + ["7378"] = "78", + ["7379"] = "79", + ["7380"] = "80", + ["7381"] = "81", + ["7382"] = "82", + ["7383"] = "83", + ["7384"] = "84", + ["7385"] = "85", + ["7386"] = "86", + ["7387"] = "87", + ["7388"] = "88", + ["7389"] = "89", + ["7390"] = "90", + ["7391"] = "91", + ["7392"] = "92", + ["7393"] = "93", + ["7394"] = "94", + ["7395"] = "95", + ["7396"] = "96", + ["7397"] = "97", + ["7398"] = "98", + ["7399"] = "99", + ["7400"] = "100", + ["7401"] = "1", + ["7402"] = "2", + ["7403"] = "3", + ["7404"] = "4", + ["7405"] = "5", + ["7406"] = "6", + ["7407"] = "7", + ["7408"] = "8", + ["7409"] = "9", + ["7410"] = "10", + ["7411"] = "11", + ["7412"] = "12", + ["7413"] = "13", + ["7414"] = "14", + ["7415"] = "15", + ["7416"] = "16", + ["7417"] = "17", + ["7418"] = "18", + ["7419"] = "19", + ["7420"] = "20", + ["7421"] = "21", + ["7422"] = "22", + ["7423"] = "23", + ["7424"] = "24", + ["7425"] = "25", + ["7426"] = "26", + ["7427"] = "27", + ["7428"] = "28", + ["7429"] = "29", + ["7430"] = "30", + ["7431"] = "31", + ["7432"] = "32", + ["7433"] = "33", + ["7434"] = "34", + ["7435"] = "35", + ["7436"] = "36", + ["7437"] = "37", + ["7438"] = "38", + ["7439"] = "39", + ["7440"] = "40", + ["7441"] = "41", + ["7442"] = "42", + ["7443"] = "43", + ["7444"] = "44", + ["7445"] = "45", + ["7446"] = "46", + ["7447"] = "47", + ["7448"] = "48", + ["7449"] = "49", + ["7450"] = "50", + ["7451"] = "51", + ["7452"] = "52", + ["7453"] = "53", + ["7454"] = "54", + ["7455"] = "55", + ["7456"] = "56", + ["7457"] = "57", + ["7458"] = "58", + ["7459"] = "59", + ["7460"] = "60", + ["7461"] = "61", + ["7462"] = "62", + ["7463"] = "63", + ["7464"] = "64", + ["7465"] = "65", + ["7466"] = "66", + ["7467"] = "67", + ["7468"] = "68", + ["7469"] = "69", + ["7470"] = "70", + ["7471"] = "71", + ["7472"] = "72", + ["7473"] = "73", + ["7474"] = "74", + ["7475"] = "75", + ["7476"] = "76", + ["7477"] = "77", + ["7478"] = "78", + ["7479"] = "79", + ["7480"] = "80", + ["7481"] = "81", + ["7482"] = "82", + ["7483"] = "83", + ["7484"] = "84", + ["7485"] = "85", + ["7486"] = "86", + ["7487"] = "87", + ["7488"] = "88", + ["7489"] = "89", + ["7490"] = "90", + ["7491"] = "91", + ["7492"] = "92", + ["7493"] = "93", + ["7494"] = "94", + ["7495"] = "95", + ["7496"] = "96", + ["7497"] = "97", + ["7498"] = "98", + ["7499"] = "99", + ["7500"] = "100", + ["7501"] = "1", + ["7502"] = "2", + ["7503"] = "3", + ["7504"] = "4", + ["7505"] = "5", + ["7506"] = "6", + ["7507"] = "7", + ["7508"] = "8", + ["7509"] = "9", + ["7510"] = "10", + ["7511"] = "11", + ["7512"] = "12", + ["7513"] = "13", + ["7514"] = "14", + ["7515"] = "15", + ["7516"] = "16", + ["7517"] = "17", + ["7518"] = "18", + ["7519"] = "19", + ["7520"] = "20", + ["7521"] = "21", + ["7522"] = "22", + ["7523"] = "23", + ["7524"] = "24", + ["7525"] = "25", + ["7526"] = "26", + ["7527"] = "27", + ["7528"] = "28", + ["7529"] = "29", + ["7530"] = "30", + ["7531"] = "31", + ["7532"] = "32", + ["7533"] = "33", + ["7534"] = "34", + ["7535"] = "35", + ["7536"] = "36", + ["7537"] = "37", + ["7538"] = "38", + ["7539"] = "39", + ["7540"] = "40", + ["7541"] = "41", + ["7542"] = "42", + ["7543"] = "43", + ["7544"] = "44", + ["7545"] = "45", + ["7546"] = "46", + ["7547"] = "47", + ["7548"] = "48", + ["7549"] = "49", + ["7550"] = "50", + ["7551"] = "51", + ["7552"] = "52", + ["7553"] = "53", + ["7554"] = "54", + ["7555"] = "55", + ["7556"] = "56", + ["7557"] = "57", + ["7558"] = "58", + ["7559"] = "59", + ["7560"] = "60", + ["7561"] = "61", + ["7562"] = "62", + ["7563"] = "63", + ["7564"] = "64", + ["7565"] = "65", + ["7566"] = "66", + ["7567"] = "67", + ["7568"] = "68", + ["7569"] = "69", + ["7570"] = "70", + ["7571"] = "71", + ["7572"] = "72", + ["7573"] = "73", + ["7574"] = "74", + ["7575"] = "75", + ["7576"] = "76", + ["7577"] = "77", + ["7578"] = "78", + ["7579"] = "79", + ["7580"] = "80", + ["7581"] = "81", + ["7582"] = "82", + ["7583"] = "83", + ["7584"] = "84", + ["7585"] = "85", + ["7586"] = "86", + ["7587"] = "87", + ["7588"] = "88", + ["7589"] = "89", + ["7590"] = "90", + ["7591"] = "91", + ["7592"] = "92", + ["7593"] = "93", + ["7594"] = "94", + ["7595"] = "95", + ["7596"] = "96", + ["7597"] = "97", + ["7598"] = "98", + ["7599"] = "99", + ["7600"] = "100", + ["7601"] = "1", + ["7602"] = "2", + ["7603"] = "3", + ["7604"] = "4", + ["7605"] = "5", + ["7606"] = "6", + ["7607"] = "7", + ["7608"] = "8", + ["7609"] = "9", + ["7610"] = "10", + ["7611"] = "11", + ["7612"] = "12", + ["7613"] = "13", + ["7614"] = "14", + ["7615"] = "15", + ["7616"] = "16", + ["7617"] = "17", + ["7618"] = "18", + ["7619"] = "19", + ["7620"] = "20", + ["7621"] = "21", + ["7622"] = "22", + ["7623"] = "23", + ["7624"] = "24", + ["7625"] = "25", + ["7626"] = "26", + ["7627"] = "27", + ["7628"] = "28", + ["7629"] = "29", + ["7630"] = "30", + ["7631"] = "31", + ["7632"] = "32", + ["7633"] = "33", + ["7634"] = "34", + ["7635"] = "35", + ["7636"] = "36", + ["7637"] = "37", + ["7638"] = "38", + ["7639"] = "39", + ["7640"] = "40", + ["7641"] = "41", + ["7642"] = "42", + ["7643"] = "43", + ["7644"] = "44", + ["7645"] = "45", + ["7646"] = "46", + ["7647"] = "47", + ["7648"] = "48", + ["7649"] = "49", + ["7650"] = "50", + ["7651"] = "51", + ["7652"] = "52", + ["7653"] = "53", + ["7654"] = "54", + ["7655"] = "55", + ["7656"] = "56", + ["7657"] = "57", + ["7658"] = "58", + ["7659"] = "59", + ["7660"] = "60", + ["7661"] = "61", + ["7662"] = "62", + ["7663"] = "63", + ["7664"] = "64", + ["7665"] = "65", + ["7666"] = "66", + ["7667"] = "67", + ["7668"] = "68", + ["7669"] = "69", + ["7670"] = "70", + ["7671"] = "71", + ["7672"] = "72", + ["7673"] = "73", + ["7674"] = "74", + ["7675"] = "75", + ["7676"] = "76", + ["7677"] = "77", + ["7678"] = "78", + ["7679"] = "79", + ["7680"] = "80", + ["7681"] = "81", + ["7682"] = "82", + ["7683"] = "83", + ["7684"] = "84", + ["7685"] = "85", + ["7686"] = "86", + ["7687"] = "87", + ["7688"] = "88", + ["7689"] = "89", + ["7690"] = "90", + ["7691"] = "91", + ["7692"] = "92", + ["7693"] = "93", + ["7694"] = "94", + ["7695"] = "95", + ["7696"] = "96", + ["7697"] = "97", + ["7698"] = "98", + ["7699"] = "99", + ["7700"] = "100", + ["7701"] = "1", + ["7702"] = "2", + ["7703"] = "3", + ["7704"] = "4", + ["7705"] = "5", + ["7706"] = "6", + ["7707"] = "7", + ["7708"] = "8", + ["7709"] = "9", + ["7710"] = "10", + ["7711"] = "11", + ["7712"] = "12", + ["7713"] = "13", + ["7714"] = "14", + ["7715"] = "15", + ["7716"] = "16", + ["7717"] = "17", + ["7718"] = "18", + ["7719"] = "19", + ["7720"] = "20", + ["7721"] = "21", + ["7722"] = "22", + ["7723"] = "23", + ["7724"] = "24", + ["7725"] = "25", + ["7726"] = "26", + ["7727"] = "27", + ["7728"] = "28", + ["7729"] = "29", + ["7730"] = "30", + ["7731"] = "31", + ["7732"] = "32", + ["7733"] = "33", + ["7734"] = "34", + ["7735"] = "35", + ["7736"] = "36", + ["7737"] = "37", + ["7738"] = "38", + ["7739"] = "39", + ["7740"] = "40", + ["7741"] = "41", + ["7742"] = "42", + ["7743"] = "43", + ["7744"] = "44", + ["7745"] = "45", + ["7746"] = "46", + ["7747"] = "47", + ["7748"] = "48", + ["7749"] = "49", + ["7750"] = "50", + ["7751"] = "51", + ["7752"] = "52", + ["7753"] = "53", + ["7754"] = "54", + ["7755"] = "55", + ["7756"] = "56", + ["7757"] = "57", + ["7758"] = "58", + ["7759"] = "59", + ["7760"] = "60", + ["7761"] = "61", + ["7762"] = "62", + ["7763"] = "63", + ["7764"] = "64", + ["7765"] = "65", + ["7766"] = "66", + ["7767"] = "67", + ["7768"] = "68", + ["7769"] = "69", + ["7770"] = "70", + ["7771"] = "71", + ["7772"] = "72", + ["7773"] = "73", + ["7774"] = "74", + ["7775"] = "75", + ["7776"] = "76", + ["7777"] = "77", + ["7778"] = "78", + ["7779"] = "79", + ["7780"] = "80", + ["7781"] = "81", + ["7782"] = "82", + ["7783"] = "83", + ["7784"] = "84", + ["7785"] = "85", + ["7786"] = "86", + ["7787"] = "87", + ["7788"] = "88", + ["7789"] = "89", + ["7790"] = "90", + ["7791"] = "91", + ["7792"] = "92", + ["7793"] = "93", + ["7794"] = "94", + ["7795"] = "95", + ["7796"] = "96", + ["7797"] = "97", + ["7798"] = "98", + ["7799"] = "99", + ["7800"] = "100", + ["7801"] = "1", + ["7802"] = "2", + ["7803"] = "3", + ["7804"] = "4", + ["7805"] = "5", + ["7806"] = "6", + ["7807"] = "7", + ["7808"] = "8", + ["7809"] = "9", + ["7810"] = "10", + ["7811"] = "11", + ["7812"] = "12", + ["7813"] = "13", + ["7814"] = "14", + ["7815"] = "15", + ["7816"] = "16", + ["7817"] = "17", + ["7818"] = "18", + ["7819"] = "19", + ["7820"] = "20", + ["7821"] = "21", + ["7822"] = "22", + ["7823"] = "23", + ["7824"] = "24", + ["7825"] = "25", + ["7826"] = "26", + ["7827"] = "27", + ["7828"] = "28", + ["7829"] = "29", + ["7830"] = "30", + ["7831"] = "31", + ["7832"] = "32", + ["7833"] = "33", + ["7834"] = "34", + ["7835"] = "35", + ["7836"] = "36", + ["7837"] = "37", + ["7838"] = "38", + ["7839"] = "39", + ["7840"] = "40", + ["7841"] = "41", + ["7842"] = "42", + ["7843"] = "43", + ["7844"] = "44", + ["7845"] = "45", + ["7846"] = "46", + ["7847"] = "47", + ["7848"] = "48", + ["7849"] = "49", + ["7850"] = "50", + ["7851"] = "51", + ["7852"] = "52", + ["7853"] = "53", + ["7854"] = "54", + ["7855"] = "55", + ["7856"] = "56", + ["7857"] = "57", + ["7858"] = "58", + ["7859"] = "59", + ["7860"] = "60", + ["7861"] = "61", + ["7862"] = "62", + ["7863"] = "63", + ["7864"] = "64", + ["7865"] = "65", + ["7866"] = "66", + ["7867"] = "67", + ["7868"] = "68", + ["7869"] = "69", + ["7870"] = "70", + ["7871"] = "71", + ["7872"] = "72", + ["7873"] = "73", + ["7874"] = "74", + ["7875"] = "75", + ["7876"] = "76", + ["7877"] = "77", + ["7878"] = "78", + ["7879"] = "79", + ["7880"] = "80", + ["7881"] = "81", + ["7882"] = "82", + ["7883"] = "83", + ["7884"] = "84", + ["7885"] = "85", + ["7886"] = "86", + ["7887"] = "87", + ["7888"] = "88", + ["7889"] = "89", + ["7890"] = "90", + ["7891"] = "91", + ["7892"] = "92", + ["7893"] = "93", + ["7894"] = "94", + ["7895"] = "95", + ["7896"] = "96", + ["7897"] = "97", + ["7898"] = "98", + ["7899"] = "99", + ["7900"] = "100", + ["7901"] = "1", + ["7902"] = "2", + ["7903"] = "3", + ["7904"] = "4", + ["7905"] = "5", + ["7906"] = "6", + ["7907"] = "7", + ["7908"] = "8", + ["7909"] = "9", + ["7910"] = "10", + ["7911"] = "11", + ["7912"] = "12", + ["7913"] = "13", + ["7914"] = "14", + ["7915"] = "15", + ["7916"] = "16", + ["7917"] = "17", + ["7918"] = "18", + ["7919"] = "19", + ["7920"] = "20", + ["7921"] = "21", + ["7922"] = "22", + ["7923"] = "23", + ["7924"] = "24", + ["7925"] = "25", + ["7926"] = "26", + ["7927"] = "27", + ["7928"] = "28", + ["7929"] = "29", + ["7930"] = "30", + ["7931"] = "31", + ["7932"] = "32", + ["7933"] = "33", + ["7934"] = "34", + ["7935"] = "35", + ["7936"] = "36", + ["7937"] = "37", + ["7938"] = "38", + ["7939"] = "39", + ["7940"] = "40", + ["7941"] = "41", + ["7942"] = "42", + ["7943"] = "43", + ["7944"] = "44", + ["7945"] = "45", + ["7946"] = "46", + ["7947"] = "47", + ["7948"] = "48", + ["7949"] = "49", + ["7950"] = "50", + ["7951"] = "51", + ["7952"] = "52", + ["7953"] = "53", + ["7954"] = "54", + ["7955"] = "55", + ["7956"] = "56", + ["7957"] = "57", + ["7958"] = "58", + ["7959"] = "59", + ["7960"] = "60", + ["7961"] = "61", + ["7962"] = "62", + ["7963"] = "63", + ["7964"] = "64", + ["7965"] = "65", + ["7966"] = "66", + ["7967"] = "67", + ["7968"] = "68", + ["7969"] = "69", + ["7970"] = "70", + ["7971"] = "71", + ["7972"] = "72", + ["7973"] = "73", + ["7974"] = "74", + ["7975"] = "75", + ["7976"] = "76", + ["7977"] = "77", + ["7978"] = "78", + ["7979"] = "79", + ["7980"] = "80", + ["7981"] = "81", + ["7982"] = "82", + ["7983"] = "83", + ["7984"] = "84", + ["7985"] = "85", + ["7986"] = "86", + ["7987"] = "87", + ["7988"] = "88", + ["7989"] = "89", + ["7990"] = "90", + ["7991"] = "91", + ["7992"] = "92", + ["7993"] = "93", + ["7994"] = "94", + ["7995"] = "95", + ["7996"] = "96", + ["7997"] = "97", + ["7998"] = "98", + ["7999"] = "99", + ["8000"] = "99", + ["8001"] = "1", + ["8002"] = "2", + ["8003"] = "3", + ["8004"] = "4", + ["8005"] = "5", + ["8006"] = "6", + ["8007"] = "7", + ["8008"] = "8", + ["8009"] = "9", + ["8000"] = "10", + ["8011"] = "11", + ["8012"] = "12", + ["8013"] = "13", + ["8014"] = "14", + ["8015"] = "15", + ["8016"] = "16", + ["8017"] = "17", + ["8018"] = "18", + ["8019"] = "19", + ["8020"] = "20", + ["8021"] = "21", + ["8022"] = "22", + ["8023"] = "23", + ["8024"] = "24", + ["8025"] = "25", + ["8026"] = "26", + ["8027"] = "27", + ["8028"] = "28", + ["8029"] = "29", + ["8030"] = "30", + ["8031"] = "31", + ["8032"] = "32", + ["8033"] = "33", + ["8034"] = "34", + ["8035"] = "35", + ["8036"] = "36", + ["8037"] = "37", + ["8038"] = "38", + ["8039"] = "39", + ["8040"] = "40", + ["8041"] = "41", + ["8042"] = "42", + ["8043"] = "43", + ["8044"] = "44", + ["8045"] = "45", + ["8046"] = "46", + ["8047"] = "47", + ["8048"] = "48", + ["8049"] = "49", + ["8050"] = "50", + ["8051"] = "51", + ["8052"] = "52", + ["8053"] = "53", + ["8054"] = "54", + ["8055"] = "55", + ["8056"] = "56", + ["8057"] = "57", + ["8058"] = "58", + ["8059"] = "59", + ["8060"] = "60", + ["8061"] = "61", + ["8062"] = "62", + ["8063"] = "63", + ["8064"] = "64", + ["8065"] = "65", + ["8066"] = "66", + ["8067"] = "67", + ["8068"] = "68", + ["8069"] = "69", + ["8070"] = "70", + ["8071"] = "71", + ["8072"] = "72", + ["8073"] = "73", + ["8074"] = "74", + ["8075"] = "75", + ["8076"] = "76", + ["8077"] = "77", + ["8078"] = "78", + ["8079"] = "79", + ["8080"] = "80", + ["8081"] = "81", + ["8082"] = "82", + ["8083"] = "83", + ["8084"] = "84", + ["8085"] = "85", + ["8086"] = "86", + ["8087"] = "87", + ["8088"] = "88", + ["8089"] = "89", + ["8090"] = "90", + ["8091"] = "91", + ["8092"] = "92", + ["8093"] = "93", + ["8094"] = "94", + ["8095"] = "95", + ["8096"] = "96", + ["8097"] = "97", + ["8098"] = "98", + ["8099"] = "99", + ["8100"] = "100", + ["8101"] = "1", + ["8102"] = "2", + ["8103"] = "3", + ["8104"] = "4", + ["8105"] = "5", + ["8106"] = "6", + ["8107"] = "7", + ["8108"] = "8", + ["8109"] = "9", + ["8110"] = "10", + ["8111"] = "11", + ["8112"] = "12", + ["8113"] = "13", + ["8114"] = "14", + ["8115"] = "15", + ["8116"] = "16", + ["8117"] = "17", + ["8118"] = "18", + ["8119"] = "19", + ["8120"] = "20", + ["8121"] = "21", + ["8122"] = "22", + ["8123"] = "23", + ["8124"] = "24", + ["8125"] = "25", + ["8126"] = "26", + ["8127"] = "27", + ["8128"] = "28", + ["8129"] = "29", + ["8130"] = "30", + ["8131"] = "31", + ["8132"] = "32", + ["8133"] = "33", + ["8134"] = "34", + ["8135"] = "35", + ["8136"] = "36", + ["8137"] = "37", + ["8138"] = "38", + ["8139"] = "39", + ["8140"] = "40", + ["8141"] = "41", + ["8142"] = "42", + ["8143"] = "43", + ["8144"] = "44", + ["8145"] = "45", + ["8146"] = "46", + ["8147"] = "47", + ["8148"] = "48", + ["8149"] = "49", + ["8150"] = "50", + ["8151"] = "51", + ["8152"] = "52", + ["8153"] = "53", + ["8154"] = "54", + ["8155"] = "55", + ["8156"] = "56", + ["8157"] = "57", + ["8158"] = "58", + ["8159"] = "59", + ["8160"] = "60", + ["8161"] = "61", + ["8162"] = "62", + ["8163"] = "63", + ["8164"] = "64", + ["8165"] = "65", + ["8166"] = "66", + ["8167"] = "67", + ["8168"] = "68", + ["8169"] = "69", + ["8170"] = "70", + ["8171"] = "71", + ["8172"] = "72", + ["8173"] = "73", + ["8174"] = "74", + ["8175"] = "75", + ["8176"] = "76", + ["8177"] = "77", + ["8178"] = "78", + ["8179"] = "79", + ["8180"] = "80", + ["8181"] = "81", + ["8182"] = "82", + ["8183"] = "83", + ["8184"] = "84", + ["8185"] = "85", + ["8186"] = "86", + ["8187"] = "87", + ["8188"] = "88", + ["8189"] = "89", + ["8190"] = "90", + ["8191"] = "91", + ["8192"] = "92", + ["8193"] = "93", + ["8194"] = "94", + ["8195"] = "95", + ["8196"] = "96", + ["8197"] = "97", + ["8198"] = "98", + ["8199"] = "99", + ["8200"] = "100", + ["8201"] = "1", + ["8202"] = "2", + ["8203"] = "3", + ["8204"] = "4", + ["8205"] = "5", + ["8206"] = "6", + ["8207"] = "7", + ["8208"] = "8", + ["8209"] = "9", + ["8210"] = "10", + ["8211"] = "11", + ["8212"] = "12", + ["8213"] = "13", + ["8214"] = "14", + ["8215"] = "15", + ["8216"] = "16", + ["8217"] = "17", + ["8218"] = "18", + ["8219"] = "19", + ["8220"] = "20", + ["8221"] = "21", + ["8222"] = "22", + ["8223"] = "23", + ["8224"] = "24", + ["8225"] = "25", + ["8226"] = "26", + ["8227"] = "27", + ["8228"] = "28", + ["8229"] = "29", + ["8230"] = "30", + ["8231"] = "31", + ["8232"] = "32", + ["8233"] = "33", + ["8234"] = "34", + ["8235"] = "35", + ["8236"] = "36", + ["8237"] = "37", + ["8238"] = "38", + ["8239"] = "39", + ["8240"] = "40", + ["8241"] = "41", + ["8242"] = "42", + ["8243"] = "43", + ["8244"] = "44", + ["8245"] = "45", + ["8246"] = "46", + ["8247"] = "47", + ["8248"] = "48", + ["8249"] = "49", + ["8250"] = "50", + ["8251"] = "51", + ["8252"] = "52", + ["8253"] = "53", + ["8254"] = "54", + ["8255"] = "55", + ["8256"] = "56", + ["8257"] = "57", + ["8258"] = "58", + ["8259"] = "59", + ["8260"] = "60", + ["8261"] = "61", + ["8262"] = "62", + ["8263"] = "63", + ["8264"] = "64", + ["8265"] = "65", + ["8266"] = "66", + ["8267"] = "67", + ["8268"] = "68", + ["8269"] = "69", + ["8270"] = "70", + ["8271"] = "71", + ["8272"] = "72", + ["8273"] = "73", + ["8274"] = "74", + ["8275"] = "75", + ["8276"] = "76", + ["8277"] = "77", + ["8278"] = "78", + ["8279"] = "79", + ["8280"] = "80", + ["8281"] = "81", + ["8282"] = "82", + ["8283"] = "83", + ["8284"] = "84", + ["8285"] = "85", + ["8286"] = "86", + ["8287"] = "87", + ["8288"] = "88", + ["8289"] = "89", + ["8290"] = "90", + ["8291"] = "91", + ["8292"] = "92", + ["8293"] = "93", + ["8294"] = "94", + ["8295"] = "95", + ["8296"] = "96", + ["8297"] = "97", + ["8298"] = "98", + ["8299"] = "99", + ["8300"] = "100", + ["8301"] = "1", + ["8302"] = "2", + ["8303"] = "3", + ["8304"] = "4", + ["8305"] = "5", + ["8306"] = "6", + ["8307"] = "7", + ["8308"] = "8", + ["8309"] = "9", + ["8310"] = "10", + ["8311"] = "11", + ["8312"] = "12", + ["8313"] = "13", + ["8314"] = "14", + ["8315"] = "15", + ["8316"] = "16", + ["8317"] = "17", + ["8318"] = "18", + ["8319"] = "19", + ["8320"] = "20", + ["8321"] = "21", + ["8322"] = "22", + ["8323"] = "23", + ["8324"] = "24", + ["8325"] = "25", + ["8326"] = "26", + ["8327"] = "27", + ["8328"] = "28", + ["8329"] = "29", + ["8330"] = "30", + ["8331"] = "31", + ["8332"] = "32", + ["8333"] = "33", + ["8334"] = "34", + ["8335"] = "35", + ["8336"] = "36", + ["8337"] = "37", + ["8338"] = "38", + ["8339"] = "39", + ["8340"] = "40", + ["8341"] = "41", + ["8342"] = "42", + ["8343"] = "43", + ["8344"] = "44", + ["8345"] = "45", + ["8346"] = "46", + ["8347"] = "47", + ["8348"] = "48", + ["8349"] = "49", + ["8350"] = "50", + ["8351"] = "51", + ["8352"] = "52", + ["8353"] = "53", + ["8354"] = "54", + ["8355"] = "55", + ["8356"] = "56", + ["8357"] = "57", + ["8358"] = "58", + ["8359"] = "59", + ["8360"] = "60", + ["8361"] = "61", + ["8362"] = "62", + ["8363"] = "63", + ["8364"] = "64", + ["8365"] = "65", + ["8366"] = "66", + ["8367"] = "67", + ["8368"] = "68", + ["8369"] = "69", + ["8370"] = "70", + ["8371"] = "71", + ["8372"] = "72", + ["8373"] = "73", + ["8374"] = "74", + ["8375"] = "75", + ["8376"] = "76", + ["8377"] = "77", + ["8378"] = "78", + ["8379"] = "79", + ["8380"] = "80", + ["8381"] = "81", + ["8382"] = "82", + ["8383"] = "83", + ["8384"] = "84", + ["8385"] = "85", + ["8386"] = "86", + ["8387"] = "87", + ["8388"] = "88", + ["8389"] = "89", + ["8390"] = "90", + ["8391"] = "91", + ["8392"] = "92", + ["8393"] = "93", + ["8394"] = "94", + ["8395"] = "95", + ["8396"] = "96", + ["8397"] = "97", + ["8398"] = "98", + ["8399"] = "99", + ["8400"] = "100", + ["8401"] = "1", + ["8402"] = "2", + ["8403"] = "3", + ["8404"] = "4", + ["8405"] = "5", + ["8406"] = "6", + ["8407"] = "7", + ["8408"] = "8", + ["8409"] = "9", + ["8410"] = "10", + ["8411"] = "11", + ["8412"] = "12", + ["8413"] = "13", + ["8414"] = "14", + ["8415"] = "15", + ["8416"] = "16", + ["8417"] = "17", + ["8418"] = "18", + ["8419"] = "19", + ["8420"] = "20", + ["8421"] = "21", + ["8422"] = "22", + ["8423"] = "23", + ["8424"] = "24", + ["8425"] = "25", + ["8426"] = "26", + ["8427"] = "27", + ["8428"] = "28", + ["8429"] = "29", + ["8430"] = "30", + ["8431"] = "31", + ["8432"] = "32", + ["8433"] = "33", + ["8434"] = "34", + ["8435"] = "35", + ["8436"] = "36", + ["8437"] = "37", + ["8438"] = "38", + ["8439"] = "39", + ["8440"] = "40", + ["8441"] = "41", + ["8442"] = "42", + ["8443"] = "43", + ["8444"] = "44", + ["8445"] = "45", + ["8446"] = "46", + ["8447"] = "47", + ["8448"] = "48", + ["8449"] = "49", + ["8450"] = "50", + ["8451"] = "51", + ["8452"] = "52", + ["8453"] = "53", + ["8454"] = "54", + ["8455"] = "55", + ["8456"] = "56", + ["8457"] = "57", + ["8458"] = "58", + ["8459"] = "59", + ["8460"] = "60", + ["8461"] = "61", + ["8462"] = "62", + ["8463"] = "63", + ["8464"] = "64", + ["8465"] = "65", + ["8466"] = "66", + ["8467"] = "67", + ["8468"] = "68", + ["8469"] = "69", + ["8470"] = "70", + ["8471"] = "71", + ["8472"] = "72", + ["8473"] = "73", + ["8474"] = "74", + ["8475"] = "75", + ["8476"] = "76", + ["8477"] = "77", + ["8478"] = "78", + ["8479"] = "79", + ["8480"] = "80", + ["8481"] = "81", + ["8482"] = "82", + ["8483"] = "83", + ["8484"] = "84", + ["8485"] = "85", + ["8486"] = "86", + ["8487"] = "87", + ["8488"] = "88", + ["8489"] = "89", + ["8490"] = "90", + ["8491"] = "91", + ["8492"] = "92", + ["8493"] = "93", + ["8494"] = "94", + ["8495"] = "95", + ["8496"] = "96", + ["8497"] = "97", + ["8498"] = "98", + ["8499"] = "99", + ["8500"] = "100", + ["8501"] = "1", + ["8502"] = "2", + ["8503"] = "3", + ["8504"] = "4", + ["8505"] = "5", + ["8506"] = "6", + ["8507"] = "7", + ["8508"] = "8", + ["8509"] = "9", + ["8510"] = "10", + ["8511"] = "11", + ["8512"] = "12", + ["8513"] = "13", + ["8514"] = "14", + ["8515"] = "15", + ["8516"] = "16", + ["8517"] = "17", + ["8518"] = "18", + ["8519"] = "19", + ["8520"] = "20", + ["8521"] = "21", + ["8522"] = "22", + ["8523"] = "23", + ["8524"] = "24", + ["8525"] = "25", + ["8526"] = "26", + ["8527"] = "27", + ["8528"] = "28", + ["8529"] = "29", + ["8530"] = "30", + ["8531"] = "31", + ["8532"] = "32", + ["8533"] = "33", + ["8534"] = "34", + ["8535"] = "35", + ["8536"] = "36", + ["8537"] = "37", + ["8538"] = "38", + ["8539"] = "39", + ["8540"] = "40", + ["8541"] = "41", + ["8542"] = "42", + ["8543"] = "43", + ["8544"] = "44", + ["8545"] = "45", + ["8546"] = "46", + ["8547"] = "47", + ["8548"] = "48", + ["8549"] = "49", + ["8550"] = "50", + ["8551"] = "51", + ["8552"] = "52", + ["8553"] = "53", + ["8554"] = "54", + ["8555"] = "55", + ["8556"] = "56", + ["8557"] = "57", + ["8558"] = "58", + ["8559"] = "59", + ["8560"] = "60", + ["8561"] = "61", + ["8562"] = "62", + ["8563"] = "63", + ["8564"] = "64", + ["8565"] = "65", + ["8566"] = "66", + ["8567"] = "67", + ["8568"] = "68", + ["8569"] = "69", + ["8570"] = "70", + ["8571"] = "71", + ["8572"] = "72", + ["8573"] = "73", + ["8574"] = "74", + ["8575"] = "75", + ["8576"] = "76", + ["8577"] = "77", + ["8578"] = "78", + ["8579"] = "79", + ["8580"] = "80", + ["8581"] = "81", + ["8582"] = "82", + ["8583"] = "83", + ["8584"] = "84", + ["8585"] = "85", + ["8586"] = "86", + ["8587"] = "87", + ["8588"] = "88", + ["8589"] = "89", + ["8590"] = "90", + ["8591"] = "91", + ["8592"] = "92", + ["8593"] = "93", + ["8594"] = "94", + ["8595"] = "95", + ["8596"] = "96", + ["8597"] = "97", + ["8598"] = "98", + ["8599"] = "99", + ["8600"] = "100", + ["8601"] = "1", + ["8602"] = "2", + ["8603"] = "3", + ["8604"] = "4", + ["8605"] = "5", + ["8606"] = "6", + ["8607"] = "7", + ["8608"] = "8", + ["8609"] = "9", + ["8610"] = "10", + ["8611"] = "11", + ["8612"] = "12", + ["8613"] = "13", + ["8614"] = "14", + ["8615"] = "15", + ["8616"] = "16", + ["8617"] = "17", + ["8618"] = "18", + ["8619"] = "19", + ["8620"] = "20", + ["8621"] = "21", + ["8622"] = "22", + ["8623"] = "23", + ["8624"] = "24", + ["8625"] = "25", + ["8626"] = "26", + ["8627"] = "27", + ["8628"] = "28", + ["8629"] = "29", + ["8630"] = "30", + ["8631"] = "31", + ["8632"] = "32", + ["8633"] = "33", + ["8634"] = "34", + ["8635"] = "35", + ["8636"] = "36", + ["8637"] = "37", + ["8638"] = "38", + ["8639"] = "39", + ["8640"] = "40", + ["8641"] = "41", + ["8642"] = "42", + ["8643"] = "43", + ["8644"] = "44", + ["8645"] = "45", + ["8646"] = "46", + ["8647"] = "47", + ["8648"] = "48", + ["8649"] = "49", + ["8650"] = "50", + ["8651"] = "51", + ["8652"] = "52", + ["8653"] = "53", + ["8654"] = "54", + ["8655"] = "55", + ["8656"] = "56", + ["8657"] = "57", + ["8658"] = "58", + ["8659"] = "59", + ["8660"] = "60", + ["8661"] = "61", + ["8662"] = "62", + ["8663"] = "63", + ["8664"] = "64", + ["8665"] = "65", + ["8666"] = "66", + ["8667"] = "67", + ["8668"] = "68", + ["8669"] = "69", + ["8670"] = "70", + ["8671"] = "71", + ["8672"] = "72", + ["8673"] = "73", + ["8674"] = "74", + ["8675"] = "75", + ["8676"] = "76", + ["8677"] = "77", + ["8678"] = "78", + ["8679"] = "79", + ["8680"] = "80", + ["8681"] = "81", + ["8682"] = "82", + ["8683"] = "83", + ["8684"] = "84", + ["8685"] = "85", + ["8686"] = "86", + ["8687"] = "87", + ["8688"] = "88", + ["8689"] = "89", + ["8690"] = "90", + ["8691"] = "91", + ["8692"] = "92", + ["8693"] = "93", + ["8694"] = "94", + ["8695"] = "95", + ["8696"] = "96", + ["8697"] = "97", + ["8698"] = "98", + ["8699"] = "99", + ["8700"] = "100", + ["8701"] = "1", + ["8702"] = "2", + ["8703"] = "3", + ["8704"] = "4", + ["8705"] = "5", + ["8706"] = "6", + ["8707"] = "7", + ["8708"] = "8", + ["8709"] = "9", + ["8710"] = "10", + ["8711"] = "11", + ["8712"] = "12", + ["8713"] = "13", + ["8714"] = "14", + ["8715"] = "15", + ["8716"] = "16", + ["8717"] = "17", + ["8718"] = "18", + ["8719"] = "19", + ["8720"] = "20", + ["8721"] = "21", + ["8722"] = "22", + ["8723"] = "23", + ["8724"] = "24", + ["8725"] = "25", + ["8726"] = "26", + ["8727"] = "27", + ["8728"] = "28", + ["8729"] = "29", + ["8730"] = "30", + ["8731"] = "31", + ["8732"] = "32", + ["8733"] = "33", + ["8734"] = "34", + ["8735"] = "35", + ["8736"] = "36", + ["8737"] = "37", + ["8738"] = "38", + ["8739"] = "39", + ["8740"] = "40", + ["8741"] = "41", + ["8742"] = "42", + ["8743"] = "43", + ["8744"] = "44", + ["8745"] = "45", + ["8746"] = "46", + ["8747"] = "47", + ["8748"] = "48", + ["8749"] = "49", + ["8750"] = "50", + ["8751"] = "51", + ["8752"] = "52", + ["8753"] = "53", + ["8754"] = "54", + ["8755"] = "55", + ["8756"] = "56", + ["8757"] = "57", + ["8758"] = "58", + ["8759"] = "59", + ["8760"] = "60", + ["8761"] = "61", + ["8762"] = "62", + ["8763"] = "63", + ["8764"] = "64", + ["8765"] = "65", + ["8766"] = "66", + ["8767"] = "67", + ["8768"] = "68", + ["8769"] = "69", + ["8770"] = "70", + ["8771"] = "71", + ["8772"] = "72", + ["8773"] = "73", + ["8774"] = "74", + ["8775"] = "75", + ["8776"] = "76", + ["8777"] = "77", + ["8778"] = "78", + ["8779"] = "79", + ["8780"] = "80", + ["8781"] = "81", + ["8782"] = "82", + ["8783"] = "83", + ["8784"] = "84", + ["8785"] = "85", + ["8786"] = "86", + ["8787"] = "87", + ["8788"] = "88", + ["8789"] = "89", + ["8790"] = "90", + ["8791"] = "91", + ["8792"] = "92", + ["8793"] = "93", + ["8794"] = "94", + ["8795"] = "95", + ["8796"] = "96", + ["8797"] = "97", + ["8798"] = "98", + ["8799"] = "99", + ["8800"] = "100", + ["8801"] = "1", + ["8802"] = "2", + ["8803"] = "3", + ["8804"] = "4", + ["8805"] = "5", + ["8806"] = "6", + ["8807"] = "7", + ["8808"] = "8", + ["8809"] = "9", + ["8810"] = "10", + ["8811"] = "11", + ["8812"] = "12", + ["8813"] = "13", + ["8814"] = "14", + ["8815"] = "15", + ["8816"] = "16", + ["8817"] = "17", + ["8818"] = "18", + ["8819"] = "19", + ["8820"] = "20", + ["8821"] = "21", + ["8822"] = "22", + ["8823"] = "23", + ["8824"] = "24", + ["8825"] = "25", + ["8826"] = "26", + ["8827"] = "27", + ["8828"] = "28", + ["8829"] = "29", + ["8830"] = "30", + ["8831"] = "31", + ["8832"] = "32", + ["8833"] = "33", + ["8834"] = "34", + ["8835"] = "35", + ["8836"] = "36", + ["8837"] = "37", + ["8838"] = "38", + ["8839"] = "39", + ["8840"] = "40", + ["8841"] = "41", + ["8842"] = "42", + ["8843"] = "43", + ["8844"] = "44", + ["8845"] = "45", + ["8846"] = "46", + ["8847"] = "47", + ["8848"] = "48", + ["8849"] = "49", + ["8850"] = "50", + ["8851"] = "51", + ["8852"] = "52", + ["8853"] = "53", + ["8854"] = "54", + ["8855"] = "55", + ["8856"] = "56", + ["8857"] = "57", + ["8858"] = "58", + ["8859"] = "59", + ["8860"] = "60", + ["8861"] = "61", + ["8862"] = "62", + ["8863"] = "63", + ["8864"] = "64", + ["8865"] = "65", + ["8866"] = "66", + ["8867"] = "67", + ["8868"] = "68", + ["8869"] = "69", + ["8870"] = "70", + ["8871"] = "71", + ["8872"] = "72", + ["8873"] = "73", + ["8874"] = "74", + ["8875"] = "75", + ["8876"] = "76", + ["8877"] = "77", + ["8878"] = "78", + ["8879"] = "79", + ["8880"] = "80", + ["8881"] = "81", + ["8882"] = "82", + ["8883"] = "83", + ["8884"] = "84", + ["8885"] = "85", + ["8886"] = "86", + ["8887"] = "87", + ["8888"] = "88", + ["8889"] = "89", + ["8890"] = "90", + ["8891"] = "91", + ["8892"] = "92", + ["8893"] = "93", + ["8894"] = "94", + ["8895"] = "95", + ["8896"] = "96", + ["8897"] = "97", + ["8898"] = "98", + ["8899"] = "99", + ["8900"] = "100", + ["8901"] = "1", + ["8902"] = "2", + ["8903"] = "3", + ["8904"] = "4", + ["8905"] = "5", + ["8906"] = "6", + ["8907"] = "7", + ["8908"] = "8", + ["8909"] = "9", + ["8910"] = "10", + ["8911"] = "11", + ["8912"] = "12", + ["8913"] = "13", + ["8914"] = "14", + ["8915"] = "15", + ["8916"] = "16", + ["8917"] = "17", + ["8918"] = "18", + ["8919"] = "19", + ["8920"] = "20", + ["8921"] = "21", + ["8922"] = "22", + ["8923"] = "23", + ["8924"] = "24", + ["8925"] = "25", + ["8926"] = "26", + ["8927"] = "27", + ["8928"] = "28", + ["8929"] = "29", + ["8930"] = "30", + ["8931"] = "31", + ["8932"] = "32", + ["8933"] = "33", + ["8934"] = "34", + ["8935"] = "35", + ["8936"] = "36", + ["8937"] = "37", + ["8938"] = "38", + ["8939"] = "39", + ["8940"] = "40", + ["8941"] = "41", + ["8942"] = "42", + ["8943"] = "43", + ["8944"] = "44", + ["8945"] = "45", + ["8946"] = "46", + ["8947"] = "47", + ["8948"] = "48", + ["8949"] = "49", + ["8950"] = "50", + ["8951"] = "51", + ["8952"] = "52", + ["8953"] = "53", + ["8954"] = "54", + ["8955"] = "55", + ["8956"] = "56", + ["8957"] = "57", + ["8958"] = "58", + ["8959"] = "59", + ["8960"] = "60", + ["8961"] = "61", + ["8962"] = "62", + ["8963"] = "63", + ["8964"] = "64", + ["8965"] = "65", + ["8966"] = "66", + ["8967"] = "67", + ["8968"] = "68", + ["8969"] = "69", + ["8970"] = "70", + ["8971"] = "71", + ["8972"] = "72", + ["8973"] = "73", + ["8974"] = "74", + ["8975"] = "75", + ["8976"] = "76", + ["8977"] = "77", + ["8978"] = "78", + ["8979"] = "79", + ["8980"] = "80", + ["8981"] = "81", + ["8982"] = "82", + ["8983"] = "83", + ["8984"] = "84", + ["8985"] = "85", + ["8986"] = "86", + ["8987"] = "87", + ["8988"] = "88", + ["8989"] = "89", + ["8990"] = "90", + ["8991"] = "91", + ["8992"] = "92", + ["8993"] = "93", + ["8994"] = "94", + ["8995"] = "95", + ["8996"] = "96", + ["8997"] = "97", + ["8998"] = "98", + ["8999"] = "99", + ["9000"] = "99", + ["9001"] = "1", + ["9002"] = "2", + ["9003"] = "3", + ["9004"] = "4", + ["9005"] = "5", + ["9006"] = "6", + ["9007"] = "7", + ["9008"] = "8", + ["9009"] = "9", + ["9000"] = "10", + ["9011"] = "11", + ["9012"] = "12", + ["9013"] = "13", + ["9014"] = "14", + ["9015"] = "15", + ["9016"] = "16", + ["9017"] = "17", + ["9018"] = "18", + ["9019"] = "19", + ["9020"] = "20", + ["9021"] = "21", + ["9022"] = "22", + ["9023"] = "23", + ["9024"] = "24", + ["9025"] = "25", + ["9026"] = "26", + ["9027"] = "27", + ["9028"] = "28", + ["9029"] = "29", + ["9030"] = "30", + ["9031"] = "31", + ["9032"] = "32", + ["9033"] = "33", + ["9034"] = "34", + ["9035"] = "35", + ["9036"] = "36", + ["9037"] = "37", + ["9038"] = "38", + ["9039"] = "39", + ["9040"] = "40", + ["9041"] = "41", + ["9042"] = "42", + ["9043"] = "43", + ["9044"] = "44", + ["9045"] = "45", + ["9046"] = "46", + ["9047"] = "47", + ["9048"] = "48", + ["9049"] = "49", + ["9050"] = "50", + ["9051"] = "51", + ["9052"] = "52", + ["9053"] = "53", + ["9054"] = "54", + ["9055"] = "55", + ["9056"] = "56", + ["9057"] = "57", + ["9058"] = "58", + ["9059"] = "59", + ["9060"] = "60", + ["9061"] = "61", + ["9062"] = "62", + ["9063"] = "63", + ["9064"] = "64", + ["9065"] = "65", + ["9066"] = "66", + ["9067"] = "67", + ["9068"] = "68", + ["9069"] = "69", + ["9070"] = "70", + ["9071"] = "71", + ["9072"] = "72", + ["9073"] = "73", + ["9074"] = "74", + ["9075"] = "75", + ["9076"] = "76", + ["9077"] = "77", + ["9078"] = "78", + ["9079"] = "79", + ["9080"] = "80", + ["9081"] = "81", + ["9082"] = "82", + ["9083"] = "83", + ["9084"] = "84", + ["9085"] = "85", + ["9086"] = "86", + ["9087"] = "87", + ["9088"] = "88", + ["9089"] = "89", + ["9090"] = "90", + ["9091"] = "91", + ["9092"] = "92", + ["9093"] = "93", + ["9094"] = "94", + ["9095"] = "95", + ["9096"] = "96", + ["9097"] = "97", + ["9098"] = "98", + ["9099"] = "99", + ["9100"] = "100", + ["9101"] = "1", + ["9102"] = "2", + ["9103"] = "3", + ["9104"] = "4", + ["9105"] = "5", + ["9106"] = "6", + ["9107"] = "7", + ["9108"] = "8", + ["9109"] = "9", + ["9110"] = "10", + ["9111"] = "11", + ["9112"] = "12", + ["9113"] = "13", + ["9114"] = "14", + ["9115"] = "15", + ["9116"] = "16", + ["9117"] = "17", + ["9118"] = "18", + ["9119"] = "19", + ["9120"] = "20", + ["9121"] = "21", + ["9122"] = "22", + ["9123"] = "23", + ["9124"] = "24", + ["9125"] = "25", + ["9126"] = "26", + ["9127"] = "27", + ["9128"] = "28", + ["9129"] = "29", + ["9130"] = "30", + ["9131"] = "31", + ["9132"] = "32", + ["9133"] = "33", + ["9134"] = "34", + ["9135"] = "35", + ["9136"] = "36", + ["9137"] = "37", + ["9138"] = "38", + ["9139"] = "39", + ["9140"] = "40", + ["9141"] = "41", + ["9142"] = "42", + ["9143"] = "43", + ["9144"] = "44", + ["9145"] = "45", + ["9146"] = "46", + ["9147"] = "47", + ["9148"] = "48", + ["9149"] = "49", + ["9150"] = "50", + ["9151"] = "51", + ["9152"] = "52", + ["9153"] = "53", + ["9154"] = "54", + ["9155"] = "55", + ["9156"] = "56", + ["9157"] = "57", + ["9158"] = "58", + ["9159"] = "59", + ["9160"] = "60", + ["9161"] = "61", + ["9162"] = "62", + ["9163"] = "63", + ["9164"] = "64", + ["9165"] = "65", + ["9166"] = "66", + ["9167"] = "67", + ["9168"] = "68", + ["9169"] = "69", + ["9170"] = "70", + ["9171"] = "71", + ["9172"] = "72", + ["9173"] = "73", + ["9174"] = "74", + ["9175"] = "75", + ["9176"] = "76", + ["9177"] = "77", + ["9178"] = "78", + ["9179"] = "79", + ["9180"] = "80", + ["9181"] = "81", + ["9182"] = "82", + ["9183"] = "83", + ["9184"] = "84", + ["9185"] = "85", + ["9186"] = "86", + ["9187"] = "87", + ["9188"] = "88", + ["9189"] = "89", + ["9190"] = "90", + ["9191"] = "91", + ["9192"] = "92", + ["9193"] = "93", + ["9194"] = "94", + ["9195"] = "95", + ["9196"] = "96", + ["9197"] = "97", + ["9198"] = "98", + ["9199"] = "99", + ["9200"] = "100", + ["9201"] = "1", + ["9202"] = "2", + ["9203"] = "3", + ["9204"] = "4", + ["9205"] = "5", + ["9206"] = "6", + ["9207"] = "7", + ["9208"] = "8", + ["9209"] = "9", + ["9210"] = "10", + ["9211"] = "11", + ["9212"] = "12", + ["9213"] = "13", + ["9214"] = "14", + ["9215"] = "15", + ["9216"] = "16", + ["9217"] = "17", + ["9218"] = "18", + ["9219"] = "19", + ["9220"] = "20", + ["9221"] = "21", + ["9222"] = "22", + ["9223"] = "23", + ["9224"] = "24", + ["9225"] = "25", + ["9226"] = "26", + ["9227"] = "27", + ["9228"] = "28", + ["9229"] = "29", + ["9230"] = "30", + ["9231"] = "31", + ["9232"] = "32", + ["9233"] = "33", + ["9234"] = "34", + ["9235"] = "35", + ["9236"] = "36", + ["9237"] = "37", + ["9238"] = "38", + ["9239"] = "39", + ["9240"] = "40", + ["9241"] = "41", + ["9242"] = "42", + ["9243"] = "43", + ["9244"] = "44", + ["9245"] = "45", + ["9246"] = "46", + ["9247"] = "47", + ["9248"] = "48", + ["9249"] = "49", + ["9250"] = "50", + ["9251"] = "51", + ["9252"] = "52", + ["9253"] = "53", + ["9254"] = "54", + ["9255"] = "55", + ["9256"] = "56", + ["9257"] = "57", + ["9258"] = "58", + ["9259"] = "59", + ["9260"] = "60", + ["9261"] = "61", + ["9262"] = "62", + ["9263"] = "63", + ["9264"] = "64", + ["9265"] = "65", + ["9266"] = "66", + ["9267"] = "67", + ["9268"] = "68", + ["9269"] = "69", + ["9270"] = "70", + ["9271"] = "71", + ["9272"] = "72", + ["9273"] = "73", + ["9274"] = "74", + ["9275"] = "75", + ["9276"] = "76", + ["9277"] = "77", + ["9278"] = "78", + ["9279"] = "79", + ["9280"] = "80", + ["9281"] = "81", + ["9282"] = "82", + ["9283"] = "83", + ["9284"] = "84", + ["9285"] = "85", + ["9286"] = "86", + ["9287"] = "87", + ["9288"] = "88", + ["9289"] = "89", + ["9290"] = "90", + ["9291"] = "91", + ["9292"] = "92", + ["9293"] = "93", + ["9294"] = "94", + ["9295"] = "95", + ["9296"] = "96", + ["9297"] = "97", + ["9298"] = "98", + ["9299"] = "99", + ["9300"] = "100", + ["9301"] = "1", + ["9302"] = "2", + ["9303"] = "3", + ["9304"] = "4", + ["9305"] = "5", + ["9306"] = "6", + ["9307"] = "7", + ["9308"] = "8", + ["9309"] = "9", + ["9310"] = "10", + ["9311"] = "11", + ["9312"] = "12", + ["9313"] = "13", + ["9314"] = "14", + ["9315"] = "15", + ["9316"] = "16", + ["9317"] = "17", + ["9318"] = "18", + ["9319"] = "19", + ["9320"] = "20", + ["9321"] = "21", + ["9322"] = "22", + ["9323"] = "23", + ["9324"] = "24", + ["9325"] = "25", + ["9326"] = "26", + ["9327"] = "27", + ["9328"] = "28", + ["9329"] = "29", + ["9330"] = "30", + ["9331"] = "31", + ["9332"] = "32", + ["9333"] = "33", + ["9334"] = "34", + ["9335"] = "35", + ["9336"] = "36", + ["9337"] = "37", + ["9338"] = "38", + ["9339"] = "39", + ["9340"] = "40", + ["9341"] = "41", + ["9342"] = "42", + ["9343"] = "43", + ["9344"] = "44", + ["9345"] = "45", + ["9346"] = "46", + ["9347"] = "47", + ["9348"] = "48", + ["9349"] = "49", + ["9350"] = "50", + ["9351"] = "51", + ["9352"] = "52", + ["9353"] = "53", + ["9354"] = "54", + ["9355"] = "55", + ["9356"] = "56", + ["9357"] = "57", + ["9358"] = "58", + ["9359"] = "59", + ["9360"] = "60", + ["9361"] = "61", + ["9362"] = "62", + ["9363"] = "63", + ["9364"] = "64", + ["9365"] = "65", + ["9366"] = "66", + ["9367"] = "67", + ["9368"] = "68", + ["9369"] = "69", + ["9370"] = "70", + ["9371"] = "71", + ["9372"] = "72", + ["9373"] = "73", + ["9374"] = "74", + ["9375"] = "75", + ["9376"] = "76", + ["9377"] = "77", + ["9378"] = "78", + ["9379"] = "79", + ["9380"] = "80", + ["9381"] = "81", + ["9382"] = "82", + ["9383"] = "83", + ["9384"] = "84", + ["9385"] = "85", + ["9386"] = "86", + ["9387"] = "87", + ["9388"] = "88", + ["9389"] = "89", + ["9390"] = "90", + ["9391"] = "91", + ["9392"] = "92", + ["9393"] = "93", + ["9394"] = "94", + ["9395"] = "95", + ["9396"] = "96", + ["9397"] = "97", + ["9398"] = "98", + ["9399"] = "99", + ["9400"] = "100", + ["9401"] = "1", + ["9402"] = "2", + ["9403"] = "3", + ["9404"] = "4", + ["9405"] = "5", + ["9406"] = "6", + ["9407"] = "7", + ["9408"] = "8", + ["9409"] = "9", + ["9410"] = "10", + ["9411"] = "11", + ["9412"] = "12", + ["9413"] = "13", + ["9414"] = "14", + ["9415"] = "15", + ["9416"] = "16", + ["9417"] = "17", + ["9418"] = "18", + ["9419"] = "19", + ["9420"] = "20", + ["9421"] = "21", + ["9422"] = "22", + ["9423"] = "23", + ["9424"] = "24", + ["9425"] = "25", + ["9426"] = "26", + ["9427"] = "27", + ["9428"] = "28", + ["9429"] = "29", + ["9430"] = "30", + ["9431"] = "31", + ["9432"] = "32", + ["9433"] = "33", + ["9434"] = "34", + ["9435"] = "35", + ["9436"] = "36", + ["9437"] = "37", + ["9438"] = "38", + ["9439"] = "39", + ["9440"] = "40", + ["9441"] = "41", + ["9442"] = "42", + ["9443"] = "43", + ["9444"] = "44", + ["9445"] = "45", + ["9446"] = "46", + ["9447"] = "47", + ["9448"] = "48", + ["9449"] = "49", + ["9450"] = "50", + ["9451"] = "51", + ["9452"] = "52", + ["9453"] = "53", + ["9454"] = "54", + ["9455"] = "55", + ["9456"] = "56", + ["9457"] = "57", + ["9458"] = "58", + ["9459"] = "59", + ["9460"] = "60", + ["9461"] = "61", + ["9462"] = "62", + ["9463"] = "63", + ["9464"] = "64", + ["9465"] = "65", + ["9466"] = "66", + ["9467"] = "67", + ["9468"] = "68", + ["9469"] = "69", + ["9470"] = "70", + ["9471"] = "71", + ["9472"] = "72", + ["9473"] = "73", + ["9474"] = "74", + ["9475"] = "75", + ["9476"] = "76", + ["9477"] = "77", + ["9478"] = "78", + ["9479"] = "79", + ["9480"] = "80", + ["9481"] = "81", + ["9482"] = "82", + ["9483"] = "83", + ["9484"] = "84", + ["9485"] = "85", + ["9486"] = "86", + ["9487"] = "87", + ["9488"] = "88", + ["9489"] = "89", + ["9490"] = "90", + ["9491"] = "91", + ["9492"] = "92", + ["9493"] = "93", + ["9494"] = "94", + ["9495"] = "95", + ["9496"] = "96", + ["9497"] = "97", + ["9498"] = "98", + ["9499"] = "99", + ["9500"] = "100", + ["9501"] = "1", + ["9502"] = "2", + ["9503"] = "3", + ["9504"] = "4", + ["9505"] = "5", + ["9506"] = "6", + ["9507"] = "7", + ["9508"] = "8", + ["9509"] = "9", + ["9510"] = "10", + ["9511"] = "11", + ["9512"] = "12", + ["9513"] = "13", + ["9514"] = "14", + ["9515"] = "15", + ["9516"] = "16", + ["9517"] = "17", + ["9518"] = "18", + ["9519"] = "19", + ["9520"] = "20", + ["9521"] = "21", + ["9522"] = "22", + ["9523"] = "23", + ["9524"] = "24", + ["9525"] = "25", + ["9526"] = "26", + ["9527"] = "27", + ["9528"] = "28", + ["9529"] = "29", + ["9530"] = "30", + ["9531"] = "31", + ["9532"] = "32", + ["9533"] = "33", + ["9534"] = "34", + ["9535"] = "35", + ["9536"] = "36", + ["9537"] = "37", + ["9538"] = "38", + ["9539"] = "39", + ["9540"] = "40", + ["9541"] = "41", + ["9542"] = "42", + ["9543"] = "43", + ["9544"] = "44", + ["9545"] = "45", + ["9546"] = "46", + ["9547"] = "47", + ["9548"] = "48", + ["9549"] = "49", + ["9550"] = "50", + ["9551"] = "51", + ["9552"] = "52", + ["9553"] = "53", + ["9554"] = "54", + ["9555"] = "55", + ["9556"] = "56", + ["9557"] = "57", + ["9558"] = "58", + ["9559"] = "59", + ["9560"] = "60", + ["9561"] = "61", + ["9562"] = "62", + ["9563"] = "63", + ["9564"] = "64", + ["9565"] = "65", + ["9566"] = "66", + ["9567"] = "67", + ["9568"] = "68", + ["9569"] = "69", + ["9570"] = "70", + ["9571"] = "71", + ["9572"] = "72", + ["9573"] = "73", + ["9574"] = "74", + ["9575"] = "75", + ["9576"] = "76", + ["9577"] = "77", + ["9578"] = "78", + ["9579"] = "79", + ["9580"] = "80", + ["9581"] = "81", + ["9582"] = "82", + ["9583"] = "83", + ["9584"] = "84", + ["9585"] = "85", + ["9586"] = "86", + ["9587"] = "87", + ["9588"] = "88", + ["9589"] = "89", + ["9590"] = "90", + ["9591"] = "91", + ["9592"] = "92", + ["9593"] = "93", + ["9594"] = "94", + ["9595"] = "95", + ["9596"] = "96", + ["9597"] = "97", + ["9598"] = "98", + ["9599"] = "99", + ["9600"] = "100", + ["9601"] = "1", + ["9602"] = "2", + ["9603"] = "3", + ["9604"] = "4", + ["9605"] = "5", + ["9606"] = "6", + ["9607"] = "7", + ["9608"] = "8", + ["9609"] = "9", + ["9610"] = "10", + ["9611"] = "11", + ["9612"] = "12", + ["9613"] = "13", + ["9614"] = "14", + ["9615"] = "15", + ["9616"] = "16", + ["9617"] = "17", + ["9618"] = "18", + ["9619"] = "19", + ["9620"] = "20", + ["9621"] = "21", + ["9622"] = "22", + ["9623"] = "23", + ["9624"] = "24", + ["9625"] = "25", + ["9626"] = "26", + ["9627"] = "27", + ["9628"] = "28", + ["9629"] = "29", + ["9630"] = "30", + ["9631"] = "31", + ["9632"] = "32", + ["9633"] = "33", + ["9634"] = "34", + ["9635"] = "35", + ["9636"] = "36", + ["9637"] = "37", + ["9638"] = "38", + ["9639"] = "39", + ["9640"] = "40", + ["9641"] = "41", + ["9642"] = "42", + ["9643"] = "43", + ["9644"] = "44", + ["9645"] = "45", + ["9646"] = "46", + ["9647"] = "47", + ["9648"] = "48", + ["9649"] = "49", + ["9650"] = "50", + ["9651"] = "51", + ["9652"] = "52", + ["9653"] = "53", + ["9654"] = "54", + ["9655"] = "55", + ["9656"] = "56", + ["9657"] = "57", + ["9658"] = "58", + ["9659"] = "59", + ["9660"] = "60", + ["9661"] = "61", + ["9662"] = "62", + ["9663"] = "63", + ["9664"] = "64", + ["9665"] = "65", + ["9666"] = "66", + ["9667"] = "67", + ["9668"] = "68", + ["9669"] = "69", + ["9670"] = "70", + ["9671"] = "71", + ["9672"] = "72", + ["9673"] = "73", + ["9674"] = "74", + ["9675"] = "75", + ["9676"] = "76", + ["9677"] = "77", + ["9678"] = "78", + ["9679"] = "79", + ["9680"] = "80", + ["9681"] = "81", + ["9682"] = "82", + ["9683"] = "83", + ["9684"] = "84", + ["9685"] = "85", + ["9686"] = "86", + ["9687"] = "87", + ["9688"] = "88", + ["9689"] = "89", + ["9690"] = "90", + ["9691"] = "91", + ["9692"] = "92", + ["9693"] = "93", + ["9694"] = "94", + ["9695"] = "95", + ["9696"] = "96", + ["9697"] = "97", + ["9698"] = "98", + ["9699"] = "99", + ["9700"] = "100", + ["9701"] = "1", + ["9702"] = "2", + ["9703"] = "3", + ["9704"] = "4", + ["9705"] = "5", + ["9706"] = "6", + ["9707"] = "7", + ["9708"] = "8", + ["9709"] = "9", + ["9710"] = "10", + ["9711"] = "11", + ["9712"] = "12", + ["9713"] = "13", + ["9714"] = "14", + ["9715"] = "15", + ["9716"] = "16", + ["9717"] = "17", + ["9718"] = "18", + ["9719"] = "19", + ["9720"] = "20", + ["9721"] = "21", + ["9722"] = "22", + ["9723"] = "23", + ["9724"] = "24", + ["9725"] = "25", + ["9726"] = "26", + ["9727"] = "27", + ["9728"] = "28", + ["9729"] = "29", + ["9730"] = "30", + ["9731"] = "31", + ["9732"] = "32", + ["9733"] = "33", + ["9734"] = "34", + ["9735"] = "35", + ["9736"] = "36", + ["9737"] = "37", + ["9738"] = "38", + ["9739"] = "39", + ["9740"] = "40", + ["9741"] = "41", + ["9742"] = "42", + ["9743"] = "43", + ["9744"] = "44", + ["9745"] = "45", + ["9746"] = "46", + ["9747"] = "47", + ["9748"] = "48", + ["9749"] = "49", + ["9750"] = "50", + ["9751"] = "51", + ["9752"] = "52", + ["9753"] = "53", + ["9754"] = "54", + ["9755"] = "55", + ["9756"] = "56", + ["9757"] = "57", + ["9758"] = "58", + ["9759"] = "59", + ["9760"] = "60", + ["9761"] = "61", + ["9762"] = "62", + ["9763"] = "63", + ["9764"] = "64", + ["9765"] = "65", + ["9766"] = "66", + ["9767"] = "67", + ["9768"] = "68", + ["9769"] = "69", + ["9770"] = "70", + ["9771"] = "71", + ["9772"] = "72", + ["9773"] = "73", + ["9774"] = "74", + ["9775"] = "75", + ["9776"] = "76", + ["9777"] = "77", + ["9778"] = "78", + ["9779"] = "79", + ["9780"] = "80", + ["9781"] = "81", + ["9782"] = "82", + ["9783"] = "83", + ["9784"] = "84", + ["9785"] = "85", + ["9786"] = "86", + ["9787"] = "87", + ["9788"] = "88", + ["9789"] = "89", + ["9790"] = "90", + ["9791"] = "91", + ["9792"] = "92", + ["9793"] = "93", + ["9794"] = "94", + ["9795"] = "95", + ["9796"] = "96", + ["9797"] = "97", + ["9798"] = "98", + ["9799"] = "99", + ["9800"] = "100", + ["9801"] = "1", + ["9802"] = "2", + ["9803"] = "3", + ["9804"] = "4", + ["9805"] = "5", + ["9806"] = "6", + ["9807"] = "7", + ["9808"] = "8", + ["9809"] = "9", + ["9810"] = "10", + ["9811"] = "11", + ["9812"] = "12", + ["9813"] = "13", + ["9814"] = "14", + ["9815"] = "15", + ["9816"] = "16", + ["9817"] = "17", + ["9818"] = "18", + ["9819"] = "19", + ["9820"] = "20", + ["9821"] = "21", + ["9822"] = "22", + ["9823"] = "23", + ["9824"] = "24", + ["9825"] = "25", + ["9826"] = "26", + ["9827"] = "27", + ["9828"] = "28", + ["9829"] = "29", + ["9830"] = "30", + ["9831"] = "31", + ["9832"] = "32", + ["9833"] = "33", + ["9834"] = "34", + ["9835"] = "35", + ["9836"] = "36", + ["9837"] = "37", + ["9838"] = "38", + ["9839"] = "39", + ["9840"] = "40", + ["9841"] = "41", + ["9842"] = "42", + ["9843"] = "43", + ["9844"] = "44", + ["9845"] = "45", + ["9846"] = "46", + ["9847"] = "47", + ["9848"] = "48", + ["9849"] = "49", + ["9850"] = "50", + ["9851"] = "51", + ["9852"] = "52", + ["9853"] = "53", + ["9854"] = "54", + ["9855"] = "55", + ["9856"] = "56", + ["9857"] = "57", + ["9858"] = "58", + ["9859"] = "59", + ["9860"] = "60", + ["9861"] = "61", + ["9862"] = "62", + ["9863"] = "63", + ["9864"] = "64", + ["9865"] = "65", + ["9866"] = "66", + ["9867"] = "67", + ["9868"] = "68", + ["9869"] = "69", + ["9870"] = "70", + ["9871"] = "71", + ["9872"] = "72", + ["9873"] = "73", + ["9874"] = "74", + ["9875"] = "75", + ["9876"] = "76", + ["9877"] = "77", + ["9878"] = "78", + ["9879"] = "79", + ["9880"] = "80", + ["9881"] = "81", + ["9882"] = "82", + ["9883"] = "83", + ["9884"] = "84", + ["9885"] = "85", + ["9886"] = "86", + ["9887"] = "87", + ["9888"] = "88", + ["9889"] = "89", + ["9890"] = "90", + ["9891"] = "91", + ["9892"] = "92", + ["9893"] = "93", + ["9894"] = "94", + ["9895"] = "95", + ["9896"] = "96", + ["9897"] = "97", + ["9898"] = "98", + ["9899"] = "99", + ["9900"] = "100", + ["9901"] = "1", + ["9902"] = "2", + ["9903"] = "3", + ["9904"] = "4", + ["9905"] = "5", + ["9906"] = "6", + ["9907"] = "7", + ["9908"] = "8", + ["9909"] = "9", + ["9910"] = "10", + ["9911"] = "11", + ["9912"] = "12", + ["9913"] = "13", + ["9914"] = "14", + ["9915"] = "15", + ["9916"] = "16", + ["9917"] = "17", + ["9918"] = "18", + ["9919"] = "19", + ["9920"] = "20", + ["9921"] = "21", + ["9922"] = "22", + ["9923"] = "23", + ["9924"] = "24", + ["9925"] = "25", + ["9926"] = "26", + ["9927"] = "27", + ["9928"] = "28", + ["9929"] = "29", + ["9930"] = "30", + ["9931"] = "31", + ["9932"] = "32", + ["9933"] = "33", + ["9934"] = "34", + ["9935"] = "35", + ["9936"] = "36", + ["9937"] = "37", + ["9938"] = "38", + ["9939"] = "39", + ["9940"] = "40", + ["9941"] = "41", + ["9942"] = "42", + ["9943"] = "43", + ["9944"] = "44", + ["9945"] = "45", + ["9946"] = "46", + ["9947"] = "47", + ["9948"] = "48", + ["9949"] = "49", + ["9950"] = "50", + ["9951"] = "51", + ["9952"] = "52", + ["9953"] = "53", + ["9954"] = "54", + ["9955"] = "55", + ["9956"] = "56", + ["9957"] = "57", + ["9958"] = "58", + ["9959"] = "59", + ["9960"] = "60", + ["9961"] = "61", + ["9962"] = "62", + ["9963"] = "63", + ["9964"] = "64", + ["9965"] = "65", + ["9966"] = "66", + ["9967"] = "67", + ["9968"] = "68", + ["9969"] = "69", + ["9970"] = "70", + ["9971"] = "71", + ["9972"] = "72", + ["9973"] = "73", + ["9974"] = "74", + ["9975"] = "75", + ["9976"] = "76", + ["9977"] = "77", + ["9978"] = "78", + ["9979"] = "79", + ["9980"] = "80", + ["9981"] = "81", + ["9982"] = "82", + ["9983"] = "83", + ["9984"] = "84", + ["9985"] = "85", + ["9986"] = "86", + ["9987"] = "87", + ["9988"] = "88", + ["9989"] = "89", + ["9990"] = "90", + ["9991"] = "91", + ["9992"] = "92", + ["9993"] = "93", + ["9994"] = "94", + ["9995"] = "95", + ["9996"] = "96", + ["9997"] = "97", + ["9998"] = "98", + ["9999"] = "99" + }; + } +}