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
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel