Author: dcoakley Date: 2011-07-05 19:09:12 -0400 (Tue, 05 Jul 2011) New Revision: 3680
Modified: trunk/osprey/be/cg/x8664/expand.cxx Log: Suport vector shift instructions for x8664: sal, sll, srl. Approved by: Jian-Xin Lai Modified: trunk/osprey/be/cg/x8664/expand.cxx =================================================================== --- trunk/osprey/be/cg/x8664/expand.cxx 2011-07-05 22:08:23 UTC (rev 3679) +++ trunk/osprey/be/cg/x8664/expand.cxx 2011-07-05 23:09:12 UTC (rev 3680) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright (C) 2009-2011 Advanced Micro Devices, Inc. All Rights Reserved. */ /* @@ -1834,71 +1834,96 @@ void Expand_Shift (TN *result, TN *src1, TN *src2, TYPE_ID mtype, SHIFT_DIRECTION kind, OPS *ops) { + const TOP shift_top[ 6 /* mtypes */ ][ 3 /* kind */ ] = { + { TOP_shl32, TOP_sar32, TOP_shr32 }, /* 32bit int */ + { TOP_shl64, TOP_sar64, TOP_shr64 }, /* 64bit int */ + { TOP_UNDEFINED, TOP_UNDEFINED, TOP_UNDEFINED }, /* V16I1 */ + { TOP_psllw, TOP_psraw, TOP_psrlw }, /* V16I2 */ + { TOP_pslld, TOP_psrad, TOP_psrld }, /* V16I4 */ + { TOP_psllq, TOP_UNDEFINED, TOP_psrlq }, /* V16I8 */ + }; + const TOP shift_imm_top[ 6 /* mtypes */ ][ 3 /* kind */ ] = { + { TOP_shli32, TOP_sari32, TOP_shri32 }, /* 32bit int */ + { TOP_shli64, TOP_sari64, TOP_shri64 }, /* 64bit int */ + { TOP_UNDEFINED, TOP_UNDEFINED, TOP_UNDEFINED }, /* V16I1 */ + { TOP_psllwi, TOP_psrawi, TOP_psrlwi }, /* V16I2 */ + { TOP_pslldi, TOP_psradi, TOP_psrldi }, /* V16I4 */ + { TOP_psllqi, TOP_UNDEFINED, TOP_psrlqi }, /* V16I8 */ + }; + WN *tree; TOP top; + const BOOL is_vector = MTYPE_is_vector(mtype); const BOOL is_64bit = MTYPE_is_size_double(mtype); - if (TN_is_constant(src1)) + INT kind_index = 0; + switch (kind) { + case shift_left: + kind_index = 0; + break; + case shift_aright: + kind_index = 1; + break; + case shift_lright: + kind_index = 2; + break; + default: + FmtAssert(FALSE, ("invalid shift kind")); + } + + INT type_index = 0; + UINT8 shift_amt = 0; + switch (mtype) { + case MTYPE_V16I1: + type_index = 2; + shift_amt = 7; + break; + case MTYPE_V16I2: + type_index = 3; + shift_amt = 15; + break; + case MTYPE_V16I4: + type_index = 4; + shift_amt = 31; + break; + case MTYPE_V16I8: + type_index = 5; + shift_amt = 63; + break; + default: + FmtAssert(is_vector == FALSE, ("NYI: support vector type other than V16I*")); + type_index = is_64bit ? 1 : 0; + shift_amt = is_64bit ? 63 : 31; + } + + if (TN_is_constant(src1)) { + FmtAssert(is_vector == FALSE, ("TODO: handle vector immediate")); src1 = Expand_Immediate_Into_Register(src1, is_64bit, ops); + } if (TN_has_value(src2)) { // In mips, only the low log2(wordsize) bits of the shift count are used. const UINT64 val = TN_value(src2); - const UINT8 shift_amt = is_64bit ? 63 : 31; FmtAssert( val <= shift_amt, ("Shift amount > %d", shift_amt) ); - - switch (kind) { - case shift_left: - if( val == 1 ){ - Expand_Add( result, src1, src1, mtype, ops ); - return; - } - - top = is_64bit ? TOP_shli64 : TOP_shli32; - break; - case shift_aright: - top = is_64bit ? TOP_sari64 : TOP_sari32; - break; - case shift_lright: - top = is_64bit ? TOP_shri64 : TOP_shri32; - break; + if (kind == shift_left && val == 1) { + Expand_Add( result, src1, src1, mtype, ops ); + return; } + top = shift_imm_top[type_index][kind_index]; src2 = Gen_Literal_TN( val & shift_amt, 4 ); } else { - switch (kind) { - case shift_left: - top = is_64bit ? TOP_shl64 : TOP_shl32; - break; - case shift_aright: - top = is_64bit ? TOP_sar64 : TOP_sar32; - break; - case shift_lright: - top = is_64bit ? TOP_shr64 : TOP_shr32; - break; - } + top = shift_top[type_index][kind_index]; } + FmtAssert(top != TOP_UNDEFINED, ("NYI: Expand Shift: mtype=%d, kind=%d", mtype, kind)); - switch(mtype) { - case MTYPE_V16I1: - if (kind == shift_left) - Build_OP(TOP_psllw, result, src1, src2, ops); break; - case MTYPE_V16I2: - if (kind == shift_left) - Build_OP(TOP_psllw, result, src1, src2, ops); break; - case MTYPE_V16I4: - if (kind == shift_left) - Build_OP(TOP_pslld, result, src1, src2, ops); break; - case MTYPE_V16I8: - if (kind == shift_left) - Build_OP(TOP_psllq, result, src1, src2, ops); break; - default: - if( OP_NEED_PAIR( mtype ) ) - Expand_Split_Shift( kind, result, src1, src2, ops ); - else - Build_OP(top, result, src1, src2, ops); + if( OP_NEED_PAIR( mtype ) ) { + Is_True(is_vector == FALSE, ("vector types do not need pair")); + Expand_Split_Shift( kind, result, src1, src2, ops ); } + else + Build_OP(top, result, src1, src2, ops); } void @@ -7563,8 +7588,12 @@ Build_OP( TOP_extr128v64, result, op0, op1, ops); break; case INTRN_EXTRPS: - Build_OP( TOP_fextr128v32, result, op0, op1, ops); - break; + { + TN* res = Build_TN_Of_Mtype(MTYPE_I4); + Build_OP( TOP_fextr128v32, res, op0, op1, ops); + Build_OP(TOP_movg2x, result, res, ops); + break; + } case INTRN_EXTRPD: FmtAssert(FALSE, ("TODO: support fextr128v64")); break; ------------------------------------------------------------------------------ All of the data generated in your IT infrastructure is seriously valuable. Why? It contains a definitive record of application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-d2d-c2 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel