2008-11-18 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 18 Nov 2008 21:57:00 +0000 (21:57 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 18 Nov 2008 21:57:00 +0000 (21:57 -0000)
* mini-ops.h: Added OP_INSERT_I2.

* cpu-x86.md: Same.

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

* simd-intrinsics.c: Implement setter for Vector8s.

* simd-methods.h: Add the names of get setters of Vector8s.

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

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

index 94d8816fc1a360604158c7a00cdcdc27be189de7..ce2391ee86803aad2a6e428d393411e58aa65768 100644 (file)
@@ -1,3 +1,15 @@
+2008-11-18  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * mini-ops.h: Added OP_INSERT_I2.
+
+       * cpu-x86.md: Same.
+
+       * mini-x86.c (mono_arch_output_basic_block): Same.
+       
+       * simd-intrinsics.c: Implement setter for Vector8s.
+
+       * simd-methods.h: Add the names of get setters of Vector8s.
+
 2008-11-18  Zoltan Varga  <vargaz@gmail.com>
 
        * aot-compiler.c (mono_save_xdebug_info): Add support for parameters.
index 886616aa83f8904a748c7abd42c86d7c5848f027..90ba4ccb90dd6a8d7b87f0394db80412ca568255 100644 (file)
@@ -570,10 +570,12 @@ extract_i2: dest:i src1:x len:10
 extract_u2: dest:i src1:x len:10
 extract_i1: dest:i src1:x len:10
 extract_u1: dest:i src1:x len:10
-extract_r8: dest:f src1:x len:17 
+extract_r8: dest:f src1:x len:8 
 
 iconv_to_r8_raw: dest:f src1:i len:17 
 
+insert_i2: dest:x src1:x src2:i len:5 clob:1
+
 loadx_membase: dest:x src1:b len:7
 storex_membase: dest:b src1:x len:7
 storex_membase_reg: dest:b src1:x len:7
index e23f0250f9147adf85ec8f0badacfd58f5531382..757d81ddb3882e75416b03182ff0be2900627e7a 100644 (file)
@@ -742,6 +742,8 @@ MINI_OP(OP_EXTRACT_U1, "extract_u1", IREG, XREG, NONE)
 MINI_OP(OP_EXTRACT_R8, "extract_r8", FREG, XREG, NONE)
 MINI_OP(OP_EXTRACT_I8, "extract_i8", IREG, XREG, NONE)
 
+MINI_OP(OP_INSERT_I2, "insert_i2", XREG, XREG, IREG)
+
 MINI_OP(OP_FCONV_TO_R8_X, "fconv_to_r8_x", XREG, FREG, NONE)
 MINI_OP(OP_XCONV_R8_TO_I4, "xconv_r8_to_i4", IREG, XREG, NONE)
 MINI_OP(OP_ICONV_TO_X, "iconv_to_x", XREG, IREG, NONE)
index e8107ba9177ef454e7cc8a4a697910af4f9d8683..161a47f8bafa85b243f09c403287e2453dd89012 100644 (file)
@@ -4038,7 +4038,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                x86_sse_alu_sd_membase_reg (code, X86_SSE_MOVSD_MEMBASE_REG, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, ins->sreg1);
                        x86_fld_membase (code, ins->backend.spill_var->inst_basereg, ins->backend.spill_var->inst_offset, TRUE);
                        break;
-                       
+
+               case OP_INSERT_I2:
+                       x86_sse_alu_pd_reg_reg_imm (code, X86_SSE_PINSRW, ins->sreg1, ins->sreg2, ins->inst_c0);
+                       break;
+
                case OP_STOREX_MEMBASE_REG:
                case OP_STOREX_MEMBASE:
                        x86_movups_membase_reg (code, ins->dreg, ins->inst_offset, ins->sreg1);
index fe7c6691828d845b140f70b97560d72a1ca92f8b..685d9b0fa264fb6977413d06da8c14894510471a 100644 (file)
@@ -66,6 +66,7 @@ without a OP_LDADDR.
 enum {
        SIMD_EMIT_BINARY,
        SIMD_EMIT_UNARY,
+       SIMD_EMIT_SETTER,
        SIMD_EMIT_GETTER,
        SIMD_EMIT_GETTER_QWORD,
        SIMD_EMIT_CTOR,
@@ -392,10 +393,6 @@ static const SimdIntrinsc vector8us_intrinsics[] = {
        { SN_op_Subtraction, OP_PSUBW, SIMD_EMIT_BINARY },
 };
 
-/*
-Missing:
-setters
- */
 static const SimdIntrinsc vector8s_intrinsics[] = {
        { SN_ctor, 0, SIMD_EMIT_CTOR },
        { SN_AddWithSaturation, OP_PADDW_SAT, SIMD_EMIT_BINARY },
@@ -436,6 +433,14 @@ static const SimdIntrinsc vector8s_intrinsics[] = {
        { SN_op_Multiply, OP_PMULW, SIMD_EMIT_BINARY },
        { SN_op_RightShift, OP_PSARW, SIMD_EMIT_SHIFT },
        { SN_op_Subtraction, OP_PSUBW, SIMD_EMIT_BINARY },
+       { SN_set_V0, 0, SIMD_EMIT_SETTER },
+       { SN_set_V1, 1, SIMD_EMIT_SETTER },
+       { SN_set_V2, 2, SIMD_EMIT_SETTER },
+       { SN_set_V3, 3, SIMD_EMIT_SETTER },
+       { SN_set_V4, 4, SIMD_EMIT_SETTER },
+       { SN_set_V5, 5, SIMD_EMIT_SETTER },
+       { SN_set_V6, 6, SIMD_EMIT_SETTER },
+       { SN_set_V7, 7, SIMD_EMIT_SETTER },
 };
 
 /*
@@ -584,6 +589,7 @@ apply_vreg_following_block_interference (MonoCompile *cfg, MonoInst *ins, int re
        }
        return FALSE;
 }
+
 /*
 This pass recalculate which vars need MONO_INST_INDIRECT.
 
@@ -702,8 +708,8 @@ mono_simd_simplify_indirection (MonoCompile *cfg)
                if (!(vreg_flags [var->dreg] & VREG_SINGLE_BB_USE))
                        continue;
                for (ins = target_bb [var->dreg]->code; ins; ins = ins->next) {
-                       /*We can, pretty much kill it.*/
-                       if (ins->dreg == var->dreg) {
+                       /*We can avoid inserting the XZERO if the first use doesn't depend on the zero'ed value.*/
+                       if (ins->dreg == var->dreg && ins->sreg1 != var->dreg && ins->sreg2 != var->dreg) {
                                break;
                        } else if (ins->sreg1 == var->dreg || ins->sreg2 == var->dreg) {
                                MonoInst *tmp;
@@ -881,6 +887,23 @@ mono_type_elements_shift_bits (MonoType *type)
 }
 
 
+static MonoInst*
+simd_intrinsic_emit_setter (const SimdIntrinsc *intrinsic, MonoCompile *cfg, MonoMethod *cmethod, MonoInst **args)
+{
+       MonoInst *ins;
+
+       MONO_INST_NEW (cfg, ins, OP_INSERT_I2);
+       ins->klass = cmethod->klass;
+       /*This is a partial load so we encode the dependency on the previous value by setting dreg and sreg1 to the same value.*/
+       ins->dreg = ins->sreg1 = load_simd_vreg (cfg, cmethod, args [0]);
+       ins->type = STACK_I4;
+       ins->sreg2 = args [1]->dreg;
+       ins->inst_c0 = intrinsic->opcode;
+       MONO_ADD_INS (cfg->cbb, ins);
+
+       return ins;
+}
+
 static MonoInst*
 simd_intrinsic_emit_getter (const SimdIntrinsc *intrinsic, MonoCompile *cfg, MonoMethod *cmethod, MonoInst **args)
 {
@@ -1175,6 +1198,8 @@ emit_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
                return simd_intrinsic_emit_binary (result, cfg, cmethod, args);
        case SIMD_EMIT_UNARY:
                return simd_intrinsic_emit_unary (result, cfg, cmethod, args);
+       case SIMD_EMIT_SETTER:
+               return simd_intrinsic_emit_setter (result, cfg, cmethod, args);
        case SIMD_EMIT_GETTER:
                return simd_intrinsic_emit_getter (result, cfg, cmethod, args);
        case SIMD_EMIT_GETTER_QWORD:
index 67a08b0e0368268a90624a2e2b385dafafadf819..17fb0a32e2a0c97b337055d1327cd4a3626a0df3 100644 (file)
@@ -36,6 +36,26 @@ SIMD_METHOD("get_V12", SN_get_V12)
 SIMD_METHOD("get_V13", SN_get_V13)
 SIMD_METHOD("get_V14", SN_get_V14)
 SIMD_METHOD("get_V15", SN_get_V15)
+SIMD_METHOD("set_W", SN_set_W)
+SIMD_METHOD("set_X", SN_set_X)
+SIMD_METHOD("set_Y", SN_set_Y)
+SIMD_METHOD("set_Z", SN_set_Z)
+SIMD_METHOD("set_V0", SN_set_V0)
+SIMD_METHOD("set_V1", SN_set_V1)
+SIMD_METHOD("set_V2", SN_set_V2)
+SIMD_METHOD("set_V3", SN_set_V3)
+SIMD_METHOD("set_V4", SN_set_V4)
+SIMD_METHOD("set_V5", SN_set_V5)
+SIMD_METHOD("set_V6", SN_set_V6)
+SIMD_METHOD("set_V7", SN_set_V7)
+SIMD_METHOD("set_V8", SN_set_V8)
+SIMD_METHOD("set_V9", SN_set_V9)
+SIMD_METHOD("set_V10", SN_set_V10)
+SIMD_METHOD("set_V11", SN_set_V11)
+SIMD_METHOD("set_V12", SN_set_V12)
+SIMD_METHOD("set_V13", SN_set_V13)
+SIMD_METHOD("set_V14", SN_set_V14)
+SIMD_METHOD("set_V15", SN_set_V15)
 SIMD_METHOD("HorizontalAdd", SN_HorizontalAdd)
 SIMD_METHOD("HorizontalSub", SN_HorizontalSub)
 SIMD_METHOD("InterleaveHigh", SN_InterleaveHigh)