2008-10-14 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 14 Oct 2008 15:02:06 +0000 (15:02 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 14 Oct 2008 15:02:06 +0000 (15:02 -0000)
* mini-ops.h: Add dup low and dup high ops.

* cpu-x86.md: Same.

* mini-x86.c (mono_arch_output_basic_block): Same.

* simd-intrinsics.c (vector4f_intrinsics): Same.

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

mono/mini/ChangeLog
mono/mini/cpu-x86.md
mono/mini/mini-ops.h
mono/mini/mini-x86.c
mono/mini/simd-intrinsics.c

index a75fa78f9bbe33b2f3fb52eddf53d905ab6929c8..6e2305713cd6a95fea48955501cbd17c9c9f361c 100644 (file)
@@ -1,3 +1,13 @@
+2008-10-14  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * mini-ops.h: Add dup low and dup high ops.
+       
+       * cpu-x86.md: Same.
+
+       * mini-x86.c (mono_arch_output_basic_block): Same.
+
+       * simd-intrinsics.c (vector4f_intrinsics): Same.
+
 2008-10-13  Rodrigo Kumpera  <rkumpera@novell.com>
 
        * basic-simd.cs: Tests for recently added functionality.
index 37983f8e45737a1f63de1278106029461d34b703..3a737499845d78e6090b2441e6f41a0d6d0901aa 100644 (file)
@@ -423,6 +423,8 @@ xorps: dest:x src1:x src2:x len:3 clob:1
 haddps: dest:x src1:x src2:x len:4 clob:1
 hsubps: dest:x src1:x src2:x len:4 clob:1
 addsubps: dest:x src1:x src2:x len:4 clob:1
+dupps_low: dest:x src1:x len:4
+dupps_high: dest:x src1:x len:4
 
 pand: dest:x src1:x src2:x len:4 clob:1
 por: dest:x src1:x src2:x len:4 clob:1
index 99ac82fe869a3780501554b1b292becff85324af..f79d4294ea8dff17361ffb5717316883531d547d 100644 (file)
@@ -646,6 +646,8 @@ MINI_OP(OP_XORPS, "xorps", XREG, XREG, XREG)
 MINI_OP(OP_HADDPS, "haddps", XREG, XREG, XREG)
 MINI_OP(OP_HSUBPS, "hsubps", XREG, XREG, XREG)
 MINI_OP(OP_ADDSUBPS, "addsubps", XREG, XREG, XREG)
+MINI_OP(OP_DUPPS_LOW, "dupps_low", XREG, XREG, NONE)
+MINI_OP(OP_DUPPS_HIGH, "dupps_high", XREG, XREG, NONE)
 
 MINI_OP(OP_RSQRTPS, "rsqrtps", XREG, XREG, NONE)
 MINI_OP(OP_SQRTPS, "sqrtps", XREG, XREG, NONE)
index be9746a73560c8be7ea0f711809ca0bdf6fac060..62d776a5163ac5ecf550195358f81271528950ed 100644 (file)
@@ -3863,6 +3863,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_HSUBPS:
                        x86_sse_alu_sd_reg_reg (code, X86_SSE_HSUB, ins->sreg1, ins->sreg2);
                        break;
+               case OP_DUPPS_HIGH:
+                       x86_sse_alu_ss_reg_reg (code, X86_SSE_MOVSHDUP, ins->dreg, ins->sreg1);
+                       break;
+               case OP_DUPPS_LOW:
+                       x86_sse_alu_ss_reg_reg (code, X86_SSE_MOVSLDUP, ins->dreg, ins->sreg1);
+                       break;
                case OP_SHUFLEPS:
                        g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF);
                        x86_pshufd_reg_reg (code, ins->dreg, ins->sreg1, ins->inst_c0);
index a59819cac69f8d05a147a4b5db73c197b065cebb..9b11b5ee31e29e86dfff4bb5050cb939f420e1d6 100644 (file)
@@ -101,6 +101,8 @@ static const SimdIntrinsc vector4f_intrinsics[] = {
        { "CompareNotLessThan", OP_COMPPS, SIMD_EMIT_BINARY, SIMD_VERSION_SSE1, SIMD_COMP_NLT },
        { "CompareOrdered", OP_COMPPS, SIMD_EMIT_BINARY, SIMD_VERSION_SSE1, SIMD_COMP_ORD },
        { "CompareUnordered", OP_COMPPS, SIMD_EMIT_BINARY, SIMD_VERSION_SSE1, SIMD_COMP_UNORD },
+       { "DuplicateHigh", OP_DUPPS_HIGH, SIMD_EMIT_UNARY, SIMD_VERSION_SSE3 },
+       { "DuplicateLow", OP_DUPPS_LOW, SIMD_EMIT_UNARY, SIMD_VERSION_SSE3 },
        { "HorizontalAdd", OP_HADDPS, SIMD_EMIT_BINARY, SIMD_VERSION_SSE3 },
        { "HorizontalSub", OP_HSUBPS, SIMD_EMIT_BINARY, SIMD_VERSION_SSE3 },    
        { "InterleaveHigh", OP_UNPACK_HIGHPS, SIMD_EMIT_BINARY },