2007-01-30 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / iltests.il
index e99a3165bf9726e0171faa54ed4d17418af26e6f..eeebe6ef3a6e9bb6acd903707aa1003e1251c040 100644 (file)
@@ -4,12 +4,13 @@
 
 .class public auto ansi sealed beforefieldinit Tests {
 
-       .method static public int32 Main() il managed {
+       .method static public int32 Main(string[] args) il managed {
                .entrypoint
                
                ldtoken Tests
                call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
-               call       int32 [TestDriver]TestDriver::RunTests(class [mscorlib]System.Type)
+               ldarg.0
+               call       int32 [TestDriver]TestDriver::RunTests(class [mscorlib]System.Type, string[])
                ret
        }
 
@@ -300,10 +301,30 @@ OK4:
                ldloc.0
                ldind.i4
                ldc.i4 999999
-               beq PASS
+               beq OK5
                ldc.i4.5
                br FAIL
 
+OK5:
+               // Try allocations bigger than one page
+               ldc.i4 8196
+               localloc
+               conv.i
+               stloc.3
+               ldloc.3
+               ldc.i4 8192
+               add
+               ldc.i4 99
+               stind.i4
+               ldloc.3
+               ldc.i4 8192
+               add
+               ldind.i4
+               ldc.i4 99
+               beq PASS
+               ldc.i4.6
+               br FAIL
+
 FAIL:
                ret
 
@@ -489,6 +510,64 @@ COND:   ldloc.0
                ret
        }
 
+       .method static public int32 tail3 (int32 i, int32 j) il managed {
+               ldarg.0
+               ldarg.1
+               add
+               ret
+       }
+
+       .method static public int32 tail4 (int32 i, int32 j) il managed {
+               .maxstack 16
+               .locals init (
+                       int32 k)
+
+               // Test arg0 allocated to a register
+               ldarg.0
+               ldarg.0
+               ldarg.0
+               ldarg.0
+               add
+               add
+               add
+               starg 0
+
+               // Test switched up argument variables as the actual arguments
+               ldarg.1
+               ldarg.0
+               tail.
+               call int32 Tests::tail3 (int32, int32)
+               ret
+       }
+
+       .method static public int32 test_24_tail_calls2 () il managed {
+               .maxstack 16
+               .locals init (
+                       int32 i,
+                       int32 j)
+
+               ldc.i4.4
+               stloc.0
+               ldc.i4.8
+               stloc.1
+
+               ldloc.0 
+               ldloc.1
+               call int32 Tests::tail4 (int32, int32)
+               ret
+       }
+
+       .method public static int32 test_5_jmp () cil managed {
+               jmp int32 Tests::jmp2 ()
+               ldc.i4.0
+               ret
+       }
+
+       .method public static int32 jmp2 () cil managed {
+               ldc.i4.5
+               ret
+       }               
+
        .method static public int32 test_11_switch_with_nonempty_stack () il managed {
                .maxstack 16
 
@@ -533,6 +612,102 @@ COND:   ldloc.0
                ret
        }               
 
+       .method public static int32 test_1234_conv_u4 () cil managed {
+               .maxstack 16
+
+               ldc.i4 1234
+               conv.u4
+               conv.i4
+               ret
+       }
+
+       .method public static int32 test_2_lconv_to_ovf_i4_un () cil managed {
+               .maxstack 16
+               .locals init (int32 res)
+
+               ldc.i4 0x7fffffff
+               conv.u8
+               conv.ovf.i4.un
+               pop
+
+               ldc.i4.2
+               stloc res
+
+        .try {
+                       ldc.i8 0x80000000
+                       conv.ovf.i4.un
+                       pop
+                       ldc.i4.0
+                       stloc res
+                       leave RET
+               } catch [mscorlib]System.OverflowException {
+                       pop
+                       leave IL_0
+               }
+
+       IL_0:
+
+        .try {
+                       ldc.i8 0xffffffff80000000
+                       conv.ovf.i4.un
+                       pop
+                       ldc.i4.1
+                       stloc res
+                       leave RET
+               } catch [mscorlib]System.OverflowException {
+                       pop
+                       leave RET
+               }
+
+       RET:
+               ldloc res
+               ret
+       }
+
+    .method public static int32 test_1_lconv_to_ovf_i_un () cil managed {
+               .maxstack 16
+               .locals init (int32 res)
+
+               ldc.i4 0x7fffffff
+               conv.u8
+               conv.ovf.i.un
+               conv.i4
+               pop
+
+               ldc.i4.1
+               ret
+       }
+
+       .method public static int32 test_32_lconv_to_u8 () cil managed
+       {
+               .maxstack 16
+
+               ldc.i4 32
+               conv.i8
+               conv.u8
+               conv.i4
+               ret
+       }                               
+
+       .method public static int32 test_32_lconv_to_i8 () cil managed
+       {
+               .maxstack 16
+
+               ldc.i4 32
+               conv.i8
+               conv.i8
+               conv.i4
+               ret
+       }                               
+
+       .method public static int32 test_15_lconv_to_u () cil managed
+       {
+       ldc.i8 0x10000000f
+               conv.u
+               conv.i4
+               ret
+       }
+
        .method public static int32 test_0_get_type_from_handle_on_bblock_boundary () cil managed 
        {
                .maxstack 16
@@ -596,4 +771,584 @@ COND:   ldloc.0
                ceq
                ret
        }
+       
+       .method public static int32 test_1_array_type_mismatch_ldelema  () {
+               .locals init (int32 r)
+               
+                       ldc.i4.1
+                       newarr string
+                       ldc.i4.0 
+                       ldelema string
+                       pop
+               
+               .try {
+                       ldc.i4.1
+                       newarr string
+                       ldc.i4.0 
+                       ldelema object
+                       pop
+                       
+                       leave end
+               } catch [mscorlib]System.ArrayTypeMismatchException {
+                       pop
+                       ldc.i4.1
+                       stloc.0
+                       leave end
+               }
+       end:
+               ldloc.0
+               ret
+       }
+
+       .method public static int32 test_1_conv_ovf_i8_with_i4 () {
+                       ldc.i4.m1 
+                       conv.ovf.i8
+                       conv.ovf.i4
+                       neg
+                       ret
+       }
+
+       // bug #72148
+    .method public static int32 test_0_initlocals_float_ptr () {
+       .maxstack 3
+       .locals init (
+               float32[]       V_0,
+               float32& pinned V_1,
+               unsigned int32  V_2)
+                       ldc.i4.s 0x0f
+                       newarr [mscorlib]System.Single
+                       stloc.0 
+                       ldloc.0 
+                       ldc.i4.0 
+                       ldc.r4 1.13
+                       stelem.r4 
+                       ldloc.0 
+                       ldc.i4.0 
+                       ldelema [mscorlib]System.Single
+                       stloc.1 
+                       ldloc.1 
+                       conv.i 
+                       ldind.u4 
+                       stloc.2 
+                       ldc.i4.0
+                       ret
+       }
+
+       .method public static int32 test_7_conv_ovf_u8_un () {
+       .maxstack  2
+        .locals    init (unsigned int64)
+
+        ldc.i4.7
+        conv.ovf.u8.un
+        stloc.0
+               ldloc.0
+               conv.i4
+        ret
+       }
+
+       .method public static int32 test_1_bug_74591 () {
+               .maxstack 16
+               .locals init (int32)
+
+               ldc.i4.m1
+               stloc.0
+               ldloc.0
+               conv.ovf.i8
+               ldc.i4.m1
+               conv.ovf.i8
+               mul.ovf
+               conv.i4
+               ret
+       }
+
+       .class nested public auto ansi Integer
+               extends [mscorlib]System.Object {
+
+               .field public bool n
+
+           .method public hidebysig  specialname  rtspecialname 
+           instance default void .ctor (unsigned int64 i, bool n)  cil managed 
+           {
+                       .maxstack 8
+                       ldarg.0
+                       call instance void class [mscorlib]System.Object::.ctor()
+                       ldarg.0
+                       ldarg.2
+                       stfld bool Tests/Integer::n
+                       ret
+               }
+       }
+
+       .method public static int32 test_1_bug_74726 () {
+               .maxstack 16
+
+               ldc.i4.2
+               conv.ovf.u8
+               ldc.i4.1
+               conv.ovf.u8
+               mul.ovf.un
+               ldc.i4.1
+               newobj instance void class Tests/Integer::.ctor(unsigned int64, bool)
+               ldfld bool Tests/Integer::n
+               ldc.i4.1
+               ceq
+               ret
+       }
+
+       .class nested private auto ansi sealed xxx
+       extends [mscorlib]System.ValueType
+   {
+     .field  public   object a
+
+     .method public hidebysig  specialname  rtspecialname 
+            instance default void .ctor ()  cil managed 
+     {
+                .maxstack 8
+                ret 
+     }
+   } // end of class xxx
+
+       .method public static int32 test_0_newobj_vtype () {
+               .maxstack 6
+               .locals init (
+                       valuetype Tests/xxx V_0
+               )
+
+               newobj instance void valuetype Tests/xxx::.ctor ()
+               stloc.0
+               ldloca.s 0
+               ldfld object Tests/xxx::a
+               brfalse OK
+               ldc.i4.s 1
+               ret
+       OK:
+               ldc.i4.s 0
+               ret
+       }
+
+       .method public static int32 test_1_filters () {
+               .maxstack 16
+               .locals init (
+                       int32 res
+               )
+
+               .try { // 0
+                       .try {
+                               ldstr "OnErrorSub test Exception"
+                               newobj instance void class [mscorlib]System.Exception::.ctor(string)
+                               throw 
+                               leave.s IL_0033
+                       }
+                       filter {
+                               pop
+                               ldc.i4.0
+                               endfilter
+                       } {
+                               pop
+                               // Should not be called
+                               ldc.i4.2
+                               stloc res
+                               leave.s IL_0033
+                       }
+               }
+               filter {
+                       pop
+                       ldc.i4.1
+                       endfilter 
+               } {
+                 pop
+                 ldc.i4.1
+                 stloc res       
+                 leave.s IL_0033
+
+               }
+               IL_0033:
+               ldloc res
+               ret
+       }
+
+       .class nested private auto ansi sealed beforefieldinit TheStruct
+               extends [mscorlib]System.ValueType {
+               .field public int32 a
+               .field public int32 b
+       }
+
+       .method public static int32 test_5_cpobj () {
+               .maxstack 8
+               .locals init (  
+                               valuetype Tests/TheStruct v_0, 
+                               valuetype Tests/TheStruct v_1
+                                        )
+
+               ldloca v_0
+               ldc.i4.2
+               stfld int32 Tests/TheStruct::a
+
+               ldloca v_0
+               ldc.i4.3
+               stfld int32 Tests/TheStruct::b
+
+               ldloca v_1
+               ldloca v_0
+               cpobj Tests/TheStruct
+
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::a
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::b
+               add
+
+               ret
+       }
+
+       .method public static int32 test_5_ldobj_stloc_optimization () {
+               .maxstack 8
+               .locals init (  
+                               valuetype Tests/TheStruct v_0, 
+                               valuetype Tests/TheStruct v_1
+                                        )
+
+               ldloca v_0
+               ldc.i4.2
+               stfld int32 Tests/TheStruct::a
+
+               ldloca v_0
+               ldc.i4.3
+               stfld int32 Tests/TheStruct::b
+
+               ldloca v_0
+               ldobj valuetype Tests/TheStruct
+               stloc.s v_1
+
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::a
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::b
+               add
+
+               ret
+       }
+
+       .method public static int32 test_1_cpobj_reference () {
+               .maxstack 8
+               .locals init (  
+                               object v_0, 
+                               object v_1
+                                        )
+
+               newobj instance void object::.ctor()
+               stloc v_0
+
+               ldloca v_1
+               ldloca v_0
+               cpobj object
+
+               ldloc v_0
+               ldloc v_1
+               ceq
+               ret
+       }
+
+       .method public static int32 test_1_initobj_reference () {
+               .maxstack 8
+               .locals init (  
+                               object v_0
+                                        )
+
+               newobj instance void object::.ctor()
+               stloc v_0
+
+               ldloca v_0
+               initobj object
+
+               ldloc v_0
+               ldnull
+               ceq
+               ret
+       }
+
+       .method public static int32 test_1_ldobj_reference () {
+               .maxstack 8
+               .locals init (  
+                               object v_0
+                                        )
+
+               newobj instance void object::.ctor()
+               stloc v_0
+
+               ldloc v_0
+               ldloca v_0
+               ldobj object
+               ceq
+               ret
+       }
+
+       .method public static int32 test_5_vtype_on_bb_boundary () {
+               .maxstack 8
+               .locals init (  
+                               valuetype Tests/TheStruct v_0, 
+                               valuetype Tests/TheStruct v_1
+                                        )
+
+               ldloca v_0
+               ldc.i4.2
+               stfld int32 Tests/TheStruct::a
+
+               ldloca v_0
+               ldc.i4.3
+               stfld int32 Tests/TheStruct::b
+
+               ldloc v_0
+               br L_0
+       L_0: stloc v_1
+
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::a
+               ldloca v_1
+               ldfld int32 Tests/TheStruct::b
+               add
+               ret
+       }
+
+       .method public static int32 test_5_different_in_stacks () cil managed {
+               .maxstack 16
+
+                       ldc.i4.1
+                       ldc.i4.1
+                       beq L_0
+
+                       ldc.i4.3
+                       ldc.i4.3
+                       br L_1
+                       ldc.i4.3
+                       ldc.i4.3
+                       br L_2
+        L_0:   ldc.i4.2
+                       ldc.i4.3
+                       ldc.i4.1
+                       ldc.i4.1
+                       beq L_2
+        L_1:   add
+                       ret
+        L_2:   add
+                       ret
+       }
+
+       .method public static int32 test_3_larray_get_set () {
+               .locals init (
+                       int32[2]        V_0)
+                         
+                       ldc.i4.2 
+                       newobj instance void int32[0...]::.ctor(int32)
+                       stloc.0 
+                       ldloc.0 
+                       ldc.i4.0 
+                       ldc.i4 1
+                       call instance void int32[0...]::Set(int32, int32)
+                   ldloc.0 
+                   ldc.i4.1 
+                       ldc.i4 2
+                       call instance void int32[0...]::Set(int32, int32)
+
+                       ldloc.0
+                       ldc.i4.0
+                       call instance int32 int32[0...]::Get(int32)
+                       ldloc.0
+                       ldc.i4.1
+                       call instance int32 int32[0...]::Get(int32)
+                       add
+                       ret
+       }
+
+       .method public static int32 test_0_pop_side_effects () {
+               .try {
+                       ldc.r8 1
+                       ldc.r8 0
+                       div
+                       ckfinite
+                       pop
+                       leave FAIL
+               }
+               catch [mscorlib]System.ArithmeticException {
+                       pop
+                       leave L_0
+               }
+               L_0:
+               ldc.i4.0
+               ret
+               FAIL:
+               ldc.i4.1
+               ret
+       }
+
+       .method public static void regalloc_regress_78314_helper (object o) cil managed
+       {
+               ret
+       }
+
+       .method public static int32 test_1_regalloc_regress_78314 () cil managed
+       {
+    // Code size       68 (0x44)
+    .maxstack  6
+    .locals init (int32 V_0, bool V_1)
+    IL_0000:  ldc.i4.0
+    IL_0001:  stloc.0
+    IL_0002:  br.s       IL_003b
+
+    IL_0004:
+    IL_001e:  ldc.i4.s   10
+    IL_0020:  ldloc.0
+    IL_0021:  shl
+    IL_0022:  ldc.i4.s   10
+    IL_0024:  ldloc.0
+    IL_0025:  shl
+    IL_0026:  ceq
+    IL_0028:  box        [mscorlib]System.Boolean
+    IL_0032:  call       void Tests::regalloc_regress_78314_helper(object)
+    IL_0037:  ldloc.0
+    IL_0038:  ldc.i4.1
+    IL_0039:  add
+    IL_003a:  stloc.0
+    IL_003b:  ldloc.0
+    IL_003c:  ldc.i4.8
+    IL_003f:  blt.s      IL_0004
+
+       ldloc.0
+       ldc.i4.8
+       ceq
+       conv.i4
+       ret     
+  }
+
+       .method public static void try_block_end_remove_if_useless () cil managed {
+           .maxstack  8
+
+           T_START:
+               ldstr   "Start"
+                       pop
+               leave.s COMPLETE
+           T1_END:
+
+           COMPLETE:
+               ret
+
+           F1_START:
+               ldstr   "Finally1"
+                       pop
+               endfinally
+           F1_END:
+
+           .try T_START to T1_END finally handler F1_START to F1_END
+       }
+
+       .method public static int32 test_0_try_block_end_remove_if_useless () cil managed {
+               call void class Tests::try_block_end_remove_if_useless ()
+               ldc.i4.0
+               ret
+       }
+
+   .method private static int32 test_0_regress_78629_switch_next_ins_target ()  cil managed
+    {
+        ldc.i4.0
+        switch (target)
+        target: ldstr "bar"
+               pop
+               ldc.i4.0
+        ret
+    }
+
+       // This belongs to basic-float.cs, but its hard to tell mcs/csc to
+       // generate the non .un version of the opcodes
+    .method private static  hidebysig 
+           default int32 test_4_float_branch_nan ()  cil managed 
+    {
+        // Method begins at RVA 0x27a4
+       // Code size 74 (0x4a)
+       .maxstack 2
+       .locals init (
+               float64 V_0,
+               float64 V_1,
+               int32   V_2)
+       IL_0000:  ldc.r8 (00 00 00 00 00 00 f8 ff)
+       IL_0009:  stloc.0 
+       IL_000a:  ldc.r8 1.
+       IL_0013:  stloc.1 
+       IL_0014:  ldc.i4.0 
+       IL_0015:  stloc.2 
+       IL_0016:  ldloc.0 
+       IL_0017:  ldloc.1 
+       IL_0018:  bge.s IL_001a
+
+                               br L1
+       IL_001a:  ldloc.2 
+       IL_001b:  ret 
+       L1:
+       IL_001c:  ldloc.2 
+       IL_001d:  ldc.i4.1 
+       IL_001e:  add 
+       IL_001f:  stloc.2 
+       IL_0020:  ldloc.0 
+       IL_0021:  ldloc.1 
+       IL_0022:  ble.s IL_002e
+                               br L2
+       IL_002e:  ldloc.2 
+       IL_002f:  ret 
+       L2:
+       IL_0030:  ldloc.2 
+       IL_0031:  ldc.i4.1 
+       IL_0032:  add 
+       IL_0033:  stloc.2 
+       IL_0034:  ldloc.0 
+       IL_0035:  ldloc.1 
+       IL_0036:  blt.s IL_0038
+                               br L3           
+       IL_0038:  ldloc.2 
+       IL_0039:  ret 
+       L3:
+       IL_003a:  ldloc.2 
+       IL_003b:  ldc.i4.1 
+       IL_003c:  add 
+       IL_003d:  stloc.2 
+       IL_003e:  ldloc.0 
+       IL_003f:  ldloc.1 
+       IL_0040:  bgt.s IL_0042
+                               br L4
+       IL_0042:  ldloc.2 
+       IL_0043:  ret 
+       L4:
+       IL_0044:  ldloc.2 
+       IL_0045:  ldc.i4.1 
+       IL_0046:  add 
+       IL_0047:  stloc.2 
+       IL_0048:  ldloc.2 
+       IL_0049:  ret 
+    } // end of method Tests::test_5_float_branch_nan
+
+    .method private static  hidebysig
+           default void regress_80622_inner (object x)  cil managed
+    {
+               .locals (unsigned int8 i)
+        // Method begins at RVA 0x2050
+        // Code size 14 (0xe)
+        .maxstack 8
+        IL_1000:  ldarg.0
+        IL_1001:  unbox unsigned int8
+        IL_1006:  ldobj unsigned int8
+        IL_000b:  conv.ovf.i4.un
+        IL_000c:  pop
+        IL_000d:  ret
+    }
+
+    // method line 2
+    .method private static  hidebysig
+           default int32 test_0_regress_80622 ()  cil managed
+    {
+        .maxstack 8
+        IL_0000:  ldc.i4 255
+        IL_0005:  box unsigned int8
+        IL_000a:  call void class Tests::regress_80622_inner (object)
+               ldc.i4.0
+        IL_000f:  ret
+    }
+
 }