Author: shenruifen Date: 2011-08-17 04:50:26 -0400 (Wed, 17 Aug 2011) New Revision: 3720
Modified: trunk/osprey/be/cg/SL/exp_divrem.cxx trunk/osprey/be/cg/tn.h trunk/osprey/be/cg/whirl2ops.cxx Log: Another patch for SL target based on version 3713 "fixed EBO phase BUG in -O1 with DBG compiler" Build_TN_of_Mtype is overwrote for emulated longlong and float point type. Approved by Sun Chan & wuyongchong Modified: trunk/osprey/be/cg/SL/exp_divrem.cxx =================================================================== --- trunk/osprey/be/cg/SL/exp_divrem.cxx 2011-08-17 06:37:34 UTC (rev 3719) +++ trunk/osprey/be/cg/SL/exp_divrem.cxx 2011-08-17 08:50:26 UTC (rev 3720) @@ -88,24 +88,6 @@ /* NOTREACHED */ } -extern void Add_TN_Pair(TN *key, TN *pair); - -TN *Build_TN_Of_Mtype_64(TYPE_ID mtype) -{ - TN *res; - TYPE_ID mtype_t; - BOOL is_double = MTYPE_is_size_double(mtype); - - if (is_double) { - mtype_t = (MTYPE_is_signed(mtype) ? MTYPE_I4 : MTYPE_U4); - res = Build_TN_Of_Mtype(mtype_t); - Add_TN_Pair(res, Build_TN_Of_Mtype(mtype_t)); - } else { - res = Build_TN_Of_Mtype(mtype); - } - return res; -} - /* Expand the sequence for division by a power of two. It is the * caller's job to verify that divisor is a non-zero power of two. */ @@ -125,11 +107,11 @@ else { INT64 absdvsr = dvsr < 0 ? -dvsr : dvsr; BOOL is_double = MTYPE_is_size_double(mtype); - TN *t1 = Build_TN_Of_Mtype_64(mtype); - TN *t2 = Build_TN_Of_Mtype_64(mtype); - TN *t3 = Build_TN_Of_Mtype_64(mtype); - TN *t4 = Build_TN_Of_Mtype_64(mtype); - TN *t5 = (dvsr < 0) ? Build_TN_Of_Mtype_64(mtype) : result; + TN *t1 = Build_TN_Of_Mtype(mtype); + TN *t2 = Build_TN_Of_Mtype(mtype); + TN *t3 = Build_TN_Of_Mtype(mtype); + TN *t4 = Build_TN_Of_Mtype(mtype); + TN *t5 = (dvsr < 0) ? Build_TN_Of_Mtype(mtype) : result; Expand_Shift(t1, numer, Gen_Literal_TN(is_double?63:31, 4), mtype, shift_aright, ops); Expand_Immediate (t2, Gen_Literal_TN (absdvsr - 1, is_double?8:4), mtype, ops); @@ -455,7 +437,7 @@ { BOOL is_double = MTYPE_is_size_double(mtype); INT n = Get_Power_Of_2(src2_val, mtype); - TN *con = Build_TN_Of_Mtype_64(mtype); + TN *con = Build_TN_Of_Mtype(mtype); Expand_Immediate(con, Gen_Literal_TN((1LL<<n)-1, is_double?8:4), mtype, ops); Is_True((MTYPE_is_integral(mtype)) , @@ -463,8 +445,8 @@ if (MTYPE_is_signed(mtype)) { - TN *tmp1 = Build_TN_Of_Mtype_64(mtype); - TN *tmp2 = Build_TN_Of_Mtype_64(mtype); + TN *tmp1 = Build_TN_Of_Mtype(mtype); + TN *tmp2 = Build_TN_Of_Mtype(mtype); // tmp1 = src1 >= 0 ? src1 : -src1; Expand_Abs (tmp1, src1, mtype, ops); @@ -476,8 +458,8 @@ // result = (src1 >= 0) ? tmp2 : -tmp2; int unsignedflag = !MTYPE_is_signed(mtype); if (is_double) { - TN *cond_tn = Build_TN_Of_Mtype_64(MTYPE_I4); - TN *tmp3 = Build_TN_Of_Mtype_64(mtype); + TN *cond_tn = Build_TN_Of_Mtype(MTYPE_I4); + TN *tmp3 = Build_TN_Of_Mtype(mtype); extern void Expand_Int_Greater_Equal (TN *dest, TN *src1, TN *src2, TYPE_ID mtype, OPS *ops); Expand_Int_Greater_Equal(cond_tn, src1, Zero_TN, mtype, ops); @@ -513,16 +495,16 @@ BOOL is_double = MTYPE_is_size_double(mtype); INT64 absval = src2_val < 0 ? -src2_val : src2_val; INT n = Get_Power_Of_2(absval, mtype); - TN *con = Build_TN_Of_Mtype_64(mtype); + TN *con = Build_TN_Of_Mtype(mtype); Expand_Immediate(con, Gen_Literal_TN((1LL<<n)-1, is_double?8:4), mtype, ops); if (MTYPE_is_signed(mtype) && src2_val < 0) { TN *tmp1, *tmp2; - tmp1 = Build_TN_Of_Mtype_64(mtype); + tmp1 = Build_TN_Of_Mtype(mtype); Expand_Neg(tmp1, src1, mtype, ops); - tmp2 = Build_TN_Of_Mtype_64(mtype); + tmp2 = Build_TN_Of_Mtype(mtype); Expand_Binary_And(tmp2, tmp1, con, mtype, ops); Expand_Neg(result, tmp2, mtype, ops); Modified: trunk/osprey/be/cg/tn.h =================================================================== --- trunk/osprey/be/cg/tn.h 2011-08-17 06:37:34 UTC (rev 3719) +++ trunk/osprey/be/cg/tn.h 2011-08-17 08:50:26 UTC (rev 3720) @@ -873,8 +873,39 @@ inline TN *Build_TN_Of_Mtype(TYPE_ID mtype) { - ISA_REGISTER_CLASS rc = Register_Class_For_Mtype(mtype); - return Gen_Register_TN (rc, MTYPE_RegisterSize(mtype) ); + ISA_REGISTER_CLASS rc; // register class + INT rs; // register size +#ifdef TARG_SL + extern void Create_TN_Pair(TN* key, TN* pair); +#ifdef EMULATE_LONGLONG + if (mtype == MTYPE_I8 || mtype == MTYPE_U8) { + TYPE_ID new_mtype = (mtype == MTYPE_I8 ? MTYPE_I4 : MTYPE_U4); + rc = Register_Class_For_Mtype(new_mtype); + rs = MTYPE_RegisterSize(new_mtype); + TN *tn1 = Gen_Register_TN (rc, rs); + TN *tn2 = Gen_Register_TN (rc, rs); + Create_TN_Pair (tn1, tn2); + return tn1; + } +#endif +#ifdef EMULATE_FLOAT_POINT + if (mtype == MTYPE_F8) { + rc = Register_Class_For_Mtype(MTYPE_U4); + rs = MTYPE_RegisterSize(MTYPE_U4); + TN *tn1 = Gen_Register_TN (rc, rs); + TN *tn2 = Gen_Register_TN (rc, rs); + Create_TN_Pair (tn1, tn2); + return tn1; + } else if (mtype = MTYPE_F4) { + rc = Register_Class_For_Mtype(MTYPE_U4); + rs = MTYPE_RegisterSize(MTYPE_U4); + return Gen_Register_TN (rc, rs); + } +#endif +#endif + rc = Register_Class_For_Mtype(mtype); + rs = MTYPE_RegisterSize(mtype); + return Gen_Register_TN (rc, rs); } extern TN *Dup_TN ( TN *tn ); /* Duplicate an existing TN */ Modified: trunk/osprey/be/cg/whirl2ops.cxx =================================================================== --- trunk/osprey/be/cg/whirl2ops.cxx 2011-08-17 06:37:34 UTC (rev 3719) +++ trunk/osprey/be/cg/whirl2ops.cxx 2011-08-17 08:50:26 UTC (rev 3720) @@ -919,7 +919,6 @@ } - /* Create a new result TN for the WHIRL node wn. We pass in the opnd_tn * array that contains the TNs allocated for each operand. This could * used to do value numbering if desired. @@ -931,35 +930,11 @@ Allocate_Result_TN (WN *wn, TN **opnd_tn) { #ifdef TARG_SL + return Build_TN_Of_Mtype(WN_rtype(wn)); +#else #ifdef EMULATE_LONGLONG - TYPE_ID mtype = WN_rtype(wn); - if (MTYPE_is_longlong(mtype)) { - TYPE_ID new_mtype = (mtype == MTYPE_I8 ? MTYPE_I4 : MTYPE_U4); - TN *tn = Build_TN_Of_Mtype (new_mtype); - TN *tn2 = Build_TN_Of_Mtype (new_mtype); - Add_TN_Pair (tn, tn2); - return tn; - } -#endif -#ifdef EMULATE_FLOAT_POINT - if (mtype == MTYPE_F8) { - TN *tn = Build_TN_Of_Mtype(MTYPE_U4); - TN *pair = Build_TN_Of_Mtype(MTYPE_U4); - Add_TN_Pair (tn, pair); - return tn; - } else if (mtype = MTYPE_F4) { - return Build_TN_Of_Mtype(MTYPE_U4); - } -#endif - - return Build_TN_Of_Mtype (mtype); - -#else // !defined(TARG_SL) - -#ifdef EMULATE_LONGLONG - TYPE_ID mtype = WN_rtype(wn); if (mtype == MTYPE_I8 || mtype == MTYPE_U8) { TYPE_ID new_mtype = (mtype == MTYPE_I8 ? MTYPE_I4 : MTYPE_U4); @@ -1301,27 +1276,6 @@ } else { tn = Build_TN_Of_Mtype (mtype); } -#elif defined(TARG_SL) - -#ifdef EMULATE_LONGLONG - if (mtype == MTYPE_I8 || mtype == MTYPE_U8) { - mtype = (mtype == MTYPE_I8 ? MTYPE_I4 : MTYPE_U4); - tn = Build_TN_Of_Mtype(mtype); - Add_TN_Pair(tn, Build_TN_Of_Mtype(mtype)); - } else -#endif - -#ifdef EMULATE_FLOAT_POINT - if (mtype == MTYPE_F8) { - TN* pair = Build_TN_Of_Mtype(MTYPE_U4); - tn = Build_TN_Of_Mtype(MTYPE_U4); - Add_TN_Pair(tn, pair); - } else if (mtype == MTYPE_F4) { - tn = Build_TN_Of_Mtype(MTYPE_U4); - } else -#endif - tn = Build_TN_Of_Mtype (mtype); - #else #ifdef TARG_X8664 if( OP_NEED_PAIR(mtype) ){ @@ -2898,9 +2852,9 @@ // for U8STBITS // allocate a larger TN if bit deposit may run out of range if(MTYPE_byte_size(rtype) > MTYPE_byte_size(WN_rtype(kid))) - field_tn = Build_TN_Of_Mtype (rtype); + field_tn = Build_TN_Of_Mtype(rtype); else - field_tn = Allocate_Result_TN (kid, NULL); + field_tn = Allocate_Result_TN(kid, NULL); Last_Mem_OP = OPS_last(&New_OPs); Exp_Load(rtype, desc, field_tn, WN_st(stbits), WN_load_offset(stbits), &New_OPs, variant); // must do an unsigned load @@ -2909,9 +2863,9 @@ // for U8STBITS // allocate a larger TN if bit deposit may run out of range if(MTYPE_byte_size(rtype) > MTYPE_byte_size(WN_rtype(kid))) - result = Build_TN_Of_Mtype (rtype); + result = Build_TN_Of_Mtype(rtype); else - result = Allocate_Result_TN (kid, NULL); + result = Allocate_Result_TN(kid, NULL); } #ifdef TARG_PPC32 @@ -3126,11 +3080,11 @@ // for U8ISTBITS // allocate larger TNs if bit deposit may run out of range if(MTYPE_byte_size(rtype) > MTYPE_byte_size(WN_rtype(kid0))) { - result = Build_TN_Of_Mtype (rtype); - field_tn = Build_TN_Of_Mtype (rtype); + result = Build_TN_Of_Mtype(rtype); + field_tn = Build_TN_Of_Mtype(rtype); }else{ - result = Allocate_Result_TN (kid0, NULL); - field_tn = Allocate_Result_TN (kid0, NULL); + result = Allocate_Result_TN(kid0, NULL); + field_tn = Allocate_Result_TN(kid0, NULL); } // guard against U1MPY or U2MPY ------------------------------------------------------------------------------ Get a FREE DOWNLOAD! and learn more about uberSVN rich system, user administration capabilities and model configuration. Take the hassle out of deploying and managing Subversion and the tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel