diff options
Diffstat (limited to 'tests/src')
-rw-r--r-- | tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.cs | 417 | ||||
-rw-r--r-- | tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.csproj | 35 |
2 files changed, 452 insertions, 0 deletions
diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.cs b/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.cs new file mode 100644 index 0000000000..9c0de17c87 --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.cs @@ -0,0 +1,417 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Collections.Generic; + +// Test derived from dotnet/corefx src\System.Numerics.Vectors\src\System\Numerics\Matrix4x4.cs, op_Multiply(). +// This was an ARM32-specific bug for addressing local variables as floats. ARM32 floating-point instructions +// have a different offset range than integer instructions. If the local variable itself is a struct, but the +// instruction generated is a float local field, then we were computing the offset as integer, but the actual +// instruction was float. In certain frame layouts, the range will be out of range in this case, but we will +// not have allocated a "reserved" register which is used for generating large offsets. +// +// The key functions in the JIT that are related are Compiler::compRsvdRegCheck() and Compiler::lvaFrameAddress(). + +public class Test +{ + public struct BigStruct + { + public float float1; + public float float2; + public float float3; + public float float4; + public float float5; + public float float6; + public float float7; + public float float8; + public float float9; + public float float10; + public float float11; + public float float12; + public float float13; + public float float14; + public float float15; + public float float16; + public float float17; + public float float18; + public float float19; + public float float20; + public float float21; + public float float22; + public float float23; + public float float24; + public float float25; + public float float26; + public float float27; + public float float28; + public float float29; + public float float30; + public float float31; + public float float32; + public float float33; + public float float34; + public float float35; + public float float36; + public float float37; + public float float38; + public float float39; + public float float40; + public float float41; + public float float42; + public float float43; + public float float44; + public float float45; + public float float46; + public float float47; + public float float48; + public float float49; + public float float50; + public float float51; + public float float52; + public float float53; + public float float54; + public float float55; + public float float56; + public float float57; + public float float58; + public float float59; + public float float60; + public float float61; + public float float62; + public float float63; + public float float64; + public float float65; + public float float66; + public float float67; + public float float68; + public float float69; + public float float70; + public float float71; + public float float72; + public float float73; + public float float74; + public float float75; + public float float76; + public float float77; + public float float78; + public float float79; + public float float80; + public float float81; + public float float82; + public float float83; + public float float84; + public float float85; + public float float86; + public float float87; + public float float88; + public float float89; + public float float90; + public float float91; + public float float92; + public float float93; + public float float94; + public float float95; + public float float96; + public float float97; + public float float98; + public float float99; + public float float100; + public float float101; + public float float102; + public float float103; + public float float104; + public float float105; + public float float106; + public float float107; + public float float108; + public float float109; + public float float110; + public float float111; + public float float112; + public float float113; + public float float114; + public float float115; + public float float116; + public float float117; + public float float118; + public float float119; + public float float120; + public float float121; + public float float122; + public float float123; + public float float124; + public float float125; + public float float126; + public float float127; + public float float128; + public float float129; + public float float130; + public float float131; + public float float132; + public float float133; + public float float134; + public float float135; + public float float136; + public float float137; + public float float138; + public float float139; + public float float140; + public float float141; + public float float142; + public float float143; + public float float144; + public float float145; + public float float146; + public float float147; + public float float148; + public float float149; + public float float150; + public float float151; + public float float152; + public float float153; + public float float154; + public float float155; + public float float156; + public float float157; + public float float158; + public float float159; + public float float160; + public float float161; + public float float162; + public float float163; + public float float164; + public float float165; + public float float166; + public float float167; + public float float168; + public float float169; + public float float170; + public float float171; + public float float172; + public float float173; + public float float174; + public float float175; + public float float176; + public float float177; + public float float178; + public float float179; + public float float180; + public float float181; + public float float182; + public float float183; + public float float184; + public float float185; + public float float186; + public float float187; + public float float188; + public float float189; + public float float190; + public float float191; + public float float192; + public float float193; + public float float194; + public float float195; + public float float196; + public float float197; + public float float198; + public float float199; + public float float200; + public float float201; + public float float202; + public float float203; + public float float204; + public float float205; + public float float206; + public float float207; + public float float208; + public float float209; + public float float210; + public float float211; + public float float212; + public float float213; + public float float214; + public float float215; + public float float216; + public float float217; + public float float218; + public float float219; + public float float220; + public float float221; + public float float222; + public float float223; + public float float224; + public float float225; + public float float226; + public float float227; + public float float228; + public float float229; + public float float230; + public float float231; + public float float232; + public float float233; + public float float234; + public float float235; + public float float236; + public float float237; + public float float238; + public float float239; + public float float240; + public float float241; + public float float242; + public float float243; + public float float244; + public float float245; + public float float246; + public float float247; + public float float248; + public float float249; + public float float250; + public float float251; + public float float252; + public float float253; + public float float254; + public float float255; + } + + public struct Matrix4x4 + { + public float M11; + public float M12; + public float M13; + public float M14; + + public float M21; + public float M22; + public float M23; + public float M24; + + public float M31; + public float M32; + public float M33; + public float M34; + + public float M41; + public float M42; + public float M43; + public float M44; + + /// <summary> + /// Constructs a Matrix4x4 from the given components. + /// </summary> + public Matrix4x4(float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34, + float m41, float m42, float m43, float m44) + { + this.M11 = m11; + this.M12 = m12; + this.M13 = m13; + this.M14 = m14; + + this.M21 = m21; + this.M22 = m22; + this.M23 = m23; + this.M24 = m24; + + this.M31 = m31; + this.M32 = m32; + this.M33 = m33; + this.M34 = m34; + + this.M41 = m41; + this.M42 = m42; + this.M43 = m43; + this.M44 = m44; + } + + /// <summary> + /// Returns a boolean indicating whether the given two matrices are equal. + /// </summary> + /// <param name="value1">The first matrix to compare.</param> + /// <param name="value2">The second matrix to compare.</param> + /// <returns>True if the given matrices are equal; False otherwise.</returns> + public static bool Equals(Matrix4x4 value1, Matrix4x4 value2) + { + return (value1.M11 == value2.M11 && value1.M22 == value2.M22 && value1.M33 == value2.M33 && value1.M44 == value2.M44 && // Check diagonal element first for early out. + value1.M12 == value2.M12 && value1.M13 == value2.M13 && value1.M14 == value2.M14 && value1.M21 == value2.M21 && + value1.M23 == value2.M23 && value1.M24 == value2.M24 && value1.M31 == value2.M31 && value1.M32 == value2.M32 && + value1.M34 == value2.M34 && value1.M41 == value2.M41 && value1.M42 == value2.M42 && value1.M43 == value2.M43); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void AddHelper(ref BigStruct b) + { + b.float1 += 1.0F; + b.float255 += 2.0F; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static Matrix4x4 AddTest(Matrix4x4 value1, Matrix4x4 value2) + { + BigStruct b = new BigStruct(); + + b.float1 = value1.M11 + value2.M11; + b.float255 = value1.M12 + value2.M12; + + AddHelper(ref b); + + Matrix4x4 m; + + m = value1; + m.M11 = b.float1 + b.float255; + m.M12 = b.float1 - b.float255; + + return m; + } + + /// <summary> + /// Returns a String representing this matrix instance. + /// </summary> + /// <returns>The string representation.</returns> + public override string ToString() + { + return string.Format("{{ {{M11:{0} M12:{1} M13:{2} M14:{3}}} {{M21:{4} M22:{5} M23:{6} M24:{7}}} {{M31:{8} M32:{9} M33:{10} M34:{11}}} {{M41:{12} M42:{13} M43:{14} M44:{15}}} }}", + M11, M12, M13, M14, + M21, M22, M23, M24, + M31, M32, M33, M34, + M41, M42, M43, M44); + } + + public static int Main() + { + Matrix4x4 m1 = new Matrix4x4(1.0F,2.0F,3.0F,4.0F, + 5.0F,6.0F,7.0F,8.0F, + 9.0F,10.0F,11.0F,12.0F, + 13.0F,14.0F,15.0F,16.0F); + Matrix4x4 m2 = new Matrix4x4(13.0F,14.0F,15.0F,16.0F, + 9.0F,10.0F,11.0F,12.0F, + 5.0F,6.0F,7.0F,8.0F, + 1.0F,2.0F,3.0F,4.0F); + + Matrix4x4 m3 = AddTest(m1,m2); + + Matrix4x4 mresult = new Matrix4x4(33.0F,-3.0F,3.0F,4.0F, + 5.0F,6.0F,7.0F,8.0F, + 9.0F,10.0F,11.0F,12.0F, + 13.0F,14.0F,15.0F,16.0F); + if (Equals(m3,mresult)) + { + Console.WriteLine("PASS"); + return 100; + } + else + { + Console.WriteLine("FAIL: matrices don't match"); + Console.WriteLine(" m3 = {0}", m3.ToString()); + Console.WriteLine(" mresult = {0}", mresult.ToString()); + return 1; + } + } + + } +} + diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.csproj b/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.csproj new file mode 100644 index 0000000000..3f44b60d19 --- /dev/null +++ b/tests/src/JIT/Regression/JitBlue/GitHub_19537/GitHub_19537.csproj @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{2649FAFE-07BF-4F93-8120-BA9A69285ABB}</ProjectGuid> + <OutputType>Exe</OutputType> + <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> + <CLRTestPriority>1</CLRTestPriority> + </PropertyGroup> + <!-- Default configurations to help VS understand the configurations --> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "></PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "></PropertyGroup> + <PropertyGroup> + <DebugType>None</DebugType> + <Optimize>True</Optimize> + <AllowUnsafeBlocks>True</AllowUnsafeBlocks> + </PropertyGroup> + <ItemGroup> + <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies"> + <Visible>False</Visible> + </CodeAnalysisDependentAssemblyPaths> + </ItemGroup> + <ItemGroup> + <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> + </ItemGroup> + <ItemGroup> + <Compile Include="$(MSBuildProjectName).cs" /> + </ItemGroup> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> + <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "></PropertyGroup> +</Project> |