Author: zhuqing
Date: 2010-09-01 01:55:28 -0400 (Wed, 01 Sep 2010)
New Revision: 3332

Modified:
   trunk/osprey/wgen/wgen_expr.cxx
Log:
add intrinsic for _mm_extract_pi16

Modified: trunk/osprey/wgen/wgen_expr.cxx
===================================================================
--- trunk/osprey/wgen/wgen_expr.cxx     2010-09-01 05:42:02 UTC (rev 3331)
+++ trunk/osprey/wgen/wgen_expr.cxx     2010-09-01 05:55:28 UTC (rev 3332)
@@ -3967,7 +3967,29 @@
     case GSBI_IX86_BUILTIN_VEC_EXT_V4SI:
       *iopc = INTRN_VEC_EXT_V2SI;
       break;
-    case GSBI_IX86_BUILTIN_VEC_EXT_V2DI:
+    case GSBI_IX86_BUILTIN_VEC_EXT_V4HI:
+      //add intrinsic for _mm_extract_pi16
+      if (WN_operator(arg1) != OPR_INTCONST)
+      Fail_FmtAssertion ("selector must be an integer constant in the range 
0..3");
+     switch (WN_const_val(arg1)){
+     case 0:
+       *iopc = INTRN_PEXTRW0;
+       break;
+     case 1:
+        *iopc = INTRN_PEXTRW1;
+       break;
+     case 2:
+       *iopc = INTRN_PEXTRW2;
+       break;
+     case 3:
+       *iopc = INTRN_PEXTRW3;
+       break;
+     default:
+       Fail_FmtAssertion ("selector must be an integer constant in the range 
0..3" );
+       }
+     break;
+ 
+   case GSBI_IX86_BUILTIN_VEC_EXT_V2DI:
       *iopc = INTRN_VEC_EXT_V2SI;
       break;
     case GSBI_IX86_BUILTIN_VEC_EXT_V2DF:
@@ -9294,7 +9316,18 @@
            for (i = 0, list = gs_tree_operand (exp, 1);
                 list;
                 i++, list = gs_tree_chain (list)) {
-              arg_wn     = WGEN_Expand_Expr (gs_tree_value (list));
+             //if intrinsic equals _mm_extract_pi16, 
+             //the second param is fixed to const 0,1,2,3, so 
+             //there is no need to generate the second arg node.
+             if (i ==1 && (iopc == INTRN_PEXTRW0 ||
+                           iopc == INTRN_PEXTRW1 ||
+                           iopc == INTRN_PEXTRW2 ||
+                           iopc == INTRN_PEXTRW3)) {
+               num_args = 1;
+               break;
+             }  
+              arg_wn = WGEN_Expand_Expr (gs_tree_value (list));
+             
 #ifdef KEY // bug 11286
              if (i == 1 && TARGET_64BIT &&
                  (gs_decl_function_code(func) == GSBI_BUILT_IN_POWI ||


------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to