00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "opt_cvtl_rule.h"
00047 #include "wn.h"
00048
00049 #define nop {NOT_AT_ALL,OPCODE_LAST+1}
00050 #define I8I4 {NEED_CVT, OPC_I8I4CVT}
00051 #define U8I4 {NEED_CVT, OPC_U8I4CVT}
00052 #define I4I8 {NEED_CVT, OPC_I4I8CVT}
00053 #define U4I8 {NEED_CVT, OPC_U4I8CVT}
00054 #define I8U4 {NEED_CVT, OPC_I8U4CVT}
00055 #define U8U4 {NEED_CVT, OPC_U8U4CVT}
00056 #define I4U8 {NEED_CVT, OPC_I4U8CVT}
00057 #define U4U8 {NEED_CVT, OPC_U4U8CVT}
00058
00059 #define I4I2 {NEED_CVTL, OPC_I4CVTL}
00060 #define I4I1 {NEED_CVTL, OPC_I4CVTL}
00061 #define U4U2 {NEED_CVTL, OPC_U4CVTL}
00062 #define U4U1 {NEED_CVTL, OPC_U4CVTL}
00063 #define I4U4 {NEED_CVTL, OPC_U4CVTL}
00064 #define U4I4 {NEED_CVTL, OPC_I4CVTL}
00065 #define I8I2 {NEED_CVTL, OPC_I8CVTL}
00066 #define I8I1 {NEED_CVTL, OPC_I8CVTL}
00067 #define U8U2 {NEED_CVTL, OPC_U8CVTL}
00068 #define U8U1 {NEED_CVTL, OPC_U8CVTL}
00069
00070 #define I1I4 {NEED_CVTL, OPC_I4CVTL}
00071 #define I2I4 {NEED_CVTL, OPC_I4CVTL}
00072 #define I1I8 {NEED_CVTL, OPC_I8CVTL}
00073 #define I2I8 {NEED_CVTL, OPC_I8CVTL}
00074 #define U1U4 {NEED_CVTL, OPC_U4CVTL}
00075 #define U2U4 {NEED_CVTL, OPC_U4CVTL}
00076 #define U1U8 {NEED_CVTL, OPC_U8CVTL}
00077 #define U2U8 {NEED_CVTL, OPC_U8CVTL}
00078
00079 #define I4B {NEED_CVT, OPC_I4BCVT}
00080 #define I8B {NEED_CVT, OPC_I8BCVT}
00081 #define U4B {NEED_CVT, OPC_U4BCVT}
00082 #define U8B {NEED_CVT, OPC_U8BCVT}
00083
00084
00085
00086
00087
00088 static struct cvt_rule {
00089 char _cvt_kind;
00090 mINT32 _cvt_opcode;
00091 } cvt_rule[MTYPE_U8+1][MTYPE_U8+1] = {
00092
00093 { nop, nop, nop, nop, nop, nop, nop, nop, nop, nop},
00094 { nop, nop, nop, nop, nop, nop, nop, nop, nop, nop},
00095 { nop, nop, nop, nop,I1I4,I1I8, nop, nop,I1I4,I1I8},
00096 { nop, nop, nop, nop,I2I4,I2I8, nop, nop,I2I4,I1I8},
00097 { nop, I4B,I4I1,I4I2, nop,I4I8, nop, nop, nop,I4U8},
00098 #ifdef TARG_MIPS
00099 { nop, nop,I8I1,I8I2, nop, nop, nop, nop,I8U4, nop},
00100 #elif defined(TARG_IA32)
00101 { nop, nop,I8I1,I8I2,I8I4, nop, nop, nop,I8U4, nop},
00102 #else
00103 { nop, I8B,I8I1,I8I2,I8I4, nop, nop, nop, nop, nop},
00104 #endif
00105 { nop, nop, nop, nop,U1U4,U1U8, nop, nop,U1U4,U1U8},
00106 { nop, nop, nop, nop,U2U4,U2U8, nop, nop,U2U4,U2U8},
00107 { nop, U4B, nop, nop, nop,U4I8,U4U1,U4U2, nop,U4U8},
00108 #ifdef TARG_MIPS
00109 { nop, nop, nop, nop, nop, nop,U8U1,U8U2,U8U4, nop}
00110 #elif defined(TARG_IA32)
00111 { nop, nop, nop, nop,U8I4, nop,U8U1,U8U2,U8U4, nop}
00112 #else
00113 { nop, U8B, nop, nop,U8I4, nop,U8U1,U8U2, nop, nop}
00114 #endif
00115 };
00116
00117
00118
00119
00120 INT Need_type_conversion(TYPE_ID from_ty, TYPE_ID to_ty, OPCODE *opc)
00121 {
00122 if (!(MTYPE_is_integral(from_ty) && MTYPE_is_integral(to_ty))) {
00123 if (from_ty == to_ty) return NOT_AT_ALL;
00124 if (opc != NULL)
00125 *opc = OPCODE_make_op(OPR_CVT, to_ty, from_ty);
00126 return NEED_CVT;
00127 }
00128
00129 if (opc != NULL)
00130 *opc = (OPCODE)cvt_rule[to_ty][from_ty]._cvt_opcode;
00131 return (INT)cvt_rule[to_ty][from_ty]._cvt_kind;
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 INT Need_load_type_conversion(BOOL source_sign_extd, BOOL target_sign_extd,
00178 TYPE_ID to_ty, TYPE_ID dsc_ty, OPCODE *opc)
00179 {
00180
00181 Is_True(MTYPE_is_integral(to_ty),("Need_load_type_conversion: non integral type"));
00182 Is_True(to_ty != MTYPE_BS,("Need_load_type_conversion: illegal MTYPE_BS"));
00183 Is_True(MTYPE_size_min(to_ty)>=MTYPE_size_min(MTYPE_I4),
00184 ("Need_load_type_conversion: data type size less than I4"));
00185
00186 if (source_sign_extd == target_sign_extd ||
00187 MTYPE_size_min(dsc_ty) > MTYPE_size_min(MTYPE_I4) && dsc_ty != MTYPE_BS)
00188 return NOT_AT_ALL;
00189
00190 if (MTYPE_size_min(dsc_ty) == MTYPE_size_min(MTYPE_I4) &&
00191 dsc_ty != MTYPE_BS) {
00192 if (source_sign_extd) {
00193 *opc = (OPCODE) OPC_U8U4CVT;
00194 } else {
00195 *opc = (OPCODE) OPC_U4U8CVT;
00196 }
00197 return NEED_CVT;
00198 }
00199 else {
00200 if (source_sign_extd) {
00201 *opc = (OPCODE) (MTYPE_size_min(to_ty) == MTYPE_size_min(MTYPE_I4)) ?
00202 OPC_U4CVTL : OPC_U8CVTL;
00203 } else {
00204 *opc = (OPCODE) (MTYPE_size_min(to_ty) == MTYPE_size_min(MTYPE_I4)) ?
00205 OPC_I4CVTL : OPC_I8CVTL;
00206 }
00207 return NEED_CVTL;
00208 }
00209
00210 }
00211
00212
00213 BOOL
00214 Types_are_compatible(TYPE_ID lhs_type, TYPE_ID rhs_type)
00215 {
00216 BOOL compatible;
00217 OPCODE opc;
00218
00219 if ((MTYPE_type_class(rhs_type)&MTYPE_CLASS_UNSIGNED_INTEGER) == 0 ||
00220 (MTYPE_type_class(lhs_type)&MTYPE_CLASS_UNSIGNED_INTEGER) == 0) {
00221 if (rhs_type == lhs_type) return FALSE;
00222 else
00223 return TRUE;
00224 }
00225 compatible = Need_type_conversion(rhs_type, lhs_type, &opc) != NEED_CVT;
00226 return compatible;
00227 }
00228
00229
00230 BOOL
00231 Types_are_compatible(TYPE_ID lhs_type, WN *rhs_wn)
00232 {
00233 TYPE_ID rhs_type = Actual_result_type(rhs_wn);
00234
00235 return Types_are_compatible(lhs_type, rhs_type);
00236 }
00237
00238
00239
00240 TYPE_ID Rebuild_rtype(TYPE_ID rtype, INT bits)
00241 {
00242 if ( rtype == MTYPE_I4 || rtype == MTYPE_I8 ) {
00243 if ( bits <= 8 )
00244 rtype = MTYPE_I1;
00245 else if ( bits <= 16 )
00246 rtype = MTYPE_I2;
00247 else if ( bits <= 32 )
00248 rtype = MTYPE_I4;
00249 else
00250 rtype = MTYPE_I8;
00251 }
00252 else {
00253 if ( bits <= 8 )
00254 rtype = MTYPE_U1;
00255 else if ( bits <= 16 )
00256 rtype = MTYPE_U2;
00257 else if ( bits <= 32 )
00258 rtype = MTYPE_U4;
00259 else
00260 rtype = MTYPE_U8;
00261 }
00262 return rtype;
00263 }
00264
00265
00266
00267
00268 INT Actual_data_size(WN *wn)
00269 {
00270 OPERATOR opr = WN_operator(wn);
00271 TYPE_ID rtype = WN_rtype(wn);
00272 INT actual_size;
00273
00274 if ((MTYPE_type_class(rtype) & MTYPE_CLASS_INTEGER) == 0)
00275 return MTYPE_size_min(rtype);
00276
00277 switch ( opr ) {
00278 case OPR_INTCONST:
00279 {
00280 INT64 val;
00281 for (val = WN_const_val(wn), actual_size = 0;
00282 actual_size < 64 && val != 0; actual_size++)
00283 val = val >> 1;
00284 if (MTYPE_is_integral(rtype) && !MTYPE_is_unsigned(rtype) && MTYPE_size_min(rtype) == actual_size) {
00285
00286 actual_size = MTYPE_size_min(Pointer_type);
00287 }
00288 return actual_size;
00289 }
00290
00291 case OPR_CVTL:
00292 if (MTYPE_is_signed(rtype)) {
00293 actual_size = Actual_data_size(WN_kid0(wn));
00294 if (MTYPE_size_min(rtype) == actual_size)
00295 return actual_size;
00296 else
00297 return WN_cvtl_bits(wn);
00298 }
00299 else
00300 return WN_cvtl_bits(wn);
00301
00302 case OPR_LDBITS:
00303 case OPR_ILDBITS:
00304 if (MTYPE_is_signed(rtype))
00305 return MTYPE_size_min(rtype);
00306 else
00307 return WN_bit_size (wn);
00308
00309 case OPR_LDID:
00310 case OPR_ILOAD:
00311 if (MTYPE_is_signed(rtype))
00312 return MTYPE_size_min(rtype);
00313 else
00314 return MTYPE_size_min(WN_desc(wn));
00315
00316 case OPR_BAND:
00317 case OPR_BIOR:
00318 {
00319 INT kid0_size = Actual_data_size(WN_kid0(wn));
00320 INT kid1_size = Actual_data_size(WN_kid1(wn));
00321 if (MTYPE_is_unsigned(rtype)) {
00322 if (opr == OPR_BIOR)
00323 return (kid0_size > kid1_size)? kid0_size : kid1_size;
00324 else return (kid0_size > kid1_size)? kid1_size : kid0_size;
00325 }
00326 else return MTYPE_size_min(rtype);
00327 }
00328
00329 case OPR_SHL:
00330 case OPR_ASHR:
00331 case OPR_LSHR:
00332 {
00333
00334 WN *bits = WN_kid1(wn);
00335
00336
00337 if ( WN_operator(bits) == OPR_INTCONST ) {
00338 UINT bit_cnt = WN_const_val(bits);
00339 if (MTYPE_size_min(rtype) == 32)
00340 bit_cnt &= 0x1F;
00341 else
00342 bit_cnt &= 0x3F;
00343
00344 actual_size = Actual_data_size(WN_kid0(wn));
00345 if (opr == OPR_SHL) {
00346 if (MTYPE_is_unsigned(rtype)) {
00347 actual_size += bit_cnt;
00348 if (actual_size > MTYPE_size_min(rtype))
00349 actual_size = MTYPE_size_min(rtype);
00350 }
00351 else actual_size = MTYPE_size_min(rtype);
00352 }
00353 else if (MTYPE_is_unsigned(rtype)) {
00354 actual_size -= bit_cnt;
00355 if (actual_size < 0) actual_size = 0;
00356 }
00357 else actual_size = MTYPE_size_min(rtype);
00358 return actual_size;
00359 }
00360 }
00361 break;
00362 default:
00363 ;
00364 }
00365 return MTYPE_size_min(rtype);
00366 }
00367
00368
00369
00370
00371 TYPE_ID Actual_cvtl_type(OPCODE opc, INT bits)
00372 {
00373 return Rebuild_rtype(OPCODE_rtype(opc), bits);
00374 }
00375
00376
00377
00378
00379
00380 TYPE_ID Actual_result_type(WN *wn)
00381 {
00382 OPCODE opc = WN_opcode(wn);
00383 TYPE_ID rtype = OPCODE_rtype(opc);
00384 INT bits;
00385
00386
00387 if ((MTYPE_type_class(rtype) & MTYPE_CLASS_INTEGER) == 0)
00388 return rtype;
00389
00390 switch ( OPCODE_operator(opc) ) {
00391 case OPR_CVTL:
00392 case OPR_LDID:
00393 case OPR_LDBITS:
00394 case OPR_ILOAD:
00395 case OPR_ILDBITS:
00396 case OPR_BIOR:
00397 case OPR_BAND:
00398 case OPR_SHL:
00399 case OPR_ASHR:
00400 case OPR_LSHR:
00401 case OPR_INTCONST:
00402 bits = Actual_data_size(wn);
00403 rtype = Rebuild_rtype(rtype, bits);
00404 }
00405
00406 return rtype;
00407 }
00408
00409 TYPE_ID Adjust_signed_type(TYPE_ID rtype, INT size, WN *wn)
00410 {
00411 INT bits = Actual_data_size(wn);
00412
00413 if (MTYPE_is_integral(rtype) && !MTYPE_is_unsigned(rtype) && size == bits) {
00414
00415
00416 return Rebuild_rtype(rtype, 32);
00417 }
00418 return MTYPE_UNKNOWN;
00419 }