diff options
author | Russ Keldorph <russ.keldorph@microsoft.com> | 2016-04-13 10:29:40 -0700 |
---|---|---|
committer | Russ Keldorph <russ.keldorph@microsoft.com> | 2016-04-13 10:29:40 -0700 |
commit | 8beda3c1561aa7a4b4a18ea98e719fc9fd52a638 (patch) | |
tree | cacd27ddfc9f2a7665bf89730405441fd0a3c143 /tests/src | |
parent | 5ad8da8b1239585a9e75a20ed2137e8b92bfe6c9 (diff) | |
parent | 98d914bc0c9b167ee3e7abd3f4aee636f88cba59 (diff) | |
download | coreclr-8beda3c1561aa7a4b4a18ea98e719fc9fd52a638.tar.gz coreclr-8beda3c1561aa7a4b4a18ea98e719fc9fd52a638.tar.bz2 coreclr-8beda3c1561aa7a4b4a18ea98e719fc9fd52a638.zip |
Merge pull request #4310 from RussKeldorph/arglist
Port arglist tests for x86 and ARM
Diffstat (limited to 'tests/src')
16 files changed, 947 insertions, 28 deletions
diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.il b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.il new file mode 100644 index 0000000000..2c86a525e3 --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.il @@ -0,0 +1,110 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 1 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x1 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x1 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.ilproj b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.ilproj index 9f058102af..aaa821522c 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.ilproj +++ b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist.ilproj @@ -29,7 +29,10 @@ </PropertyGroup> <ItemGroup> - <Compile Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'x86'" Include="arglist.il" /> + <Compile Condition="'$(Platform)' == 'x64'" Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'arm'" Include="arglistARM.il" /> + <Compile Condition="'$(Platform)' == 'arm64'" Include="arglist64.il" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> @@ -40,4 +43,4 @@ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "> </PropertyGroup> -</Project>
\ No newline at end of file +</Project> diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist64.il b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist64.il index 421c166bd2..e04456d6a0 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist64.il +++ b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglist64.il @@ -19,11 +19,6 @@ arg1==arg4, arg2==arg5, arg3==arg6. */ .assembly extern legacy library mscorlib {} -.assembly extern System.Console -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) - .ver 4:0:0:0 -} .assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] } diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/1/arglistARM.il b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglistARM.il new file mode 100644 index 0000000000..1b6b00e94c --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/1/arglistARM.il @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. + +The vararg cookie in the case of x86 and ARM +is after/before the declared arguments respectively: +(from Compiler::lvaInitTypeRef() in lclvars.cpp) +x86 args look something like this: +[this ptr] [hidden return buffer] [declared arguments]* [generic context] [var arg cookie] +ARM is closer to the native ABI: +[hidden return buffer] [this ptr] [generic context] [var arg cookie] [declared arguments]* + +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 2 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x1 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x1 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + ldc.i4 1 + add + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.il b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.il new file mode 100644 index 0000000000..c619ceee0b --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.il @@ -0,0 +1,111 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 1 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x2 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x2 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL + +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.ilproj b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.ilproj index 9f058102af..aaa821522c 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.ilproj +++ b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist.ilproj @@ -29,7 +29,10 @@ </PropertyGroup> <ItemGroup> - <Compile Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'x86'" Include="arglist.il" /> + <Compile Condition="'$(Platform)' == 'x64'" Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'arm'" Include="arglistARM.il" /> + <Compile Condition="'$(Platform)' == 'arm64'" Include="arglist64.il" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> @@ -40,4 +43,4 @@ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "> </PropertyGroup> -</Project>
\ No newline at end of file +</Project> diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist64.il b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist64.il index 7e2fbc52c4..8ec67bf952 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist64.il +++ b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglist64.il @@ -19,11 +19,6 @@ arg1==arg4, arg2==arg5, arg3==arg6. */ .assembly extern legacy library mscorlib {} -.assembly extern System.Console -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) - .ver 4:0:0:0 -} .assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] } diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/2/arglistARM.il b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglistARM.il new file mode 100644 index 0000000000..f3b54f9af6 --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/2/arglistARM.il @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. + +The vararg cookie in the case of x86 and ARM +is after/before the declared arguments respectively: +(from Compiler::lvaInitTypeRef() in lclvars.cpp) +x86 args look something like this: +[this ptr] [hidden return buffer] [declared arguments]* [generic context] [var arg cookie] +ARM is closer to the native ABI: +[hidden return buffer] [this ptr] [generic context] [var arg cookie] [declared arguments]* +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 2 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x2 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x2 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + ldc.i4 1 + add + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL + +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.il b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.il new file mode 100644 index 0000000000..53a385292b --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.il @@ -0,0 +1,110 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 1 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x4 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x4 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.ilproj b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.ilproj index 9f058102af..aaa821522c 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.ilproj +++ b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist.ilproj @@ -29,7 +29,10 @@ </PropertyGroup> <ItemGroup> - <Compile Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'x86'" Include="arglist.il" /> + <Compile Condition="'$(Platform)' == 'x64'" Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'arm'" Include="arglistARM.il" /> + <Compile Condition="'$(Platform)' == 'arm64'" Include="arglist64.il" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> @@ -40,4 +43,4 @@ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "> </PropertyGroup> -</Project>
\ No newline at end of file +</Project> diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist64.il b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist64.il index 23622252d6..60fd8add1b 100644 --- a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist64.il +++ b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglist64.il @@ -19,11 +19,6 @@ arg1==arg4, arg2==arg5, arg3==arg6. */ .assembly extern legacy library mscorlib {} -.assembly extern System.Console -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) - .ver 4:0:0:0 -} .assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] } diff --git a/tests/src/JIT/Directed/PREFIX/unaligned/4/arglistARM.il b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglistARM.il new file mode 100644 index 0000000000..628896f561 --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/unaligned/4/arglistARM.il @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. + +The vararg cookie in the case of x86 and ARM +is after/before the declared arguments respectively: +(from Compiler::lvaInitTypeRef() in lclvars.cpp) +x86 args look something like this: +[this ptr] [hidden return buffer] [declared arguments]* [generic context] [var arg cookie] +ARM is closer to the native ABI: +[hidden return buffer] [this ptr] [generic context] [var arg cookie] [declared arguments]* +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 2 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + unaligned. 0x4 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + unaligned. 0x4 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + ldc.i4 1 + add + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.il b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.il new file mode 100644 index 0000000000..5a42942793 --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.il @@ -0,0 +1,112 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 1 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + volatile. + unaligned. 0x1 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + volatile. + unaligned. 0x1 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} diff --git a/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.ilproj b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.ilproj index 9f058102af..aaa821522c 100644 --- a/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.ilproj +++ b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist.ilproj @@ -29,7 +29,10 @@ </PropertyGroup> <ItemGroup> - <Compile Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'x86'" Include="arglist.il" /> + <Compile Condition="'$(Platform)' == 'x64'" Include="arglist64.il" /> + <Compile Condition="'$(Platform)' == 'arm'" Include="arglistARM.il" /> + <Compile Condition="'$(Platform)' == 'arm64'" Include="arglist64.il" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> @@ -40,4 +43,4 @@ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "> </PropertyGroup> -</Project>
\ No newline at end of file +</Project> diff --git a/tests/src/JIT/Directed/PREFIX/volatile/1/arglist64.il b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist64.il index 82a8c5b253..77ae3e5c06 100644 --- a/tests/src/JIT/Directed/PREFIX/volatile/1/arglist64.il +++ b/tests/src/JIT/Directed/PREFIX/volatile/1/arglist64.il @@ -19,11 +19,6 @@ arg1==arg4, arg2==arg5, arg3==arg6. */ .assembly extern legacy library mscorlib {} -.assembly extern System.Console -{ - .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) - .ver 4:0:0:0 -} .assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] } diff --git a/tests/src/JIT/Directed/PREFIX/volatile/1/arglistARM.il b/tests/src/JIT/Directed/PREFIX/volatile/1/arglistARM.il new file mode 100644 index 0000000000..e6b04ab45c --- /dev/null +++ b/tests/src/JIT/Directed/PREFIX/volatile/1/arglistARM.il @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +/* +CompareArgs() works as such: + +CompareArgs(3,1,2,3,1,2,3) +Where arg0 is 1/2 the number of the +remaining arguments. + +And the arguments 1,2,3 and 1,2,3 are +treated as two separate lists of size +arg0 whose elements are compared to one +another. + +ie. in this case CompareArgs checks that +arg1==arg4, arg2==arg5, arg3==arg6. + +The vararg cookie in the case of x86 and ARM +is after/before the declared arguments respectively: +(from Compiler::lvaInitTypeRef() in lclvars.cpp) +x86 args look something like this: +[this ptr] [hidden return buffer] [declared arguments]* [generic context] [var arg cookie] +ARM is closer to the native ABI: +[hidden return buffer] [this ptr] [generic context] [var arg cookie] [declared arguments]* +*/ + +.assembly extern legacy library mscorlib {} +.assembly arglist.exe{ //This byte field requests that this assembly not be verified at run time and corresponds to this C# declaration: + //[assembly:System.Security.Permissions.SecurityPermissionAttribute( [mscorlib]System.Security.Permissions.SecurityAction.RequestMinimum, Flags=System.Security.Permissions.SecurityPermissionFlag.SkipVerification )] + } + +.method static vararg int32 CompareArgs(int32){ +.locals(int32 currentindex, int32 loopconstant) +.maxstack 10 +.try{ + ldc.i4 2 + stloc currentindex + ldarg 0 + stloc loopconstant +LOOP: ldloc currentindex + ldc.i4 4 + mul + arglist + add + volatile. + unaligned. 0x1 + ldind.i4 + ldloc currentindex + ldloc loopconstant + add + ldc.i4 4 + mul + arglist + add + volatile. + unaligned. 0x1 + ldind.i4 + ceq + brfalse EXITWITHFAIL + ldloc currentindex + ldloc loopconstant + ldc.i4 1 + add + beq EXITWITHPASS + ldc.i4 1 + ldloc currentindex + add + stloc currentindex + br LOOP + EXITWITHPASS: + leave SUCCESS + EXITWITHFAIL: + leave FAIL +}catch [mscorlib]System.NullReferenceException{ + pop + leave FAIL +} +SUCCESS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 +REALLYDONE: + ret +} + +//------------------------- +// Entry point - Main - +//------------------------- +.method static int32 main() { +.entrypoint +.locals () +.maxstack 10 + + ldc.i4 1 + ldc.i4 1 + ldc.i4 1 + call vararg int32 CompareArgs(int32,...,int32,int32) + brfalse FAIL + + ldc.i4 4 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + ldc.i4 2 + ldc.i4 3 + ldc.i4 4 + ldc.i4 5 + call vararg int32 CompareArgs(int32,...,int32,int32,int32,int32,int32,int32,int32,int32) + brfalse FAIL + + +PASS: + ldc.i4 0x64 + ret +FAIL: + ldc.i4 0x0 + ret +} |