Author: zhuqing
Date: 2011-02-28 05:13:47 -0500 (Mon, 28 Feb 2011)
New Revision: 3496
Modified:
trunk/osprey/be/cg/x8664/expand.cxx
Log:
Fix bug609. Implement multiply for type V8I1,M8I1,V16I1
Code Review: Sun Chan
Modified: trunk/osprey/be/cg/x8664/expand.cxx
===================================================================
--- trunk/osprey/be/cg/x8664/expand.cxx 2011-02-27 13:18:36 UTC (rev 3495)
+++ trunk/osprey/be/cg/x8664/expand.cxx 2011-02-28 10:13:47 UTC (rev 3496)
@@ -2176,7 +2176,7 @@
FmtAssert( MTYPE_is_integral(mtype) && !MTYPE_is_mmx_vector(mtype),
("Should be handled in Expand_Flop") );
- if ( mtype == MTYPE_V16I2 || mtype == MTYPE_V8I2 || mtype == MTYPE_V16I4 ) {
+ if ( mtype == MTYPE_V16I2 || mtype == MTYPE_V8I2 || mtype == MTYPE_V16I4 ||
mtype == MTYPE_V16I1) {
Expand_Flop( OPCODE_make_op(OPR_MPY, mtype, MTYPE_V),
result, src1, src2, NULL, ops );
return;
@@ -5949,6 +5949,83 @@
Expand_Complex_Divide(opcode, result, src1, src2, ops);
return;
+ case OPC_V8I1MPY:
+ case OPC_M8I1MPY:
+ {
+ TN* tmp_a = Build_TN_Like( src1 );
+ TN* tmp_b = Build_TN_Like( src1 );
+ TN* tmp_c = Build_TN_Like( src1 );
+ TN* tmp_d = Build_TN_Like( src1 );
+ TN* tmp_e = Build_TN_Like( src1 );
+ TN* tmp_f = Build_TN_Like( src1 );
+ TN* tmp_g = Build_TN_Like( src1 );
+ TN* tmp_h = Build_TN_Like( src1 );
+ TN* tmp_i = Build_TN_Like( src1 );
+
+ Exp_COPY(tmp_a, src1, ops);
+ Exp_COPY(tmp_c, src2, ops);
+
+ Build_OP(TOP_mov64_m, tmp_b, tmp_a, ops);
+ Build_OP(TOP_punpckhbw, tmp_b, tmp_b, tmp_a, ops);
+ Build_OP(TOP_mov64_m, tmp_d, tmp_c, ops);
+ Build_OP(TOP_punpckhbw, tmp_d, tmp_d, tmp_c, ops);
+ Build_OP(TOP_mov64_m, tmp_e, tmp_a, ops);
+ Build_OP(TOP_punpcklbw, tmp_e, tmp_e, tmp_a, ops);
+ Build_OP(TOP_mov64_m, tmp_f, tmp_c, ops);
+ Build_OP(TOP_punpcklbw, tmp_f, tmp_c, tmp_c, ops);
+ Build_OP(TOP_mov64_m, tmp_g, tmp_b, ops);
+ Build_OP(TOP_pmullw, tmp_g, tmp_g, tmp_d, ops);
+ Build_OP(TOP_pmullw, tmp_f, tmp_f, tmp_e, ops);
+ Build_OP(TOP_mov64_m, tmp_h, tmp_f, ops);
+ Build_OP(TOP_punpckhbw, tmp_h, tmp_h, tmp_g, ops);
+ Build_OP(TOP_punpcklbw, tmp_f, tmp_f, tmp_g, ops);
+ Build_OP(TOP_mov64_m, tmp_i, tmp_f, ops);
+ Build_OP(TOP_punpckhbw, tmp_i, tmp_i, tmp_h, ops);
+ Build_OP(TOP_punpcklbw, tmp_f, tmp_f, tmp_h, ops);
+ Build_OP(TOP_punpcklbw, result, tmp_f, tmp_i, ops);
+ }
+ return;
+
+ case OPC_V16I1MPY:
+ {
+ TN* tmp_a = Build_TN_Like( src1 );
+ TN* tmp_b = Build_TN_Like( src1 );
+ TN* tmp_c = Build_TN_Like( src1 );
+ TN* tmp_d = Build_TN_Like( src1 );
+ TN* tmp_e = Build_TN_Like( src1 );
+ TN* tmp_f = Build_TN_Like( src1 );
+ TN* tmp_g = Build_TN_Like( src1 );
+ TN* tmp_h = Build_TN_Like( src1 );
+ TN* tmp_i = Build_TN_Like( src1 );
+ TN* tmp_j = Build_TN_Like( src1 );
+
+ Exp_COPY(tmp_a, src1, ops);
+ Exp_COPY(tmp_c, src2, ops);
+
+ Build_OP(TOP_movdq, tmp_b, tmp_a, ops);
+ Build_OP(TOP_punpckhbw128, tmp_b, tmp_b, tmp_a, ops);
+ Build_OP(TOP_movdq, tmp_d, tmp_c, ops);
+ Build_OP(TOP_punpckhbw128, tmp_d, tmp_d, tmp_c, ops);
+ Build_OP(TOP_movdq, tmp_e, tmp_a, ops);
+ Build_OP(TOP_punpcklbw128, tmp_e, tmp_e, tmp_a, ops);
+ Build_OP(TOP_movdq, tmp_f, tmp_c, ops);
+ Build_OP(TOP_punpcklbw128, tmp_f, tmp_c, tmp_c, ops);
+ Build_OP(TOP_movdq, tmp_g, tmp_b, ops);
+ Build_OP(TOP_pmullw128, tmp_g, tmp_g, tmp_d, ops);
+ Build_OP(TOP_pmullw128, tmp_f, tmp_f, tmp_e, ops);
+ Build_OP(TOP_movdq, tmp_h, tmp_f, ops);
+ Build_OP(TOP_punpckhbw128, tmp_h, tmp_h, tmp_g, ops);
+ Build_OP(TOP_punpcklbw128, tmp_f, tmp_f, tmp_g, ops);
+ Build_OP(TOP_movdq, tmp_i, tmp_f, ops);
+ Build_OP(TOP_punpckhbw128, tmp_i, tmp_i, tmp_h, ops);
+ Build_OP(TOP_punpcklbw128, tmp_f, tmp_f, tmp_h, ops);
+ Build_OP(TOP_movdq, tmp_j, tmp_f, ops);
+ Build_OP(TOP_punpckhbw128, tmp_j, tmp_j, tmp_i, ops);
+ Build_OP(TOP_punpcklbw128, tmp_f, tmp_f, tmp_i, ops);
+ Build_OP(TOP_punpcklbw128, result, tmp_f, tmp_j, ops);
+ }
+ return;
+
default:
#pragma mips_frequency_hint NEVER
FmtAssert(FALSE, ("Unimplemented flop: %s", OPCODE_name(opcode)));
------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in
Real-Time with Splunk. Collect, index and harness all the fast moving IT data
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business
insights. http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel