summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2017-09-15 10:31:31 -0700
committerGitHub <noreply@github.com>2017-09-15 10:31:31 -0700
commitf202810c3f6654b0ed8b59ba7835bf7535953249 (patch)
treea664cdf1afc6942d951949f50b9f9b96b8ed36f1
parent19fc1cdcf46f971aff72387af06019a8740b30ed (diff)
parente08ef2894445b2c13670dd1a3e1ffe39e5dae9f3 (diff)
downloadcoreclr-f202810c3f6654b0ed8b59ba7835bf7535953249.tar.gz
coreclr-f202810c3f6654b0ed8b59ba7835bf7535953249.tar.bz2
coreclr-f202810c3f6654b0ed8b59ba7835bf7535953249.zip
Merge pull request #13853 from hqueue/tests/MyStructReturn
Add a test for struct return to JIT/CodeGenBringUpTests
-rw-r--r--tests/src/JIT/CodeGenBringUpTests/StructReturn.cs420
-rw-r--r--tests/src/JIT/CodeGenBringUpTests/StructReturn.csproj30
2 files changed, 450 insertions, 0 deletions
diff --git a/tests/src/JIT/CodeGenBringUpTests/StructReturn.cs b/tests/src/JIT/CodeGenBringUpTests/StructReturn.cs
new file mode 100644
index 0000000000..488c4b962a
--- /dev/null
+++ b/tests/src/JIT/CodeGenBringUpTests/StructReturn.cs
@@ -0,0 +1,420 @@
+// 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;
+
+// int
+public struct MyStructInt1
+{
+ public int int1;
+}
+
+public struct MyStructInt2
+{
+ public int int1;
+ public int int2;
+}
+
+public struct MyStructInt4
+{
+ public int int1;
+ public int int2;
+ public int int3;
+ public int int4;
+}
+
+// long
+public struct MyStructLong1
+{
+ public long long1;
+}
+
+public struct MyStructLong2
+{
+ public long long1;
+ public long long2;
+}
+
+public struct MyStructLong4
+{
+ public long long1;
+ public long long2;
+ public long long3;
+ public long long4;
+}
+
+// float
+public struct MyStructFloat1
+{
+ public float float1;
+}
+
+public struct MyStructFloat2
+{
+ public float float1;
+ public float float2;
+}
+
+public struct MyStructFloat3
+{
+ public float float1;
+ public float float2;
+ public float float3;
+}
+
+public struct MyStructFloat4
+{
+ public float float1;
+ public float float2;
+ public float float3;
+ public float float4;
+}
+
+public struct MyStructFloat5
+{
+ public float float1;
+ public float float2;
+ public float float3;
+ public float float4;
+ public float float5;
+}
+
+public struct MyStructFloat8
+{
+ public float float1;
+ public float float2;
+ public float float3;
+ public float float4;
+ public float float5;
+ public float float6;
+ public float float7;
+ public float float8;
+}
+
+// double
+public struct MyStructDouble1
+{
+ public double double1;
+}
+
+public struct MyStructDouble2
+{
+ public double double1;
+ public double double2;
+}
+
+public struct MyStructDouble3
+{
+ public double double1;
+ public double double2;
+ public double double3;
+}
+
+public struct MyStructDouble4
+{
+ public double double1;
+ public double double2;
+ public double double3;
+ public double double4;
+}
+
+public struct MyStructDouble5
+{
+ public double double1;
+ public double double2;
+ public double double3;
+ public double double4;
+ public double double5;
+}
+
+public struct MyStructDouble8
+{
+ public double double1;
+ public double double2;
+ public double double3;
+ public double double4;
+ public double double5;
+ public double double6;
+ public double double7;
+ public double double8;
+}
+
+public class BringUpTest
+{
+ const int Pass = 100;
+ const int Fail = -1;
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructInt1 returnMyStructInt1(int x)
+ {
+ MyStructInt1 s = new MyStructInt1();
+ s.int1 = x + 1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructInt2 returnMyStructInt2(int x)
+ {
+ MyStructInt2 s = new MyStructInt2();
+ s.int1 = x + 1;
+ s.int2 = x + 2;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructInt4 returnMyStructInt4(int x)
+ {
+ MyStructInt4 s = new MyStructInt4();
+ s.int1 = x + 1;
+ s.int2 = x + 2;
+ s.int3 = x + 3;
+ s.int4 = x + 4;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructLong1 returnMyStructLong1(long x)
+ {
+ MyStructLong1 s = new MyStructLong1();
+ s.long1 = x + 1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructLong2 returnMyStructLong2(long x)
+ {
+ MyStructLong2 s = new MyStructLong2();
+ s.long1 = x + 1;
+ s.long2 = x + 2;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructLong4 returnMyStructLong4(long x)
+ {
+ MyStructLong4 s = new MyStructLong4();
+ s.long1 = x + 1;
+ s.long2 = x + 2;
+ s.long3 = x + 3;
+ s.long4 = x + 4;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat1 returnMyStructFloat1(float x)
+ {
+ MyStructFloat1 s = new MyStructFloat1();
+ s.float1 = x + 1.1f;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat2 returnMyStructFloat2(float x)
+ {
+ MyStructFloat2 s = new MyStructFloat2();
+ s.float1 = x + 1.1f;
+ s.float2 = x + 2.1f;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat3 returnMyStructFloat3(float x)
+ {
+ MyStructFloat3 s = new MyStructFloat3();
+ s.float1 = x + 1.1f;
+ s.float2 = x + 2.1f;
+ s.float3 = x + 3.1f;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat4 returnMyStructFloat4(float x)
+ {
+ MyStructFloat4 s = new MyStructFloat4();
+ s.float1 = x + 1.1f;
+ s.float2 = x + 2.1f;
+ s.float3 = x + 3.1f;
+ s.float4 = x + 4.1f;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat5 returnMyStructFloat5(float x)
+ {
+ MyStructFloat5 s = new MyStructFloat5();
+ s.float1 = x + 1.1f;
+ s.float2 = x + 2.1f;
+ s.float3 = x + 3.1f;
+ s.float4 = x + 4.1f;
+ s.float5 = x + 5.1f;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructFloat8 returnMyStructFloat8(float x)
+ {
+ MyStructFloat8 s = new MyStructFloat8();
+ s.float1 = x + 1.1f;
+ s.float2 = x + 2.1f;
+ s.float3 = x + 3.1f;
+ s.float4 = x + 4.1f;
+ s.float5 = x + 5.1f;
+ s.float6 = x + 6.1f;
+ s.float7 = x + 7.1f;
+ s.float8 = x + 8.1f;
+ return s;
+ }
+
+ // double
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble1 returnMyStructDouble1(double x)
+ {
+ MyStructDouble1 s = new MyStructDouble1();
+ s.double1 = x + 1.1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble2 returnMyStructDouble2(double x)
+ {
+ MyStructDouble2 s = new MyStructDouble2();
+ s.double1 = x + 1.1;
+ s.double2 = x + 2.1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble3 returnMyStructDouble3(double x)
+ {
+ MyStructDouble3 s = new MyStructDouble3();
+ s.double1 = x + 1.1;
+ s.double2 = x + 2.1;
+ s.double3 = x + 3.1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble4 returnMyStructDouble4(double x)
+ {
+ MyStructDouble4 s = new MyStructDouble4();
+ s.double1 = x + 1.1;
+ s.double2 = x + 2.1;
+ s.double3 = x + 3.1;
+ s.double4 = x + 4.1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble5 returnMyStructDouble5(double x)
+ {
+ MyStructDouble5 s = new MyStructDouble5();
+ s.double1 = x + 1.1;
+ s.double2 = x + 2.1;
+ s.double3 = x + 3.1;
+ s.double4 = x + 4.1;
+ s.double5 = x + 5.1;
+ return s;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.NoInlining)]
+ public static MyStructDouble8 returnMyStructDouble8(double x)
+ {
+ MyStructDouble8 s = new MyStructDouble8();
+ s.double1 = x + 1.1;
+ s.double2 = x + 2.1;
+ s.double3 = x + 3.1;
+ s.double4 = x + 4.1;
+ s.double5 = x + 5.1;
+ s.double6 = x + 6.1;
+ s.double7 = x + 7.1;
+ s.double8 = x + 8.1;
+ return s;
+ }
+
+
+ public static int Main()
+ {
+ // int
+ MyStructInt1 sI1 = returnMyStructInt1(100);
+ if (sI1.int1 != 101) return Fail;
+ Console.WriteLine(sI1);
+
+ MyStructInt2 sI2 = returnMyStructInt2(200);
+ if (sI2.int1 != 201 || sI2.int2 != 202) return Fail;
+ Console.WriteLine(sI2);
+
+ MyStructInt4 sI4 = returnMyStructInt4(400);
+ if (sI4.int1 != 401 || sI4.int2 != 402 || sI4.int3 != 403 || sI4.int4 != 404) return Fail;
+ Console.WriteLine(sI4);
+
+ // long
+ MyStructLong1 sL1 = returnMyStructLong1(100);
+ if (sL1.long1 != 101) return Fail;
+ Console.WriteLine(sL1);
+
+ MyStructLong2 sL2 = returnMyStructLong2(200);
+ if (sL2.long1 != 201 || sL2.long2 != 202) return Fail;
+ Console.WriteLine(sL2);
+
+ MyStructLong4 sL4 = returnMyStructLong4(400);
+ if (sL4.long1 != 401 || sL4.long2 != 402 || sL4.long3 != 403 || sL4.long4 != 404) return Fail;
+ Console.WriteLine(sL4);
+
+
+ // float
+ MyStructFloat1 sF1 = returnMyStructFloat1(100.0f);
+ if (sF1.float1 != 101.1f) return Fail;
+ Console.WriteLine(sF1);
+
+ MyStructFloat2 sF2 = returnMyStructFloat2(200.0f);
+ if (sF2.float1 != 201.1f || sF2.float2 != 202.1f) return Fail;
+ Console.WriteLine(sF2);
+
+ MyStructFloat3 sF3 = returnMyStructFloat3(300.0f);
+ if (sF3.float1 != 301.1f || sF3.float2 != 302.1f || sF3.float3 != 303.1f) return Fail;
+ Console.WriteLine(sF3);
+
+ MyStructFloat4 sF4 = returnMyStructFloat4(400.0f);
+ if (sF4.float1 != 401.1f || sF4.float2 != 402.1f || sF4.float3 != 403.1f || sF4.float4 != 404.1f) return Fail;
+ Console.WriteLine(sF4);
+
+ MyStructFloat5 sF5 = returnMyStructFloat5(500.0f);
+ if (sF5.float1 != 501.1f || sF5.float2 != 502.1f || sF5.float3 != 503.1f || sF5.float4 != 504.1f || sF5.float5 != 505.1f) return Fail;
+ Console.WriteLine(sF5);
+
+ MyStructFloat8 sF8 = returnMyStructFloat8(800.0f);
+ if (sF8.float1 != 801.1f || sF8.float2 != 802.1f || sF8.float3 != 803.1f || sF8.float4 != 804.1f || sF8.float5 != 805.1f || sF8.float6 != 806.1f || sF8.float7 != 807.1f || sF8.float8 != 808.1f) return Fail;
+ Console.WriteLine(sF8);
+
+ // double
+ MyStructDouble1 sD1 = returnMyStructDouble1(100.0d);
+ if (sD1.double1 != 101.1d) return Fail;
+ Console.WriteLine(sD1);
+
+ MyStructDouble2 sD2 = returnMyStructDouble2(200.0d);
+ if (sD2.double1 != 201.1d || sD2.double2 != 202.1d) return Fail;
+ Console.WriteLine(sD2);
+
+ MyStructDouble3 sD3 = returnMyStructDouble3(300.0d);
+ if (sD3.double1 != 301.1d || sD3.double2 != 302.1d || sD3.double3 != 303.1d) return Fail;
+ Console.WriteLine(sD3);
+
+ MyStructDouble4 sD4 = returnMyStructDouble4(400.0d);
+ if (sD4.double1 != 401.1d || sD4.double2 != 402.1d || sD4.double3 != 403.1d || sD4.double4 != 404.1d) return Fail;
+ Console.WriteLine(sD4);
+
+ MyStructDouble5 sD5 = returnMyStructDouble5(500.0d);
+ if (sD5.double1 != 501.1d || sD5.double2 != 502.1d || sD5.double3 != 503.1d || sD5.double4 != 504.1d || sD5.double5 != 505.1d) return Fail;
+ Console.WriteLine(sD5);
+
+ MyStructDouble8 sD8 = returnMyStructDouble8(800.0d);
+ if (sD8.double1 != 801.1d || sD8.double2 != 802.1d || sD8.double3 != 803.1d || sD8.double4 != 804.1d || sD8.double5 != 805.1d || sD8.double6 != 806.1d || sD8.double7 != 807.1d || sD8.double8 != 808.1d) return Fail;
+ Console.WriteLine(sD8);
+
+ return Pass;
+ }
+}
diff --git a/tests/src/JIT/CodeGenBringUpTests/StructReturn.csproj b/tests/src/JIT/CodeGenBringUpTests/StructReturn.csproj
new file mode 100644
index 0000000000..c25676edbe
--- /dev/null
+++ b/tests/src/JIT/CodeGenBringUpTests/StructReturn.csproj
@@ -0,0 +1,30 @@
+<?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>{657784FD-AA42-4B81-B14E-FD667C00533C}</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>
+ <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="StructReturn.cs" />
+ </ItemGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "></PropertyGroup>
+</Project>