Author: shivaram Date: 2012-05-03 07:53:10 -0400 (Thu, 03 May 2012) New Revision: 3924
Modified: trunk/osprey/be/cg/x8664/expand.cxx trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx Log: Fix for bug 972. movlhps and movhlps opcode properties are corrected. Code Review by Sun Chan Modified: trunk/osprey/be/cg/x8664/expand.cxx =================================================================== --- trunk/osprey/be/cg/x8664/expand.cxx 2012-05-02 03:38:26 UTC (rev 3923) +++ trunk/osprey/be/cg/x8664/expand.cxx 2012-05-03 11:53:10 UTC (rev 3924) @@ -5984,7 +5984,11 @@ Build_OP(TOP_shufpd, tmp26, tmp25, tmp25, Gen_Literal_TN(1, 1), ops); Build_OP(TOP_fdiv128v64, tmp27, tmp26, tmp24, ops); Build_OP(TOP_cvtpd2ps, tmp28, tmp27, ops); - Build_OP(TOP_movlhps, result, tmp28, ops); + if (Is_Target_Orochi() && Is_Target_AVX()) { + Build_OP(TOP_movlhps, result, result, tmp28, ops); + } else { + Build_OP(TOP_movlhps, result, tmp28, ops); + } } Set_OP_cond_def_kind( OPS_last(ops), OP_ALWAYS_COND_DEF ); @@ -6726,10 +6730,11 @@ case OPC_V16F8V16F8SHUFFLE: if (Is_Target_Orochi() && Is_Target_AVX()) { Build_OP(TOP_movhlps, result, op1, op1, ops); + Build_OP(TOP_movlhps, result, result, op1, ops); } else { Build_OP(TOP_movhlps, result, op1, ops); + Build_OP(TOP_movlhps, result, op1, ops); } - Build_OP(TOP_movlhps, result, op1, ops); Set_OP_cond_def_kind( OPS_last(ops), OP_ALWAYS_COND_DEF ); break; case OPC_V16I2V16I2SHUFFLE: @@ -6738,10 +6743,11 @@ TN* tmp2 = Build_TN_Like(result); if (Is_Target_Orochi() && Is_Target_AVX()) { Build_OP(TOP_movhlps, tmp1, op1, op1, ops); + Build_OP(TOP_movlhps, tmp1, tmp1, op1, ops); } else { Build_OP(TOP_movhlps, tmp1, op1, ops); + Build_OP(TOP_movlhps, tmp1, op1, ops); } - Build_OP(TOP_movlhps, tmp1, op1, ops); Set_OP_cond_def_kind( OPS_last(ops), OP_ALWAYS_COND_DEF ); Build_OP(TOP_pshuflw, tmp2, tmp1, Gen_Literal_TN(0x1B, 1), ops); Build_OP(TOP_pshufhw, result, tmp2, Gen_Literal_TN(0x1B, 1), ops); @@ -8071,10 +8077,24 @@ Build_OP( TOP_movsd, result, op0, op1, ops ); break; case INTRN_MOVHLPS: - Build_OP( TOP_movhlps, result, op0, op1, ops ); + if (Is_Target_Orochi() && Is_Target_AVX()) { + Build_OP( TOP_movhlps, result, op0, op1, ops ); + } else { + // do packing of op1[2] op1[3] op0[2] op0[3] in result + Build_OP(TOP_shufps, result, op0, op1, Gen_Literal_TN(187, 1), ops); + // reverse fields to get op0[3] op0[2] op1[3] op1[2] + Build_OP(TOP_shufps, result, result, result, Gen_Literal_TN(27, 1), ops); + } + break; case INTRN_MOVLHPS: - Build_OP( TOP_movlhps, result, op0, op1, ops ); + if (Is_Target_Orochi() && Is_Target_AVX()) { + Build_OP( TOP_movlhps, result, op0, op1, ops ); + } else { + // do packing of op1[1] op1[0] op0[1] op0[0] in result + Build_OP(TOP_shufps, result, op0, op1, Gen_Literal_TN(68, 1), ops); + } + break; case INTRN_UNPCKHPS: Build_OP( TOP_unpckhps, result, op0, op1, ops ); Modified: trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx 2012-05-02 03:38:26 UTC (rev 3923) +++ trunk/osprey/common/targ_info/isa/x8664/isa_operands.cxx 2012-05-03 11:53:10 UTC (rev 3924) @@ -1194,6 +1194,7 @@ TOP_vfminsd, TOP_vfminss, TOP_vmovhlps, + TOP_vmovlhps, TOP_vfmul128v64, TOP_vfmul128v32, TOP_vmulsd, @@ -4570,7 +4571,6 @@ Operand(3, uimm8, opnd2); Instruction_Group("move-high-low", - TOP_vmovlhps, TOP_movlhps, TOP_movhlps, TOP_UNDEFINED); Modified: trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx =================================================================== --- trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx 2012-05-02 03:38:26 UTC (rev 3923) +++ trunk/osprey/common/targ_info/isa/x8664/isa_print.cxx 2012-05-03 11:53:10 UTC (rev 3924) @@ -1525,16 +1525,6 @@ TOP_UNDEFINED ); /* dest=op(src1, src2), non-x86-style */ - ISA_PRINT_TYPE vropspec = ISA_Print_Type_Create("vropspec", "%s %s,%s,%s"); - Name(); - Operand(0); - Result(0); - Result(0); - Instruction_Print_Group( vropspec, - TOP_vmovlhps, - TOP_UNDEFINED ); - - /* dest=op(src1, src2), non-x86-style */ ISA_PRINT_TYPE vropop = ISA_Print_Type_Create("vropop", "%s %s,%s,%s"); Name(); Operand(1); @@ -1640,6 +1630,7 @@ TOP_vpmaddwd, TOP_vpmaddubsw128, TOP_vmovhlps, + TOP_vmovlhps, TOP_vmovsd, TOP_vmovss, TOP_vmaxs128v8, ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel