2008-10-10 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 10 Oct 2008 20:17:51 +0000 (20:17 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 10 Oct 2008 20:17:51 +0000 (20:17 -0000)
* simd-intrinsics.c: Fixed intrinsic name typo.

    * mini.h: Added missing simd exported function.

* basic-simd.cs: Added tests for Vector4ui.
Fixed broken test for Vector16b.

svn path=/trunk/mono/; revision=115484

mono/mini/basic-simd.cs
mono/mini/mini.h
mono/mini/simd-intrinsics.c

index 6fff160b57ce626f0c2f8d6c9c23b44b56e13506..3835a6e3c22a387a4e47870728bf0b472c35a2ad 100644 (file)
@@ -2,6 +2,241 @@ using System;
 using Mono.Simd;
 
 public class SimdTests {
+       public static int test_0_vector4ui_pack_un_sat () {
+               Vector4ui a = new Vector4ui (100123,2,3,4);
+               Vector4ui b = new Vector4ui (5,6,7,8);
+               
+               Vector8us c = Vector4ui.PackWithUnsignedSaturation (a, b);
+       
+               if (c.V0 != 65535)
+                       return 1;
+               if (c.V1 != 2)
+                       return 2;
+               if (c.V2 != 3)
+                       return 3;
+               if (c.V3 != 4)
+                       return 4;
+               if (c.V4 != 5)
+                       return 5;
+               if (c.V5 != 6)
+                       return 6;
+               if (c.V6 != 7)
+                       return 7;
+               if (c.V7 != 8)
+                       return 8;
+               return 0;
+       }
+
+       public static int test_0_vector4ui_sar () {
+               Vector4ui a = new Vector4ui (0xF0000000u,20,3,40);
+               
+               Vector4ui c = Vector4ui.ShiftRightArithmetic (a, 2);
+       
+               if (c.X != 0xFC000000)
+                       return 1;
+               if (c.Y != 5)
+                       return 2;
+               if (c.Z != 0)
+                       return 3;
+               if (c.W != 10)
+                       return 4;
+               return 0;
+       }
+
+       public static int test_0_vector4ui_unpack_high () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+               Vector4ui b = new Vector4ui (5,6,7,8);
+               
+               Vector4ui c = Vector4ui.UnpackHigh(a, b);
+       
+               if (c.X != 3)
+                       return 1;
+               if (c.Y != 7)
+                       return 2;
+               if (c.Z != 4)
+                       return 3;
+               if (c.W != 8)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_unpack_low () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+               Vector4ui b = new Vector4ui (5,6,7,8);
+               
+               Vector4ui c = Vector4ui.UnpackLow (a, b);
+       
+               if (c.X != 1)
+                       return 1;
+               if (c.Y != 5)
+                       return 2;
+               if (c.Z != 2)
+                       return 3;
+               if (c.W != 6)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_xor () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+               Vector4ui b = new Vector4ui (7,5,3,1);
+               
+               Vector4ui c = a ^ b;
+       
+               if (c.X != 6)
+                       return 1;
+               if (c.Y != 7)
+                       return 2;
+               if (c.Z != 0)
+                       return 3;
+               if (c.W != 5)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_or () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+               Vector4ui b = new Vector4ui (7,5,3,1);
+               
+               Vector4ui c = a | b;
+       
+               if (c.X != 7)
+                       return 1;
+               if (c.Y != 7)
+                       return 2;
+               if (c.Z != 3)
+                       return 3;
+               if (c.W != 5)
+                       return 4;
+               return 0;
+       }
+       public  static int test_0_vector4ui_and () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+               Vector4ui b = new Vector4ui (7,5,3,1);
+               
+               Vector4ui c = a & b;
+       
+               if (c.X != 1)
+                       return 1;
+               if (c.Y != 0)
+                       return 2;
+               if (c.Z != 3)
+                       return 3;
+               if (c.W != 0)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_shr () {
+               Vector4ui a = new Vector4ui (0xF0000000u,20,3,40);
+               
+               Vector4ui c = a >> 2;
+       
+               if (c.X != 0x3C000000)
+                       return 1;
+               if (c.Y != 5)
+                       return 2;
+               if (c.Z != 0)
+                       return 3;
+               if (c.W != 10)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_shl () {
+               Vector4ui a = new Vector4ui (10,20,3,40);
+               
+               Vector4ui c = a << 2;
+       
+               if (c.X != 40)
+                       return 1;
+               if (c.Y != 80)
+                       return 2;
+               if (c.Z != 12)
+                       return 3;
+               if (c.W != 160)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_mul () {
+               Vector4ui a = new Vector4ui (0x8888,20,3,40);
+               Vector4ui b = new Vector4ui (0xFF00FF00u,2,3,4);
+               
+               Vector4ui c = a * b;
+       
+               if (c.X != 0xffff7800)
+                       return 1;
+               if (c.Y != 40)
+                       return 2;
+               if (c.Z != 9)
+                       return 3;
+               if (c.W != 160)
+                       return 4;
+               return 0;
+       }
+       public  static int test_0_vector4ui_sub () {
+               Vector4ui a = new Vector4ui (1,20,3,40);
+               Vector4ui b = new Vector4ui (0xFF00FF00u,2,3,4);
+               
+               Vector4ui c = a - b;
+       
+               if (c.X != 0xff0101)
+                       return 1;
+               if (c.Y != 18)
+                       return 2;
+               if (c.Z != 0)
+                       return 3;
+               if (c.W != 36)
+                       return 4;
+               return 0;
+       }
+
+       public  static int test_0_vector4ui_add () {
+               Vector4ui a = new Vector4ui (0xFF00FF00u,2,3,4);
+               Vector4ui b = new Vector4ui (0xFF00FF00u,2,3,4);
+               
+               Vector4ui c = a + b;
+       
+               if (c.X != 0xfe01fe00)
+                       return 1;
+               if (c.Y != 4)
+                       return 2;
+               if (c.Z != 6)
+                       return 3;
+               if (c.W != 8)
+                       return 4;
+               return 0;
+       }
+
+
+       static int test_0_vector4ui_accessors () {
+               Vector4ui a = new Vector4ui (1,2,3,4);
+
+               if (a.X != 1)
+                       return 1;
+               if (a.Y != 2)
+                       return 2;
+               if (a.Z != 3)
+                       return 3;
+               if (a.W != 4)
+                       return 4;
+               a.X = 10;
+               a.Y = 20;
+               a.Z = 30;
+               a.W = 40;
+
+               if (a.X != 10)
+                       return 5;
+               if (a.Y != 20)
+                       return 6;
+               if (a.Z != 30)
+                       return 7;
+               if (a.W != 40)
+                       return 8;
+               return 0;
+       }
+
        static int test_0_vector8us_pack () {
                Vector8us a = new Vector8us (0xFF00,1,2,3,4,5,6,7);
                Vector8us b = new Vector8us (3,4,5,6,7,8,9,10);
@@ -20,8 +255,6 @@ public class SimdTests {
                return 0;
        }
 
-
-
        static int test_0_vector8us_sub_sat () {
                Vector8us a = new Vector8us (0xF000,1,20,3,4,5,6,7);
                Vector8us b = new Vector8us (0xFF00,4,5,6,7,8,9,10);
@@ -114,7 +347,7 @@ public class SimdTests {
                int amt = 2;
                Vector8us c = Vector8us.ShiftRightArithmetic (a, amt);
        
-               if (c.V0 != 0x3FC0)
+               if (c.V0 != 0xFFC0)
                        return 1;
                if (c.V1 != 0)
                        return 2;
@@ -318,6 +551,21 @@ public class SimdTests {
                return 0;
        }
 
+       static int test_0_vector16b_sar () {
+               Vector16b a = new Vector16b (0xF0,20,3,40,0,0,0,0,0,0,0,0,0,0,0,0);
+               
+               Vector16b c = Vector16b.ShiftRightArithmetic (a, 2);
+               if (c.V0 != 0xFC)
+                       return 1;
+               if (c.V1 != 5)
+                       return 1;
+               if (c.V2 != 0)
+                       return 2;
+               if (c.V3 != 10)
+                       return 3;
+               return 0;
+       }
+
        static int test_0_vector16b_sub_sat () {
                Vector16b a = new Vector16b (100,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8);
                Vector16b b = new Vector16b (200,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
index 0af513df610a31ddb025aafa72fe5da788cda558..ebec6a04cc4efbdf23e89d012507b822db128809 100644 (file)
@@ -1708,6 +1708,7 @@ const char *mono_arch_xregname (int reg) MONO_INTERNAL;
 void mono_simd_simplify_indirection (MonoCompile *cfg) MONO_INTERNAL;
 MonoInst* mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) MONO_INTERNAL;
 guint32   mono_arch_cpu_enumerate_simd_versions (void) MONO_INTERNAL;
+void mono_simd_intrinsics_init (void) MONO_INTERNAL;
 
 
 #endif /* __MONO_MINI_H__ */
index b0806f71e14c7cb7e278f964b41e1a9ac390da86..8167bcc33a6e5cdd65ed5b8d7ad8d3f277e31cce 100644 (file)
@@ -130,7 +130,7 @@ setters
 static const SimdIntrinsc vector8us_intrinsics[] = {
        { "AddWithSaturation", OP_PADDW_SAT_UN, SIMD_EMIT_BINARY },
        { "LoadAligned", 0, SIMD_EMIT_LOAD_ALIGNED },
-       { "ShiftRightArithmethic", OP_PSARW, SIMD_EMIT_SHIFT },
+       { "ShiftRightArithmetic", OP_PSARW, SIMD_EMIT_SHIFT },
        { "StoreAligned", 0, SIMD_EMIT_STORE_ALIGNED },
        { "SubWithSaturation", OP_PSUBW_SAT_UN, SIMD_EMIT_BINARY },
        { "UnpackHigh", OP_UNPACK_HIGHW, SIMD_EMIT_BINARY },
@@ -196,7 +196,7 @@ get_ins_reg_by_idx (MonoInst *ins, int idx)
 }
 
 void
-mono_simd_intrinsics_init ()
+mono_simd_intrinsics_init (void)
 {
        simd_supported_versions = mono_arch_cpu_enumerate_simd_versions ();
 }